毕业设计:基于Springboot实现求职招聘,校园招聘系统

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:  本项目基于Springboot 开发实现了一个求职招聘网站,系统分为前端求职招聘和后台数据管理后台。主要分为四个角以:管理员,求职者,公司管理员,公司HR,不同的角色进入系统有不同的功能操作。用户身份可以在后台管理设定。系统功能完整,界面美观大方,适合做毕业设计使用。运行环境:开发工具:IDEA或ECLIPSE数据库:MYSQL+REDIS开发技术:Springboot+mybatis+mybatisPlus+shiro前端开发:AJAX+Jquery+layui2.1 功能需求2.1.1 系统划分

 作者主页:编程指南针

简介:Java领域优质创作者、CSDN博客专家  Java项目、简历模板、学习资料、面试题库、技术互助

文末获取源码

目录

一、项目概述.............................................................................................................. 3

二、需求分析.............................................................................................................. 3

2.1 功能需求............................................................................................................... 3

2.2 性能需求............................................................................................................. 10

三、数据库设计........................................................................................................ 10

3.1 实体关系图......................................................................................................... 10

3.2 数据库表设计...................................................................................................... 10

四、详细设计............................................................................................................ 10

4.1 登录设计............................................................................................................. 10

4.2 订单管理............................................................................................................. 11

五、系统界面............................................................................................................ 11

5.1相关界面.............................................................................................................. 11

六、心得体会............................................................................................................ 12

一,项目概述:

  项目编码:BS-PT-059

  本项目基于Springboot 开发实现了一个求职招聘网站,系统分为前端求职招聘和后台数据管理后台。主要分为四个角以:管理员,求职者,公司管理员,公司HR,不同的角色进入系统有不同的功能操作。用户身份可以在后台管理设定。系统功能完整,界面美观大方,适合做毕业设计使用。

运行环境:

开发工具:IDEA或ECLIPSE

数据库:MYSQL+REDIS

开发技术:Springboot+mybatis+mybatisPlus+shiro

前端开发:AJAX+Jquery+layui

2.1 功能需求

2.1.1 系统划分

image.gif编辑

