学习笔记_J2EE_SSM_02_spring+springMVC+Mybatis整合_注解示例

 


spring+springMVC+Mybatis整合_注解(声明式)示例


 

1.概述

  spring+springMVC+Mybatis整合  注解(声明)配置方式  基于偷懒对重复的代码采取复制粘贴,对xml配置略作更改,但改变项目为maven支撑。

  1.1 测试环境说明

    

名称 版本 备注
操作系统 windows 10 专业版 1809_X64  
JDK jdk1.8.0_121 WIN_X64  
数据库 mysql5.7  WIN_X64  
 web服务器 Tomcat8.5 WIN_X64   

  

 


2.入门示例

  2.1示例流程简述

 

      第一步:创建一个maven项目

      第二步:在pom.xml中添加包,并更改当前项目JDK到1.8版本

      第三步:创建一个访问页面

      第四步:修改WEB.XML配置文件,添加spring处理器

      第五步:创建spring核心配置类

      第六步:添加mybatis配置类

      第七步:添加springMVC配置类

      第八步:创建访问处理接口。

      第九步:创建 实体类

      第十步:创建mapper 数据访问接口

      第十一步:创建服务接口与实现类

      第十二步:创建响应页面

      第十三步:测试

 

 

  2.2 目录架构

    

 

 

  2.3 操作示例

    2.3.1 创建MAVEN项目,设置项目支撑包,更改jdk版本  /rbac/pom.xml

    

 

