项目编号:BS-XX-121
一,项目简介
本项目基于Springboot+Vue开发实现一个建筑工地用料管理系统,基于前后端分离的方式来开发实现,符合现在主流的开发方式。主要功能模块包含:
材料管理:材料类型的增删改查处理
供货商管理:供货商的增删改查处理
生产商管理:材料生产商的增删改查处理
采购管理:包含采购审核、我的采购信息管理
库存管理:材料库存信息管理,新增材料后根据采购计划来进行导入库存
报价管理:导入供货商的材料报价清单EXCEL表格,也可以导出EXCEL
工地管理:包含建筑工地的基本信息管理和用料详情管理
系统管理:包含角色、权限和用户管理
另带有背景音乐在线播放功能
基本业务流程:先添加库存材料信息---》导入供应商报价清单---》生成采购计划(库存中操作点击采购)---》采购审批----》采购入库---》工具用料
二,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
后端开发技术:Springboot+Mybatis+SpringSecurity
前端开发技术:Vue+Element
三,系统展示
管理员登陆:
材料管理:
生产商和供应商管理
采购管理:采购审核
采购管理:我的采购信息管理
库存管理:先新增材料,再点采购根据报价清单生成采购计划,审核后入库
报价管理:
工地管理:
工地用料详情:
系统管理
权限分配:
操作员管理
四,核心代码展示
package com.znz.server.controller; import com.znz.server.common.constant.Constants; import com.znz.server.entity.Admin; import com.znz.server.entity.RespBean; import com.znz.server.entity.Role; import com.znz.server.service.IAdminService; import com.znz.server.service.IRoleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; /** * 操作员信息 * * @author znz * @since 2021-03-06 */ @Api(value = "操作员控制器", tags = {"操作员管理"}) @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController @RequestMapping("/system/admin") public class AdminController { private final IAdminService adminService; private final IRoleService roleService; @ApiOperation(value = "获取所有操作员") @GetMapping("/") public List<Admin> getAllAdmins(String keywords) { return adminService.getAllAdmins(keywords); } @ApiOperation(value = "更新操作员") @PutMapping("/") public RespBean updateAdmin(@RequestBody Admin admin) { if (adminService.updateById(admin)) { return RespBean.success(Constants.SUCCESS); } return RespBean.error(Constants.FAIL); } @ApiOperation(value = "删除操作员") @DeleteMapping("/{id}") public RespBean deleteAdmin(@PathVariable Integer id) { if (adminService.removeById(id)) { return RespBean.success(Constants.SUCCESS); } return RespBean.success(Constants.FAIL); } @ApiOperation(value = "获取所有角色") @GetMapping("/roles") public List<Role> getAllRoles() { return roleService.list(); } @ApiOperation(value = "更新操作员角色") @PutMapping("/role") public RespBean updateAdminRole(Integer adminId, Integer[] rids) { return adminService.updateAdminRole(adminId, rids); } }
package com.znz.server.controller; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.znz.server.common.core.BaseController; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; /** * 图片验证码 * @Author znz * @Date 21-3-6 下午8:59 * @Version 1.0 */ @Api(value = "验证码控制器", tags = {"验证码管理"}) @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController public class CaptchaController extends BaseController { private final DefaultKaptcha defaultKaptcha; /** * 生成验证码 * @param request * @param response */ @ApiOperation(value = "验证码") @GetMapping(value = "/captcha", produces = "image/jpeg") public void captcha(HttpServletRequest request, HttpServletResponse response) { // 定义response输出类型为image/jpeg类型 response.setDateHeader("Expires", 0); // Set standard HTTP/1.1 no-cache headers. response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); // Set IE extended HTTP/1.1 no-cache headers (use addHeader). response.addHeader("Cache-Control", "post-check=0, pre-check=0"); // Set standard HTTP/1.0 no-cache header. response.setHeader("Pragma", "no-cache"); // return a jpeg response.setContentType("image/jpeg"); // 获取验证码文本内容 String text = defaultKaptcha.createText(); logger.info("验证码内容: {}", text); // 方便登录验证时用request获取,参考AdminServiceImpl#login() request.getSession().setAttribute("captcha", text); // 生成图形验证码 BufferedImage image = defaultKaptcha.createImage(text); ServletOutputStream outputStream = null; try { outputStream = response.getOutputStream(); // 输出流输出图片, 格式为jpg ImageIO.write(image, "jpg", outputStream); outputStream.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (null != outputStream) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
package com.znz.server.controller; import com.znz.server.annotation.ApiLog; import com.znz.server.common.constant.Constants; import com.znz.server.entity.Admin; import com.znz.server.entity.AdminLoginParam; import com.znz.server.entity.RespBean; import com.znz.server.service.IAdminService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.security.Principal; /** * 登录验证 * @Author znz * @Date 21-3-6 下午5:03 * @Version 1.0 */ @Api(value = "登录控制器", tags = {"登录管理"}) @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController public class LoginController { private final IAdminService adminService; @ApiLog @ApiOperation(value = "登录之后返回token") @PostMapping("/login") public RespBean login(@RequestBody AdminLoginParam adminLoginParam, HttpServletRequest request) { return adminService.login(adminLoginParam.getUsername(), adminLoginParam.getPassword(), adminLoginParam.getCode(),request); } @ApiLog @ApiOperation(value = "获取当前登录用户信息") @GetMapping("/admin/info") public Admin getAdminInfo(Principal principal) { if (null == principal) { return null; } String username = principal.getName(); Admin admin = adminService.getAdminByUserName(username); admin.setPassword(null); // 设置用户角色 admin.setRoles(adminService.getRoles(admin.getId())); return admin; } @ApiOperation(value = "退出登录") @PostMapping("/logout") public RespBean logout() { return RespBean.success(Constants.LOGOUT); } }
package com.znz.server.controller; import com.znz.server.common.Result; import com.znz.server.common.constant.Constants; import com.znz.server.entity.MaterialCategory; import com.znz.server.entity.RespBean; import com.znz.server.entity.RespPageBean; import com.znz.server.service.IMaterialCategoryService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; /** * 材料分类Controller * @author znz * @since 2021-03-10 */ @Api(value = "材料分类控制器", tags = {"材料分类管理"}) @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController @RequestMapping("/material/materialCategory/mc") public class MaterialCategoryController { private final IMaterialCategoryService materialCategoryService; @ApiOperation(value = "条件分页") @GetMapping("/") public RespPageBean getMaterialCategoryPage(String materialCategoryName, @RequestParam(defaultValue = "1") Integer pageIndex, @RequestParam(defaultValue = "10") Integer pageSize) { return materialCategoryService.findMaterialCategoryByPage(materialCategoryName, pageIndex, pageSize); } @ApiOperation(value = "新增") @PostMapping("/") public RespBean addMaterialCategory(@RequestBody MaterialCategory materialCategory) { /** 日期处理 */ materialCategory.setCreateDate(LocalDateTime.now()); if (materialCategoryService.save(materialCategory)) { return RespBean.success(Constants.ADD_SUCCESS); } return RespBean.error(Constants.ADD_FAIL); } @ApiOperation(value = "更新") @PutMapping("/") public RespBean updateMaterialCategory(@RequestBody MaterialCategory materialCategory) { if (materialCategoryService.updateById(materialCategory)) { return RespBean.success(Constants.UPDATE_SUCCESS); } return RespBean.error(Constants.UPDATE_FAIL); } @ApiOperation(value = "根据id删除") @DeleteMapping("/{id}") public RespBean deleteMaterialCategory(@PathVariable Integer id) { if (materialCategoryService.removeById(id)) { return RespBean.success(Constants.DELETE_SUCCESS); } return RespBean.error(Constants.DELETE_FAIL); } @ApiOperation(value = "批量删除") @DeleteMapping("/") public RespBean deleteMaterialCategories(Integer[] ids) { if (materialCategoryService.removeByIds(Arrays.asList(ids))) { return RespBean.success(Constants.DELETE_SUCCESS); } return RespBean.error(Constants.DELETE_FAIL); } @ApiOperation(value = "查询列表") @GetMapping("/list") public Result list() { return new Result("1001", Constants.SELECT_SUCCESS, materialCategoryService.list()); } }
五,项目总结
项目界面清晰,通过AJAX进行异步交互,非常适合毕业使用。