news 2026/9/23 23:57:57

基于Vue+MySQL实现(Web)外包项目信息系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Vue+MySQL实现(Web)外包项目信息系统

外包项目信息系统

一、需求说明

外包比赛项目发布与任务管理系统:

1、 系统账号分为三类,均允许自行注册:发包方(发布项目、查看当前账号的项目详情与开发任务进度、验收项目)、承包方管理员(承包项目、查看已经承包的项目详情与开发任务进度、设置项目开发任务、分配任务)、承包方开发人员(查看当前分配的开发任务、完成任务、注:此类账号由承包方管理员创建)

2、 关于项目:创建时至少包含名称、项目说明、期望完成时间、项目需求文档(附件形式)等内容,此时状态为初始化,发布后改变为已发布,即允许承包方管理员在已发布项目列表中选择承包。一个项目只允许一个承包方承包。

3、 承包后,承包方管理员可创建开发人员账号,在承包项目中根据项目需求文档分解并创建开发任务,包含任务名称、开发内容、设计文档(附件形式)、预计人天、实际人天、开始时间、结束时间,状态为初始化。分配给开发人员后任务状态为已分配,并设置开始时间。

4、 开发人员完成开发后即可完成任务,需要设置任务状态为已完成,并设置结束时间,并计算实际人天(按照每日 8 小时计算,去掉周末)。

5、 当所有开发任务均已完成,承包方管理员可发起验收(项目状态改为待验收),发包方验证通过后项目即可验收通过(项目状态改为已验收)

6、 项目与开发任务查看功能:可查看所有项目信息(加入汇总字段:开发人数、实际人天数、项目开发开始与结束时间等)与其下的所有开发任务情况,并展示每个任务预计人天与实际人天对比,建议任务以卡片列表的形式展现。

发包方创建并发布项目,承包方承包项目后对开发人员进行任务分配,开发人员上传任务结果并填写任务完成时间完成任务,所有任务完成后承包方管理员对任务进行检查后上传项目工程发起验收,最后发包方验收项目。

二、系统功能说明

用户管理:

管理员类用户注册

找回密码

开发人员用户注册(承包方管理员进行开发人员的注册)

发包方管理员 sendadmin:

1.注册、找回、登录

2.创建项目、发布项目

3.未发布的项目可以删除、已发布但未被承包的项目可以撤回

4.查看未发布、已发布未被承包、开发中、待验收、已验收项目列表

5.以上各项目列表页均可根据项目名进行模糊查找

6.开发中项目列表页可查看项目开发进度

7.验收项目和已验收项目列表页可查看发人员名单、下载项目工程

8.验收项目功能

承包方管理员 readmin:

1.注册、找回、登录

2.承包项目

3.对承包的项目进行任务分配与开发人员的设置

4.查看待开发、开发中、等待检查、待验收、已验收项目列表

5.以上各项目列表页均可根据项目名进行模糊查找

6.开发中项目列表页可通过查看开发人员任务信息查看项目开发进度

7.待检查项目列表页可查看任务信息下载任务工程,上传项目工程并发起验收

8.待验收和已验收项目列表页可查看发人员名单、下载项目工程

开发人员 reuser:

1.登录

2.查看项目详情可下载项目需求文档

3.查看任务详情并可下载任务需求文档

3.完成任务后上传任务工程填写任务完成时间

4.查看已完成的任务并可下载任务工程

三.数据库设计

用户表 user:

字段名称

数据类型

字段

编号

bigint

id(主键)

用户名

varchar

name

密码 1

varchar

password

密码 2

varchar

repassword

身份证号

varchar

cardid

角色

varchar

role

管理员 id

bigint

leadid

项目表 projects:

字段名称

数据类型

字段

编号

bigint

Pid(主键)

名称

varchar

proname

期望完成时间

datetime

expecttime

项目需求文档

varchar

prodocument

状态

varchar

state

项目说明

varchar

proexplain

发包方 id

bigint

sendid

承包方 id

bigint

receiveid

发包方

varchar

