当前位置:   article > 正文

基于ssm框架的对员工基本信息及部门信息的增删改查_ssm框架实现雇员信息的增删查改

ssm框架实现雇员信息的增删查改

使用SSM框架完成对员工基本信息及部门信息的增删改查功能

配置文件和目录结构以及数据库的设计部分:

本文主要用来记录自己在学习SSM框架并用该框架实现简单的增删改查的功能的基本步骤以及遇到的一些错误的总结。

  1. 工具:Idea+jdk-9.0.4+tomcat 9.0+mysql
  2. 涉及基础框架:Spring+SpringMVC+Mybatis
  3. 管理:使用Maven作为项目的依赖管理
  4. 使用Mybatis Genertor逆向工程得到对应的POJO以及mapper文件
  5. 前端样式:使用Bootstrap框架搭建简洁美观的页面
  6. 分页:采用PageHelper
  7. 数据校验:采用jquery前端校验+JSR303后端校验
  8. 使用ajax实现页面和web服务器之间数据的异步传输。

1.使用Idea创建Maven项目

创建时应选择正确的类型
创建时应选择红框中的类型,若选择黑框中的类型可能出现错误。
在这里插入图片描述
archetypeCatalog表示插件使用的archetype元数据,不加这个参数时默认为remote,local,即中央仓库archetype元数据,由于中央仓库的archetype太多了,所以导致很慢,指定internal来表示仅使用内部元数据,这里类似手动下载而不用访问外网下载可以加快下载速度。(详情可参考博客:https://www.cnblogs.com/hihtml5/p/6305804.html)

2.添加项目中需要用到的依赖

修改项目的pom.xml文件,在 中添加项目所需要用到的依赖,可以在Meven中央仓库(https://mvnrepository.com)中寻找自己需要的依赖并选择合适的版本,将相应的代码复制下来添加至中。在这里插入图片描述以下是我在pom.xml文件中添加相关依赖的代码:

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>
        <!--spring jdbc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>
        <!--spring aspect-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!--mybatis整合spring的配置包mybatis spring-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!--数据库连接池,驱动c3p0-->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.41</version>
        </dependency>
        <!--jstl,servlet api,junit-->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.6</version>
        </dependency>
        <!--   Spring-test-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <!--分页插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.4</version>
        </dependency>
        <!--返回json字符串的支持-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.5</version>
        </dependency>
        <!--添加TSR303后端数据校验的包-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.10.Final</version>
        </dependency>
    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103

添加依赖后记得import,最好不用自动import功能,这样可以更好的检查自己添加的依赖是否正确,对于未想到可能需要的依赖可在需要时在添加即可。

3.确定目录结构

在这里插入图片描述

文件名作用
bean用来存放实体类和实例类
controller控制层
dao数据层,用来存放mapper接口,进行数据库操作
service业务层,与数据层的交互
test用来测试及逆向生成bean,dao,及mapper等文件
mapper用来存放Mapper.xml的映射文件
resources用来存放mapper文件夹及Spring,SpringMVC,Mybatis的配置文件
static用来存放Bootstrap以及js文件
WEB-INF存放web.xml以及view文件夹和jsp文件
view用来存放显示页面

4.数据库的设计

在此我使用的是MySQL数据库:
数据库名:ssm_crud
1.员工信息表tbl_emp
字段:
员工id:emp_id,
员工名字:emp_name,
性别:gender,
邮箱:email,
部门Id:d_id
2.部门信息表tbl_dep
字段:
部门Id:dept_id,
部门名:dept_name
注:d_id 为一个外键列(添加外键关联),将tbl_emp中的d_id字段与tbl_dep字段中的dept_关联
在这里插入图片描述
表的字段信息:
在这里插入图片描述
在这里插入图片描述

5.配置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_2_5.xsd"
         id="WebApp_ID" version="2.5">
  <!-- 2.1 注册Spring配置文件的位置 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <!-- 2.2 注册ServletContext监听器 -->
  <!-- 用于创建Spring容器对象放入ServletContext的域属性空间中,保证整个应用中的Spring容器唯一 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 2.3 注册字符集过滤器 一定要放在所有过滤器的最前面 -->
  <!-- 用于解决请求参数中的中文乱码问题 -->
  <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>
    <init-param>
      <param-name>forceRequestEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>forceReponseEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
      //此处若写成原型会变为注释文件,将下面/后面的空格去掉即可
    <url-pattern>/ *</url-pattern>
  </filter-mapping>
  <!-- 2.4 配置中央调度器 拦截所有请求-->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <!-- 2.5 使用Rest风格的URI -->
  <filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
      //此处若写成原型会变为注释文件,将下面/后面的空格去掉即可
    <url-pattern>/ *</url-pattern>
  </filter-mapping>
  <!-- 解决无法直接发送PUT请求,带着请求体的问题,在修改员工信息的时候使用 -->
  <filter>
    <filter-name>HttpPutFormContentFilter</filter-name>
    <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>HttpPutFormContentFilter</filter-name>
    //此处若写成原型会变为注释文件,将下面/后面的空格去掉即可
    <url-pattern>/ *</url-pattern>
  </filter-mapping>
</web-app>


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

6.配置SpringMVC

<?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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    <!-- 跳转逻辑的配置 -->
    <!-- 扫描业务逻辑组件,配置组件扫描器,include-filter type="annotation"表示注解式使用,只扫描控制器-->
    <context:component-scan base-package="crud" use-default-filters="false">
        <!--只掃描控制器-->
        <!--在controller中引用@Controller注解时会用到此配置-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <!-- 2.配置视图解析器 ,视图模式配置-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前綴-->
        <property name="prefix" value="/WEB-INF/view/"></property>
        <!--后綴-->
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!-- 两个标准配置 -->
    <!-- 把spirngmvc不能处理的请求交给tomcat 比如静态资源图片等-->
    <mvc:default-servlet-handler/>
    <!-- 配置注解驱动 映射动态请求 支持springmvc一些高级功能,比如JSR303校验,快捷AJAX请求-->
    <mvc:annotation-driven/>
</beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

配置详情:
1.跳转逻辑的配置,使用Controller时扫描哪个包
2.视图解析器的配置
3.要使用spring mvc中的@Controller注解,就必须要配置<mvc:annotation-driven />,否则org.springframework.web.servlet.DispatcherServlet无法找到控制器并把请求分发到控制器。
4.将springMVC不能处理的请求交给tomcat处理

7.配置Spring

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
	http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-4.2.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- Spring的配置文件,这里主要配置和业务逻辑有关的 -->
    <!--============================数据源,事务控制,XXX=================== -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <bean name="C3P0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="driverClass" value="${jdbc.driver}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <context:component-scan base-package="crud">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--==============================Mabatis整合============================  -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--指定mybatis全局配置文件的位置-->
        <property name="configLocation" value="classpath:mybatis.xml"/>
        <property name="dataSource" ref="C3P0DataSource"/>
        <!--指定Mybatis全局配置文件位置-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!--配置扫描器,Mybatis接口的实现加入到ioc容器中-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--扫描所有dao接口的实现,加入ioc容器中-->
        <property name="basePackage" value="crud.dao"/>
    </bean>
    <!--=========================================================================  -->

    <!--配置一个可以执行批量的sqlSession-->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
        <constructor-arg name="executorType" value="BATCH"/>
    </bean>
    <!--=========================事务控制的配置===================================  -->
    <!--https://www.cnblogs.com/teach/p/5823574.html  此处是用的较多的aop声明式事务控制,此网站有介绍-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--控制住数据源-->
        <property name="dataSource" ref="C3P0DataSource"/>
    </bean>

    <!--开启基于注解的事务,使用xml配置形式的事务(必要主要的都是使用配置式)-->
    <aop:config>
        <!--切入点表达式-->
        <aop:pointcut id="txPoint" expression="execution(* crud.service..*(..))"/>
        <!--配置事务增强-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
    </aop:config>

    <!--配置事务增强,事务如何切入-->
    <!--系统默认切入名称为transactionManager-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--所有方法都是事务方法-->
            <tx:method name="*"/>
            <!--以get方法开始的所有方法-->
            <tx:method name="get*" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <!--Spring的配置文件的核心点(数据源、与Mybatis的整合、事务控制)-->

</beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
对Spring配置中引用了文件jdbc.properties,这样做的原因是当数据库文件发生改变时只需修改jdbc.properties文件即可,而不用来每个配置文件中修改数据,jdbc.properties文件内容如下:
jdbc.url=jdbc:mysql://localhost:3306/ssm_crud?useUnicode=true&characterEncoding=UTF-8
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=960625
  • 1
  • 2
  • 3
  • 4

注意:?useUnicode=true&characterEncoding=UTF-8的作用是用来解决向数据库中插入数据时出现中文变为???的情况

在对数据库连接池的配置过程中可能还涉及到最大和最小连接数和等待时间等的配置,如果需要可自行配置

8.配置Mybatis

<?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="mapUnderscoreToCamelCase" value="true"/>
    </settings>
       <!--自动扫描的方式来配置别名-->
    <typeAliases>
        <package name="crud.bean"/>
    </typeAliases>
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!--pageInfo合理化分页参数,当页码小于0时显示第一页,当页码大于最后一页时显示最后一页-->
            <property name="reasonable" value="true"/>
        </plugin>
    </plugins>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

1.其中属性mapUnderscoreToCamelCase表示是否启用下划线与驼峰式命名规则的映射(如emp_id----->empId)。其实mybatis是支持数据库属性和实体对象的驼峰命名映射,只需要开启这个配置即可,将其value值设为true。
2. 采用自动扫描的方式来配置别名
3. 引入使用PageHelper的配置文件(此处版本5与版本5以前的配置有所不同,需要注意,若引入PageHelper失败考虑是版本与其他包不兼容)

9.Mybatis-Generator的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <!--配置数据库连接-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/ssm_crud"
                        userId="root"
                        password="960625">
        </jdbcConnection>
        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!--指定javaBean生成的位置-->
        <javaModelGenerator
                targetPackage="crud.bean"
                targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!--指定sql映射文件生成的位置-->
        <sqlMapGenerator
                targetPackage="mapper"
                targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!--指定dao接口生成的位置,mapper接口-->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="crud.dao"
                             targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!--table指定每个表的生成策略-->
        <table tableName="tbl_emp" domainObjectName="Employee"></table>
        <table tableName="tbl_dept" domainObjectName="Department"></table>
    </context>
</generatorConfiguration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

该配置文件用来规定在使用MyBatis-Generator逆向工程生成bean,dao,Mapper文件的位置以及表的文件的生成策略,其中生成的文件中包含了注释信息,若想去掉这些注释信息则可以添加如下代码在 中

<commentGenerator> <property name="suppressDate" value="true"/>
            <!-- 是否去除自动生成的注释 true:是 : false:-->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
  • 1
  • 2
  • 3
  • 4

这里只是简单的介绍了项目目录结构、数据库的设计以及重要的配置文件,下一节将介绍如何引入前端样式。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/476467
推荐阅读
相关标签
  

闽ICP备14008679号