基于javaweb+mysql的springboot兼职平台系统(java+springboot+ssm+html+maven+ajax+mysql)
私信源码获取及调试交流
运行环境
Java≥8、MySQL≥5.7
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
管理员:后台管理
雇主:发布兼职任务、指派兼职人
兼职者:竞标接单
基于javaweb的SpringBoot兼职平台系统(java+springboot+ssm+html+maven+ajax+mysql)
一、项目运行 环境配置:
Jdk1.8 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)
项目技术:
HTML +Springboot+ SpringMVC + MyBatis + ThymeLeaf + JavaScript + JQuery + Ajax + maven等等.
// 退出登录,只需要删除存放在 session 中的 admin 信息即可
session.removeAttribute("admin");
// 重定向到登录页
return "redirect:/admin/login";
}
}
/**
* 文件上传控制器
*
* @Classname UploadController
* @see com.yuu.recruit.controller
*/
@Controller
public class UploadController {
private static final String ENDPOINT = "oss-cn-beijing.aliyuncs.com";
private static final String ACCESS_KEY_ID = "LTAI4Fzn8nSjZm7R1dA4G6kp";
private static final String ACCESS_KEY_SECRET = "5LfEnU4JlGHqViyhgZkzwYcyythV0F";
private static final String BUCKET_NAME = "ce11211";
/**
* 图片上传
*
* @param dropzFile
* @param request
* @return
*/
@PostMapping("upload")
@ResponseBody
public Map<String, Object> upload(MultipartFile dropzFile, HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> result = new HashMap<>();
* @return
*/
@GetMapping("settings/base")
public String settings(HttpSession session, Model model) {
// 获取 session 中的雇员信息
Employer employer = (Employer) session.getAttribute("employer");
model.addAttribute("employer", employer);
return "employer/settings_base";
}
/**
* 保存个人基本信息
*
* @param employer
* @return
*/
@PostMapping("settings/base/save")
public String saveBase(Employer employer, HttpSession session) {
// 更新个人信息到数据库
Employer currEmployer = employerService.save(employer);
// 更新 session 中的个人信息
session.setAttribute("employer", currEmployer);
return "redirect:/employer/settings/base";
}
/**
* 跳转到修改密码页
*
* @return
*/
@GetMapping("settings/password")
public String updatePass() {
return "employer/settings_pass";
}
/**
* 修改密码
*
* @param password 原来的密码
* @param newPassword 新密码
* @return
*/
@PostMapping("settings/password")
public String updatePass(String password, String newPassword, HttpSession session, RedirectAttributes redirectAttributes) {
// 查询雇员登录信息
Employer employer = (Employer) session.getAttribute("employer");
String msg = employerService.updatePass(employer.getId(), password, newPassword);
redirectAttributes.addFlashAttribute("msg", msg);
return "redirect:/employer/settings/password";
}
* @see com.yuu.recruit.controller
*/
@Controller
@RequestMapping("admin/employer")
public class AdminEmployerController {
@Resource
private EmployerService employerService;
/**
* 跳转到雇主列表页
*
* @return
*/
@GetMapping("")
public String taskCategory(Model model) {
// 查询所有雇主
List<Employer> employers = employerService.getAll();
// 设置到域对象中,提供给页面展示
model.addAttribute("employers", employers);
return "admin/employer";
}
}
/**
* 管理员登录拦截器,需要登录了才登录访问首页、列表页....
*
* @Classname AdminLoginInceptor
* @see com.yuu.recruit.interceptor
*/
public class AdminLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
// 从 session 中获取管理员登录信息
Admin admin = (Admin) session.getAttribute("admin");
// 未登录
private EmployeeService employeeService;
@Resource
private TaskService taskService;
/**
* 跳转到登录页面
*
* @return
*/
@GetMapping("login")
public String login() {
return "admin/login";
}
/**
* 管理员登录
*
* @param admin 管理员,在参数上使用实体类接收,可以自动接受 username,password 属性
* @return
*/
@PostMapping("login")
public String login(Admin admin, RedirectAttributes redirectAttributes, HttpSession session) {
// 调用 AdminService 处理登录的业务逻辑,返回一个 Admin 对象,如果为空登录失败,如果不为空登录成功
Admin currAdmin = adminService.login(admin);
// 如果为空,登录失败,返回一个消息给登录页面提示, RedirectAttributes 是重定向用于把消息存放在域对象中,供页面获取
if (currAdmin == null) {
// 将消息放入重定向的与对象中
redirectAttributes.addFlashAttribute("msg", "用户名或密码错误");
// 重定向到登录页
return "redirect:/admin/login";
}
// 如果 Admin 不为空,登录成功
else {
// 把管理员信息放入 session 中,保持管理员登录状态
session.setAttribute("admin", admin);
// 重定向到管理员首页
return "redirect:/admin/index";
}
}
/**
* 跳转到管理员首页
*
* @param model 用户将数据存放在域对象中的对象
* @return
*/
@GetMapping("index")
// 查询出未完成的订单
List<TaskVo> taskVos = taskService.getUnCompletedByEmployeeId(employee.getId());
// 放置到与对象中
model.addAttribute("tasks", taskVos);
// 跳转到待完成任务列表页
return "employee/uncompleted_task";
}
/**
* 雇员提交任务
*
* @param session
* @return
*/
@PostMapping("/task/submit")
@ResponseBody
public String submitTask(Long taskId, HttpSession session) {
// 获取雇员登录信息
Employee employee = (Employee) session.getAttribute("employee");
// 雇员提交信息
taskService.submitTask(employee.getId(), taskId);
return "任务提交成功 ,等待雇主确认!";
}
/**
* 跳转到我的竞标页面
*
* @param session
* @return
*/
@GetMapping("mybids")
public String myBid(HttpSession session, Model model) {
// 获取雇员登录信息
Employee employee = (Employee) session.getAttribute("employee");
// 查询所有未中标的信息
List<BidVo> bidVos = bidService.getNoBitByEmployeeId(employee.getId());
// 放置域对象中,供页面展示
model.addAttribute("bids", bidVos);
return "employee/my_bids";
}
/**
* 删除竞标信息
*
* @param bid
// 如果雇员登录了,查询出雇员收藏信息
Employee employee = (Employee) session.getAttribute("employee");
List<Long> bookMarkedIds = new ArrayList<>();
if (employee != null) {
// 查询雇员收藏信息
Long employeeId = employee.getId();
// 查询雇员收藏任务ID集合
bookMarkedIds = employeeBookmarkedService.getIdsByEmployeeId(employeeId);
}
// 查询出所有分类信息,因为选择分类的时候,需要分类信息
List<TaskCategoryVo> taskCategories = taskCategoryService.getAll();
// 调用 TaskService 进行分页查询,得到分页结果
PageResult<TaskVo> tasksPage = taskService.page(categoryId, key, page);
// 将查询结果放置到域对象中,供页面查询
model.addAttribute("taskCategories", taskCategories);
model.addAttribute("tasksPage", tasksPage);
// 将查询条件页放置到域对象中,方便页面读取
model.addAttribute("categoryId", categoryId);
model.addAttribute("key", key);
model.addAttribute("bookMarkedIds", bookMarkedIds);
return "task_list";
}
/**
* 跳转到任务详情页
*
* @param taskId 任务 ID
* @return
*/
@GetMapping("page")
public String page(@RequestParam(required = true) Long taskId, Model model) {
// 根据任务 ID 查询出任务详情
TaskVo taskVo = taskService.getById(taskId);
// 放入域对象中,提供给页面查询
model.addAttribute("task", taskVo);
return "task_page";
/**
* 雇主登录蓝机器
*
* @Classname EmployerLoginInterceptor
* @see com.yuu.recruit.interceptor
*/
public class EmployerLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
// 从 session 中获取雇员登录信息
Employer employer = (Employer) session.getAttribute("employer");
// 未登录
if (employer == null) {
// ajax 请求返回 401
if ("XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With"))) {
response.sendError(401);
}
// 普通请求
else {
// 跳转到登录页面
response.sendRedirect("/login");
}
return false;
}
return true;
}
}
/**
* 管理员雇员管理控制器
*
* @Classname AdminEmployeeController
* @see com.yuu.recruit.controller
*/
@Controller
@RequestMapping("admin/employee")
public class AdminEmployeeController {
@Resource
private EmployeeService employeeService;
/**
* 跳转到雇主列表页
*
* @return
*/
@GetMapping("")
public String taskCategory(Model model) {
// 查询所有分类
List<Employee> employees = employeeService.getAll();
// 设置到域对象中,提供给页面展示
model.addAttribute("employees", employees);
return "admin/employee";
}
}
/**
* 管理员雇主管理控制器
*
* 修改密码
*
* @param password 原来的密码
* @param newPassword 新密码
* @return
*/
@PostMapping("settings/password")
public String updatePass(String password, String newPassword, HttpSession session, RedirectAttributes redirectAttributes) {
// 查询雇员登录信息
Employer employer = (Employer) session.getAttribute("employer");
String msg = employerService.updatePass(employer.getId(), password, newPassword);
redirectAttributes.addFlashAttribute("msg", msg);
return "redirect:/employer/settings/password";
}
}
/**
* 系统首页控制器
*
* @Classname IndexController
* @see com.yuu.recruit.controller
*/
@Controller
public class IndexController {
@Resource
EmployeeBookmarked employeeBookmarked = employeeBookmarkedService.bookmarked(employee.getId(), taskId);
return employeeBookmarked;
}
/**
* 跳转到我的收藏页面
*
* @return
*/
@GetMapping("bookmarks")
public String bookmarks(HttpSession session, Model model) {
// 获取雇员登录信息
Employee employee = (Employee) session.getAttribute("employee");
// 获取收藏的任务集合
List<EmployeeBookmarkedVo> bookMarks = employeeBookmarkedService.getByEmployeeId(employee.getId());
// 放置到域对象中,方便页面展示
model.addAttribute("bookMarks", bookMarks);
return "employee/bookmarks";
}
/**
* 删除收藏任务
*
* @param taskId 任务 ID
* @return
*/
@PostMapping("bookmarks/remove")
@ResponseBody
public String bookmarks(Long taskId, HttpSession session) {
// 获取雇员登录信息
Employee employee = (Employee) session.getAttribute("employee");
// 删除收藏信息
employeeBookmarkedService.remove(employee.getId(), taskId);
return "删除收藏信息";
}
// 如果 accountType != 0 则为雇主注册
else {
// 先判断用户名是否注册过
Employer employer = employerService.getByUsername(username);
// 如果 employer 不为 null,说明该用户名已经被注册过了,不能注册
if (employer != null) {
// 设置到重定向的域对象中,供页面提示
redirectAttributes.addFlashAttribute("msg", "用户名已被注册");
// 重定向到注册页
return "redirect:/register";
}
// 用户名不存在,注册
employerService.register(username, password);
// 注册成功,重定向到注册页
return "redirect:/login";
}
}
/**
* 跳转到登录页
*
* @return
*/
@GetMapping("login")
public String login() {
return "login";
}
public IndexController() {
}
/**
* 用户登录,包括雇员和雇主,通过传过来的 accountType 判断
*
* @return
*/
@PostMapping("login")
public String login(Integer accountType, String username, String password, RedirectAttributes redirectAttributes, HttpSession session) {
// 如果传过来的 accountType 为 0 则为雇员登录
if (accountType == 0) {
// 雇员登录
Employee employee = employeeService.login(username, password);
// 如果雇员不为 null 登录成功
if (employee != null) {
// 将登录信息放入 session 中
session.setAttribute("employee", employee);
// 注销雇主登录信息
session.removeAttribute("employer");
// 重定向到首页
return "redirect:/index";
private static final String ACCESS_KEY_SECRET = "5LfEnU4JlGHqViyhgZkzwYcyythV0F";
private static final String BUCKET_NAME = "ce11211";
/**
* 图片上传
*
* @param dropzFile
* @param request
* @return
*/
@PostMapping("upload")
@ResponseBody
public Map<String, Object> upload(MultipartFile dropzFile, HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> result = new HashMap<>();
String fileName = dropzFile.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
String newName = UUID.randomUUID() + "." + suffix;
OSS client = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
try {
client.putObject(new PutObjectRequest(BUCKET_NAME, newName, new ByteArrayInputStream(dropzFile.getBytes())));
// 上传文件路径 = http://BUCKET_NAME.ENDPOINT/自定义路径/fileName
String filePath = "http://" + BUCKET_NAME + "." + ENDPOINT + "/" + newName;
result.put("filePath", filePath);
} catch (IOException e) {
e.printStackTrace();
} finally {
client.shutdown();
}
return result;
}
/**
* 文件上传
*
* @param uploadFile
* @param request
* @return
*/
@PostMapping("uploadFile")
@ResponseBody
public Map<String, Object> uploadFile(MultipartFile upload, HttpServletRequest request, HttpServletResponse response) {
// 查询出已完成的订单
List<TaskVo> taskVos = taskService.getCompletedByEmployeeId(employee.getId());
// 放置到域对象中
model.addAttribute("tasks", taskVos);
return "employee/completed_task";
}
/**
* 跳转到待完成任务
*
* @param session
* @param model
* @return
*/
@GetMapping("/task/uncompleted")
public String unCompletedTask(HttpSession session, Model model) {
// 获取雇员登录信息
Employee employee = (Employee) session.getAttribute("employee");
// 查询出未完成的订单
List<TaskVo> taskVos = taskService.getUnCompletedByEmployeeId(employee.getId());
// 放置到与对象中
model.addAttribute("tasks", taskVos);
// 跳转到待完成任务列表页
return "employee/uncompleted_task";
}
/**
* 雇员提交任务
*
* @param session
* @return
*/
@PostMapping("/task/submit")
@ResponseBody
public String submitTask(Long taskId, HttpSession session) {
// 获取雇员登录信息
Employee employee = (Employee) session.getAttribute("employee");
// 雇员提交信息
taskService.submitTask(employee.getId(), taskId);
return "任务提交成功 ,等待雇主确认!";
}
/**
* 跳转到我的竞标页面
*
if (employer == null) {
// ajax 请求返回 401
if ("XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With"))) {
response.sendError(401);
}
// 普通请求
else {
// 跳转到登录页面
response.sendRedirect("/login");
}
return false;
}
return true;
}
}
/**
* 系统登录拦截器
*
* @Classname LoginInceptor
* @see com.yuu.recruit.interceptor
*/
public class EmployeeLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
// 从 session 中获取雇员登录信息
Employee employee = (Employee) session.getAttribute("employee");
// 未登录
if (employee == null) {
// ajax 请求返回 401
if ("XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With"))) {
response.sendError(401);
}
@GetMapping("delete/{id}")
public String delete(@PathVariable Long id) {
taskCategoryService.delete(id);
return "redirect:/admin/task/category";
}
}
/**
* 雇员投标控制器
*
* @Classname EmployeeBidController
* @see com.yuu.recruit.controller
*/
@Controller
public class EmployeeBidController {
@Resource
private BidService bidService;
@Resource
private TaskService taskService;
/**
* 管理员管理任务分类控制器
*
* @Classname AdminTaskCategoryController
* @see com.yuu.recruit.controller
*/
@Controller
@RequestMapping("admin/task/category")
public class AdminTaskCategoryController {
@Resource
private TaskCategoryService taskCategoryService;
/**
* 跳转到任务分类列表页
*
* @return
*/
@GetMapping("")
public String taskCategory(Model model) {
// 查询所有分类
List<TaskCategoryVo> taskCategories = taskCategoryService.getAll();
// 设置到域对象中,提供给页面展示
model.addAttribute("taskCategories", taskCategories);
return "admin/task_category";
@GetMapping("delete/{id}")
public String delete(@PathVariable Long id) {
taskCategoryService.delete(id);
return "redirect:/admin/task/category";
}
}
/**
* 雇员投标控制器
*
* @Classname EmployeeBidController
* @see com.yuu.recruit.controller
*/
@Controller
public class EmployeeBidController {
@Resource
private BidService bidService;
@Resource
private TaskService taskService;
/**
* 雇员投标任务
*
* @param taskId 任务 ID
* @param bidPrice 投标价格