日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【项目】健康项目day5总结

發(fā)布時間:2024/3/12 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【项目】健康项目day5总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第5章 移動端開發(fā)-套餐列表、套餐詳情、頁面靜態(tài)化

學習目標:

  • 掌握移動端套餐列表頁動態(tài)展示實現(xiàn)過程

  • 掌握移動端套餐詳情頁

  • 掌握Freemarker頁面靜態(tài)化技術

  • 能夠使用Freemarker生成html靜態(tài)頁面

1. 移動端需求分析和環(huán)境搭建

1.1. 需求分析

【目標】

  • 能夠搭建移動端開發(fā)環(huán)境

【路徑】

  • 開發(fā)需求
  • 環(huán)境搭建

【講解】

1.1.1 移動端開發(fā)需求分析

用戶在體檢之前需要進行預約,可以通過電話方式進行預約,此時會由體檢中心客服人員通過后臺系統(tǒng)錄入預約信息。用戶也可以通過手機端自助預約。本章節(jié)開發(fā)的功能為用戶通過手機自助預約。

預約流程如下:

1、訪問移動端首頁

2、點擊體檢預約進入體檢套餐列表頁面

3、在體檢套餐列表頁面點擊具體套餐進入套餐詳情頁面

4、在套餐詳情頁面點擊立即預約進入預約頁面

5、在預約頁面錄入體檢人相關信息點擊提交預約

效果如下圖:




【小結】

體檢預約–>套餐列表–>套餐詳情–>立即預約(發(fā)送手機驗證碼+Redis)

1.2. 搭建移動端工程(互聯(lián)用戶)

【目標】

移動端工程搭建

