前言
💗博主介绍:✌全网粉丝100W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、Python、PHP、小程序、大数据技术领域和毕业项目实战✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐✅
2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐✅
Python精品毕设案例《2000套》
PHP精品毕设案例《1000套》
Java精品实战案例《3000套》
微信小程序项目精品案例《3000套》
基于大数据、数据分析大屏、爬虫精品毕设案例
🌟文末获取源码+数据库🌟
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
详细视频演示
请联系我获取更详细的演示视频
项目运行截图
技术框架
后端采用SSM框架
SSM框架是Java开发中常用的三个开源框架的组合,分别是Spring、Spring MVC和MyBatis。它们各自的职责如下:Spring:Spring是一个轻量级的控制反转(IoC)和面向切面编程(AOP)的框架。它为Java应用程序提供了全面的基础架构支持。Spring的核心特性是其IoC容器,它通过依赖注入(DI)来管理对象的生命周期和依赖关系,使代码更加模块化和可测试。
Spring MVC:Spring MVC是Spring框架的一部分,用于构建基于模型-视图-控制器(MVC)模式的Web应用程序。它通过前端控制器(DispatcherServlet)来处理所有的HTTP请求,并将请求分派给合适的处理器(Controller)。Spring MVC还支持多种视图技术,如JSP、Thymeleaf、FreeMarker等。MyBatis:MyBatis是一个持久层框架,简化了JDBC代码的开发。它通过XML或注解来配置和映射SQL语句,将Java对象与数据库中的记录关联起来。MyBatis支持动态SQL、缓存和延迟加载等功能,使数据库操作更加灵活和高效。
通过整合这三个框架,SSM提供了一个强大的平台,能够快速开发和部署高性能、可维护的Java Web应用程序。
前端框架JSP
JSP的语法类似于HTML和JavaScript,初学者可以很容易地上手。同时,JSP标签和表达式使得在HTML页面中嵌入Java代码变得简单直观。与Java无缝集成:JSP基于Java技术,能够利用Java的强大功能和丰富的库。通过Servlet API,JSP页面可以与JavaBeans、Enterprise JavaBeans(EJB)等组件无缝集成,实现复杂的业务逻辑。
动态内容生成:JSP允许在HTML页面中嵌入Java代码,通过Java代码生成动态内容。例如,可以根据用户输入或数据库查询结果动态生成网页内容,提高Web应用的交互性和用户体验。
可扩展性和重用性:JSP支持自定义标签库(Tag Library),开发人员可以创建和重用自定义标签,简化复杂的页面逻辑,提高代码的可读性和可维护性。此外,JSP还支持JavaBeans和自定义标签的使用,进一步提高代码的重用性。
分离内容和逻辑:JSP鼓励将业务逻辑和显示逻辑分离。通过使用JavaBeans、Servlet等组件处理业务逻辑,JSP页面主要负责显示逻辑,这种分离使得代码更易于维护和测试。
编译和执行:JSP页面在第一次请求时会被编译为Servlet,服务器会将JSP代码转换为Java字节码,从而提高了执行效率。编译后的Servlet可以处理后续的请求,直到JSP页面被修改。
广泛支持:JSP是Java EE标准的一部分,几乎所有的Java EE应用服务器都支持JSP,如Apache Tomcat、IBM WebSphere、Oracle WebLogic等。
总的来说,JSP是一种强大且灵活的技术,适用于各种规模的Web应用开发。通过与其他Java技术的集成,JSP可以构建功能丰富、性能优越的动态Web应用程序。
可行性分析
1.技术可行性:在技术可行性方面,本项目计划使用成熟的SSM(Spring、Spring MVC、MyBatis)框架和JSP技术。这些技术在业界得到了广泛应用和验证,拥有丰富的文档和社区支持。团队成员具备相应的技术能力,曾在多个项目中使用这些技术,具备丰富的开发经验。此外,现有的开发工具和环境(如IDEA、MySQL、Tomcat等)都支持这些技术,能够确保项目的顺利进行。2. 经济可行性:从经济可行性角度来看,本项目的开发成本主要包括人员成本、硬件和软件成本、以及项目管理成本。由于项目使用开源技术栈,软件成本较低。团队成员为公司现有员工,无需额外招聘,人员成本可控。通过合理的项目计划和资源调配,预计在预算范围内能够完成项目开发,并且项目的成功实施将带来可观的经济效益,提高公司的市场竞争力和客户满意度。3. 时间可行性:本项目有明确的时间规划和里程碑节点,采用敏捷开发方法进行管理,能够确保项目在规定时间内完成。项目初期通过需求分析和原型设计,快速迭代,逐步完善功能。团队具有较强的项目管理经验,能够有效控制项目进度,及时解决开发过程中遇到的问题,确保项目按时交付。
系统测试
系统测试是软件开发过程中非常重要的一环,旨在验证整个系统在满足需求和设计规范方面的功能性、性能、安全性和可靠性。以下是系统测试的一般性内容:
①功能测试: 确保系统的各项功能按照需求规格书和设计文档中的描述正常运行。包括输入验证、功能操作、输出结果等方面的测试。
②性能测试: 测试系统在不同负载和压力下的性能表现,包括响应时间、吞吐量、并发性能等指标。确保系统能够在预期的负载下正常运行并保持良好的性能。
③安全性测试: 测试系统的安全性,包括数据加密、访问控制、防火墙、漏洞扫描等方面的测试,以保护系统免受恶意攻击和非法访问。
④兼容性测试: 测试系统在不同操作系统、浏览器、设备上的兼容性,确保系统能够在多样化的环境下正常运行。
⑤可靠性测试: 测试系统的可靠性和稳定性,包括故障恢复、容错能力、系统可用性等方面的测试,以确保系统能够持续稳定地运行。
⑥用户界面测试: 测试系统的用户界面设计和交互体验,包括布局、样式、交互功能等方面的测试,以确保用户友好性和易用性。
系统测试的目的
系统测试是必不可少且考验耐心的过程。其重要性在于,它是保证系统质量和牢靠性的最后一道关,也是整个系统开发过程的最后一次检查。
系统测试主要是为了避免用户在使用时发生问题,增强用户体验感,为了不影响用户的使用,我们需要从多角度、多思路去考虑系统可能遇到的问题,通过不同的模拟场景来发现缺陷并解决问题。在测试的过程中也可以了解到该系统的质量情况,系统功能是否健全,系统逻辑是否顺畅。一个合格的系统测试过程完成后将大大提升系统质量和使用感。测试的目标是验证系统是否符合需求规格说明书的定义,并找出与需求规格说明书不符合或与之冲突的内容。测试过程中一定站在用户的角度考虑问题,避免一些不切实际的场景,浪费测试时间,从而可能会引起问题导致预期结果与实际结果不符。
系统功能测试
对系统功能模块进行测试,通过点击、输入边界值和必填项非必填项的验证等方法进行一系列的黑盒测试。通过编写测试用例,根据测试用例中的内容进行测试,最后得出测试结论。
登录功能测试方案:当需要登入该系统时,通过账户密码等功能点进行验证,用户在输入时需要输入与数据库内存储的数据匹配的内容,当其中某项输入错误时系统将提示输入错误。此界面对角色权限也有相应的校验,当用户角色的帐号选择管理员角色登录时,也会报错。登录功能测试用例如下表所示。
输入数据 | 预期结果 | 实际结果 | 结果分析 |
---|---|---|---|
用户名:guanliyuan 密码:123456 验证码:正确输入 | 登入系统 | 成功登入系统 | 和估算结果一样 |
用户名:guanliyuan 密码:111111 验证码:正确输入 | 密码错误 | 密码错误,请重新输入密码 | 和估算结果一样 |
用户名:guanliyuan 密码:123456 验证码:错误输入 | 验证码错误 | 验证码信息错误 | 和估算结果一样 |
用户名:空 密码:123456 验证码:正确输入 | 用户名必填 | 请输入用户名 | 和估算结果一样 |
用户名:guanliyuan 密码:空 验证码:正确输入 | 密码错误 | 密码错误,请重新输入密码 | 和估算结果一样 |
用户管理功能测试方案:用户管理主要有添加、编辑、删除、查找用户功能。添加用户时,必填项不填,检验系统是否有非空检验;添加已有的用户信息,检验是否提示用户名已被使用;删除用户信息,系统将检验是否进行此操作;更改用户信息,更改用户信息后页面是否可以展示出来。用户管理测试用例如下表所示。
输入数据 | 预期结果 | 实际结果 | 结果分析 |
---|---|---|---|
填入用户基本信息 | 添加成功,在用户列表中显示 | 该用户出现在在列表中 | 和估算结果一样 |
修改用户信息 | 编辑成功,修改信息成功被修改 | 用户信息被修改 | 和估算结果一样 |
选中删除用户 | 系统询问是否删除用户,确认后用户被删除 | 系统询问是否删除用户,确认后查找不到用户信息 | 和估算结果一样 |
添加用户时不填用户名 | 提示用户名不能为空 | 提示用户名不能为空 | 和估算结果一样 |
填入已有用户名 | 添加失败,提示用户名重复 | 添加失败,提示用户名重复 | 和估算结果一样 |
数据库表设计
列名 | 数据类型 | 长度 | 约束 |
---|---|---|---|
id | int | 11 | PRIMARY KEY |
addtime | 行2内容 | 行2内容 | DEFAULT NULL |
jieyuedanhao | varchar | 64 | DEFAULT NULL |
tushubianhao | varchar | 64 | DEFAULT NULL |
tushumingcheng | varchar | 12 | DEFAULT NULL |
fakuanshuoming | varchar | 64 | DEFAULT NULL |
fakuanjine | varchar | 64 | DEFAULT NULL |
fakuanriqi | varchar | 64 | DEFAULT NULL |
yonghuming | varchar | 64 | DEFAULT NULL |
shouji | varchar | 64 | DEFAULT NULL |
代码参考
/**
* 通用接口
*/
@RestController
public class CommonController{
@Autowired
private CommonService commonService;
@Autowired
private ConfigService configService;
private static AipFace client = null;
private static String BAIDU_DITU_AK = null;
@RequestMapping("/location")
public R location(String lng,String lat) {
if(BAIDU_DITU_AK==null) {
BAIDU_DITU_AK = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "baidu_ditu_ak")).getValue();
if(BAIDU_DITU_AK==null) {
return R.error("请在配置管理中正确配置baidu_ditu_ak");
}
}
Map<String, String> map = BaiduUtil.getCityByLonLat(BAIDU_DITU_AK, lng, lat);
return R.ok().put("data", map);
}
/**
* 人脸比对
*
* @param face1 人脸1
* @param face2 人脸2
* @return
*/
@RequestMapping("/matchFace")
public R matchFace(String face1, String face2) {
if(client==null) {
/*String AppID = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "AppID")).getValue();*/
String APIKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "APIKey")).getValue();
String SecretKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "SecretKey")).getValue();
String token = BaiduUtil.getAuth(APIKey, SecretKey);
if(token==null) {
return R.error("请在配置管理中正确配置APIKey和SecretKey");
}
client = new AipFace(null, APIKey, SecretKey);
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
}
JSONObject res = null;
try {
File file1 = new File(ResourceUtils.getFile("classpath:static/upload").getAbsolutePath()+"/"+face1);
File file2 = new File(ResourceUtils.getFile("classpath:static/upload").getAbsolutePath()+"/"+face2);
String img1 = Base64Util.encode(FileUtil.FileToByte(file1));
String img2 = Base64Util.encode(FileUtil.FileToByte(file2));
MatchRequest req1 = new MatchRequest(img1, "BASE64");
MatchRequest req2 = new MatchRequest(img2, "BASE64");
ArrayList<MatchRequest> requests = new ArrayList<MatchRequest>();
requests.add(req1);
requests.add(req2);
res = client.match(requests);
System.out.println(res.get("result"));
} catch (FileNotFoundException e) {
e.printStackTrace();
return R.error("文件不存在");
} catch (IOException e) {
e.printStackTrace();
}
return R.ok().put("data", com.alibaba.fastjson.JSONObject.parse(res.get("result").toString()));
}
数据库脚本
CREATE TABLE `yonghu` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`yonghuming` varchar(200) NOT NULL COMMENT '用户名',
`mima` varchar(200) NOT NULL COMMENT '密码',
`xingming` varchar(200) DEFAULT NULL COMMENT '姓名',
`xingbie` varchar(200) DEFAULT NULL COMMENT '性别',
`touxiang` varchar(200) DEFAULT NULL COMMENT '头像',
`shouji` varchar(200) DEFAULT NULL COMMENT '手机',
`shenfenzheng` varchar(200) DEFAULT NULL COMMENT '身份证',
PRIMARY KEY (`id`),
UNIQUE KEY `yonghuming` (`yonghuming`)
) ENGINE=InnoDB AUTO_INCREMENT=1616222324596 DEFAULT CHARSET=utf8mb3 COMMENT='用户';
CREATE TABLE `messages` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`userid` bigint NOT NULL COMMENT '留言人id',
`username` varchar(200) DEFAULT NULL COMMENT '用户名',
`content` longtext NOT NULL COMMENT '留言内容',
`reply` longtext COMMENT '回复内容',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1616222424131 DEFAULT CHARSET=utf8mb3 COMMENT='留言板';
CREATE TABLE `token` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`userid` bigint 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 CURRENT_TIMESTAMP COMMENT '过期时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3 COMMENT='token表';
为什么选择我?
我就是程序员,程序大部分由博主亲自开发完成,现在有很多人看似在做程序设计,但是并不会进行讲解,因为程序根本不是他做出来的,从我这里做的毕设,都可以享有代码讲解服务,会议博主亲自讲解,可以全程录音录屏!这就是我的保障,代码哪里不懂都可以问!!!
获取源码
文章下方名片联系我即可~
大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻
精彩专栏推荐订阅:在下方专栏👇🏻
Java精品实战案例《2600套》
微信小程序项目精品案例《2600套》