当亲戚知道我是程序员后,对我一顿梭哈……

news2024/12/23 4:04:52

当亲戚知道我是程序员后:

有的让我修电脑;

有的让我PS;

有的让我扯网线;

有的让我搞路由器;

这次的亲戚,让我干起了老本行:软件开发。

他是做人力资源公司的,要让我开发个招聘系统,成本是一顿饭的钱!

一,系统技术栈

系统的技术栈采用的较多:

总体的框架是SpringBoot+Vue,数据库采用的Mysql。

第一个版本的话,未加微服务相关的技术,后面的话,会开发微服务相关的版本。
在这里插入图片描述

  1. 开发语言:Java
  2. JDK版本:JDK1.8
  3. 后端技术:SpingBoot , Mybatis-Plus
  4. 前端技术:Vue , Vuex , Axios , echarts , element-ui , tinymce
  5. 数据库:mysql 5.7(一定要5.7版本)
  6. 数据库工具:Navicat11
  7. 开发软件:idea
  8. Maven包:Maven3.3.9

二,运行说明:

  1. 本系统为前后端分离开发,recruit-sys是后端,recruit-web是前端。

  2. 开发环境下后端用idea打开,前端用vscode或webstorm打开

  3. 前端运行环境需要 node 12+,需要安装yarn
    前端运行步骤:

  1. 安装包依赖:yarn install
  2. 运行项目:yarn run serve
  3. 编译项目:yarn run build (若不需要编译忽略此步骤)
    (编译后根目录会生成dist文件夹,把dist文件夹放到nginx/html目录下,启动nginx即可访问编译后程序)
  1. 如果选择编译后运行,后端打成jar包运行,前端使用nginx运行(nginx程序包会随源码附送)
  2. 访问地址:
    http://localhost:8080/index

管理员用户:root
管理员密码:123456
求职者用户:zhangsan
求职者密码:1
招聘者用户:hr11
招聘者密码:1

三,系统的演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
亲戚请我吃了一顿饭,再让我继续开发!

还给我写了2页的bug问题。

四,系统的核心代码演示

给大家看下系统的核心代码演示,若想学习的,可以借鉴下

@Validated
@RestController
@RequestMapping("/recruit/admin")
@PermissionModule(value = "管理员")
public class AdminController {

    @Autowired
    private AdminService adminService;

    @Autowired
    private GroupService groupService;

    @GetMapping("/permission")
    @PermissionMeta(value = "查询所有可分配的权限")
    public Map<String, List<PermissionDO>> getAllPermissions() {
        return adminService.getAllStructuralPermissions();
    }

    @GetMapping("/users")
    @PermissionMeta(value = "查询所有用户")
    public PageResponseVO<UserInfoVO> getUsers(
            @RequestParam(name = "group_id", required = false)
            @Min(value = 1, message = "{group.id.positive}") Integer groupId,
            @RequestParam(name = "count", required = false, defaultValue = "10")
            @Min(value = 1, message = "{page.count.min}")
            @Max(value = 30, message = "{page.count.max}") Integer count,
            @RequestParam(name = "page", required = false, defaultValue = "0")
            @Min(value = 0, message = "{page.number.min}") Integer page) {
        IPage<UserDO> iPage = adminService.getUserPageByGroupId(groupId, count, page);
        List<UserInfoVO> userInfos = iPage.getRecords().stream().map(user -> {
            List<GroupDO> groups = groupService.getUserGroupsByUserId(user.getId());
            return new UserInfoVO(user, groups);
        }).collect(Collectors.toList());
        return PageUtil.build(iPage, userInfos);
    }


    @PutMapping("/user/{id}/password")
    @PermissionMeta(value = "修改用户密码")
    public UpdatedVO changeUserPassword(@PathVariable @Positive(message = "{id.positive}") Integer id, @RequestBody @Validated ResetPasswordDTO validator) {
        adminService.changeUserPassword(id, validator);
        return new UpdatedVO(4);
    }


    @DeleteMapping("/user/{id}")
    @PermissionMeta(value = "删除用户")
    public DeletedVO deleteUser(@PathVariable @Positive(message = "{id.positive}") Integer id) {
        adminService.deleteUser(id);
        return new DeletedVO(5);
    }


    @PutMapping("/user/{id}")
    @PermissionMeta(value = "管理员更新用户信息")
    public UpdatedVO updateUser(@PathVariable @Positive(message = "{id.positive}") Integer id, @RequestBody @Validated UpdateUserInfoDTO validator) {
        adminService.updateUserInfo(id, validator);
        return new UpdatedVO(6);
    }