<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/maven-v4_0_0.xsd">

	<!-- 基本信息 -->
	<modelVersion>4.0.0</modelVersion>
	<groupId>cn.slm</groupId>
	<artifactId>rbac</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>rbac Maven Webapp</name>
	<url>http://maven.apache.org</url>

	<!-- 包版本管理 -->
	<properties>
		<spring.version>5.0.13.RELEASE</spring.version>
		<jsp.version>2.0</jsp.version>
		<servlet.version>3.0.1</servlet.version>
		<mybatis.version>3.5.1</mybatis.version>
		<mybatis-spring.version>2.0.1</mybatis-spring.version>
		<mysql.version>5.1.47</mysql.version>
		<commons-io.version>2.6</commons-io.version>
		<commons-logging.version>1.2</commons-logging.version>
		<commons-dbcp2.version>2.6.0</commons-dbcp2.version>
		<commons-pool2.version>2.6.2</commons-pool2.version>

	</properties>

	<!-- 支撑包 -->
	<dependencies>

		<!-- junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>

		<!-- jsp -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jsp-api</artifactId>
			<version>${jsp.version}</version>
			<!-- provided 只编译时加载,打包时不加载 -->
			<scope>provided</scope>
		</dependency>

		<!-- servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>${servlet.version}</version>
			<scope>provided</scope>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>${spring.version}</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>${mybatis-spring.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>${commons-logging.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>${commons-io.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-dbcp2</artifactId>
			<version>${commons-dbcp2.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
			<version>${commons-pool2.version}</version>
		</dependency>


	</dependencies>

	<!-- 插件管理 -->
	<build>
		<finalName>rbac</finalName>

		<plugins>
			<!-- 项目安装Tomcat7插件 -->
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
			</plugin>

			<!-- 编译器设置 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<!-- JDK 版本 -->
					<source>1.8</source>
					<!-- 编译版本 -->
					<target>1.8</target>
					<!-- 编译编码 -->
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>

	</build>
</project>

  

 

      2.3.2 创建一个访问页面 /rbac/src/main/webapp/index.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/depart/addDepart" method="post">
        <label>部门名称</label><input type="text" name="departName"/><br/>
        <label>上级部门</label><input type="text" name="departSupperId"/><br/>
        <label>简    介</label><input type="text" name="departDescribe"/><br/>
        <input type="submit" value="保存"/>
    </form>
</body>
</html>

  

 

      2.3.3 修改WEB.XML配置文件,添加spring处理器 /rbac/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://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>rbac</display-name>

	<!-- 编码处理 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<!-- 编码处理类 包依赖:spring-web-4.3.16.RELEASE.jar -->
		<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>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


	<!-- 加载spring核心处理器配置 -->
	<!-- The front controller of this Spring Web application, responsible for 
		handling all application requests -->
	<servlet>
		<servlet-name>springDispatcherServlet</servlet-name>
		<!-- 依赖包 spring-webmvc-4.3.16.RELEASE.jar -->
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 加载配置类包 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>cn.slm.config</param-value>
		</init-param>
		<!-- 配置类解析依赖  依赖包spring-web-5.0.13.RELEASE.jar -->
		<init-param>
			<param-name>contextClass</param-name>
			<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- spring核心处理器映射  所有以/开头的请求都交由spring处理Map all requests to the DispatcherServlet for handling -->
	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!-- 首页设置 -->
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>

  

      2.3.4 创建spring核心配置类、mybatis配置类与数据源文件 

        2.3.4.1 spring核心配置类 /rbac/src/main/java/cn/slm/config/ContextConfig.java

  

package cn.slm.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.PropertySource;

@Configuration//声明该类是配置类
@ComponentScan(basePackages="cn.slm",excludeFilters=@Filter(type=FilterType.REGEX,pattern=".pojo")) //声明进行Spring包扫描
@PropertySource(encoding="UTF-8",value="classpath:db.properties")//声明属性与加载的数据源文件位置
public class ContextConfig {

}

        2.3.4.2 mybatis配置类 /rbac/src/main/java/cn/slm/config/DataBaseConfig.java

package cn.slm.config;


import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration//声明配置类
@MapperScan(basePackages="cn.slm.mapper",annotationClass=Mapper.class)//mapper包扫描
@EnableTransactionManagement//声明事物管理类
public class DataBaseConfig {
	//数据源属性注入
	@Value("${db.driverClassName}")
	private String driverClassName;
	@Value("${db.url}")
	private String url;
	@Value("${db.username}")
	private String username;
	@Value("${db.password}")
	private String password;
	
	//声明数据源
	@Bean(name="dataSource")
	public DataSource getDataSource() {
		BasicDataSource basicDataSource = new BasicDataSource();
		basicDataSource.setDriverClassName(driverClassName);
		basicDataSource.setUrl(url);
		basicDataSource.setUsername(username);
		basicDataSource.setPassword(password);
		
		return  basicDataSource;
	}
	
	// 声明mybatis的SqlSessionFactoryBean
	@Bean(name="sqlSessionFactory")
	public SqlSessionFactory getSqlSessionFactory() {
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(this.getDataSource());
		org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
		configuration.setMapUnderscoreToCamelCase(true);
		sqlSessionFactoryBean.setConfiguration(configuration);
		try {
			sqlSessionFactoryBean.afterPropertiesSet();
			
			return sqlSessionFactoryBean.getObject();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	//声明事务管理器
	@Bean
	public DataSourceTransactionManager getDataDourceTransactionManager() {
		
		DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
		dataSourceTransactionManager.setDataSource(this.getDataSource());
		return dataSourceTransactionManager;
	}
	
}

          2.3.4.3 数据源文件  /rbac/src/main/resources/db.properties

   

db.driverClassName=org.gjt.mm.mysql.Driver
db.url=jdbc:mysql://localhost:3306/ssm_demo
db.username=root
db.password=123456

  

      2.3.5 添加springMVC配置类 /rbac/src/main/java/cn/slm/config/WebMvcConfig.java

      

package cn.slm.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration//声明这是一个配置类
@EnableWebMvc//声明启用springMVC注解 等价于<mvc:annotation-driver>标签
public class WebMvcConfig extends WebMvcConfigurerAdapter{
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		// TODO Auto-generated method stub
		configurer.enable();
	}
	
}

 

  

 

      2.3.6 创建访问处理接口。/rbac/src/main/java/cn/slm/action/TDepartmentAction.java

  

package cn.slm.action;

import java.util.Date;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.annotation.SessionScope;

import cn.slm.pojo.TDepartment;
import cn.slm.service.DepartmentService;

@Controller // 访问控制器声明
@SessionScope // 同用户共享声明 单一session只创建一次对象,减少缓存数据
@RequestMapping("/depart")
public class TDepartmentAction{

	@Autowired
	private DepartmentService dps;
	
	@RequestMapping(value="/addDepart")
	public  String addDepart(TDepartment  depart) {
		System.out.println("测试添加!"+depart.getDepartName());
		depart.setDepartCreateTime(new Date());
		int num = dps.addDepartment(depart);
		System.out.println("受影响的行数:"+num);
		/*if(num>0) {
			request.setAttribute("page_depart_findDepart_msg","添加部门成功!");
		}else {
			request.setAttribute("page_depart_findDepart_msg","添加部门失败!");			
		}*/
		return "forward:/test.jsp";
	}
	
	@RequestMapping("/logicDelDepart")
	public String logicDelDepart(@RequestParam TDepartment  depart,HttpServletRequest request) {
		int num = dps.LogicDelDepartment(depart);
		if(num>0) {
			request.setAttribute("page_depart_findDepart_msg","添加部门成功!");
		}else {
			request.setAttribute("page_depart_findDepart_msg","添加部门失败!");			
		}
		return  "department/findDepart";
	}

	@RequestMapping("/findDepartById")
	public String findDepartById(@RequestParam TDepartment  depart,HttpSession session){
		HashMap<String, Object> hashMap = new HashMap<String,Object>();
		TDepartment Depart = dps.findDepartmentByID(depart);
		session.setAttribute("depart", depart);
		return "department/findDepart";
	}
	
	
	
}

  

 

  

 

      2.3.7 创建 实体类 /rbac/src/main/java/cn/slm/pojo/TDepartment.java

 

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
package cn.slm.pojo;
 
import java.util.Date;
 
public class TDepartment {
     
    private int departId;;// dp_id int 11 0 0 -1 0 0 0 0 部门编号 -1 0
    private String departName;// dp_name varchar 50 0 0 0 0 0 0 0 部门名称 utf8 utf8_bin 0 0
    private String departSupperId;//dp_supperId int 11  0   0   0   0   0   0       0   上级部门                0   0
    private Date departCreateTime;// dp_createTime timestamp 0 0 0 0 0 0 0 CURRENT_TIMESTAMP -1 创建时间 0 0
    private String departDescribe;// dp_describe varchar 255 0 -1 0 0 0 0 这是一个有活力的部门 0 部门描述 utf8 utf8_bin 0 0
     
     
    public int getDepartId() {
        return departId;
    }
    public void setDepartId(int departId) {
        this.departId = departId;
    }
    public String getDepartName() {
        return departName;
    }
    public void setDepartName(String departName) {
        this.departName = departName;
    }
    public String getDepartSupperId() {
        return departSupperId;
    }
    public void setDepartSupperId(String departSupperId) {
        this.departSupperId = departSupperId;
    }
    public Date getDepartCreateTime() {
        return departCreateTime;
    }
    public void setDepartCreateTime(Date departCreateTime) {
        this.departCreateTime = departCreateTime;
    }
    public String getDepartDescribe() {
        return departDescribe;
    }
    public void setDepartDescribe(String departDescribe) {
        this.departDescribe = departDescribe;
    }
     
 
}

  

 

      2.3.8 创建mapper 数据访问接口  /rbac/src/main/java/cn/slm/mapper/TDepartmentMapper.java

 

package cn.slm.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;


import cn.slm.pojo.TDepartment;

@Mapper
public interface TDepartmentMapper {
	
	@Insert("insert into t_department(dp_name,dp_supperId,dp_createTime,dp_describe) values(#{departName},#{departSupperId},#{departCreateTime},#{departDescribe})")
	int insert(TDepartment depart);
	
	int update(TDepartment depart);
	
	int logicDel(TDepartment depart);
	
	int delete(TDepartment depart);
	
	TDepartment select(int id);
	
	TDepartment selectByName(String name);

	List<TDepartment>	selectAll();
	
	/*List<TDepartment>	selectByPage(@Param int startnum,@Param int endnum)*/
	
}

  

 

      2.3.9 创建服务接口  /rbac/src/main/java/cn/slm/service/DepartmentService.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package cn.slm.service;
 
import java.util.List;
 
import cn.slm.pojo.TDepartment;
 
public interface DepartmentService {
     
    public int addDepartment(TDepartment depart);
    public int updateDepartment(TDepartment depart);
    public int LogicDelDepartment(TDepartment depart);
    public int delDepartment(TDepartment depart);
    public TDepartment findDepartmentByID(TDepartment depart);
    public TDepartment findDepartmentByName(TDepartment depart);
    public List<TDepartment> findDepartmentByPage(int start ,int end);
    public List<TDepartment> findAllDepartment();
     
     
}

 

      2.3.10 创建服务接口实现类  /rbac/src/main/java/cn/slm/service/impl/DepartmentServiceImpl.java

 

  

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
package cn.slm.service.impl;
 
import java.util.List;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import cn.slm.mapper.TDepartmentMapper;
import cn.slm.pojo.TDepartment;
import cn.slm.service.DepartmentService;
 
@Service        //声明服务层
public class DepartmentServiceImpl implements DepartmentService {
     
    @Autowired   //自动注入TDepartmentMapper
    private TDepartmentMapper dpartMapper;
 
    @Override
    public int addDepartment(TDepartment depart) {
        return dpartMapper.insert(depart);
    }
 
    @Override
    public int updateDepartment(TDepartment depart) {
        // TODO Auto-generated method stub
        return dpartMapper.update(depart);
    }
 
    @Override
    public int LogicDelDepartment(TDepartment depart) {
        return dpartMapper.logicDel(depart);
    }
 
    @Override
    public int delDepartment(TDepartment depart) {
        return dpartMapper.delete(depart);
    }
 
    @Override
    public TDepartment findDepartmentByID(TDepartment depart) {
        return dpartMapper.select(depart.getDepartId());
    }
 
    @Override
    public TDepartment findDepartmentByName(TDepartment depart) {
        return dpartMapper.selectByName(depart.getDepartName());
    }
 
    @Override
    public List<TDepartment> findDepartmentByPage(int start, int end) {
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public List<TDepartment> findAllDepartment() {
        return dpartMapper.selectAll();
    }
     
     
}

  

      2.3.11 创建响应页面  /rbac/src/main/webapp/test.jsp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    这是一个测试页面,用于测试跳转。
     
    当你看到这行字的时候,说明跳转正常!
</body>
</html>

 

  

 

      2.3.12 测试

          2.3.14.1 请求页面

    

 

 

1
 

      2.3.14.2 响应页面 

 

 

1
 

        2.3.14.3 数据库 

 


  

 

        2.3.14.4 控制台

 

 


  

 

posted @ 2019-05-06 20:54  huoyun523  阅读(203)  评论(0编辑  收藏  举报