框架
-
controller 控制层
-
dao 持久层
-
interceptor 拦截器
-
model 实体层
-
uils 工具类
-
service 业务层
-
resources 资源文件层
-
- mapper 放编写sql语句的文件,与持久层的文件对应
具体代码
@Controller
//控制层
public class UserController {
//用于调用Service层方法
@Autowired
private IUserService userService;
//注册
@RequestMapping(value = "/register",method = RequestMethod.POST)
@ResponseBody
public Result register(@RequestBody User user){
return userService.register(user);
}
//登录
@RequestMapping(value = "/login",method = RequestMethod.POST)
@ResponseBody
public Result login(@RequestBody User user){
return userService.login(user);
}
//注销
@RequestMapping(value = "/logout")
@ResponseBody
public Result logout(@RequestHeader("token") String token){
return userService.logout(token);
}
//用于展示首页
@RequestMapping(value = "/show")
@ResponseBody
public Result show(){
return Result.ok("成功","首页");
}
}
//持久层
//状态码方法
public interface TokenMapper {
//保存到数据库
int insert(@Param("token") String token, @Param("userid") int id);
//查看
Integer selectByToken(String token);
//删除
void deleteByToken(String token);
}
//用户数据库
public interface UserMapper {
//插入数据,也就是注册的
int insert(User user);
//通过username查询,用于注册查重
User findUserByUsername(String username);
//登录方法
User findUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
}
//拦截器
@Controller
public class UserInterceptor implements HandlerInterceptor {
//调用持久层的方法
@Autowired
private TokenMapper tokenMapper;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取状态码
String token = request.getHeader("token");
//如果状态码不为空或者空字符串
if (token!=null&&token!=""){
Integer id = tokenMapper.selectByToken(token);
//如果不为空且查到存在状态码返回true
if (id!=null&&id>0){
return true;
}
}
//反之就是权限不够
String string = JSON.toJSONString(Result.error(500, "权限不够"));
response.getWriter().println(string);
return false;
}
//后置
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
//最终
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
public class Result<T> implements Serializable {
//返回状态
private static final long serialVersionUID = 1L;
/**
* 成功标志
*/
private boolean success = true;
/**
* 返回处理消息
*/
private String message = "操作成功!";
/**
* 状态码
*/
private Integer code = 0;
/**
* 返回数据对象 data
*/
private T result;
public static long getSerialVersionUID() {
return serialVersionUID;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
/**
* 时间戳
*/
private long timestamp = System.currentTimeMillis();
public Result() {
}
public Result<T> success(String message) {
this.message = message;
this.code = 200;
this.success = true;
return this;
}
public static Result<Object> ok() {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(200);
r.setMessage("成功");
return r;
}
public static Result<Object> ok(String msg) {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(200);
r.setMessage(msg);
return r;
}
public static Result<Object> ok(String msg,Object obj) {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(200);
r.setMessage(msg);
r.setResult(obj);
return r;
}
public static Result<Object> ok(Object data) {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(200);
r.setMessage("成功");
r.setResult(data);
return r;
}
public static Result<Object> error(String msg) {
return error(500, msg);
}
public static Result<Object> error(int code, String msg) {
Result<Object> r = new Result<Object>();
r.setCode(code);
r.setMessage(msg);
r.setSuccess(false);
return r;
}
public Result<T> error500(String message) {
this.message = message;
this.code = 500;
this.success = false;
return this;
}
/**
* 无权限访问返回结果
*/
public static Result<Object> noauth(String msg) {
return error(555, msg);
}
}
//user实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
/**
* 这是id
*/
private int id;
/**
* 这是昵称
*/
private String nickname;
/**
* 这是用户名
*/
private String username;
/**
* 这是密码
*/
private String password;
/**
* 这是年龄
*/
private int age;
/**
* 这是手机号
*/
private String phone;
}
//service接口
public interface IUserService {
Result register(User user);
Result login(User user);
Result logout(String token);
}
//实现service接口
@Service
@Transactional
public class UserService implements IUserService {
@Autowired
private UserMapper userMapper;
@Autowired
private TokenMapper tokenMapper;
/**
* 注册
*
*/
@Override
public Result register(User user) {
//用户名校验
String username = user.getUsername();
if (username != null && username != "") {
boolean check = RegUtils.check(username, "^(?=[a-zA-Z])(?!.*[\\-_]{2})[a-zA-Z0-9\\-_]{8,12}$");
if (!check){
return Result.error("用户名格式不正确");
}
}else {
return Result.error("用户名不能为空");
}
// 是否被注册过
User user1 = userMapper.findUserByUsername(username);
if (user1!=null){
return Result.error("用户名已存在,请重新输入");
}
// 密码校验
String password = user.getPassword();
if (password != null && password != "") {
boolean check = RegUtils.check(password, "^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]).{8,}$");
if (!check){
return Result.error("密码格式不正确");
}
}else {
return Result.error("密码不能为空");
}
// 年龄校验
int age = user.getAge();
if(age>120||age<18){
return Result.error("年龄不符合要求");
}
//手机号的校验
String phone = user.getPhone();
if (phone != null && phone != "") {
boolean check = RegUtils.check(phone, "^(1[3-9]\\d{9}$)");
if (!check){
return Result.error("手机号格式不正确");
}
}else {
return Result.error("手机号不能为空");
}
// 写入数据库
user.setPassword(MD5Utils.encrypt(password));
int insert = userMapper.insert(user);
return insert > 0 ? Result.ok("注册成功") : Result.error("注册失败");
}
/**
* 登录
*/
@Override
public Result login(User user) {
String username = user.getUsername();
if (username != null && username != "") {
boolean check = RegUtils.check(username, "^(?=[a-zA-Z])(?!.*[\\-_]{2})[a-zA-Z0-9\\-_]{8,12}$");
if (!check) {
return Result.error("用户名格式不正确");
}
} else {
return Result.error("用户名不能为空");
}
String password = user.getPassword();
if (password != null && password != "") {
boolean check = RegUtils.check(password, "^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]).{8,16}$");
if (!check) {
return Result.error("密码格式不正确");
}
} else {
return Result.error("密码不能为空");
}
password = MD5Utils.encrypt(password);
User user1 = userMapper.findUserByUsernameAndPassword(username, password);
if(user1!=null){
String uuid = UUID.randomUUID().toString();
String token = uuid.replace("-", "");
tokenMapper.insert(token, user1.getId());
return Result.ok("登录成功", token);
}
return Result.error("登录失败");
}
//注销
@Override
public Result logout(String token) {
if(token!=null && token!=""){
tokenMapper.deleteByToken(token);
}
return Result.ok("注销成功");
}
}
//正则表达式
public class RegUtils {
public static boolean check(String target,String regex) {
// 正则表达式
Pattern pattern = Pattern.compile(regex);
// 匹配器
Matcher matcher = pattern.matcher(target);
// 匹配
if (matcher.matches()) {
return true;
}
return false;
}
}
//MD5
public static String encrypt(String password){
MessageDigest md = null;
String s = null;
try {
md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
s = new BigInteger(1, md.digest()).toString(16);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return s;
}
<?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.xinzhi.dao.TokenMapper">
<insert id="insert">
insert into token (token,userid) values (#{token},#{userid})
</insert>
<delete id="deleteByToken">
delete from token where token=#{token}
</delete>
<select id="selectByToken" resultType="java.lang.Integer">
select id from token where token=#{token}
</select>
</mapper>
<?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.LiMou.dao.UserMapper">
<sql id="userAll">
id,nickname,username,password,age,phone
</sql>
<insert id="insert">
insert into user (nickname,username,password,age,phone) values (#{nickname},#{username},#{password},#{age},#{phone})
</insert>
<select id="findUserByUsername" resultType="com.xinzhi.model.User">
select <include refid="userAll"/> from user where username=#{username}
</select>
<select id="findUserByUsernameAndPassword" resultType="com.xinzhi.model.User">
select <include refid="userAll"/> from user where username=#{username} and password=#{password}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--加载properties文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!--数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="${password}"/>
</bean>
<!--开启bean注解扫描-->
<context:component-scan base-package="com.LiMou">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--开启注解式事务-->
<tx:annotation-driven transaction-manager="txManager"/>
<!--整合mybatis到spring中-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.xinzhi.model"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
<!--分页插件-->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<prop key="helperDialect">mysql</prop>
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
<!--映射扫描-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.LiMou.dao"/>
</bean>
</beans>
db.properties//连接数据库的
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.xinzhi.controller"/>
<mvc:annotation-driven >
<!-- 消息转换器 -->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/plain;charset=UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 多媒体解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="500000"/>
</bean>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/register"/>
<mvc:exclude-mapping path="/login"/>
<bean class="com.xinzhi.interceptor.UserInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
//依赖
<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>com.xinzhi</groupId>
<artifactId>conformity1</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>conformity1 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!--mysql环境-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
<!--spring整合jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--spring整合mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.3</version>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!--分页插件坐标-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
<!--springmvc环境-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--jackson相关坐标3个-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<!--servlet环境-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!--junit单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--spring整合junit-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
<finalName>conformity1</finalName>
</build>
</project>