commit:同步2.2版本

This commit is contained in:
Jerry
2022-01-23 21:00:54 +08:00
parent ff7e52eedb
commit 35ac62e4d2
1201 changed files with 16301 additions and 161770 deletions

View File

@@ -184,6 +184,16 @@ public interface CourseClient extends BaseClient<CourseDto, CourseVo, Long> {
@PostMapping("/course/aggregateBy")
ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam);
/**
* 根据过滤字段和过滤集合,返回不存在的数据。
*
* @param queryParam 查询参数。
* @return filterSet中在从表中不存在的数据集合。
*/
@Override
@PostMapping("/course/notExist")
ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam);
@Component("CourseClassCourseClientFallbackFactory")
@Slf4j
class CourseClientFallbackFactory

View File

@@ -184,6 +184,16 @@ public interface StudentClassClient extends BaseClient<StudentClassDto, StudentC
@PostMapping("/studentClass/aggregateBy")
ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam);
/**
* 根据过滤字段和过滤集合,返回不存在的数据。
*
* @param queryParam 查询参数。
* @return filterSet中在从表中不存在的数据集合。
*/
@Override
@PostMapping("/studentClass/notExist")
ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam);
@Component("CourseClassStudentClassClientFallbackFactory")
@Slf4j
class StudentClassClientFallbackFactory

View File

@@ -184,6 +184,16 @@ public interface StudentClient extends BaseClient<StudentDto, StudentVo, Long> {
@PostMapping("/student/aggregateBy")
ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam);
/**
* 根据过滤字段和过滤集合,返回不存在的数据。
*
* @param queryParam 查询参数。
* @return filterSet中在从表中不存在的数据集合。
*/
@Override
@PostMapping("/student/notExist")
ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam);
@Component("CourseClassStudentClientFallbackFactory")
@Slf4j
class StudentClientFallbackFactory

View File

