前言
💗博主介绍:✌全网粉丝100W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐✅
2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐✅
Java精品实战案例《828套》
微信小程序项目精品案例《1000套》
🌟文末获取源码+数据库🌟
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
详细视频演示
请联系我获取更详细的演示视频
项目运行截图
技术框架
后端采用SpringBoot框架
Spring Boot 是一种基于 Java 开发的开源框架,旨在简化和加速构建独立的、基于 Spring 框架的应用程序的过程。它采用约定优于配置的原则,通过自动化配置和快速启动来提高开发者的生产力。Spring Boot提供了一种快速构建应用程序的方式,使开发者可以专注于业务逻辑的实现而不必过多关注底层的配置和环境搭建。
Spring Boot 的特点和优势包括:
快速启动: Spring Boot 提供了快速启动的能力,可以在几秒钟内启动一个独立的 Spring 应用程序。
自动化配置: Spring Boot 通过自动化配置减少了开发者的配置工作量,使得应用程序可以更容易地进行部署和运行。
内嵌式容器: Spring Boot 支持内嵌式容器,可以将应用程序打包为可执行的 JAR 文件,并且不需要外部容器即可运行。
依赖管理: Spring Boot 提供了依赖管理的功能,可以通过简单的配置管理应用程序的依赖库,使得项目的管理更加方便。
健康检查: Spring Boot 自带了健康检查的功能,可以方便地监控应用程序的运行状态。
可扩展性: Spring Boot 提供了丰富的扩展点和插件,可以根据需要进行定制和扩展。
前端框架Vue
Vue.js 是一种流行的前端 JavaScript 框架,用于构建交互式的用户界面。它被设计为逐步采用的框架,可以轻松地与现有的项目整合,也可以作为单页面应用程序 (SPA) 的核心框架来使用。
以下是 Vue.js 的一些关键特点和优势:
轻量级: Vue.js 体积小巧,加载速度快,易于上手和学习。双向数据绑定: Vue.js 提供了简单而强大的双向数据绑定机制,使得数据的变化能够自动反映在视图上,提高了开发效率。组件化开发: Vue.js 鼓励组件化开发,将页面拆分为多个独立的组件,方便管理和复用,提高了代码的可维护性和可复用性。虚拟 DOM: Vue.js 使用虚拟 DOM 技术,通过比对虚拟 DOM 和实际 DOM 的差异来高效更新页面,提高了页面渲染的性能。指令和过滤器: Vue.js 提供了丰富的指令和过滤器,可以轻松处理 DOM 元素和数据的交互,实现各种功能和效果。路由管理: Vue.js 配合 Vue Router 可以实现前端路由管理,实现页面之间的无刷新跳转和状态管理。
可行性分析
可行性分析是对项目或计划进行综合评估的过程,旨在确定项目的可行性、风险和潜在收益。
以下是可行性分析的一般性内容:
①市场可行性: 需要评估项目在目标市场上的潜在需求和竞争情况。分析市场规模、增长趋势、竞争对手及其优势劣势,以及项目在市场中的定位和竞争优势。
②技术可行性: 评估项目所采用的技术方案是否符合项目需求,并且是否有可行的技术实现路径。考虑技术的成熟度、可靠性、安全性、可扩展性等因素。
③财务可行性: 分析项目的投资成本、运营成本、预期收益以及投资回报周期。评估项目的财务可行性,包括资金来源、资金投入和回报预期。
④组织可行性: 考虑项目所需的组织结构、人员配备、管理机制等方面的可行性。评估组织资源是否足够支持项目的顺利实施和运营。
⑤环境可行性: 考虑项目对环境的影响以及可能存在的环境风险。评估项目在环境保护和可持续发展方面的可行性和责任。
系统测试
系统测试是软件开发过程中非常重要的一环,旨在验证整个系统在满足需求和设计规范方面的功能性、性能、安全性和可靠性。以下是系统测试的一般性内容:
①功能测试: 确保系统的各项功能按照需求规格书和设计文档中的描述正常运行。包括输入验证、功能操作、输出结果等方面的测试。
②性能测试: 测试系统在不同负载和压力下的性能表现,包括响应时间、吞吐量、并发性能等指标。确保系统能够在预期的负载下正常运行并保持良好的性能。
③安全性测试: 测试系统的安全性,包括数据加密、访问控制、防火墙、漏洞扫描等方面的测试,以保护系统免受恶意攻击和非法访问。
④兼容性测试: 测试系统在不同操作系统、浏览器、设备上的兼容性,确保系统能够在多样化的环境下正常运行。
⑤可靠性测试: 测试系统的可靠性和稳定性,包括故障恢复、容错能力、系统可用性等方面的测试,以确保系统能够持续稳定地运行。
⑥用户界面测试: 测试系统的用户界面设计和交互体验,包括布局、样式、交互功能等方面的测试,以确保用户友好性和易用性。
系统测试的目的
系统测试是必不可少且考验耐心的过程。其重要性在于,它是保证系统质量和牢靠性的最后一道关,也是整个系统开发过程的最后一次检查。
系统测试主要是为了避免用户在使用时发生问题,增强用户体验感,为了不影响用户的使用,我们需要从多角度、多思路去考虑系统可能遇到的问题,通过不同的模拟场景来发现缺陷并解决问题。在测试的过程中也可以了解到该系统的质量情况,系统功能是否健全,系统逻辑是否顺畅。一个合格的系统测试过程完成后将大大提升系统质量和使用感。测试的目标是验证系统是否符合需求规格说明书的定义,并找出与需求规格说明书不符合或与之冲突的内容。测试过程中一定站在用户的角度考虑问题,避免一些不切实际的场景,浪费测试时间,从而可能会引起问题导致预期结果与实际结果不符。
系统功能测试
对系统功能模块进行测试,通过点击、输入边界值和必填项非必填项的验证等方法进行一系列的黑盒测试。通过编写测试用例,根据测试用例中的内容进行测试,最后得出测试结论。
登录功能测试方案:当需要登入该系统时,通过账户密码等功能点进行验证,用户在输入时需要输入与数据库内存储的数据匹配的内容,当其中某项输入错误时系统将提示输入错误。此界面对角色权限也有相应的校验,当用户角色的帐号选择管理员角色登录时,也会报错。登录功能测试用例如下表所示。
输入数据 | 预期结果 | 实际结果 | 结果分析 |
---|---|---|---|
用户名: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套》