外包项目信息系统
一、需求说明
外包比赛项目发布与任务管理系统:
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
注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!