【实训项目】“魔法”APP-模型爱好者线上线下交流平台

news2025/1/12 18:04:04

1.设计摘要

自从2018年万代把翻模厂商龙桃子,后国内的模型厂商就开始逐渐慢慢的从单纯的翻模转向做魔改合金模型,一是由于单纯的出翻模的利润太低,二是由于翻模被万代查水表的风险很大。于是,国内的一些厂商把眼光转向合金成品,在模型中套用合金骨架,然后表面喷上精致的喷漆和消光,或者加一些改造,变成魔改风格,然后就以5,600的金额出售,对于用户而言,因为正版的合金产品经常2000起步,于是选择国内的合金产品是一个性价比很高的选择。但从2019开始,情况发生了一些变化,越来越多的厂商盯上了合金这块蛋糕,而且由于有会被查水表的风险,因此这些厂商都是打算赚快钱,捞一笔就走人。而且定价越来越离谱,就最近而言,至少有三款合金产品的价格已经破千了。畸形的市场导致了畸形的价格。

对于如此畸形的市场和价格,对于消费者来说的看法主要有以下的:1是相比于拼装的模型,有合金的骨架,相对来说模型的把玩体验会更好,而且有合金的重量来说有质感。另外一个是由于表面有精致的喷漆和消光,由于喷漆和消光的油性喷雾是有一定的毒性的,因此要自己喷漆的话,需要入购许多的设备,比如拍风设备,放毒面具之类许多用户就因此不会考虑喷漆。

基于以上的缘由,我们主要提供的服务是联合合金工厂和消费者以及工作室一个模型交流平台,不仅限于高达,包括二次元,军模,车模。

2.设计的模式及产品目标

2.1 用户方面

对于模型爱好者以及相关的爱好者是我们主要的受众用户,我们能为用户提供:模型最新信息获取、合金骨架成品交易,以及工作室喷漆代工服务等功能。他们可以直接向工厂订购工厂提供的骨架,也可以直接向工作室购买代工服务。

2.2合金工厂方面

对于合金工厂方面,可以直接从消费者方面获取订单,不在仅限于和代工以及和卖家,消费者能够直接以相对于中间商更低的价格入手,对于合金工厂方面能够扩大销量。

2.3工作室方面

对于所有与平台合作的工作室来说,最大的得益处在于能够和消费者有更直接交流的机会,给消费者提供喷漆,消光的服务套餐。对于工作室来说,有了我们的平台后,能够有更多的消费者。

3.设计的创新与优势

“模法”APP对于商家与用户之间的资源进行了统合。本来在互联网上对用户来说非常难以搜索的商家资源现在在本APP上可以快速找到,同时也让商家本来稀缺的用户资源得以聚集起来,是一种非常优质的双赢模式。在用户上来说,本来的话,对于小众爱好者来说,寻找到自己中意的商家通常需要自己在各大网络平台或论坛上货比三家,反复挑选之后才能决定出自己的需要。本APP很好地帮助用户节约了这些时间。在APP上输入自己的需求便可快速筛选出能满足用户需求的商家,这将大大提升用户体验,也能带来不低地用户留存率。在商家方面,本来需要商家自己到处做广告或者等待用户上门,现在直接放在本APP上,使对口的用户能快速找上门,商家的订单想必也会比以前有所大量增长。总的来说这是一款能满足小众爱好者需求的实用APP,放在现在的市场也算是有进军的潜力,同时功能齐全,操作简单,能很好地解决用户与商家之间对接不上的矛盾。

4.项目的可行性

周边的厂家,可以做出模型。周边有合适的工作室。厂家和代理工作室都能获得较好的收益。用户也能得到较好的体验(小四号宋体)

5.项目的需求分析

5.1在线订购

对于模型爱好者以及相关的爱好者是我们主要的受众用户,我们能为用户提供:模型最新信息获取、合金骨架成品交易,以及工作室喷漆代工服务等功能。他们可以直接向工厂订购工厂提供的骨架,也可以直接向工作室购买代工服务。

5.2 厂商制作

对于合金工厂方面,可以直接从消费者方面获取订单,不在仅限于和代工以及和卖家,消费者能够直接以相对于中间商更低的价格入手,对于合金工厂方面能够扩大销量。

5.3用户完成订单

在用户收到产品无误之后用户选择完成订单,则商家会受到客户预先支付的费用,如果收货后七天内用户不选择完成的话则会自动完成订单。而如果用户收货后七天内有任何疑问并且进行了退货等操作的话则费用会返还用户。

5.4发货给用户

