Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:智行无忧停车场管理系统(前后端源码 + 数据库 sql 脚本)
🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
文章目录
1.0 项目介绍
1.1 项目功能
2.0 用户登录功能
3.0 首页界面
4.0 车辆信息管理功能
5.0 停车位管理功能
6.0 入场登记管理功能
7.0 预约管理功能
8.0 收费规则功能
9.0 出场登记管理功能
10.0 用户信息管理功能
11.0 SQL 数据库设计
1.0 项目介绍
开发工具:IDEA、VScode
服务器:Tomcat, JDK 17
项目构建:maven
数据库:mysql 8.0
系统用户前台和管理后台两部分,项目采用前后端分离
前端技术:vue + elementUI
服务端技术:springboot + mybatis + redis + mysql
1.1 项目功能
后台功能:
1)登录、退出系统、首页
2)用户信息管理
(1) 用户信息管理:添加、修改、删除、查询等功能。
3)车辆信息管理
(1) 车辆信息管理:添加、修改、删除、查询等功能。
4)停车位管理
(1) 停车位管理:添加、修改、删除、查询、安排车位等功能。
5)入场登记管理
(1)入场登记管理:添加、修改、删除、查询等功能。
6)预约管理
(1) 车位预约管理:添加、修改、删除、查询等功能。
7)收费规则
(1) 收费规则:添加、修改、删除、查询等功能。
8)出场登记管理
(1) 出场登记管理:添加、修改、删除、查询等功能。
9)权限管理
(1)角色信息管理:添加、修改、删除、分配权限等功能。
(2)资源信息管理:添加、修改、删除等功能。
注意:不一定非要完全符合开发环境,有稍微的差别也是可以开发的。
若需要项目完整源码,可以在 CSDN 私信给我,我每天都有查看消息的,感谢大家支持,希望可以帮助到大家!
2.0 用户登录功能
用户根据正确的用户名、密码且通过正确的校验码进行登录。
实现了登录校验,还有用户注册功能:
用到了 Spring Security 框架来实现登录、校验、验证等功能。
相关的部分源码:
@RestController public class SysLoginController {@Autowiredprivate SysLoginService loginService;@Autowiredprivate ISysMenuService menuService;@Autowiredprivate SysPermissionService permissionService;/*** 登录方法* * @param loginBody 登录信息* @return 结果*/@PostMapping("/login")public AjaxResult login(@RequestBody LoginBody loginBody){AjaxResult ajax = AjaxResult.success();// 生成令牌String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),loginBody.getUuid());ajax.put(Constants.TOKEN, token);return ajax;}/*** 获取用户信息* * @return 用户信息*/@GetMapping("getInfo")public AjaxResult getInfo(){SysUser user = SecurityUtils.getLoginUser().getUser();// 角色集合Set<String> roles = permissionService.getRolePermission(user);// 权限集合Set<String> permissions = permissionService.getMenuPermission(user);AjaxResult ajax = AjaxResult.success();ajax.put("user", user);ajax.put("roles", roles);ajax.put("permissions", permissions);return ajax;}/*** 获取路由信息* * @return 路由信息*/@GetMapping("getRouters")public AjaxResult getRouters(){Long userId = SecurityUtils.getUserId();List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);return AjaxResult.success(menuService.buildMenus(menus));} }
public String login(String username, String password, String code, String uuid){// 验证码校验validateCaptcha(username, code, uuid);// 登录前置校验loginPreCheck(username, password);// 用户验证Authentication authentication = null;try{UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);AuthenticationContextHolder.setContext(authenticationToken);// 该方法会去调用UserDetailsServiceImpl.loadUserByUsernameauthentication = authenticationManager.authenticate(authenticationToken);}catch (Exception e){if (e instanceof BadCredentialsException){AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));throw new UserPasswordNotMatchException();}else{AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));throw new ServiceException(e.getMessage());}}finally{AuthenticationContextHolder.clearContext();}AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));LoginUser loginUser = (LoginUser) authentication.getPrincipal();recordLoginInfo(loginUser.getUserId());// 生成tokenreturn tokenService.createToken(loginUser);}
3.0 首页界面
统计相关车辆的信息,使用柱状图和圆饼图来展示出来,会更加直观。
相关的源码:
<template><div class="statistics-container"><!-- <h1>智行无忧停车场</h1> --><div class="data-summary"><div class="summary-item"><h2>今日车辆总数</h2><p>{{ totalVehicles }}</p></div><div class="summary-item"><h2>今日车辆进入数</h2><p>{{ todayEntries }}</p></div><div class="summary-item"><h2>今日车辆离开数</h2><p>{{ todayExits }}</p></div><div class="summary-item"><h2>当前空闲车位数</h2><p>{{ availableSpots }}</p></div></div><div class="chart-container"><div id="vehicleEntryExitChart" style="width: 100%; height: 400px;"></div></div><div class="chart-container"><div id="spotUsageChart" style="width: 100%; height: 400px;"></div></div></div> </template><script setup> import * as echarts from 'echarts'; import { onMounted, ref, computed } from 'vue';const vehicleEntryExitChart = ref(null); const spotUsageChart = ref(null);// 模拟数据 const mockVehicleEntryExitData = {dates: ['2024-12-04', '2024-12-05', '2024-12-06'],entries: [120, 200, 150],exits: [90, 180, 130] };const mockSpotUsageData = {spotUsages: [{ value: 335, name: '已使用' },{ value: 310, name: '未使用' }] };const totalVehicles = computed(() => mockVehicleEntryExitData.entries.reduce((a, b) => a + b, 0)); const todayEntries = computed(() => mockVehicleEntryExitData.entries[mockVehicleEntryExitData.entries.length - 1]); const todayExits = computed(() => mockVehicleEntryExitData.exits[mockVehicleEntryExitData.exits.length - 1]); const availableSpots = computed(() => mockSpotUsageData.spotUsages.find(item => item.name === '未使用')?.value || 0);onMounted(() => {initVehicleEntryExitChart();initSpotUsageChart(); });function initVehicleEntryExitChart() {const chartDom = document.getElementById('vehicleEntryExitChart');if (chartDom) {const myChart = echarts.init(chartDom);const option = {title: {text: '车辆进出统计'},tooltip: {trigger: 'axis',axisPointer: {type: 'shadow'}},xAxis: {type: 'category',data: mockVehicleEntryExitData.dates},yAxis: {type: 'value'},series: [{name: '车辆进入',data: mockVehicleEntryExitData.entries,type: 'bar'},{name: '车辆离开',data: mockVehicleEntryExitData.exits,type: 'bar'}]};myChart.setOption(option);} }function initSpotUsageChart() {const chartDom = document.getElementById('spotUsageChart');if (chartDom) {const myChart = echarts.init(chartDom);const option = {title: {text: '车位使用情况'},tooltip: {trigger: 'item'},legend: {top: '5%',left: 'center'},series: [{name: '车位使用情况',type: 'pie',radius: '50%',data: mockSpotUsageData.spotUsages,emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}}}]};myChart.setOption(option);} } </script>
4.0 车辆信息管理功能
上传图片使用了第三方接口:x-File-Storage 框架。
相关源码:
@RestController @RequestMapping("/manage/vehicle") public class VehicleController extends BaseController {@Autowiredprivate IVehicleService vehicleService;/*** 查询车辆信息列表*/@PreAuthorize("@ss.hasPermi('manage:vehicle:list')")@GetMapping("/list")public TableDataInfo list(Vehicle vehicle){startPage();List<Vehicle> list = vehicleService.selectVehicleList(vehicle);return getDataTable(list);}/*** 导出车辆信息列表*/@PreAuthorize("@ss.hasPermi('manage:vehicle:export')")@Log(title = "车辆信息", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Vehicle vehicle){List<Vehicle> list = vehicleService.selectVehicleList(vehicle);ExcelUtil<Vehicle> util = new ExcelUtil<Vehicle>(Vehicle.class);util.exportExcel(response, list, "车辆信息数据");}/*** 获取车辆信息详细信息*/@PreAuthorize("@ss.hasPermi('manage:vehicle:query')")@GetMapping(value = "/{vehicleId}")public AjaxResult getInfo(@PathVariable("vehicleId") Long vehicleId){return success(vehicleService.selectVehicleByVehicleId(vehicleId));}/*** 新增车辆信息*/@PreAuthorize("@ss.hasPermi('manage:vehicle:add')")@Log(title = "车辆信息", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Vehicle vehicle){return toAjax(vehicleService.insertVehicle(vehicle));}/*** 修改车辆信息*/@PreAuthorize("@ss.hasPermi('manage:vehicle:edit')")@Log(title = "车辆信息", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Vehicle vehicle){return toAjax(vehicleService.updateVehicle(vehicle));}/*** 删除车辆信息*/@PreAuthorize("@ss.hasPermi('manage:vehicle:remove')")@Log(title = "车辆信息", businessType = BusinessType.DELETE)@DeleteMapping("/{vehicleIds}")public AjaxResult remove(@PathVariable Long[] vehicleIds){return toAjax(vehicleService.deleteVehicleByVehicleIds(vehicleIds));} }
5.0 停车位管理功能
相关源码:
@RestController @RequestMapping("/manage/spot") public class ParkingSpotController extends BaseController {@Autowiredprivate IParkingSpotService parkingSpotService;/*** 查询停车位列表*/@PreAuthorize("@ss.hasPermi('manage:spot:list')")@GetMapping("/list")public TableDataInfo list(ParkingSpot parkingSpot){startPage();List<ParkingSpot> list = parkingSpotService.selectParkingSpotList(parkingSpot);return getDataTable(list);}/*** 导出停车位列表*/@PreAuthorize("@ss.hasPermi('manage:spot:export')")@Log(title = "停车位", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, ParkingSpot parkingSpot){List<ParkingSpot> list = parkingSpotService.selectParkingSpotList(parkingSpot);ExcelUtil<ParkingSpot> util = new ExcelUtil<ParkingSpot>(ParkingSpot.class);util.exportExcel(response, list, "停车位数据");}/*** 获取停车位详细信息*/@PreAuthorize("@ss.hasPermi('manage:spot:query')")@GetMapping(value = "/{spotId}")public AjaxResult getInfo(@PathVariable("spotId") Long spotId){return success(parkingSpotService.selectParkingSpotBySpotId(spotId));}/*** 新增停车位*/@PreAuthorize("@ss.hasPermi('manage:spot:add')")@Log(title = "停车位", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody ParkingSpot parkingSpot){return toAjax(parkingSpotService.insertParkingSpot(parkingSpot));}/*** 修改停车位*/@PreAuthorize("@ss.hasPermi('manage:spot:edit')")@Log(title = "停车位", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody ParkingSpot parkingSpot){return toAjax(parkingSpotService.updateParkingSpot(parkingSpot));}/*** 删除停车位*/@PreAuthorize("@ss.hasPermi('manage:spot:remove')")@Log(title = "停车位", businessType = BusinessType.DELETE)@DeleteMapping("/{spotIds}")public AjaxResult remove(@PathVariable Long[] spotIds){return toAjax(parkingSpotService.deleteParkingSpotBySpotIds(spotIds));} }
6.0 入场登记管理功能
相关源码:
@RestController @RequestMapping("/manage/record") public class EntryRecordController extends BaseController {@Autowiredprivate IEntryRecordService entryRecordService;/*** 查询入场记录列表*/@PreAuthorize("@ss.hasPermi('manage:record:list')")@GetMapping("/list")public TableDataInfo list(EntryRecord entryRecord){startPage();List<EntryRecord> list = entryRecordService.selectEntryRecordList(entryRecord);return getDataTable(list);}/*** 导出入场记录列表*/@PreAuthorize("@ss.hasPermi('manage:record:export')")@Log(title = "入场记录", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, EntryRecord entryRecord){List<EntryRecord> list = entryRecordService.selectEntryRecordList(entryRecord);ExcelUtil<EntryRecord> util = new ExcelUtil<EntryRecord>(EntryRecord.class);util.exportExcel(response, list, "入场记录数据");}/*** 获取入场记录详细信息*/@PreAuthorize("@ss.hasPermi('manage:record:query')")@GetMapping(value = "/{entryId}")public AjaxResult getInfo(@PathVariable("entryId") Long entryId){return success(entryRecordService.selectEntryRecordByEntryId(entryId));}/*** 新增入场记录*/@PreAuthorize("@ss.hasPermi('manage:record:add')")@Log(title = "入场记录", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody EntryRecord entryRecord){return toAjax(entryRecordService.insertEntryRecord(entryRecord));}/*** 修改入场记录*/@PreAuthorize("@ss.hasPermi('manage:record:edit')")@Log(title = "入场记录", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody EntryRecord entryRecord){return toAjax(entryRecordService.updateEntryRecord(entryRecord));}/*** 删除入场记录*/@PreAuthorize("@ss.hasPermi('manage:record:remove')")@Log(title = "入场记录", businessType = BusinessType.DELETE)@DeleteMapping("/{entryIds}")public AjaxResult remove(@PathVariable Long[] entryIds){return toAjax(entryRecordService.deleteEntryRecordByEntryIds(entryIds));} }
7.0 预约管理功能
相关源码:
@RestController @RequestMapping("/manage/reservation") public class ReservationController extends BaseController {@Autowiredprivate IReservationService reservationService;/*** 查询预约记录列表*/@PreAuthorize("@ss.hasPermi('manage:reservation:list')")@GetMapping("/list")public TableDataInfo list(Reservation reservation){startPage();List<Reservation> list = reservationService.selectReservationList(reservation);return getDataTable(list);}/*** 导出预约记录列表*/@PreAuthorize("@ss.hasPermi('manage:reservation:export')")@Log(title = "预约记录", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Reservation reservation){List<Reservation> list = reservationService.selectReservationList(reservation);ExcelUtil<Reservation> util = new ExcelUtil<Reservation>(Reservation.class);util.exportExcel(response, list, "预约记录数据");}/*** 获取预约记录详细信息*/@PreAuthorize("@ss.hasPermi('manage:reservation:query')")@GetMapping(value = "/{reservationId}")public AjaxResult getInfo(@PathVariable("reservationId") Long reservationId){return success(reservationService.selectReservationByReservationId(reservationId));}/*** 新增预约记录*/@PreAuthorize("@ss.hasPermi('manage:reservation:add')")@Log(title = "预约记录", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Reservation reservation){return toAjax(reservationService.insertReservation(reservation));}/*** 修改预约记录*/@PreAuthorize("@ss.hasPermi('manage:reservation:edit')")@Log(title = "预约记录", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Reservation reservation){return toAjax(reservationService.updateReservation(reservation));}/*** 删除预约记录*/@PreAuthorize("@ss.hasPermi('manage:reservation:remove')")@Log(title = "预约记录", businessType = BusinessType.DELETE)@DeleteMapping("/{reservationIds}")public AjaxResult remove(@PathVariable Long[] reservationIds){return toAjax(reservationService.deleteReservationByReservationIds(reservationIds));} }
8.0 收费规则功能
相关源码:
@RestController @RequestMapping("/manage/rule") public class FeeRuleController extends BaseController {@Autowiredprivate IFeeRuleService feeRuleService;/*** 查询收费规则列表*/@PreAuthorize("@ss.hasPermi('manage:rule:list')")@GetMapping("/list")public TableDataInfo list(FeeRule feeRule){startPage();List<FeeRule> list = feeRuleService.selectFeeRuleList(feeRule);return getDataTable(list);}/*** 导出收费规则列表*/@PreAuthorize("@ss.hasPermi('manage:rule:export')")@Log(title = "收费规则", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, FeeRule feeRule){List<FeeRule> list = feeRuleService.selectFeeRuleList(feeRule);ExcelUtil<FeeRule> util = new ExcelUtil<FeeRule>(FeeRule.class);util.exportExcel(response, list, "收费规则数据");}/*** 获取收费规则详细信息*/@PreAuthorize("@ss.hasPermi('manage:rule:query')")@GetMapping(value = "/{ruleId}")public AjaxResult getInfo(@PathVariable("ruleId") Long ruleId){return success(feeRuleService.selectFeeRuleByRuleId(ruleId));}/*** 新增收费规则*/@PreAuthorize("@ss.hasPermi('manage:rule:add')")@Log(title = "收费规则", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody FeeRule feeRule){return toAjax(feeRuleService.insertFeeRule(feeRule));}/*** 修改收费规则*/@PreAuthorize("@ss.hasPermi('manage:rule:edit')")@Log(title = "收费规则", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody FeeRule feeRule){return toAjax(feeRuleService.updateFeeRule(feeRule));}/*** 删除收费规则*/@PreAuthorize("@ss.hasPermi('manage:rule:remove')")@Log(title = "收费规则", businessType = BusinessType.DELETE)@DeleteMapping("/{ruleIds}")public AjaxResult remove(@PathVariable Long[] ruleIds){return toAjax(feeRuleService.deleteFeeRuleByRuleIds(ruleIds));} }
9.0 出场登记管理功能
相关源码:
@RestController @RequestMapping("/manage/exitRecord") public class ExitRecordController extends BaseController {@Autowiredprivate IExitRecordService exitRecordService;/*** 查询出场记录列表*/@PreAuthorize("@ss.hasPermi('manage:exitRecord:list')")@GetMapping("/list")public TableDataInfo list(ExitRecord exitRecord){startPage();List<ExitRecord> list = exitRecordService.selectExitRecordList(exitRecord);return getDataTable(list);}/*** 导出出场记录列表*/@PreAuthorize("@ss.hasPermi('manage:exitRecord:export')")@Log(title = "出场记录", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, ExitRecord exitRecord){List<ExitRecord> list = exitRecordService.selectExitRecordList(exitRecord);ExcelUtil<ExitRecord> util = new ExcelUtil<ExitRecord>(ExitRecord.class);util.exportExcel(response, list, "出场记录数据");}/*** 获取出场记录详细信息*/@PreAuthorize("@ss.hasPermi('manage:exitRecord:query')")@GetMapping(value = "/{exitId}")public AjaxResult getInfo(@PathVariable("exitId") Long exitId){return success(exitRecordService.selectExitRecordByExitId(exitId));}/*** 新增出场记录*/@PreAuthorize("@ss.hasPermi('manage:exitRecord:add')")@Log(title = "出场记录", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody ExitRecord exitRecord){return toAjax(exitRecordService.insertExitRecord(exitRecord));}/*** 修改出场记录*/@PreAuthorize("@ss.hasPermi('manage:exitRecord:edit')")@Log(title = "出场记录", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody ExitRecord exitRecord){return toAjax(exitRecordService.updateExitRecord(exitRecord));}/*** 删除出场记录*/@PreAuthorize("@ss.hasPermi('manage:exitRecord:remove')")@Log(title = "出场记录", businessType = BusinessType.DELETE)@DeleteMapping("/{exitIds}")public AjaxResult remove(@PathVariable Long[] exitIds){return toAjax(exitRecordService.deleteExitRecordByExitIds(exitIds));} }
10.0 用户信息管理功能
相关源码:
@RestController @RequestMapping("/system/user") public class SysUserController extends BaseController {@Autowiredprivate ISysUserService userService;@Autowiredprivate ISysRoleService roleService;@Autowiredprivate ISysDeptService deptService;@Autowiredprivate ISysPostService postService;/*** 获取用户列表*/@PreAuthorize("@ss.hasPermi('system:user:list')")@GetMapping("/list")public TableDataInfo list(SysUser user){startPage();List<SysUser> list = userService.selectUserList(user);return getDataTable(list);}@Log(title = "用户管理", businessType = BusinessType.EXPORT)@PreAuthorize("@ss.hasPermi('system:user:export')")@PostMapping("/export")public void export(HttpServletResponse response, SysUser user){List<SysUser> list = userService.selectUserList(user);ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);util.exportExcel(response, list, "用户数据");}@Log(title = "用户管理", businessType = BusinessType.IMPORT)@PreAuthorize("@ss.hasPermi('system:user:import')")@PostMapping("/importData")public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception{ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);List<SysUser> userList = util.importExcel(file.getInputStream());String operName = getUsername();String message = userService.importUser(userList, updateSupport, operName);return success(message);}@PostMapping("/importTemplate")public void importTemplate(HttpServletResponse response){ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);util.importTemplateExcel(response, "用户数据");}/*** 根据用户编号获取详细信息*/@PreAuthorize("@ss.hasPermi('system:user:query')")@GetMapping(value = { "/", "/{userId}" })public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId){userService.checkUserDataScope(userId);AjaxResult ajax = AjaxResult.success();List<SysRole> roles = roleService.selectRoleAll();ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));ajax.put("posts", postService.selectPostAll());if (StringUtils.isNotNull(userId)){SysUser sysUser = userService.selectUserById(userId);ajax.put(AjaxResult.DATA_TAG, sysUser);ajax.put("postIds", postService.selectPostListByUserId(userId));ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));}return ajax;}/*** 新增用户*/@PreAuthorize("@ss.hasPermi('system:user:add')")@Log(title = "用户管理", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@Validated @RequestBody SysUser user){if (!userService.checkUserNameUnique(user)){return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");}else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)){return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");}else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)){return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");}user.setCreateBy(getUsername());user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));return toAjax(userService.insertUser(user));}/*** 修改用户*/@PreAuthorize("@ss.hasPermi('system:user:edit')")@Log(title = "用户管理", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@Validated @RequestBody SysUser user){userService.checkUserAllowed(user);userService.checkUserDataScope(user.getUserId());if (!userService.checkUserNameUnique(user)){return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");}else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)){return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");}else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)){return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");}user.setUpdateBy(getUsername());return toAjax(userService.updateUser(user));}/*** 删除用户*/@PreAuthorize("@ss.hasPermi('system:user:remove')")@Log(title = "用户管理", businessType = BusinessType.DELETE)@DeleteMapping("/{userIds}")public AjaxResult remove(@PathVariable Long[] userIds){if (ArrayUtils.contains(userIds, getUserId())){return error("当前用户不能删除");}return toAjax(userService.deleteUserByIds(userIds));}/*** 重置密码*/@PreAuthorize("@ss.hasPermi('system:user:resetPwd')")@Log(title = "用户管理", businessType = BusinessType.UPDATE)@PutMapping("/resetPwd")public AjaxResult resetPwd(@RequestBody SysUser user){userService.checkUserAllowed(user);userService.checkUserDataScope(user.getUserId());user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));user.setUpdateBy(getUsername());return toAjax(userService.resetPwd(user));}/*** 状态修改*/@PreAuthorize("@ss.hasPermi('system:user:edit')")@Log(title = "用户管理", businessType = BusinessType.UPDATE)@PutMapping("/changeStatus")public AjaxResult changeStatus(@RequestBody SysUser user){userService.checkUserAllowed(user);userService.checkUserDataScope(user.getUserId());user.setUpdateBy(getUsername());return toAjax(userService.updateUserStatus(user));}/*** 根据用户编号获取授权角色*/@PreAuthorize("@ss.hasPermi('system:user:query')")@GetMapping("/authRole/{userId}")public AjaxResult authRole(@PathVariable("userId") Long userId){AjaxResult ajax = AjaxResult.success();SysUser user = userService.selectUserById(userId);List<SysRole> roles = roleService.selectRolesByUserId(userId);ajax.put("user", user);ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));return ajax;}/*** 用户授权角色*/@PreAuthorize("@ss.hasPermi('system:user:edit')")@Log(title = "用户管理", businessType = BusinessType.GRANT)@PutMapping("/authRole")public AjaxResult insertAuthRole(Long userId, Long[] roleIds){userService.checkUserDataScope(userId);userService.insertUserAuth(userId, roleIds);return success();}/*** 获取部门树列表*/@PreAuthorize("@ss.hasPermi('system:user:list')")@GetMapping("/deptTree")public AjaxResult deptTree(SysDept dept){return success(deptService.selectDeptTreeList(dept));} }
11.0 SQL 数据库设计
CREATE TABLE vehicle (vehicle_id INT AUTO_INCREMENT,license_plate VARCHAR(20) NOT NULL UNIQUE COMMENT '车牌号',vehicle_type INT COMMENT '车型: 1-轿车, 2-SUV, 3-MPV',user_id INT NOT NULL COMMENT '用户ID (逻辑外键,关联到User表)',contact_info VARCHAR(100) COMMENT '联系方式',PRIMARY KEY (vehicle_id) ) COMMENT='车辆信息表';INSERT INTO vehicle (license_plate, vehicle_type, user_id, contact_info) VALUES ('A123BC', 1, 1, 'john.doe@example.com'), -- 用户ID 1 的轿车 ('B456DE', 2, 1, 'john.doe@example.com'), -- 用户ID 1 的SUV ('C789FG', 3, 2, 'jane.smith@example.com'), -- 用户ID 2 的MPV ('D012HI', 1, 2, 'jane.smith@example.com'); -- 用户ID 2 的轿车CREATE TABLE parking_spot (spot_id INT AUTO_INCREMENT,spot_status INT DEFAULT 1 COMMENT '车位状态: 1-空闲, 2-占用, 3-预约',location VARCHAR(100) COMMENT '车位位置',PRIMARY KEY (spot_id) ) COMMENT='停车位表';CREATE TABLE vehicle (vehicle_id INT AUTO_INCREMENT,license_plate VARCHAR(20) NOT NULL UNIQUE COMMENT '车牌号',vehicle_type INT COMMENT '车型: 1-轿车, 2-SUV, 3-MPV',user_id INT NOT NULL COMMENT '用户ID (逻辑外键,关联到User表)',contact_info VARCHAR(100) COMMENT '联系方式',vehicle_image_path VARCHAR(255) COMMENT '车辆图片路径或URL',PRIMARY KEY (vehicle_id) ) COMMENT='车辆信息表';INSERT INTO vehicle (license_plate, vehicle_type, user_id, contact_info, vehicle_image_path) VALUES ('ABC123', 1, 1, 'John Doe, 123-456-7890', '/images/vehicles/abc123.jpg'), ('XYZ456', 2, 1, 'Jane Smith, 987-654-3210', '/images/vehicles/xyz456.jpg'), ('JKL789', 3, 2, 'Alice Johnson, 555-555-5555', '/images/vehicles/jkl789.jpg'), ('MNO012', 1, 2, 'Bob Brown, 111-222-3333', '/images/vehicles/mno012.jpg');INSERT INTO parking_spot (spot_status, location) VALUES (1, 'A座 - 一层 - 车位 1'), (1, 'A座 - 一层 - 车位 2'), (2, 'A座 - 一层 - 车位 3'), (1, 'A座 - 一层 - 车位 4'), (3, 'B座 - 一层 - 车位 1'), (1, 'B座 - 一层 - 车位 2'), (2, 'B座 - 一层 - 车位 3'), (1, 'C座 - 一层 - 车位 1'), (3, 'C座 - 一层 - 车位 2'), (2, 'C座 - 一层 - 车位 3');CREATE TABLE entry_record (entry_id INT AUTO_INCREMENT comment '自增ID',vehicle_id INT NOT NULL COMMENT '车辆ID (逻辑外键,关联到vehicle表)',entry_time DATETIME COMMENT '入场时间',spot_id INT COMMENT '分配的车位ID (逻辑外键,关联到parking_spot表)',is_reserved INT DEFAULT 1 COMMENT '1表示预约入场、2表示非预约入场',PRIMARY KEY (entry_id) ) COMMENT='入场记录表';CREATE TABLE fee_rule (rule_id INT AUTO_INCREMENT,vehicle_type INT COMMENT '车型: 1-轿车, 2-SUV, 3-MPV',base_fee DECIMAL(8,2) COMMENT '基础费用',additional_fee_per_hour DECIMAL(8,2) COMMENT '每小时额外费用',PRIMARY KEY (rule_id) ) COMMENT='收费规则表';CREATE TABLE reservation (reservation_id INT AUTO_INCREMENT comment '预约表ID',vehicle_id INT NOT NULL COMMENT '车辆ID (逻辑外键,关联到vehicle表)',spot_id INT NOT NULL COMMENT '车位ID (逻辑外键,关联到parking_spot表)',start_time DATETIME NOT NULL COMMENT '预约开始时间',end_time DATETIME NOT NULL COMMENT '预约结束时间',status INT DEFAULT 1 COMMENT '预约状态: 1-已确认, 2-已取消',PRIMARY KEY (reservation_id) ) COMMENT='预约记录表';INSERT INTO fee_rule (vehicle_type, base_fee, additional_fee_per_hour) VALUES (1, 50.00, 10.00), -- 轿车, 基础费用50.00元, 每小时额外费用10.00元 (2, 80.00, 15.00), -- SUV, 基础费用80.00元, 每小时额外费用15.00元 (3, 100.00, 20.00); -- MPV, 基础费用100.00元, 每小时额外费用20.00元CREATE TABLE exit_record (exit_id INT AUTO_INCREMENT COMMENT '出场ID',vehicle_id INT NOT NULL COMMENT '车辆ID (逻辑外键,关联到vehicle表)',exit_time DATETIME COMMENT '出场时间',fee_charged DECIMAL(8,2) COMMENT '收费金额',is_reserved BOOLEAN DEFAULT FALSE COMMENT '是否基于预约入场',PRIMARY KEY (exit_id) ) COMMENT='出场记录表';
若需要项目完整源码,可以在 CSDN 私信给我,我每天都有查看消息的,感谢大家支持,希望可以帮助到大家!
相关文章:

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:智行无忧停车场管理系统(前后端源码 + 数据库 sql 脚本)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 项目介绍 1.1 项目功能 2.0 用户登录功能 3.0 首页界面 4.0 车辆信息管理功能 5.0 停车位管理功能 6.0 入场登记管理功能 7.0 预约管理功能 8.0 收费规则功能 9.0…...
微服务的负载均衡可以通过哪些组件实现
微服务的负载均衡可以通过多种组件来实现,以下是一些常见的负载均衡组件及其特点: Nginx: Nginx是一款轻量级的HTTP和反向代理服务器,也是一个高性能的负载均衡器。它支持多种负载均衡算法,如轮询、加权轮询、IP哈希等…...
Spring Boot 支持哪些云环境?
Spring Boot 对云环境的支持非常广泛,它本身是为云原生应用设计的,能够很好地与多种云平台集成。以下是小编给大家列举的一些 Spring Boot 支持的一些主要云环境: Pivotal Cloud Foundry: Pivotal 是 Spring Boot 的创建者&#x…...

