news 2026/4/17 15:25:06

基于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/4/17 12:41:10

用锐捷模拟器10分钟搭建网络方案原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个锐捷模拟器快速原型生成器&#xff0c;能够根据用户输入的关键参数&#xff08;如设备数量、网络类型、带宽需求等&#xff09;自动生成可立即运行的基础网络原型。功能要…

作者头像 李华
网站建设 2026/4/18 11:06:40

CZKAWKA:AI如何革新重复文件清理工具开发

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于AI的重复文件清理工具&#xff0c;要求实现以下功能&#xff1a;1. 使用机器学习算法识别不同格式文件的相似内容 2. 支持图片、视频、文档的智能比对 3. 提供可视化重…

作者头像 李华
网站建设 2026/4/17 13:32:04

用KIRO 5分钟搭建一个电商网站原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个电商网站原型生成器&#xff0c;使用KIRO AI根据用户输入的产品类别和基本需求&#xff0c;自动生成包含商品展示、购物车和结账功能的网站原型。要求支持响应式设计&…

作者头像 李华
网站建设 2026/4/18 8:41:00

Keil5烧录程序STM32F103:手把手教程(从零实现)

从零开始&#xff1a;手把手教你用 Keil5 给 STM32F103 烧录程序你有没有过这样的经历&#xff1f;代码写得飞快&#xff0c;编译也没报错&#xff0c;信心满满点下“下载”按钮——结果弹窗跳出一行红字&#xff1a;“Cannot access target.”然后就是一顿查线、换电源、重装驱…

作者头像 李华
网站建设 2026/4/17 17:05:37

CORS入门指南:用快马平台轻松理解跨域原理

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式CORS学习演示应用。要求&#xff1a;1. 可视化展示CORS请求流程 2. 可动态修改CORS策略并立即看到效果 3. 包含常见错误案例演示 4. 提供修复建议 5. 界面友好有引导…

作者头像 李华
网站建设 2026/4/18 8:51:42

Git小白入门:用最简案例理解核心概念

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个渐进式Git学习应用&#xff0c;功能&#xff1a;1. 互动式命令行模拟器 2. 3D可视化仓库状态 3. 错误操作后果演示&#xff08;如强制推送警告&#xff09;4. 分步骤个人博…

作者头像 李华