news 2026/3/30 15:38:50

基于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/3/28 4:29:44

AnimeGANv2实战:证件照转动漫风格技巧

AnimeGANv2实战&#xff1a;证件照转动漫风格技巧 1. 引言 1.1 业务场景描述 在社交媒体、虚拟形象设计和个性化头像制作中&#xff0c;将真实人物照片转换为二次元动漫风格的需求日益增长。尤其在证件照美化、社交平台头像生成等轻量级应用场景中&#xff0c;用户希望获得既…

作者头像 李华
网站建设 2026/3/26 3:16:04

AI如何帮你理解JavaScript闭包?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式JavaScript闭包学习工具&#xff0c;包含以下功能&#xff1a;1. 用自然语言解释闭包概念&#xff1b;2. 根据用户输入自动生成闭包代码示例&#xff1b;3. 提供可视…

作者头像 李华
网站建设 2026/3/22 5:10:06

快速验证:用Anaconda搭建Python开发环境

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 设计一个快速安装Anaconda的脚本&#xff0c;支持最小化安装和常用库的预配置。脚本应能在5分钟内完成安装并启动Jupyter Notebook&#xff0c;适合快速验证项目原型。使用AI优化安…

作者头像 李华
网站建设 2026/3/24 20:44:57

洛雪音乐源在实际项目中的集成与应用案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个示例项目&#xff0c;演示如何将洛雪音乐源集成到Python音乐播放器中。功能要求&#xff1a;1. 从洛雪音乐源获取歌曲列表&#xff1b;2. 实现基本的播放控制&#xff08;…

作者头像 李华
网站建设 2026/3/25 2:17:00

3分钟搞定!MSVCR120.DLL丢失的高效修复流程

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个极简DLL修复工具&#xff0c;核心功能&#xff1a;1. 极速扫描(3秒内完成) 2. 一键修复(自动选择最优方案) 3. 静默安装模式 4. 修复历史记录。要求使用C#开发&#xff0c…

作者头像 李华
网站建设 2026/3/25 17:05:18

AI如何帮你一键查询硬盘序列号?告别复杂CMD命令

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个智能硬盘信息查询工具&#xff0c;要求&#xff1a;1. 支持通过自然语言输入查询需求&#xff08;如帮我查C盘序列号&#xff09;2. 自动生成对应的CMD/PowerShell命令 3.…

作者头像 李华