第31天:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测
时间轴: 演示案例: 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 打包器-WebPack-使用&安全 参考:https://mp.weixin.qq.com/s/J3bpy-SsCnQ1lBov1L98WA Webpack 是一个模块打包器。在 Webpack 中会将前端的所有资源…...

word如何快速创建目录?
文章目录 1,先自己写出目录的各级标题。2、选中目标标题,然后给它们编号3、给标题按照个人需求开始分级4、插入域构建目录。4.1、利用快捷键插入域构建目录4.2、手动插入域构建目录 听懂掌声!学会了吗? 前提声明:我在此…...
关于linux 下的中断
1. /proc/irq/<irq_number>/ 下属性详解 在 Linux 系统中,每个中断号(IRQ)都有一个对应的目录 /proc/irq/<irq_number>/,包含与该中断相关的属性文件。这些文件用于查看和配置中断的具体行为。 以下是 /proc/irq/&l…...

两个畸变矩阵相乘后还是一个2*2的矩阵,有四个畸变元素。1、畸变矩阵吸收了法拉第矩阵。2、畸变矩阵也给法拉第旋转角带来模糊(求解有多种可能)
角度一;恢复畸变的时候也把法拉第旋转恢复了 角度二:求解法拉第旋转角的时候 前面乘的复系数的不同也会带来法拉第旋转角和畸变的不同解 注意:无论多少个畸变矩阵相乘,结果都是2*2的矩阵,也就是畸变参数可以减少…...