2.1.1.1 用户角色划分

    1. 求职者

    登录本网站的一种用户,可以检索并查看网站入驻的公司及其发布的岗位信息,创建自己的简历,与招聘者进行联系。

      1. 应聘者

            2.1、HR

                   公司下的某一个HR,可以发布新岗位和取消自己发布的岗位招聘

            2.2、公司管理员

                   公司管理员,填写公司相关信息入驻网站后成为该角色,可以管理本公司发布的所有岗位,以及管理所有员工

      3、管理员

      可以查看站内相关数据,对私信、系统、设置进行管理。

      2.1.1.2 前台服务的用例图及说明

        1. 招聘者功能

        image.gif编辑

          1. 查看个人信息:查看自己账号的基本信息及修改
          2. 修改密码:修改自己账号的登录密码
          3. 私信:与求职者私信
          4. 公司入驻:如果是第一次登录该网站,用户可以输入公司信息,进行入驻网站,随后可发布岗位
          5. 岗位管理:对岗位进行发布、取消、编辑等操作
          6. 员工管理:权限允许的前提下,管理自己公司内所有的hr
          7. HR信息:查看自己的基本信息
            1. 求职者功能:

            image.gif编辑

              1. 查看个人信息:查看自己账号的基本信息及修改
              2. 修改密码:修改自己账号的登录密码
              3. 私信:对感兴趣岗位的HR进行联系
              4. 个人简历:创建自己的简历,供HR查看
              5. 搜索岗位:搜索自己感兴趣的岗位
              6. 搜索公司:搜索自己感兴趣的公司

              2.1.1.3 管理员后台用例图

              image.gif编辑

                1. 查看个人信息:查看自己账号的基本信息及修改
                2. 修改密码:修改自己账号的登录密码
                3. 公司管理:管理站内所有入驻的公司
                4. 用户管理:管理站内所有用户
                5. 岗位管理:管理站内所有岗位
                6. 简历管理:管理站内所有简历
                7. 数据字典:管理站内数据字典
                8. 私信管理:查看所有用户的聊天关系、聊天记录等 三、数据库设计
                  3.1 实体关系图
                  image.gif编辑
                  表结构暂略

                五、系统界面

                  1. 首页:

                  image.gif编辑

                  2.登录界面:

                  image.gif编辑

                  3.注册界面

                  image.gif编辑

                  4.岗位查看搜索

                  image.gif编辑

                  5.公司查看界面

                  image.gif编辑

                  6.HR管理界面

                  image.gif编辑

                  7.岗位管理界面

                  image.gif编辑

                  8.员工管理

                  image.gif编辑

                  9.个人简历

                  image.gif编辑

                  10.管理员后台管理

                  image.gif编辑

                  系统部分核心代码:

                  package com.iurac.recruit.controller;
                  import cn.hutool.core.date.DateUtil;
                  import cn.hutool.core.util.IdUtil;
                  import cn.hutool.core.util.ObjectUtil;
                  import cn.hutool.core.util.ReUtil;
                  import cn.hutool.core.util.StrUtil;
                  import com.iurac.recruit.entity.Job;
                  import com.iurac.recruit.entity.User;
                  import com.iurac.recruit.exception.ManageException;
                  import com.iurac.recruit.security.RedisCacheManager;
                  import com.iurac.recruit.service.UserService;
                  import com.iurac.recruit.util.ImageUtil;
                  import com.iurac.recruit.util.Result;
                  import com.iurac.recruit.util.SaltUtil;
                  import com.iurac.recruit.util.TableResult;
                  import com.iurac.recruit.vo.PageResultVo;
                  import com.sun.org.apache.regexp.internal.RE;
                  import com.sun.org.apache.xpath.internal.operations.Mult;
                  import org.apache.shiro.SecurityUtils;
                  import org.apache.shiro.authc.IncorrectCredentialsException;
                  import org.apache.shiro.authc.UnknownAccountException;
                  import org.apache.shiro.authc.UsernamePasswordToken;
                  import org.apache.shiro.authz.annotation.RequiresRoles;
                  import org.apache.shiro.crypto.hash.Md5Hash;
                  import org.apache.shiro.subject.Subject;
                  import org.springframework.beans.factory.annotation.Autowired;
                  import org.springframework.stereotype.Controller;
                  import org.springframework.ui.Model;
                  import org.springframework.web.bind.annotation.*;
                  import org.springframework.web.multipart.MultipartFile;
                  import javax.servlet.http.HttpSession;
                  import java.io.IOException;
                  import java.util.Objects;
                  @Controller
                  public class UserController {
                      @Autowired
                      private RedisCacheManager redisCacheManager;
                      @Autowired
                      private UserService userService;
                      @GetMapping({"/","/index"})
                      public String toIndex(Model model){
                          User user = (User) SecurityUtils.getSubject().getPrincipal();
                          if(ObjectUtil.isNotNull(user)){
                              model.addAttribute("userInfo",user);
                          }
                          return "index";
                      }
                      @GetMapping("/login")
                      public String toLogin(){
                          return "login";
                      }
                      @GetMapping("/register")
                      public String toRegister(){
                          return "register";
                      }
                      @PostMapping("/login")
                      @ResponseBody
                      public Result login(String username, String password, String code, HttpSession session) {
                          String codes = (String) session.getAttribute("KAPTCHA_SESSION_KEY");
                          if (StrUtil.hasBlank(codes)) {
                              throw new RuntimeException("验证码已超时!");
                          }
                          String msg = "";
                          try {
                              if (codes.equalsIgnoreCase(code)){
                                  //获取主体对象
                                  Subject subject = SecurityUtils.getSubject();
                                  subject.login(new UsernamePasswordToken(username, password));
                                  return Result.succ("登录成功");
                              }else{
                                  throw new RuntimeException("验证码错误!");
                              }
                          } catch (UnknownAccountException e) {
                              e.printStackTrace();
                              msg="用户名错误!";
                          } catch (IncorrectCredentialsException e) {
                              e.printStackTrace();
                              msg="密码错误!";
                          }catch (Exception e){
                              e.printStackTrace();
                              msg=e.getMessage();
                          }
                          return Result.fail(msg);
                      }
                      @GetMapping("logout")
                      public String logout() {
                          Subject subject = SecurityUtils.getSubject();
                          subject.logout();
                          return "login";
                      }
                      @PostMapping("/register")
                      @ResponseBody
                      public Result register(User user, @RequestParam("role")String role) throws Exception {
                          user.setImg("default.png");
                          userService.register(user,role);
                          return Result.succ("操作成功");
                      }
                      @PostMapping("/user/update")
                      @ResponseBody
                      public Result updateUserInfo(@RequestParam(value = "phone",required = false) String phone,
                                                   @RequestParam(value = "email",required = false) String email,
                                                   @RequestParam(value="imgFile",required = false) MultipartFile file) throws Exception {
                          User user = (User) SecurityUtils.getSubject().getPrincipal();
                          redisCacheManager.getCache("authenticationCacheName").remove(user);
                          if(!StrUtil.hasBlank(phone)){
                              if(ReUtil.isMatch("(13\\d|14[579]|15[^4\\D]|17[^49\\D]|18\\d)\\d{8}", phone)) {
                                  user.setPhone(phone);
                              }else {
                                  return Result.fail("请输入正确的手机号");
                              }
                          }
                          if(!StrUtil.hasBlank(email)){
                              if(ReUtil.isMatch("\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}", email)){
                                  user.setEmail(email);
                              }else {
                                  return Result.fail("请输入正确的邮箱地址");
                              }
                          }
                          if(ObjectUtil.isNotNull(file) && !file.isEmpty()){
                              String originalFileName = file.getOriginalFilename();
                              String imgName = user.getImg().equals("default.png")?ImageUtil.getFileName(originalFileName.substring(originalFileName.lastIndexOf("."))): user.getImg();
                              user.setImg(imgName);
                              ImageUtil.saveImage(file,user.getImg(),"userIcon");
                          }
                          if(!userService.updateById(user)){
                              return Result.fail("系统错误");
                          }
                          redisCacheManager.getCache("authenticationCacheName").put(user.getUsername(),user);
                          return Result.succ("操作成功");
                      }
                      @PutMapping("/user/updatePassword/{password}")
                      @ResponseBody
                      public Result updateUserInfo(@PathVariable("password") String password) throws Exception {
                          User user = (User) SecurityUtils.getSubject().getPrincipal();
                          if(ReUtil.isMatch("[\\S]{6,12}", password)) {
                              Md5Hash md5Hash = new Md5Hash(password,user.getSalt(),1024);
                              if(md5Hash.toHex().equals(user.getPassword())){
                                  return Result.fail("请输入新密码");
                              }
                              redisCacheManager.getCache("authorizationCacheName").remove(user.toString());
                              redisCacheManager.getCache("authenticationCacheName").remove(user);
                              user.setPassword(md5Hash.toHex());
                              System.out.println(user.getPassword());
                          }else {
                              return Result.fail("密码必须6到12位,且不能出现空格");
                          }
                          if(!userService.updateById(user)){
                              return Result.fail("系统错误");
                          }
                          redisCacheManager.getCache("authenticationCacheName").put(user.getUsername(),user);
                          return Result.succ("操作成功");
                      }
                      @RequiresRoles("admin")
                      @ResponseBody
                      @GetMapping("/user/getByCondition")
                      public TableResult<User> getByCondition(@RequestParam("page")Long page, @RequestParam("limit")Long limit,
                                                             @RequestParam("username")String username, @RequestParam("role")String role,
                                                             @RequestParam("startDate")String startDate, @RequestParam(value = "endDate",required = false)String endDate,
                                                             @RequestParam("locked")String locked){
                          PageResultVo<User> pageResultVo = userService.getByCondition(page,limit,username,role,locked,startDate,endDate);
                          return new TableResult(0,"",pageResultVo.getTotal(),pageResultVo.getRecords());
                      }
                      @RequiresRoles("admin")
                      @ResponseBody
                      @PostMapping("/user/save")
                      public Result saveUser(@RequestParam("username")String username, @RequestParam("role")String[] role,
                                               @RequestParam("password")String password, @RequestParam(value = "imgFile",required = false) MultipartFile file,
                                               @RequestParam("phone")String phone, @RequestParam("email")String email) throws IOException, ManageException {
                          if(StrUtil.hasEmpty(username,password,phone,email) || role.length<=0){
                              return Result.fail("请输入完整信息,避免输入空格");
                          }
                          if(!ReUtil.isMatch("[\\S]{6,12}", password)) {
                              return Result.fail("密码必须6到12位,且不能出现空格");
                          }
                          if(!ReUtil.isMatch("(13\\d|14[579]|15[^4\\D]|17[^49\\D]|18\\d)\\d{8}", phone)) {
                              return Result.fail("请输入正确的手机号");
                          }
                          if(!ReUtil.isMatch("\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}", email)){
                              return Result.fail("请输入正确的邮箱地址");
                          }
                          User user = new User();
                          user.setId(IdUtil.simpleUUID());
                          user.setUsername(username);
                          user.setCreateTime(DateUtil.now());
                          user.setSalt(SaltUtil.getSalt(8));
                          Md5Hash md5Hash = new Md5Hash(password, user.getSalt(), 1024);
                          user.setPassword(md5Hash.toHex());
                          user.setLocked("0");
                          user.setPhone(phone);
                          user.setEmail(email);
                          if(ObjectUtil.isNotNull(file) && !file.isEmpty()){
                              String originalFileName = file.getOriginalFilename();
                              user.setImg(ImageUtil.getFileName(originalFileName.substring(originalFileName.lastIndexOf("."))));
                              ImageUtil.saveImage(file,user.getImg(),"userIcon");
                          }else {
                              user.setImg("default.png");
                          }
                          userService.saveUser(user,role);
                          return Result.succ("操作成功");
                      }
                      @RequiresRoles("admin")
                      @ResponseBody
                      @PostMapping("/user/update/{id}")
                      public Result updateUser(@PathVariable("id")String id,@RequestParam("role")String[] role,
                                               @RequestParam("password")String password, @RequestParam(value = "imgFile",required = false) MultipartFile file,
                                               @RequestParam("phone")String phone, @RequestParam("email")String email) throws IOException, ManageException {
                          if(StrUtil.hasEmpty(password,phone,email) || role.length<=0){
                              return Result.fail("请输入完整信息,避免输入空格");
                          }
                          if(!ReUtil.isMatch("[\\S]{6,12}", password)) {
                              return Result.fail("密码必须6到12位,且不能出现空格");
                          }
                          if(!ReUtil.isMatch("(13\\d|14[579]|15[^4\\D]|17[^49\\D]|18\\d)\\d{8}", phone)) {
                              return Result.fail("请输入正确的手机号");
                          }
                          if(!ReUtil.isMatch("\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}", email)){
                              return Result.fail("请输入正确的邮箱地址");
                          }
                          User user = userService.getById(id);
                          redisCacheManager.getCache("authorizationCacheName").remove(user.toString());
                          redisCacheManager.getCache("authenticationCacheName").remove(user);
                          user.setSalt(SaltUtil.getSalt(8));
                          Md5Hash md5Hash = new Md5Hash(password, user.getSalt(), 1024);
                          user.setPassword(md5Hash.toHex());
                          user.setPhone(phone);
                          user.setEmail(email);
                          if(ObjectUtil.isNotNull(file) && !file.isEmpty()){
                              String originalFileName = file.getOriginalFilename();
                              user.setImg(ImageUtil.getFileName(originalFileName.substring(originalFileName.lastIndexOf("."))));
                              ImageUtil.saveImage(file,user.getImg(),"userIcon");
                          }
                          userService.updateUser(user,role);
                          return Result.succ("操作成功");
                      }
                      @RequiresRoles("admin")
                      @ResponseBody
                      @PostMapping("/user/delete/{id}")
                      public Result deleteUser(@PathVariable("id")String id) throws  ManageException {
                          userService.deleteUser(id);
                          return Result.succ("操作成功");
                      }
                      @RequiresRoles("admin")
                      @ResponseBody
                      @PostMapping("/user/lock/{id}")
                      public Result lockUser(@PathVariable("id")String id) throws  ManageException {
                          User user = userService.getById(id);
                          user.setLocked("1".equals(user.getLocked())?"0":"1");
                          userService.updateById(user);
                          return Result.succ("操作成功");
                      }
                  }

                  image.gif

                  package com.iurac.recruit.controller;
                  import cn.hutool.core.util.IdUtil;
                  import cn.hutool.core.util.ObjectUtil;
                  import cn.hutool.core.util.ReUtil;
                  import cn.hutool.core.util.StrUtil;
                  import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
                  import com.iurac.recruit.entity.Company;
                  import com.iurac.recruit.entity.Resume;
                  import com.iurac.recruit.entity.User;
                  import com.iurac.recruit.exception.ManageException;
                  import com.iurac.recruit.service.ResumeService;
                  import com.iurac.recruit.util.ImageUtil;
                  import com.iurac.recruit.util.Result;
                  import com.iurac.recruit.util.TableResult;
                  import com.iurac.recruit.vo.PageResultVo;
                  import org.apache.shiro.SecurityUtils;
                  import org.apache.shiro.authz.annotation.RequiresRoles;
                  import org.apache.shiro.authz.annotation.RequiresUser;
                  import org.springframework.beans.factory.annotation.Autowired;
                  import org.springframework.ui.Model;
                  import org.springframework.web.bind.annotation.*;
                  import org.springframework.stereotype.Controller;
                  import org.springframework.web.multipart.MultipartFile;
                  import java.io.IOException;
                  /**
                   * <p>
                   *  前端控制器
                   * </p>
                   *
                   * @author iurac
                   * @since 2021-06-03
                   */
                  @Controller
                  public class ResumeController {
                      @Autowired
                      private ResumeService resumeService;
                      @PostMapping("/resume/saveOrUpdate")
                      @ResponseBody
                      public Result saveOrUpdate(Resume resume,
                                                   @RequestParam(value="imgFile",required = false) MultipartFile file) throws Exception {
                          if(StrUtil.hasBlank(resume.getName(),resume.getTechnology(),resume.getSalary(), resume.getMajor(),resume.getJob(),
                                  resume.getIntroduction(),resume.getExperience(),resume.getCollege(),resume.getBirth(),resume.getEducation(),
                                  resume.getPolitical(),resume.getMarriage(),resume.getSex())){
                              return Result.fail("请输入完成信息,避免输入空格");
                          }
                          if(!ReUtil.isMatch("(13\\d|14[579]|15[^4\\D]|17[^49\\D]|18\\d)\\d{8}", resume.getPhone())) {
                              return Result.fail("请输入正确的手机号");
                          }
                          if(!ReUtil.isMatch("\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}", resume.getEmail())){
                              return Result.fail("请输入正确的邮箱地址");
                          }
                          User user = (User) SecurityUtils.getSubject().getPrincipal();
                          resume.setUserId(user.getId());
                          QueryWrapper<Resume> queryWrapper = new QueryWrapper<>();
                          queryWrapper.eq("user_id",user.getId());
                          Resume exitedResume = resumeService.getOne(queryWrapper);
                          resume.setPhoto("default.png");
                          boolean isUpdate = true;
                          if(ObjectUtil.isNull(exitedResume)){//判断是新增还是更新
                              resume.setId(IdUtil.simpleUUID());
                              isUpdate = false;
                          }else {
                              resume.setId(exitedResume.getId());
                              resume.setPhoto(exitedResume.getPhoto());
                          }
                          if(ObjectUtil.isNotNull(file) && !file.isEmpty()){
                              String originalFileName = file.getOriginalFilename();
                              String photoName = resume.getPhoto().equals("default.png")?ImageUtil.getFileName(originalFileName.substring(originalFileName.lastIndexOf("."))): resume.getPhoto();
                              resume.setPhoto(photoName);
                              ImageUtil.saveImage(file,resume.getPhoto(),"photo");
                          }
                          boolean flag = isUpdate?resumeService.updateById(resume):resumeService.save(resume);
                          if(flag){
                              return Result.succ("操作成功");
                          }else {
                              return Result.fail("系统错误");
                          }
                      }
                      @RequiresRoles("admin")
                      @ResponseBody
                      @GetMapping("/resume/getByCondition")
                      public TableResult<Resume> getByCondition(@RequestParam("page")Long page, @RequestParam("limit")Long limit,
                                                                 @RequestParam("username")String username){
                          PageResultVo<Resume> pageResultVo = resumeService.getByCondition(page,limit,username);
                          return new TableResult(0,"",pageResultVo.getTotal(),pageResultVo.getRecords());
                      }
                      @RequiresRoles("admin")
                      @ResponseBody
                      @PostMapping("/resume/update/{id}")
                      public Result updateResume(@PathVariable("id")String id, @RequestParam(value = "imgFile",required = false) MultipartFile file,
                                                 Resume resume) throws IOException {
                          if(StrUtil.hasEmpty(resume.getSex(),resume.getMarriage(),resume.getPolitical(),resume.getEducation(),
                                  resume.getEmail(),resume.getAge(),resume.getPhone(),resume.getName(),resume.getExperience(),
                                  resume.getTechnology(),resume.getSalary(),resume.getMajor(),resume.getIntroduction(),resume.getCollege(),
                                  resume.getBirth(),resume.getJob())){
                              return Result.fail("请输入完整信息,避免输入空格");
                          }
                          Resume exitedResume = resumeService.getById(id);
                          resume.setId(id);
                          resume.setUserId(exitedResume.getUserId());
                          resume.setPhoto(exitedResume.getPhoto());
                          if(ObjectUtil.isNotNull(file) && !file.isEmpty()){
                              String originalFileName = file.getOriginalFilename();
                              resume.setPhoto(ImageUtil.getFileName(originalFileName.substring(originalFileName.lastIndexOf("."))));
                              ImageUtil.saveImage(file,resume.getPhoto(),"companyIcon");
                          }
                          return resumeService.updateById(resume)?Result.succ("操作成功"):Result.fail("操作失败");
                      }
                      @RequiresRoles("admin")
                      @ResponseBody
                      @PostMapping("/resume/delete/{id}")
                      public Result deleteResume(@PathVariable("id")String id) {
                          resumeService.removeById(id);
                          return Result.succ("操作成功");
                      }
                      /**
                       *
                       * @param id  用户ID
                       * @param model
                       * @return
                       */
                      @RequiresUser
                      @GetMapping("/resume/detail/{id}")
                      public String detail(@PathVariable("id")String id, Model model) {
                          Resume resume = resumeService.getByUserId(id);
                          model.addAttribute("resumeInfo",resume);
                          return "service/detail_resume";
                      }
                  }

                  image.gif


                  相关实践学习
                  基于Redis实现在线游戏积分排行榜
                  本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
                  云数据库 Redis 版使用教程
                  云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
                  相关文章
                  |
                  3天前
                  |
                  XML Java 数据库连接
                  SpringBoot集成Flowable:打造强大的工作流管理系统
                  在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
                  19 1
                  |
                  12天前
                  |
                  JavaScript Java 项目管理
                  Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
                  基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
                  |
                  8天前
                  |
                  JavaScript NoSQL Java
                  CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
                  CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
                  25 0
                  |
                  27天前
                  |
                  JavaScript 安全 Java
                  如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
                  本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
                  132 1
                  |
                  2月前
                  |
                  前端开发 JavaScript Java
                  基于Java+Springboot+Vue开发的服装商城管理系统
                  基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
                  140 2
                  基于Java+Springboot+Vue开发的服装商城管理系统
                  |
                  2月前
                  |
                  前端开发 JavaScript Java
                  SpringBoot项目部署打包好的React、Vue项目刷新报错404
                  本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
                  214 1
                  |
                  11天前
                  |
                  JavaScript 安全 Java
                  如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
                  本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
                  92 62
                  |
                  9天前
                  |
                  JavaScript 安全 Java
                  如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
                  本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
                  25 2
                  |
                  2月前
                  |
                  前端开发 JavaScript Java
                  基于Java+Springboot+Vue开发的大学竞赛报名管理系统
                  基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
                  209 3
                  基于Java+Springboot+Vue开发的大学竞赛报名管理系统
                  |
                  28天前
                  |
                  JavaScript 安全 Java
                  如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
                  【10月更文挑战第8天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建并配置 Spring Boot 项目,实现后端 API 和安全配置。接着,使用 Ant Design Pro Vue 脚手架创建前端项目,配置动态路由和菜单,并创建相应的页面组件。最后,通过具体实践心得,分享了版本兼容性、安全性、性能调优等注意事项,帮助读者快速搭建高效且易维护的应用框架。
                  39 3
                  下一篇
                  无影云桌面