厂商或工作室制作完成后发货给用户,如果用户满意则选择完成订单,如果不满意可以选择退换货或者有无法协商的瑕疵的话可以联系客服交流。

6.项目的总体设计

“模法”APP一共分为四个大模块:商城、周边、个人中心、购物车

7.项目的功能设计

7.1用户注册

     用户在使用“模法”APP必须进行实名注册,包括姓名、年龄、性别、手机号、也可以绑定银行卡进行充值。我们会保障用户提供的个人信息不被泄露,同时营造一个真实可靠、合法有序的平台环境。

7.2个人中心

(1)个人资料:用户可在此处添加自己的个人信息。

(2)钱包:用户可以绑定银行卡或者支付宝等。

(3)余额:余额的钱可用于在此APP上的消费,用户通过出租的车位或者接代驾单所得收益也将会在此处显示。

(4)充值:用户可通过绑定的银行卡或支付宝等充钱到余额。

(5)提现:余额里的钱可提现☞绑定的银行卡或者支付宝等。

优惠券:系统会不定时发放一些优惠券,发放的优惠券在此处可查看,消费时可用优惠券,不可抵现。

(6)我的订单:在此处用户可以查看自己以前的消费订单记录和接单记录。在用户选择相应的需求后,订单生成,用户在一定时间内可取消订单。

(7)我的模型:用户可以在此发照片展示自己的模型,分享自己的心得,以及并提交图片。系统经过审核确定有效之后,该模型的信息会被上传,其他用户可进行留言回复。

(8)申请售后:用户可以在该APP申请售后。

(9)客服:第几次出会显示客服电话,用户如有什么问题可打电话咨询。

(10)设置:点击此处会出现清理缓存、意见反馈、关于我们、退出登录等几个功能。

7.3商城

(1)用户可以在app中选择商场功能,用户可以根据搜索需要的骨架或者是成品。

(2)用户可以选择代工模型,用户搜索模型,系统会推荐需求的工作室供用户选择。

7.4模型周边

(1)模型信息:给用户最新的模型咨询。

(2)推荐:推荐给用户性价比高的产品和工作室。

8.项目的测试与运行

 

 

 9.项目组成员分工

成员1(组长):首页 搜索

成员2:周边-话题 关注

成员3:周边-推荐 线下

成员4:购物车 个人中心

成员5:登录 注册

10.心得体会

成员1:心得体会

通过为期10天的实训,我学习了很多关于Java Web的知识。在老师的正确指导下,顺利的完成了我的实训内容。在此,也有同学的帮助, 在他们的帮助下我也受益匪浅。最终,能顺利完成实训的任务也很高兴。求分析就是分析软件用户的 需求是什么。如果投入大量的人力, 物力,财力,时间,开发出的软件却没 人要,那所有的投入都是徒劳。如果费了很大的精力,开发一个软件,最 后却不满足用户的要求,从而要重新开发过,这种返工是让人痛心疾首 的。(相信大家都有体会)比如,用户需要一个 for linux 的软件,而你在软 件开发前期忽略了软件的运行环境,忘了向用户询问这个问题,而想当 然的认为是  在实训生活中,我了解开发项目的需求、设计、实现、确认以 及维护等活动整个过程,让自己开始懂得一点软件工程的知识点。

成员2:心得体会

了解需求分析的重要性,比如:需开发的软件,当你千辛万苦地开发完成向用户 提交时才发现出了问题,那时候你是欲哭无泪了,恨不得找块豆腐一头 撞死。所以,需求分析是成功的第一步,就是要全面地理解用户的各 项要求,并准确地表达所接受的用户需求。然后呢?确实客户的需求 的以后我们要做什么呢,那当然是设计和分析。此阶段主要根据需求 分析的结果,对整个软件系统进行设计,如系统框架设计,数据库设 计等等。软件设计一般分为总体设计和详细设计。好的软件设计将为 软件程序编写打下良好的基础。

成员3:心得体会

代码实现,此阶段是将网站项目设计的结果转换成计算机可运行的程序代码, 我们这个项目为4个模块,1。界面,2。逻辑层。3实现层。4。数据库及使用说明文档,分别为4个小组成员完成。这阶段我学到很多编程的思想,如: 分层思想、MVC、三大架构 的整合、dao 的编写。编号程序之后就是软件测试了,此时在软件设计完成后要经过严密的测试,以发现软件在 整个设计过程中存在的问题并加以纠正。由于时间有限,我们测试是简单的使用一下每一个功能。在编写代码 时,由于自己技术知识水平不广,常常遇到技术难题;还有自己没有良好的编程习惯,不注释,有时连自己也看懵了;编程的结构不好, 维修和修改代码是很慢。 这次实训让我意识到了自己做为计算机软件工程专业的学生,要想在以后的职业中崭露头角,除了要有过硬的理 论知识,健康的体魄外,还必须具备良好的心理素质,使自己在以后 的途中无论经历什么样的困难,都立于不败之地。“纸上得来终觉浅, 绝知此事要躬行!”在这短短的时间里,让我深深的感觉到自己在实 际应用中所学专业知识的匮乏。 让我真真领悟到“学无止境”这句话的 涵义。而所学的,都是课本上没有而对我们又非常实用的东西,这又 给我们的实训增加了浓墨淡采的光辉。我懂得了实际生活中,专业知 识是怎样应用与实践的。