MCU利用单总线协议(1-wire)读取DHT11温湿度
第1章 硬件连接 硬件原理图 第2章 通讯过程 用户MCU发送一次开始信号,DHT11从低功耗模式转换到高速模式,DHT11等待主机开始信号结束。DHT11等待主机开始信号结束后,DHT11发送响应信号。DHT11发送响应信号后,紧接着送出40bit的数据…...

[保姆式教程]使用目标检测模型YOLO11 OBB进行旋转目标检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)
之前写了一个基于YOLOv8z做旋转目标检测的文章,内容写得不够好,内容也比较杂乱。现如今YOLO已经更新到11了,数据集也集齐了无人机和卫星的农业大棚,所以这次就写一个基于YOLO11 OBB的农业大棚旋转检测。 1. 下载源码配置环境 在h…...

【网络安全】网站常见安全漏洞 - 网站基本组成及漏洞定义
文章目录 引言1. 一个网站的基本构成2. 一些我们经常听到的安全事件3. 网站攻击者及其意图3.1 网站攻击者的类型3.2 攻击者的意图 4. 漏洞的分类4.1 按来源分类4.2 按危害分类4.3 常见漏洞与OWASP Top 10 引言 在当今的数字化时代,安全问题已成为技术领域不可忽视的…...
Redis——个人笔记留存
今日内容 1. redis1. 概念2. 下载安装3. 命令操作1. 数据结构4. 持久化操作5. 使用Java客户端操作redis Redis 1. 概念: redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQLNoSQL(NoSQL Not Only SQL),意即“不仅仅是SQL”,是…...

