文章目录 前言 详细视频演示 具体实现截图 核心技术介绍 后端框架SpringBoot 前端框架Vue 持久层框架MyBaits 为什么选择我 代码参考 数据库参考 测试用例参考 源码获取
前言 🌞博主介绍 :✌CSDN特邀作者、 多个成功系统案例:
代码参考 @IgnoreAuth @PostMapping ( value = "/login" ) public R login ( String username, String password, String captcha, HttpServletRequest request) { UsersEntity user = userService. selectOne ( new EntityWrapper < UsersEntity > ( ) . eq ( "username" , username) ) ; if ( user== null || ! user. getPassword ( ) . equals ( password) ) { return R . error ( "账号或密码不正确" ) ; } String token = tokenService. generateToken ( user. getId ( ) , username, "users" , user. getRole ( ) ) ; return R . ok ( ) . put ( "token" , token) ; } @Override public String generateToken ( Long userid, String username, String tableName, String role) { TokenEntity tokenEntity = this . selectOne ( new EntityWrapper < TokenEntity > ( ) . eq ( "userid" , userid) . eq ( "role" , role) ) ; String token = CommonUtil . getRandomString ( 32 ) ; Calendar cal = Calendar . getInstance ( ) ; cal. setTime ( new Date ( ) ) ; cal. add ( Calendar . HOUR_OF_DAY, 1 ) ; if ( tokenEntity!= null ) { tokenEntity. setToken ( token) ; tokenEntity. setExpiratedtime ( cal. getTime ( ) ) ; this . updateById ( tokenEntity) ; } else { this . insert ( new TokenEntity ( userid, username, tableName, role, token, cal. getTime ( ) ) ) ; } return token; } @Component public class AuthorizationInterceptor implements HandlerInterceptor { public static final String LOGIN_TOKEN_KEY = "Token" ; @Autowired private TokenService tokenService; @Override public boolean preHandle ( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { response. setHeader ( "Access-Control-Allow-Methods" , "POST, GET, OPTIONS, DELETE" ) ; response. setHeader ( "Access-Control-Max-Age" , "3600" ) ; response. setHeader ( "Access-Control-Allow-Credentials" , "true" ) ; response. setHeader ( "Access-Control-Allow-Headers" , "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization" ) ; response. setHeader ( "Access-Control-Allow-Origin" , request. getHeader ( "Origin" ) ) ; if ( request. getMethod ( ) . equals ( RequestMethod . OPTIONS. name ( ) ) ) { response. setStatus ( HttpStatus . OK. value ( ) ) ; return false ; } IgnoreAuth annotation; if ( handler instanceof HandlerMethod ) { annotation = ( ( HandlerMethod ) handler) . getMethodAnnotation ( IgnoreAuth . class ) ; } else { return true ; } String token = request. getHeader ( LOGIN_TOKEN_KEY) ; if ( annotation!= null ) { return true ; } TokenEntity tokenEntity = null ; if ( StringUtils . isNotBlank ( token) ) { tokenEntity = tokenService. getTokenEntity ( token) ; } if ( tokenEntity != null ) { request. getSession ( ) . setAttribute ( "userId" , tokenEntity. getUserid ( ) ) ; request. getSession ( ) . setAttribute ( "role" , tokenEntity. getRole ( ) ) ; request. getSession ( ) . setAttribute ( "tableName" , tokenEntity. getTablename ( ) ) ; request. getSession ( ) . setAttribute ( "username" , tokenEntity. getUsername ( ) ) ; return true ; } PrintWriter writer = null ; response. setCharacterEncoding ( "UTF-8" ) ; response. setContentType ( "application/json; charset=utf-8" ) ; try { writer = response. getWriter ( ) ; writer. print ( JSONObject . toJSONString ( R . error ( 401 , "请先登录" ) ) ) ; } finally { if ( writer != null ) { writer. close ( ) ; } } return false ; } }
数据库参考 DROP TABLE IF EXISTS ` address` ; ; ; CREATE TABLE ` address` ( ` id` bigint ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '主键' , ` addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , ` userid` bigint ( 20 ) NOT NULL COMMENT '用户id' , ` address` varchar ( 200 ) NOT NULL COMMENT '地址' , ` name` varchar ( 200 ) NOT NULL COMMENT '收货人' , ` phone` varchar ( 200 ) NOT NULL COMMENT '电话' , ` isdefault` varchar ( 200 ) NOT NULL COMMENT '是否默认地址[是/否]' , PRIMARY KEY ( ` id` ) ) ENGINE = InnoDB AUTO_INCREMENT = 9 DEFAULT CHARSET = utf8 COMMENT = '地址' ; DROP TABLE IF EXISTS ` forum` ; ; ; CREATE TABLE ` forum` ( ` id` bigint ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '主键' , ` addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , ` title` varchar ( 200 ) DEFAULT NULL COMMENT '帖子标题' , ` content` longtext NOT NULL COMMENT '帖子内容' , ` parentid` bigint ( 20 ) DEFAULT NULL COMMENT '父节点id' , ` userid` bigint ( 20 ) NOT NULL COMMENT '用户id' , ` username` varchar ( 200 ) DEFAULT NULL COMMENT '用户名' , ` avatarurl` longtext COMMENT '头像' , ` isdone` varchar ( 200 ) DEFAULT NULL COMMENT '状态' , ` istop` int ( 11 ) DEFAULT '0' COMMENT '是否置顶' , ` toptime` datetime DEFAULT NULL COMMENT '置顶时间' , PRIMARY KEY ( ` id` ) ) ENGINE = InnoDB AUTO_INCREMENT = 79 DEFAULT CHARSET = utf8 COMMENT = '交流论坛' ; DROP TABLE IF EXISTS ` yonghu` ; ; ; CREATE TABLE ` yonghu` ( ` id` bigint ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '主键' , ` addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , ` zhanghao` varchar ( 200 ) NOT NULL COMMENT '账号' , ` mima` varchar ( 200 ) NOT NULL COMMENT '密码' , ` xingming` varchar ( 200 ) NOT NULL COMMENT '姓名' , ` xingbie` varchar ( 200 ) DEFAULT NULL COMMENT '性别' , ` shouji` varchar ( 200 ) DEFAULT NULL COMMENT '手机' , ` touxiang` longtext COMMENT '头像' , ` jf` double DEFAULT '0' COMMENT '积分' , ` money` double DEFAULT '0' COMMENT '余额' , PRIMARY KEY ( ` id` ) , UNIQUE KEY ` zhanghao` ( ` zhanghao` ) ) ENGINE = InnoDB AUTO_INCREMENT = 19 DEFAULT CHARSET = utf8 COMMENT = '用户' ;
– 向数据库插入数据示例
INSERT INTO ` product` ( ` name` , ` price` , ` description` , ` stock` ) VALUES ( 'iPhone 13' , 999.99 , 'A powerful and advanced smartphone' , 100 ) ; INSERT INTO ` product` ( ` name` , ` price` , ` description` , ` stock` ) VALUES ( 'Samsung Galaxy S21' , 899.99 , 'A flagship Android smartphone' , 150 ) ; INSERT INTO ` product` ( ` name` , ` price` , ` description` , ` stock` ) VALUES ( 'Sony PlayStation 5' , 499.99 , 'Next-gen gaming console' , 50 ) ;
测试用例参考 输入数据 预期结果 实际结果 结果分析 用户名:guanliyuan 密码:123456 验证码:正确输入 登录系统 成功登录系统 结果一致 用户名:guanliyuan 密码:111111 验证码:正确输入 密码错误 密码错误,请重新输入密码 结果一致 用户名:guanliyuan 密码:123456 验证码:错误输入 验证码错误 验证码信息错误 结果一致 用户名:空 密码:123456 验证码:正确输入 用户名必填 请输入用户名 结果一致 用户名:guanliyuan 密码:空 验证码:正确输入 密码错误 密码错误,请重新输入密码 结果一致
另外,本系统还进行了用户管理功能的测试。就业辅导、资深全栈开发程序员,曾在互联网大厂担任高级职位、我们将继续进行测试工作,发现并修复潜在问题,为用户提供功能完善的系统体验。MyBatis的核心思想是将SQL语句和Java代码分离,通过XML或注解的方式来描述数据库操作,从而实现了数据访问层的解耦和灵活性。更新等操作更加灵活和可控。
可扩展性强:MyBatis采用插件机制,可以方便地扩展和定制自己的功能,满足各种不同的业务需求。