sendname

承包方

varchar

rename

项目开始时间

datetime

pstarttime

项目完成时间

datetime

pendtime

预计人天

bigint

pexpectdays

实际人天

bigint

pfactdays

开发人数

bigint

devnumbers

已完成任务数

bigint

comnumbers

项目工程

varchar

finalpro

任务表 task:

字段名称

数据类型

字段

编号

bigint

tid

任务名

varchar

taskname

项目 id

bigint

pid

开发人员 id

bigint

uid

开发人员

varchar

username

开发人员密码

varchar

upassword

项目名

varchar

proname

承包方

varchar

rname

承包方 id

bigint

reid

任务状态

varchar

tstate

开发说明

varchar

taskexplain

任务设计文档

varchar

taskdocument

开始时间

datetime

starttime

完成时间

datetime

endtime

预计人天

bigint

expectdays

实际人天

bigint

factdays

任务工程

varchar

Taskupload

期望完成时间

varchar

Texpecttime

四、功能截图

登录界面

用户注册

找回密码

发包方管理端:

创建项目

未发布列表页

待承包列表页

开发中项目列表

待验收项目列表并验收项目

已验收项目列表

承包方管理端

项目信息发布网承包项目

待开发项目列表

任务分配

开发中

查看项目进度

检查项目上传工程并验收

待验收项目列表

已验收项目列表

开发人员端

查看项目信息

查看任务信息

完成任务

查看已完成的任务

E—R 图:

部分关键代码:

UserService 方法:

void create(User user); //创建用户 User getUser(long id); //用过id查找用户 User getUserCardid(String cardid); //用过cardid查找用户 User getUser(String name,String password); //通过用户名和密码查找用户 User getUser(String name); //通过用户名查找用户 ProjectsService部分方法: void create(Projects projects); //创建项目 List<Projects> getStartoneProjectList(Long sendid, String pstate); //获取当前用户未发布的项目列表 List<Projects> getStarttwoProjectList(Long receiveid, String pstate); //获取当前用户待承包的项目列表 Projects getProject(long pid); //根据项目pid查找项目 List<Projects> getProjectList(Long pid); //根据项目pid查找项目列表 int deleteProject(Long pid); //根据pid删除项目 List<Projects> getALLProjectList(String pstate); //获取所有已发布的项目列表 List<Projects> getALLdevProjectList(String pstate1 ,String pstate2 ,String pstate3 ,String pstate4); //获取所有正在开发的项目列表 List<Projects> getALLSenddevProjectList(Long sendid ,String pstate1 ,String pstate2); //获取所有已验收的项目列表 List<Projects> getLikeSendidStateList(Long sendid ,String pstate ,String proname); //模糊查询项目列表 List<Projects> getLikeSendtwoStateList(Long sendid ,String pstate1 ,String pstate2 ,String proname); //模糊查询项目列表 List<Projects> getLikereidStateList(Long receiveid ,String pstate ,String proname); //模糊查询项目列表

Task 部分方法:

void create(Task task); //创建任务 List<Task> getDeveloptaskList(Long id, String tstate); //获取当前用户未发布的项目列表 int CountTasknumbers(Long pid); //统计项目任务数量 Long CountTaskExpectdays(Long pid); //统计预计人天 Long CountTaskFactdays(Long pid); //统计实际人天 List<Task> getDevuserList(Long pid); //获取任务列表 Task getUsertTask(Long uid); //获取当前用户任务 Long CountCompletetask(Long pid, String tstate); //统计已完成任务数量 Long Countdays(Long uid); //计算实际人天 Task getMaxEndtime(Long pid); //找出最大完成时间 /** * 管理员注册 */ // @UserLoginToken @RequestMapping(value = "/registeradmins",method = RequestMethod.POST) public R<String> Registeradmin(@RequestBody User user){ if (user.getName().equals("")){ return R.fail("用户名不能为空"); } User user1 = service.getUser(user.getName()); User user2 = service.getUserCardid(user.getCardid()); if(user1 != null) { return R.fail("用户已存在"); } else if(user.getPassword().equals("")){ return R.fail("请设置密码"); } else if(!user.getPassword().equals(user.getRepassword())){ return R.fail("两次密码不一致"); } else if(user.getCardid().equals("")){ return R.fail("请输入身份证号"); } else if(user2 != null){ return R.fail("身份证号已存在"); } else if(user.getRole().equals("")){ return R.fail("请选择用户类型"); } else { user.setSalt(Hashkit.generateSalt(8)); user.setPassword(Hashkit.md5(user.getPassword()+user.getSalt())); service.create(user); return R.success("创建成功"); } } /** * 创建项目 */ @UserLoginToken @RequestMapping(value = "/createprojects",method = RequestMethod.POST) public R<String> Createproject(@RequestBody Projects projects, HttpServletRequest httpServletRequest){ //获取Token String token = httpServletRequest.getHeader("token"); //通过token获取当前用户的id Jws<Claims> jwt = Jwts.parser().setSigningKey(R.KEY).parseClaimsJws(token); Long sendid = jwt.getBody().get("id",Long.class); Date date = new Date(); java.sql.Date nowtime = new java.sql.Date(date.getTime()); if (projects.getProname().equals("")){ return R.fail("请设置项目名称"); } else if (projects.getExpecttime() == null){ return R.fail("请设置期望完成时间"); } else if ( nowtime.compareTo(projects.getExpecttime()) > -1){ return R.fail("期望完成时间应大于当前时间"); } else if (projects.getProdocument().equals("")){ return R.fail("请上传项目需求文档"); } else if (projects.getProexplain().equals("")){ return R.fail("请填写项目说明"); } else { User user = userService.getUser(sendid); projects.setSendid(sendid); projects.setSendname(user.getName()); projects.setPstate("未发布"); projectsService.create(projects); return R.success("项目创建成功"); } } /** * 创建任务 */ @UserLoginToken @RequestMapping(value = "/createtasks",method = RequestMethod.POST) public R<String> Createtask(@RequestBody Task task, HttpServletRequest httpServletRequest){ //获取Token String token = httpServletRequest.getHeader("token"); //通过token获取当前用户的id Jws<Claims> jwt = Jwts.parser().setSigningKey(R.KEY).parseClaimsJws(token); Long readminid = jwt.getBody().get("id",Long.class); Projects projects = projectsService.getProject(task.getPid()); if (task.getTaskname() == null){ return R.fail("请填写任务名"); } else if (task.getStarttime() == null){ return R.fail("请设置任务开始时间"); } else if ( projects.getPstarttime().compareTo(task.getStarttime()) > -1){ return R.fail("任务开始时间应大于项目开始时间"); } else if (task.getTexpecttime() == null){ return R.fail("请填写任务期望完成时间"); } else if ( task.getStarttime().compareTo(task.getTexpecttime()) > -1){ return R.fail("任务期望完成时间应大于任务开始时间"); } else if ( task.getTexpecttime().compareTo(projects.getExpecttime()) > -1){ return R.fail("任务期望完成时间应小于项目期望完成时间"); } else if (task.getTaskexplain() == null){ return R.fail("请填写任务说明"); } else if (task.getTaskdocument() == null){ return R.fail("请上传任务需求文档"); } else if (task.getUsername() == null){ return R.fail("请设置开发人员用户名"); } else if (task.getUpassword() ==null ){ return R.fail("请设置开发人员密码"); } User user =new User(); User user2 = userService.getUser(readminid); User user1 = userService.getUser(user2.getName()+task.getUsername()); if (user1 != null){ return R.fail("用户已存在"); } user.setName(task.getUsername()); user.setName(user2.getName()+user.getName()); user.setPassword(task.getUpassword()); user.setRepassword(task.getUpassword()); user.setLeadid(readminid); user.setRole("user"); user.setSalt(Hashkit.generateSalt(8)); user.setPassword(Hashkit.md5(user.getPassword()+user.getSalt())); task.setTstate("开发中"); userService.create(user); User user3 = userService.getUser(user.getName()); task.setUid(user3.getId()); task.setFactdays(0L); task.setExpectdays(task.getUid()); taskService.create(task); return R.success("任务创建成功"); } /** * 文件上传 */ @PostMapping("/uploadfile") @ResponseBody public String uoload(@RequestParam("file") MultipartFile file) throws IOException{ log.info("[文件类型]-[{}]",file.getContentType()); log.info("[文件名称]-[{}]",file.getOriginalFilename()); log.info("[文件大小]-[{}]",file.getSize()); //文件上传的目录 file.transferTo(new File("E:\\uploadproject\\"+file.getOriginalFilename())); return file.getOriginalFilename(); //Jws<Claims> jwt = Jwts.parser().setSigningKey(R.KEY).parseClaimsJws(token); } /** * 文件下载 */ @UserLoginToken @ResponseBody @RequestMapping(value = "/downloadfile/{prodocument}",method = RequestMethod.GET) public R<String> downloadfile(@PathVariable String prodocument) throws IOException { String url1 = "E:\\uploadproject\\"+prodocument;// 源文件路径 String url2 = "E:\\downloadproject\\"+prodocument; // 复制到目标路 FileInputStream in = new FileInputStream(new File(url1)); FileOutputStream out = new FileOutputStream(new File(url2)); byte[] buff = new byte[512]; int n = 0; while ((n = in.read(buff)) != -1) { out.write(buff, 0, n); } out.flush(); in.close(); out.close(); return R.success("已成功下载"+prodocument); }