成员4:心得体会

在这次实训中,我不仅知道了职业生涯所需具备的专业知识,而 且让我深深体会到一个团队中各成员合作的重要性,要善于团队合 作,善于利用别人的智慧,这才是大智慧。靠单一的力量是很难完成 一个大项目的,在进行团队合作的时候,还要耐心听取每个成员的意 见,使我们的组合达到更加完美。实训过程中,除了要专业知识,包 括人际交往,沟通方式及相关礼节方面的内容,对于团队开发来说, 团结一致使我深有体会。团队的合作

注重沟通和信任,不能不屑于做 小事,永远都要保持亲和诚信,把专业理论运用到具体实践中,不仅 加深我对理论的掌握和运用, 还让我拥有了一次又一次难忘的开发经历,这也是实训最大的收获。

11.项目展示PPT

 12.核心代码展示

后端代码
LoginServlet.java
package cn.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.util.JdbcFactory_2;

public class LoginServlet extends HttpServlet{

	  public void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
		  doPost(request, response);

      }

	  public void doPost(HttpServletRequest request, HttpServletResponse response)
		      throws ServletException, IOException {
		  
	      response.setHeader("Access-Control-Allow-Origin", "*");//*允许任何域
		  String username = request.getParameter("username");
		  String password = request.getParameter("password");
		  //数据库查询
		  String result = "0";
		  JdbcFactory_2 jdbcFactory_2 = new JdbcFactory_2();
		  String sql = "select * from yonghu2 where username = '"+username+"' and password = '"+password+"'";
		  //String sql = "select * from yonghu2";

		  try {
			List list = jdbcFactory_2.find(sql);
			result = String.valueOf(list.size());
		  } catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		  }
		  response.setContentType("text/html;charset=utf-8");
		  response.setCharacterEncoding("utf-8");
		  PrintWriter writer = response.getWriter();
		  writer.write(result);
	  }
}

RegisterServlet.java
package cn.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.util.JdbcFactory_2;

public class RegisterServlet extends HttpServlet{

	  public void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
		  doPost(request, response);

      }

	  public void doPost(HttpServletRequest request, HttpServletResponse response)
		      throws ServletException, IOException {
		  
	      response.setHeader("Access-Control-Allow-Origin", "*");//*允许任何域
		  String username = request.getParameter("username");
		  String password = request.getParameter("password");
		  //数据库查询
		  String result = "0";
		  JdbcFactory_2 jdbcFactory_2 = new JdbcFactory_2();
		  String sql = "insert into yonghu2 values('"+username+"','"+password+"')";
		  String sql2 = "select * from yonghu2 where username = '"+username+"' and password = '"+password+"'";
		  //String sql = "select * from yonghu2";


		  try {
			jdbcFactory_2.zsgSQL(sql);
			//List list = jdbcFactory_2.find(sql2);
			//result = String.valueOf(list.size());
			result = "1";
		  } catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		  }
		  response.setContentType("text/html;charset=utf-8");
		  response.setCharacterEncoding("utf-8");
		  PrintWriter writer = response.getWriter();
		  writer.write(result);
	  }
}

JdbcFactory_2.java

package cn.util;


import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.map.ListOrderedMap;

public class JdbcFactory_2 {
	//数据源连接参数
	public static  Connection conn = null;
	public static Statement stmt = null;
	public static PreparedStatement pstmt=null;
	public static CallableStatement cstmt = null;
	
