当前位置: 首页 > 图灵资讯 > 技术篇> 基于微信小程序的打印室预约系统设计与实现

基于微信小程序的打印室预约系统设计与实现

来源:图灵教育
时间:2023-11-26 17:46:50

(文章目录)

详细的视频演示

请联系我获取更详细的演示视频

截图的具体实现

ImageImageImageImageImage

SpringBootot技术栈后端框架

Spring Tomcattttomcattot内置、Jetty、Undertow等服务器,这意味着您可以直接使用它们,而无需额外的安装和配置。Spring 其自动配置功能是Boot的主要优点之一。它可以根据您的项目中的依赖自动配置应用程序。这使得配置应用程序变得非常容易,因为你不需要手动配置每个依赖项。Spring Boot还提供了大量的开箱即用功能和插件,如Spring Data、Spring Security和Spring Cloud等。这些功能使开发者能够更快地构建应用程序,并更容易地扩展和集成其他技术。它是一个非常流行的框架,其自动配置、内置服务器和插件等功能使开发人员更快、更容易地构建高质量的应用程序。

Vue前端框架

Vue.虚拟DOM技术是js的核心。虚拟DOM是内存中的数据结构,可以帮助Vue.js实现高效的DOM操作,采用响应数据绑定和虚拟DOM、组件化等现代技术为开发者提供了灵活、高效、易于维护的开发模式。当数据发生变化时,UI会自动更新,使开发者更专注于数据处理,而不是手动更新UI。这就是Vue所体现的简洁、灵活、高效。

持久框架Mybaitsplus

MyBatis-Plus是基于MyBatis框架的增强工具,旨在简化MyBatis的开发。它是一个支持各种数据库的开源Java框架,包括MySQL、Oracle、SQL Server、PostgreSQL等。MyBatis-Plus提供了丰富的API和注释,可以通过简单的配置和使用来实现ORM操作,大大降低了手写SQL的工作量。此外,MyBatis-Plus还提供了一套自动生成实体类、Mapper接口和XML映射文件的代码生成器,大大简化了开发过程。MyBatis-Plus还支持分页查询、动态查询、乐观锁、性能分析等实用功能,方便开发者进行高效的数据操作。通过MyBatis-Plus,开发人员可以快速开发高质量的数据访问层代码,提高开发效率

系统测试

该系统的主要测试目的是从多个角度进行测试,找出系统的缺陷并通过功能测试进行纠正,以确保系统没有缺陷。在测试过程中,证明系统满足客户的需求,及时纠正问题和缺陷。测试结束后,得出测试结论。

系统测试的目的

系统测试是酒店管理系统开发周期中必不可少的过程,也是对耐心的考验。其重要性在于,它是保证系统质量和可靠性的最后一关,也是对整个系统开发过程的最后一次检查。系统测试主要是为了避免用户在使用过程中出现问题,增强用户体验。为了不影响用户的使用,我们需要从多个角度考虑系统可能遇到的问题,通过不同的模拟场景发现缺陷并解决问题。在测试过程中,还可以了解系统的质量、功能是否健全、逻辑是否顺畅。一个合格的系统测试过程将大大提高系统的质量和使用感。测试的目标是验证系统是否符合要求规范说明书的定义,并找出不符合要求规范说明书或与要求规范说明书冲突的内容。在测试过程中,我们必须从用户的角度考虑问题,避免一些不切实际的场景,浪费测试时间,这可能会导致预期结果与实际结果不一致的问题。

系统功能测试

测试系统功能模块,通过点击、输入边界值和验证必填项非必填项进行一系列黑盒测试。通过编写测试用例,根据测试用例中的内容进行测试,最后得出测试结论。登录功能测试方案:当需要登录系统时,用户需要输入与数据库中存储的数据匹配的内容,当输入错误时,系统会提示输入错误。该界面还对角色权限进行了相应的验证,当用户角色帐户选择管理员角色登录时,也会报告错误。如下表所示,登录功能测试用例。

输入数据预期结果实际结果结果分析用户名:guanliyuan 密码:123456 验证码:正确输入登录系统,成功登录系统,用户名与估算结果相同:guanliyuan 密码:111111 验证码:正确输入密码错误密码错误,请重新输入与估算结果相同的密码用户名:guanliyuan 密码:123456 验证码:输入验证码错误,验证码信息错误,用户名与估算结果相同:空: 密码:123456 验证码:正确输入用户名必须填写输入用户名和估算结果相同的用户名:guanliyuan 密码:空 验证码:正确输入密码错误密码错误,请重新输入与估算结果相同的密码