    @GetMapping("/group")
    @PermissionMeta(value = "查询所有权限组及其权限")
    public PageResponseVO<GroupDO> getGroups(
            @RequestParam(name = "count", required = false, defaultValue = "10")
            @Min(value = 1, message = "{page.count.min}")
            @Max(value = 30, message = "{page.count.max}") Integer count,
            @RequestParam(name = "page", required = false, defaultValue = "0")
            @Min(value = 0, message = "{page.number.min}") Integer page) {
        IPage<GroupDO> iPage = adminService.getGroupPage(page, count);
        return PageUtil.build(iPage);
    }


    @GetMapping("/group/all")
    @PermissionMeta(value = "查询所有权限组")
    public List<GroupDO> getAllGroup() {
        return adminService.getAllGroups();
    }


    @GetMapping("/group/{id}")
    @PermissionMeta(value = "查询一个权限组及其权限")
    public GroupPermissionBO getGroup(@PathVariable @Positive(message = "{id.positive}") Integer id) {
        return adminService.getGroup(id);
    }


    @PostMapping("/group")
    @PermissionMeta(value = "新建权限组")
    public CreatedVO createGroup(@RequestBody @Validated NewGroupDTO validator) {
        adminService.createGroup(validator);
        return new CreatedVO(15);
    }

    @PutMapping("/group/{id}")
    @PermissionMeta(value = "更新一个权限组")
    public UpdatedVO updateGroup(@PathVariable @Positive(message = "{id.positive}") Integer id,
                                 @RequestBody @Validated UpdateGroupDTO validator) {
        adminService.updateGroup(id, validator);
        return new UpdatedVO(7);
    }


    @DeleteMapping("/group/{id}")
    @PermissionMeta(value = "删除一个权限组")
    public DeletedVO deleteGroup(@PathVariable @Positive(message = "{id.positive}") Integer id) {
        adminService.deleteGroup(id);
        return new DeletedVO(8);
    }

    @PostMapping("/permission/dispatch")
    @PermissionMeta(value = "分配单个权限")
    public CreatedVO dispatchPermission(@RequestBody @Validated DispatchPermissionDTO validator) {
        adminService.dispatchPermission(validator);
        return new CreatedVO(9);
    }


    @PostMapping("/permission/dispatch/batch")
    @PermissionMeta(value = "分配多个权限")
    public CreatedVO dispatchPermissions(@RequestBody @Validated DispatchPermissionsDTO validator) {
        adminService.dispatchPermissions(validator);
        return new CreatedVO(9);
    }


    @PostMapping("/permission/remove")
    @PermissionMeta(value = "删除多个权限")
    public DeletedVO removePermissions(@RequestBody @Validated RemovePermissionsDTO validator) {
        adminService.removePermissions(validator);
        return new DeletedVO(10);
    }
@RestController
@RequestMapping("/recruit/application")
@PermissionModule(value = "申请")
public class ApplicationController {

    @Autowired
    private ApplicationService applicationService;

    @Autowired
    private InterviewService interviewService;
    /**
     * 投递简历——添加申请
     * @return
     */
    @Logger(template = "投递简历")
    @PostMapping("")
    @GroupRequired
    @PermissionMeta(value = "投递简历")
    public CreatedVO create(@RequestBody ApplicationDO applicationDO) {
        applicationService.create(applicationDO);
        return new CreatedVO(7000);
    }

    /**
     * 根据申请id修改状态state
     * @param id
     * @param state
     * @return
     */
    @Logger(template = "处理简历")
    @PutMapping("/state/{id}")
    @GroupRequired
    @PermissionMeta(value = "申请审核")
    public UpdatedVO update(@PathVariable @Positive(message = "{id.positive}") Integer id, @RequestParam Integer state) {
        // 根据id查找申请
        ApplicationDO applicationDO = applicationService.getById(id);
        if (applicationDO == null) {
            throw new NotFoundException(70000);
        }
        // 更新申请状态
        applicationService.updateState(id, state);
        // 若简历通过则插入面试表,初始状态为0,未面试
        if(state==1){
            InterviewDO interviewDO=new InterviewDO();
            interviewDO.setResumeId(applicationDO.getResumeId());
            interviewDO.setHrId(applicationDO.getHrId());
            interviewDO.setUserId(applicationDO.getUserId());
            interviewDO.setCompanyId(applicationDO.getCompanyId());
            interviewDO.setPositionId(applicationDO.getPositionId());
            interviewDO.setStatus(0);
            interviewService.getBaseMapper().insert(interviewDO);
        }
        return new UpdatedVO(7100);
    }

