整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Dubbo分布式架構搭建教育PC站-后端:用戶模塊,

          Dubbo分布式架構搭建教育PC站-后端:用戶模塊,課程模塊

          戶模塊

          實體類的編寫沒有任何技術含量,而且還浪費時間。

          生成代碼的解決方案有很多種:企業中比較常見的還有 MyBatis 的逆向工程。

          修改 Easy Code 插件的作者名稱:IDEA 的 Settings -> Other Settings -> Easy Code -> 修改新的作者名稱。

          使用 EASY CODE 插件可以快速生成 entity,dao,servicemapper 等文件:

          • IDEA 安裝最新版的 Easy Code 插件來自動生成代碼;
          • 在 IDEA 的 Database --> 選擇 edu 數據庫的 user 表 --> 右鍵 --> EasyCode --> Generate Code;
          • 彈出對話框詢問是否添加數據庫類型 bit(1) 的映射關系,選擇 No;
          • Group 為 Default,Module 為 lagou-edu-service,Template 勾選 entity.java、dao.java、service.java、serviceImpl.java、mapper.xml;
          • 點擊 OK,開始自動生成代碼。
          • 把自動生成的 User 實體類移動到 lagou-edu-eneitysrc/main/java 目錄下,包名為 com.renda.entity。
          • 把自動生成的 UserDao 移動到 lagout-edu-daosrc/main/java 目錄下,包名為 com.renda.mapper;把自動生成的 resources 目錄下的 mapper/UserDao.xml 移動到 lagout-edu-daosrc/main/resources/com/renda 的目錄下。
          • 把 service 目錄下自動生成的文件移動到 lagout-edu-servicecom.renda.user 包下,以形成包名 com.renda.user。
          • 根據報錯修改一下自動生成的代碼,Maven Compile 一下看看是否報錯。

          用戶登錄 / 注冊

          功能描述:用戶輸入手機號、密碼,點擊登錄,調用后端接口開始登錄;如果該手機號未注冊,則自動注冊并登錄。

          功能接口:/user/login

          lagou-edu-entity

          使用 Lombok 小辣椒,使用注解取代原來冗余的 get 和 set、空構造、全參數構造。

          pom.xml

          <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
          <dependency>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
              <version>1.18.12</version>
              <scope>provided</scope>
          </dependency>

          com.renda.entity.User

          把原來的 getter 和 setter 刪除,保留成員變量,然后使用 Lombok 注解來取代:

          @Data // 生成 getter 和 setter
          @AllArgsConstructor // 生成全參數的構造方法
          @NoArgsConstructor // 生成空構造方法
          @ToString // 生成 toString 方法
          public class User implements Serializable {
          
              private static final long serialVersionUID=-48156882162112782L;
              ...   
          }

          用戶數據響應的封裝類 com.renda.entity.UserDTO

          package com.renda.entity;
          
          import lombok.AllArgsConstructor;
          import lombok.Data;
          import lombok.NoArgsConstructor;
          import lombok.ToString;
          ?
          import java.io.Serializable;
          ?
          @Data
          @AllArgsConstructor
          @NoArgsConstructor
          @ToString
          public class UserDTO<User> implements Serializable {
          ?
              private static final long serialVersionUID=1L;
              private int state;  // 操作狀態
              private String message;  // 狀態描述
              private User content;  // 響應內容
          ?
          }

          lagou-edu-dao

          src\main\resources\mybatis\mybatis-config.xml

          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
          <configuration>
              <!-- 后臺的日志輸出:針對開發者-->
              <settings>
                  <setting name="logImpl" value="STDOUT_LOGGING"/>
              </settings>
          </configuration>

          src\main\resources\spring\spring-dao.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:tx="http://www.springframework.org/schema/tx"
                 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/tx
                 http://www.springframework.org/schema/tx/spring-tx.xsd
                 http://www.springframework.org/schema/context
                 http://www.springframework.org/schema/context/spring-context.xsd">
          ?
              <!-- 1.掃描包 -->
              <context:component-scan base-package="com.renda.mapper"/>
          ?
              <!-- 2.數據連接池 -->
              <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
                  <property name="url" value="jdbc:mysql://192.168.186.128:3306/edu?serverTimezone=GMT&useUnicode=true&characterEncoding=UTF-8"/>
                  <property name="username" value="root"/>
                  <property name="password" value="RendaZhang@666"/>
                  <property name="maxActive" value="10"/>
                  <property name="minIdle" value="5"/>
              </bean>
          ?
              <!-- 3.sqlsessionFactory -->
              <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
                  <property name="dataSource" ref="dataSource"/>
                  <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
              </bean>
          ?
              <!-- 4.事務管理器 -->
              <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                  <property name="dataSource" ref="dataSource"/>
              </bean>
          ?
              <!-- 5.開啟事務 -->
              <tx:annotation-driven/>
          ?
              <!-- 整合 MyBatis -->
              <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
                  <property name="basePackage" value="com.renda.mapper"/>
              </bean>
          ?
          </beans>

          刪除掉 UserDao 自動生成的代碼,增加用戶登錄注冊方法:

          @Service
          public interface UserDao {
          ?
              /**
               * 用戶登錄
               *
               * @param phone    手機號
               * @param password 密碼
               * @return 用戶對象
               */
              User login(@Param("phone") String phone, @Param("password") String password);
          ?
              /**
               * 檢查手機號是否注冊過
               *
               * @param phone 手機號
               * @return 0:未注冊 , 1:已注冊
               */
              Integer checkPhone(String phone);
          ?
              /**
               * 用戶注冊
               *
               * @param phone    手機號
               * @param password 密碼
               * @param nickname 昵稱
               * @param headimg  頭像
               * @return 受影響的行數
               */
              Integer register(@Param("phone") String phone, @Param("password") String password,
                               @Param("nickname") String nickname, @Param("headimg") String headimg);
          ?
          }

          保留 resultMapper,刪除掉 UserDao.xml 自動生成的代碼,增加登錄注冊查詢:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
          <mapper namespace="com.renda.mapper.UserDao">
          ?
              <resultMap type="com.renda.entity.User" id="UserMap">
                  <result property="id" column="id" jdbcType="INTEGER"/>
                  <result property="name" column="name" jdbcType="VARCHAR"/>
                  <result property="portrait" column="portrait" jdbcType="VARCHAR"/>
                  <result property="phone" column="phone" jdbcType="VARCHAR"/>
                  <result property="password" column="password" jdbcType="VARCHAR"/>
                  <result property="regIp" column="reg_ip" jdbcType="VARCHAR"/>
                  <result property="accountNonExpired" column="account_non_expired" jdbcType="OTHER"/>
                  <result property="credentialsNonExpired" column="credentials_non_expired" jdbcType="OTHER"/>
                  <result property="accountNonLocked" column="account_non_locked" jdbcType="OTHER"/>
                  <result property="status" column="status" jdbcType="VARCHAR"/>
                  <result property="isDel" column="is_del" jdbcType="OTHER"/>
                  <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
                  <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
              </resultMap>
          ?
              <select id="login" resultMap="UserMap">
                  select * from `user` where phone=#{phone} and password=#{password}
              </select>
          ?
              <select id="checkPhone" resultType="integer">
                  select count(*) from `user` where phone=#{phone}
              </select>
          ?
              <insert id="register">
                  insert  into `user`
                  (`name`,portrait,phone,password,create_time,update_time)
                  values
                  (#{nickname},#{headimg},#{phone},#{password},sysdate(),sysdate())
              </insert>
          ?
          </mapper>

          增加測試類測試登錄注冊方法 src\test\java\user\TestUser.java

          @RunWith(SpringJUnit4ClassRunner.class)
          @ContextConfiguration(locations={"classpath:spring/spring-dao.xml"})
          public class TestUser {
          ?
              @Autowired
              private UserDao userDao;
          ?
              @Test
              public void login(){
                  User user=userDao.login("110", "123");
                  System.out.println("user=" + user);
              }
          ?
              @Test
              public void checkPhone(){
                  Integer i=userDao.checkPhone("110");
                  // 0:未注冊 , 1:已注冊
                  System.out.println("i=" + i);
              }
          ?
              @Test
              public void register(){
                  Integer i=userDao.register("114", "123", "renda", "");
                  // 0:注冊失敗 , 1:注冊成功
                  System.out.println("i=" + i);
              }
          ?
          }

          lagou-edu-service

          src\main\resources\spring\spring-service.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: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://code.alibabatech.com/schema/dubbo
                 http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
          ?
              <!-- 服務提供方在 zookeeper 中的“別名” -->
              <dubbo:application name="lagou-edu-service"/>
          ?
              <!-- 注冊中心的地址 -->
              <dubbo:registry address="zookeeper://192.168.186.128:2181"/>
          ?
              <!-- 掃描類(將什么包下的類作為服務提供類)-->
              <dubbo:annotation package="com.renda"/>
          ?
              <dubbo:provider timeout="60000"/>
          ?
              <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
                  <property name="connectionFactory" ref="connectionFactory"/>
              </bean>
          ?
              <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
                  <property name="hostName" value="192.168.186.128"/>
                  <property name="port" value="6379"/>
              </bean>
          ?
          </beans>

          刪除掉 UserServiceUserServiceImpl 自動生成的代碼,增加用戶登錄注冊方法:

          public interface UserService {
              User login(String phone, String password);
              
              Integer checkPhone(String phone);
          ?
              Integer register(String phone, String password, String nickname, String headimg);
          }
          ?
          @Service // dubbo 暴露服務:讓消費者能夠找到我
          public class UserServiceImpl implements UserService {
          ?
              @Autowired
              private UserDao userDao;
          ?
              @Override
              public User login(String phone, String password) {
                  return userDao.login(phone, password);
              }
          ?
              @Override
              public Integer checkPhone(String phone) {
                  return userDao.checkPhone(phone);
              }
          ?
              @Override
              public Integer register(String phone, String password, String nickname, String headimg) {
                  return userDao.register(phone, password, nickname, headimg);
              }
          ?
          }

          增加測試類測試登錄注冊方法 src\test\java\user\TestUser.java

          @RunWith(SpringJUnit4ClassRunner.class)
          @ContextConfiguration(locations={"classpath*:spring/spring-*.xml"})
          public class TestUser {
          ?
              @Autowired
              private UserService userService;
          ?
              @Test
              public void login(){
                  User user=userService.login("110", "123");
                  System.out.println("user=" + user);
              }
          ?
              @Test
              public void checkPhone() {
                  Integer i=userService.checkPhone("110");
                  System.out.println("i=" + i); //0:未注冊 , 1:已注冊
              }
          ?
          }

          src\main\webapp\WEB-INF\web.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
                   id="WebApp_ID" version="3.1">
              <listener>
                  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
              </listener>
              <context-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath*:spring/spring-*.xml</param-value>
              </context-param>
          </web-app>

          使用 Tomcat 插件 8001 端口:

          ...
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.apache.tomcat.maven</groupId>
                      <artifactId>tomcat7-maven-plugin</artifactId>
                      <configuration>
                          <port>8001</port>
                          <path>/</path>
                      </configuration>
                      <executions>
                          <execution>
                              <!-- 打包完成后,運行服務 -->
                              <phase>package</phase>
                              <goals>
                                  <goal>run</goal>
                              </goals>
                          </execution>
                      </executions>
                  </plugin>
              </plugins>
          </build>
          ...

          使用 Maven 在 lagou-edu-parent 下執行 install 命令在本地安裝部署好需要依賴的 jar 包,然后在 lagou-edu-service 下執行 package 命令啟動服務。

          lagou-edu-web

          創建對應的接口來引用要消費的服務 com.renda.user.UserService(確保包名與提供的服務的包名一致,否則會出現空指針異常):

          public interface UserService {
              User login(String phone, String password);
          ?
              Integer checkPhone(String phone);
          ?
              Integer register(String phone, String password,String nickname,String headimg);
          }

          com.renda.user.controller.UserController

          @RestController
          @RequestMapping("/user")
          public class UserController {
          ?
              @Reference // dubbo 遠程消費
              private UserService userService;
          ?
              @GetMapping("/login")
              public UserDTO login(String phone, String password, String nickname, String heading) {
                  UserDTO userDTO=new UserDTO();
                  User user;
          ?
                  if (nickname==null || nickname.isEmpty()) {
                      nickname=phone;
                  }
          ?
                  System.out.println(phone);
                  System.out.println(password);
                  System.out.println(nickname);
          ?
                  // 檢測手機號是否注冊
                  if (0==userService.checkPhone(phone)) {
                      // 未注冊,先自動注冊,然后登錄
                      userService.register(phone, password, nickname, heading);
                      userDTO.setMessage("手機號沒有被注冊,現已自動注冊");
                      user=userService.login(phone, password);
                  } else {
                      // 已經注冊,直接進行登錄
                      user=userService.login(phone, password);
                      if (user==null) {
                          userDTO.setState(300);
                          userDTO.setMessage("帳號密碼不匹配,登錄失??!");
                      } else {
                          userDTO.setState(200);
                          userDTO.setMessage("登錄成功!");
                      }
                  }
          ?
                  userDTO.setContent(user);
                  return userDTO;
              }
          ?
          }

          src\main\webapp\index.jsp

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <html>
          <head>
              <title>登錄</title>
          </head>
          <body>
          <form action="${pageContext.request.contextPath}/user/login">
              <p><input type="text" placeholder="請輸入手機號..." name="phone"></p>
              <p><input type="text" placeholder="請輸入密碼..." name="password"></p>
              <p>
                  <button>登錄</button>
              </p>
          </form>
          </body>
          </html>

          使用 Tomcat 插件 8002 端口:

          ...
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.apache.tomcat.maven</groupId>
                      <artifactId>tomcat7-maven-plugin</artifactId>
                      <configuration>
                          <port>8002</port>
                          <path>/</path>
                      </configuration>
                      <executions>
                          <execution>
                              <!-- 打包完成后,運行服務 -->
                              <phase>package</phase>
                              <goals>
                                  <goal>run</goal>
                              </goals>
                          </execution>
                      </executions>
                  </plugin>
              </plugins>
          </build>
          ...

          啟動 dubbo-admin 來監控消費者和提供者的狀態。

          使用 Maven 在 lagou-edu-web 下執行 package 命令啟動消費者;同時確保服務提供者也啟動完畢。

          瀏覽器訪問:http://localhost:8002/,輸入已有的用戶名和密碼測試登錄功能,輸入新的用戶名和密碼測試注冊功能,控制臺和網頁查看輸出結果。


          課程模塊

          course 課程

          teacher 老師

          activity_course 課程活動

          course_section 章節

          course_lesson 課時

          course_media 課節視頻

          一個 course 對一個 teacher

          一個 course 對一個 activity_course

          一個 course 對多個 course_section

          一個 course_section 對多個 course_lesson

          一個 course_lesson 對多個 course_media

          全部課程

          功能描述:用戶在未登錄狀態,獲取所有上架的課程,課程順序為 - 配置活動信息標簽的優先顯示,再根據課程顯示序列號順序顯示;序列號相同按照創建時間倒序顯示,課程都是未購買狀態。

          功能接口:/course/getAllCourse

          lagou-edu-entity

          使用 Easy Code 快速生成對應的實體類,再使用 Lombok 注解取代原來冗余的 get 和 set、空構造、全參數構造。

          com.renda.entity.Course

          @Data
          @AllArgsConstructor
          @NoArgsConstructor
          @ToString
          public class Course implements Serializable {
          ?
              private static final long serialVersionUID=337303050449398216L;
          ?
              // 一門課程對應一個講師
              private Teacher teacher;
              //一門課程對應多個章節
              private List<CourseSection> courseSections;
              // 一門課對一個活動
              private ActivityCourse activityCourse;
          ?
              ...
          }

          com.renda.entity.Teacher

          @Data
          @AllArgsConstructor
          @NoArgsConstructor
          @ToString
          public class Teacher implements Serializable {
              private static final long serialVersionUID=-97051504830274283L;
          ?
              ...
          }

          com.renda.entity.ActivityCourse

          @Data
          @AllArgsConstructor
          @NoArgsConstructor
          @ToString
          public class ActivityCourse implements Serializable {
              private static final long serialVersionUID=576079752103902168L;
          ?
              ...   
          }

          com.renda.entity.CourseSection

          @Data
          @AllArgsConstructor
          @NoArgsConstructor
          @ToString
          public class CourseSection implements Serializable {
              private static final long serialVersionUID=-40082782487572703L;
          ?
              // 一章對應多個小節
              private List<CourseLesson> courseLessons;
          ?
              ...
          }

          com.renda.entity.CourseLesson

          @Data
          @AllArgsConstructor
          @NoArgsConstructor
          @ToString
          public class CourseLesson implements Serializable {
              private static final long serialVersionUID=-29342440566142798L;
          ?
              // 一小節課對應一個視頻
              private CourseMedia courseMedia;
          ?
              ...
          }

          com.renda.entity.CourseMedia

          @Data
          @AllArgsConstructor
          @NoArgsConstructor
          @ToString
          public class CourseMedia implements Serializable {
              private static final long serialVersionUID=-93086504227451781L;
          ?
              ...
          }

          lagou-edu-dao

          使用 Easy Code 快速生成 Course 的 mapper 文件,然后進行修改。

          src\main\resources\com\renda\mapper\CourseDao.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
          <mapper namespace="com.renda.mapper.CourseDao">
          ?
              <resultMap type="com.renda.entity.Course" id="CourseMap">
                  <result property="id" column="c_id" jdbcType="OTHER"/>
                  <result property="courseName" column="course_name" jdbcType="VARCHAR"/>
                  <result property="brief" column="brief" jdbcType="VARCHAR"/>
                  <result property="price" column="price" jdbcType="OTHER"/>
                  <result property="priceTag" column="price_tag" jdbcType="VARCHAR"/>
                  <result property="discounts" column="discounts" jdbcType="OTHER"/>
                  <result property="discountsTag" column="discounts_tag" jdbcType="VARCHAR"/>
                  <result property="courseDescriptionMarkDown" column="course_description_mark_down" jdbcType="OTHER"/>
                  <result property="courseDescription" column="course_description" jdbcType="OTHER"/>
                  <result property="courseImgUrl" column="course_img_url" jdbcType="VARCHAR"/>
                  <result property="isNew" column="is_new" jdbcType="OTHER"/>
                  <result property="isNewDes" column="is_new_des" jdbcType="VARCHAR"/>
                  <result property="lastOperatorId" column="last_operator_id" jdbcType="INTEGER"/>
                  <result property="autoOnlineTime" column="auto_online_time" jdbcType="TIMESTAMP"/>
                  <result property="createTime" column="c_create_time" jdbcType="TIMESTAMP"/>
                  <result property="updateTime" column="c_update_time" jdbcType="TIMESTAMP"/>
                  <result property="isDel" column="c_is_del" jdbcType="OTHER"/>
                  <result property="totalDuration" column="total_duration" jdbcType="INTEGER"/>
                  <result property="courseListImg" column="course_list_img" jdbcType="VARCHAR"/>
                  <result property="status" column="c_status" jdbcType="INTEGER"/>
                  <result property="sortNum" column="sort_num" jdbcType="INTEGER"/>
                  <result property="previewFirstField" column="preview_first_field" jdbcType="VARCHAR"/>
                  <result property="previewSecondField" column="preview_second_field" jdbcType="VARCHAR"/>
                  <result property="sales" column="sales" jdbcType="INTEGER"/>
                  <!-- 一個老師 -->
                  <association property="teacher" javaType="com.renda.entity.Teacher">
                      <result property="id" column="t_id" jdbcType="OTHER"/>
                      <result property="courseId" column="t_course_id" jdbcType="INTEGER"/>
                      <result property="teacherName" column="teacher_name" jdbcType="VARCHAR"/>
                      <result property="position" column="position" jdbcType="VARCHAR"/>
                      <result property="description" column="t_description" jdbcType="VARCHAR"/>
                      <result property="createTime" column="t_create_time" jdbcType="TIMESTAMP"/>
                      <result property="updateTime" column="t_update_time" jdbcType="TIMESTAMP"/>
                      <result property="isDel" column="t_is_del" jdbcType="OTHER"/>
                  </association>
                  <!-- 一個活動課程 -->
                  <association property="activityCourse" javaType="com.renda.entity.ActivityCourse">
                      <result property="id" column="ac_id" jdbcType="INTEGER"/>
                      <result property="courseId" column="ac_course_id" jdbcType="INTEGER"/>
                      <result property="beginTime" column="begin_time" jdbcType="TIMESTAMP"/>
                      <result property="endTime" column="end_time" jdbcType="TIMESTAMP"/>
                      <result property="amount" column="amount" jdbcType="OTHER"/>
                      <result property="stock" column="stock" jdbcType="INTEGER"/>
                      <result property="status" column="ac_status" jdbcType="OTHER"/>
                      <result property="isDel" column="ac_is_del" jdbcType="OTHER"/>
                      <result property="remark" column="remark" jdbcType="VARCHAR"/>
                      <result property="createTime" column="ac_create_time" jdbcType="TIMESTAMP"/>
                      <result property="createUser" column="create_user" jdbcType="VARCHAR"/>
                      <result property="updateTime" column="ac_update_time" jdbcType="TIMESTAMP"/>
                      <result property="updateUser" column="update_user" jdbcType="VARCHAR"/>
                  </association>
                  <!-- 多個章節 -->
                  <collection property="courseSections" ofType="com.renda.entity.CourseSection">
                      <result property="id" column="cs_id" jdbcType="OTHER"/>
                      <result property="courseId" column="cs_course_id" jdbcType="INTEGER"/>
                      <result property="sectionName" column="section_name" jdbcType="VARCHAR"/>
                      <result property="description" column="cs_description" jdbcType="VARCHAR"/>
                      <result property="createTime" column="cs_create_time" jdbcType="TIMESTAMP"/>
                      <result property="updateTime" column="cs_update_time" jdbcType="TIMESTAMP"/>
                      <result property="isDe" column="is_de" jdbcType="OTHER"/>
                      <result property="orderNum" column="cs_order_num" jdbcType="INTEGER"/>
                      <result property="status" column="cs_status" jdbcType="INTEGER"/>
                      <!-- 多個小節 -->
                      <collection property="courseLessons" ofType="com.renda.entity.CourseLesson">
                          <result property="id" column="cl_id" jdbcType="OTHER"/>
                          <result property="courseId" column="cl_course_id" jdbcType="INTEGER"/>
                          <result property="sectionId" column="cl_section_id" jdbcType="INTEGER"/>
                          <result property="theme" column="theme" jdbcType="VARCHAR"/>
                          <result property="duration" column="cl_duration" jdbcType="INTEGER"/>
                          <result property="isFree" column="is_free" jdbcType="OTHER"/>
                          <result property="createTime" column="cl_create_time" jdbcType="TIMESTAMP"/>
                          <result property="updateTime" column="cl_update_time" jdbcType="TIMESTAMP"/>
                          <result property="isDel" column="cl_is_del" jdbcType="OTHER"/>
                          <result property="orderNum" column="cl_order_num" jdbcType="INTEGER"/>
                          <result property="status" column="cl_status" jdbcType="INTEGER"/>
                          <!-- 一個小節視頻 -->
                          <association property="courseMedia" javaType="com.renda.entity.CourseMedia">
                              <result property="id" column="cm_id" jdbcType="INTEGER"/>
                              <result property="courseId" column="cm_course_id" jdbcType="INTEGER"/>
                              <result property="sectionId" column="cm_section_id" jdbcType="INTEGER"/>
                              <result property="lessonId" column="cm_lesson_id" jdbcType="INTEGER"/>
                              <result property="coverImageUrl" column="cover_image_url" jdbcType="VARCHAR"/>
                              <result property="duration" column="cm_duration" jdbcType="VARCHAR"/>
                              <result property="fileEdk" column="file_edk" jdbcType="VARCHAR"/>
                              <result property="fileSize" column="file_size" jdbcType="OTHER"/>
                              <result property="fileName" column="file_name" jdbcType="VARCHAR"/>
                              <result property="fileDk" column="file_dk" jdbcType="VARCHAR"/>
                              <result property="createTime" column="cm_create_time" jdbcType="TIMESTAMP"/>
                              <result property="updateTime" column="cm_update_time" jdbcType="TIMESTAMP"/>
                              <result property="isDel" column="cm_is_del" jdbcType="OTHER"/>
                              <result property="durationNum" column="duration_num" jdbcType="INTEGER"/>
                              <result property="fileId" column="file_id" jdbcType="VARCHAR"/>
                          </association>
                      </collection>
                  </collection>
              </resultMap>
          ?
              <sql id="courseInfo">
              select
                  c.id c_id,`course_name`,`brief`,`price`,`price_tag`,`discounts`,`discounts_tag`,`course_description_mark_down`,
                  `course_description`,`course_img_url`,`is_new`,`is_new_des`,`last_operator_id`,`auto_online_time`,
                  c.create_time c_create_time,c.update_time c_update_time,c.is_del c_is_del,`total_duration`,`course_list_img`,
                  c.status c_status,`sort_num`,`preview_first_field`,`preview_second_field`,`sales`,
                  t.id t_id, t.course_id t_course_id,`teacher_name`,`position`,t.description t_description,t.create_time t_create_time,
                  t.update_time t_update_time,t.is_del t_is_del,
                  cs.id cs_id, cs.course_id cs_course_id,`section_name`, cs.description cs_description,cs.create_time cs_create_time,
                  cs.update_time cs_update_time,`is_de`,cs.order_num cs_order_num ,cs.status cs_status,
                  cl.id cl_id,cl.course_id cl_course_id,cl.section_id cl_section_id, `theme`,cl.duration cl_duration,`is_free`,
                  cl.create_time cl_create_time,cl.update_time cl_update_time, cl.is_del cl_is_del,cl.order_num cl_order_num,
                  cl.status cl_status,
                  cm.id cm_id,cm.course_id cm_course_id, cm.section_id cm_section_id ,cm.lesson_id cm_lesson_id,`cover_image_url`,
                  cm.duration cm_duration,`file_edk`, `file_size`,`file_name`,`file_dk`,cm.create_time cm_create_time,
                  cm.update_time cm_update_time,cm.is_del cm_is_del, `duration_num`,`file_id`, `begin_time`,`end_time`,`amount`,`stock`,
                  ac.status ac_status,ac.is_del ac_is_del,`remark`,ac.create_time ac_create_time,`create_user`,ac.update_time ac_update_time,`update_user`
              from activity_course ac right join course c on c.id=ac.course_id
                                      inner join teacher t on c.id=t.course_id
                                      inner join course_section cs on c.id=cs.course_id
                                      inner join course_lesson cl on cl.section_id=cs.id
                                      left join course_media cm on cm.lesson_id=cl.id
              </sql>
          ?
              <select id="getAllCourse" resultMap="CourseMap">
                  <include refid="courseInfo"/>
                  order by amount desc, c_id, ac_create_time desc
              </select>
          ?
          </mapper>

          com.renda.mapper.CourseDao

          public interface CourseDao {
              /**
               * 查詢全部課程信息
               */
              List<Course> getAllCourse();
          }

          src\test\java\course\TestCourse.java

          @RunWith(SpringJUnit4ClassRunner.class)
          @ContextConfiguration(locations={"classpath:spring/spring-dao.xml"})
          public class TestCourse {
          ?
              @Autowired
              private CourseDao courseDao;
          ?
              @Test
              public void getAllCourse() {
                  List<Course> list=courseDao.getAllCourse();
                  for (Course course : list) {
                      String flag=course.getActivityCourse() !=null ? "【火爆活動中】" : "";
                      System.out.println("課程:" + flag + course.getId() + "->" + course.getCourseName());
                      for (CourseSection cs : course.getCourseSections()) {
                          System.out.println("\t\t章節" + cs.getId() + "--->" + cs.getSectionName());
                          for (CourseLesson cl : cs.getCourseLessons()) {
                              if (cl.getCourseMedia() !=null) {
                                  System.out.println("\t\t\t小節" + cl.getId() + "--->" + cl.getTheme()
                                          + ",視頻:" + cl.getCourseMedia().getFileId() + ",時長:【"
                                          + cl.getCourseMedia().getDuration() + "】");
                              } else {
                                  System.out.println("\t\t\t小節" + cl.getId() + "--->" + cl.getTheme()
                                          + ",視頻:【待上傳】,時長:【00:00】");
                              }
                          }
                      }
                  }
              }
          ?
          }

          lagou-edu-service

          com.renda.course.CourseService

          public interface CourseService {
              /**
               * 查詢全部課程信息
               */
              List<Course> getAllCourse();
          }

          com.renda.course.impl.CourseServiceImpl

          @Service
          public class CourseServiceImpl implements CourseService {
              @Autowired
              private CourseDao courseDao;
          ?
              @Override
              public List<Course> getAllCourse() {
                  return courseDao.getAllCourse();
              }
          }

          lagou-edu-web

          com.renda.course.CourseService

          public interface CourseService {
              List<Course> getAllCourse();
          }

          com.renda.course.controller.CourseController

          @RestController
          @RequestMapping("/course")
          public class CourseController {
              // 遠程消費
              @Reference
              private CourseService courseService;
          ?
              @GetMapping("/getAllCourse")
              public List<Course> getAllCourse() {
                  return courseService.getAllCourse();
              }
          }

          瀏覽器訪問:http://localhost:8002/course/getAllCourse

          已購課程

          功能描述:1、用戶未登錄則顯示為空;2、用戶登錄,通過用戶 ID 調用服務獲取已購課程。

          功能接口:/course/getCourseByUserId/{userid}

          lagou-edu-dao

          src\main\resources\com\renda\mapper\CourseDao.xml

          ...
          <select id="getCourseByUserId" resultMap="CourseMap">
              <include refid="courseInfo"/>
              where c.id in
              (select course_id from user_course_order where status=20 and is_del=0 and user_id=#{userId})
              order by amount desc, c_id, ac_create_time desc
          </select>
          ...

          com.renda.mapper.CourseDao

          public interface CourseDao {
              ...
          ?
              /**
               * 查詢已登錄用戶購買的全部課程信息
               * @return
               */
              List<Course> getCourseByUserId(@Param("userId") String userId);
          }

          src\test\java\course\TestCourse.java

          ...
          @Test
          public void getCoursesByUserid() {
              List<Course> list=courseDao.getCourseByUserId("100030018");
              for (Course course : list) {
                  String flag=course.getActivityCourse() !=null ? "【火爆活動中】" : "";
                  System.out.println("課程:" + flag + course.getId() + "->" + course.getCourseName());
                  for (CourseSection cs : course.getCourseSections()) {
                      System.out.println("\t\t章節" + cs.getId() + "--->" + cs.getSectionName());
                      for (CourseLesson cl : cs.getCourseLessons()) {
                          if (cl.getCourseMedia() !=null) {
                              System.out.println("\t\t\t小節" + cl.getId() + "--->" + cl.getTheme()
                                                 + ",視頻:" + cl.getCourseMedia().getFileId()
                                                 + ",時長:【" + cl.getCourseMedia().getDuration() + "】");
                          } else {
                              System.out.println("\t\t\t小節" + cl.getId() + "--->" + cl.getTheme()
                                                 + ",視頻:【待上傳】,時長:【00:00】");
                          }
                      }
                  }
              }
          }
          ...

          lagou-edu-service

          com.renda.course.CourseService

          public interface CourseService {
              ...
              List<Course> getCourseByUserId(String userId);
          }

          com.renda.course.impl.CourseServiceImpl

          @Service
          public class CourseServiceImpl implements CourseService {
              ...
              @Override
              public List<Course> getCourseByUserId(String userId) {
                  return courseDao.getCourseByUserId(userId);
              }
          }

          lagou-edu-web

          com.renda.course.CourseService

          public interface CourseService {
              ...
              List<Course> getCourseByUserId(String userId);
          }

          com.renda.course.controller.CourseController

          @RestController
          @RequestMapping("/course")
          public class CourseController {
              ...
          ?
              @GetMapping("getCourseByUserId/{userid}")
              public List<Course> getCourseByUserId(@PathVariable("userid") String userid) {
                  return courseService.getCourseByUserId(userid);
              }
          }

          瀏覽器訪問:http://localhost:8002/course/getCourseByUserId/100030018

          課程詳情

          功能描述:

          1、用戶如果沒有登錄,通過課程 ID 獲取課程的詳細信息中會顯示“立即購買”按鈕。點擊夠買按鈕會顯示登錄。同時會展示課程目錄,課程信息和老師信息。注意課程信息是展示字段course_description 中的信息。

          2、用戶登錄后,我們通過課程Id獲取課程信息后,會通過用戶 ID 和課程 ID 調用訂單服務來獲取來判斷用戶是否購買,如果夠買則顯示“立即學習”,否則顯示“立即夠買”,同時會展示課程目錄,課程信息和老師信息。注意課程信息是展示字段 course_description 中的信息。

          功能接口:/course/getCourseById/{courseid}

          lagou-edu-dao

          src\main\resources\com\renda\mapper\CourseDao.xml

          ...
          <select id="getCourseById" resultMap="CourseMap">
              <include refid="courseInfo"/>
              where c.id=#{courseid}
          </select>
          ...

          com.renda.mapper.CourseDao

          public interface CourseDao {
              ...
          ?
              /**
               * 查詢某門課程的詳細信息
               *
               * @param courseid 課程編號
               */
              Course getCourseById(@Param("courseid") Integer courseid);
          }

          src\test\java\course\TestCourse.java

          ...
          @Test
          public void getCourseById() {
              Course course=courseDao.getCourseById(7);
              String flag=course.getActivityCourse() !=null ? "【火爆活動中】" : "";
              System.out.println("課程:" + flag + course.getId() + "->" + course.getCourseName());
              for (CourseSection cs : course.getCourseSections()) {
                  System.out.println("\t\t章節" + cs.getId() + "--->" + cs.getSectionName());
                  for (CourseLesson cl : cs.getCourseLessons()) {
                      if (cl.getCourseMedia() !=null) {
                          System.out.println("\t\t\t小節" + cl.getId() + "--->" + cl.getTheme()
                                             + ",視頻:" + cl.getCourseMedia().getFileId()
                                             + ",時長:【" + cl.getCourseMedia().getDuration() + "】");
                      } else {
                          System.out.println("\t\t\t小節" + cl.getId() + "--->" + cl.getTheme()
                                             + ",視頻:【待上傳】,時長:【00:00】");
                      }
                  }
              }
          }
          ...

          lagou-edu-service

          com.renda.course.CourseService

          public interface CourseService {
              ...
              Course getCourseById(Integer courseid);
          }

          com.renda.course.impl.CourseServiceImpl

          @Service
          public class CourseServiceImpl implements CourseService {
              ...
              @Override
              public Course getCourseById(Integer courseid) {
                  return courseDao.getCourseById(courseid);
              }
          }

          lagou-edu-web

          com.renda.course.CourseService

          public interface CourseService {
              ...
              Course getCourseById(Integer courseid);
          }

          com.renda.course.controller.CourseController

          @RestController
          @RequestMapping("/course")
          public class CourseController {
              ...
              @GetMapping("getCourseById/{courseid}")
              public Course getCourseById(@PathVariable("courseid") Integer courseid) {
                  return courseService.getCourseById(courseid);
              }
          }

          瀏覽器訪問:http://localhost:8002/course/getCourseById/7

          課程播放

          功能描述:

          前端通過課時 ID 調用接口
          1、獲取課程阿里的 fileId,然后通過 fileId 調用接口
          2、獲取視頻播放的 playAuth,前端會通過 playAuth 調用阿里的播放器,阿里會回調接口
          3、通過阿里的回調來判斷是否是合法用戶,用戶是否購買課程,這樣可以防止播放鏈接被盜后也不能被播放,確保課程版權的安全。

          功能接口:

          1、通過課時ID獲取媒體信息 /front/course/media/getByLessonId 2、獲取阿里播放 key /front/course/media/alikey 3、獲取阿里播放 key (用于阿里的回調) /front/course/media/alikey

          想了解更多,歡迎關注我的微信公眾號:Renda_Zhang

          置學歷是指在辦理自考本科畢業手續前,考生所持有的國民教育序列的??疲ɑ蛞陨希┑膶W歷。 申請自考本科專業畢業的考生,須在上半年5月20日前、下半年11月20日前,登錄廣東省自學考試管理系統(以下稱“系統”,網址:http://www.stegd.edu.cn/selfec/),提交前置學歷信息及學歷認證信息。如何填寫?快收好這份前置學歷填寫指南吧!

          1

          第一種類型:《教育部學歷證書電子注冊備案表》

          填寫具體步驟:

          1.登陸學信網https://my.chsi.com.cn/archive/index.jsp、

          2.請先注冊學信網賬號



          若已注冊,請直接選擇登錄



          3. 登錄后,點擊“申請”



          4.點擊頁面右邊的“查看”



          5.點擊“申請中文版”,若已申請,請略過第五和第六步驟。



          6.報告有效期設置為2個月(或以上),然后點擊“申請”。



          7.點擊“查看”。



          8. 登錄廣東省自學考試管理系統

          (網址:http://www.stegd.edu.cn/selfec/login/login.jsp ),點擊系統左邊欄“考籍管理”的“前置學歷信息管理”。

          注:若出現系統無法登錄或信息無法提交等問題,可嘗試使用QQ瀏覽器,或者將電腦瀏覽器改成ie兼容模式和急速模式,或者使用手機登錄。



          9.點擊“新增”,若需修改,請點擊“修改”。

          10. 根據《教育部學歷證書電子注冊備案表》的相關內容,在系統上填寫對應信息。



          注意事項:

          (1) 前置學歷姓名:請填寫備案表上的姓名,若備案表上的姓名為曾用名,請將顯示曾用名的戶口本或公安局出具的證明和畢業申請的材料一起上交;

          (2) 證件類型:請選擇前置學歷畢業時所用的證件,并填寫證件號;

          (3) 畢業證號數字之間請勿添加空格;

          (4) 前置學歷專業名稱請與備案表上的專業名稱保持一致,標點符號請使用半角符號。例: 工程造價(造價管理),請勿簡寫成工程造價。

          (5) 畢業時間格式為:201706;

          (6) 前置學歷層次請按備案表上的填寫;

          (7) 認證類型:請選擇“《教育部學歷證書電子注冊備案表》在線驗證碼”;



          (8) 在線驗證碼的數字之間請勿添加空格;

          (9) 本科結業,亦可用于申請前置學歷。

          2

          第二種類型:《中國高等教育學歷認證報告》

          選擇此方式填寫的考生,可向廣東省學歷認證中心咨詢辦理。(聯系電話:020-37626800)

          取得《中國高等教育學歷認證報告》后,即可登錄系統填寫。

          登錄系統方式,可參照第一種類型的第8點和第9點。

          《中國高等教育學歷認證報告》格式多樣,以下僅舉兩例,請參照填寫。

          范例一:



          范例二:



          注意事項:

          (1) 前置學歷姓名:請填寫認證報告上的姓名,若認證報告上的姓名為曾用名,請將顯示曾用名的戶口本或公安局出具的證明和畢業申請的材料一起上交;

          (2) 證件類型:請選擇前置學歷畢業時所用的證件,并填寫證件號;

          (3) 畢業證號數字之間請勿添加空格;

          (4) 畢業證號必須與報告顯示的證書編號一致,若報告顯示的證書編號含文字,填寫時也請保留文字;

          (5) 前置學歷專業名稱的內容請與認證報告上的專業名稱保持一致,標點符號請使用半角符號。例: 工程造價(造價管理),請勿簡寫成工程造價;

          (6) 畢業時間格式為:201706;

          (7) 前置學歷層次請按認證報告上的填寫;

          (8) 認證類型:請選擇“《中國高等教育學歷認證報告》報告編號”;



          (9) 認證報告編號為7位純數字;

          (10) 本科結業,亦可用于申請前置學歷;

          (11)廣東省教育廳出具的《學歷證書鑒定證明》。持此類報告的考生,請選擇在學信網申請《教育部學歷證書電子注冊備案表》或重新辦理《中國高等教育學歷認證報告》。

          3

          第三種類型:《國外學位學歷認證書》

          持有國外學歷的考生,請登錄教育部留學服務中心網站

          (網址:http://renzheng.cscse.edu.cn/Login.aspx)申請國(境)外學歷學位認證書。

          取得《國外學位學歷認證書》后,即可登錄系統填寫。

          登錄系統方式,可參照第一種類型的第8點和第9點。

          根據《國外學位學歷認證書》的相關內容,在系統上填寫對應信息。

          因認證書格式眾多,以下僅為示例:



          注意事項:

          (1) 前置學歷姓名:請填寫認證書上的姓名,若認證書上的姓名為曾用名,請將顯示曾用名的戶口本或公安局出具的證明和畢業申請的材料一起上交;

          (2) 證件類型:請選擇前置學歷畢業時所用的證件,并填寫證件號;

          (3) 前置學歷畢業證號可為空;

          (4) 前置學歷專業名稱的內容請與認證書上的專業名稱保持一致,標點符號請使用半角符號。例: 工程造價(造價管理),請勿簡寫成工程造價;

          (5) 畢業時間格式為:201706;

          (6) 認證類型:請選擇“《國外學位學歷認證書》認證書編號”;



          (7) 國外學歷證書編號的填寫格式為:教留服認XX[XXXX]…號。請填寫完整。

          4

          第四種類型:自考??萍氨究仆瑫r申請畢業(即專本同辦)

          專本同辦:同時申請辦理廣東省自考??坪捅究飘厴I的考生。

          此類考生填寫前置學歷時,請使用辦理本科畢業的準考證號登錄系統,按照系統指引正確填寫??葡嚓P信息。



          注意事項:

          (1)畢業證號為空;

          (2)專業名稱填寫正確示例:行政管理;錯誤示例:A030301行政管理;

          (3)畢業時間填寫示例:201812;

          (4)認證類型:請選擇“自考??萍氨究仆瑫r申請畢業”;



          (5)??茰士甲C號:請填寫廣東自考的12位準考證號;

          (6)填寫專本同辦的前置學歷類型時,請確保??茰士甲C下的成績已符合畢業條件。

          2

          第五種類型:普通全日制高校應屆畢業生

          在登記前置學歷信息時尚未取得前置學歷畢業證的普通全日制高校畢業生,須選擇“普通高校應屆畢業生”類型。

          考生若選擇此類型,無需向省考辦提供學校出具的在讀專業及預計畢業時間的紙質證明。

          注意:此類考生取得前置學歷畢業證后,須于7月5日前登錄自考管理系統補填前置學歷認證信息。認證申請及填寫方法,請參考第一、第二種類型。未按時補填的,視為放棄本次畢業申請。



          注意事項:

          (1) 畢業證號可為空;

          (2) 專業名稱:請勿添加某系某班字樣,直接填寫專業名稱;

          (3) 前置學歷畢業時間不能晚于本科畢業時間(上半年6月30日),否則不能申請本科畢業;

          (4) 前置學歷類型為“非自考”;

          (5) 認證類型:請選擇“普通高校應屆畢業生,未取得畢業證”。

          來源:粵考研究所talk自考。轉載請聯系皮皮。

          海縣教育局關于2020年春季學期延遲開學的公告

            為貫徹落實省教育廳《關于啟動江蘇省教育系統突發公共衛生事件一級響應的緊急通知》和市、縣人民政府關于實施新型冠狀病毒感染的肺炎疫情一級響應措施的通告要求,接市教育局通知,我縣中小學、幼兒園春季學期開學時間由原定的2月10日暫延至2月17日,如有變化,另行通知。

            在延遲春季學期開學期間,各中小學、幼兒園要在引導學生不離家、不返校的同時,充分利用市“云海在線”、省“名師空中課堂”等平臺,有效指導學生在家在線學習。

           ?。ㄒ唬┻B云港市智慧教育云服務平臺——“云海在線”登錄方式:云海在線提供web版和手機客戶端兩種登錄。

            電腦端登錄:打開瀏覽器(建議使用谷歌或者火狐瀏覽器),在地址欄中輸入網址:http://ren.lyge.cn,進入系統首頁,點擊首頁右上角“登錄”按鈕進入登錄界面,在登錄界面中輸入賬號(手機號,身份證號)和密碼,再點擊“登錄”即可。

            手機端登錄:可以在應用市場下載“云海在線”手機APP或用手機瀏覽器的“掃一掃”功能,按照手機類別,掃描下方二維碼,下載云海在線手機App,下載安裝好App后,點擊運行,進入登錄界面,在登錄界面輸入云海在線的賬號和密碼,即可登錄。

            學習內容:1、完成學校布置的寒假作業;2、選讀學校推薦的課外名著等;3、利用“云海在線”的“微課中心”模塊觀看微課,完成任務單布置的學習任務。所有應用和服務均是免費公益性的。4、2月10日起,學生通過線上學習新學期預授課程,完成“任務單”學習任務。技術支持:朱老師,電話13675223895。

            (二)江蘇省名師空中課堂登錄方式:學生、家長可以通過手機端、電腦端登錄省名師空中課堂學習及在線提問。

            電腦端登錄:用注冊的手機號登錄。https://mskzkt.jse.edu.cn進行在線學習和在線提問。

            手機端登錄:手機掃描如下二維碼,注冊登錄進行在線學習以及在線提問。(注冊需要用學籍號,

          請登錄https://xjgl.jse.edu.cn/studman2/cidGetInfo.jsp)

            學習內容:利用“名師空中課堂”視頻資源進行線上學習。可進行在線提問,名師在線即時答疑。技術支持:鄭老師,電話13705136801。

            (三)各學校利用自有網絡平臺提供線上服務。各校要提前制定好學生假期課業輔導工作應急預案,要求教師通過電話、微信等網絡等平臺開展線上咨詢和輔導,指導學生在家自主學習,科學布置假期作業。同時要全面禁止有償、友情家教等集體性線下活動行為發生。

            處在湖北等疫情重點防控地區的師生員工等待通知返校。

          東??h教育局

          2020年1月27日


          主站蜘蛛池模板: 亚洲国产一区二区三区青草影视| 久久99精品波多结衣一区| 亚洲国产精品无码久久一区二区| 国产成人午夜精品一区二区三区| 成人免费一区二区无码视频| 久久99国产精品一区二区| 欧洲亚洲综合一区二区三区| 久久久一区二区三区| 亚洲片一区二区三区| 亚洲国产福利精品一区二区 | 亚洲AV无码一区二区三区牛牛| 亚洲福利精品一区二区三区| 中文无码一区二区不卡αv| 国产亚洲一区区二区在线 | 夜色福利一区二区三区| 欧洲精品码一区二区三区| 精品无码国产AV一区二区三区| 国产精品一区在线观看你懂的| 日韩爆乳一区二区无码| 黄桃AV无码免费一区二区三区| 伊人久久精品一区二区三区| 国产在线视频一区| 北岛玲在线一区二区| 亚洲一区二区三区免费视频| 国产内射999视频一区| 无码精品人妻一区| 精品一区二区三区无码视频| 精品国产一区二区三区香蕉事| 亚洲国产日韩在线一区| 久久精品一区二区| 日韩免费观看一区| 国产99视频精品一区| 亚洲综合一区二区精品久久| 人妻少妇精品视频一区二区三区| 无码一区二区三区免费| 午夜无码视频一区二区三区| 久久久精品人妻一区二区三区 | 久久久久一区二区三区| 3d动漫精品一区视频在线观看| 久久无码人妻精品一区二区三区 | 亚洲国产精品一区二区第四页|