用户管理功能测试方案:用户管理主要包括添加、编辑、删除和搜索用户功能。添加用户时,必须填写不填写的项目,检查系统是否有非空检查;添加现有用户信息,检查是否提示用户名已使用;删除用户信息,检查系统是否进行此操作;更改用户信息,更改用户信息后页面是否可以显示。用户管理测试如下表所示。

输入数据预期结果实际结果结果分析填写用户基本信息成功添加,显示用户出现在用户列表中,修改用户信息编辑成功,修改信息成功修改用户信息修改和估算结果选择删除用户系统询问是否删除用户,确认用户删除验证码信息错误系统询问是否删除用户,确认后,找不到与估算结果相同的用户信息。添加用户时,不填写用户名,提示用户名不能空,提示用户名不能空,并填写与估算结果相同的现有用户名,提示用户名重复,提示用户名重复,系统测试结论与估算结果相同

该系统主要采用黑盒测试,通过模拟用户使用系统编写测试用例,并进行测试。确保系统流程的正确性。系统测试是必不可少的,可以使系统更加完善,系统的可用性也会更高。测试系统的主要目的是验证系统的功能模块是否符合我们最初的设计概念,并验证每个功能模块的逻辑是否正确。该系统不需要太复杂的逻辑处理,以方便用户操作。测试的最终目的也是围绕用户的使用展开。在测试过程中,所有场景都应满足用户的需求,不能偏离需求目标,并从用户的角度思考问题。经过一系列的测试过程,最终的测试结果可以从测试结果中看出,实现的系统在功能和性能上都符合设计要求。

代码参考
@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);}@Overridepublic 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;}/** * 权限(Token)验证 */@Componentpublic 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"));// OPTIONS请求将首先发送到跨域,在这里,我们要求OPTIONS直接回到正常状态 (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;        }        ///从header中获取token        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();    }}//throw new EIException("请先登录", 401);return false;    }}
数据库参考
-- ------------------------------ Table structure for token-- ----------------------------DROP TABLE IF EXISTS `token`;CREATE TABLE `token` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',  `userid` bigint(20) NOT NULL COMMENT 用户id,  `username` varchar(100) NOT NULL COMMENT 用户名,  `tablename` varchar(100) DEFAULT NULL COMMENT '表名',  `role` varchar(100) DEFAULT NULL COMMENT '角色',  `token` varchar(200) NOT NULL COMMENT '密码',  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "新时间",  `expiratedtime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 过期时间,  PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT="token表";-- ------------------------------ Records of token-- ----------------------------INSERT INTO `token` VALUES ('9', '23', 'cd01', 'xuesheng', '学生', ‘al6svx5qkei1wljry5onpswhdpqcpcg', '2023-02-23 21:46:45', '2023-03-15 14:01:36');INSERT INTO `token` VALUES ('10', '11', 'xh01', 'xuesheng', '学生', fahmrd9bkhqy04sq0fzrl4h9m86cu6kx, '2023-02-27 18:33:52', '2023-03-17 18:27:42');INSERT INTO `token` VALUES ('11', '17', 'ch01', 'xuesheng', '学生', u5km44scxvzuv5yumdah2lhva0gp4393, '2023-02-27 18:46:19', '2023-02-27 19:48:58');INSERT INTO `token` VALUES ('12', '1', 'admin', 'users', 管理员, h1pqzsb9bldh93m92j9m2sljy9bt1wdh, '2023-02-27 19:37:01', '2023-03-17 18:23:02');INSERT INTO `token` VALUES ('13', '21', 'xiaohao', 'shezhang', '社长', zdm7j8h1wnfe27pkyiuzvxy27ykl2a', '2023-02-27 19:38:07', '2023-03-17 18:25:20');INSERT INTO `token` VALUES ('14', '27', "djy01", 'xuesheng', '学生', g3teq435pe21nwuj2sqqoabqomm, '2023-03-15 12:56:17', '2023-03-15 14:00:16');INSERT INTO `token` VALUES ('15', '29', 'dajiyue', 'shezhang', '社长', '0vb1x9xn7riewlp5dma5ro7lp4u8m9j, '2023-03-15 12:58:08', '2023-03-15 14:03:48');