@@ -139,18 +139,7 @@ public class CourseController extends BaseController<Course, CourseVo, Long> {
if (MyCommonUtil.existBlankArgument(courseId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
// 验证关联Id的数据合法性
Course originalCourse = courseService.getById(courseId);
if (originalCourse == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (!courseService.remove(courseId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
return this.doDelete(courseId);
}
/**
@@ -510,4 +499,34 @@ public class CourseController extends BaseController<Course, CourseVo, Long> {
public ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam) {
return super.baseAggregateBy(aggregationParam);
}
/**
* 根据过滤字段和过滤集合,返回不存在的数据。主要用于微服务间远程过程调用。
*
* @param queryParam 查询参数。
* @return 不存在的数据集合。
*/
@ApiOperation(hidden = true, value = "notExist")
@PostMapping("/notExist")
public ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam) {
List<?> notExistIdSet = service().notExist(
queryParam.getInFilterField(), queryParam.getInFilterValues(), true);
return ResponseResult.success(notExistIdSet);
}
private ResponseResult<Void> doDelete(Long courseId) {
String errorMessage;
// 验证关联Id的数据合法性
Course originalCourse = courseService.getById(courseId);
if (originalCourse == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (!courseService.remove(courseId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
}
}

View File

@@ -114,18 +114,7 @@ public class StudentClassController extends BaseController<StudentClass, Student
if (MyCommonUtil.existBlankArgument(classId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
// 验证关联Id的数据合法性
StudentClass originalStudentClass = studentClassService.getById(classId);
if (originalStudentClass == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (!studentClassService.remove(classId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
return this.doDelete(classId);
}
/**
@@ -194,13 +183,8 @@ public class StudentClassController extends BaseController<StudentClass, Student
}
Course filter = MyModelUtil.copyTo(courseDtoFilter, Course.class);
String orderBy = MyOrderParam.buildOrderBy(orderParam, Course.class);
List<Course> courseList;
if (MyCommonUtil.isNotBlankOrNull(classId)) {
courseList = courseService.getNotInCourseListByClassId(classId, filter, orderBy);
} else {
courseList = courseService.getCourseList(filter, orderBy);
courseService.buildRelationForDataList(courseList, MyRelationParam.dictOnly());
}
List<Course> courseList =
courseService.getNotInCourseListByClassId(classId, filter, orderBy);
return ResponseResult.success(MyPageUtil.makeResponseData(courseList, Course.INSTANCE));
}
@@ -349,13 +333,8 @@ public class StudentClassController extends BaseController<StudentClass, Student
}
Student filter = MyModelUtil.copyTo(studentDtoFilter, Student.class);
String orderBy = MyOrderParam.buildOrderBy(orderParam, Student.class);
List<Student> studentList;
if (MyCommonUtil.isNotBlankOrNull(classId)) {
studentList = studentService.getNotInStudentListByClassId(classId, filter, orderBy);
} else {
studentList = studentService.getStudentList(filter, orderBy);
studentService.buildRelationForDataList(studentList, MyRelationParam.dictOnly());
}
List<Student> studentList =
studentService.getNotInStudentListByClassId(classId, filter, orderBy);
return ResponseResult.success(MyPageUtil.makeResponseData(studentList, Student.INSTANCE));
}
@@ -631,4 +610,34 @@ public class StudentClassController extends BaseController<StudentClass, Student
public ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam) {
return super.baseAggregateBy(aggregationParam);
}
/**
* 根据过滤字段和过滤集合,返回不存在的数据。主要用于微服务间远程过程调用。
*
* @param queryParam 查询参数。
* @return 不存在的数据集合。
*/
@ApiOperation(hidden = true, value = "notExist")
@PostMapping("/notExist")
public ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam) {
List<?> notExistIdSet = service().notExist(
queryParam.getInFilterField(), queryParam.getInFilterValues(), true);
return ResponseResult.success(notExistIdSet);
}
private ResponseResult<Void> doDelete(Long classId) {
String errorMessage;
// 验证关联Id的数据合法性
StudentClass originalStudentClass = studentClassService.getById(classId);
if (originalStudentClass == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (!studentClassService.remove(classId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
}
}

View File

@@ -122,18 +122,7 @@ public class StudentController extends BaseController<Student, StudentVo, Long>
if (MyCommonUtil.existBlankArgument(studentId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
// 验证关联Id的数据合法性
Student originalStudent = studentService.getById(studentId);
if (originalStudent == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (!studentService.remove(studentId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
return this.doDelete(studentId);
}
/**
@@ -398,4 +387,34 @@ public class StudentController extends BaseController<Student, StudentVo, Long>
public ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam) {
return super.baseAggregateBy(aggregationParam);
}
/**
* 根据过滤字段和过滤集合,返回不存在的数据。主要用于微服务间远程过程调用。
*
* @param queryParam 查询参数。
* @return 不存在的数据集合。
*/
@ApiOperation(hidden = true, value = "notExist")
@PostMapping("/notExist")
public ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam) {
List<?> notExistIdSet = service().notExist(
queryParam.getInFilterField(), queryParam.getInFilterValues(), true);
return ResponseResult.success(notExistIdSet);
}
private ResponseResult<Void> doDelete(Long studentId) {
String errorMessage;
// 验证关联Id的数据合法性
Student originalStudent = studentService.getById(studentId);
if (originalStudent == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (!studentService.remove(studentId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
}
}

View File

@@ -97,7 +97,7 @@
</if>
<if test="studentFilter.searchString != null and studentFilter.searchString != ''">
<bind name = "safeStudentSearchString" value = "'%' + studentFilter.searchString + '%'" />
AND CONCAT(IFNULL(zz_student.login_mobile,''), IFNULL(zz_student.student_name,'')) LIKE #{safeStudentSearchString}
AND CONCAT(COALESCE(zz_student.login_mobile,''), COALESCE(zz_student.student_name,'')) LIKE #{safeStudentSearchString}
</if>
</if>
</sql>

View File

@@ -1,7 +1,7 @@
package com.orangeforms.courseclassservice.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.*;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.orangeforms.courseclassservice.service.*;
import com.orangeforms.courseclassservice.dao.*;
@@ -198,8 +198,12 @@ public class CourseServiceImpl extends BaseService<Course, Long> implements Cour
*/
@Override
public List<Course> getNotInCourseListByClassId(Long classId, Course filter, String orderBy) {
List<Course> resultList =
courseMapper.getNotInCourseListByClassId(classId, filter, orderBy);
List<Course> resultList;
if (classId != null) {
resultList = courseMapper.getNotInCourseListByClassId(classId, filter, orderBy);
} else {
resultList = getCourseList(filter, orderBy);
}
this.buildRelationForDataList(resultList, MyRelationParam.dictOnly());
return resultList;
}

View File

@@ -1,12 +1,12 @@
package com.orangeforms.courseclassservice.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.*;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.orangeforms.courseclassservice.service.*;
import com.orangeforms.courseclassservice.dao.*;
import com.orangeforms.courseclassservice.model.*;
import com.orangeforms.upmsapi.client.*;
import com.orangeforms.upmsapi.client.SysDeptClient;
import com.orangeforms.common.core.util.*;
import com.orangeforms.common.core.object.MyRelationParam;
import com.orangeforms.common.core.object.ResponseResult;

View File

@@ -1,13 +1,13 @@
package com.orangeforms.courseclassservice.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.*;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.orangeforms.application.common.constant.StudentStatus;
import com.orangeforms.courseclassservice.service.*;
import com.orangeforms.courseclassservice.dao.*;
import com.orangeforms.courseclassservice.model.*;
import com.orangeforms.upmsapi.client.*;
import com.orangeforms.upmsapi.client.SysDeptClient;
import com.orangeforms.common.core.util.*;
import com.orangeforms.common.core.object.MyRelationParam;
import com.orangeforms.common.core.object.ResponseResult;
@@ -201,8 +201,12 @@ public class StudentServiceImpl extends BaseService<Student, Long> implements St
*/
@Override
public List<Student> getNotInStudentListByClassId(Long classId, Student filter, String orderBy) {
List<Student> resultList =
studentMapper.getNotInStudentListByClassId(classId, filter, orderBy);
List<Student> resultList;
if (classId != null) {
resultList = studentMapper.getNotInStudentListByClassId(classId, filter, orderBy);
} else {
resultList = getStudentList(filter, orderBy);
}
this.buildRelationForDataList(resultList, MyRelationParam.dictOnly());
return resultList;
}

View File

@@ -1,329 +0,0 @@
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
.b1{white-space-collapsing:preserve;}
.t1{border-collapse:collapse;border-spacing:0;}
.r1{height:23.25pt;}
.r2{height:18.75pt;}
.r3{height:17.25pt;}
.r4{height:15.0pt;}
.r5{height:14.25pt;}
.r6{height:21.0pt;}
.r7{height:18.0pt;}
.r8{height:15.75pt;}
.r9{height:19.5pt;}
.r10{height:17.0pt;}
.r11{height:20.25pt;}
.r12{height:28.5pt;}
.c1{white-space:pre-wrap;text-align:center;border-bottom:thin solid black;font-weight:bold;color: #dd0806; font-size:18pt;}
.c2{white-space:pre-wrap;text-align:center;background-color:#ffff00;border-top:thin solid black;border-left:thin solid black;color: #dd0806; font-size:12pt;}
.c3{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-left:thin solid black;color: #dd0806; font-size:12pt;}
.c4{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;color: #dd0806; font-size:12pt;}
.c5{white-space:pre-wrap;text-align:center;color: #dd0806; font-size:10pt;}
.c6{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;color: #dd0806; font-size:10pt;}
.c7{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;color: #dd0806; font-size:10pt;}
.c8{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:9pt;}
.c9{white-space:pre-wrap;text-align:center;background-color:#ffff00;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;color: #dd0806; font-size:11pt;}
.c10{white-space:pre-wrap;text-align:center;border-right:thin solid black;border-left:thin solid black;font-size:10pt;}
.c11{white-space:pre-wrap;text-align:center;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:10pt;}
.c12{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-left:thin solid black;font-size:10pt;}
.c13{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:8pt;}
.c14{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-left:thin solid black;font-size:8pt;}
.c15{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:10pt;}
.c16{white-space:pre-wrap;text-align:center;background-color:#ffff00;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:11pt;}
.c17{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:11pt;}
.c18{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:6pt;}
.c19{white-space:pre-wrap;text-align:center;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:6pt;}
.c20{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-left:thin solid black;font-weight:bold;font-size:6pt;}
.c21{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-left:thin solid black;font-weight:bold;font-size:8pt;}
.c22{white-space:pre-wrap;text-align:left;border-top:thin solid black;font-weight:bold;font-size:9pt;}
</style>
</head>
<body class="b1">
<table class="t1">
<colgroup>
<col width="40">
<col width="40">
<col width="57">
<col width="57">
<col width="57">
<col width="57">
<col width="57">
<col width="56">
<col width="59">
<col width="57">
<col width="57">
<col width="57">
<col width="57">
<col width="57">
<col width="57">
<col width="57">
</colgroup>
<tbody>
<tr class="r1">
<td class="c1" colspan="16">天津公安警官职业学院2017—2018学年度第一学期课程表</td>
</tr>
<tr class="r1">
<td class="c2" colspan="2" rowspan="2">班 级</td>
<td class="c3" colspan="3">星期一</td>
<td class="c4" colspan="3">星期二</td>
<td class="c4" colspan="3">星期三</td>
<td class="c4" colspan="3">星期四</td>
<td class="c4" colspan="2">星期五</td>
</tr>
<tr class="r2">
<td class="c5">第1节</td>
<td class="c5">第2节</td>
<td class="c5">第3节</td>
<td class="c6">第1节</td>
<td class="c7">第2节</td>
<td class="c7">第3节</td>
<td class="c7">第1节</td>
<td class="c7">第2节</td>
<td class="c7">第3节</td>
<td class="c7">第1节</td>
<td class="c7">第2节</td>
<td class="c7">第3节</td>
<td class="c7">第1节</td>
<td class="c7">第2节</td>
</tr>
<tr class="r2">
<td class="c8" rowspan="6">16 级 刑 事 技 术 班 </td>
<td class="c9" rowspan="2">课程</td>
<td class="c10" rowspan="2">刑法</td>
<td class="c10" rowspan="6">自习</td>
<td class="c11">刑事图像</td>
<td class="c12" rowspan="2">民 法(选修)</td>
<td class="c13">派出所工作</td>
<td class="c12" rowspan="2">刑事图像</td>
<td class="c12" rowspan="2">法医学</td>
<td class="c14" rowspan="2">派出所工作</td>
<td class="c15">法医学</td>
<td class="c12" rowspan="2">国内安全保卫</td>
<td class="c12" rowspan="2">体能</td>
<td class="c12" rowspan="6">自习</td>
<td class="c12" rowspan="2">刑事技术总论</td>
<td class="c12" rowspan="2">刑法</td>
</tr>
<tr class="r3">
<td class="c11">自习</td>
<td class="c11">自习</td>
<td class="c11">自习</td>
</tr>
<tr class="r3">
<td class="c16" rowspan="2">教师</td>
<td class="c12" rowspan="2">曾岚</td>
<td class="c15">陈磊</td>
<td class="c12" rowspan="2">邵刚</td>
<td class="c15">杨丽伟</td>
<td class="c12" rowspan="2">陈磊</td>
<td class="c12" rowspan="2">于辉</td>
<td class="c12" rowspan="2">杨丽伟</td>
<td class="c15">于辉</td>
<td class="c12" rowspan="2">朱学强</td>
<td class="c12" rowspan="2">张付海</td>
<td class="c12" rowspan="2">王 伟(刑技)</td>
<td class="c12" rowspan="2">曾岚</td>
</tr>
<tr class="r3">
<td class="c11"> </td>
<td class="c11"> </td>
<td class="c11"> </td>
</tr>
<tr class="r3">
<td class="c16" rowspan="2">教室</td>
<td class="c15" rowspan="2">206</td>
<td class="c15">206</td>
<td class="c15" rowspan="2">206</td>
<td class="c15">206</td>
<td class="c15" rowspan="2">206</td>
<td class="c15" rowspan="2">206</td>
<td class="c15" rowspan="2">206</td>
<td class="c15">206</td>
<td class="c15" rowspan="2">206</td>
<td class="c15" rowspan="2">操场</td>
<td class="c15" rowspan="2">206</td>
<td class="c15" rowspan="2">206</td>
</tr>
<tr class="r4">
<td class="c15"> </td>
<td class="c11"> </td>
<td class="c11"> </td>
</tr>
<tr class="r2">
<td class="c8" rowspan="6">16 级 刑 事 侦 查 </td>
<td class="c17" rowspan="2">课程</td>
<td class="c12" rowspan="6">自习</td>
<td class="c12" rowspan="2">侦查措施</td>
<td class="c12" rowspan="2">经济案件侦查</td>
<td class="c14" rowspan="2">公安信息化</td>
<td class="c14" rowspan="2">公安信息化</td>
<td class="c12" rowspan="2">刑法</td>
<td class="c12" rowspan="2">体能</td>
<td class="c12" rowspan="6">自习</td>
<td class="c12" rowspan="2">痕迹检验</td>
<td class="c12" rowspan="2">刑法</td>
<td class="c12" rowspan="2">国内安全保卫</td>
<td class="c18">经济案件侦查</td>
<td class="c12" rowspan="2">痕迹检验</td>
<td class="c12" rowspan="2">民 法(选修)</td>
</tr>
<tr class="r3">
<td class="c11">侦查措施</td>
</tr>
<tr class="r3">
<td class="c17" rowspan="2">教师</td>
<td class="c12" rowspan="2">徐宏涛</td>
<td class="c12" rowspan="2">张静</td>
<td class="c12" rowspan="2">赵晓松</td>
<td class="c12" rowspan="2">赵晓松</td>
<td class="c12" rowspan="2">王骏强</td>
<td class="c12" rowspan="2">张付海</td>
<td class="c12" rowspan="2">郭海川</td>
<td class="c12" rowspan="2">王骏强</td>
<td class="c12" rowspan="2">朱学强</td>
<td class="c15">张静</td>
<td class="c12" rowspan="2">郭海川</td>
<td class="c12" rowspan="2">邵刚</td>
</tr>
<tr class="r3">
<td class="c11">徐宏涛</td>
</tr>
<tr class="r3">
<td class="c17" rowspan="2">教室</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">3号机房</td>
<td class="c15" rowspan="2">3号机房</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">操场</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">202</td>
</tr>
<tr class="r5">
</tr>
<tr class="r2">
<td class="c8" rowspan="6">16 级 治 安 管 理 班 </td>
<td class="c17" rowspan="2">课程</td>
<td class="c12" rowspan="2">刑事技术</td>
<td class="c12" rowspan="2">体能</td>
<td class="c12" rowspan="2">刑事技术</td>
<td class="c12" rowspan="2">治安秩序管理</td>
<td class="c12" rowspan="2">刑事侦查概论</td>
<td class="c12" rowspan="2">刑法</td>
<td class="c18">群众工作与纠纷调解</td>
<td class="c12" rowspan="2">群众工作与纠纷调解</td>
<td class="c12" rowspan="2">公共关系(选修)</td>
<td class="c12" rowspan="2">刑事侦查概论</td>
<td class="c12" rowspan="2">刑法</td>
<td class="c12" rowspan="6">自习</td>
<td class="c12" rowspan="6">自习</td>
<td class="c12" rowspan="6">自习</td>
</tr>
<tr class="r6">
<td class="c19">q</td>
</tr>
<tr class="r7">
<td class="c17" rowspan="2">教师</td>
<td class="c12" rowspan="2">郭海川 韩易浦</td>
<td class="c12" rowspan="2">张付海</td>
<td class="c12" rowspan="2">郭海川 韩易浦</td>
<td class="c12" rowspan="2">翟政亮</td>
<td class="c12" rowspan="2">邵妍</td>
<td class="c12" rowspan="2">薛强</td>
<td class="c15">刘晓鹏</td>
<td class="c12" rowspan="2">刘晓鹏</td>
<td class="c12" rowspan="2">尚欣</td>
<td class="c12" rowspan="2">邵妍</td>
<td class="c12" rowspan="2">薛强</td>
</tr>
<tr class="r7">
<td class="c11">翟政亮</td>
</tr>
<tr class="r3">
<td class="c17" rowspan="2">教室</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">操场</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
</tr>
<tr class="r8">
</tr>
<tr class="r2">
<td class="c13" rowspan="6">16 网 络 安 全 监 察 1 班</td>
<td class="c17" rowspan="2">课程</td>
<td class="c12" rowspan="2">应用写作</td>
<td class="c14" rowspan="2">数据库系统应用</td>
<td class="c20" rowspan="2">周二中午:计算机安全管理及实用技术</td>
<td class="c13">刑事诉讼法</td>
<td class="c21" rowspan="2">周一中午:数据库系统应用</td>
<td class="c12" rowspan="2">民法</td>
<td class="c12" rowspan="2">体育</td>
<td class="c12" rowspan="2">VB语言程序设计</td>
<td class="c12" rowspan="6">选修</td>
<td class="c12" rowspan="2">VB语言程序设计</td>
<td class="c12" rowspan="2">刑事诉讼法</td>
<td class="c12" rowspan="6">选修</td>
<td class="c15">应用写作</td>
<td class="c12" rowspan="2">犯罪心理</td>
</tr>
<tr class="r2">
<td class="c11">民法</td>
<td class="c11">犯罪心理</td>
</tr>
<tr class="r9">
<td class="c17" rowspan="2">教师</td>
<td class="c12" rowspan="2">关利</td>
<td class="c12" rowspan="2">杨斌</td>
<td class="c12" rowspan="2">赵晓松</td>
<td class="c15">王伟</td>
<td class="c12" rowspan="2">杨斌</td>
<td class="c12" rowspan="2">李静</td>
<td class="c12" rowspan="2">程军</td>
<td class="c12" rowspan="2">赵伟</td>
<td class="c12" rowspan="2">赵伟</td>
<td class="c12" rowspan="2">王伟</td>
<td class="c15">关利</td>
<td class="c12" rowspan="2">张学林</td>
</tr>
<tr class="r10">
<td class="c11">李静</td>
<td class="c11">张学林</td>
</tr>
<tr class="r3">
<td class="c17" rowspan="2">教室</td>
<td class="c15" rowspan="2">东阶梯</td>
<td class="c15" rowspan="2">2号机房</td>
<td class="c15" rowspan="2">主楼201</td>
<td class="c15" rowspan="2">101</td>
<td class="c15" rowspan="2">2号机房</td>
<td class="c15" rowspan="2">101</td>
<td class="c15" rowspan="2">操场</td>
<td class="c15" rowspan="2">3号机房</td>
<td class="c15" rowspan="2">3号机房</td>
<td class="c15" rowspan="2">101</td>
<td class="c15">东阶梯</td>
<td class="c15" rowspan="2">主楼201</td>
</tr>
<tr class="r11">
<td class="c11">主楼201</td>
</tr>
<tr class="r12">
<td class="c22" colspan="16">注:1、课程一栏中有两科次的上面的课程单周上课下面的课程双周上课。2、每天上课时间上午第1节8:30至9:55第2节10:15至11:40中午上课时间12:30至13:55下午第3节14:00至15:25。</td>
</tr>
</tbody>
</table>
</body>
</html>

View File

@@ -32,7 +32,11 @@ public class SwaggerResourceConfig implements SwaggerResourcesProvider {
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
List<String> routes = new ArrayList<>();
routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
routeLocator.getRoutes().subscribe(route -> {
if (!"upms-captcha".equals(route.getId())) {
routes.add(route.getId());
}
});
gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId()))
.forEach(route -> route.getPredicates().stream()
.filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))

View File

@@ -56,11 +56,18 @@ public class AuthenticationPreFilter implements GlobalFilter, Ordered {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
String url = request.getURI().getPath();
// 判断是否为白名单请求,以及一些内置不需要验证的请求。(登录请求也包含其中)。
if (this.shouldNotFilter(url)) {
return chain.filter(exchange);
}
String token = this.getTokenFromRequest(request);
boolean noLoginUrl = false;
// 判断是否为白名单请求,以及一些内置不需要验证的请求。(登录请求也包含其中)。
// 如果当前请求中包含token令牌不为空的时候也会继续验证Token的合法性这样就能保证
// Token中的用户信息被业务接口正常访问到了。而如果当token为空的时候白名单的接口可以
// 被网关直接转发无需登录验证。当然被转发的接口也无法获取到用户的token身份数据了。
if (this.shouldNotFilter(url)) {
noLoginUrl = true;
if (StringUtils.isBlank(token)) {
return chain.filter(exchange);
}
}
Claims c = JwtUtil.parseToken(token, appConfig.getTokenSigningKey());
if (JwtUtil.isNullOrExpired(c)) {
log.warn("EXPIRED request [{}] from REMOTE-IP [{}].", url, IpUtil.getRemoteIpAddress(request));
@@ -111,7 +118,7 @@ public class AuthenticationPreFilter implements GlobalFilter, Ordered {
log.error("Failed to call AuthenticationPreFilter.filter.", e);
}
boolean isAdmin = tokenData.getBoolean("isAdmin");
if (Boolean.FALSE.equals(isAdmin) && !this.hasPermission(redissonClient, sessionId, url)) {
if (!noLoginUrl && Boolean.FALSE.equals(isAdmin) && !this.hasPermission(redissonClient, sessionId, url)) {
log.warn("FORBIDDEN request [{}] from REMOTE-IP [{}] for USER [{} -- {}] no perm!",
url, IpUtil.getRemoteIpAddress(request), userId, showName);
response.setStatusCode(HttpStatus.FORBIDDEN);
@@ -166,7 +173,7 @@ public class AuthenticationPreFilter implements GlobalFilter, Ordered {
if (url.endsWith("/v2/api-docs") || url.endsWith("/v2/api-docs-ext")) {
return true;
}
if (url.equals(GatewayConstant.ADMIN_LOGIN_URL)) {
if (url.equals(GatewayConstant.ADMIN_LOGIN_URL) || url.startsWith("/captcha")) {
return true;
}
// 先过滤直接匹配的白名单url。

View File

@@ -164,6 +164,16 @@ public interface CourseTransStatsClient extends BaseClient<CourseTransStatsDto,
@PostMapping("/courseTransStats/aggregateBy")
ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam);
/**
* 根据过滤字段和过滤集合,返回不存在的数据。
*
* @param queryParam 查询参数。
* @return filterSet中在从表中不存在的数据集合。
*/
@Override
@PostMapping("/courseTransStats/notExist")
ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam);
@Component("StatsCourseTransStatsClientFallbackFactory")
@Slf4j
class CourseTransStatsClientFallbackFactory

View File

@@ -164,6 +164,16 @@ public interface StudentActionStatsClient extends BaseClient<StudentActionStatsD
@PostMapping("/studentActionStats/aggregateBy")
ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam);
/**
* 根据过滤字段和过滤集合,返回不存在的数据。
*
* @param queryParam 查询参数。
* @return filterSet中在从表中不存在的数据集合。
*/
@Override
@PostMapping("/studentActionStats/notExist")
ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam);
@Component("StatsStudentActionStatsClientFallbackFactory")
@Slf4j
class StudentActionStatsClientFallbackFactory

View File

@@ -184,6 +184,16 @@ public interface StudentActionTransClient extends BaseClient<StudentActionTransD
@PostMapping("/studentActionTrans/aggregateBy")
ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam);
/**
* 根据过滤字段和过滤集合,返回不存在的数据。
*
* @param queryParam 查询参数。
* @return filterSet中在从表中不存在的数据集合。
*/
@Override
@PostMapping("/studentActionTrans/notExist")
ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam);
@Component("StatsStudentActionTransClientFallbackFactory")
@Slf4j
class StudentActionTransClientFallbackFactory

View File

@@ -277,4 +277,18 @@ public class CourseTransStatsController extends BaseController<CourseTransStats,
public ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam) {
return super.baseAggregateBy(aggregationParam);
}
/**
* 根据过滤字段和过滤集合,返回不存在的数据。主要用于微服务间远程过程调用。
*
* @param queryParam 查询参数。
* @return 不存在的数据集合。
*/
@ApiOperation(hidden = true, value = "notExist")
@PostMapping("/notExist")
public ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam) {
List<?> notExistIdSet = service().notExist(
queryParam.getInFilterField(), queryParam.getInFilterValues(), true);
return ResponseResult.success(notExistIdSet);
}
}

View File

@@ -277,4 +277,18 @@ public class StudentActionStatsController extends BaseController<StudentActionSt
public ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam) {
return super.baseAggregateBy(aggregationParam);
}
/**
* 根据过滤字段和过滤集合,返回不存在的数据。主要用于微服务间远程过程调用。
*
* @param queryParam 查询参数。
* @return 不存在的数据集合。
*/
@ApiOperation(hidden = true, value = "notExist")
@PostMapping("/notExist")
public ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam) {
List<?> notExistIdSet = service().notExist(
queryParam.getInFilterField(), queryParam.getInFilterValues(), true);
return ResponseResult.success(notExistIdSet);
}
}

View File

@@ -115,18 +115,7 @@ public class StudentActionTransController extends BaseController<StudentActionTr
if (MyCommonUtil.existBlankArgument(transId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
// 验证关联Id的数据合法性
StudentActionTrans originalStudentActionTrans = studentActionTransService.getById(transId);
if (originalStudentActionTrans == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (!studentActionTransService.remove(transId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
return this.doDelete(transId);
}
/**
@@ -364,4 +353,34 @@ public class StudentActionTransController extends BaseController<StudentActionTr
public ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam) {
return super.baseAggregateBy(aggregationParam);
}
/**
* 根据过滤字段和过滤集合,返回不存在的数据。主要用于微服务间远程过程调用。
*
* @param queryParam 查询参数。
* @return 不存在的数据集合。
*/
@ApiOperation(hidden = true, value = "notExist")
@PostMapping("/notExist")
public ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam) {
List<?> notExistIdSet = service().notExist(
queryParam.getInFilterField(), queryParam.getInFilterValues(), true);
return ResponseResult.success(notExistIdSet);
}
private ResponseResult<Void> doDelete(Long transId) {
String errorMessage;
// 验证关联Id的数据合法性
StudentActionTrans originalStudentActionTrans = studentActionTransService.getById(transId);
if (originalStudentActionTrans == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (!studentActionTransService.remove(transId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
}
}

View File

@@ -5,8 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.orangeforms.statsservice.service.*;
import com.orangeforms.statsservice.dao.*;
import com.orangeforms.statsservice.model.*;
import com.orangeforms.upmsapi.client.*;
import com.orangeforms.courseclassapi.client.*;
import com.orangeforms.upmsapi.client.SysDeptClient;
import com.orangeforms.courseclassapi.client.GradeClient;
import com.orangeforms.common.core.util.*;
import com.orangeforms.common.core.object.MyRelationParam;
import com.orangeforms.common.core.object.ResponseResult;

View File

@@ -1,329 +0,0 @@
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
.b1{white-space-collapsing:preserve;}
.t1{border-collapse:collapse;border-spacing:0;}
.r1{height:23.25pt;}
.r2{height:18.75pt;}
.r3{height:17.25pt;}
.r4{height:15.0pt;}
.r5{height:14.25pt;}
.r6{height:21.0pt;}
.r7{height:18.0pt;}
.r8{height:15.75pt;}
.r9{height:19.5pt;}
.r10{height:17.0pt;}
.r11{height:20.25pt;}
.r12{height:28.5pt;}
.c1{white-space:pre-wrap;text-align:center;border-bottom:thin solid black;font-weight:bold;color: #dd0806; font-size:18pt;}
.c2{white-space:pre-wrap;text-align:center;background-color:#ffff00;border-top:thin solid black;border-left:thin solid black;color: #dd0806; font-size:12pt;}
.c3{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-left:thin solid black;color: #dd0806; font-size:12pt;}
.c4{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;color: #dd0806; font-size:12pt;}
.c5{white-space:pre-wrap;text-align:center;color: #dd0806; font-size:10pt;}
.c6{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;color: #dd0806; font-size:10pt;}
.c7{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;color: #dd0806; font-size:10pt;}
.c8{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:9pt;}
.c9{white-space:pre-wrap;text-align:center;background-color:#ffff00;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;color: #dd0806; font-size:11pt;}
.c10{white-space:pre-wrap;text-align:center;border-right:thin solid black;border-left:thin solid black;font-size:10pt;}
.c11{white-space:pre-wrap;text-align:center;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:10pt;}
.c12{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-left:thin solid black;font-size:10pt;}
.c13{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:8pt;}
.c14{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-left:thin solid black;font-size:8pt;}
.c15{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:10pt;}
.c16{white-space:pre-wrap;text-align:center;background-color:#ffff00;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:11pt;}
.c17{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:11pt;}
.c18{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:6pt;}
.c19{white-space:pre-wrap;text-align:center;border-right:thin solid black;border-bottom:thin solid black;border-left:thin solid black;font-size:6pt;}
.c20{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-left:thin solid black;font-weight:bold;font-size:6pt;}
.c21{white-space:pre-wrap;text-align:center;border-top:thin solid black;border-right:thin solid black;border-left:thin solid black;font-weight:bold;font-size:8pt;}
.c22{white-space:pre-wrap;text-align:left;border-top:thin solid black;font-weight:bold;font-size:9pt;}
</style>
</head>
<body class="b1">
<table class="t1">
<colgroup>
<col width="40">
<col width="40">
<col width="57">
<col width="57">
<col width="57">
<col width="57">
<col width="57">
<col width="56">
<col width="59">
<col width="57">
<col width="57">
<col width="57">
<col width="57">
<col width="57">
<col width="57">
<col width="57">
</colgroup>
<tbody>
<tr class="r1">
<td class="c1" colspan="16">天津公安警官职业学院2017—2018学年度第一学期课程表</td>
</tr>
<tr class="r1">
<td class="c2" colspan="2" rowspan="2">班 级</td>
<td class="c3" colspan="3">星期一</td>
<td class="c4" colspan="3">星期二</td>
<td class="c4" colspan="3">星期三</td>
<td class="c4" colspan="3">星期四</td>
<td class="c4" colspan="2">星期五</td>
</tr>
<tr class="r2">
<td class="c5">第1节</td>
<td class="c5">第2节</td>
<td class="c5">第3节</td>
<td class="c6">第1节</td>
<td class="c7">第2节</td>
<td class="c7">第3节</td>
<td class="c7">第1节</td>
<td class="c7">第2节</td>
<td class="c7">第3节</td>
<td class="c7">第1节</td>
<td class="c7">第2节</td>
<td class="c7">第3节</td>
<td class="c7">第1节</td>
<td class="c7">第2节</td>
</tr>
<tr class="r2">
<td class="c8" rowspan="6">16 级 刑 事 技 术 班 </td>
<td class="c9" rowspan="2">课程</td>
<td class="c10" rowspan="2">刑法</td>
<td class="c10" rowspan="6">自习</td>
<td class="c11">刑事图像</td>
<td class="c12" rowspan="2">民 法(选修)</td>
<td class="c13">派出所工作</td>
<td class="c12" rowspan="2">刑事图像</td>
<td class="c12" rowspan="2">法医学</td>
<td class="c14" rowspan="2">派出所工作</td>
<td class="c15">法医学</td>
<td class="c12" rowspan="2">国内安全保卫</td>
<td class="c12" rowspan="2">体能</td>
<td class="c12" rowspan="6">自习</td>
<td class="c12" rowspan="2">刑事技术总论</td>
<td class="c12" rowspan="2">刑法</td>
</tr>
<tr class="r3">
<td class="c11">自习</td>
<td class="c11">自习</td>
<td class="c11">自习</td>
</tr>
<tr class="r3">
<td class="c16" rowspan="2">教师</td>
<td class="c12" rowspan="2">曾岚</td>
<td class="c15">陈磊</td>
<td class="c12" rowspan="2">邵刚</td>
<td class="c15">杨丽伟</td>
<td class="c12" rowspan="2">陈磊</td>
<td class="c12" rowspan="2">于辉</td>
<td class="c12" rowspan="2">杨丽伟</td>
<td class="c15">于辉</td>
<td class="c12" rowspan="2">朱学强</td>
<td class="c12" rowspan="2">张付海</td>
<td class="c12" rowspan="2">王 伟(刑技)</td>
<td class="c12" rowspan="2">曾岚</td>
</tr>
<tr class="r3">
<td class="c11"> </td>
<td class="c11"> </td>
<td class="c11"> </td>
</tr>
<tr class="r3">
<td class="c16" rowspan="2">教室</td>
<td class="c15" rowspan="2">206</td>
<td class="c15">206</td>
<td class="c15" rowspan="2">206</td>
<td class="c15">206</td>
<td class="c15" rowspan="2">206</td>
<td class="c15" rowspan="2">206</td>
<td class="c15" rowspan="2">206</td>
<td class="c15">206</td>
<td class="c15" rowspan="2">206</td>
<td class="c15" rowspan="2">操场</td>
<td class="c15" rowspan="2">206</td>
<td class="c15" rowspan="2">206</td>
</tr>
<tr class="r4">
<td class="c15"> </td>
<td class="c11"> </td>
<td class="c11"> </td>
</tr>
<tr class="r2">
<td class="c8" rowspan="6">16 级 刑 事 侦 查 </td>
<td class="c17" rowspan="2">课程</td>
<td class="c12" rowspan="6">自习</td>
<td class="c12" rowspan="2">侦查措施</td>
<td class="c12" rowspan="2">经济案件侦查</td>
<td class="c14" rowspan="2">公安信息化</td>
<td class="c14" rowspan="2">公安信息化</td>
<td class="c12" rowspan="2">刑法</td>
<td class="c12" rowspan="2">体能</td>
<td class="c12" rowspan="6">自习</td>
<td class="c12" rowspan="2">痕迹检验</td>
<td class="c12" rowspan="2">刑法</td>
<td class="c12" rowspan="2">国内安全保卫</td>
<td class="c18">经济案件侦查</td>
<td class="c12" rowspan="2">痕迹检验</td>
<td class="c12" rowspan="2">民 法(选修)</td>
</tr>
<tr class="r3">
<td class="c11">侦查措施</td>
</tr>
<tr class="r3">
<td class="c17" rowspan="2">教师</td>
<td class="c12" rowspan="2">徐宏涛</td>
<td class="c12" rowspan="2">张静</td>
<td class="c12" rowspan="2">赵晓松</td>
<td class="c12" rowspan="2">赵晓松</td>
<td class="c12" rowspan="2">王骏强</td>
<td class="c12" rowspan="2">张付海</td>
<td class="c12" rowspan="2">郭海川</td>
<td class="c12" rowspan="2">王骏强</td>
<td class="c12" rowspan="2">朱学强</td>
<td class="c15">张静</td>
<td class="c12" rowspan="2">郭海川</td>
<td class="c12" rowspan="2">邵刚</td>
</tr>
<tr class="r3">
<td class="c11">徐宏涛</td>
</tr>
<tr class="r3">
<td class="c17" rowspan="2">教室</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">3号机房</td>
<td class="c15" rowspan="2">3号机房</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">操场</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">202</td>
<td class="c15" rowspan="2">202</td>
</tr>
<tr class="r5">
</tr>
<tr class="r2">
<td class="c8" rowspan="6">16 级 治 安 管 理 班 </td>
<td class="c17" rowspan="2">课程</td>
<td class="c12" rowspan="2">刑事技术</td>
<td class="c12" rowspan="2">体能</td>
<td class="c12" rowspan="2">刑事技术</td>
<td class="c12" rowspan="2">治安秩序管理</td>
<td class="c12" rowspan="2">刑事侦查概论</td>
<td class="c12" rowspan="2">刑法</td>
<td class="c18">群众工作与纠纷调解</td>
<td class="c12" rowspan="2">群众工作与纠纷调解</td>
<td class="c12" rowspan="2">公共关系(选修)</td>
<td class="c12" rowspan="2">刑事侦查概论</td>
<td class="c12" rowspan="2">刑法</td>
<td class="c12" rowspan="6">自习</td>
<td class="c12" rowspan="6">自习</td>
<td class="c12" rowspan="6">自习</td>
</tr>
<tr class="r6">
<td class="c19">q</td>
</tr>
<tr class="r7">
<td class="c17" rowspan="2">教师</td>
<td class="c12" rowspan="2">郭海川 韩易浦</td>
<td class="c12" rowspan="2">张付海</td>
<td class="c12" rowspan="2">郭海川 韩易浦</td>
<td class="c12" rowspan="2">翟政亮</td>
<td class="c12" rowspan="2">邵妍</td>
<td class="c12" rowspan="2">薛强</td>
<td class="c15">刘晓鹏</td>
<td class="c12" rowspan="2">刘晓鹏</td>
<td class="c12" rowspan="2">尚欣</td>
<td class="c12" rowspan="2">邵妍</td>
<td class="c12" rowspan="2">薛强</td>
</tr>
<tr class="r7">
<td class="c11">翟政亮</td>
</tr>
<tr class="r3">
<td class="c17" rowspan="2">教室</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">操场</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
<td class="c15" rowspan="2">218</td>
</tr>
<tr class="r8">
</tr>
<tr class="r2">
<td class="c13" rowspan="6">16 网 络 安 全 监 察 1 班</td>
<td class="c17" rowspan="2">课程</td>
<td class="c12" rowspan="2">应用写作</td>
<td class="c14" rowspan="2">数据库系统应用</td>
<td class="c20" rowspan="2">周二中午:计算机安全管理及实用技术</td>
<td class="c13">刑事诉讼法</td>
<td class="c21" rowspan="2">周一中午:数据库系统应用</td>
<td class="c12" rowspan="2">民法</td>
<td class="c12" rowspan="2">体育</td>
<td class="c12" rowspan="2">VB语言程序设计</td>
<td class="c12" rowspan="6">选修</td>
<td class="c12" rowspan="2">VB语言程序设计</td>
<td class="c12" rowspan="2">刑事诉讼法</td>
<td class="c12" rowspan="6">选修</td>
<td class="c15">应用写作</td>
<td class="c12" rowspan="2">犯罪心理</td>
</tr>
<tr class="r2">
<td class="c11">民法</td>
<td class="c11">犯罪心理</td>
</tr>
<tr class="r9">
<td class="c17" rowspan="2">教师</td>
<td class="c12" rowspan="2">关利</td>
<td class="c12" rowspan="2">杨斌</td>
<td class="c12" rowspan="2">赵晓松</td>
<td class="c15">王伟</td>
<td class="c12" rowspan="2">杨斌</td>
<td class="c12" rowspan="2">李静</td>
<td class="c12" rowspan="2">程军</td>
<td class="c12" rowspan="2">赵伟</td>
<td class="c12" rowspan="2">赵伟</td>
<td class="c12" rowspan="2">王伟</td>
<td class="c15">关利</td>
<td class="c12" rowspan="2">张学林</td>
</tr>
<tr class="r10">
<td class="c11">李静</td>
<td class="c11">张学林</td>
</tr>
<tr class="r3">
<td class="c17" rowspan="2">教室</td>
<td class="c15" rowspan="2">东阶梯</td>
<td class="c15" rowspan="2">2号机房</td>
<td class="c15" rowspan="2">主楼201</td>
<td class="c15" rowspan="2">101</td>
<td class="c15" rowspan="2">2号机房</td>
<td class="c15" rowspan="2">101</td>
<td class="c15" rowspan="2">操场</td>
<td class="c15" rowspan="2">3号机房</td>
<td class="c15" rowspan="2">3号机房</td>
<td class="c15" rowspan="2">101</td>
<td class="c15">东阶梯</td>
<td class="c15" rowspan="2">主楼201</td>
</tr>
<tr class="r11">
<td class="c11">主楼201</td>
</tr>
<tr class="r12">
<td class="c22" colspan="16">注:1、课程一栏中有两科次的上面的课程单周上课下面的课程双周上课。2、每天上课时间上午第1节8:30至9:55第2节10:15至11:40中午上课时间12:30至13:55下午第3节14:00至15:25。</td>
</tr>
</tbody>
</table>
</body>
</html>

View File

@@ -164,6 +164,16 @@ public interface SysDeptClient extends BaseClient<SysDeptDto, SysDeptVo, Long> {
@PostMapping("/sysDept/aggregateBy")
ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam);
/**
* 根据过滤字段和过滤集合,返回不存在的数据。
*
* @param queryParam 查询参数。
* @return filterSet中在从表中不存在的数据集合。
*/
@Override
@PostMapping("/sysDept/notExist")
ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam);
@Component("UpmsSysDeptClientFallbackFactory")
@Slf4j
class SysDeptClientFallbackFactory

View File

@@ -166,6 +166,16 @@ public interface SysUserClient extends BaseClient<SysUserDto, SysUserVo, Long> {
@PostMapping("/sysUser/aggregateBy")
ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam);
/**
* 根据过滤字段和过滤集合,返回不存在的数据。
*
* @param queryParam 查询参数。
* @return filterSet中在从表中不存在的数据集合。
*/
@Override
@PostMapping("/sysUser/notExist")
ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam);
/**
* 获取指定角色Id集合的用户数据集合。
* @param roleIds 角色Id集合。

View File

@@ -14,6 +14,22 @@
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.anji-plus</groupId>
<artifactId>spring-boot-starter-captcha</artifactId>
<version>${ajcaptcha.version}</version>
</dependency>
<!-- aj-captcha 依赖data-redis作为缓存 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 业务组件依赖 -->
<dependency>
<groupId>com.orangeforms</groupId>

View File

@@ -1,6 +1,12 @@
package com.orangeforms.upmsservice.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;
import com.anji.captcha.model.common.ResponseModel;
import com.anji.captcha.model.vo.CaptchaVO;
import com.anji.captcha.service.CaptchaService;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
@@ -11,11 +17,13 @@ import com.orangeforms.common.core.constant.ErrorCodeEnum;
import com.orangeforms.common.core.constant.ApplicationConstant;
import com.orangeforms.common.core.object.*;
import com.orangeforms.common.core.util.*;
import com.orangeforms.common.core.upload.*;
import com.orangeforms.common.redis.cache.SessionCacheHelper;
import com.orangeforms.common.log.annotation.OperationLog;
import com.orangeforms.common.log.model.constant.SysOperationLogType;
import com.orangeforms.upmsapi.constant.SysUserStatus;
import com.orangeforms.upmsapi.constant.SysUserType;
import com.orangeforms.upmsservice.config.ApplicationConfig;
import com.orangeforms.upmsservice.model.*;
import com.orangeforms.upmsservice.service.*;
import org.apache.commons.collections4.CollectionUtils;
@@ -24,7 +32,9 @@ import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
@@ -63,27 +73,53 @@ public class LoginController {
private SessionCacheHelper cacheHelper;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private ApplicationConfig appConfig;
@Autowired
private CaptchaService captchaService;
@Autowired
private UpDownloaderFactory upDownloaderFactory;
/**
* 登录接口。
*
* @param loginName 登录名。
* @param password 密码。
* @param loginName 登录名。
* @param password 密码。
* @param captchaVerification 验证码。
* @return 应答结果对象其中包括JWT的Token数据以及菜单列表。
*/
@ApiImplicitParams({
// 这里包含密码密文,仅用于方便开发期间的接口测试,集成测试和发布阶段,需要将当前注解去掉。
// 如果您重新生成了公钥和私钥请替换password的缺省值。
@ApiImplicitParam(name = "loginName", defaultValue = "admin"),
@ApiImplicitParam(name = "password", defaultValue = "IP3ccke3GhH45iGHB5qP9p7iZw6xUyj28Ju10rnBiPKOI35sc%2BjI7%2FdsjOkHWMfUwGYGfz8ik31HC2Ruk%2Fhkd9f6RPULTHj7VpFdNdde2P9M4mQQnFBAiPM7VT9iW3RyCtPlJexQ3nAiA09OqG%2F0sIf1kcyveSrulxembARDbDo%3D")
@ApiImplicitParam(name = "password", defaultValue = "IP3ccke3GhH45iGHB5qP9p7iZw6xUyj28Ju10rnBiPKOI35sc%2BjI7%2FdsjOkHWMfUwGYGfz8ik31HC2Ruk%2Fhkd9f6RPULTHj7VpFdNdde2P9M4mQQnFBAiPM7VT9iW3RyCtPlJexQ3nAiA09OqG%2F0sIf1kcyveSrulxembARDbDo%3D"),
@ApiImplicitParam(name = "captchaVerification", defaultValue = "为了方便测试这里可以修改一下代码hardcode一个每次都ok的验证码")
})
@OperationLog(type = SysOperationLogType.LOGIN, saveResponse = false)
@PostMapping("/doLogin")
public ResponseResult<JSONObject> doLogin(
@MyRequestBody String loginName, @MyRequestBody String password) throws Exception {
if (MyCommonUtil.existBlankArgument(loginName, password)) {
@MyRequestBody String loginName,
@MyRequestBody String password,
@MyRequestBody String captchaVerification) throws Exception {
if (MyCommonUtil.existBlankArgument(loginName, password, captchaVerification)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
String errorMessage;
CaptchaVO captchaVO = new CaptchaVO();
captchaVO.setCaptchaVerification(captchaVerification);
ResponseModel response = captchaService.verification(captchaVO);
if (!response.isSuccess()) {
//验证码校验失败,返回信息告诉前端
//repCode 0000 无异常,代表成功
//repCode 9999 服务器内部异常
//repCode 0011 参数不能为空
//repCode 6110 验证码已失效,请重新获取
//repCode 6111 验证失败
//repCode 6112 获取验证码失败,请联系管理员
errorMessage = String.format("数据验证失败,验证码错误,错误码 [%s] 错误信息 [%s]",
response.getRepCode(), response.getRepMsg());
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
SysUser user = sysUserService.getSysUserByLoginName(loginName);
if (user == null) {
return ResponseResult.error(ErrorCodeEnum.INVALID_USERNAME_PASSWORD);
@@ -95,7 +131,6 @@ public class LoginController {
if (!passwordEncoder.matches(password, user.getPassword())) {
return ResponseResult.error(ErrorCodeEnum.INVALID_USERNAME_PASSWORD);
}
String errorMessage;
if (user.getUserStatus() == SysUserStatus.STATUS_LOCKED) {
errorMessage = "登录失败,用户账号被锁定!";
return ResponseResult.error(ErrorCodeEnum.INVALID_USER_STATUS, errorMessage);
@@ -136,6 +171,9 @@ public class LoginController {
JSONObject jsonData = new JSONObject();
jsonData.put("showName", tokenData.getShowName());
jsonData.put("isAdmin", tokenData.getIsAdmin());
if (StrUtil.isNotBlank(tokenData.getHeadImageUrl())) {
jsonData.put("headImageUrl", tokenData.getHeadImageUrl());
}
Collection<SysMenu> menuList;
Collection<String> permCodeList;
if (tokenData.getIsAdmin()) {
@@ -180,9 +218,71 @@ public class LoginController {
return ResponseResult.success();
}
/**
* 上传并修改用户头像。
*
* @param uploadFile 上传的头像文件。
*/
@PostMapping("/changeHeadImage")
public void changeHeadImage(
@RequestParam("uploadFile") MultipartFile uploadFile) throws Exception {
String fieldName = "headImageUrl";
UploadStoreInfo storeInfo = MyModelUtil.getUploadStoreInfo(SysUser.class, fieldName);
BaseUpDownloader upDownloader = upDownloaderFactory.get(storeInfo.getStoreType());
UploadResponseInfo responseInfo = upDownloader.doUpload(null,
appConfig.getUploadFileBaseDir(), SysUser.class.getSimpleName(), fieldName, true, uploadFile);
if (responseInfo.getUploadFailed()) {
ResponseResult.output(HttpServletResponse.SC_FORBIDDEN,
ResponseResult.error(ErrorCodeEnum.UPLOAD_FAILED, responseInfo.getErrorMessage()));
return;
}
responseInfo.setDownloadUri("/admin/upms/login/downloadHeadImage");
String newHeadImage = JSONArray.toJSONString(CollUtil.newArrayList(responseInfo));
if (!sysUserService.changeHeadImage(TokenData.takeFromRequest().getUserId(), newHeadImage)) {
ResponseResult.output(HttpServletResponse.SC_FORBIDDEN,
ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST));
return;
}
ResponseResult.output(ResponseResult.success(responseInfo));
}
/**
* 下载用户头像。
*
* @param filename 文件名。如果没有提供该参数,就从当前记录的指定字段中读取。
* @param response Http 应答对象。
*/
@GetMapping("/downloadHeadImage")
public void downloadHeadImage(String filename, HttpServletResponse response) {
try {
SysUser user = sysUserService.getById(TokenData.takeFromRequest().getUserId());
if (user == null) {
ResponseResult.output(HttpServletResponse.SC_NOT_FOUND);
return;
}
if (StrUtil.isBlank(user.getHeadImageUrl())) {
ResponseResult.output(HttpServletResponse.SC_BAD_REQUEST);
return;
}
if (!BaseUpDownloader.containFile(user.getHeadImageUrl(), filename)) {
ResponseResult.output(HttpServletResponse.SC_FORBIDDEN);
return;
}
String fieldName = "headImageUrl";
UploadStoreInfo storeInfo = MyModelUtil.getUploadStoreInfo(SysUser.class, fieldName);
BaseUpDownloader upDownloader = upDownloaderFactory.get(storeInfo.getStoreType());
upDownloader.doDownload(appConfig.getUploadFileBaseDir(),
SysUser.class.getSimpleName(), fieldName, filename, true, response);
} catch (Exception e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
log.error(e.getMessage(), e);
}
}
private JSONObject buildLoginData(SysUser user) {
int deviceType = MyCommonUtil.getDeviceType();
boolean isAdmin = user.getUserType() == SysUserType.TYPE_ADMIN;
String headImageUrl = user.getHeadImageUrl();
TokenData tokenData = new TokenData();
String sessionId = user.getLoginName() + "_" + deviceType + "_" + MyCommonUtil.generateUuid();
tokenData.setUserId(user.getUserId());
@@ -194,6 +294,9 @@ public class LoginController {
tokenData.setLoginIp(IpUtil.getRemoteIpAddress(ContextUtil.getHttpRequest()));
tokenData.setLoginTime(new Date());
tokenData.setDeviceType(deviceType);
if (StrUtil.isNotBlank(headImageUrl)) {
tokenData.setHeadImageUrl(headImageUrl);
}
List<SysUserRole> userRoleList = sysRoleService.getSysUserRoleListByUserId(user.getUserId());
if (CollectionUtils.isNotEmpty(userRoleList)) {
Set<Long> userRoleIdSet = userRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet());
@@ -205,6 +308,9 @@ public class LoginController {
jsonData.put(TokenData.REQUEST_ATTRIBUTE_NAME, tokenData);
jsonData.put("showName", user.getShowName());
jsonData.put("isAdmin", isAdmin);
if (StrUtil.isNotBlank(headImageUrl)) {
jsonData.put("headImageUrl", headImageUrl);
}
Collection<SysMenu> menuList;
Collection<String> permCodeList;
if (isAdmin) {

View File

@@ -119,27 +119,7 @@ public class SysDeptController extends BaseController<SysDept, SysDeptVo, Long>
if (MyCommonUtil.existBlankArgument(deptId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
// 验证关联Id的数据合法性
SysDept originalSysDept = sysDeptService.getById(deptId);
if (originalSysDept == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (sysDeptService.hasChildren(deptId)) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象存在子对象],请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.HAS_CHILDREN_DATA, errorMessage);
}
if (sysDeptService.hasChildrenUser(deptId)) {
errorMessage = "数据验证失败,请先移除部门用户数据后,再删除当前部门!";
return ResponseResult.error(ErrorCodeEnum.HAS_CHILDREN_DATA, errorMessage);
}
if (!sysDeptService.remove(deptId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
return this.doDelete(deptId);
}
/**
@@ -390,4 +370,43 @@ public class SysDeptController extends BaseController<SysDept, SysDeptVo, Long>
public ResponseResult<List<Map<String, Object>>> aggregateBy(@RequestBody MyAggregationParam aggregationParam) {
return super.baseAggregateBy(aggregationParam);
}
/**
* 根据过滤字段和过滤集合,返回不存在的数据。主要用于微服务间远程过程调用。
*
* @param queryParam 查询参数。
* @return 不存在的数据集合。
*/
@ApiOperation(hidden = true, value = "notExist")
@PostMapping("/notExist")
public ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam) {
List<?> notExistIdSet = service().notExist(
queryParam.getInFilterField(), queryParam.getInFilterValues(), true);
return ResponseResult.success(notExistIdSet);
}
private ResponseResult<Void> doDelete(Long deptId) {
String errorMessage;
// 验证关联Id的数据合法性
SysDept originalSysDept = sysDeptService.getById(deptId);
if (originalSysDept == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (sysDeptService.hasChildren(deptId)) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象存在子对象],请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.HAS_CHILDREN_DATA, errorMessage);
}
if (sysDeptService.hasChildrenUser(deptId)) {
errorMessage = "数据验证失败,请先移除部门用户数据后,再删除当前部门!";
return ResponseResult.error(ErrorCodeEnum.HAS_CHILDREN_DATA, errorMessage);
}
if (!sysDeptService.remove(deptId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
}
}

View File

@@ -1,6 +1,7 @@
package com.orangeforms.upmsservice.controller;
import com.alibaba.fastjson.TypeReference;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.collection.CollUtil;
import com.github.pagehelper.page.PageMethod;
import com.orangeforms.upmsservice.model.*;
@@ -13,15 +14,22 @@ import com.orangeforms.common.core.constant.*;
import com.orangeforms.common.core.base.controller.BaseController;
import com.orangeforms.common.core.base.service.IBaseService;
import com.orangeforms.common.core.annotation.MyRequestBody;
import com.orangeforms.common.core.upload.BaseUpDownloader;
import com.orangeforms.common.core.upload.UpDownloaderFactory;
import com.orangeforms.common.core.upload.UploadResponseInfo;
import com.orangeforms.common.core.upload.UploadStoreInfo;
import com.orangeforms.common.log.annotation.OperationLog;
import com.orangeforms.common.log.model.constant.SysOperationLogType;
import com.orangeforms.common.redis.cache.SessionCacheHelper;
import com.orangeforms.upmsservice.config.ApplicationConfig;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
/**
@@ -40,6 +48,10 @@ public class SysUserController extends BaseController<SysUser, SysUserVo, Long>
private SysUserService sysUserService;
@Autowired
private ApplicationConfig appConfig;
@Autowired
private SessionCacheHelper cacheHelper;
@Autowired
private UpDownloaderFactory upDownloaderFactory;
@Override
protected IBaseService<SysUser, Long> service() {
@@ -149,18 +161,7 @@ public class SysUserController extends BaseController<SysUser, SysUserVo, Long>
if (MyCommonUtil.existBlankArgument(userId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
// 验证关联Id的数据合法性
SysUser originalSysUser = sysUserService.getById(userId);
if (originalSysUser == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (!sysUserService.remove(userId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
return this.doDelete(userId);
}
/**
@@ -205,6 +206,101 @@ public class SysUserController extends BaseController<SysUser, SysUserVo, Long>
return ResponseResult.success(sysUserVo);
}
/**
* 附件文件下载。
* 这里将图片和其他类型的附件文件放到不同的父目录下,主要为了便于今后图片文件的迁移。
*
* @param userId 附件所在记录的主键Id。
* @param fieldName 附件所属的字段名。
* @param filename 文件名。如果没有提供该参数,就从当前记录的指定字段中读取。
* @param asImage 下载文件是否为图片。
* @param response Http 应答对象。
*/
@OperationLog(type = SysOperationLogType.DOWNLOAD, saveResponse = false)
@GetMapping("/download")
public void download(
@RequestParam(required = false) Long userId,
@RequestParam String fieldName,
@RequestParam String filename,
@RequestParam Boolean asImage,
HttpServletResponse response) {
if (MyCommonUtil.existBlankArgument(fieldName, filename, asImage)) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}
// 使用try来捕获异常是为了保证一旦出现异常可以返回500的错误状态便于调试。
// 否则有可能给前端返回的是200的错误码。
try {
// 如果请求参数中没有包含主键Id就判断该文件是否为当前session上传的。
if (userId == null) {
if (!cacheHelper.existSessionUploadFile(filename)) {
ResponseResult.output(HttpServletResponse.SC_FORBIDDEN);
return;
}
} else {
SysUser sysUser = sysUserService.getById(userId);
if (sysUser == null) {
ResponseResult.output(HttpServletResponse.SC_NOT_FOUND);
return;
}
String fieldJsonData = (String) ReflectUtil.getFieldValue(sysUser, fieldName);
if (fieldJsonData == null) {
ResponseResult.output(HttpServletResponse.SC_BAD_REQUEST);
return;
}
if (!BaseUpDownloader.containFile(fieldJsonData, filename)) {
ResponseResult.output(HttpServletResponse.SC_FORBIDDEN);
return;
}
}
UploadStoreInfo storeInfo = MyModelUtil.getUploadStoreInfo(SysUser.class, fieldName);
if (!storeInfo.isSupportUpload()) {
ResponseResult.output(HttpServletResponse.SC_NOT_IMPLEMENTED,
ResponseResult.error(ErrorCodeEnum.INVALID_UPLOAD_FIELD));
return;
}
BaseUpDownloader upDownloader = upDownloaderFactory.get(storeInfo.getStoreType());
upDownloader.doDownload(appConfig.getUploadFileBaseDir(),
SysUser.class.getSimpleName(), fieldName, filename, asImage, response);
} catch (Exception e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
log.error(e.getMessage(), e);
}
}
/**
* 文件上传操作。
*
* @param fieldName 上传文件名。
* @param asImage 是否作为图片上传。如果是图片,今后下载的时候无需权限验证。否则就是附件上传,下载时需要权限验证。
* @param uploadFile 上传文件对象。
*/
@OperationLog(type = SysOperationLogType.UPLOAD, saveResponse = false)
@PostMapping("/upload")
public void upload(
@RequestParam String fieldName,
@RequestParam Boolean asImage,
@RequestParam("uploadFile") MultipartFile uploadFile) throws Exception {
UploadStoreInfo storeInfo = MyModelUtil.getUploadStoreInfo(SysUser.class, fieldName);
// 这里就会判断参数中指定的字段,是否支持上传操作。
if (!storeInfo.isSupportUpload()) {
ResponseResult.output(HttpServletResponse.SC_FORBIDDEN,
ResponseResult.error(ErrorCodeEnum.INVALID_UPLOAD_FIELD));
return;
}
// 根据字段注解中的存储类型,通过工厂方法获取匹配的上传下载实现类,从而解耦。
BaseUpDownloader upDownloader = upDownloaderFactory.get(storeInfo.getStoreType());
UploadResponseInfo responseInfo = upDownloader.doUpload(appConfig.getServiceContextPath(),
appConfig.getUploadFileBaseDir(), SysUser.class.getSimpleName(), fieldName, asImage, uploadFile);
if (responseInfo.getUploadFailed()) {
ResponseResult.output(HttpServletResponse.SC_FORBIDDEN,
ResponseResult.error(ErrorCodeEnum.UPLOAD_FAILED, responseInfo.getErrorMessage()));
return;
}
cacheHelper.putSessionUploadFile(responseInfo.getFilename());
ResponseResult.output(ResponseResult.success(responseInfo));
}
/**
* 查询用户的权限资源地址列表。同时返回详细的分配路径。
*
@@ -416,6 +512,20 @@ public class SysUserController extends BaseController<SysUser, SysUserVo, Long>
return super.baseAggregateBy(aggregationParam);
}
/**
* 根据过滤字段和过滤集合,返回不存在的数据。主要用于微服务间远程过程调用。
*
* @param queryParam 查询参数。
* @return 不存在的数据集合。
*/
@ApiOperation(hidden = true, value = "notExist")
@PostMapping("/notExist")
public ResponseResult<List<?>> notExist(@RequestBody MyQueryParam queryParam) {
List<?> notExistIdSet = service().notExist(
queryParam.getInFilterField(), queryParam.getInFilterValues(), true);
return ResponseResult.success(notExistIdSet);
}
/**
* 获取指定角色Id集合的用户数据集合。
* @param roleIds 角色Id集合。
@@ -453,4 +563,20 @@ public class SysUserController extends BaseController<SysUser, SysUserVo, Long>
}
return ResponseResult.success(resultList);
}
private ResponseResult<Void> doDelete(Long userId) {
String errorMessage;
// 验证关联Id的数据合法性
SysUser originalSysUser = sysUserService.getById(userId);
if (originalSysUser == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (!sysUserService.remove(userId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
}
}

View File

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.*;
import com.orangeforms.upmsapi.vo.SysUserVo;
import com.orangeforms.upmsapi.constant.SysUserType;
import com.orangeforms.upmsapi.constant.SysUserStatus;
import com.orangeforms.common.core.upload.UploadStoreTypeEnum;
import com.orangeforms.common.core.annotation.*;
import com.orangeforms.common.core.base.model.BaseModel;
import com.orangeforms.common.core.base.mapper.BaseModelMapper;
@@ -64,6 +65,7 @@ public class SysUser extends BaseModel {
/**
* 用户头像的Url。
*/
@UploadFlagColumn(storeType = UploadStoreTypeEnum.LOCAL_SYSTEM)
@TableField(value = "head_image_url")
private String headImageUrl;

View File

@@ -1,7 +1,6 @@
package com.orangeforms.upmsservice.service;
import com.orangeforms.common.core.base.service.IBaseService;
import com.orangeforms.common.core.object.CallResult;
import com.orangeforms.upmsservice.model.SysPerm;
import java.util.*;

View File

@@ -44,13 +44,22 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
boolean update(SysUser user, SysUser originalUser, Set<Long> roleIdSet, Set<Long> dataPermIdSet);
/**
* 重置用户密码。
* 修改用户密码。
* @param userId 用户主键Id。
* @param newPass 新密码。
* @return 成功返回true否则false。
*/
boolean changePassword(Long userId, String newPass);
/**
* 修改用户头像。
*
* @param userId 用户主键Id。
* @param newHeadImage 新的头像信息。
* @return 成功返回true否则false。
*/
boolean changeHeadImage(Long userId, String newHeadImage);
/**
* 删除指定数据。
*

View File

@@ -1,6 +1,6 @@
package com.orangeforms.upmsservice.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.*;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.orangeforms.upmsservice.service.*;
import com.orangeforms.upmsservice.dao.*;

View File

@@ -1,8 +1,8 @@
package com.orangeforms.upmsservice.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.*;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.orangeforms.upmsservice.service.*;
import com.orangeforms.upmsservice.dao.*;
import com.orangeforms.upmsservice.model.*;
@@ -158,7 +158,7 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
}
/**
* 重置用户密码。
* 修改用户密码。
* @param userId 用户主键Id。
* @param newPass 新密码。
* @return 成功返回true否则false。
@@ -172,6 +172,15 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
return sysUserMapper.updateById(updatedUser) == 1;
}
@Transactional(rollbackFor = Exception.class)
@Override
public boolean changeHeadImage(Long userId, String newHeadImage) {
SysUser updatedUser = new SysUser();
updatedUser.setUserId(userId);
updatedUser.setHeadImageUrl(newHeadImage);
return sysUserMapper.updateById(updatedUser) == 1;
}
/**
* 删除指定数据。
*

View File

@@ -0,0 +1,52 @@
package com.orangeforms.upmsservice.util;
import com.anji.captcha.service.CaptchaCacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.concurrent.TimeUnit;
/**
* 对于分布式部署的应用我们建议应用自己实现CaptchaCacheService比如用Redis参考service/spring-boot代码示例。
* 如果应用是单点的也没有使用redis那默认使用内存。
* 内存缓存只适合单节点部署的应用,否则验证码生产与验证在节点之间信息不同步,导致失败。
*
* ☆☆☆ SPI 在resources目录新建META-INF.services文件夹(两层)参考当前服务resources。
* @author lide1202@hotmail.com
* @date 2020-05-12
*/
public class CaptchaCacheServiceRedisImpl implements CaptchaCacheService {
@Override
public String type() {
return "redis";
}
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public void set(String key, String value, long expiresInSeconds) {
stringRedisTemplate.opsForValue().set(key, value, expiresInSeconds, TimeUnit.SECONDS);
}
@Override
public boolean exists(String key) {
return stringRedisTemplate.hasKey(key);
}
@Override
public void delete(String key) {
stringRedisTemplate.delete(key);
}
@Override
public String get(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
@Override
public Long increment(String key, long val) {
return stringRedisTemplate.opsForValue().increment(key,val);
}
}