人工智能_大模型091_大模型工作流001_使用工作流的原因_处理复杂问题_多轮自我反思优化ReAct_COT思维链---人工智能工作笔记0236
# 清理环境信息,与上课内容无关 import os os.environ["LANGCHAIN_PROJECT"] "" os.environ["LANGCHAIN_API_KEY"] "" os.environ["LANGCHAIN_ENDPOINT"] "" os.environ["LANGCHAIN_TRACING_V…...
linux上jdk1.8安装elasticsearch6.8.5踩坑总结
先在windows上下载了elasticsearch8安装成功后,本来是想在linux上也安装一个一样的版本,然后发现各种启动不了,查了一天原来jdk版本不同,需要下载不同版本的elasticsearch,我测试了8,7,6&#x…...
Three.js教程_02场景、相机与渲染器全面解析
Three.js 场景、相机与渲染器全面解析 Three.js 是一个强大的 JavaScript 库,用于在网页上创建和渲染 3D 图形。本文将深入解析 Three.js 中的几个核心概念,并介绍它们的用法及拓展方法。内容包括场景、相机、渲染器、网格对象、光源、坐标轴、控制器和…...

【数据结构】动态规划-基础篇
针对动态规划问题,我总结了以下5步: 确定dp数组以及下标的含义; 递推公式; dp数组如何初始化; 遍历顺序; 打印dp数组(用来debug); 以上5步适用于任何动态规划问题&#x…...

