💗💗💗作者简介💗💗 | 博主毕业于985大学计算机专业,从事计算机开发行业4年多,就职某大厂,累计辅导学生2000+人,获得好评无数,主要技术有SpringBoot、SSM、Vue、Mysql、Html、javascript、css、JSP、可视化、小程序、uniapp、javaswing、nodejs、electron等设计与开发,累计开发程序6000+套,有需要的小伙伴可以在文末获得联系方式,诚信经营,个人开发,全程辅导,包通过,包维护,包讲解。 |
---|
1.系统简介(摘要)
该汽车特征识别系统是一个基于SpringBoot和Docker技术的综合性应用平台。系统前端采用了Bootstrap框架和HTML技术,以提供用户友好的界面和流畅的操作体验。Bootstrap的运用使得前端页面具有良好的响应式布局,能够适应不同设备的屏幕尺寸,提升用户的使用便捷性。后端则采用了强大的SpringBoot框架,以其简洁、高效的特点,为系统提供了稳定的业务逻辑处理和数据处理能力。SpringBoot的丰富生态和便捷的配置方式,极大地提高了开发效率和系统的可维护性。数据库方面,系统选用了MySQL作为数据存储和管理工具。MySQL以其高性能、高可靠性和易用性,能够满足系统对用户数据、汽车识别数据、博客内容、系统通知等多种类型数据的存储和管理需求。系统功能方面,该汽车特征识别系统涵盖了用户管理、汽车识别、博客、系统通知、部门管理、文件管理等多个模块。用户管理模块实现了用户的注册、登录、权限管理等功能;汽车识别模块则是系统的核心,通过先进的图像识别技术,实现对汽车特征的准确识别;博客模块为用户提供了发布和分享汽车相关知识和经验的平台;系统通知模块则负责及时推送系统更新、活动通知等信息给用户;部门管理和文件管理模块则分别实现了对部门信息和文件资料的有效管理。
2.开发技术
2.1 SpringBoot框架
SpringBoot适合初学者,也适合从以前的Spring框架开发者学习,学习起来是很方便的,不管是纯英文教程还是中文教程,国内外都有很多学习的资料。Spring Boot可以运行所有的Spring项目,进行无缝切换。内置了Servlet 容器,不需要对代码进行打包变成WAR就可以运行。自带应用监控,运行的时候可以实时的对正在运行的项目进行监控,可以随时发现问题所在并且能定位发生的问题,可以让程序员及时的修改问题。
2.2 MySQL数据库
一般学习程序开发的人员如果学习数据库的话,肯定是要学习MySQL数据库,MySQL数据库通过这么多年的不断发展,社区版本都是免费的,最重要的是小巧,占用电脑空间比较小,让更多的开发人员可以不需要更换更高级的电脑就可以进行学习。学习只是一个方面,最重要的是MySQL市场占有率是世界第一,基本上十个公司就有七八个用得MySQL数据库。MySQL的优点不只是这么粗浅,MySQL首先是开源的,只要不是商用就不用花钱,并且大型的数据也是支持的,只要是市面上存在的操作系统,MySQL都可以有对应的版本可供使用。因为MySQL是开源的,如果有对MySQL有特殊需求的甚至可以自己修改源码,达到符合自己使用的目的。MySQL数据库好处多多,最重要的一点符合本设计的开发需求,可以说本设计只用到了MySQL的一些基础功能,而这点基础功能就完全够用。MySQL学习的教程网上很多,许多关于入门的教程就完全可以达到普通程序员的开发水平,只需要把基本的知识学会了,到公司里面也只是根据不同的业务逻辑进行不同的语句编写而已。
2.3 Java语言
Java语言是目前最流行的语言之一,不仅可以做桌面窗口形式的程序,还可以做浏览器访问的程序,目前最流行的就是用Java语言作为基础,做各种程序的后台处理。Java语言是操作变量的语言,而变量则是Java对于数据存在形式的定义,变量用来操作内存,而内存则牵扯到计算机安全问题,这样Java语言反而有了免疫直接针对用Java语言开发出来的程序的病毒,有效地提高了Java语言开发出来程序的生存能力。Java是具有动态运行能力的一种语言,Java的类不仅仅可以用Java核心提供的基础类,还可以进行重写,这样会让Java的功能变得更加丰富,甚至可以编写一些功能模块进行封装。Java是一种开源的语言,可以对Java里面的各种类以及引用方法进行追溯,甚至可以对已经编译过的语言进行反编译,这样不仅仅提高学习的效率,并且可以学习其他从业者提供的优雅的编程方式。Java语言发展到现在,已经在各个行业扎根,学习Java可以从事的行业很多,并且学习的方法很多,网上有很多免费的教程,甚至有些高深的知识也只需要付费就可以进行学习,而不是像Java语言之初,每一个编程人员都需要用记事本进行手动编码,现在有很多集成开发环境帮助Java从业者。选择Java语言进行编程,是一种很好的解决问题的方式。
2.5 B/S结构简介
随着软件系统的不断改进和升级,B/S结构产品更为方便的特征体现地十分明显。对于一个中等偏大的公司来说,如果系统管理员每天要在很多台电脑之间来回查看,不断奔走,那么效率和工作量就会变得很低,但是如果使用了B/S结构,那么管理员只要对服务器进行管理就够了。
B/S结构最大的优点它不需要安装任何的软件,它所有的客户端就只是浏览器,所以只要有一台电脑并且可以上网就可以解决所有问题,客户端可以完全地不用管理员维护。无论使用系统的使用者是什么样的规模,也不管分支有多么的庞大,都不会对维护和升级的工作量造成影响,所有的维护和升级只需要操作服务器。随着B/S结构的不断发展,使用的人也不断增加,从而带动了AJAX技术的发展,和B/S结构一样,它也能在客户端上处理程序,这便缓解了服务器的负担,提高了交互性,而且实现了局部实时刷新。
3.系统截图
4.系统源代码
package com.bootdo.system.controller;
import com.bootdo.common.config.Constant;
import com.bootdo.common.controller.BaseController;
import com.bootdo.common.domain.Tree;
import com.bootdo.common.utils.R;
import com.bootdo.system.domain.DeptDO;
import com.bootdo.system.service.DeptService;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 部门管理
*/
@Controller
@RequestMapping("/system/sysDept")
public class DeptController extends BaseController {
private String prefix = "system/dept";
@Autowired
private DeptService sysDeptService;
@GetMapping()
@RequiresPermissions("system:sysDept:sysDept")
String dept() {
return prefix + "/dept";
}
@ApiOperation(value="获取部门列表", notes="")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("system:sysDept:sysDept")
public List<DeptDO> list() {
Map<String, Object> query = new HashMap<>(16);
List<DeptDO> sysDeptList = sysDeptService.list(query);
return sysDeptList;
}
@GetMapping("/add/{pId}")
@RequiresPermissions("system:sysDept:add")
String add(@PathVariable("pId") Long pId, Model model) {
model.addAttribute("pId", pId);
if (pId == 0) {
model.addAttribute("pName", "总部门");
} else {
model.addAttribute("pName", sysDeptService.get(pId).getName());
}
return prefix + "/add";
}
@GetMapping("/edit/{deptId}")
@RequiresPermissions("system:sysDept:edit")
String edit(@PathVariable("deptId") Long deptId, Model model) {
DeptDO sysDept = sysDeptService.get(deptId);
model.addAttribute("sysDept", sysDept);
if(Constant.DEPT_ROOT_ID.equals(sysDept.getParentId())) {
model.addAttribute("parentDeptName", "无");
}else {
DeptDO parDept = sysDeptService.get(sysDept.getParentId());
model.addAttribute("parentDeptName", parDept.getName());
}
return prefix + "/edit";
}
/**
* 保存
*/
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("system:sysDept:add")
public R save(DeptDO sysDept) {
if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
}
if (sysDeptService.save(sysDept) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("system:sysDept:edit")
public R update(DeptDO sysDept) {
if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
}
if (sysDeptService.update(sysDept) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("system:sysDept:remove")
public R remove(Long deptId) {
if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("parentId", deptId);
if(sysDeptService.count(map)>0) {
return R.error(1, "包含下级部门,不允许修改");
}
if(sysDeptService.checkDeptHasUser(deptId)) {
if (sysDeptService.remove(deptId) > 0) {
return R.ok();
}
}else {
return R.error(1, "部门包含用户,不允许修改");
}
return R.error();
}
/**
* 删除
*/
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("system:sysDept:batchRemove")
public R remove(@RequestParam("ids[]") Long[] deptIds) {
if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
}
sysDeptService.batchRemove(deptIds);
return R.ok();
}
@GetMapping("/tree")
@ResponseBody
public Tree<DeptDO> tree() {
Tree<DeptDO> tree = new Tree<DeptDO>();
tree = sysDeptService.getTree();
return tree;
}
@GetMapping("/treeView")
String treeView() {
return prefix + "/deptTree";
}
}