学习身份信息认证接口接入及全局异常处理

master
chenyuepan 4 weeks ago
parent 9e465b1ebc
commit b99c566e31

@ -209,5 +209,14 @@
<!-- <version>1.0.0</version> &lt;!&ndash; 使用最新版本 &ndash;&gt;-->
<!-- </dependency>-->
</dependencies>
<!-- 全局 build -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

@ -32,7 +32,7 @@ public class CacheInitializer {
log.info("敏感词库已加载到Redis");
} catch (Exception e) {
e.printStackTrace();
log.error("服务异常,"+e.getMessage());
log.error("服务异常," + e.getMessage());
}
}
}

@ -0,0 +1,25 @@
package com.example.venue_reservation_service.controller;
import com.example.venue_reservation_service.service.PaymentService;
import com.example.venue_reservation_service.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/payment")
@Api("支付流水模块")
@CrossOrigin
public class PaymentController {
@Resource
private PaymentService paymentService;
// @ApiOperation("查询订单列表")
// @PostMapping("/query")
// public Result
}

@ -1,15 +1,13 @@
package com.example.venue_reservation_service.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.example.venue_reservation_service.domain.School;
import com.example.venue_reservation_service.service.SchoolService;
import com.example.venue_reservation_service.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/school")
@ -20,9 +18,28 @@ public class SchoolController {
@Resource
private SchoolService schoolService;
@ApiOperation("获取单位分布情况")
@GetMapping("/college")
public Result college(){
return schoolService.queryColleges();
@ApiOperation("加载认证单位列表")
@GetMapping("/units")
public Result units(@RequestParam("type") String type){
return schoolService.queryUnits(type);
}
@ApiOperation("用户认证")
@PostMapping("/certify")
public Result certify(@RequestBody School school){
return schoolService.userCertify(school);
}
@ApiOperation("修改认证信息")
@PostMapping("/update")
public Result update(@RequestBody School school){
return schoolService.updateCertify(school);
}
@ApiOperation("获取用户认证信息")
@GetMapping("/detail/{userId}")
public Result detail(@PathVariable("userId") Integer userId){
return Result.ok(schoolService.getOne(Wrappers.<School>lambdaQuery().eq(School::getUserId, userId))).message("查询成功");
}
}

@ -20,6 +20,12 @@ public class TypeController {
@Resource
private TypeService typeService;
@ApiOperation("查询某个场馆信息")
@GetMapping("/select/{id}")
public Result select(@PathVariable("id") Integer id){
return Result.ok(typeService.getById(id)).message("查询成功");
}
@ApiOperation("查看所有场馆信息")
@PostMapping("/queryAll")
public Result queryAll(@RequestBody PageDTO dto){

@ -110,7 +110,6 @@ public class UserController {
public Result upload(@RequestParam("id") Integer userId, @RequestParam("image") MultipartFile file){
return userService.upload(userId, file);
}
@ApiOperation("用户信息获取")
@GetMapping("/info/{id}")
public Result info(@PathVariable("id") Integer userId){

@ -0,0 +1,38 @@
package com.example.venue_reservation_service.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
/**
*
* &#064;TableName venue_institution
*/
@TableName(value ="venue_institution")
@Data
public class Institution implements Serializable {
/**
*
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
*
*/
private String name;
/**
*
*/
private String type;
@Serial
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

@ -0,0 +1,72 @@
package com.example.venue_reservation_service.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
/**
*
* @TableName venue_question
*/
@TableName(value ="venue_question")
@Data
public class Question implements Serializable {
/**
*
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
*
*/
private Integer userId;
/**
*
*/
private String username;
/**
*
*/
private String phone;
/**
* or
*/
private String questionType;
/**
*
*/
private String description;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createdTime;
/**
* 0 1
*/
private Integer status;
/**
*
*/
private String type;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

@ -0,0 +1,59 @@
package com.example.venue_reservation_service.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
/**
*
* @TableName venue_reply
*/
@TableName(value ="venue_reply")
@Data
public class Reply implements Serializable {
/**
*
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
*
*/
private Integer adminId;
/**
*
*/
private String content;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createdTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updatedTime;
/**
*
*/
private Integer questionId;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

@ -40,53 +40,11 @@ public class School implements Serializable {
*/
private Integer userId;
/**
*
*/
private String description;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@Override
public boolean equals(Object that) {
if (this == that) {
return true;
}
if (that == null) {
return false;
}
if (getClass() != that.getClass()) {
return false;
}
School other = (School) that;
return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
&& (this.getSchoolNumber() == null ? other.getSchoolNumber() == null : this.getSchoolNumber().equals(other.getSchoolNumber()))
&& (this.getType() == null ? other.getType() == null : this.getType().equals(other.getType()))
&& (this.getCollege() == null ? other.getCollege() == null : this.getCollege().equals(other.getCollege()))
&& (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId()));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
result = prime * result + ((getSchoolNumber() == null) ? 0 : getSchoolNumber().hashCode());
result = prime * result + ((getType() == null) ? 0 : getType().hashCode());
result = prime * result + ((getCollege() == null) ? 0 : getCollege().hashCode());
result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode());
return result;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", id=").append(id);
sb.append(", schoolNumber=").append(schoolNumber);
sb.append(", type=").append(type);
sb.append(", college=").append(college);
sb.append(", userId=").append(userId);
sb.append(", serialVersionUID=").append(serialVersionUID);
sb.append("]");
return sb.toString();
}
}

@ -83,6 +83,16 @@ public class User implements Serializable {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDateTime updateTime;
/**
*
*/
private Integer isCertify;
/**
*
*/
private Integer operableTimes;
@TableField(exist = false)
private static final long serialVersionUID = 1L;

@ -25,6 +25,11 @@ public class VenueHot implements Serializable {
@TableId(type = IdType.AUTO)
private Integer id;
/**
*
*/
private String title;
/**
*
*/

@ -1,12 +1,11 @@
package com.example.venue_reservation_service.vo.hdjd;
package com.example.venue_reservation_service.entity;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
// 分页信息类
public class PageInfo {
@Data
public class Page {
@JsonProperty("pageNo")
private int pageNo;
private int pageNumber;
@JsonProperty("pageSize")
private int pageSize;

@ -0,0 +1,18 @@
package com.example.venue_reservation_service.entity;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
// 人员信息类
@Data
public class PersonInfo {
@JsonProperty("GH")
private String employeeId;
@JsonProperty("XM")
private String name;
@JsonProperty("SJHM")
private String phone;
}

@ -0,0 +1,21 @@
package com.example.venue_reservation_service.entity;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
// 根响应类
@Data
public class ResponseData {
private String success;
private List<PersonInfo> message;
private PageInfo page;
}

@ -50,6 +50,60 @@ public class GlobalExceptionHandler {
return Result.fail().message("头像上传失败,请稍后重试");
}
@ExceptionHandler(IdentityException.class)
public Result handleIdentityException(IdentityException e) {
log.error("身份认证业务异常: {} - {}", e.getErrorCode(), e.getMessage());
recordException(e, "IdentityException");
// 根据错误码返回不同提示(示例)
if ("IDENTITY_002".equals(e.getErrorCode())) {
return Result.fail().message("账号未注册,请联系管理员");
} else if ("IDENTITY_004".equals(e.getErrorCode())) {
return Result.fail().message("网络连接超时,请稍后重试");
} else {
return Result.fail().message(e.getMessage());
}
}
// 新增敏感词过滤异常处理
@ExceptionHandler(SensitiveFilterException.class)
public Result handleSensitiveFilterException(SensitiveFilterException e) {
log.error("敏感词处理异常 [错误码:{}]: {}", e.getErrorCode(), e.getMessage(), e);
recordException(e, "SensitiveFilterException");
// 根据错误码返回不同提示
if ("SENSITIVE_001".equals(e.getErrorCode())) {
return Result.fail().message("评论服务暂时不可用,请稍后再试");
} else {
return Result.fail().message("评论处理失败,请重试");
}
}
// 新增敏感词操作异常处理
@ExceptionHandler(SensitiveWordException.class)
public Result handleSensitiveWordException(SensitiveWordException e) {
log.error("敏感词操作异常 [错误码:{}]: {}", e.getErrorCode(), e.getMessage(), e);
recordException(e, "SensitiveWordException");
// 根据错误码返回不同提示
if ("SENSITIVE_002".equals(e.getErrorCode())) {
return Result.fail().message("敏感词状态更新失败,请稍后重试");
} else {
return Result.fail().message("敏感词操作失败,请重试");
}
}
/**
*
*/
@ExceptionHandler(SystemException.class)
public Result handleSystemException(SystemException e) {
log.error("系统级异常 [错误码:{}]: {}", e.getErrorCode(), e.getMessage(), e);
recordException(e, "SystemException");
return Result.fail().message(e.getMessage());
}
// 记录异常到数据库
private void recordException(Exception e, String exceptionType) {
try {

@ -0,0 +1,23 @@
package com.example.venue_reservation_service.exception;
/**
*
*/
public class IdentityException extends RuntimeException {
private final String errorCode;
public IdentityException(String message) {
super(message);
this.errorCode = "IDENTITY_001"; // 默认为通用身份认证错误码
}
public IdentityException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public String getErrorCode() {
return errorCode;
}
}

@ -0,0 +1,21 @@
package com.example.venue_reservation_service.exception;
/**
*
*/
public class SensitiveFilterException extends RuntimeException {
private String errorCode;
public SensitiveFilterException(String message) {
super(message);
}
public SensitiveFilterException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public String getErrorCode() {
return errorCode;
}
}

@ -0,0 +1,22 @@
package com.example.venue_reservation_service.exception;
import lombok.Getter;
/**
*
*/
@Getter
public class SensitiveWordException extends RuntimeException {
private final String errorCode;
public SensitiveWordException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public SensitiveWordException(String errorCode, String message, Throwable cause) {
super(message, cause);
this.errorCode = errorCode;
}
}

@ -0,0 +1,32 @@
package com.example.venue_reservation_service.exception;
/**
* -
*/
public class SystemException extends RuntimeException {
private final String errorCode;
public SystemException(String message) {
super(message);
this.errorCode = "SYS_001"; // 默认系统异常错误码
}
public SystemException(String message, Throwable cause) {
super(message, cause);
this.errorCode = "SYS_001";
}
public SystemException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public SystemException(String errorCode, String message, Throwable cause) {
super(message, cause);
this.errorCode = errorCode;
}
public String getErrorCode() {
return errorCode;
}
}

@ -0,0 +1,28 @@
package com.example.venue_reservation_service.mapper;
import com.example.venue_reservation_service.domain.Institution;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author 31586
* @description venue_institutionMapper
* @createDate 2025-06-19 14:40:51
* @Entity generator.domain.Institution
*/
@Mapper
public interface InstitutionMapper extends BaseMapper<Institution> {
/**
*
* @param type
* @return
*/
List<String> selectByType(@Param("type") String type);
}

@ -0,0 +1,18 @@
package com.example.venue_reservation_service.mapper;
import com.example.venue_reservation_service.domain.Question;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 31586
* @description venue_question()Mapper
* @createDate 2025-06-21 14:15:36
* @Entity generator.domain.Question
*/
public interface QuestionMapper extends BaseMapper<Question> {
}

@ -0,0 +1,18 @@
package com.example.venue_reservation_service.mapper;
import com.example.venue_reservation_service.domain.Reply;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 31586
* @description venue_reply()Mapper
* @createDate 2025-06-21 14:15:36
* @Entity generator.domain.Reply
*/
public interface ReplyMapper extends BaseMapper<Reply> {
}

@ -0,0 +1,13 @@
package com.example.venue_reservation_service.service;
import com.example.venue_reservation_service.domain.Institution;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author 31586
* @description venue_institutionService
* @createDate 2025-06-19 14:40:51
*/
public interface InstitutionService extends IService<Institution> {
}

@ -0,0 +1,13 @@
package com.example.venue_reservation_service.service;
import com.example.venue_reservation_service.domain.Question;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author 31586
* @description venue_question()Service
* @createDate 2025-06-21 14:15:36
*/
public interface QuestionService extends IService<Question> {
}

@ -0,0 +1,13 @@
package com.example.venue_reservation_service.service;
import com.example.venue_reservation_service.domain.Reply;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author 31586
* @description venue_reply()Service
* @createDate 2025-06-21 14:15:36
*/
public interface ReplyService extends IService<Reply> {
}

@ -11,6 +11,10 @@ import com.example.venue_reservation_service.vo.Result;
*/
public interface SchoolService extends IService<School> {
Result queryColleges();
Result queryUnits(String type);
Result userCertify(School school);
Result updateCertify(School school);
}

@ -11,6 +11,7 @@ import com.example.venue_reservation_service.domain.User;
import com.example.venue_reservation_service.domain.UserLike;
import com.example.venue_reservation_service.dto.PageDTO;
import com.example.venue_reservation_service.dto.SearchDTO;
import com.example.venue_reservation_service.exception.SensitiveFilterException;
import com.example.venue_reservation_service.filter.SensitiveFilter;
import com.example.venue_reservation_service.mapper.CommentMapper;
import com.example.venue_reservation_service.mapper.UserMapper;
@ -71,8 +72,9 @@ public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment>
wrapper.eq(Comment::getUserId, dto.getUserId());
}
wrapper.eq(Comment::getStatus, 2)
.orderByDesc(Comment::getCreateTime)
.orderByDesc(Comment::getUpdateTime);
.orderByDesc(Comment::getUpdateTime)
.orderByDesc(Comment::getCreateTime);
page = page(page, wrapper);
QueryVO<AvatarVO> vo = new QueryVO<>();
vo.setTotal(page.getTotal());
@ -107,8 +109,8 @@ public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment>
try {
list = ListConverter.stringToList((String) redisUtil.get(REDIS_KEY));
} catch (Exception e) {
e.printStackTrace();
return Result.fail().message("服务异常");
// 转换为自定义异常并添加错误码
throw new SensitiveFilterException("SENSITIVE_001", "敏感词库加载失败");
}
SensitiveFilter filter = new SensitiveFilter();
filter.buildTrie(list);

@ -0,0 +1,22 @@
package com.example.venue_reservation_service.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.venue_reservation_service.domain.Institution;
import com.example.venue_reservation_service.mapper.InstitutionMapper;
import com.example.venue_reservation_service.service.InstitutionService;
import org.springframework.stereotype.Service;
/**
* @author 31586
* @description venue_institutionService
* @createDate 2025-06-19 14:40:51
*/
@Service
public class InstitutionServiceImpl extends ServiceImpl<InstitutionMapper, Institution>
implements InstitutionService{
}

@ -0,0 +1,22 @@
package com.example.venue_reservation_service.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.venue_reservation_service.domain.Question;
import com.example.venue_reservation_service.mapper.QuestionMapper;
import com.example.venue_reservation_service.service.QuestionService;
import org.springframework.stereotype.Service;
/**
* @author 31586
* @description venue_question()Service
* @createDate 2025-06-21 14:15:36
*/
@Service
public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question>
implements QuestionService{
}

@ -0,0 +1,22 @@
package com.example.venue_reservation_service.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.venue_reservation_service.domain.Reply;
import com.example.venue_reservation_service.service.ReplyService;
import com.example.venue_reservation_service.mapper.ReplyMapper;
import org.springframework.stereotype.Service;
/**
* @author 31586
* @description venue_reply()Service
* @createDate 2025-06-21 14:15:36
*/
@Service
public class ReplyServiceImpl extends ServiceImpl<ReplyMapper, Reply>
implements ReplyService{
}

@ -173,7 +173,7 @@ public class ReservationServiceImpl extends ServiceImpl<ReservationMapper, Reser
aDouble -= money;
balance.setBalance(aDouble);
// 生成支付记录
Payment payment = new Payment(dto.getUserId(), money, "支出", LocalDateTime.now());
Payment payment = new Payment(dto.getUserId(), money, "预约支出", LocalDateTime.now());
paymentService.save(payment);
balanceService.updateById(balance);
@ -226,7 +226,6 @@ public class ReservationServiceImpl extends ServiceImpl<ReservationMapper, Reser
// 归还支付金额
balanceService.returnMoney(reservation.getUserId(), payment.getAmount());
}
}
}
@ -289,6 +288,7 @@ public class ReservationServiceImpl extends ServiceImpl<ReservationMapper, Reser
information.getId(),
information.getType(),
information.getVenueName(),
reservation.getAuditStatus(),
timeStr,
reservation.getReservationDate() + "",
type.getVname(),
@ -333,7 +333,9 @@ public class ReservationServiceImpl extends ServiceImpl<ReservationMapper, Reser
// 归还支付金额
Payment payment = paymentService.getById(reservation.getPayId());
// 修改支付情况
payment.setAmount(0.0);
payment.setSituation("取消");
payment.setTime(LocalDateTime.now());
paymentService.updateById(payment);
// 修改用户账户余额
balanceService.returnMoney(reservation.getUserId(), payment.getAmount());

@ -3,12 +3,30 @@ package com.example.venue_reservation_service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.venue_reservation_service.domain.School;
import com.example.venue_reservation_service.domain.User;
import com.example.venue_reservation_service.entity.PersonInfo;
import com.example.venue_reservation_service.entity.ResponseData;
import com.example.venue_reservation_service.exception.IdentityException;
import com.example.venue_reservation_service.exception.SystemException;
import com.example.venue_reservation_service.mapper.InstitutionMapper;
import com.example.venue_reservation_service.mapper.UserMapper;
import com.example.venue_reservation_service.service.SchoolService;
import com.example.venue_reservation_service.mapper.SchoolMapper;
import com.example.venue_reservation_service.utils.IdentityUtil;
import com.example.venue_reservation_service.vo.Result;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.crypto.NoSuchPaddingException;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.util.List;
import java.util.Optional;
/**
* @author 31586
@ -16,18 +34,114 @@ import java.util.List;
* @createDate 2025-01-05 15:42:15
*/
@Service
@Slf4j
public class SchoolServiceImpl extends ServiceImpl<SchoolMapper, School>
implements SchoolService{
@Resource
private InstitutionMapper institutionMapper;
@Resource
private UserMapper userMapper;
private final ObjectMapper mapper = new ObjectMapper();
@Override
public Result queryUnits(String type) {
return Result.
ok(institutionMapper.selectByType("学生".equalsIgnoreCase(type) ? "学院与教学机构" : null)).
message("数据获取成功");
}
@Override
public Result userCertify(School school) {
// 基础用户校验(复用逻辑)
User user = validateUser(school.getUserId());
if (user == null) {
return Result.fail().message("用户信息不存在");
}
// 设置用户类型
user.setType("学生".equals(school.getType()) ? 1 : 2);
// 教职工身份验证
if (user.getType() == 2) {
validateStaffIdentity(school);
}
// 更新用户认证状态
user.setOperableTimes(2);
user.setIsCertify(1);
userMapper.updateById(user);
// 保存学校信息
save(school);
return Result.ok(school).message("身份认证成功");
}
@Override
public Result queryColleges() {
// 获取各个单位
QueryWrapper<School> collegeWrapper = new QueryWrapper<>();
collegeWrapper.select("DISTINCT college");
List<String> colleges = getBaseMapper().selectObjs(collegeWrapper)
.stream()
.map(obj -> (String) obj).toList();
return Result.ok(colleges).message("ok");
public Result updateCertify(School school) {
// 基础用户校验(复用逻辑)
User user = validateUser(school.getUserId());
if (user == null) {
return Result.fail().message("用户信息不存在");
}
// 校验修改次数
// if (user.getIsCertify() == 1 && user.getOperableTimes() <= 0) {
// return Result.fail().message("修改次数已用完,请联系管理员进行重置");
// }
// 更新用户认证状态
user.setOperableTimes(user.getOperableTimes() - 1);
user.setIsCertify(1);
userMapper.updateById(user);
// 更新学校信息
updateById(school);
return Result.ok().message("认证信息修改成功");
}
/**
*
*/
private User validateUser(Integer userId) {
return userMapper.selectById(userId);
}
/**
*
*/
private void validateStaffIdentity(School school) {
try {
// 调用身份认证接口
String res = IdentityUtil.getGzzxList(school.getSchoolNumber());
// 结果有效性校验
if ("-1".equals(res)) {
throw new IdentityException("身份认证接口调用失败,请检查参数");
}
// 解析JSON响应
ResponseData result = mapper.readValue(res, ResponseData.class);
if (!"true".equals(result.getSuccess()) || result.getMessage() == null || result.getMessage().isEmpty()) {
throw new IdentityException("身份信息异常,请稍后重试");
}
// 验证返回的教职工信息
PersonInfo info = result.getMessage().get(0);
if (!school.getSchoolNumber().equals(info.getEmployeeId()) ||
!school.getSchoolNumber().equals(info.getPhone())) {
throw new IdentityException("教职工信息不匹配");
}
} catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchPaddingException e) {
throw new SystemException("加密组件异常,请联系管理员", e);
} catch (IOException e) {
throw new IdentityException("IDENTITY_004", "网络连接失败,请检查网络");
} catch (Exception e) {
throw new IdentityException("响应数据解析失败,请稍后重试");
}
}
}

@ -8,6 +8,7 @@ import com.example.venue_reservation_service.converter.ListConverter;
import com.example.venue_reservation_service.domain.SensitiveWord;
import com.example.venue_reservation_service.dto.SensitiveWordDTO;
import com.example.venue_reservation_service.dto.WordDTO;
import com.example.venue_reservation_service.exception.SensitiveWordException;
import com.example.venue_reservation_service.mapper.SensitiveWordMapper;
import com.example.venue_reservation_service.service.SensitiveWordService;
import com.example.venue_reservation_service.utils.RedisUtil;
@ -118,7 +119,8 @@ public class SensitiveWordServiceImpl extends ServiceImpl<SensitiveWordMapper, S
try {
redisUtil.set(REDIS_KEY, ListConverter.listToString(sensitiveWordMapper.selectWordsOrderedByPriority()));
} catch (Exception e) {
log.error("服务异常,"+e.getMessage());
log.error("更新敏感词库缓存失败ID:{}"+ e.getMessage());
throw new SensitiveWordException("SENSITIVE_002", "敏感词状态更新失败,请稍后重试", e);
}
return Result.ok().message("设置成功");
}

@ -0,0 +1,118 @@
package com.example.venue_reservation_service.utils;
import okhttp3.*;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.io.IOException;
import java.security.Key;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
*
*/
public class IdentityUtil {
// 向量
private final static String iv = "01234567";
// 加解密统一使用的编码方式
private final static String encoding = "utf-8";
// 密钥
private final static String pk = "08192ec57d80193b9fa4b9a0";
// 请求路径
private static final String PATH = "http://dcpint.ecjtu.edu.cn/unis/IfsDcpIntPortalServlet";
// OkHttpClient实例
private static final OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(3, TimeUnit.SECONDS)
.build();
/**
* 3DES
*/
public static String desEncode(String plainText) throws Exception {
DESedeKeySpec spec = new DESedeKeySpec(pk.getBytes());
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
Key deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));
return bytesToHexString(encryptData);
}
/**
*
*/
private static String bytesToHexString(byte[] b) {
StringBuilder ret = new StringBuilder();
for (byte value : b) {
String hex = Integer.toHexString(value & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret.append(hex.toUpperCase());
}
return ret.toString();
}
/**
* HTTP POST
*/
public static String httpPostRequest(Map<String, String> params) {
if (params == null || params.isEmpty()) {
return "-1";
}
FormBody.Builder formBuilder = new FormBody.Builder();
for (Map.Entry<String, String> entry : params.entrySet()) {
try {
formBuilder.add(entry.getKey(), entry.getValue());
} catch (Exception e) {
e.printStackTrace();
}
}
Request request = new Request.Builder()
.url(PATH)
.post(formBuilder.build())
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful() && response.body() != null) {
return response.body().string();
}
} catch (IOException e) {
e.printStackTrace();
}
return "-1";
}
/**
*
* @param phoneNumber SJHM
* @return API
*/
public static String getGzzxList(String phoneNumber) throws Exception {
String param = "<param>"
+ "<module>IcdcShare</module>"
+ "<method>getJzgjcxx2</method>"
+ "<params>SJHM=" + phoneNumber + "</params>"
+ "</param>";
String encryptedParam = desEncode(param);
Map<String, String> params = new HashMap<>();
params.put("clienttype", "java");
params.put("name", "cgyy_dcpint_getJbxx");
params.put("param", encryptedParam);
return httpPostRequest(params);
}
}

@ -29,6 +29,9 @@ public class ReservationVO {
// 场地名称
String venueName;
// 预约状态
Integer status;
// 时间段
String timeStr;
@ -47,12 +50,8 @@ public class ReservationVO {
// 支付金额
Double price;
// 支付时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime payDate;
}

@ -1,19 +0,0 @@
package com.example.venue_reservation_service.vo.hdjd;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
@Data
public class ResponseResult {
@JsonProperty("success")
private String success;
@JsonProperty("message")
private List<Unit> message;
@JsonProperty("page")
private Page page;
}

@ -1,20 +0,0 @@
package com.example.venue_reservation_service.vo.hdjd;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class Unit {
@JsonProperty("UNIT_ID")
private String unitId;
@JsonProperty("DEPART_ORDER_ID")
private String departOrderId;
@JsonProperty("UNIT_NAME")
private String unitName;
@JsonProperty("PARENT_ID")
private String parentId;
}

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.venue_reservation_service.mapper.InstitutionMapper">
<resultMap id="BaseResultMap" type="com.example.venue_reservation_service.domain.Institution">
<id property="id" column="id" jdbcType="INTEGER"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="type" column="type" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id ,name,type
</sql>
<select id="selectByType" parameterType="string" resultType="string">
SELECT name FROM venue_institution
<where>
<if test="type != null and type != ''">
AND type = #{type}
</if>
</where>
</select>
</mapper>

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.venue_reservation_service.mapper.QuestionMapper">
<resultMap id="BaseResultMap" type="com.example.venue_reservation_service.domain.Question">
<id property="id" column="id" jdbcType="INTEGER"/>
<result property="userId" column="user_id" jdbcType="INTEGER"/>
<result property="username" column="username" jdbcType="VARCHAR"/>
<result property="phone" column="phone" jdbcType="VARCHAR"/>
<result property="questionType" column="question_type" jdbcType="OTHER"/>
<result property="description" column="description" jdbcType="VARCHAR"/>
<result property="createdTime" column="created_time" jdbcType="TIMESTAMP"/>
<result property="status" column="status" jdbcType="OTHER"/>
<result property="type" column="type" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id,user_id,username,
phone,question_type,description,
created_time,status,type
</sql>
</mapper>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.venue_reservation_service.mapper.ReplyMapper">
<resultMap id="BaseResultMap" type="com.example.venue_reservation_service.domain.Reply">
<id property="id" column="id" jdbcType="INTEGER"/>
<result property="adminId" column="admin_id" jdbcType="INTEGER"/>
<result property="content" column="content" jdbcType="VARCHAR"/>
<result property="createdTime" column="created_time" jdbcType="TIMESTAMP"/>
<result property="updatedTime" column="updated_time" jdbcType="TIMESTAMP"/>
<result property="questionId" column="question_id" jdbcType="INTEGER"/>
</resultMap>
<sql id="Base_Column_List">
id,admin_id,content,
created_time,updated_time,question_id
</sql>
</mapper>

@ -1,5 +1,11 @@
package com.example.venue_reservation_service;
import cn.hutool.json.JSONUtil;
import com.example.venue_reservation_service.entity.PersonInfo;
import com.example.venue_reservation_service.entity.ResponseData;
import com.example.venue_reservation_service.utils.IdentityUtil;
import com.example.venue_reservation_service.utils.MD5Util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@ -16,7 +22,15 @@ class VenueReservationServiceApplicationTests {
@Test
void contextLoads() throws Exception {
System.out.println(MD5Util.generateRandomString(10));
}
private static final ObjectMapper objectMapper = new ObjectMapper();
public static void main(String[] args) throws Exception {
String result = IdentityUtil.getGzzxList("13767489908");
System.out.println(result);
}
// public static void main(String[] args) {

@ -1,11 +1,7 @@
package com.example.venue_reservation_service.dcpint.icdcshare;
import com.example.venue_reservation_service.dcpint.util.IfsDcpIntUtils;
import com.example.venue_reservation_service.vo.hdjd.ResponseResult;
import com.example.venue_reservation_service.vo.hdjd.Unit;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map;
@ -22,10 +18,10 @@ public class IfsDcpIcdcShareTest {
String param="<param>"
+ "<module>IcdcShare</module>"
//+ "<method>getUnit</method>"
+ "<method>cgyy_dcpint_getJbxx</method>"
// + "<method>getJzgjcxx2</method>"
+"<sender>08192ec57d80193b9fa4b9a0</sender>"
//+"<params>pageSize=8&pageNo=1</params>"
// + "<method>cgyy_dcpint_getJbxx</method>"
+ "<method>getJzgjcxx2</method>"
// +"<sender>08192ec57d80193b9fa4b9a0</sender>"
+"<params>pageSize=8&pageNo=1&SJHM=13767489908</params>"
// +"<params>GH=1966&pageSize=5&pageNo=1</params>"
//+"<params>STUDENTID=2017</params>"
+ "</param>";
@ -34,7 +30,7 @@ public class IfsDcpIcdcShareTest {
//注意:参数名"clienttype","name"和"param"不能变
params.put("clienttype", "java");
// params.put("name", "thirdpartytest");
params.put("name", "getJzgjcxx2");
params.put("name", "cgyy_dcpint_getJbxx");
params.put("param", param);
/*
(1){"success":true,"message":true}

@ -35,7 +35,8 @@ public class IfsDcpIntUtils {
private final static String iv = "01234567";
// 加解密统一使用的编码方式
private final static String encoding = "utf-8";
private final static String pk="ll.ecjtull.ecjtull.ecjtu";//lltest
// private final static String pk="ll.ecjtull.ecjtull.ecjtu";//lltest
private final static String pk="08192ec57d80193b9fa4b9a0";//lltest
private static String PATH = "http://dcpint.ecjtu.edu.cn/unis/IfsDcpIntPortalServlet";
private static URL url;

Loading…
Cancel
Save