	public JdbcFactory_2(){
		String qudong = "com.mysql.jdbc.Driver";
		String URL = "jdbc:mysql://localhost:3306/userdb";
		String USER = "root";
		String PASSWORD = "11111111";
		
		//String url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=meituan-sa-jzwg.123";
		
		try {
			Class.forName(qudong);
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//实现数据库增、删、改的操作
	public int zsgSQL(String sql) throws SQLException{
		int b=0;
		try {
			conn.setAutoCommit(false);//禁止自动提交,设置回滚点
			stmt=conn.createStatement();//创建状态
            stmt.execute(sql);//数据库查询操作
			conn.commit(); 
			b=1;
		} catch (SQLException e) {
			conn.rollback();
			e.printStackTrace();
		}finally{
			if(stmt!=null)stmt.close();
			if(conn!=null)conn.close();
		}
		return b;
	}
	//查询方法
	public  List find(String sql) throws SQLException {
		ArrayList list;
		try {
			list = new ArrayList();
			stmt = conn.createStatement();
			java.sql.ResultSet rs = stmt.executeQuery(sql);
			ResultSetMetaData rsm = rs.getMetaData();// 获取数据库表结构
			int col = rsm.getColumnCount();// 获取数据库的列数
			while (rs.next()) {
				ListOrderedMap rowData = new ListOrderedMap();
				for (int i = 1; i <= col; i++) {
					rowData.put(rsm.getColumnName(i), rs.getObject(i));					
				}
				list.add(rowData);
			}
		}finally {
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();
		}
		return list;
	}
	
	public static void main(String[] args) throws SQLException{
		/*
		String name = "ghb0123";
		String password = "123456";
		/*
		String sql = "insert into yonghu2 values('"+name+"','"+password+"')";
		JdbcFactory_2 jdbcFactory_2 = new JdbcFactory_2();

		jdbcFactory_2.zsgSQL(sql);


		//查询
		String sql1 = "select * from yonghu2";
		JdbcFactory_2 jdbcFactory_22 = new JdbcFactory_2();
		List list = jdbcFactory_22.find(sql1);
		for (int i = 0; i < list.size(); i++) {
			Map map = (Map)list.get(i);
			System.out.println("======================");
			System.out.println("用户名字:"+map.get("username")+"密码:"+map.get("password"));
		}

		String sql2 = "select * from yonghu2 where username = '"+name+"' and password = '"+password+"'";
		JdbcFactory_2 jdbcFactory_21 = new JdbcFactory_2();
		List list1 = jdbcFactory_21.find(sql2);
		if (list1.size() == 1) {
			System.out.println("登录成功");
		}else {
			System.out.println("登录失败");
		}
		*/
	}
}
前端部分代码
Index.html
<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/>
    <title>Hello APP</title>
    <link rel="stylesheet" type="text/css" href="./css/api.css" />
    <link rel="stylesheet" type="text/css" href="./css/common.css" />
</head>
<body ontouchstart="">
    <div id="wrap">
        <div id="header" class="home">
        <!-- <div id="header" class="fun"> -->
            <!-- home,首页header -->
            <div class="header_content home">
                <div class="btn_left" tapmode="tap-active" onclick="openClassify();">

                </div>
                <div class="search_box" >
                    <i class="home_icon_search" tapmode="tap-active" onclick="openCommon('search','搜索');"></i>
                    <i class="search_voiceinput_btn" tapmode="tap-active" onclick="openSpeechRec();"></i>
                    <span class="text" tapmode="tap-active" onclick="openCommon('search','搜索');">搜索"模型",模型马上送到</span>
                </div>

                <div class="btn_right" tapmode="tap-active" onclick="openScanner();">

                </div>
            </div>
            <!-- home,首页header end -->
            <!-- featured,首页header -->
            <div class="header_content featured">
                <a class="btn_middle" onclick="openFeaturedFrame();" tapmode="tap-active">
                    <span>全部</span>
                    <i class="middle_arr down"></i>
                </a>
                <div class="btn_right" tapmode="tap-active" onclick="openCommon('broadcast','Laneige/兰芝')">
                    <img src="./res/img/tm_brand_index_follow_icon.png" alt="关注" class="follow">
                </div>
            </div>
            <!-- featured,首页header end -->
            <!-- fun,首页header -->
            <div class="header_content fun">
                <div class="btn_left" tapmode="tap-active" onclick="openCommon('msg','消息盒子')">
                    <img src="./res/img/tm_ic_feed_me.png" alt="周边" class="toFun">
                </div>
                <a class="btn_middle">
                    周边
                     <i class="middle_arr down"></i>
                </a>
                <div class="btn_right" tapmode="tap-active" onclick="openCommon('msg','消息盒子')">
                    <img src="./res/img/tm_mytmall_icon_message.png" alt="消息" class="toMsg">
                </div>
                <div id="navBar_fun">
                    <span class="navBar_btn active" onclick="jumpToFun(0);" tapmode="tap-active">
                        推荐
                    </span>
                    <span class="navBar_btn" onclick="jumpToFun(1);" tapmode="tap-active">
                        线下
                    </span>
                    <span class="navBar_btn" onclick="jumpToFun(2);" tapmode="tap-active">
                        话题
                    </span>
                    <span class="navBar_btn" onclick="jumpToFun(3);" tapmode="tap-active">
                        关注
                    </span>
                    <span class="navBar_bar">
                        <div class="navBar_bar_inner"></div>
                    </span>
                </div>
            </div>

            <!-- fun,首页header end -->
            <!-- cart,首页header -->
            <div class="header_content cart">
                <a class="btn_middle" tapmode="tap-active">
                    购物车
                    <!-- <i class="middle_arr down"></i> -->
                </a>
            </div>
            <!-- cart,首页header end -->
            <!-- index页5种header:::home,featured,fun,cart,profile -->
        </div>
        <div id="main">

        </div>
        <div id="footer">
            <!-- 原生代替tabBar -->
            <ul id="footer_list">
                <li class="list_li home active" onclick="changeIndexFrame(0);" tapmode="tap-active">
                    <span class="text">商城</span>
                </li>
                <!--
                <li class="list_li follow" onclick="changeIndexFrame(1);" tapmode="tap-active">
                    <span class="text">周边</span>
                </li>
              -->

                <li class="list_li follow" onclick="changeIndexFrame(1);" tapmode="tap-active">
                    <span class="text">周边</span>
                </li>

                <li class="list_li cart" onclick="changeIndexFrame(2);" tapmode="tap-active">
                    <span class="text">购物车</span>
                </li>
                <li class="list_li profile" onclick="changeIndexFrame(3);" tapmode="tap-active">
                    <span class="text">个人中心</span>
                </li>
                <li class="list_bar">
                    <div class="list_bar_inner"></div>
                </li>
            </ul>
        </div>
    </div>
</body>
<script type="text/javascript" src="./script/api.js"></script>
<script type="text/javascript" src="./script/common.js"></script>
<script type="text/javascript">
    // 下方tabBar,不好用放弃,用原生写
    var aFooterList = $api.domAll('#footer_list .list_li');
    var listBar = $api.dom('#footer_list .list_bar');
    //::::搜索框用js加上宽度,来适应屏幕尺寸
        var searchBox = $api.dom('.home .search_box');
        var searchBoxW = $api.offset(searchBox).w;
        var homeIcon1W = $api.offset($api.dom(searchBox,'.home_icon_search')).w;
        var homeIcon2W = $api.offset($api.dom(searchBox,'.search_voiceinput_btn')).w;
        var homeSearchText = $api.dom(searchBox,'.text');
        var homeSearchTextW = searchBoxW-homeIcon1W-homeIcon2W;
        $api.css(homeSearchText,'width:'+homeSearchTextW+'px');

    var navBarFun = $api.dom('#navBar_fun');
    var aNavBarBtn = $api.domAll('#navBar_fun .navBar_btn');
    var navBarBar = $api.dom('#navBar_fun .navBar_bar');
    var setNavBarBtn = function(index){
        $api.addCls(aNavBarBtn[index],'active');
        navBarBar.style.webkitTransform = 'translateX('+index*100+'%)';
        for (var i = 0; i < 4; i++) {
            if (i != index) {
                $api.removeCls(aNavBarBtn[i],'active');
            }
        }
    };
    var jumpToFun = function(index){
        api.setFrameGroupIndex ({
            name: 'fun',
            index: index,
            scroll: true
        });
    }
    //::::搜索框js加上宽度,来适应屏幕尺寸 end
    // tabBar切换状态,同时切换header与frame
    var frameJson = {
        '0': 'home',
        //'1': 'featured',
        '1': 'fun',
        '2': 'cart',
        '3': 'profile'
    };
    var changeIndexFrame = function(index){
        header.className = frameJson[index];
        for (var i = 0; i < 4; i++) {
            if (i == index) {
                $api.addCls(aFooterList[index],'active');
            } else{
                $api.removeCls(aFooterList[i],'active');
            }
        };
        listBar.style.webkitTransform = 'translateX('+index*100+'%)';
        openIndexFrames(index);
    };

    // 关注分类frame
    var openFeaturedFrame = function(){
        api.openFrame({
            name: 'featured_frame',
            url: './html/main/featured_frame.html',
            // pageParam: {
            //     h: $api.offset(header).h
            // },
            bounces: false,
            rect: {
                x: 0,
                y: 0,
                w: 'auto',
                h: 'auto'
            }
        });
    };

    // 链接到淘宝页面
    var indexToDetail = function(title,url){

        api.openWin({
            name: 'detailwinweb',
            url: './html/detailframes/detailwinweb.html',
            pageParam: {
                title: title,
                url: url
            },
            rect: {
                x: 0,
                y: 0,
                w: 'auto',
                h: 'auto'
            }
        });
    };
    // 链接到淘宝页面 end
    // 打开分类列表
    var indexOpenClassify = function(){
        api.openWin({
            name: 'detailclassify',
            url: './html/detailframes/detailclassify.html',
            bounces: false,
            rect: {
                x: 0,
                y: 0,
                w: 'auto',
                h: 'auto'
            }
        });
    };
    // 打开分类列表 end
    // 语音识别
    var indexOpenSpeechRec = function(){
        api.openWin({
            name: 'record',
            url: './html/detailframes/record.html',
            pageParam: {
                name: '语音搜索',
                title: '语音搜索'
            },
            rect: {
                x: 0,
                y: 0,
                w: 'auto',
                h: 'auto'
            }
        });
    };
    // 语音识别 end
    // 二维码
    var indexOpenScanner = function(){
        var scanner = api.require('scanner');
        scanner.open(function(ret,err) {
            api.alert({
                title: '扫描结果',
                msg: ret.msg
            });
        });
    };
    // 二维码 end
    // 通用header的window
    var indexOpenCommon = function(name,title){

        api.openWin({
            name: name,
            url: './html/detailframes/'+name+'.html',
            pageParam: {
                name: name,
                title: title
            },
            rect: {
                x: 0,
                y: 0,
                w: 'auto',
                h: 'auto'
            }
        });
    }

    var indexOpenCommon2 = function(name,title){

        api.openWin({
            name: name,
            url: './html/detailframes/'+name+'.jsp',
            pageParam: {
                name: name,
                title: title
            },
            rect: {
                x: 0,
                y: 0,
                w: 'auto',
                h: 'auto'
            }
        });
    }
    // 通用header的window end
    // 打开分享浮动窗口
    var indexOpenShareframe = function(){
        api.openFrame({
            name: 'shareframe',
            url: './html/detailframes/shareframe.jsp',
            bounces: false,
            rect:{
                x: 0,
                y: 0,
                w: 'auto',
                h: 'auto'
            }
        });
        api.bringFrameToFront({
            from: 'shareframe'
        });
    };
    // 打开分享浮动窗口 end

    apiready = function(){

        // 阻止首页弹动
        api.setWinAttr({
            bounces: false
        });
        // 阻止首页弹动 end

        window.header = $api.byId('header');
        $api.fixIos7Bar(header);
        var headerPos = $api.offset(header);
        var main = $api.byId('main');
        var mainPos = $api.offset(main);
        var footer = $api.byId('footer');
        var footerPos = $api.offset(footer);

        // 切换frame
        // 打开app先设置funIndex为0;
        $api.setStorage('funIndex',0);
        window.openIndexFrames = function(index){
            var funIndex = $api.getStorage('funIndex');
            if (index == 1) {
                var funH = $api.offset(navBarFun).h;
                api.openFrameGroup ({
                    name: 'fun',
                    background: '#EEEEF0',
                    scrollEnabled: true,
                    rect: {
                        x: 0,
                        y: headerPos.h + funH,
                        w: 'auto',
                        h: mainPos.h - funH
                    },
                    index: funIndex,
                    frames:
                    [{
                        name: 'funrecommend',
                        url: './html/main/funrecommend.html',
                        pageParam:{},
                        bounces:true,
                        opaque:true,
                        bgColor: '#EEEEF0'
                    },{
                        name: 'funvideo',
                        url: './html/main/funvideo.html',
                        pageParam:{},
                        bounces:true,
                        opaque:true,
                        bgColor: '#EEEEF0'
                    },{
                        name: 'funtopic',
                        url: './html/main/funtopic.html',
                        pageParam:{},
                        bounces:true,
                        opaque:true,
                        bgColor: '#EEEEF0'
                    },{
                        name: 'funfollow',
                        url: './html/main/funfollow.html',
                        pageParam:{},
                        bounces:true,
                        opaque:true,
                        bgColor: '#EEEEF0'
                    }]
                }, function(ret, err){
                    var name = ret.name;
                    var index = ret.index;
                    $api.setStorage('funIndex',index);
                    setNavBarBtn(index);
                });
            } else{
                if (index == 3) {
                    api.openFrame({
                        name: frameJson[index],
                        url: './html/main/'+frameJson[index]+'.html',
                        bounces: true,
                        rect: {
                            x: 0,
                            y: $api.offset(header).h,
                            w: 'auto',
                            h: mainPos.h + footerPos.h
                        }
                    });
                } else{
                    api.openFrame({
                        name: frameJson[index],
                        url: './html/main/'+frameJson[index]+'.html',
                        bounces: true,
                        rect: {
                            x: 0,
                            y: headerPos.h,
                            w: 'auto',
                            h: mainPos.h
                        }
                    });
                }

            }
            for (var i = 0; i < 4; i++) {
                if (i == index) {

                } else{
                    if (i == 1) {
                        api.setFrameGroupAttr({
                            name: 'fun',
                            hidden: true
                        });
                    } else{
                        api.setFrameAttr({
                            name: frameJson[i],
                            hidden: true
                        });
                    }

                }

            };
        };
        changeIndexFrame(0);
    };
</script>
</html>

13.参考文献

[1] 杨选辉 .网页设计与制作教程.北京:清华大学出版社.2006

[2] 詹国华,潘红等.多媒体网页设计教程,.北京:高等教育出版社.2009

[3] 贾珺.动态网站设计与开发项目教程, 中国电力出版社.2009

喜欢的点赞收藏加关注私信作者沟通交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/945192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网卡抓不到带Tag的数据包

Tag抓取修改注册表 用于解决网卡抓不到带Tag的数据包 一、修改查看网卡信息 1、打开网络适配器选项&#xff0c;右键需要修改的网卡–属性 2、在配置–高级中&#xff0c;找到优先级和VLAN&#xff0c;选择优先级和VLAN关闭&#xff0c;确认。 3、确认网卡驱动关键字 网卡右…

vue2 组件库之vetur提示

当我们开发完自定义UI组件库后&#xff0c;在项目中使用时&#xff0c;想要达到以下提示效果&#xff0c;组件提示与属性提示&#xff0c;有什么解决方案呢&#xff1a; 事实上&#xff0c;这是vetur的功能&#xff0c;原文如下&#xff1a; Component Data | Vetur If a pac…

RT_Thread内核机制学习(六)信号量

要传输较大数据时&#xff0c;使用队列。 传输较小数值时&#xff0c;使用邮箱。 队列、邮箱用来传递数据。 如果只是用来传递资源的个数&#xff0c;可以使用信号量。 A车与B车只需要传递信号量&#xff08;代表资源&#xff09;。 信号量 获取信号量 如果value>0&…

PDF可以修改内容吗?有什么注意的事项?

PDF是一种跨平台的电子文档格式&#xff0c;可以在各种设备上轻松阅读和共享。许多人喜欢将文档转换为PDF格式以确保格式的一致性和易读性。但是&#xff0c;PDF文件一般被认为是“只读”文件&#xff0c;即无法编辑。那么&#xff0c;PDF文件是否可以修改呢&#xff1f; 答案是…

CCF HPC China2023|澎峰科技:使能先进计算,赋能行业应用

CCF HPC China2023圆满落幕&#xff01; 桂秋八月&#xff0c;为期三天的中国高性能计算领域最高规格盛会——2023CCF全球高性能计算学术年会&#xff08;HPC China&#xff09;在青岛红岛国际展览中心圆满落幕。行业超算大咖、顶级学界精英、先锋企业领袖参会者齐聚山东青岛&a…

photoshop2022安装教程

安装教程 点击set-up.exe 点击确认&#xff0c;开始安装&#xff0c;需要等待一段时间 出现这个表示安装成功&#xff0c;点击关闭即可 查看版本&#xff1a;打开菜单栏中的“帮助”选项&#xff0c;点击"系统信息" 成功演示 安装包下载 https://ziby0nwxdov.feishu.…

VMware vCenter Server 7.0.3 安装

VMware vCenter Server 7.0.3 安装 文章目录 VMware vCenter Server 7.0.3 安装1. 安装 vcenter1.1 第一阶段1.2 第二阶段 2. exsi 查看 vcenter3. 部署 DNS server3.1 安装 unbound3.2 配置 unbound3.3 vcenter 配置域名访问 1. 安装 vcenter 1.1 第一阶段 双击 192.168.2…

从零开始探索C语言(一)----C语言程序结构、基本语法与数据类型

文章目录 1. 程序结构1.1 Hello World示例1.2 编译并执行C程序 2. 基本语法2.1 C 标记2.2 分号2.3 注释2.4 标识符2.5 关键字2.6 C中的空格 3. 数据类型3.1 整数类型3.2 浮点类型3.3 void类型 从第一次学习C语言到现在已经时隔五年了&#xff0c;大部分知识都还给老师了&#x…

C++day7(封装一个学生的类,定义一个学生这样类的vector容器, 里面存放学生对象【保存+读取】、实现与list相关的函数 )

1.封装一个学生的类&#xff0c;定义一个学生这样类的vector容器, 里面存放学生对象 再把该容器中的对象&#xff0c;保存到文件中。&#xff08;至少3个&#xff09; 再把这些学生从文件中读取出来&#xff0c;放入另一个容器中并且遍历输出该容器里的学生。 #include <…

STM32f103入门(5)定时器中断

STM32 TIM&#xff08;定时器/计数器&#xff09;模块的中断流程如下&#xff1a; 配置TIM寄存器&#xff1a;首先&#xff0c;通过配置TIM相关的寄存器来设置计时器的基本参数&#xff0c;例如预分频系数、计数模式、计数器周期等。 使能TIM中断&#xff1a;使用TIM_ITConfig函…

时序预测 | MATLAB实现基于QPSO-BiLSTM、PSO-BiLSTM和BiLSTM时间序列预测

时序预测 | MATLAB实现基于QPSO-BiLSTM、PSO-BiLSTM和BiLSTM时间序列预测 目录 时序预测 | MATLAB实现基于QPSO-BiLSTM、PSO-BiLSTM和BiLSTM时间序列预测效果一览基本描述程序设计参考资料 效果一览 基本描述 1.Matlab实现QPSO-BiLSTM、PSO-BiLSTM和BiLSTM神经网络时间序列预测…

王老吉与加多宝共同的课题:受困于第二招牌

王老吉曾经凭借凉茶单品反超可口可乐&#xff0c;却在2015年后面临增速下滑、市场规模逐年缩小的增长困境。事实上&#xff0c;王老吉所在的凉茶市场现已成为存量市场&#xff0c;甚至在不断激化的竞争中逐年萎缩。为了打破原有业务的局限&#xff0c;王老吉曾推出过许多新品&a…

网站应用微信登录

准备工作 | 微信开放文档 <template><wxloginid"wxLoginForm"self_redirect"false":appid"appid":scope"scope":state"state":redirect_uri"redirect_uri"></wxlogin> </template><…

智慧实景无人直播带货系统搭建方案,一起来了解一下吧!

随着无人直播和带货的兴起&#xff0c;智慧实景无人直播带货系统成为了电商行业的新宠。本文将提出一种专业的搭建方案&#xff0c;通过技术驱动和商业机遇&#xff0c;实现智慧实景无人直播带货系统的成功落地。我们将深入探讨系统架构、技术支持和商业模式等关键要素&#xf…

安卓学习笔记

文章目录 1. Android系统架构2. Activity2.1 生命周期2.2 生命状态2.3 启动模式 3. Service3.1 定义3.2 两种启动方式3.3 生命周期3.4 跨进程service3.5 IntentService 4. BroadCastReceiver4.1 概念4.2 组成4.3 广播接收器的分类4.4 生命周期4.5 静态注册和动态注册 5. Conten…

C语言初阶学习笔记

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.复杂概念 1.1大小端 1.2 整形提升 1.2.1整形提升的意义…

达梦数据库物化视图介绍

概述 本文将介绍达梦数据库物化视图&#xff0c;给出其概念及相关创建、使用示例。 1.物化视图概念 物化视图 (MATERIALIZED VIEW) 是目标表在特定时间点上的一个副本&#xff0c;占用存储空间&#xff0c;即将查询出来的数据存储在数据库中。当所依赖的一个或多个基表的数据…

Vue 项目性能优化 — 实践指南

前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术&#xff0c;帮我们处理了前端开发中最脏最累的 DOM 操作部分&#xff0c; 我们不再需要去考虑如何操作 DOM 以及如何最高效地操作 DOM&#xff1b;但 Vue 项目中仍然存在项目首屏优化、Webpack 编译配置优化等问题&#xff0c;所…

vs2008下的mfc hello world实现

笔者不知道会写这种博文&#xff0c;好久没写mfc程序&#xff0c;hello world都不会创建了。起因是来了个mfc任务&#xff0c;那就得把mfc熟悉起来&#xff0c;先看下实现效果吧 因为是基于2008的&#xff0c;那就按照2008创建吧 文章目录 第一步&#xff1a;文件新建项目第二…

串口接收数据-控制LED灯

目标 通过串口接收数据&#xff0c;对数据分析&#xff0c;控制8个LED灯按照设定时间闪烁。 8个LED灯可以任意设计&#xff0c;是否闪烁。闪烁时间按ms计算&#xff0c;通过串口发送&#xff0c;可设置1~4,294,967,296ms&#xff0c;也就是4字节数据协议自拟&#xff0c;有数…