    /**
     * 根据id撤销申请(只有未处理的申请才可以撤销,即state=0的申请才可以撤销)
     * @param id
     * @return
     */
    @Logger(template = "撤销职位申请")
    @DeleteMapping("/{id}")
    @GroupRequired
    @PermissionMeta(value = "撤销申请")
    public DeletedVO delete(@PathVariable @Positive(message = "{id.positive}") Integer id) {
        // 根据id查找申请
        ApplicationDO applicationDO = applicationService.getById(id);
        if (applicationDO == null) {
            throw new NotFoundException(70000);
        }
        applicationService.removeById(id);
        return new DeletedVO(7200);
    }

    /**
     * 根据用户id和职位id查询申请表,避免重复投递同个岗位
     * @param positionId
     * @param userId
     * @return
     */
    @GetMapping("")
    public Boolean get(@RequestParam Integer positionId, @RequestParam Integer userId) {
        QueryWrapper<ApplicationDO> wrapper = new QueryWrapper<>();
        wrapper.eq("position_id", positionId).eq("user_id", userId);
        ApplicationDO applicationDO = applicationService.getOne(wrapper);
        if (applicationDO == null) {
            return true;
        }
        return false;
    }

    /**
     * 根据hr_id查询该hr接收到的所有简历,并且根据state区分申请的状态
     * @param count
     * @param page
     * @param hrID
     * @param state
     * @return
     */
    @Logger(template = "查看应聘简历")
    @GetMapping("/page/{hrID}")
    @GroupRequired
    @PermissionMeta(value = "简历管理")
    public PageResponseVO<ApplicationResultDO> page(
            @RequestParam(name = "count", required = false, defaultValue = "10")
            @Min(value = 1, message = "{page.count.min}")
            @Max(value = 30, message = "{page.count.max}") Integer count,
            @RequestParam(name = "page", required = false, defaultValue = "0")
            @Min(value = 0, message = "{page.number.min}") Integer page,
            @PathVariable(value = "hrID") @Positive(message = "{id.positive}") Integer hrID,
            @RequestParam Integer state
    ) {
        return applicationService.getByHrId(count, page, hrID, state);
    }
@RestController
@RequestMapping("/api")
public class ChartController {

    @Autowired
    LogService logService;
    @Autowired
    UserService userService;
    @Autowired
    PositionService positionService;
    @Autowired
    ApplicationService applicationService;

    @GetMapping("/visits")
    public JSONObject getVisits() {
        return logService.getVisits();
    }

    @GetMapping("/users")
    public JSONObject getUsers() {
        return userService.getUsers();
    }

    @GetMapping("/jobs")
    public JSONObject getJobs() {
        return positionService.getJobs();
    }

    @GetMapping("/applications")
    public JSONObject getApplications() {
        return applicationService.getApplications();
    }
@RestController
@RequestMapping("/recruit/interview")
@PermissionModule(value = "面试")
public class InterviewController {

    @Autowired
    private InterviewService interviewService;

    @GetMapping("/page/{hrID}")
    @GroupRequired
    @PermissionMeta(value = "面试管理")
    public PageResponseVO<InterviewResultDO> page(
            @RequestParam(name = "count", required = false, defaultValue = "10")
            @Min(value = 1, message = "{page.count.min}")
            @Max(value = 30, message = "{page.count.max}") Integer count,
            @RequestParam(name = "page", required = false, defaultValue = "0")
            @Min(value = 0, message = "{page.number.min}") Integer page,
            @PathVariable(value = "hrID") @Positive(message = "{id.positive}") Integer hrID,
            @RequestParam Integer state
    ) {
        return interviewService.getByHrId(count, page, hrID);
    }

    @GetMapping("/page/find/{userId}")
    @GroupRequired
    @PermissionMeta(value = "我的面试")
    public PageResponseVO<InterviewResultDO> pageByUserId(
            @RequestParam(name = "count", required = false, defaultValue = "10")
            @Min(value = 1, message = "{page.count.min}")
            @Max(value = 30, message = "{page.count.max}") Integer count,
            @RequestParam(name = "page", required = false, defaultValue = "0")
            @Min(value = 0, message = "{page.number.min}") Integer page,
            @PathVariable(value = "userId") @Positive(message = "{id.positive}") Integer userId,
            @RequestParam Integer state
    ) {
        return interviewService.getByUserId(count, page, userId);
    }

