您的当前位置:首页正文

基于SpringBoot + Vue的拖恒ERP-物资管理系统设计与实现(源码+文档+部署)

2024-11-25 来源:个人技术集锦

1. 前言

2. 详细视频演示

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

3. 程序运行示例图

4. 文档参考

5. 技术框架

5.1 后端采用SpringBoot框架

Spring Boot 能根据项目的依赖自动配置 Spring 应用,避免手动 XML 或 Java 配置,开发者只需少量代码即可启动项目。Spring Boot 提供内嵌的 Web 服务器(如 Tomcat、Jetty、Undertow),无需单独部署 WAR 文件,应用可以直接以 JAR 包形式运行,非常适合微服务的快速启动和部署。Spring Boot 提供了一系列 Starter 依赖,用于快速引入特定的功能模块,比如 spring-boot-starter-web 提供构建 Web 应用所需的依赖,spring-boot-starter-data-jpa 用于与数据库交互等。提供命令行工具,可以快速创建 Spring Boot 应用,尤其适合用于原型开发或脚本化的场景。Spring Boot 提供一系列的监控、健康检查、外部化配置等功能,非常适合应用在生产环境中运行。例如,Spring Boot Actuator 提供监控和管理端点,便于实时查看应用的状态。Spring Boot 可以将应用打包为独立的 JAR 文件,内嵌服务器,可以直接运行,无需外部容器支持。

5.2 前端框架Vue

Vue 采用了与 Angular 类似的双向数据绑定机制,数据模型和视图可以自动同步。这使得开发者只需关注数据本身,Vue 会自动更新视图,大幅简化了数据与界面交互的逻辑。Vue.js 的核心思想是组件化开发。每个组件都是独立的、可复用的代码片段,包含了 HTML、CSS 和 JavaScript,简化了大型项目的开发和维护。Vue 被设计为渐进式框架,这意味着你可以根据需要逐步引入它的功能。可以简单地将 Vue 作为页面的一个小部分来使用,也可以通过 Vue CLI 和 Vue Router、Vuex 等工具构建复杂的单页面应用。Vue 使用直观的 HTML 模板语法,允许你声明式地将 DOM 绑定到底层数据模型。模板语法简单易懂,符合传统的 HTML 编写方式,入门门槛较低。Vue.js 使用虚拟 DOM(Virtual DOM),这使得它在更新界面时更加高效。虚拟 DOM 会计算出最小的变化量,尽量减少对真实 DOM 的操作,提高性能。Vue 的数据模型是响应式的。每当数据发生变化,Vue 的反应系统就会触发相应的组件重新渲染。无需手动操作 DOM,Vue 会在数据变化时自动处理视图更新。Vue 提供了丰富的指令(Directives),如 v-if、v-for、v-bind 等,可以轻松实现条件渲染、列表渲染、数据绑定等功能。

5.3 程序操作流程

首先前端通过Vue和axios发送HTTP请求到后端的登录接口。在后端接收登录请求的Controller会使用@RequestParam Map<String, Object> params来接收前端传递的用户参数,用户名和密码。然后后端根据接收到的参数创建一个查询条件封装对象MyBatis的EntityWrapper用于构建查询条件。接着在业务层,调用相应的service方法来查询数据库中是否存在匹配的用户信息。这个查询方法Login()会将前端传递的对象参数传递到后台的DAO层,进行数据库的交互操作。如果存在符合条件的用户,则会返回相关的用户信息。最后在后端控制器中将查询结果封装成响应体,通过return R.ok().put("data", userService.selecView(ew))将用户信息返回给前端。前端收到响应后,可以通过调用Vue、ElementUI等组件来渲染登录结果,例如显示用户信息或者跳转到相应的页面。

6. 选题推荐

7. 原创毕设案例





8. 系统测试

从多个角度进行测试找到系统中存在的问题是本系统首要的测试目的,通过功能测试寻找出系统缺陷并改正,确保系统没有缺陷。在测试过程中证明系统满足客户需求,发现问题和不足及时改正。测试完成之后得出测试结论。

8.1 系统测试的目的

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

8.2 系统功能测试

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

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

用户管理功能测试方案:用户管理主要有添加、编辑、删除、查找用户功能。添加用户时,必填项不填,检验系统是否有非空检验;添加已有的用户信息,检验是否提示用户名已被使用;删除用户信息,系统将检验是否进行此操作;更改用户信息,更改用户信息后页面是否可以展示出来。用户管理测试用例如下表所示。

输入数据预期结果实际结果结果分析
填入用户基本信息添加成功,在用户列表中显示该用户出现在在列表中和估算结果一样
修改用户信息编辑成功,修改信息成功被修改用户信息被修改和估算结果一样
选中删除用户系统询问是否删除用户,确认后用户被删除系统询问是否删除用户,确认后查找不到用户信息和估算结果一样
添加用户时不填用户名提示用户名不能为空提示用户名不能为空和估算结果一样
填入已有用户名添加失败,提示用户名重复添加失败,提示用户名重复和估算结果一样

9. 代码参考

/**
 * 通用接口
 */
@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()));
	}

10. 为什么选择我?

我就是程序员,程序大部分由博主亲自开发完成,现在有很多人看似在做程序设计,但是并不会进行讲解,因为程序根本不是他做出来的,从我这里做的毕设,都可以享有代码讲解服务,会议博主亲自讲解,可以全程录音录屏!这就是我的保障,代码哪里不懂都可以问!!!

11. 获取源码

大家点赞、收藏、关注、评论
查看??文章下方名片联系我即可~??
精彩专栏推荐订阅:在下方专栏




显示全文