收藏点赞不迷路 关注作者有好处
项目编号:BS-XX-155
一,项目简介
近年来,随着国内都市化的发展,生产生活节奏变快、各种往来频繁。经济的高速发展催生出“懒人经济”。不想走出家门,饭菜可以送上门;不方便交水、电、气费,也可以让人代交;想买任何东西都可以让人替你去采购...繁忙、没有精力去处理一些事情,如今这些都已不再是难题。一些“代跑腿”业务在北京、上海等城市开始出现,并逐渐蔓延到中小城市。跑腿项目因为国内市场的需求而诞生。
为了让客户能有时间去处理更多的事情,为客户提供更加便捷的生活环境,类似于同城随叫随到这样的跑腿项目开始被提出并规划实施。同城随叫随到提出了“有事您动嘴,办事我跑腿,不论大事小事,只要是合理合法的事情,只要您需要跑腿,我们都可以代劳”,这样的服务宗旨,对于很多生活忙碌、需要跑腿服务的人来说,的确很诱人。
本项目分为四个系统:后台管理系统、前台系统、订单系统、登陆注册系统九,即前台用户查询房屋信息、登陆注册、发布跑腿订单信息、管理员信息管理、会员信息管理、用户信息。
后台管理系统:管理用户信息、订单、用户、前台内容等功能。具体有管理员管理、订单管理、订单信息更改、订单信息查询。
前台系统:用户可以在前台系统中进行注册、登录、浏览资源、首页、下单等操作。具体有首页资源展示、资源搜索、订单模块、用户模块。
订单系统:提供下单、查询订单、修改订单状态、定时处理订单搜索系统,
提供商品的搜索功能。
登录系统:为多个系统之间提供用户登录凭证以及查询登录用户的信息。
功能具体信息分析如下:
- 用户管理功能
表3-1 用户管理功能描述
功能名称 | 功能描述 |
用户信息注册 | 用户填写电话号码、邮箱、密码、验证码、注册成功 |
修改信息 | 用户可以修改自己的个人信息 |
注销用户 | 管理员可以注销用户 |
查询用户 | 管理员可以查询用户,用户自己也可以查看自己信息。 |
- 订单管理功能
表3-2 订单管理功能描述
功能名称 | 功能描述 |
添加订单 | 用户填写订单信息、选择订单种类、填写订单金额、上传订单图片、添加成功 |
修改订单状态 | 管理员可以修改订单状态和订单信息、用户可以修改订单信息 |
查询订单 | 用户可以查看自己的订单、管理员可以查询全部订单 |
订单删除 | 管理员可以删除订单、用户可以取消自己的订单 |
- 搜索模块功能
表3-3 搜索模块功能描述
功能名称 | 功能描述 |
订单标题名查询 | 在搜索框中输入订单标题名,点击搜索 |
订单分类名查询 | 在搜索框中输入订单类型名,点击搜索 |
- 管理员管理功能
表3-4 管理员管理功能描述
功能名称 | 功能描述 |
用户管理 | 对用户信息进行查看、修改、删除、添加操作 |
订单分类管理 | 对订单分类信息进行查看、删除、添加操作 |
订单管理 | 对订单信息进行查看、修改、删除、添加操作 |
3.2.2 性能需求
本系统为C/S架构,用户通过浏览器访问获取服务,为了确保用户服务的及时性,需要较为稳定的性能。
1.数据精确度
后台管理在进行订单或订单分类的增加、删除和修改等的操作时,不允许在同一时间内对同一条数据进行三次操作;后端业务在进行订单业务处理时,要求保证数据的一致性,确保数据库事务精确度。
2.时间特性:
用户登录注册响应时间大概在2秒左右;用户订单支付成功后,回调页面的响应时间大概在4秒左右。
大量用户访问时造成的高并发,系统对此响应时间10秒左右。
管理员对订单和订单分类的修改、删除、添加成功后,前台响应、重新渲染页面数据时间大概在3秒前后。
3.安全性
本系统已经设计的较为安全了,使用JWT对前端后端请求中不断传递的token具备一定的加密性,足够确保用户和数据的安全性和隐私性。
4.可维护性
本系统可以由开发人员继续维护,开发过程中,已经确保了代码的简洁与详细的注释。该系统配置在macOS上,后期可以配备在Windows、Linux操作系统上。
二,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
后台开发技术:Springboot+Mybatis
前台开发技术:Vue+ElementUI
三,系统展示
后台管理
用户管理
订单类型管理
订单管理
客户端操作界面
用户发布需求操作
四,核心代码展示
package cn.edu.jsu.zjj.running.admin.controller;
import cn.edu.jsu.zjj.running.admin.entity.Admin;
import cn.edu.jsu.zjj.running.admin.service.AdminService;
import cn.edu.jsu.zjj.running.utils.Result;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.HashMap;
/**
* 管理员表(Admin)表控制层
*
* @author znz
* @since 2022-10-26 10:49:28
*/
@RestController
@RequestMapping("admin")
public class AdminController {
/**
* 服务对象
*/
@Resource
private AdminService adminService;
/**
* 分页查询
*
* @param admin 筛选条件
* @return 查询结果
*/
@GetMapping
public Result<ResponseEntity<Page<Admin>>> queryByPage(Admin admin, Integer size,Integer page) {
PageRequest pageRequest = PageRequest.of(page, size);
Page<Admin> admins = this.adminService.queryByPage(admin, pageRequest);
return Result.success(ResponseEntity.ok(admins));
}
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@GetMapping("{id}")
public Result queryById(@PathVariable("id") Integer id) {
return this.adminService.queryById(id);
}
/**
* 新增数据
*
* @param admin 实体
* @return 新增结果
*/
@PostMapping
public Result add(Admin admin) {
return this.adminService.insert(admin);
}
/**
* 编辑数据
*
* @param admin 实体
* @return 编辑结果
*/
@PutMapping
public Result edit(Admin admin) {
return this.adminService.update(admin);
}
/**
* 修改密码
*
* @return 编辑结果
*/
@PutMapping("updatePwd")
public Result updatePwd(Integer aId,String oldPwd,String newPwd) {
return this.adminService.updatePwd(aId,oldPwd,newPwd);
}
/**
* 删除数据
*
* @param aId 主键
* @return 删除是否成功
*/
@DeleteMapping
public Result deleteById(Integer aId) {
return this.adminService.deleteById(aId);
}
//管理员登陆注册
@GetMapping("login")
public Result<HashMap<String, Object>> login(String acc, String pwd){
return adminService.login(acc,pwd);
}
@GetMapping("register")
public Result register(Admin admin){
return adminService.register(admin);
}
}
package cn.edu.jsu.zjj.running.apply.controller;
import cn.edu.jsu.zjj.running.apply.entity.Apply;
import cn.edu.jsu.zjj.running.apply.service.ApplyService;
import cn.edu.jsu.zjj.running.utils.Result;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* 用户申请跑腿表(Apply)表控制层
*
* @author znz
* @since 2022-10-26 10:50:46
*/
@RestController
@RequestMapping("apply")
public class ApplyController {
/**
* 服务对象
*/
@Resource
private ApplyService applyService;
/**
* 分页查询
* @param apply 筛选条件
* @return 查询结果
*/
@GetMapping
public Result<ResponseEntity<Page<Apply>>> queryByPage(Apply apply, Integer size, Integer page) {
PageRequest pageRequest = PageRequest.of(page,size);
Page<Apply> applies = this.applyService.queryByPage(apply,pageRequest);
return Result.success(ResponseEntity.ok(applies));
}
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@GetMapping("{id}")
public Result queryById(@PathVariable("id") Integer id) {
return this.applyService.queryById(id);
}
/**
* 新增数据
*
* @param apply 实体
* @return 新增结果
*/
@PostMapping
public Result add(Apply apply) {
return this.applyService.insert(apply);
}
/**
* 编辑数据
*
* @param apply 实体
* @return 编辑结果
*/
@PutMapping
public Result edit(Apply apply) {
return this.applyService.update(apply);
}
/**
* 删除数据
*
* @param id 主键
* @return 删除是否成功
*/
@DeleteMapping
public Result deleteById(Integer id) {
return this.applyService.deleteById(id);
}
}
package cn.edu.jsu.zjj.running.comment.controller;
import cn.edu.jsu.zjj.running.comment.entity.Comment;
import cn.edu.jsu.zjj.running.comment.service.CommentService;
import cn.edu.jsu.zjj.running.utils.Result;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* 评论表(Comment)表控制层
*
* @author makejava
* @since 2022-10-26 10:52:11
*/
@RestController
@RequestMapping("comment")
public class CommentController {
/**
* 服务对象
*/
@Resource
private CommentService commentService;
/**
* 分页查询
*
* @param comment 筛选条件
* @return 查询结果
*/
@GetMapping
public Result<ResponseEntity<Page<Comment>>> queryByPage(Comment comment, Integer size, Integer page) {
PageRequest pageRequest = PageRequest.of(page,size);
Page<Comment> comments = this.commentService.queryByPage(comment,pageRequest);
return Result.success(ResponseEntity.ok(comments));
}
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@GetMapping("{id}")
public Result queryById(@PathVariable("id") Integer id) {
return this.commentService.queryById(id);
}
/**
* 新增数据
*
* @param comment 实体
* @return 新增结果
*/
@PostMapping
public Result add(Comment comment) {
return this.commentService.insert(comment);
}
/**
* 编辑数据
*
* @param comment 实体
* @return 编辑结果
*/
@PutMapping
public Result edit(Comment comment) {
return this.commentService.update(comment);
}
/**
* 删除数据
*
* @param id 主键
* @return 删除是否成功
*/
@DeleteMapping
public Result deleteById(Integer id) {
return this.commentService.deleteById(id);
}
}
package cn.edu.jsu.zjj.running.order.controller;
import cn.edu.jsu.zjj.running.order.entity.Order;
import cn.edu.jsu.zjj.running.order.service.OrderService;
import cn.edu.jsu.zjj.running.utils.Encryption;
import cn.edu.jsu.zjj.running.utils.MailSend;
import cn.edu.jsu.zjj.running.utils.RandomUtil;
import cn.edu.jsu.zjj.running.utils.Result;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
/**
* 订单表(Order)表控制层
*
* @author PL
* @since 2022-10-26 10:52:50
*/
@RestController
@RequestMapping("order")
public class OrderController {
/**
* 服务对象
*/
private OrderService orderService;
private MailSend mailSend;
public OrderController(OrderService orderService, MailSend mailSend) {
this.orderService = orderService;
this.mailSend = mailSend;
}
/**
* 分页查询
*
* @param order 筛选条件
* @return 查询结果
*/
@GetMapping
public Result<ResponseEntity<Page<Order>>> queryByPage(Order order, Integer size, Integer page) {
PageRequest pageRequest = PageRequest.of(page, size);
Page<Order> orders = this.orderService.queryByPage(order, pageRequest);
return Result.success(ResponseEntity.ok(orders));
}
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@GetMapping("{id}")
public Result queryById(@PathVariable("id") Integer id) {
return this.orderService.queryById(id);
}
@GetMapping("queryByState")
public Result queryByState(Integer oState){
return this.orderService.queryByState(oState);
}
/**
* 新增数据
*
* @param order 实体
* @return 新增结果
*/
@PostMapping
public Result add(MultipartFile file,Order order) throws IOException {
return this.orderService.insert(file,order);
}
/**
* 编辑数据
*
* @param order 实体
* @return 编辑结果
*/
@PutMapping
public Result edit(Order order) {
return this.orderService.update(order);
}
/**
* 编辑数据
*
* @param image 实体
* @return 编辑结果
*/
@PostMapping("editImg")
public Result editImg(MultipartFile uploadFIle, Integer oId, String image) throws IOException {
return this.orderService.editImg(uploadFIle,oId,image);
}
/**
* 删除数据
*
* @param id 主键
* @return 删除是否成功
*/
@DeleteMapping
public Result deleteById(Integer id) {
return this.orderService.deleteById(id);
}
}
package cn.edu.jsu.zjj.running.user.controller;
import cn.edu.jsu.zjj.running.order.entity.Order;
import cn.edu.jsu.zjj.running.user.entity.User;
import cn.edu.jsu.zjj.running.user.service.UserService;
import cn.edu.jsu.zjj.running.utils.Encryption;
import cn.edu.jsu.zjj.running.utils.MailSend;
import cn.edu.jsu.zjj.running.utils.RandomUtil;
import cn.edu.jsu.zjj.running.utils.Result;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
/**
* 用户表(User)表控制层
*
* @author makejava
* @since 2022-10-26 11:01:13
*/
@RestController
@RequestMapping("user")
public class UserController {
/**
* 服务对象
*/
private UserService userService;
private MailSend mailSend;
public UserController(UserService userService, MailSend mailSend) {
this.userService = userService;
this.mailSend = mailSend;
}
/**
* 分页查询
*
* @param user 筛选条件
* @return 查询结果
*/
@GetMapping
public Result<ResponseEntity<Page<User>>> queryByPage(User user, Integer size,Integer page) {
PageRequest pageRequest =PageRequest.of(page,size);
Page<User> users = this.userService.queryByPage(user, pageRequest);
return Result.success(ResponseEntity.ok(users));
}
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@GetMapping("{id}")
public Result<User> queryById(@PathVariable("id") Integer id) {
return this.userService.queryById(id);
}
/**
* 新增数据
*
* @param user 实体
* @return 新增结果
*/
@PostMapping
public Result add(User user) {
return this.userService.insert(user);
}
/**
* 编辑数据
*
* @param user 实体
* @return 编辑结果
*/
@PutMapping
public Result edit(User user) {
return this.userService.update(user);
}
@PostMapping("editImg")
public Result editImg(MultipartFile uploadFIle,Integer uId , String uHeadImg) throws IOException {
return this.userService.editImg(uploadFIle,uId,uHeadImg);
}
/**
* 删除数据
*
* @param id 主键
* @return 删除是否成功
*/
@DeleteMapping
public Result deleteById(Integer id) {
return this.userService.deleteById(id);
}
@PostMapping("login")
public Result login(String acc,String pwd){
return userService.login(acc,pwd);
}
@PostMapping("register")
public Result register(User user){
return this.userService.register(user);
}
@PostMapping("verifyUser")
public Result verifyUser(User user, String uPassword2,String verifyCodeData,String Token){
if (user.getUEmail()==null||user.getUEmail().equals("")){
return Result.error("邮箱不能为空");
}
if (!user.getUPassword().equals(uPassword2)){
return Result.error("两次密码不一致");
}
PageRequest pageRequest = PageRequest.of(0, 1);
Page<User> users = this.userService.queryByPage(user, pageRequest);
if (users.getSize()>1) {
return Result.error("该邮箱或者手机号已被注册");
}
//判断有没有验证码
if (verifyCodeData!=null&&!verifyCodeData.equals("")&&Token!=null&&!Token.equals("")){
if (Encryption.getSah256(Encryption.getSah256(verifyCodeData)).equals(Token)){
userService.register(user);
}else {
return Result.error("验证码错误!");
}
}else {//没有验证码
if (Token!=null&&!Token.equals("")){
return Result.success("","请输入验证码");
}
String random = RandomUtil.random();
mailSend.send(user.getUEmail(),random);
return Result.success( Encryption.getSah256(Encryption.getSah256(random)),"没有验证码");
}
return Result.success("成功");
}
@PutMapping("updatePwd")
public Result updatePwd(Integer uId,String oldPwd,String newPwd){
return this.userService.updatePwd(uId,oldPwd,newPwd);
}
}
五,项目总结
过去在没有互联网+的时候,校内师生在校园生活工作的过程中总会存在些许不便或者碰到些许问题,比如需要打印一份东西但是打印店太远自己一时半会儿抽不开身又不太好意思去麻烦他人、或者是在宿舍想吃学校食堂的饭菜但苦于没有外卖平台能够配送、以及碰到文档处理的问题需要在各个教学楼之间来回跑动等。校内的同学老师都是靠着拜托他人或是自己亲力亲为来完成这样一个简单却又不得不花费时间精力来完成的小事上。
在跑腿系统的管理中,对于订单信息的管理是相当重要的,并且也是相当麻烦的,它是订单信息管理工作中一项常规性的工作。长期以来,这一类型的信息管理的工作量是相当巨大的,依靠人工来处理不仅仅浪费了大量的人力物力,而且由于人工管理存在着大量的不可预知性,因此实现跑腿订单信息的网络化势在必行。
本校内跑腿平台的开发定位于一个能够满足数据库管理软件,即具备一个数据库管理软件的基本功能,包括数据的增加,删除,修改,查询等,便于用户查看,操作,和查询订单信息。
此外,系统具有用户登录功能,不同用户有不同的权限,这样可以提高数据的安全性和可靠性。系统采用SSM设计模式与数据库相结合的手段进行开发,结构紧凑、运行速度快、操作简单,更因为拥有自己的源代码,所以保证了软件具有高度的保密、安全性。本系统就是为了解决校内跑题平台信息管理与广大校内师生需求信息量之间的不和谐,使订单信息管理向着规范化、简单化、高效化的方向发展。