37 changed files with 430 additions and 308 deletions
@ -0,0 +1,33 @@
|
||||
package com.biutag.lan.cache; |
||||
|
||||
import com.biutag.lan.vo.system.LoginUser; |
||||
import com.github.benmanes.caffeine.cache.Cache; |
||||
import com.github.benmanes.caffeine.cache.Caffeine; |
||||
|
||||
import java.util.concurrent.TimeUnit; |
||||
|
||||
public class UserCatch { |
||||
private static final Cache<Integer, LoginUser> cache = Caffeine.newBuilder() |
||||
// 8 * 60分钟
|
||||
.expireAfterWrite(480, TimeUnit.MINUTES) // 设置写入后过期时间
|
||||
.maximumSize(1000) // 最多1000人
|
||||
.build(); |
||||
public static Integer set(Integer key, LoginUser user) { |
||||
cache.put(key, user); |
||||
return key; |
||||
} |
||||
|
||||
public static LoginUser update(Integer key, LoginUser user) { |
||||
cache.put(key, user); |
||||
return user; |
||||
} |
||||
|
||||
public static LoginUser get(Integer key) { |
||||
return cache.getIfPresent(key); |
||||
} |
||||
|
||||
public static void remove(Integer key) { |
||||
cache.invalidate(key); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,29 @@
|
||||
package com.biutag.lan.controller; |
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage; |
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
||||
import com.biutag.aop.NotPower; |
||||
import com.biutag.core.AjaxResult; |
||||
import com.biutag.lan.domain.Notice; |
||||
import com.biutag.lan.domain.vo.NoticeTotalVo; |
||||
import com.biutag.lan.service.NoticeService; |
||||
import lombok.RequiredArgsConstructor; |
||||
import org.springframework.web.bind.annotation.GetMapping; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
||||
import org.springframework.web.bind.annotation.RestController; |
||||
|
||||
@RequiredArgsConstructor |
||||
@RequestMapping("/api/notice") |
||||
@RestController |
||||
public class NoticeController { |
||||
|
||||
private final NoticeService noticeService; |
||||
|
||||
@NotPower |
||||
@GetMapping("total") |
||||
public AjaxResult<NoticeTotalVo> total() { |
||||
IPage<Notice> noticeIPage = noticeService.pageByCurrentUser(new Page<>(1, 1)); |
||||
return AjaxResult.success(new NoticeTotalVo().setTotal(noticeIPage.getTotal()).setNotice(noticeIPage.getRecords().stream().findFirst().orElse(null))); |
||||
} |
||||
|
||||
} |
||||
@ -1,44 +0,0 @@
|
||||
package com.biutag.lan.controller.system; |
||||
|
||||
import com.biutag.lan.service.ISystemLogsServer; |
||||
import com.biutag.lan.validate.commons.PageValidate; |
||||
import com.biutag.lan.validate.system.SystemSearchLoginsValidate; |
||||
import com.biutag.lan.validate.system.SystemSearchOperateValidate; |
||||
import com.biutag.lan.vo.system.SystemLogLoginVo; |
||||
import com.biutag.lan.vo.system.SystemLogOperateVo; |
||||
import com.biutag.core.AjaxResult; |
||||
import com.biutag.core.PageResult; |
||||
import io.swagger.annotations.Api; |
||||
import io.swagger.annotations.ApiOperation; |
||||
import org.springframework.validation.annotation.Validated; |
||||
import org.springframework.web.bind.annotation.GetMapping; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
||||
import org.springframework.web.bind.annotation.RestController; |
||||
|
||||
import jakarta.annotation.Resource; |
||||
|
||||
@RestController |
||||
@RequestMapping("api/system/log") |
||||
@Api(tags = "系统日志管理") |
||||
public class SystemLogsController { |
||||
|
||||
@Resource |
||||
ISystemLogsServer iSystemLogsServer; |
||||
|
||||
@GetMapping("/operate") |
||||
@ApiOperation(value="系统操作日志") |
||||
public AjaxResult<PageResult<SystemLogOperateVo>> operate(@Validated PageValidate pageValidate, |
||||
@Validated SystemSearchOperateValidate searchValidate) { |
||||
PageResult<SystemLogOperateVo> list = iSystemLogsServer.operate(pageValidate, searchValidate); |
||||
return AjaxResult.success(list); |
||||
} |
||||
|
||||
@GetMapping("/login") |
||||
@ApiOperation(value="系统登录日志") |
||||
public AjaxResult<PageResult<SystemLogLoginVo>> login(@Validated PageValidate pageValidate, |
||||
@Validated SystemSearchLoginsValidate searchValidate) { |
||||
PageResult<SystemLogLoginVo> list = iSystemLogsServer.login(pageValidate, searchValidate); |
||||
return AjaxResult.success(list); |
||||
} |
||||
|
||||
} |
||||
@ -1,37 +0,0 @@
|
||||
package com.biutag.lan.crontab; |
||||
|
||||
|
||||
import com.biutag.mapper.system.SystemLogLoginMapper; |
||||
import com.biutag.mapper.system.SystemLogOperateMapper; |
||||
import com.tongweb.commons.utils.DateUtils; |
||||
import jakarta.annotation.Resource; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
import java.time.LocalDate; |
||||
|
||||
|
||||
/** |
||||
* 具体的定时任务 |
||||
*/ |
||||
@Component("logJob") |
||||
public class LogJob { |
||||
|
||||
@Resource |
||||
SystemLogOperateMapper logOperateMapper; |
||||
|
||||
@Resource |
||||
SystemLogLoginMapper logLoginMapper; |
||||
|
||||
|
||||
/* |
||||
month 保留最近月份 |
||||
*/ |
||||
public void deleteLog(Integer month) { |
||||
System.out.println("保留最近月份 : " + month); |
||||
LocalDate currentDate = LocalDate.now(); |
||||
LocalDate monthsAgo = currentDate.minusMonths(month); |
||||
logOperateMapper.deleteLogOperateByMonths(monthsAgo.toString()); |
||||
logLoginMapper.deleteLogLoginByMonths(monthsAgo.toString()); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,17 @@
|
||||
package com.biutag.lan.domain.vo; |
||||
|
||||
import com.biutag.lan.domain.Notice; |
||||
import lombok.Getter; |
||||
import lombok.Setter; |
||||
import lombok.experimental.Accessors; |
||||
|
||||
@Accessors(chain = true) |
||||
@Setter |
||||
@Getter |
||||
public class NoticeTotalVo { |
||||
|
||||
private long total; |
||||
|
||||
private Notice notice; |
||||
|
||||
} |
||||
@ -1,10 +1,64 @@
|
||||
package com.biutag.lan.service; |
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
||||
import com.baomidou.mybatisplus.core.metadata.IPage; |
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
import com.biutag.constants.AppConstants; |
||||
import com.biutag.enums.RoleEnum; |
||||
import com.biutag.lan.config.AdminThreadLocal; |
||||
import com.biutag.lan.domain.Notice; |
||||
import com.biutag.lan.domain.Work; |
||||
import com.biutag.lan.mapper.NoticeMapper; |
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.messaging.simp.SimpMessagingTemplate; |
||||
import org.springframework.scheduling.annotation.Async; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
import java.time.LocalDateTime; |
||||
import java.util.Objects; |
||||
|
||||
@Slf4j |
||||
@RequiredArgsConstructor |
||||
@Service |
||||
public class NoticeService extends ServiceImpl<NoticeMapper, Notice> { |
||||
|
||||
private final SimpMessagingTemplate messagingTemplate; |
||||
|
||||
@Async |
||||
public void save(Integer roleId, Integer deptId, String content, Integer workId) { |
||||
Notice notice = new Notice().setRoleId(roleId).setDeptId(deptId).setContent(content).setCreateTime(LocalDateTime.now()).setReadFlag(AppConstants.NO).setWorkId(workId); |
||||
save(notice); |
||||
messagingTemplate.convertAndSend(String.format("/topic/role/%s/%s", roleId, deptId), ""); |
||||
log.info("发送通知:{}", String.format("/topic/role/%s/%s", roleId, deptId)); |
||||
} |
||||
|
||||
@Async |
||||
public void save(String empNo, String content, Integer workId) { |
||||
Notice notice = new Notice().setEmpNo(empNo).setContent(content).setCreateTime(LocalDateTime.now()).setReadFlag(AppConstants.NO).setWorkId(workId); |
||||
save(notice); |
||||
messagingTemplate.convertAndSend(String.format("/topic/user/%s", empNo), ""); |
||||
log.info("发送通知:{}", String.format("/topic/user/%s", empNo)); |
||||
} |
||||
|
||||
public void save(Work work, String content) { |
||||
if (Objects.nonNull(work.getSignRoleId())) { |
||||
save(work.getSignRoleId(), work.getSignDeptId(), content, work.getId()); |
||||
} else { |
||||
save(work.getPoliceEmpNo(), content, work.getId()); |
||||
} |
||||
} |
||||
|
||||
public IPage<Notice> pageByCurrentUser(IPage<Notice> page) { |
||||
LambdaQueryWrapper<Notice> queryWrapper = new LambdaQueryWrapper<Notice>().eq(Notice::getReadFlag, AppConstants.NO); |
||||
Integer roleId = AdminThreadLocal.getRoleId(); |
||||
if (roleId.equals(RoleEnum.MUNICIPAL_DEPT_CLASSES.getRoleId()) || roleId.equals(RoleEnum.SECOND_DEPT_CLASSES.getRoleId()) || roleId.equals(RoleEnum.THREE_DEPT_CLASSES.getRoleId())) { |
||||
queryWrapper.eq(Notice::getRoleId, roleId).eq(Notice::getDeptId, AdminThreadLocal.getDeptId()); |
||||
} else { |
||||
queryWrapper.eq(Notice::getEmpNo, AdminThreadLocal.getEmpNo()); |
||||
} |
||||
queryWrapper.orderByDesc(Notice::getCreateTime); |
||||
return page(page, queryWrapper); |
||||
} |
||||
|
||||
} |
||||
|
||||
@ -0,0 +1,19 @@
|
||||
package com.biutag.lan.service; |
||||
|
||||
import cn.hutool.core.util.PhoneUtil; |
||||
import com.biutag.lan.util.SmsLan; |
||||
import org.springframework.scheduling.annotation.Async; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
@Component |
||||
public class SmsService { |
||||
|
||||
@Async |
||||
public void sendNotification(String phone) { |
||||
if (!PhoneUtil.isPhone(phone)) { |
||||
return; |
||||
} |
||||
SmsLan.send(phone, "请您及时登录局长信箱即接即办,并对您写的信件进行满意度评价,谢谢您的支持!"); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,26 @@
|
||||
package com.biutag.lan.util; |
||||
|
||||
import cn.dev33.satoken.stp.StpUtil; |
||||
import com.biutag.enums.ErrorEnum; |
||||
import com.biutag.exception.LoginException; |
||||
import com.biutag.lan.cache.UserCatch; |
||||
import com.biutag.lan.vo.system.LoginUser; |
||||
|
||||
import java.util.Objects; |
||||
|
||||
public class LoginUserHelper { |
||||
|
||||
public static LoginUser getCurrentUser() { |
||||
LoginUser user = UserCatch.get(Integer.parseInt(StpUtil.getLoginId().toString())); |
||||
if (Objects.isNull(user)) { |
||||
Integer errCode = ErrorEnum.TOKEN_INVALID.getCode(); |
||||
String errMsg = ErrorEnum.TOKEN_INVALID.getMsg(); |
||||
throw new LoginException(errCode, errMsg); |
||||
} |
||||
return user; |
||||
} |
||||
public static Integer getCurrentUserId() { |
||||
return getCurrentUser().getId(); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,57 @@
|
||||
package com.biutag.lan.vo.system; |
||||
|
||||
import com.biutag.entity.system.PoliceUser; |
||||
import com.biutag.enums.RoleEnum; |
||||
import lombok.Data; |
||||
import lombok.experimental.Accessors; |
||||
|
||||
@Accessors(chain = true) |
||||
@Data |
||||
public class LoginUser { |
||||
|
||||
private Integer id; |
||||
private String name; |
||||
private String empNo; |
||||
|
||||
private Integer roleId; |
||||
|
||||
private String roleName; |
||||
|
||||
private Integer deptId; |
||||
|
||||
private String deptName; |
||||
|
||||
private Integer dataDeptId; |
||||
|
||||
private String dataDeptName; |
||||
|
||||
private Integer postId; |
||||
|
||||
private String postTitle; |
||||
|
||||
private String fullName; |
||||
|
||||
public static LoginUser of(PoliceUser user, DeptVo dept, DeptVo dataDept, RoleVo role) { |
||||
LoginUser loginUser = new LoginUser(); |
||||
Integer roleId = Integer.parseInt(user.getRoleIds()); |
||||
if (RoleEnum.MUNICIPAL_DEPT_CLASSES.getRoleId().equals(roleId)) { |
||||
loginUser.setFullName(String.format("市局专班 %s", user.getName())); |
||||
} else if(RoleEnum.SECOND_DEPT_CLASSES.getRoleId().equals(roleId) || |
||||
RoleEnum.THREE_DEPT_CLASSES.getRoleId().equals(roleId)) { |
||||
loginUser.setFullName(String.format("%s专班 %s", dataDept.getFullName(), user.getName())); |
||||
} else { |
||||
loginUser.setFullName(String.format("%s %s", dataDept.getFullName(), user.getName())); |
||||
} |
||||
loginUser.setId(user.getId()) |
||||
.setName(user.getName()) |
||||
.setEmpNo(user.getEmpNo()) |
||||
.setRoleId(roleId) |
||||
.setRoleName(role.getName()) |
||||
.setDeptId(Integer.parseInt(user.getDeptIds())) |
||||
.setDeptName(dept.getFullName()) |
||||
.setDataDeptId(user.getDataDeptId()) |
||||
.setDataDeptName(dataDept.getFullName()); |
||||
return loginUser; |
||||
} |
||||
|
||||
} |
||||
@ -1,59 +0,0 @@
|
||||
package com.biutag.lan.vo.system; |
||||
|
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
|
||||
import java.io.Serializable; |
||||
|
||||
@Data |
||||
@ApiModel("管理员信息Vo") |
||||
public class PoliceUserInformVo implements Serializable { |
||||
|
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
@ApiModelProperty(value = "主键") |
||||
private Integer id; |
||||
|
||||
@ApiModelProperty(value = "部门ID") |
||||
private Integer deptId; |
||||
|
||||
@ApiModelProperty(value = "岗位ID") |
||||
private Integer postId; |
||||
|
||||
@ApiModelProperty(value = "账号") |
||||
private String username; |
||||
|
||||
@ApiModelProperty(value = "昵称") |
||||
private String nickname; |
||||
|
||||
@ApiModelProperty(value = "头像") |
||||
private String avatar; |
||||
|
||||
@ApiModelProperty(value = "多端登录: [0=否, 1=是]") |
||||
private Integer isMultipoint; |
||||
|
||||
@ApiModelProperty(value = "是否禁用: [0=否, 1=是]") |
||||
private Integer isDisable; |
||||
|
||||
@ApiModelProperty(value = "最后登录IP") |
||||
private String lastLoginIp; |
||||
|
||||
@ApiModelProperty(value = "最后登录时间") |
||||
private String lastLoginTime; |
||||
|
||||
@ApiModelProperty(value = "创建时间") |
||||
private String createTime; |
||||
|
||||
@ApiModelProperty(value = "更新时间") |
||||
private String updateTime; |
||||
|
||||
private String roleName; |
||||
|
||||
private String deptName; |
||||
|
||||
private String name; |
||||
|
||||
private String fullName; |
||||
|
||||
} |
||||
@ -0,0 +1,29 @@
|
||||
package com.biutag.lan.ws.message; |
||||
|
||||
import lombok.Setter; |
||||
import org.springframework.messaging.Message; |
||||
import org.springframework.messaging.MessageHeaders; |
||||
|
||||
import java.util.HashMap; |
||||
|
||||
@Setter |
||||
public class WorkMessage<T> implements Message<T> { |
||||
|
||||
private T payload; |
||||
@Override |
||||
public T getPayload() { |
||||
return payload; |
||||
} |
||||
|
||||
@Override |
||||
public MessageHeaders getHeaders() { |
||||
return new MessageHeaders(new HashMap<>()); |
||||
} |
||||
|
||||
public static WorkMessage<String> of(String key) { |
||||
WorkMessage<String> workMessage = new WorkMessage<>(); |
||||
workMessage.setPayload(key); |
||||
return workMessage; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,9 @@
|
||||
ALTER TABLE "mailbox"."mail" |
||||
ADD COLUMN "extension_request_id" varchar(20); |
||||
|
||||
COMMENT ON COLUMN "mailbox"."mail"."extension_request_id" IS '申请延期ID'; |
||||
|
||||
ALTER TABLE "mailbox"."mail_extension_approval" |
||||
ADD COLUMN "request_id" varchar(20); |
||||
|
||||
COMMENT ON COLUMN "mailbox"."mail_extension_approval"."request_id" IS '申请延期ID'; |
||||
@ -1,9 +1,14 @@
|
||||
ALTER TABLE "mailbox"."mail" |
||||
ADD COLUMN "extension_request_id" varchar(20); |
||||
ALTER TABLE "mailbox"."police_user" |
||||
ADD COLUMN "data_dept_id" int; |
||||
|
||||
COMMENT ON COLUMN "mailbox"."mail"."extension_request_id" IS '申请延期ID'; |
||||
COMMENT ON COLUMN "mailbox"."police_user"."data_dept_id" IS '数据部门ID'; |
||||
|
||||
ALTER TABLE "mailbox"."mail_extension_approval" |
||||
ADD COLUMN "request_id" varchar(20); |
||||
update police_user set data_dept_id = dept_ids where data_dept_id is null; |
||||
|
||||
COMMENT ON COLUMN "mailbox"."mail_extension_approval"."request_id" IS '申请延期ID'; |
||||
ALTER TABLE "mailbox"."notice" |
||||
ADD COLUMN "dept_id" int4; |
||||
|
||||
COMMENT ON COLUMN "mailbox"."notice"."dept_id" IS '部门ID'; |
||||
|
||||
ALTER TABLE "mailbox"."notice" |
||||
ADD COLUMN "work_id" int8; |
||||
Loading…
Reference in new issue