♻️ 资源

大小:2.57MB

➡️资源下载:https://download.csdn.net/download/s1t16/87404253

注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/22 16:17:35

姿态估计避坑指南:没GPU也能跑的3种云端方案推荐

姿态估计避坑指南&#xff1a;没GPU也能跑的3种云端方案推荐 引言&#xff1a;当论文遇到GPU荒 实验室GPU排队两周起步&#xff0c;笔记本一跑姿态估计就死机&#xff0c;导师的进度催命符却越来越急——这是很多研究生做计算机视觉实验时的真实困境。姿态估计作为人体动作分…

作者头像 李华
网站建设 2026/9/21 20:02:21

AI如何帮你解决MSCOMCTL.OCX兼容性问题

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个Windows兼容性修复工具&#xff0c;主要功能&#xff1a;1. 自动检测系统是否缺少MSCOMCTL.OCX组件 2. 提供一键下载和注册该组件的功能 3. 对于无法注册的情况&#xff0…

作者头像 李华
网站建设 2026/9/20 21:10:35

告别手动调试:NGINX配置AI生成+自动测试工作流

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 生成一个对比报告&#xff1a;1. 传统方式下配置NGINX反向代理的步骤和时间估算&#xff1b;2. 使用快马平台AI生成的步骤和时间对比&#xff1b;3. 重点展示nginx -T测试命令在不…

作者头像 李华
网站建设 2026/9/23 9:41:15

零基础学Docker:第一个镜像的创建与运行

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 为完全不懂Docker的新手创建一个入门教程镜像&#xff0c;要求&#xff1a;1) 基于官方nginx镜像 2) 替换默认首页为显示Hello Docker!的简单HTML页面 3) 暴露80端口 4) 包含详细的…

作者头像 李华
网站建设 2026/9/22 1:17:40

告别繁琐!3种高效获取Postman旧版本的技巧

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个多功能Postman版本获取工具&#xff0c;集成三种获取方式&#xff1a;1)命令行交互工具 2)浏览器扩展插件 3)REST API服务。核心功能包括版本列表展示、条件筛选、下载加速…

作者头像 李华
网站建设 2026/9/20 21:07:11

用555488在10分钟内构建可运行产品原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 基于555488快速生成一个可演示的产品原型&#xff0c;要求&#xff1a;1. 识别555488作为产品核心参数&#xff1b;2. 实现一个简单的Web应用展示其功能&#xff08;如数字转换器、…

作者头像 李华