opencv读取展示图片
import time import cv2 # 创建窗口 cv2.namedWindow(window, cv2.WINDOW_AUTOSIZE) # cv2.WINDOW_AUTOSIZE自动大小,不允许修改窗口大小 cat cv2.imread("./6.jpg", 0) # opencv默认读取bgr,0代表的是灰度图模式,1是彩色图 # 展示名字为window…...

网站访问统计A/B测试与数据分析
在网站运营中,访问统计和数据分析是优化用户体验和提高转化率的关键工具。A/B测试作为一种数据驱动的方法,能够帮助网站运营者验证设计和内容的有效性。A/B测试的基本原理是同时展示两个不同的版本(A和B),通过比较它们…...

前端开发 之 15个页面加载特效下【附完整源码】
文章目录 十二:铜钱3D圆环加载特效1.效果展示2.HTML完整代码 十三:扇形百分比加载特效1.效果展示2.HTML完整代码 十四:四色圆环显现加载特效1.效果展示2.HTML完整代码 十五:跷跷板加载特效1.效果展示2.HTML完整代码 十二ÿ…...

详解八大排序(六)------(三路划分,自省排序,归并排序外排序)
文章目录 1. 快排之三路划分1. 1 三路划分的诞生由来1. 2 三路划分的具体思路1. 3 代码实现 2. 快排之自省排序2. 1 自省排序的目的2. 2 自省排序的思路2. 3 自省排序的实现代码 3. 归并排序外排序3. 1 外排序介绍3. 2 归并排序外排序的思路3. 3 归并排序的实现代码 1. 快排之三…...
【Java从入门到放弃 之 从字节码的角度异常处理】
从字节码的角度异常处理 生成字节码Javap 命令的使用基本语法 字节码文件testTryCatchtestTryCatchFinallytestTryWithResource 如果大家对与java的异常使用还有问题或者还不太了解,建议先看一下我之前写的Java异常了解一下基本 的异常处理知识,再看这篇…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...