【路徑】

  • 創(chuàng)建health_mobile工程, 導入坐標(依賴health_interface)
  • 導入頁面
  • 配置web.xml(springmvc的核心控制器+post請求亂碼過濾器)
  • 創(chuàng)建springmvc.xml(配置dubbo, 驅動注解)
  • 導入通用組件
  • 【講解】

    本項目是基于SOA架構進行開發(fā),前面我們已經(jīng)完成了后臺系統(tǒng)的部分功能開發(fā),在后臺系統(tǒng)中都是通過Dubbo調用服務層發(fā)布的服務進行相關的操作。本章節(jié)我們開發(fā)移動端工程也是同樣的模式,所以我們也需要在移動端工程中通過Dubbo調用服務層發(fā)布的服務,如下圖:

    1.2.1. 導入maven坐標

    在health_parent工程的pom.xml文件中導入阿里短信發(fā)送的maven坐標

    <!--阿里云服務器短信平臺--> <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>3.3.1</version> </dependency> <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>1.0.0</version> </dependency>

    在health_common工程中添加引入的依賴

    <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId> </dependency> <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId> </dependency>

    1.2.2. health_mobile

    【路徑】

    1:pom.xml

    2:靜態(tài)資源(CSS、html、img等)

    3:web.xml

    4:springmvc.xml

    5:spring-jedis.xml

    6:redis.properties

    7:log4j.properties

    移動端工程,打包方式為war,用于存放Controller,在Controller中通過Dubbo可以遠程訪問服務層相關服務,所以需要依賴health_interface接口工程。

    1.2.2.1. pom.xml

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>health_parent</artifactId><groupId>com.itheima</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>health_mobile</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><packaging>war</packaging><dependencies><dependency><groupId>com.itheima</groupId><artifactId>health_interface</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies> </project>

    1.2.2.2.靜態(tài)資源(CSS、html、img等,詳見資料)

    1.2.2.3. web.xml

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><display-name>Archetype Created Web Application</display-name><!-- 解決post亂碼 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定加載的配置文件 ,通過參數(shù)contextConfigLocation加載 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping> </web-app>

    1.2.2.4. springmvc.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><mvc:annotation-driven><mvc:message-converters register-defaults="true"><bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes" value="application/json"/><property name="features"><list><value>WriteMapNullValue</value><value>WriteDateUseDateFormat</value></list></property></bean></mvc:message-converters></mvc:annotation-driven><!-- 指定應用名稱 --><dubbo:application name="health_mobile" /><!--指定服務注冊中心地址--><dubbo:registry address="zookeeper://127.0.0.1:2181"/><!--批量掃描--><dubbo:annotation package="com.itheima.health.controller" /><!--超時全局設置 10分鐘check=false 不檢查服務提供方,開發(fā)階段建議設置為falsecheck=true 啟動時檢查服務提供方,如果服務提供方?jīng)]有啟動則報錯--><dubbo:consumer timeout="600000" check="false"/><import resource="spring-jedis.xml"></import> </beans>

    1.2.2.5.spring-jedis.xml:

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:property-placeholder location="classpath:redis.properties" /><!--Jedis連接池的相關配置--><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxTotal"><value>${redis.pool.maxActive}</value></property><property name="maxIdle"><value>${redis.pool.maxIdle}</value></property><property name="testOnBorrow" value="true"/><property name="testOnReturn" value="true"/></bean><bean id="jedisPool" class="redis.clients.jedis.JedisPool"><constructor-arg name="poolConfig" ref="jedisPoolConfig" /><constructor-arg name="host" value="${redis.host}" /><constructor-arg name="port" value="${redis.port}" type="int" /><constructor-arg name="timeout" value="${redis.timeout}" type="int" /></bean> </beans>

    1.2.2.6. redis.properties

    #最大分配的對象數(shù) redis.pool.maxActive=200 #最大能夠保持idel狀態(tài)的對象數(shù) redis.pool.maxIdle=50 redis.pool.minIdle=10 redis.pool.maxWaitMillis=20000 #當池內沒有返回對象時,最大等待時間 redis.pool.maxWait=300#格式:redis://:[密碼]@[服務器地址]:[端口]/[db index] #redis.uri = redis://:12345@127.0.0.1:6379/0redis.host = 127.0.0.1 redis.port = 6379 redis.timeout = 30000

    1.2.2.7. log4j.properties

    ### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### direct messages to file mylog.log ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=c:\\mylog.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### set log levels - for more verbose logging change 'info' to 'debug' ###log4j.rootLogger=debug, stdout

    1.2.3. 導入通用組件

    【路徑】

    1:ValidateCodeUtils工具類:(產(chǎn)生驗證碼)

    2:SMSUtils工具類:(短信服務,用于發(fā)送短消息服務(SMS))

    3:RedisMessageConstant常量類:

    【講解】

    在health_common工程中導入如下通用組件

    1:ValidateCodeUtils工具類:(產(chǎn)生驗證碼)

    package com.itheima.health.utils;import java.util.Random;/*** 隨機生成驗證碼工具類*/ public class ValidateCodeUtils {/*** 隨機生成驗證碼* @param length 長度為4位或者6位* @return*/public static Integer generateValidateCode(int length){Integer code =null;if(length == 4){code = new Random().nextInt(9999);//生成隨機數(shù),最大為9999if(code < 1000){code = code + 1000;//保證隨機數(shù)為4位數(shù)字}}else if(length == 6){code = new Random().nextInt(999999);//生成隨機數(shù),最大為999999if(code < 100000){code = code + 100000;//保證隨機數(shù)為6位數(shù)字}}else{throw new RuntimeException("只能生成4位或6位數(shù)字驗證碼");}return code;}/*** 隨機生成指定長度字符串驗證碼* @param length 長度* @return*/public static String generateValidateCode4String(int length){Random rdm = new Random();String hash1 = Integer.toHexString(rdm.nextInt());String capstr = hash1.substring(0, length);return capstr;} }

    2:SMSUtils工具類:(短信服務,用于發(fā)送短消息服務(SMS))

    package com.itheima.health.utils;import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile;/*** 短信發(fā)送工具類*/ public class SMSUtils {public static final String VALIDATE_CODE = "SMS_189616640";//發(fā)送短信驗證碼public static final String ORDER_NOTICE = "SMS_159771588";//體檢預約成功通知private static final String SIGN_NAEM = "黑馬程序員";// 短信的簽名private static final String PARAMETER_NAME="code";private static final String ACCESS_KEY="LTAI4GERJj7v71F3FKjw3z2A"; //你的AccessKey IDprivate static final String SECRET_KEY="dIVZnHGdUTYbqOKMlxZ7R7jXVcnPoz"; //你的AccessKey Secretpublic static void main(String[] args) throws ClientException {SMSUtils.sendShortMessage(VALIDATE_CODE,"13652431027","666666");}/*** 發(fā)送短信* @param phoneNumbers* @param param* @throws ClientException*/public static void sendShortMessage(String templateCode,String phoneNumbers,String param) throws ClientException{// 設置超時時間-可自行調整System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");// 初始化ascClient需要的幾個參數(shù)final String product = "Dysmsapi";// 短信API產(chǎn)品名稱(短信產(chǎn)品名固定,無需修改)final String domain = "dysmsapi.aliyuncs.com";// 短信API產(chǎn)品域名(接口地址固定,無需修改)// 替換成你的AKfinal String accessKeyId = "LTAIak3CfAehK7cE";// 你的accessKeyId,參考本文檔步驟2final String accessKeySecret = "zsykwhTIFa48f8fFdU06GOKjHWHel4";// 你的accessKeySecret,參考本文檔步驟2// 初始化ascClient,暫時不支持多region(請勿修改)IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY, SECRET_KEY);DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);IAcsClient acsClient = new DefaultAcsClient(profile);// 組裝請求對象SendSmsRequest request = new SendSmsRequest();// 使用post提交request.setMethod(MethodType.POST);// 必填:待發(fā)送手機號。支持以逗號分隔的形式進行批量調用,批量上限為1000個手機號碼,批量調用相對于單條調用及時性稍有延遲,驗證碼類型的短信推薦使用單條調用的方式request.setPhoneNumbers(phoneNumbers);// 必填:短信簽名-可在短信控制臺中找到request.setSignName(SIGN_NAEM);// 必填:短信模板-可在短信控制臺中找到request.setTemplateCode(templateCode);// 可選:模板中的變量替換JSON串,如模板內容為"親愛的${name},您的驗證碼為${code}"時,此處的值為// 友情提示:如果JSON中需要帶換行符,請參照標準的JSON協(xié)議對換行符的要求,比如短信內容中包含\r\n的情況在JSON中需要表示成\\r\\n,否則會導致JSON在服務端解析失敗//request.setTemplateParam("{\"code\":\""+param+"\"}");request.setTemplateParam(String.format("{\"%s\":\"%s\"}",PARAMETER_NAME,param));// 可選-上行短信擴展碼(擴展碼字段控制在7位或以下,無特殊需求用戶請忽略此字段)// request.setSmsUpExtendCode("90997");// 可選:outId為提供給業(yè)務方擴展字段,最終在短信回執(zhí)消息中將此值帶回給調用者// request.setOutId("yourOutId");// 請求失敗這里會拋ClientException異常SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {// 請求成功System.out.println("請求成功");}else{System.out.println(sendSmsResponse.getMessage());}} }

    3:RedisMessageConstant常量類:

    package com.itheima.health.constant;public interface RedisMessageConstant {static final String SENDTYPE_ORDER = "001";//用于緩存體檢預約時發(fā)送的驗證碼static final String SENDTYPE_LOGIN = "002";//用于緩存手機號快速登錄時發(fā)送的驗證碼static final String SENDTYPE_GETPWD = "003";//用于緩存找回密碼時發(fā)送的驗證碼 }

    【小結】

    步驟:

    –>創(chuàng)建工程–>導入坐標–>頁面–>配置文件(web.xml、springmvc.xml、spring-jedis.xml)

    –>導入通用組件(生成驗證碼、發(fā)送短信工具類、Redis存儲常量類)

    2.套餐列表頁面動態(tài)展示

    【目標】

    實現(xiàn)套餐列表功能

    訪問:首頁http://localhost:80

    點擊“體檢預約”,跳轉到“套餐列表”頁面

    【路徑】

    1:前臺代碼編寫

  • 在/pages/setmeal.html , 在mounted()鉤子函數(shù)里面
  • 完成需求: 1.使用axios請求服務器, 獲得數(shù)據(jù) 進行模型綁定 2.數(shù)據(jù)遍歷(v-for)

    2:后臺代碼編寫

    ? 1.創(chuàng)建類SetmealMobileController.java ,添加查詢所有的方法

    ? 拼接完整的圖片路徑

  • SetmealService與實現(xiàn)類添加查詢所有的方法
  • SetmealDao與映射文件 添加查詢所有的方法
  • 完成需求: 1:查詢所有的套餐

    【講解-需求】

    移動端首頁為/pages/index.html,效果如下:

    (1)在web.xml中配置:

    (2)訪問:首頁http://localhost:80

    (3)點擊體檢預約直接跳轉到體檢套餐列表頁面(/pages/setmeal.html)

    <a href="/pages/setmeal.html" class="link-page"><div class="type-title"><h3>體檢預約</h3><p>實時預約</p></div><div class="type-icon"><i class="icon-zhen"><span class="path1"></span><span class="path2"></span></i></div> </a>

    2.1. 前臺代碼

    2.1.1. 展示套餐信息

    (1)setmeal.html,遍歷v-for=“setmeal in setmealList”

    2.1.2. 獲取套餐列表數(shù)據(jù)

    <script>var vue = new Vue({el:'#app',data:{setmealList:[] // 套餐列表數(shù)據(jù)},// 掛載后mounted (){axios.get("/setmeal/getSetmeal.do").then((response)=>{if(response.data.flag){this.setmealList = response.data.data;}else{// 失敗的提示alert(response.data.message);}});}}); </script>

    mounted鉤子和created鉤子

    mounted鉤子:頁面被初始化后執(zhí)行

    created鉤子:vue模型被初始化后執(zhí)行

    mounted鉤子是在created鉤子后面執(zhí)行的。

    2.2. 后臺代碼

    2.2.1. Controller

    在healthmobile_web工程中創(chuàng)建SetmealMobileController并提供getSetmeal方法,在此方法中通過Dubbo遠程調用套餐服務獲取套餐列表數(shù)據(jù)

    package com.itheima.health.controller;import com.alibaba.dubbo.config.annotation.Reference; import com.itheima.health.constant.MessageConstant; import com.itheima.health.entity.Result; import com.itheima.health.pojo.Setmeal; import com.itheima.health.service.SetmealService; import com.itheima.health.utils.QiNiuUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** Description: No Description* User: Eric*/ @RestController @RequestMapping("/setmeal") public class SetmealMobileController {@Referenceprivate SetmealService setmealService;/*** 查詢所有*/@GetMapping("/getSetmeal")public Result getSetmeal(){// 查詢所有的套餐List<Setmeal> list = setmealService.findAll();// 套餐里有圖片有全路徑嗎? 拼接全路徑list.forEach(s->{s.setImg(QiNiuUtils.DOMAIN + s.getImg());});return new Result(true, MessageConstant.GET_SETMEAL_LIST_SUCCESS,list);} }

    2.2.2. 服務接口

    在SetmealService服務接口中擴展findAll方法

    /*** 查詢所有* @return*/ List<Setmeal> findAll();

    2.2.3. 服務實現(xiàn)類

    在SetmealServiceImpl服務實現(xiàn)類中實現(xiàn)findAll方法

    /*** 查詢所有的套餐* @return*/ @Override public List<Setmeal> findAll() {return setmealDao.findAll(); }

    2.2.4. Dao接口

    在SetmealDao接口中擴展findAll方法

    /*** 查詢所有的套餐* @return*/ List<Setmeal> findAll();

    2.2.5. Mapper映射文件

    在SetmealDao.xml映射文件中擴展SQL語句

    <!--查詢所有--> <select id="findAll" resultType="setmeal">select * from t_setmeal </select>

    查看效果

    【小結】

    套餐列表功能需要展示發(fā)布的所有套餐,用于體檢人選擇指定套餐。

    從數(shù)據(jù)查詢出來的套餐信息的圖片只有圖片名稱,沒有全路徑,在Controller返回之前,設置完整的路徑

    3. 套餐詳情頁面動態(tài)展示

    【目標】

    套餐詳情頁面動態(tài)展示

    在套餐詳情頁面需要展示當前套餐的信息(包括圖片、套餐名稱、套餐介紹、適用性別、適用年齡)、此套餐包含的檢查組信息、檢查組包含的檢查項信息等。

    【路徑】

    前臺代碼編寫

  • 在/pages/setmeal_detail.html
  • 完成需求: 1.獲取請求參數(shù)中套餐id的值 2.獲取套餐詳細信息 3.展示套餐信息(套餐信息、檢查組集合、檢查項集合)

    后臺代碼編寫

    ? 1.類SetmealMobileController.java

    ? 2.類SetmealService.java

    ? 3.類SetmealServiceImpl.java

    ? 4.類SetmealDao.java

    ? 類CheckGroupDao

    ? 類CheckItemDao

    ? 5.配置文件SetmealDao.xml

    ? 配置文件CheckGroupDao.xml

    ? 配置文件CheckItemDao.xml

    完成需求: 1:根據(jù)套餐id查詢對應的套餐信息 2:查詢每個套餐對應的檢查組集合 3:查詢每個檢查組對應的檢查項集合

    【講解-需求】

    前面我們已經(jīng)完成了體檢套餐列表頁面動態(tài)展示,點擊其中任意一個套餐則跳轉到對應的套餐詳情頁面(/pages/setmeal_detail.html),并且會攜帶此套餐的id作為參數(shù)提交。

    請求路徑格式:http://localhost/pages/setmeal_detail.html?id=10

    在套餐詳情頁面需要展示當前套餐的信息(包括圖片、套餐名稱、套餐介紹、適用性別、適用年齡)、此套餐包含的檢查組信息、檢查組包含的檢查項信息等。

    3.1. 前臺代碼

    3.1.1. 獲取請求參數(shù)中套餐id

    (1)在頁面中已經(jīng)引入了healthmobile.js文件,此文件中已經(jīng)封裝了getUrlParam方法可以根據(jù)URL請求路徑中的參數(shù)名獲取對應的值

    //獲取指定的URL參數(shù)值 http://localhost/pages/setmeal_detail.html?id=15 // 從url中獲取參數(shù)的值 function getUrlParam(paraName) {var url = document.location.toString();//http://localhost/pages/setmeal_detail.html?id=15//alert(url);var arrObj = url.split("?");// arrObj[0]=http://localhost/pages/setmeal_detail.html// arrObj[1]=id=15if (arrObj.length > 1) {//id=15var arrPara = arrObj[1].split("&");var arr;//arrPara[0] id=15for (var i = 0; i < arrPara.length; i++) {// id=15arr = arrPara[i].split("=");//arr[0]=id arr[1]=15if (arr != null && arr[0] == paraName) {return arr[1];}}return "";}else {return "";} }

    (2)在setmeal_detail.html中調用上面定義的方法獲取套餐id的值

    3.1.2. 獲取套餐詳細信息

    <script>var vue = new Vue({el:'#app',data:{setmeal:{}},methods:{toOrderInfo(){window.location.href = "orderInfo.html?id=" + id;}},mounted(){// 獲取套餐詳情信息axios.get("/setmeal/findDetailById.do?id=" + id).then((response) => {if(response.data.flag){this.setmeal = response.data.data;}});}}); </script>

    其中:imgUrl要指定七牛云的空間地址

    3.1.3. 展示套餐信息

    1:{{setmeal.name}}:套餐信息

    2:v-for="checkgroup in setmeal.checkGroups:檢查組信息

    3:v-for=“checkitem in checkgroup.checkItems”:檢查項信息

    套餐圖片的展示

    <!-- 頁面內容 --> <div class="contentBox"><div class="card"><div class="project-img"><img :src="setmeal.img" width="100%" height="100%" /></div><div class="project-text"><h4 class="tit">{{setmeal.name}}</h4><p class="subtit">{{setmeal.remark}}</p><p class="keywords"><span>{{setmeal.sex == '0' ? '性別不限' : setmeal.sex == '1' ? '男':'女'}}</span><span>{{setmeal.age}}</span></p></div></div><div class="table-listbox"><div class="box-title"><i class="icon-zhen"><span class="path1"></span><span class="path2"></span></i><span>套餐詳情</span></div><div class="box-table"><div class="table-title"><div class="tit-item flex2">項目名稱</div><div class="tit-item flex3">項目內容</div><div class="tit-item flex3">項目解讀</div></div><div class="table-content"><ul class="table-list"><li class="table-item" v-for="checkgroup in setmeal.checkGroups"><div class="item flex2">{{checkgroup.name}}</div><div class="item flex3"><label v-for="checkitem in checkgroup.checkItems">{{checkitem.name}}</label></div><div class="item flex3">{{checkgroup.remark}}</div></li></ul></div><div class="box-button"><a @click="toOrderInfo()" class="order-btn">立即預約</a></div></div></div> </div>

    3.2. 后臺代碼

    3.2.1. Controller

    在SetmealMobileController中提供findById方法

    /*** 查詢套餐詳情*/ @GetMapping("/findDetailById") public Result findDetailById(int id){// 調用服務查詢詳情Setmeal setmeal = setmealService.findDetailById(id);// 設置圖片的完整路徑setmeal.setImg(QiNiuUtils.DOMAIN + setmeal.getImg());return new Result(true, MessageConstant.QUERY_SETMEAL_SUCCESS,setmeal); }

    3.2.2. 服務接口

    在SetmealService服務接口中提供findById方法

    /*** 查詢套餐詳情* @param id* @return*/ Setmeal findDetailById(int id);

    3.2.3. 服務實現(xiàn)類

    在SetmealServiceImpl服務實現(xiàn)類中實現(xiàn)findById方法

    /*** 查詢套餐詳情* @param id* @return*/ @Override public Setmeal findDetailById(int id) {return setmealDao.findDetailById(id); }

    3.2.4. Dao接口

    1:在SetmealDao接口中提供findById方法

    /*** 查詢套餐詳情* @param id* @return*/ Setmeal findDetailById(int id);

    3.2.5. Mapper映射文件

    此處會使用mybatis提供的關聯(lián)查詢,在根據(jù)id查詢套餐時,同時將此套餐包含的檢查組都查詢出來,并且將檢查組包含的檢查項都查詢出來。

    1:SetmealDao.xml文件:

    <select id="findDetailById" parameterType="int" resultMap="setmealDetailMap">selects.*,sg.checkgroup_id, cg.name checkgroup_name, cg.remark as checkgroup_remark,cc.checkitem_id, ci.name checkitem_nameFromt_setmeal s, t_setmeal_checkgroup sg,t_checkgroup cg, t_checkgroup_checkitem cc,t_checkitem ciwheres.id=sg.setmeal_id and sg.checkgroup_id=cg.idand cg.id=cc.checkgroup_id and cc.checkitem_id=ci.idand s.id=#{id} </select> <!-- 1對多關系配置 套餐下有檢查組 檢查組下有檢查項 --> <resultMap id="setmealDetailMap" type="setmeal"><id property="id" column="id"/><result property="name" column="name" /><result property="code" column="code" /><result property="helpCode" column="helpCode" /><result property="sex" column="sex" /><result property="age" column="age" /><result property="price" column="price" /><result property="remark" column="remark" /><result property="attention" column="attention" /><result property="img" column="img" /><collection property="checkGroups" ofType="CheckGroup"><id property="id" column="checkgroup_id"/><result property="name" column="checkgroup_name"/><result property="remark" column="checkgroup_remark"/><collection property="checkItems" ofType="CheckItem"><id property="id" column="checkitem_id"/><result property="name" column="checkitem_name"/></collection></collection> </resultMap>

    【小結】

    1:掌握sql語句的聯(lián)合查詢(sql語句的嵌套查詢),應用在多對多場景 2:掌握使用<resultMap>完成映射 3:掌握使用<collection> 1對多 完成集合的封裝(<association> 1對1 完成對象的封裝)

    套餐詳情方式實現(xiàn)結果:

    推薦使用方式一,獲取1個連接,查詢一次就返回結果

    方式二: 獲取1個連接,期間需要執(zhí)行多次查詢,查詢次數(shù)取決于檢查組的個數(shù)

    方式三:每次查詢都獲取新的連接,查詢的次數(shù)與方式二一樣。

    4.Freemarker頁面靜態(tài)化技術

    【目標】

    1:什么是頁面靜態(tài)化技術(作用:用于減少查詢數(shù)據(jù)庫的頻率, 利于SEO 搜索排名靠前)

    2:什么是Freemarker

    3:Freemarker的操作入門

    【路徑】

    1:什么是頁面靜態(tài)化技術(作用:用于減少查詢數(shù)據(jù)庫的頻率)

    2:什么是Freemarker(作用:可生成html靜態(tài)資源文件,從而達到減少查詢數(shù)據(jù)庫的頻率)

    3:Freemarker入門案例

    (1)搭建環(huán)境

    (2)創(chuàng)建模板文件

    (3)使用模板文件,生成靜態(tài)文件

    4:Freemarker相關指令

    (1)assign指令

    (2)include指令

    (3)if指令

    (4)list指令

    【講解】

    4.1. 頁面靜態(tài)化介紹

    本章課程中我們已經(jīng)實現(xiàn)了移動端套餐列表頁面和套餐詳情頁面的動態(tài)展示。但是我們需要思考一個問題,就是對于這兩個頁面來說,每次用戶訪問這兩個頁面都需要查詢數(shù)據(jù)庫獲取動態(tài)數(shù)據(jù)進行展示,而且這兩個頁面的訪問量是比較大的,這就對數(shù)據(jù)庫造成了很大的訪問壓力,并且數(shù)據(jù)庫中的數(shù)據(jù)變化頻率并不高。那我們需要通過什么方法為數(shù)據(jù)庫減壓并提高系統(tǒng)運行性能呢?答案就是頁面靜態(tài)化。

    頁面靜態(tài)化其實就是將原來的動態(tài)網(wǎng)頁(例如通過ajax請求動態(tài)獲取數(shù)據(jù)庫中的數(shù)據(jù)并展示的網(wǎng)頁)改為通過靜態(tài)化技術生成的靜態(tài)網(wǎng)頁,這樣用戶在訪問網(wǎng)頁時,服務器直接給用戶響應靜態(tài)html頁面,沒有了動態(tài)查詢數(shù)據(jù)庫的過程。

    那么這些靜態(tài)HTML頁面還需要我們自己去編寫嗎?其實并不需要,我們可以通過專門的頁面靜態(tài)化技術幫我們生成所需的靜態(tài)HTML頁面,例如:Freemarker、thymeleaf, velocity等。

    頁面靜態(tài)化技術: 把頁面需要所有數(shù)據(jù)都寫死文件里,下次使用時,不需要再去查詢數(shù)據(jù)庫,直接用即可

    4.2. Freemarker介紹

    FreeMarker 是一個用 Java 語言編寫的模板引擎,它基于模板來生成文本輸出。FreeMarker與 Web 容器無關,即在 Web 運行時,它并不知道 Servlet 或 HTTP。它不僅可以用作表現(xiàn)層的實現(xiàn)技術,而且還可以用于生成 XML,JSP 或 Java 等。

    學習網(wǎng)站:http://freemarker.foofun.cn/

    Freemarker: 是一款文本模板引擎,運行后臺代碼。 Velocity, Thymeleaf

    作用: 實現(xiàn)頁面靜態(tài)化,通過模板來生成文件,往模板填寫數(shù)據(jù)即可

    4.3. Freemarker入門案例

    4.3.1. 環(huán)境搭建

    創(chuàng)建freemarkdemo工程并導入Freemarker的maven坐標

    <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version> </dependency>

    4.3.2. 創(chuàng)建模板文件

    模板文件中有四種元素:

    1、文本,直接輸出的部分
    2、注釋,即<#–…-->格式不會輸出
    3、插值(Interpolation):即${…}部分,將使用數(shù)據(jù)模型中的部分替代輸出
    4、FTL指令:FreeMarker指令,和HTML標記類似,名字前加#予以區(qū)分,不會輸出

    Freemarker的模板文件后綴可以任意,一般建議為ftl。

    在D盤創(chuàng)建ftl目錄,在ftl目錄中創(chuàng)建名稱為test.ftl的模板文件,內容如下:

    <html> <head><meta charset="utf-8"><title>Freemarker入門</title> </head> <body><#--我只是一個注釋,我不會有任何輸出 -->${name}你好,${message} </body> </html>

    4.3.3. 生成文件

    使用步驟:

    第一步:創(chuàng)建一個 Configuration 對象,直接 new 一個對象。構造方法的參數(shù)就是 freemarker的版本號。

    第二步:設置模板文件所在的路徑。

    第三步:設置模板文件使用的字符集。一般就是 utf-8。

    第四步:加載一個模板,創(chuàng)建一個模板對象。

    第五步:創(chuàng)建一個模板使用的數(shù)據(jù)集,可以是 pojo 也可以是 map。一般是 Map。

    第六步:創(chuàng)建一個 Writer 對象,一般創(chuàng)建 FileWriter 對象,指定生成的文件名。

    第七步:調用模板對象的 process 方法輸出文件。

    第八步:關閉流。

    public static void main(String[] args) throws Exception{//1.創(chuàng)建配置類Configuration configuration=new Configuration(Configuration.getVersion());//2.設置模板所在的目錄 configuration.setDirectoryForTemplateLoading(new File("D:\\ftl"));//3.設置字符集configuration.setDefaultEncoding("utf-8");//4.加載模板Template template = configuration.getTemplate("test.ftl");//5.創(chuàng)建數(shù)據(jù)模型Map map=new HashMap();map.put("name", "張三");map.put("message", "歡迎來到傳智播客!");//6.創(chuàng)建Writer對象Writer out =new FileWriter(new File("d:\\test.html"));//7.輸出template.process(map, out);//8.關閉Writer對象out.close(); }

    上面的入門案例中Configuration配置對象是自己創(chuàng)建的,字符集和模板文件所在目錄也是在Java代碼中指定的。在項目中應用時可以將Configuration對象的創(chuàng)建交由Spring框架來完成,并通過依賴注入方式將字符集和模板所在目錄注入進去。

    4.4. Freemarker指令

    4.4.1. assign指令

    assign指令用于在頁面上定義一個變量

    (1)定義簡單類型

    <#assign linkman="周先生"> 聯(lián)系人:${linkman}

    (2)定義對象類型

    <#assign info={"mobile":"13812345678",'address':'北京市昌平區(qū)'} > 電話:${info.mobile} 地址:${info.address}

    4.4.2. include指令

    include指令用于模板文件的嵌套, 用于頁面布局, 頁面公共內容的抽取

    (1)創(chuàng)建模板文件head.ftl

    <h1>黑馬程序員</h1>

    (2)修改入門案例中的ftl.ftl,在ftl.ftl模板文件中使用include指令引入上面的模板文件

    <#include "head.ftl"/>

    4.4.3. if指令

    if指令用于判斷

    (1)在模板文件中使用if指令進行判斷

    <#if success=true>你已通過實名認證 <#else> 你未通過實名認證 </#if>

    (2)在java代碼中為success變量賦值

    map.put("success", true);

    在freemarker的判斷中,可以使用= 也可以使用

    if指令可以配合assign success=true使用

    <#assign success1=true> <#if success1=true>你已通過實名認證1 <#else> 你未通過實名認證1 </#if>

    4.4.4. list指令

    list指令用于遍歷

    (1)在模板文件中使用list指令進行遍歷

    <#list goodsList as goods>商品名稱: ${goods.name} 價格:${goods.price}<br> </#list>

    (2)在java代碼中為goodsList賦值

    List goodsList=new ArrayList();Map goods1=new HashMap(); goods1.put("name", "蘋果"); goods1.put("price", 5.8);Map goods2=new HashMap(); goods2.put("name", "香蕉"); goods2.put("price", 2.5);Map goods3=new HashMap(); goods3.put("name", "橘子"); goods3.put("price", 3.2);goodsList.add(goods1); goodsList.add(goods2); goodsList.add(goods3);map.put("goodsList", goodsList);

    【小結】

    http://freemarker.foofun.cn/ 官方

    1:什么是頁面靜態(tài)化技術,返回給瀏覽器時,所有的數(shù)據(jù)都已經(jīng)寫好了,不需要再訪問服務去獲取數(shù)據(jù),頁面中的內容已經(jīng)寫死了。 減少數(shù)據(jù)庫訪問、提高seo

    2:什么是Freemarker(作用:可生成html靜態(tài)資源文件,從而達到減少查詢數(shù)據(jù)庫的頻率)

    是一種模板引擎,通過往模板填充數(shù)據(jù)即生成文件。

    3:Freemarker入門案例

    (1)搭建環(huán)境 (maven,引入依賴)

    (2)創(chuàng)建模板文件(【utf-8】【utf-8】【utf-8】另存為選擇utf-8, ANSI->latin-1 -> ISO-8859-1)

    (3)使用模板文件(加載文件,配置模板文件目錄,設置默認的編碼utf-8,獲取模板),生成靜態(tài)文件(數(shù)據(jù)模型map)

  • 通過版本來創(chuàng)建配置類
  • 設置模板路徑
  • 設置編碼
  • 通過文件名獲取模板
  • 創(chuàng)建數(shù)據(jù)模型Map<String,Object> 實體類
  • process方法,填充數(shù)據(jù)到輸出文件里
  • 關閉流
  • 4:Freemarker相關指令

    (1)assign指令 聲明變量且給它賦值, 如果數(shù)據(jù)模型中有相同的變量,則以assin有效

    (2)include指令 導入其它模板文件,頁面布局,公共內容的抽取

    (3)if指令(常用) 判斷輸出

    (4)list指令(常用) 遍歷集合 list as item

  • 如果數(shù)據(jù)模型dataModel與assign使用同一變量時,則以assign為準
  • 如果模板中使用了某個變量在dataModel沒有定義/沒有assign,則會報錯
  • 模板中使用的變量不能為null, 否則報錯
  • 5. 生成移動端靜態(tài)頁面,整合項目

    前面我們已經(jīng)學習了Freemarker的基本使用方法,下面我們就可以將Freemarker應用到項目中,幫我們生成移動端套餐列表靜態(tài)頁面和套餐詳情靜態(tài)頁面。接下來我們需要思考幾個問題:

    (1)什么時候生成靜態(tài)頁面比較合適呢?套餐的增刪改(列表, 修改的套餐詳情)

    (2)將靜態(tài)頁面生成到什么位置呢? health_mobile/webapp/pages/

    (3)應該生成幾個靜態(tài)頁面呢? 套餐列表.html, setmeal_{id}.html

    對于第一個問題,應該是當套餐數(shù)據(jù)發(fā)生改變時,需要生成靜態(tài)頁面,即我們通過后臺系統(tǒng)修改套餐數(shù)據(jù)(包括新增、刪除、編輯)時。

    對于第二個問題,如果是在開發(fā)階段可以將文件生成到項目工程中,如果上線后可以將文件生成到移動端系統(tǒng)運行的tomcat中。

    對于第三個問題,套餐列表只需要一個頁面就可以了,在這個頁面中展示所有的套餐列表數(shù)據(jù)即可。套餐詳情頁面需要有多個,即一個套餐應該對應一個靜態(tài)頁面。

    【目標】

    1:在傳智健康前端系統(tǒng)中使用頁面靜態(tài)化Freemarker技術

    2:使用Freemarker生成 套餐列表靜態(tài)化頁面 列表頁

    3:使用Freemarker生成 套餐詳情靜態(tài)化頁面 多個,以id區(qū)分

    4:Freemarker與spring的整合使用 配置文件

    【路徑】

    1:環(huán)境搭建

    2:創(chuàng)建模板文件

    (1)mobile_setmeal.ftl

    (2)mobile_setmeal_detail.ftl

    3:spring整合Freemarker

    (1)freemarker.properties

    (2)applicationContext-freemarker.xml

    4:生成靜態(tài)頁面

    生成靜態(tài)頁面的時機,在新增套餐的時候生成靜態(tài)頁面(套餐列表及套餐詳情)

    【講解】

    5.1. 環(huán)境搭建

    在health_parent工程的pom文件中導入Freemarker的maven坐標

    在health_common工程的pom文件中導入Freemarker的maven坐標

    <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId> </dependency>

    5.2. 創(chuàng)建模板文件

    在health_service工程的WEB-INF目錄中創(chuàng)建ftl目錄,在ftl目錄中創(chuàng)建模板文件mobile_setmeal.ftl和mobile_setmeal_detail.ftl文件,前者是用于生成套餐列表頁面的模板文件,后者是生成套餐詳情頁面的模板文件

    (1)mobile_setmeal.ftl

    <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- 上述3個meta標簽*必須*放在最前面,任何其他內容都*必須*跟隨其后! --><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0,user-scalable=no,minimal-ui"><meta name="description" content=""><meta name="author" content=""><link rel="icon" href="../img/asset-favico.ico"><title>預約</title><link rel="stylesheet" href="../css/page-health-order.css" /> </head> <body data-spy="scroll" data-target="#myNavbar" data-offset="150"> <div class="app" id="app"><!-- 頁面頭部 --><div class="top-header"><span class="f-left"><i class="icon-back" onclick="history.go(-1)"></i></span><span class="center">傳智健康</span><span class="f-right"><i class="icon-more"></i></span></div><!-- 頁面內容 --><div class="contentBox"><div class="list-column1"><ul class="list"><#list setmealList as setmeal><li class="list-item" ><a class="link-page" href="setmeal_${setmeal.id}.html"><img class="img-object f-left" src="${setmeal.img}" alt=""><div class="item-body"><h4 class="ellipsis item-title">${setmeal.name}</h4><p class="ellipsis-more item-desc">${setmeal.remark}</p><p class="item-keywords"><span><#if setmeal.sex=='0'>性別不限<#else><#if setmeal.sex=='1'>男<#else></#if></#if></span><span>${setmeal.age}</span></p></div></a></li></#list></ul></div></div> </div> </body>

    注意1:上面的數(shù)據(jù)需保證數(shù)據(jù)庫中不能為null。

    注意2: 套餐列表 的值里要設置圖片的完整路徑。

    注意3:上面模板文件中每個套餐對應的超鏈接如下:

    可以看到,鏈接的地址是動態(tài)構成的,

    如果套餐的id為1,則對應的超鏈接地址為setmeal_1.html;

    如果套餐的id為5,則對應的超鏈接地址為setmeal_5.html。

    所以我們需要為每個套餐生成一個套餐詳情靜態(tài)頁面。

    (2)mobile_setmeal_detail.ftl

    <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- 上述3個meta標簽*必須*放在最前面,任何其他內容都*必須*跟隨其后! --><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0,user-scalable=no,minimal-ui"><meta name="description" content=""><meta name="author" content=""><link rel="icon" href="../img/asset-favico.ico"><title>預約詳情</title><link rel="stylesheet" href="../css/page-health-orderDetail.css" /> </head> <body data-spy="scroll" data-target="#myNavbar" data-offset="150"> <div id="app" class="app"><!-- 頁面頭部 --><div class="top-header"><span class="f-left"><i class="icon-back" onclick="history.go(-1)"></i></span><span class="center">傳智健康</span><span class="f-right"><i class="icon-more"></i></span></div><!-- 頁面內容 --><div class="contentBox"><div class="card"><div class="project-img"><img src="${setmeal.img}" width="100%" height="100%" /></div><div class="project-text"><h4 class="tit">${setmeal.name}</h4><p class="subtit">${setmeal.remark}</p><p class="keywords"><span><#if setmeal.sex=='0'>性別不限<#else><#if setmeal.sex=='1'>男<#else></#if></#if></span><span>${setmeal.age}</span></p></div></div><div class="table-listbox"><div class="box-title"><i class="icon-zhen"><span class="path1"></span><span class="path2"></span></i><span>套餐詳情</span></div><div class="box-table"><div class="table-title"><div class="tit-item flex2">項目名稱</div><div class="tit-item flex3">項目內容</div><div class="tit-item flex3">項目解讀</div></div><div class="table-content"><ul class="table-list"><#list setmeal.checkGroups as checkgroup><li class="table-item"><div class="item flex2">${checkgroup.name}</div><div class="item flex3"><#list checkgroup.checkItems as checkitem><label>${checkitem.name}</label></#list></div><div class="item flex3">${checkgroup.remark}</div></li></#list></ul></div><div class="box-button"><a href="orderInfo.html?id=${setmeal.id}" class="order-btn">立即預約</a></div></div></div></div> </div> </body>

    注意:改變七牛云的訪問地址

    5.3. 配置文件

    (1)在health_service 工程中創(chuàng)建屬性文件freemarker.properties。這個路徑要改你的health_mobile中的webapp/pages目錄,全路徑

    out_put_path=D:/ideaProjects/health_parent/health_mobile/src/main/webapp/pages

    通過上面的配置可以指定將靜態(tài)HTML頁面生成的目錄位置

    (2)在health_service工程的Spring配置文件中配置,創(chuàng)建applicationContext-freemarker.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:property-placeholder location="classpath:freemarker.properties"/><bean id="freemarkerConfig"class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"><!--指定模板文件所在目錄--><property name="templateLoaderPath" value="/WEB-INF/ftl/" /><!--指定字符集--><property name="defaultEncoding" value="UTF-8" /></bean> </beans>

    (3)在applicationContext-service.xml中導入applicationContext-freemarker.xml

    5.4. 生成靜態(tài)頁面

    修改health_service_provider工程中的SetmealServiceImpl類的add方法,加入生成靜態(tài)頁面的邏輯。

    /*** 添加套餐* @param setmeal* @param checkgroupIds*/ @Override @Transactional public void add(Setmeal setmeal, Integer[] checkgroupIds) {// 添加套餐信息setmealDao.add(setmeal);// 獲取套餐的idInteger setmealId = setmeal.getId();// 添加套餐與檢查組的關系if(null != checkgroupIds){for (Integer checkgroupId : checkgroupIds) {setmealDao.addSetmealCheckGroup(setmealId, checkgroupId);}}//新增套餐后需要重新生成靜態(tài)頁面generateMobileStaticHtml(); }/*** 生成 列表及詳情靜態(tài)頁面*/ private void generateMobileStaticHtml(){try {// 套餐列表靜態(tài)頁面generateSetmealListHtml();// 套餐詳情靜態(tài)頁面 生成單就行了,為了測試方便,生成所有的generateSetmealDetailHtml();} catch (Exception e) {throw new RuntimeException(e);} }/*** 生成套餐詳情靜態(tài)頁面*/ private void generateSetmealDetailHtml() throws Exception {// 把所有套餐都生成詳情頁面 方便測試List<Setmeal> setmealList = setmealDao.findAll();// setmealList中的套餐是沒有詳情信息,即沒有檢查組也沒有檢查項的信息,要查詢一遍for (Setmeal setmeal : setmealList) {// 獲取套餐詳情Setmeal setmealDetail = setmealDao.findDetailById(setmeal.getId());// 設置套餐的圖片路徑setmealDetail.setImg(QiNiuUtils.DOMAIN + setmealDetail.getImg());// 生成詳情頁面generateDetailHtml(setmealDetail);} }/*** 生成套餐詳情頁面* @param setmealDetail*/ private void generateDetailHtml(Setmeal setmealDetail) throws Exception {// 獲取模板 套餐列表的模板Template template = freeMarkerConfigurer.getConfiguration().getTemplate("mobile_setmeal_detail.ftl");Map<String, Object> dataMap = new HashMap<String,Object>();dataMap.put("setmeal", setmealDetail);File setmealDetailFile = new File(out_put_path, "setmeal_" + setmealDetail.getId() + ".html");template.process(dataMap, new BufferedWriter(new OutputStreamWriter(new FileOutputStream(setmealDetailFile),"utf-8"))); }/*** 生成 套餐列表靜態(tài)頁面*/ private void generateSetmealListHtml() throws Exception {// 獲取模板 套餐列表的模板Template template = freeMarkerConfigurer.getConfiguration().getTemplate("mobile_setmeal.ftl");// 獲取數(shù)據(jù)模型List<Setmeal> setmealList = setmealDao.findAll();// 圖片地址setmealList.forEach(s->{s.setImg(QiNiuUtils.DOMAIN + s.getImg());});Map<String, Object> dataMap = new HashMap<String,Object>();dataMap.put("setmealList", setmealList);// 給模板填充數(shù)據(jù) new OutputStreamWriter要指定編碼格式,否則中文亂碼// 生成的文件 c:/sz89/health_parent/health_mobile/src/main/webapp/pages/m_setmeal.htmlFile setmealListFile = new File(out_put_path, "m_setmeal.html");template.process(dataMap, new BufferedWriter(new OutputStreamWriter(new FileOutputStream(setmealListFile),"utf-8"))); }

    通過上面代碼可以看到,我們生成的套餐列表頁面名稱為m_setmeal.html,為了能夠在移動端訪問到此頁面,需要將移動端工程中的/pages/index.html頁面的超鏈接地址進行修改:

    之前為:

    修改為:

    【小結】

    1:環(huán)境搭建

    2:創(chuàng)建模板文件 模板文件的編碼一定是utf-8

    (1)mobile_setmeal.ftl

    (2)mobile_setmeal_detail.ftl

    3:spring整合Freemarker

    (1)freemarker.properties 生成的文件存儲目錄

    (2)applicationContext-freemarker.xml 整合 defaultEncoding=utf-8

    4:生成靜態(tài)頁面

    生成靜態(tài)頁面的時機,在新增套餐的時候生成靜態(tài)頁面(套餐列表及套餐詳情)

    新增時:生成套餐列表頁面,生成新的套餐詳情頁面

    修改時:生成套餐列表頁面,生成修改的套餐詳情頁面

    刪除時:生成套餐列表頁面,(生成刪除的套餐詳情頁面(下架, 所有鏈接要失效, 或者把頁面移除))

    布署項目時,要觸發(fā)一次生成所有的靜態(tài)頁面

    應該用后臺任務來跑(lastUpdated, 任務表lastUpdate)

    new OutputStreamWriter(os, “utf-8”)

    總結

    以上是生活随笔為你收集整理的【项目】健康项目day5总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

    久草久草在线观看 | 日韩天天干 | 999久久a精品合区久久久 | 色网站视频| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产精品 视频 | 97在线影视 | 97精品欧美91久久久久久 | 国产精品一区在线播放 | 欧美日韩不卡在线视频 | 国产精品久久久久久久久久久免费 | 国产精品久久99综合免费观看尤物 | 激情开心站 | 久久精品久久精品 | 免费观看www视频 | 在线播放 日韩专区 | 欧美射射射 | 天天操天天射天天插 | 久久影院中文字幕 | 91av视频在线观看免费 | 激情网色 | 最新一区二区三区 | 日韩理论电影网 | 欧美夫妻生活视频 | 亚洲电影黄色 | 四虎成人免费观看 | 91久久国产露脸精品国产闺蜜 | 97网| 97人人超碰在线 | 91视频 - v11av| 热久久精品在线 | 在线免费观看麻豆视频 | 亚洲欧美在线视频免费 | 日韩午夜高清 | 欧美午夜精品久久久久 | 精久久久久 | 天天艹天天爽 | 国产精品亚洲成人 | 午夜精品一区二区三区四区 | 欧美日bb | 亚洲天天做 | 色搞搞 | 天天天综合网 | 国产精品视频免费观看 | 九草视频在线观看 | 在线中文字母电影观看 | 一区二区三区动漫 | 国产精品热视频 | www.狠狠插.com | 国产日韩精品一区二区在线观看播放 | 99精品欧美一区二区蜜桃免费 | 午夜视频欧美 | 欧美激情视频在线免费观看 | a天堂免费 | 91九色porny在线 | 国产不卡在线观看视频 | 97电影在线 | 日日夜夜人人天天 | 欧美黄色特级片 | 中文字幕中文字幕在线一区 | 国产综合在线视频 | 成人在线播放av | 伊人天天狠天天添日日拍 | 欧美在线观看视频 | 成人午夜网址 | 国产成人精品一区二区在线 | 一本一本久久a久久精品综合小说 | 日韩在线高清免费视频 | 久久午夜免费视频 | 国产精品久久久久亚洲影视 | 国产福利精品视频 | 韩国av免费在线 | 玖玖玖在线观看 | 成人国产精品入口 | 91av视频免费观看 | 四虎国产精品免费 | 久久精视频 | 黄色官网在线观看 | 欧美福利在线播放 | 国产高清免费观看 | 久久成电影 | 久久九九久久九九 | 日本乱视频 | 亚洲va欧美va国产va黑人 | 久久蜜臀一区二区三区av | 亚洲欧美视频一区二区三区 | 国产又粗又长的视频 | 青青草国产精品视频 | 国产手机在线精品 | 国产日韩欧美在线看 | 色婷婷久久久综合中文字幕 | 天天爽天天碰狠狠添 | 国产伦精品一区二区三区无广告 | 久久久久久久久久久久影院 | 日韩福利在线观看 | 国产美女免费观看 | 又黄又色又爽 | 在线视频一二区 | 天天干天天干天天干 | 成人国产精品久久久春色 | 一区av在线播放 | 国产无吗一区二区三区在线欢 | 日韩三级视频 | 毛片无卡免费无播放器 | 久久久久久久久久久高潮一区二区 | 国产一二区免费视频 | 久久99精品热在线观看 | 久久九九九九 | 91av福利视频| 国产一级片一区二区三区 | 一区二区三区中文字幕在线观看 | 激情五月色播五月 | 日韩中字在线 | av在线进入| 97综合视频 | 欧美在线观看视频 | 麻豆视频免费看 | 在线影视 一区 二区 三区 | 中文字幕大全 | 欧美极品裸体 | 新版资源中文在线观看 | 日韩色区 | 免费在线国产 | 97精品国产91久久久久久久 | 久久综合五月婷婷 | 超碰人人在 | 久久区二区 | 狠狠干激情 | 国产丝袜制服在线 | 国产精品久久久久久久久久久免费 | 一区三区视频 | 一区二区三区精品在线 | 欧美黄色高清 | 91成人免费视频 | 久久电影国产免费久久电影 | 91精品福利在线 | 日韩精品91偷拍在线观看 | 亚洲国产精品va在线 | 亚洲最大成人网4388xx | 亚洲成人免费观看 | 免费观看www小视频的软件 | 天天看天天干天天操 | 国产一区在线精品 | 国产精品 中文字幕 亚洲 欧美 | 99久久久国产精品免费99 | 国产美女黄网站免费 | 中文av不卡 | 日韩久久影院 | 毛片网站在线观看 | 九九热有精品 | 久久观看免费视频 | 免费亚洲精品视频 | 天天干天天在线 | 色国产精品 | 国产色视频网站 | 国产色综合| 欧美日韩国产在线观看 | 正在播放国产一区 | 成人资源站 | 日免费视频 | 久久久国产影视 | 最新国产精品亚洲 | 欧美极品xxx | 国产一级黄色片免费看 | 日韩av有码在线 | 午夜免费在线观看 | 国产日本在线播放 | 亚洲 欧美日韩 国产 中文 | 五月天综合网站 | 日韩精品中文字幕一区二区 | 91精品一区二区三区蜜桃 | 天天天天色综合 | 97色综合| 日韩精品视频一二三 | 视频精品一区二区三区 | 日韩视频一区二区三区在线播放免费观看 | 天天摸天天操天天舔 | 精品国产一二三 | 美女视频黄频大全免费 | 免费看三级黄色片 | 婷婷色在线资源 | 日韩亚洲在线观看 | 中文字幕电影在线 | 国产精品乱码久久 | 蜜臀久久99精品久久久无需会员 | 午夜精品久久久久久99热明星 | 精品国内自产拍在线观看视频 | 久久久一本精品99久久精品66 | 99亚洲国产精品 | 久草精品视频 | 国产精品久久久久久久妇 | 国产精品久久久久久久久久妇女 | 18pao国产成视频永久免费 | 最近2019年日本中文免费字幕 | 安徽妇搡bbbb搡bbbb | 天天久久综合 | 成人黄色中文字幕 | 日本女人的性生活视频 | 国内精品久久久久久久97牛牛 | 亚洲无人区小视频 | 国产精品午夜8888 | 美女视频黄网站 | 免费久久久久久久 | 亚洲国产人午在线一二区 | 91av电影网| 欧美日韩亚洲国产一区 | 91成人免费在线视频 | 三级黄色片在线观看 | 日韩免费电影网站 | 日本中文字幕在线视频 | 日韩精品视频免费专区在线播放 | 又紧又大又爽精品一区二区 | 国产一区二区高清 | 国产精品99免费看 | 精品视频区 | 日本黄网站 | 国产一二三在线视频 | 香蕉影院在线播放 | 91亚洲永久精品 | 日韩色在线 | 一区二区视频在线播放 | 久久影院精品 | 九九免费在线观看视频 | 夜添久久精品亚洲国产精品 | 久久影视中文字幕 | 香蕉在线观看视频 | 黄色免费看片网站 | 欧美性极品xxxx做受 | 99精品免费久久久久久久久 | 亚洲国产免费 | 综合久久精品 | 激情视频一区 | 欧美天堂影院 | 国产精品高清在线观看 | 亚洲老妇xxxxxx | 日韩av专区| 一级成人免费视频 | 国产日韩欧美在线观看视频 | 亚洲成av人影院 | 久久久www成人免费精品张筱雨 | 91高清视频免费 | 黄色av成人在线 | 在线观看色网 | av高清影院| 久久成人午夜 | 一本一本久久a久久 | 免费人成网ww44kk44 | 欧美性久久久久久 | 色91在线 | 欧美日韩久久一区 | 天天操天天射天天 | 国产在线观看黄 | 国产成人一区二区三区 | 天天射天天色天天干 | 国产专区日韩专区 | 久久久www成人免费毛片 | 久久好看 | 91传媒在线看 | 久久久免费在线观看 | 国产不卡视频在线播放 | 国产一区在线观看免费 | 欧美激情第一页xxx 午夜性福利 | 日韩黄色一级电影 | 99综合视频| 日韩一区二区免费在线观看 | 国产午夜在线 | 99精品区 | 国产黄色a | www.色五月 | 超级碰碰碰视频 | 99视频精品在线 | 日韩在线观看中文字幕 | 精品在线小视频 | 日韩动漫免费观看高清完整版在线观看 | 久久久久久欧美二区电影网 | 91网免费看| 久久成人视屏 | 在线成人一区二区 | 国产特级毛片aaaaaa | 国产va饥渴难耐女保洁员在线观看 | 欧美日韩综合在线观看 | www.91成人 | av女优中文字幕在线观看 | 久久久综合 | 国产亚洲精品综合一区91 | 人人人爽 | 日韩电影黄色 | 国产在线精品一区二区三区 | 婷婷综合伊人 | 97超在线| 一区二区三区四区五区在线 | 在线观看日韩精品 | 午夜视频在线观看一区二区 | 国产视频欧美视频 | 欧洲精品一区二区 | 五月天久久婷婷 | 欧美日韩国产成人 | www.狠狠操 | 91亚洲永久精品 | 狠狠狠狠狠狠 | 成人a在线观看 | 视频91| 久久99国产精品免费 | 麻豆传媒视频观看 | 亚洲国产精彩中文乱码av | 久久精品国产一区二区三区 | 99精品偷拍视频一区二区三区 | 91视频88av | 免费在线观看国产黄 | 欧美成人按摩 | 国产馆在线播放 | 亚洲欧美视频网站 | 97超级碰碰碰碰久久久久 | 久久久久综合 | 国产综合福利在线 | 日韩肉感妇bbwbbwbbw | 中文字幕在线成人 | 亚洲第一中文网 | 国产小视频网站 | 在线免费观看一区二区三区 | 91av手机在线 | 亚洲黄色免费电影 | 天天干天天射天天操 | 中文字幕精品在线 | 免费av网站观看 | 香蕉色综合 | 亚洲精品在线观看网站 | 久久精品这里都是精品 | 免费视频一区二区 | 91桃色在线播放 | av日韩国产 | 国产一区欧美在线 | a'aaa级片在线观看 | 九九热只有精品 | 国产美女久久久 | 国产精品久久久久影院 | 成人毛片一区二区三区 | 狠狠网 | 超碰国产在线 | 日本在线h | 国产剧情一区在线 | 国产区高清在线 | 日韩欧美在线播放 | 99久久精品免费看国产 | 国产黄色在线看 | 在线免费观看麻豆视频 | 亚洲视频久久久 | 亚洲精品视频中文字幕 | 色a在线观看 | 在线免费中文字幕 | 精品一二三区 | 色99导航 | 中文字幕视频在线播放 | 国产精品免费观看国产网曝瓜 | 欧美日性视频 | 亚洲国产999 | 日本最新高清不卡中文字幕 | av中文字幕网 | 色综合久久88色综合天天人守婷 | 国产精品久久久久久久av大片 | 国产一区二区精品在线 | 久久久久久久久久久久久久免费看 | 久久爱资源网 | 国产成人精品一区二区三区在线 | 99视频在线免费 | 国产h在线播放 | 蜜桃av观看 | 91成人网在线观看 | 国产理论片在线观看 | 97超碰在线久草超碰在线观看 | 高清在线观看av | 日韩电影一区二区三区 | 精品亚洲一区二区 | 日韩高清激情 | 91秒拍国产福利一区 | 国产福利91精品一区 | 天天曰天天射 | 日韩精品一区二区在线观看视频 | 丁香婷婷色月天 | 区一区二区三区中文字幕 | 五月婷婷久 | 欧洲精品视频一区二区 | 成人高清在线 | 国产一二三四在线视频 | 国产在线欧美在线 | 国产亚洲精品成人av久久影院 | 天天曰| 国产成人综合图片 | 日韩欧美大片免费观看 | 国产日韩欧美自拍 | 91大神免费视频 | 51久久夜色精品国产麻豆 | 亚洲精品视频在线观看免费视频 | www.亚洲黄| av黄在线播放 | 亚洲视频在线播放 | 天天草天天干天天射 | 91免费观看视频网站 | 日本精品久久久一区二区三区 | 欧美激情视频一区二区三区免费 | 久久久久久久久久久久电影 | 日韩综合在线观看 | 久久五月精品 | 91传媒在线看 | 亚洲精品在线一区二区 | 国产精品不卡在线 | 国产日产精品一区二区三区四区 | 国产盗摄精品一区二区 | 91av视频在线免费观看 | 成 人 黄 色 视频 免费观看 | 天天狠狠操 | 日本色小说视频 | 日本中文字幕在线电影 | 精品国产欧美一区二区 | 欧美做受xxx| 日本动漫做毛片一区二区 | 亚洲天堂网视频在线观看 | 日韩伦理片一区二区三区 | 欧美日韩伦理在线 | 久久女教师 | 久草在线视频免费资源观看 | 欧美日韩一级久久久久久免费看 | 粉嫩av一区二区三区四区五区 | 欧美日韩性视频在线 | 国产精品尤物视频 | 一级免费观看 | 亚洲精品久久激情国产片 | 视频91在线 | www五月婷婷 | 97在线视频观看 | av免费看在线 | 视频一区亚洲 | av中文字幕在线电影 | 精品中文字幕在线 | 超碰97免费 | 日韩中文字幕在线观看 | 日韩av男人的天堂 | 波多野结衣久久精品 | 日本黄色免费在线观看 | 国产精品视频内 | 日韩欧美在线一区二区 | 人人爽人人舔 | 99精品视频在线观看播放 | 男女视频久久久 | 人人超在线公开视频 | 久久综合亚洲鲁鲁五月久久 | 色姑娘综合 | 在线免费观看的av | 99日精品| 五月天.com | 久久九九视频 | 精品国产91亚洲一区二区三区www | 激情视频免费在线 | 国产精品6999成人免费视频 | 天天操一操| 国产伦理一区 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产成人av片 | 美女免费视频观看网站 | 日韩高清在线看 | 成人app在线免费观看 | 91精品国产91久久久久福利 | 久草视频在线免费看 | 精品亚洲一区二区三区 | 免费高清在线一区 | a级国产片| 欧美视频二区 | 国产69熟 | 亚洲精品va | 欧美精品久久久久久久免费 | 久久撸在线视频 | 久久字幕精品一区 | 久久99精品国产麻豆宅宅 | 97精品国产aⅴ| 欧美最猛性xxxxx亚洲精品 | 亚洲婷久久 | 日韩爱爱片 | bbw av| 久久99精品国产麻豆宅宅 | 免费av网址大全 | 欧美va天堂在线电影 | 久久噜噜少妇网站 | 亚洲精品视频中文字幕 | 波多野结衣久久资源 | 久久久一本精品99久久精品66 | 日本少妇久久久 | 99在线观看免费视频精品观看 | 欧洲激情在线 | 久久国产视频网站 | 伊人久久五月天 | 亚洲成人资源在线观看 | 精品一二区 | 久久精品久久久久电影 | 国产精品日韩精品 | 欧美午夜精品久久久久久浪潮 | 韩国在线一区二区 | 狠狠干天天干 | 黄网av在线| 美女视频黄免费网站 | 天天操天天干天天 | 国产第一二区 | 一区二区三区 亚洲 | 人人干天天射 | 成人中文字幕在线 | 成人av一二三区 | 欧美xxxxx在线视频 | 天天操天天干天天插 | 天天看天天干天天操 | 麻豆va一区二区三区久久浪 | 亚洲精品国产精品久久99热 | 久久久久成人精品亚洲国产 | 亚洲精品视频二区 | 日韩视频专区 | 国产亚洲一区二区三区 | 成人久久精品视频 | 久保带人 | 国产色啪| 最新日本中文字幕 | 黄色亚洲免费 | 日韩1级片 | 欧美a√在线 | 在线观看视频一区二区三区 | 激情综合网五月 | 精品免费视频 | 国产精品入口a级 | 国内精品久久久 | 中文字幕 在线看 | 久久久久国产成人精品亚洲午夜 | 波多野结衣电影一区二区 | 最近免费观看的电影完整版 | 国产亚洲精品久久久久久久久久 | 亚洲2019精品| 久久久蜜桃 | 人人射人人 | 亚洲精品tv久久久久久久久久 | 亚洲伊人网在线观看 | 色综合天天在线 | 波多野结衣在线观看视频 | 色偷偷88888欧美精品久久久 | 久草电影在线观看 | 国产精品久久久久婷婷 | 日韩成人精品一区二区 | www.夜夜草 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 欧美成人影音 | 精品一区二三区 | 91日本在线播放 | 亚洲高清精品在线 | 亚洲视频在线观看 | 亚洲伊人天堂 | 在线观看国产成人av片 | 久久九九免费视频 | 日本精品久久久久中文字幕5 | 亚洲精品网站 | 六月丁香色婷婷 | 美女亚洲精品 | 狠狠躁日日躁狂躁夜夜躁av | 欧美视频www | 成人亚洲网 | 久久九九影视网 | 2021国产精品 | 国产亚洲欧洲 | 九九精品在线观看 | 中文字幕在线播放av | 天天搞天天干天天色 | 欧美 日韩 性 | 成 人 黄 色 视频 免费观看 | 国产特级毛片aaaaaaa高清 | 99精品热 | 国产剧情一区二区在线观看 | 91桃色在线播放 | 国产在线看 | 久久色在线观看 | 成人久久精品视频 | 久久你懂的 | 成人av中文字幕在线观看 | 久草在线视频新 | 国产成人免费观看久久久 | 日韩精品免费在线观看视频 | 色婷五月 | 久久观看 | 久久久久久福利 | 国产成人av片 | 69国产成人综合久久精品欧美 | 麻豆国产精品一区二区三区 | 久久久久国产精品午夜一区 | 成人网页在线免费观看 | 中文字幕在线看片 | 人人艹人人 | 国产99在线 | 成人资源在线播放 | 一本一本久久a久久精品综合妖精 | 韩国视频一区二区三区 | 小草av在线播放 | 久久五月婷婷丁香社区 | av电影免费看 | 欧美黄色特级片 | 国产视频精品网 | 一区二区成人国产精品 | 视频一区二区精品 | 五月婷婷毛片 | 国产精品一区二 | 日韩免费高清在线观看 | 精品一区欧美 | 色欲综合视频天天天 | 天天操夜夜摸 | 国产精品日韩精品 | 久久久成人精品 | 精品亚洲网| 日韩欧美在线综合网 | 九九视频网 | 亚洲国产欧洲综合997久久, | www.91国产 | 国产精品九九九 | 国产免费亚洲 | 激情深爱五月 | 波多野结衣一区三区 | 午夜精品久久久久久久99水蜜桃 | 欧美日韩二区三区 | 久久国产精品视频观看 | 国产精品乱码久久久 | 97成人在线免费视频 | 超碰在线公开 | 久久久久久久久免费视频 | 69av在线视频 | 在线国产不卡 | 美女在线国产 | 樱空桃av | 久草在线手机视频 | 五月天色综合 | 色www永久免费 | 久久成人综合视频 | 天天干 天天摸 天天操 | 色婷婷亚洲婷婷 | 亚洲成免费 | 久草视频精品 | 中文字幕一区在线观看视频 | 字幕网av | 国产99中文字幕 | www.色午夜.com | 伊人久久五月天 | 黄毛片在线观看 | 99久高清在线观看视频99精品热在线观看视频 | 亚洲免费不卡 | 亚洲精品播放 | 欧美日韩国产高清视频 | a v在线观看 | 午夜a区| 国产中文欧美日韩在线 | 国产精品女人久久久 | 六月激情婷婷 | 99免费国产| 亚洲国产精品久久久久婷婷884 | 日批网站在线观看 | 欧美 日韩 性 | 四虎影视国产精品免费久久 | 久久免费激情视频 | 国产九九精品视频 | 精品视频www| av免费看电影 | 日日草夜夜操 | 久久久国产一区二区三区四区小说 | 国产一区二区影院 | 碰超在线| 你操综合| 福利久久久 | 欧美日韩午夜爽爽 | 欧美va天堂va视频va在线 | 91精品一区二区三区蜜桃 | 久久综合久久综合这里只有精品 | 国产 色 | 日日干日日操 | 黄色动态图xx | av免费在线观| 日日干天天爽 | 国产手机在线视频 | 特级西西www44高清大胆图片 | 美女视频黄的免费的 | 日韩精品一区二区三区视频播放 | 国产剧情一区二区在线观看 | 91香蕉视频色版 | 国产高清视频免费观看 | 国产情侣一区 | 玖玖玖影院| 国产精品视频久久久 | av成人在线网站 | 欧美男同网站 | 国产探花 | 99热最新精品 | 天天干天天草天天爽 | 在线91播放 | 午夜性生活片 | 亚洲91视频 | 999久久国产精品免费观看网站 | 国产亚洲视频在线观看 | www黄免费 | 月下香电影| 色爽网站 | 亚洲一区二区视频在线 | 久久国产一区二区 | 免费观看成年人视频 | 超碰在线个人 | 亚洲精品字幕在线观看 | 久产久精国产品 | 一区二区影院 | 99成人免费视频 | 中文字幕在线观看免费 | 高清日韩一区二区 | 高清免费在线视频 | 国产精品国内免费一区二区三区 | 在线观看日韩中文字幕 | 亚洲精品乱码久久久久久久久久 | 中文字幕文字幕一区二区 | 91福利在线观看 | 少妇自拍av| 日本99久久 | 操操碰 | 欧美日韩国产二区三区 | 国产一区欧美一区 | 狠狠操天天射 | 日韩欧美在线播放 | 91在线看视频免费 | 亚洲精品乱码久久久久久蜜桃不爽 | 一区二区视频在线免费观看 | 国产高清视频免费观看 | 欧美午夜精品久久久久久浪潮 | 成人av资源网站 | 国产精品久久久久婷婷二区次 | 天天摸天天操天天爽 | 美女视频黄网站 | 亚洲影视九九影院在线观看 | 91九色国产视频 | 91视频在线观看大全 | 天天爽天天做 | 久草免费在线观看 | 国产精品麻豆一区二区三区 | 蜜桃av人人夜夜澡人人爽 | 中文字幕有码在线 | 夜夜躁狠狠躁日日躁视频黑人 | 在线免费高清视频 | 国产高清视频 | 色www免费视频 | 在线国产不卡 | 久久av影视 | 开心色激情网 | 99综合久久 | 91精品啪在线观看国产81旧版 | 日日干视频 | 国产一级视屏 | 日本激情动作片免费看 | 日韩免费不卡av | 西西人体4444www高清视频 | 99久久毛片 | 中文字幕免费高清在线观看 | 午夜影视av | 成人黄色在线视频 | 91视频在线免费看 | 成人啪啪18免费游戏链接 | avwww在线观看| 国产精品免费视频网站 | 精品视频9999 | 在线观看亚洲精品视频 | 91香蕉国产在线观看软件 | 中文字幕在线视频第一页 | 美女精品| 久久综合综合久久综合 | 精品成人久久 | 久久久久久久久久久久久久电影 | 久久99久久精品 | 欧美精品做受xxx性少妇 | 九色自拍视频 | 成人在线小视频 | 97视频在线观看视频免费视频 | 国产精品免费麻豆入口 | 国产精品女主播一区二区三区 | 国产手机在线观看视频 | 日韩一区正在播放 | 日韩欧美精品免费 | 在线免费av播放 | 天天操夜夜想 | 91高清完整版在线观看 | 国产精品久久久久一区二区三区 | 亚洲精品动漫成人3d无尽在线 | 97色婷婷| 免费视频91 | 中文字幕在线播放日韩 | 午夜12点| 日本大尺码专区mv | 午夜视频99 | 韩日精品在线 | 亚洲高清精品在线 | 五月婷社区 | 亚洲九九九在线观看 | 日韩av电影免费在线观看 | 福利视频导航网址 | 96亚洲精品久久久蜜桃 | 欧美成年网站 | 国产aa精品 | 一区二区三区高清 | 国产在线精品观看 | 亚洲精品1234区 | 国产成人精品免高潮在线观看 | 中文字幕五区 | 一区二区三区高清不卡 | 人人艹视频 | 久久电影日韩 | 亚洲人成在线观看 | 欧美aaaxxxx做受视频 | 久久久久久福利 | 精品欧美一区二区在线观看 | 在线视频你懂 | av日韩中文 | 久久国产福利 | 亚洲国产播放 | 四虎国产精品免费观看视频优播 | 日韩a级黄色片 | 国产在线观看不卡 | 免费毛片一区二区三区久久久 | 日韩va亚洲va欧美va久久 | 久草www| 免费亚洲一区二区 | 欧美精品做受xxx性少妇 | 久久视频6 | 四虎影视国产精品免费久久 | 日本天天色 | 国产破处视频在线播放 | 日韩中文字幕第一页 | 91视频在线播放视频 | 久久综合色播五月 | 99久久夜色精品国产亚洲 | 69av在线视频 | 91丨九色丨勾搭 | 国产精品av久久久久久无 | 国产精品一区二区久久精品爱微奶 | 欧美一级小视频 | 精品高清美女精品国产区 | 开心婷婷色 | 中文字幕精品三级久久久 | 日韩黄色中文字幕 | 九九精品久久久 | 国产手机视频在线播放 | 国产免费观看久久黄 | 久久久综合香蕉尹人综合网 | 国产精品亚州 | 性色av香蕉一区二区 | 久久精品视频国产 | 超碰成人网 | 成人免费在线看片 | 久久精品一区二区三 | 久久久久久久综合色一本 | 国产成人a亚洲精品v | 日韩av一区二区在线影视 | 激情五月激情综合网 | 亚洲综合在线五月天 | 国产不卡在线视频 | 亚洲男男gaygayxxxgv | 超碰日韩 | 国产精品美女久久久久久免费 | 欧美大片在线观看一区 | 久久久久久免费视频 | 国产流白浆高潮在线观看 | 97在线观看免费高清完整版在线观看 | 久久a v电影| 久久艹中文字幕 | 午夜精品久久久久久久99婷婷 | 国产精品麻豆免费版 | 香蕉在线观看视频 | 久久人人看 | 久久99亚洲精品久久久久 | 欧洲在线免费视频 | 香蕉视频国产在线观看 | 色综合中文字幕 | 色干干| 色亚洲激情 | 午夜精品久久久久久中宇69 | 2021国产精品视频 | 久久男人影院 | 免费日韩精品 | 国产精品资源 | 免费观看成年人视频 | 免费网址在线播放 | 欧美在线视频一区二区三区 | 亚洲精品动漫在线 | 国产一级片直播 | 国产乱码精品一区二区蜜臀 | 人人干免费| 欧美日韩中文字幕在线视频 | 久久草草影视免费网 | 日韩欧美网址 | 狠狠狠色丁香婷婷综合久久五月 | 99视频精品全国免费 | 99在线观看精品 | 亚洲精品国产精品国自产观看浪潮 | 国产精品婷婷午夜在线观看 | 国产精品3区 | 亚洲国产日韩一区 | 午夜精品久久久久久久久久 | 国产精品自产拍在线观看中文 | 激情五月婷婷综合网 | 超级碰碰免费视频 | 免费av 在线 | 亚洲春色综合另类校园电影 | 狠狠色丁香久久婷婷综 | 丁香九月激情综合 | 午夜av免费看| 国产三级午夜理伦三级 | 国产日韩欧美在线看 | 国产精品久久久久亚洲影视 | 久久天天躁狠狠躁夜夜不卡公司 | 国产精品久久久久久久久久久久午夜片 | 丁香六月五月婷婷 | 国产一区二区视频在线播放 | 成人精品在线 | 99免在线观看免费视频高清 | 麻豆激情电影 | 国产中文字幕三区 | 又黄又刺激又爽的视频 | 国产原创91 | 九九久久久久久久久激情 | 免费在线观看黄色网 | 狠狠色狠狠色综合日日小说 | 欧美另类高潮 | 亚洲人片在线观看 | 黄毛片在线观看 | 婷婷网在线| 婷婷在线精品视频 | 精品国产片 | 久久理论片 | 亚洲精品国产视频 | 日韩精品视频免费专区在线播放 | 中文字幕第一页在线视频 | 人人爱人人添 | 精品久久精品久久 | 国产精品不卡一区 | 日本久久久影视 | 亚洲高清视频在线观看免费 | av丁香| 国产婷婷色 | 狠狠干.com | 黄色午夜网站 | 九九热精品在线 | 久久精品激情 | 深爱婷婷网 | 成人免费在线观看入口 | 毛片基地黄久久久久久天堂 | 天天操天天添 | 久久精品中文字幕一区二区三区 | 五月婷婷在线视频观看 | av成人亚洲 | 国产精品一区二区三区在线播放 | 久久人人爽人人爽人人片av软件 | 天天爱天天射天天干天天 | 韩国一区二区在线观看 | 免费在线91 | 夜夜躁狠狠躁日日躁 | 99久久精品免费一区 | 免费在线黄网 | 亚洲一区二区三区四区精品 | 插久久| 午夜色大片在线观看 | 色婷婷97 | 欧美日韩视频一区二区三区 | 国产视频 久久久 | 久久国产精品99久久人人澡 | 日本性动态图 | 亚洲国产小视频在线观看 | 亚洲综合爱 | 日日夜夜操av | 久久久久国产精品免费免费搜索 | 国产精品久久久久永久免费看 | 6080yy精品一区二区三区 | 精品亚洲成a人在线观看 | 亚洲欧美日韩不卡 | 国产免费资源 | 亚洲精品在线网站 | 在线观看aa | 7777xxxx| 久久久久久免费毛片精品 | 亚洲最大av网 | 麻豆91在线观看 | 欧美日韩免费一区二区 | 韩日成人av| 中文字幕一区二区三区四区 | 成年人在线观看 | 欧美精品乱码久久久久久按摩 | 玖玖在线免费视频 | av在线播放中文字幕 | 青青河边草免费直播 | 麻豆久久久 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 欧美日韩精品影院 | 一二三区高清 | 亚洲日本国产精品 | 亚洲国产高清在线观看视频 | 天天曰天天爽 | 亚洲 中文 在线 精品 | 国产精品免费成人 | 久久在线免费视频 |