    @PostMapping("/sendInterviewNotify")
    @GroupRequired
    @PermissionMeta(value = "面试管理")
    public UpdatedVO sendInterviewNotify(@RequestBody InterviewDO interviewDO){
        QueryWrapper<InterviewDO> wrapper = new QueryWrapper<>();
        wrapper.eq("id", interviewDO.getId());
        InterviewDO result = interviewService.getOne(wrapper);
        if (result == null) {
            throw new NotFoundException(41000);
        }
        result.setStatus(1);
        result.setAddress(interviewDO.getAddress());
        result.setMemo(interviewDO.getMemo());
        result.setTime(interviewDO.getTime());
        interviewService.updateById(result);
        return new UpdatedVO(4100);
    }

    @PostMapping("/updateInterviewResult")
    @GroupRequired
    @PermissionMeta(value = "面试管理")
    public UpdatedVO updateInterviewResult(@RequestBody InterviewDO interviewDO){
        QueryWrapper<InterviewDO> wrapper = new QueryWrapper<>();
        wrapper.eq("id", interviewDO.getId());
        InterviewDO result = interviewService.getOne(wrapper);
        if (result == null) {
            throw new NotFoundException(41000);
        }
        result.setStatus(interviewDO.getStatus());
        result.setComments(interviewDO.getComments());
        interviewService.updateById(result);
        return new UpdatedVO(4100);
    }

我是程序员小孟,如果觉得系统不错,欢迎点赞关注。点赞、转发多的话,我会把系统给大家开源!

点击下面可以联系我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark SQL数据源 - 基本操作

文章目录 一、案例演示读取Parquet文件二、在Spark Shell中演示课堂练习1、将4.1节的student.txt文件转换成student.parquet课堂练习2、读取student.parquet文件得到学生数据帧&#xff0c;并显示数据帧内容三、在IntelliJ IDEA里演示 一、案例演示读取Parquet文件 执行命令&a…

#提升开源项目质量与效率:使用 GitHub Actions 自动化流程

提升开源项目质量与效率&#xff1a;使用 GitHub Actions 自动化流程 简介&#xff1a; 在开源项目中&#xff0c;质量和效率是至关重要的因素。本文将介绍如何利用 GitHub Actions&#xff0c;结合 ChatGPT Code Review、Autofix、Codecov 和 Publish PyPI 四个强大的 Actio…

unbound配置cache服务器

unbound 安装unbound配置unbound生成DOT证书配置日志监听哪个IP允许哪些客户端查询配置转发DNSSEC开启domain-insecure生成密钥 检查配置查看缓存启动Unbound服务&#xff1a; 结果验证方法1&#xff1a;方法2: 排错方法 安装unbound 以下是将DNS over TLS&#xff08;DoT&…

一文吃透Spring集成MyBatis

个人主页&#xff1a; 几分醉意的CSDN博客_传送门 文章目录 &#x1f496;集成思路✨怎么使用MyBatis✨集成的步骤✨pom加入依赖✨创建MyBatis使用代码✨创建Service类✨创建Spring配置文件和测试集成MyBatis✨使用外部属性配置文件 &#x1f496;图书推荐 Java28岁了&#xff…

CRC校验(2):CRC32查表法详解、代码实现和CRC反转

对于现在的CPU来说&#xff0c;基本上都在硬件上实现了CRC校验。但我们还是想用软件来实现一下CRC的代码&#xff0c;这样可以更深入地理解里面的原理。所以这一节就来详细地解释如何使用查表法从软件上来实现CRC-32的校验。另外&#xff0c;CRC还有一种反转的情况&#xff0c;…

SpringCloud Ribbon负载均衡(十一)

前面搭建了初步例子&#xff0c;但是还没实现真正负载均衡&#xff0c;我们这里要先搞三个服务提供者集群&#xff0c;然后才能演示负载均衡&#xff0c;以及负载均衡策略&#xff1b; 新建项目microservice-student-provider-1002&#xff0c;microservice-student-provider-…

行星减速机优势有哪些?行星减速机五大优势

减速机是动力传动解决方案&#xff0c;通过选择高质量和高效率的变速箱&#xff0c;绝对可以提高整个动力传动系统的效率和性能。行星减速机有哪些优势呢&#xff1f; 1.保证灵活可靠的动力传动系统 减速机提供了广泛的功率和比率&#xff0c;使其成为许多行业的大多数应用的完…

代码随想录2刷|链表1.链表理论基础2移除链表元素3.设计链表4.翻转链表5.两两交换链表中的节点6.删除链表的倒数第N个节点7.链表相交8.环形链表lI

2移除链表元素 链接&#xff1a;力扣 一刷&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x…

Vue中如何进行地理位置搜索与地点选择

Vue中如何进行地理位置搜索与地点选择 随着移动互联网和定位技术的普及&#xff0c;地理位置搜索和地点选择成为了很多应用程序中必不可少的功能。在Vue中&#xff0c;我们可以使用一些开源的地图API和第三方组件来实现这些功能。本文将介绍如何在Vue中进行地理位置搜索和地点…

【北邮国院大三下】Logistics and Supply Chain Management 物流与供应链管理 Week3

北邮国院大三电商在读&#xff0c;随课程进行整理知识点。仅整理PPT中相对重要的知识点&#xff0c;内容驳杂并不做期末突击复习用。个人认为相对不重要的细小的知识点不列在其中。如有错误请指出。转载请注明出处&#xff0c;祝您学习愉快。 如需要pdf格式的文件请私信联系或…

gradlew test 失败

前言 在idea内执行./gradlew test&#xff0c;发现如下报错&#xff1a; Could not initialize class org.codehaus.groovy.runtime.InvokerHelper 分析 google了一堆&#xff0c;说要用groovy&#xff0c;可是我没有用groovy&#xff0c;以前也是正常启动的。后来无意发现&a…

游戏玩家的新大陆?小红书游戏内容场景洞察

2023年&#xff0c;如果你问年轻人他们在哪里讨论游戏&#xff1f;他们可能会提到一些平台&#xff0c;比如Steam、TapTap、B站、微博或者论坛。但是如果你向身边的女孩子询问&#xff0c;她们可能会惊喜地告诉你&#xff1a;小红书。 小红书平台一直给人的标签是是“美妆、旅…

UWB高精度实时定位系统源码(springboot+vue)

一、系统概况 UWB&#xff08;Ultra-wideband&#xff09;技术是一种无线载波通讯技术&#xff0c;它不采用正弦载波&#xff0c;而是利用纳秒级的非正弦波窄脉冲传输数据&#xff0c;因此其所占的频谱范围很宽。自主研发&#xff0c;最高定位精度可达10cm&#xff0c;具有高精…

数据库架构是否该随着公司估值一起变化?

原文&#xff5c;The growing pains of database architecture 作者&#xff5c;Tim Liang, Software Engineer at Figma 2020 年&#xff0c;因为 Figma 不断加入新功能&#xff0c;筹备第二条产品线和用户不断增长导致数据库流量每年以 3x 速度增长&#xff0c;我们的基础设…

将数组中指定位置的元素替换为指定值np.put()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将数组中指定位置的元素替换为指定值 np.put() 选择题 下列说法错误的是? import numpy as np a np.array([1, 2, 3]) print("【显示】a ", a) print("【执行】np.put(arr…

Spring Boot进阶(47):Spring Boot之集成Cache缓存 | 超级详细,建议收藏

1. 前言 今天&#xff0c;我们来聊聊缓存这个话题。身为开发者肯定都知道&#xff0c;程序的瓶颈绝大体现在于数据库方面&#xff0c;而内存读取远远快于硬盘&#xff0c;当并发上升到一定高度&#xff0c;一次又一次的重复请求数据导致大量时间耗费在数据库查询上&#xff0c;…

win10搭建hmailserver邮件服务器(hmailserver+phpstudy+roundcube)

环境安装&#xff1a;Mysqlhmailserverphpstudyroundcube 一、Mysql安装 官网下载链接&#xff1a;https://www.mysql.com/ zip安装包下载链接&#xff1a;https://dev.mysql.com/downloads/mysql/ 1、zip安装包安装 &#xff08;1&#xff09;下载合适版本的mysql zip包&…

LeetCode------ 相交链表

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;栏目介绍:<<刷题集>>用于记录,力扣,牛客等刷题网站上的刷…

EasyExcel 批量导出

文章目录 前言一、EasyExcel 导出封装二、食用步骤1.自定义excel样式2.导出数据 三、复杂excel导出3.1. 自定义复杂表头2. 多sheet 前言 上篇写了数据导入&#xff0c;本文补充一下EasyExcel 批量导出 包括常规excel和复杂excel 一、EasyExcel 导出封装 import com.alibaba.…

手把手教你如何解开安装UKUI的黑屏故障

手把手教你如何解开安装UKUI的黑屏故障 引子 作为一个不折腾不舒服斯基的Linuxer&#xff0c;我又开始安装配置开放欧拉操作系统了。这是国产自主安全可控的Linux发行版。欧拉发行版Linux的发起者就是干正经事的华为&#xff0c;比其它拉大旗扯虎皮的国产Linux低调务实多了。…