提交 c4aa8b68 编写于 作者: znn1980's avatar znn1980

Initial commit

上级
###项目说明
* 本项目是一个基于url的权限管理系统。
* 本项目使用WebSocket实现了一个在线用户的即时通讯功能,使用的即时通讯前端框架为LayIM最新版。
* 本项目以Maven构建,使用SpringBootMvc 、Thymeleaf、MyBatis。
* 本项目使用的前端框架为layuiAdmin2020最新版。
* 本项目配置在集群环境下可使用SpringRedisSession,可在【application.yml】配置文件中开启,【pom.xml】添加相关依赖。
* 本项使用https访问,可在【application.yml】配置文件中开启,本项目自带一个证书文件【keystore.jks】。
* 【pom.xml】为Maven的配置文件。
* 【src/main/resources/schema-all.sql】为数据库建表脚本。
* 【src/main/resources/data-all.sql】为数据库初始数据脚本。
* 【src/main/resources/keystore.jks】为https的证书文件。
* 【src/main/resources/application.yml】为SpringBoot的配置文件,请修改相应的数据库配置。
### 更新日志
* 2020-07-29
* 界面美化是永久不变的主题。
* 增加【chat_user】表,保存用户头像、签名等信息。
* 使用LayIM、WebSocket实现在线用户的即时通讯功能。
* 增加登陆用户修改头像的功能。
* 2020-07-22
* 界面美化是永久不变的主题。
* 【master_operate】表增加【method】字段,标识操作请求的方法【GET\POST\PUT\DELETE】。
* 【master_group】表增加【status_id】字段,表示分组是否使用。
* 【master_role】表增加【status_id】字段,表示角色是否使用。
* 操作的权限控制判断请求地址与请求方法。
* 权限控制判断分组状态、角色状态、菜单状态、菜单属性、操作状态、操作属性。
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ifacebox.web</groupId>
<artifactId>web-admin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>web-admin</name>
<description>WebAdmin project for Spring Boot</description>
<properties>
<skipTests>true</skipTests>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- Web Mvc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Jdbc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!-- WebSocket -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- 页面模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 验证功能 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- 日志功能 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<!-- MySql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- HttpHeader UserAgent 解析工具 -->
<dependency>
<groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId>
<version>1.21</version>
</dependency>
<!-- 在application.yml文件中添加自定义配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- kaptcha验证码 -->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
<!-- Redis -->
<!--dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency-->
<!--dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency-->
<!-- RedisSession 共享 -->
<!--dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency-->
<!-- 邮件功能 -->
<!--dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency-->
<!-- 定时任务功能 -->
<!--dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency-->
<!-- WebServices 服务 -->
<!--dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package com.ifacebox.web;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author znn
*/
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(com.ifacebox.web.Application.class, args);
}
}
package com.ifacebox.web.admin.controller;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.BaseResponse;
import com.ifacebox.web.common.model.StatusResponse;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author znn
*/
public class BaseBodyController extends BaseController {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public BaseResponse valid(@UserAgentRequest UserAgent userAgent, MethodArgumentNotValidException ex) {
BindingResult bindingResult = ex.getBindingResult();
FieldError fieldError = bindingResult.getFieldError();
if (!ObjectUtils.isEmpty(fieldError)) {
traceLoggerService.addTraceLogger(userAgent, fieldError.getDefaultMessage());
return new BaseResponse(StatusResponse.VALID_FAIL, fieldError.getDefaultMessage());
}
return new BaseResponse(StatusResponse.VALID_FAIL);
}
@ExceptionHandler(Exception.class)
@ResponseBody
public BaseResponse error(@UserAgentRequest UserAgent userAgent, Exception ex) {
traceLoggerService.addTraceLogger(userAgent, ex.toString());
if (logger.isErrorEnabled()) {
logger.error(ex.getMessage(), ex);
}
return new BaseResponse(StatusResponse.EXCEPTION, ex.toString());
}
}
package com.ifacebox.web.admin.controller;
import com.ifacebox.web.admin.logger.service.TraceLoggerService;
import com.ifacebox.web.admin.manager.PermissionManager;
import com.ifacebox.web.admin.master.service.MasterUserService;
import com.ifacebox.web.common.captcha.CalcMathCaptcha;
import com.ifacebox.web.common.manager.PlatformManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Resource;
/**
* @author znn
*/
public class BaseController {
protected static final Logger logger = LoggerFactory.getLogger(BaseController.class);
protected static final String VIEWS_ADMIN_ERROR = "views/error/500";
protected static final String VIEWS_ADMIN_LOGOUT = "views/error/403";
@Resource
protected MasterUserService masterUserService;
@Resource
protected TraceLoggerService traceLoggerService;
@Resource
protected PlatformManager platformManager;
@Resource
protected PermissionManager permissionManager;
@Resource
protected CalcMathCaptcha calcMathCaptcha;
}
package com.ifacebox.web.admin.controller;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
/**
* @author znn
*/
public class BaseViewController extends BaseController {
@ExceptionHandler(Exception.class)
public ModelAndView error(@UserAgentRequest UserAgent userAgent, Exception ex) {
ModelAndView modelAndView = new ModelAndView();
traceLoggerService.addTraceLogger(userAgent, ex.toString());
modelAndView.addObject("error", ex);
modelAndView.setViewName(VIEWS_ADMIN_ERROR);
return modelAndView;
}
}
package com.ifacebox.web.admin.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* @author znn
*/
@Controller
public class ErrorViewController extends BaseViewController {
@GetMapping("/views/error/403.html")
public ModelAndView e403() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("views/error/403");
return modelAndView;
}
@GetMapping("/views/error/404.html")
public ModelAndView e404() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("views/error/404");
return modelAndView;
}
@GetMapping("/views/error/500.html")
public ModelAndView e500() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("error", new NullPointerException());
modelAndView.setViewName("views/error/500");
return modelAndView;
}
}
package com.ifacebox.web.admin.im.controller;
import com.ifacebox.web.admin.controller.BaseBodyController;
import com.ifacebox.web.admin.im.model.*;
import com.ifacebox.web.admin.im.service.ChatUserService;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.BaseResponse;
import com.ifacebox.web.common.model.StatusResponse;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @author znn
*/
@Controller
public class ChatUserController extends BaseBodyController {
@Resource
private ChatUserService chatUserService;
@PutMapping("/admin/im/chat/user/edit.json")
@ResponseBody
public BaseResponse edit(@UserAgentRequest UserAgent userAgent, @RequestBody ChatUser chatUser) {
if (!permissionManager.hasLogin(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
chatUser.setId(userAgent.getMasterUser().getId());
if (!chatUserService.edit(chatUser)) {
return new BaseResponse(StatusResponse.UPDATE_FAIL);
}
return new BaseResponse(StatusResponse.SUCCESS);
}
@GetMapping("/admin/im/chat/user/list.json")
@ResponseBody
public ChatBaseResponse<ChatUserResponse> list(@UserAgentRequest UserAgent userAgent) {
if (!permissionManager.hasLogin(userAgent)) {
return new ChatBaseResponse<>(StatusResponse.LOGOUT);
}
ChatUserResponse response = new ChatUserResponse();
response.setMine(chatUserService.queryById(userAgent.getMasterUser().getId()));
List<ChatUserFriend> friendList = new ArrayList<>();
friendList.add(new ChatUserFriend(ChatUserService.GROUP_ID, ChatUserService.GROUP_NAME, chatUserService.query()));
response.setFriend(friendList);
List<ChatUserGroup> groupList = new ArrayList<>();
groupList.add(new ChatUserGroup(ChatUserService.GROUP_ID, ChatUserService.GROUP_NAME, ChatUserService.AVATAR));
response.setGroup(groupList);
return new ChatBaseResponse(StatusResponse.SUCCESS, response);
}
@GetMapping("/admin/im/chat/user/members.json")
@ResponseBody
public ChatBaseResponse<ChatMembersResponse> members(@UserAgentRequest UserAgent userAgent, @RequestParam("id") Integer id) {
if (!permissionManager.hasLogin(userAgent)) {
return new ChatBaseResponse<>(StatusResponse.LOGOUT);
}
ChatMembersResponse response = new ChatMembersResponse();
response.setList(chatUserService.query());
return new ChatBaseResponse(StatusResponse.SUCCESS, response);
}
}
package com.ifacebox.web.admin.im.dao;
import com.ifacebox.web.admin.im.model.ChatUser;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author znn
*/
@Mapper
@Component
public interface ChatUserDao {
@Select({"<script>"
, "SELECT * FROM chat_user"
, "</script>"})
List<ChatUser> query();
@Select({"<script>"
, "SELECT * FROM chat_user WHERE id = #{id}"
, "</script>"})
ChatUser queryById(Integer id);
@Insert({"<script>"
, "INSERT INTO chat_user"
, "( id, username, status, sign, avatar )"
, "VALUES ( #{id}, #{username}, #{status}, #{sign}, #{avatar} )"
, "</script>"})
Integer save(ChatUser chatUser);
@Update({"<script>"
, "UPDATE chat_user SET"
, "<if test='username != null and !username.isEmpty()'>username = #{username}</if>"
, "<if test='status != null and !status.isEmpty()'>status = #{status}</if>"
, "<if test='sign != null and !sign.isEmpty()'>sign = #{sign}</if>"
, "<if test='avatar != null and !avatar.isEmpty()'>avatar = #{avatar}</if>"
, "WHERE id = #{id}"
, "</script>"})
Integer edit(ChatUser chatUser);
@Delete({"<script>"
, "DELETE FROM chat_user WHERE id = #{id}"
, "</script>"})
Integer delete(Integer id);
}
package com.ifacebox.web.admin.im.model;
import com.ifacebox.web.common.model.StatusResponse;
/**
* @author znn
*/
public class ChatBaseResponse<T> {
private Integer code;
private String msg;
private T data;
public ChatBaseResponse(Integer code, String msg) {
this.setCode(code);
this.setMsg(msg);
}
public ChatBaseResponse(StatusResponse statusResponse) {
this(statusResponse.getStatusCode(), statusResponse.getStatusMessage());
}
public ChatBaseResponse(StatusResponse statusResponse, T data) {
this(statusResponse.getStatusCode(), statusResponse.getStatusMessage());
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
package com.ifacebox.web.admin.im.model;
/**
* @author znn
*/
public class ChatFromMessage {
/**
* 消息来源用户名
*/
private String username;
/**
* 消息来源用户头像
*/
private String avatar;
/**
* 消息的来源ID(如果是私聊,则是用户id,如果是群聊,则是群组id)
*/
private Integer id;
/**
* 聊天窗口来源类型,从发送消息传递的to里面获取
*/
private ChatToMessageType type;
/**
* 消息内容
*/
private String content;
/**
* 消息id,可不传。除非你要对消息进行一些操作(如撤回)
*/
private Integer cid;
/**
* 是否我发送的消息,如果为true,则会显示在右方
*/
private boolean mine;
/**
* 消息的发送者id(比如群组中的某个消息发送者),可用于自动解决浏览器多窗口时的一些问题
*/
private Integer fromid;
/**
* 服务端时间戳毫秒数。
*/
private Long timestamp;
public ChatFromMessage() {
}
public ChatFromMessage(ChatMineMessage mineMessage, ChatToMessage toMessage) {
this.username = mineMessage.getUsername();
this.avatar = mineMessage.getAvatar();
this.type = toMessage.getType();
if (ChatToMessageType.friend == this.type) {
this.id = mineMessage.getId();
}
if (ChatToMessageType.group == this.type) {
this.id = toMessage.getId();
}
this.content = mineMessage.getContent();
this.mine = mineMessage.getId().equals(toMessage.getId());
this.fromid = mineMessage.getId();
this.timestamp = System.currentTimeMillis();
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public ChatToMessageType getType() {
return type;
}
public void setType(ChatToMessageType type) {
this.type = type;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public boolean isMine() {
return mine;
}
public void setMine(boolean mine) {
this.mine = mine;
}
public Integer getFromid() {
return fromid;
}
public void setFromid(Integer fromid) {
this.fromid = fromid;
}
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
}
package com.ifacebox.web.admin.im.model;
import java.util.List;
/**
* @author znn
*/
public class ChatMembersResponse {
private List<ChatUser> list;
public List<ChatUser> getList() {
return list;
}
public void setList(List<ChatUser> list) {
this.list = list;
}
}
package com.ifacebox.web.admin.im.model;
/**
* @author znn
*/
public class ChatMessageRequest {
private ChatMessageType type;
private ChatSendMessage data;
public ChatMessageType getType() {
return type;
}
public void setType(ChatMessageType type) {
this.type = type;
}
public ChatSendMessage getData() {
return data;
}
public void setData(ChatSendMessage data) {
this.data = data;
}
}
package com.ifacebox.web.admin.im.model;
/**
* @author znn
*/
public class ChatMessageResponse<T> {
private ChatMessageType type;
private T data;
public ChatMessageType getType() {
return type;
}
public void setType(ChatMessageType type) {
this.type = type;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
package com.ifacebox.web.admin.im.model;
/**
* @author znn
*/
public enum ChatMessageType {
chatMessage, chatChange, systemMessage, statusMessage, onlineMessage, offlineMessage;
}
package com.ifacebox.web.admin.im.model;
/**
* @author znn
*/
public class ChatMineMessage {
private Integer id;
private String username;
private String avatar;
private boolean mine;
private String content;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public boolean isMine() {
return mine;
}
public void setMine(boolean mine) {
this.mine = mine;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
package com.ifacebox.web.admin.im.model;
/**
* @author znn
*/
public class ChatSendMessage {
private ChatMineMessage mine;
private ChatToMessage to;
public ChatMineMessage getMine() {
return mine;
}
public void setMine(ChatMineMessage mine) {
this.mine = mine;
}
public ChatToMessage getTo() {
return to;
}
public void setTo(ChatToMessage to) {
this.to = to;
}
}
package com.ifacebox.web.admin.im.model;
/**
* @author znn
*/
public class ChatSystemMessage {
private boolean system;
private Integer id;
private ChatToMessageType type;
private String content;
public ChatSystemMessage(Integer id, ChatToMessageType type, String content) {
this.system = true;
this.id = id;
this.type = type;
this.content = content;
}
public boolean isSystem() {
return system;
}
public void setSystem(boolean system) {
this.system = system;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public ChatToMessageType getType() {
return type;
}
public void setType(ChatToMessageType type) {
this.type = type;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
package com.ifacebox.web.admin.im.model;
/**
* @author znn
*/
public class ChatToMessage {
private Integer id;
private String username;
private String groupname;
private String avatar;
private String name;
private String sign;
private ChatUserStatus status;
private ChatToMessageType type;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getGroupname() {
return groupname;
}
public void setGroupname(String groupname) {
this.groupname = groupname;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public ChatUserStatus getStatus() {
return status;
}
public void setStatus(ChatUserStatus status) {
this.status = status;
}
public ChatToMessageType getType() {
return type;
}
public void setType(ChatToMessageType type) {
this.type = type;
}
}
package com.ifacebox.web.admin.im.model;
/**
* @author znn
*/
public enum ChatToMessageType {
friend,group;
}
package com.ifacebox.web.admin.im.model;
/**
* @author znn
*/
public class ChatUser {
private Integer id;
private String username;
private String status;
private String sign;
private String avatar;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
}
package com.ifacebox.web.admin.im.model;
import java.util.List;
/**
* @author znn
*/
public class ChatUserFriend {
private Integer id;
private String groupname;
private List<ChatUser> list;
public ChatUserFriend(Integer id, String groupname, List<ChatUser> list) {
this.id = id;
this.groupname = groupname;
this.list = list;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getGroupname() {
return groupname;
}
public void setGroupname(String groupname) {
this.groupname = groupname;
}
public List<ChatUser> getList() {
return list;
}
public void setList(List<ChatUser> list) {
this.list = list;
}
}
package com.ifacebox.web.admin.im.model;
/**
* @author znn
*/
public class ChatUserGroup {
private Integer id;
private String groupname;
private String avatar;
public ChatUserGroup(Integer id, String groupname,String avatar) {
this.id = id;
this.groupname = groupname;
this.avatar = avatar;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getGroupname() {
return groupname;
}
public void setGroupname(String groupname) {
this.groupname = groupname;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
}
package com.ifacebox.web.admin.im.model;
import java.util.List;
/**
* @author znn
*/
public class ChatUserResponse {
private ChatUser mine;
private List<ChatUserFriend> friend;
private List<ChatUserGroup> group;
public ChatUser getMine() {
return mine;
}
public void setMine(ChatUser mine) {
this.mine = mine;
}
public List<ChatUserFriend> getFriend() {
return friend;
}
public void setFriend(List<ChatUserFriend> friend) {
this.friend = friend;
}
public List<ChatUserGroup> getGroup() {
return group;
}
public void setGroup(List<ChatUserGroup> group) {
this.group = group;
}
}
package com.ifacebox.web.admin.im.model;
/**
* @author znn
*/
public enum ChatUserStatus {
online, hide;
}
package com.ifacebox.web.admin.im.server;
import com.ifacebox.web.admin.im.model.*;
import com.ifacebox.web.admin.im.service.ChatUserService;
import com.ifacebox.web.common.utils.JsonUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author znn
*/
@ServerEndpoint("/admin/im/chat/{userId}")
@Component
public class ChatWebSocketServer {
private static final Logger logger = LoggerFactory.getLogger(ChatWebSocketServer.class);
private static final String PING = "ping";
private static final String PONG = "pong";
private static final Map<Integer, Map<String, ChatUserSession>> USER_SESSION_POOLS = new ConcurrentHashMap<>();
private static ChatUserService chatUserService;
@Autowired
public void setChatUserService(ChatUserService chatUserService) {
ChatWebSocketServer.chatUserService = chatUserService;
}
@OnOpen
public void onOpen(@PathParam("userId") Integer userId, Session session) {
ChatUser chatUser = chatUserService.queryById(userId);
Map<String, ChatUserSession> sessionPools = USER_SESSION_POOLS.get(userId);
if (ObjectUtils.isEmpty(sessionPools)) {
sessionPools = new ConcurrentHashMap<>(10);
sessionPools.put(session.getId(), new ChatUserSession(chatUser, session));
USER_SESSION_POOLS.put(userId, sessionPools);
} else {
sessionPools.put(session.getId(), new ChatUserSession(chatUser, session));
}
if (logger.isInfoEnabled()) {
logger.info("用户【{}/{}】进入,在线人数【{}/{}】。"
, session.getId(), chatUser.getUsername(), USER_SESSION_POOLS.size(), sessionPools.size());
}
ChatMessageResponse<ChatSystemMessage> response = new ChatMessageResponse<>();
response.setType(ChatMessageType.onlineMessage);
response.setData(new ChatSystemMessage(userId, ChatToMessageType.friend
, "用户【" + chatUser.getUsername() + "】上线"));
this.sendMessage(session.getId(), JsonUtils.writeValueAsString(response));
}
@OnClose
public void onClose(@PathParam("userId") Integer userId, Session session) {
Map<String, ChatUserSession> sessionPools = USER_SESSION_POOLS.get(userId);
ChatUserSession userSession = sessionPools.get(session.getId());
ChatUser chatUser = userSession.getChatUser();
sessionPools.remove(session.getId());
if (sessionPools.size() == 0) {
USER_SESSION_POOLS.remove(userId);
}
if (logger.isInfoEnabled()) {
logger.info("用户【{}/{}】退出,在线人数【{}/{}】。"
, session.getId(), chatUser.getUsername(), USER_SESSION_POOLS.size(), sessionPools.size());
}
ChatMessageResponse<ChatSystemMessage> response = new ChatMessageResponse<>();
response.setType(ChatMessageType.offlineMessage);
response.setData(new ChatSystemMessage(userId, ChatToMessageType.friend
, "用户【" + chatUser.getUsername() + "】下线"));
this.sendMessage(session.getId(), JsonUtils.writeValueAsString(response));
}
@OnError
public void onError(@PathParam("userId") Integer userId, Session session, Throwable throwable) {
Map<String, ChatUserSession> sessionPools = USER_SESSION_POOLS.get(userId);
ChatUserSession userSession = sessionPools.get(session.getId());
if (logger.isErrorEnabled()) {
logger.error("用户【{}/{}】异常:{}", session.getId(), userSession.getChatUser().getUsername(), throwable.toString(), throwable);
}
}
@OnMessage
public void onMessage(@PathParam("userId") Integer userId, Session session, String message) {
Map<String, ChatUserSession> sessionPools = USER_SESSION_POOLS.get(userId);
ChatUserSession userSession = sessionPools.get(session.getId());
ChatUser chatUser = userSession.getChatUser();
if (logger.isInfoEnabled()) {
logger.info("用户【{}/{}】信息:{}", session.getId(), chatUser.getUsername(), message);
}
ChatMessageRequest request;
if (PING.equalsIgnoreCase(message)
|| ObjectUtils.isEmpty(request = JsonUtils.readValue(message, ChatMessageRequest.class))) {
this.sendMessage(session.getId(), PONG);
} else {
if (ChatMessageType.chatMessage == request.getType()) {
ChatSendMessage sendMessage = request.getData();
ChatMineMessage mineMessage = sendMessage.getMine();
ChatToMessage toMessage = sendMessage.getTo();
ChatFromMessage fromMessage = new ChatFromMessage(mineMessage, toMessage);
if (ChatToMessageType.friend == toMessage.getType()) {
if (ObjectUtils.isEmpty(USER_SESSION_POOLS.get(toMessage.getId()))) {
ChatMessageResponse<ChatSystemMessage> response = new ChatMessageResponse<>();
response.setType(ChatMessageType.systemMessage);
response.setData(new ChatSystemMessage(toMessage.getId(), ChatToMessageType.friend, "对方不在线"));
this.sendMessage(session, chatUser.getUsername(), JsonUtils.writeValueAsString(response));
} else {
ChatMessageResponse<ChatFromMessage> response = new ChatMessageResponse<>();
response.setType(ChatMessageType.chatMessage);
response.setData(fromMessage);
this.sendMessage(toMessage.getId(), session.getId(), JsonUtils.writeValueAsString(response));
}
}
if (ChatToMessageType.group == toMessage.getType()) {
ChatMessageResponse<ChatFromMessage> response = new ChatMessageResponse<>();
response.setType(ChatMessageType.chatMessage);
response.setData(fromMessage);
this.sendMessage(session.getId(), JsonUtils.writeValueAsString(response));
}
}
}
}
public void sendMessage(Session session, String username, String message) {
if (logger.isInfoEnabled()) {
logger.info("用户【{}/{}】信息:{}", session.getId(), username, message);
}
session.getAsyncRemote().sendText(StringUtils.isEmpty(message) ? PONG : message);
}
public void sendMessage(String sessionId, String message) {
for (Integer userId : USER_SESSION_POOLS.keySet()) {
this.sendMessage(userId, sessionId, message);
}
}
public void sendMessage(Integer userId, String sessionId, String message) {
Map<String, ChatUserSession> sessionPools = USER_SESSION_POOLS.get(userId);
for (ChatUserSession userSession : sessionPools.values()) {
Session session = userSession.getSession();
ChatUser chatUser = userSession.getChatUser();
if (session.getId().equals(sessionId)) {
continue;
}
this.sendMessage(session, chatUser.getUsername(), message);
}
}
static class ChatUserSession {
private ChatUser chatUser;
private Session session;
public ChatUserSession(ChatUser chatUser, Session session) {
this.setChatUser(chatUser);
this.setSession(session);
}
public ChatUser getChatUser() {
return chatUser;
}
public void setChatUser(ChatUser chatUser) {
this.chatUser = chatUser;
}
public Session getSession() {
return session;
}
public void setSession(Session session) {
this.session = session;
}
}
}
package com.ifacebox.web.admin.im.service;
import com.ifacebox.web.admin.im.dao.ChatUserDao;
import com.ifacebox.web.admin.im.model.ChatUser;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.List;
/**
* @author znn
*/
@Service
public class ChatUserService {
public static final Integer GROUP_ID = -1;
public static final String GROUP_NAME = "全部";
public static final String AVATAR = "../../views/admin/img/logo_32x32.png";
@Resource
private ChatUserDao chatUserDao;
public List<ChatUser> query() {
return chatUserDao.query();
}
public ChatUser queryById(Integer id) {
return chatUserDao.queryById(id);
}
public boolean edit(ChatUser chatUser) {
return !ObjectUtils.isEmpty(chatUserDao.edit(chatUser));
}
}
package com.ifacebox.web.admin.logger.controller;
import com.ifacebox.web.admin.controller.BaseBodyController;
import com.ifacebox.web.admin.logger.model.TraceLogger;
import com.ifacebox.web.admin.logger.model.TraceLoggerQuery;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @author znn
*/
@Controller
public class TraceLoggerController extends BaseBodyController {
@GetMapping("/admin/logger/list.json")
@ResponseBody
public ModelResponse<List<TraceLogger>> list(@UserAgentRequest UserAgent userAgent, TraceLoggerQuery traceLoggerQuery) {
if (!permissionManager.hasPermission(userAgent)) {
return new ModelResponse<>(StatusResponse.LOGOUT);
}
return new ModelResponse<>(StatusResponse.SUCCESS, traceLoggerService.total(traceLoggerQuery), traceLoggerService.query(traceLoggerQuery));
}
@DeleteMapping("/admin/logger/delete.json")
@ResponseBody
public BaseResponse delete(@UserAgentRequest UserAgent userAgent, @RequestBody Integer[] id) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
if (!traceLoggerService.delete(id)) {
return new BaseResponse(StatusResponse.DELETE_FAIL);
}
return new BaseResponse(StatusResponse.SUCCESS);
}
}
package com.ifacebox.web.admin.logger.controller;
import com.ifacebox.web.admin.controller.BaseViewController;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* @author znn
*/
@Controller
public class TraceViewController extends BaseViewController {
@GetMapping("/views/admin/logger.html")
public ModelAndView logger(@UserAgentRequest UserAgent userAgent) {
ModelAndView modelAndView = new ModelAndView();
if (!permissionManager.hasPermission(userAgent)) {
modelAndView.setViewName(VIEWS_ADMIN_LOGOUT);
return modelAndView;
}
modelAndView.setViewName("views/admin/logger");
return modelAndView;
}
}
package com.ifacebox.web.admin.logger.dao;
import com.ifacebox.web.admin.logger.model.TraceLogger;
import com.ifacebox.web.admin.logger.model.TraceLoggerQuery;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author znn
*/
@Mapper
@Component
public interface TraceLoggerDao {
@Select({"<script>"
, "SELECT * FROM trace_logger"
, "<where>"
, "<if test='startTime != null and !startTime.isEmpty()'>AND create_time &gt;= #{startTime}</if>"
, "<if test='endTime != null and !endTime.isEmpty()'>AND create_time &lt;= #{endTime}</if>"
, "</where>"
, "ORDER BY create_time DESC LIMIT #{offset}, #{limit}"
, "</script>"})
List<TraceLogger> query(TraceLoggerQuery traceLoggerQuery);
@Select({"<script>"
, "SELECT COUNT(*) FROM trace_logger"
, "<where>"
, "<if test='startTime != null and !startTime.isEmpty()'>AND create_time &gt;= #{startTime}</if>"
, "<if test='endTime != null and !endTime.isEmpty()'>AND create_time &lt;= #{endTime}</if>"
, "</where>"
, "</script>"})
Long total(TraceLoggerQuery traceLoggerQuery);
@Insert({"<script>"
, "INSERT INTO trace_logger"
, "( user_id, ip,os, browser, user_agent, message, cost_millis )"
, "VALUES ( #{userId}, #{ip}, #{os}, #{browser}, #{userAgent}, #{message}, #{costMillis} )"
, "</script>"})
@Options(useGeneratedKeys = true, keyProperty = "id")
Integer save(TraceLogger traceLogger);
@Delete({"<script>"
, "DELETE FROM trace_logger WHERE id = #{id}"
, "</script>"})
Integer delete(Integer id);
}
package com.ifacebox.web.admin.logger.model;
/**
* @author znn
*/
public class TraceLogger {
private Integer id;
private String userId;
private String ip;
private String os;
private String browser;
private String userAgent;
private String message;
private Long costMillis;
private String createTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getOs() {
return os;
}
public void setOs(String os) {
this.os = os;
}
public String getBrowser() {
return browser;
}
public void setBrowser(String browser) {
this.browser = browser;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Long getCostMillis() {
return costMillis;
}
public void setCostMillis(Long costMillis) {
this.costMillis = costMillis;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
}
package com.ifacebox.web.admin.logger.model;
import com.ifacebox.web.common.model.TimeBetween;
/**
* @author znn
*/
public class TraceLoggerQuery extends TimeBetween {
}
package com.ifacebox.web.admin.logger.service;
import com.ifacebox.web.admin.logger.dao.TraceLoggerDao;
import com.ifacebox.web.admin.logger.model.TraceLogger;
import com.ifacebox.web.admin.logger.model.TraceLoggerQuery;
import com.ifacebox.web.common.model.UserAgent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.List;
/**
* @author znn
*/
@Service
public class TraceLoggerService {
private static final Logger logger = LoggerFactory.getLogger(TraceLoggerService.class);
@Resource
private TraceLoggerDao traceLoggerDao;
public List<TraceLogger> query(TraceLoggerQuery traceLoggerQuery) {
return traceLoggerDao.query(traceLoggerQuery);
}
public Long total(TraceLoggerQuery traceLoggerQuery) {
return traceLoggerDao.total(traceLoggerQuery);
}
public void addTraceLogger(UserAgent userAgent, String message, String... params) {
TraceLogger traceLogger = new TraceLogger();
if (!ObjectUtils.isEmpty(userAgent.getMasterUser())) {
traceLogger.setUserId(userAgent.getMasterUser().getUsername());
}
traceLogger.setIp(userAgent.getIp());
traceLogger.setOs(userAgent.getOs());
traceLogger.setBrowser(userAgent.getBrowser());
traceLogger.setUserAgent(userAgent.getMessage());
for (String param : params) {
message = message.replaceFirst("\\{}", param);
}
traceLogger.setMessage(message);
traceLogger.setCostMillis(System.currentTimeMillis() - userAgent.getDate());
if (logger.isInfoEnabled()) {
logger.info("请求【{}】操作【{}】", userAgent.toString(), message);
}
traceLoggerDao.save(traceLogger);
}
public boolean delete(Integer... id) {
for (Integer i = 0; id != null && i < id.length; i++) {
if (!this.delete(id[i])) {
return false;
}
}
return true;
}
public boolean delete(Integer id) {
return !ObjectUtils.isEmpty(traceLoggerDao.delete(id));
}
}
package com.ifacebox.web.admin.manager;
import com.ifacebox.web.admin.master.dao.MasterMenuDao;
import com.ifacebox.web.admin.master.dao.MasterOperateDao;
import com.ifacebox.web.admin.master.model.*;
import com.ifacebox.web.admin.master.service.MasterUserService;
import com.ifacebox.web.common.model.UserAgent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.ObjectUtils;
import org.springframework.util.PathMatcher;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
/**
* @author znn
*/
@Component
public class PermissionManager {
private static final Logger logger = LoggerFactory.getLogger(PermissionManager.class);
@Resource
private MasterMenuDao masterMenuDao;
@Resource
private MasterOperateDao masterOperateDao;
public String hasPassword(String password) {
//此处可以使用MD5加密
//DigestUtils.md5DigestAsHex(password.getBytes());
return "$" + password + "$";
}
public boolean hasLogin(UserAgent userAgent) {
return !ObjectUtils.isEmpty(userAgent)
&& !ObjectUtils.isEmpty(userAgent.getMasterUser())
&& !StringUtils.isEmpty(userAgent.getMethod())
&& !StringUtils.isEmpty(userAgent.getUrl());
}
public boolean hasPermission(UserAgent userAgent) {
if (!this.hasLogin(userAgent)) {
return false;
}
if (MasterUserService.ADMIN_NAME.equals(userAgent.getMasterUser().getUsername())) {
return true;
}
if (this.hasMenuPermission(userAgent, userAgent.getMasterUser())) {
return true;
}
if (this.hasOperatePermission(userAgent, userAgent.getMasterUser())) {
return true;
}
return false;
}
private boolean hasMenuPermission(UserAgent userAgent, MasterUser masterUser) {
PathMatcher matcher = new AntPathMatcher();
for (MasterMenu masterMenu : masterMenuDao.queryByUserId(masterUser.getId())) {
if (logger.isDebugEnabled()) {
logger.debug("匹配{}:{}访问菜单{}权限", userAgent.getMethod(), userAgent.getUrl(), masterMenu.getAddress());
}
if (!StringUtils.isEmpty(masterMenu.getAddress())
&& matcher.match(userAgent.getUrl(), masterMenu.getAddress())
&& MasterMenuStatus.ENABLE.getStatusId().equals(masterMenu.getStatusId())) {
return true;
}
}
return false;
}
private boolean hasOperatePermission(UserAgent userAgent, MasterUser masterUser) {
PathMatcher matcher = new AntPathMatcher();
for (MasterOperate masterOperate : masterOperateDao.queryByUserId(masterUser.getId())) {
if (logger.isDebugEnabled()) {
logger.debug("匹配{}:{}访问操作{}:{}权限", userAgent.getMethod(), userAgent.getUrl(), masterOperate.getMethod(), masterOperate.getAddress());
}
if (!StringUtils.isEmpty(masterOperate.getAddress())
&& matcher.match(userAgent.getUrl(), masterOperate.getAddress())
&& userAgent.getMethod().equalsIgnoreCase(masterOperate.getMethod())
&& MasterOperateStatus.ENABLE.getStatusId().equals(masterOperate.getStatusId())) {
return true;
}
}
return false;
}
}
package com.ifacebox.web.admin.master.controller;
import com.ifacebox.web.admin.controller.BaseBodyController;
import com.ifacebox.web.admin.master.model.MasterGroup;
import com.ifacebox.web.admin.master.model.MasterGroupStatus;
import com.ifacebox.web.admin.master.service.MasterGroupService;
import com.ifacebox.web.admin.master.service.MasterUserGroupService;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.BaseResponse;
import com.ifacebox.web.common.model.ModelResponse;
import com.ifacebox.web.common.model.StatusResponse;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.stereotype.Controller;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
@Controller
public class MasterGroupController extends BaseBodyController {
@Resource
private MasterGroupService masterGroupService;
@Resource
private MasterUserGroupService masterUserGroupService;
@GetMapping("/admin/group/status.json")
@ResponseBody
public ModelResponse<List<Map<String, Object>>> status() {
return new ModelResponse<>(StatusResponse.SUCCESS, MasterGroupStatus.toArray());
}
@GetMapping("/admin/group/list.json")
@ResponseBody
public ModelResponse<List<MasterGroup>> list(@UserAgentRequest UserAgent userAgent) {
if (!permissionManager.hasPermission(userAgent)) {
return new ModelResponse<>(StatusResponse.LOGOUT);
}
return new ModelResponse<>(StatusResponse.SUCCESS, masterGroupService.query());
}
@PostMapping("/admin/group/save.json")
@ResponseBody
public BaseResponse save(@UserAgentRequest UserAgent userAgent, @RequestBody @Validated MasterGroup masterGroup) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
if (!ObjectUtils.isEmpty(masterGroupService.queryByGroupName(masterGroup.getGroupName()))) {
return new BaseResponse(StatusResponse.SAVE_FAIL, "分组名称已存在!");
}
if (masterGroupService.save(masterGroup, userAgent)) {
traceLoggerService.addTraceLogger(userAgent, "添加分组成功!【{}】", masterGroup.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.SAVE_FAIL);
}
}
@PutMapping("/admin/group/edit.json")
@ResponseBody
public BaseResponse edit(@UserAgentRequest UserAgent userAgent, @RequestBody @Validated MasterGroup masterGroup) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterGroup oldMasterGroup = masterGroupService.queryById(masterGroup.getId());
if (ObjectUtils.isEmpty(oldMasterGroup)) {
return new BaseResponse(StatusResponse.SAVE_FAIL, "修改的分组不存在!");
}
if (!oldMasterGroup.getGroupName().equals(masterGroup.getGroupName())
&& !ObjectUtils.isEmpty(masterGroupService.queryByGroupName(masterGroup.getGroupName()))) {
return new BaseResponse(StatusResponse.SAVE_FAIL, "分组名称已存在!");
}
if (masterGroupService.edit(masterGroup, userAgent)) {
traceLoggerService.addTraceLogger(userAgent, "修改分组成功!【{}】", masterGroup.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.UPDATE_FAIL);
}
}
@DeleteMapping("/admin/group/delete.json")
@ResponseBody
public BaseResponse delete(@UserAgentRequest UserAgent userAgent, @RequestParam Integer id) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterGroup masterGroup = masterGroupService.queryById(id);
if (ObjectUtils.isEmpty(masterGroup)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "删除的分组不存在!");
}
if (!ObjectUtils.isEmpty(masterUserGroupService.queryByGroupId(id))) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "此分组已分配用户,请先删除用户下的分组!");
}
if (masterGroupService.delete(id)) {
traceLoggerService.addTraceLogger(userAgent, "删除分组成功!【{}】", masterGroup.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.DELETE_FAIL);
}
}
}
package com.ifacebox.web.admin.master.controller;
import com.ifacebox.web.admin.controller.BaseBodyController;
import com.ifacebox.web.admin.master.model.*;
import com.ifacebox.web.admin.master.service.MasterMenuService;
import com.ifacebox.web.admin.master.service.MasterRoleMenuService;
import com.ifacebox.web.admin.master.service.MasterUserService;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.BaseResponse;
import com.ifacebox.web.common.model.ModelResponse;
import com.ifacebox.web.common.model.StatusResponse;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.stereotype.Controller;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
@Controller
public class MasterMenuController extends BaseBodyController {
@Resource
private MasterMenuService masterMenuService;
@Resource
private MasterRoleMenuService masterRoleMenuService;
@GetMapping("/admin/menu/side.json")
@ResponseBody
public ModelResponse<List<MasterMenuTree>> side(@UserAgentRequest UserAgent userAgent) {
if (!permissionManager.hasLogin(userAgent)) {
return new ModelResponse<>(StatusResponse.LOGOUT);
}
MasterUser masterUser = userAgent.getMasterUser();
List<MasterMenuTree> menuTreeList;
if (MasterUserService.ADMIN_NAME.equals(masterUser.getUsername())) {
menuTreeList = masterMenuService.queryTree();
} else {
menuTreeList = masterMenuService.queryTreeByUserId(masterUser.getId());
}
return new ModelResponse<>(StatusResponse.SUCCESS, menuTreeList);
}
@GetMapping("/admin/menu/attr.json")
@ResponseBody
public ModelResponse<List<Map<String, Object>>> attr() {
return new ModelResponse<>(StatusResponse.SUCCESS, MasterMenuAttr.toArray());
}
@GetMapping("/admin/menu/status.json")
@ResponseBody
public ModelResponse<List<Map<String, Object>>> status() {
return new ModelResponse<>(StatusResponse.SUCCESS, MasterMenuStatus.toArray());
}
@GetMapping("/admin/menu/root.json")
@ResponseBody
public ModelResponse<List<MasterMenu>> root(@UserAgentRequest UserAgent userAgent) {
if (!permissionManager.hasLogin(userAgent)) {
return new ModelResponse<>(StatusResponse.LOGOUT);
}
return new ModelResponse<>(StatusResponse.SUCCESS, masterMenuService.queryByParentId(MasterMenuService.TREE_ROOT));
}
@GetMapping("/admin/menu/list.json")
@ResponseBody
public ModelResponse<List<MasterMenuTree>> list(@UserAgentRequest UserAgent userAgent) {
if (!permissionManager.hasPermission(userAgent)) {
return new ModelResponse<>(StatusResponse.LOGOUT);
}
return new ModelResponse<>(StatusResponse.SUCCESS, masterMenuService.queryTree());
}
@PostMapping("/admin/menu/save.json")
@ResponseBody
public BaseResponse save(@UserAgentRequest UserAgent userAgent, @RequestBody @Validated MasterMenu masterMenu) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
if (!ObjectUtils.isEmpty(masterMenuService.queryByTitle(masterMenu.getTitle()))) {
return new BaseResponse(StatusResponse.UPDATE_FAIL, "菜单标题已存在!");
}
if (MasterMenuService.TREE_ROOT != masterMenu.getParentId()
&& ObjectUtils.isEmpty(masterMenuService.queryById(masterMenu.getParentId()))) {
return new BaseResponse(StatusResponse.UPDATE_FAIL, "上级菜单不存在!");
}
if (masterMenuService.save(masterMenu, userAgent)) {
traceLoggerService.addTraceLogger(userAgent, "添加菜单成功!【{}】", masterMenu.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.SAVE_FAIL);
}
}
@PutMapping("/admin/menu/edit.json")
@ResponseBody
public BaseResponse edit(@UserAgentRequest UserAgent userAgent, @RequestBody @Validated MasterMenu masterMenu) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterMenu oldMasterMenu = masterMenuService.queryById(masterMenu.getId());
if (ObjectUtils.isEmpty(oldMasterMenu)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "修改的菜单不存在!");
}
if (!oldMasterMenu.getTitle().equals(masterMenu.getTitle())
&& !ObjectUtils.isEmpty(masterMenuService.queryByTitle(masterMenu.getTitle()))) {
return new BaseResponse(StatusResponse.UPDATE_FAIL, "菜单标题已存在!");
}
if (masterMenu.getId().equals(masterMenu.getParentId())) {
return new BaseResponse(StatusResponse.UPDATE_FAIL, "上级菜单不能选择自己!");
}
if (MasterMenuService.TREE_ROOT != masterMenu.getParentId()
&& ObjectUtils.isEmpty(masterMenuService.queryById(masterMenu.getParentId()))) {
return new BaseResponse(StatusResponse.UPDATE_FAIL, "上级菜单不存在!");
}
if (masterMenuService.edit(masterMenu, userAgent)) {
traceLoggerService.addTraceLogger(userAgent, "修改菜单成功!【{}】", masterMenu.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.UPDATE_FAIL);
}
}
@DeleteMapping("/admin/menu/delete.json")
@ResponseBody
public BaseResponse delete(@UserAgentRequest UserAgent userAgent, @RequestParam Integer id) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterMenu masterMenu = masterMenuService.queryById(id);
if (ObjectUtils.isEmpty(masterMenu)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "删除的菜单不存在!");
}
if (!ObjectUtils.isEmpty(masterMenuService.queryByParentId(id))) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "请先删除下级菜单!");
}
if (!ObjectUtils.isEmpty(masterRoleMenuService.queryByMenuId(id))) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "此菜单已分配角色,请先删除角色下的菜单!");
}
if (masterMenuService.delete(id)) {
traceLoggerService.addTraceLogger(userAgent, "删除菜单成功!【{}】", masterMenu.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.DELETE_FAIL);
}
}
}
package com.ifacebox.web.admin.master.controller;
import com.ifacebox.web.admin.controller.BaseBodyController;
import com.ifacebox.web.admin.master.model.*;
import com.ifacebox.web.admin.master.service.MasterOperateService;
import com.ifacebox.web.admin.master.service.MasterRoleOperateService;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.BaseResponse;
import com.ifacebox.web.common.model.ModelResponse;
import com.ifacebox.web.common.model.StatusResponse;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.stereotype.Controller;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
@Controller
public class MasterOperateController extends BaseBodyController {
@Resource
private MasterOperateService masterOperateService;
@Resource
private MasterRoleOperateService masterRoleOperateService;
@GetMapping("/admin/operate/method.json")
@ResponseBody
public ModelResponse<MasterOperateMethod[]> method() {
return new ModelResponse<>(StatusResponse.SUCCESS, MasterOperateMethod.values());
}
@GetMapping("/admin/operate/attr.json")
@ResponseBody
public ModelResponse<List<Map<String, Object>>> attr() {
return new ModelResponse<>(StatusResponse.SUCCESS, MasterOperateAttr.toArray());
}
@GetMapping("/admin/operate/status.json")
@ResponseBody
public ModelResponse<List<Map<String, Object>>> status() {
return new ModelResponse<>(StatusResponse.SUCCESS, MasterOperateStatus.toArray());
}
@GetMapping("/admin/operate/root.json")
@ResponseBody
public ModelResponse<List<MasterOperate>> root() {
return new ModelResponse<>(StatusResponse.SUCCESS, masterOperateService.queryByParentId(MasterOperateService.TREE_ROOT));
}
@GetMapping("/admin/operate/list.json")
@ResponseBody
public ModelResponse<List<MasterOperateTree>> list(@UserAgentRequest UserAgent userAgent) {
if (!permissionManager.hasPermission(userAgent)) {
return new ModelResponse<>(StatusResponse.LOGOUT);
}
return new ModelResponse<>(StatusResponse.SUCCESS, masterOperateService.queryTree());
}
@PostMapping("/admin/operate/save.json")
@ResponseBody
public BaseResponse save(@UserAgentRequest UserAgent userAgent, @RequestBody @Validated MasterOperate masterOperate) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
if (!ObjectUtils.isEmpty(masterOperateService.queryByTitle(masterOperate.getTitle()))) {
return new BaseResponse(StatusResponse.UPDATE_FAIL, "操作标题已存在!");
}
if (MasterOperateService.TREE_ROOT != masterOperate.getParentId()
&& ObjectUtils.isEmpty(masterOperateService.queryById(masterOperate.getParentId()))) {
return new BaseResponse(StatusResponse.UPDATE_FAIL, "上级操作不存在!");
}
if (masterOperateService.save(masterOperate, userAgent)) {
traceLoggerService.addTraceLogger(userAgent, "添加操作成功!【{}】", masterOperate.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.SAVE_FAIL);
}
}
@PutMapping("/admin/operate/edit.json")
@ResponseBody
public BaseResponse edit(@UserAgentRequest UserAgent userAgent, @RequestBody @Validated MasterOperate masterOperate) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterOperate oldMasterOperate = masterOperateService.queryById(masterOperate.getId());
if (ObjectUtils.isEmpty(oldMasterOperate)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "修改的操作不存在!");
}
if (!oldMasterOperate.getTitle().equals(masterOperate.getTitle())
&& !ObjectUtils.isEmpty(masterOperateService.queryByTitle(masterOperate.getTitle()))) {
return new BaseResponse(StatusResponse.UPDATE_FAIL, "操作标题已存在!");
}
if (masterOperate.getId().equals(masterOperate.getParentId())) {
return new BaseResponse(StatusResponse.UPDATE_FAIL, "上级操作不能选择自己!");
}
if (MasterOperateService.TREE_ROOT != masterOperate.getParentId()
&& ObjectUtils.isEmpty(masterOperateService.queryById(masterOperate.getParentId()))) {
return new BaseResponse(StatusResponse.UPDATE_FAIL, "上级操作不存在!");
}
if (masterOperateService.edit(masterOperate, userAgent)) {
traceLoggerService.addTraceLogger(userAgent, "修改操作成功!【{}】", masterOperate.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.UPDATE_FAIL);
}
}
@DeleteMapping("/admin/operate/delete.json")
@ResponseBody
public BaseResponse delete(@UserAgentRequest UserAgent userAgent, @RequestParam Integer id) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterOperate masterOperate = masterOperateService.queryById(id);
if (ObjectUtils.isEmpty(masterOperate)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "删除的操作不存在!");
}
if (!ObjectUtils.isEmpty(masterOperateService.queryByParentId(id))) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "请先删除下级操作!");
}
if (!ObjectUtils.isEmpty(masterRoleOperateService.queryByOperateId(id))) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "此操作已分配角色,请先删除角色下的操作!");
}
if (masterOperateService.delete(id)) {
traceLoggerService.addTraceLogger(userAgent, "删除操作成功!【{}】", masterOperate.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.DELETE_FAIL);
}
}
}
package com.ifacebox.web.admin.master.controller;
import com.ifacebox.web.admin.controller.BaseBodyController;
import com.ifacebox.web.admin.master.model.*;
import com.ifacebox.web.admin.master.service.MasterGroupRoleService;
import com.ifacebox.web.admin.master.service.MasterRoleMenuService;
import com.ifacebox.web.admin.master.service.MasterRoleOperateService;
import com.ifacebox.web.admin.master.service.MasterRoleService;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.BaseResponse;
import com.ifacebox.web.common.model.ModelResponse;
import com.ifacebox.web.common.model.StatusResponse;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.stereotype.Controller;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
@Controller
public class MasterRoleController extends BaseBodyController {
@Resource
private MasterRoleService masterRoleService;
@Resource
private MasterGroupRoleService masterGroupRoleService;
@Resource
private MasterRoleMenuService masterRoleMenuService;
@Resource
private MasterRoleOperateService masterRoleOperateService;
@GetMapping("/admin/role/status.json")
@ResponseBody
public ModelResponse<List<Map<String, Object>>> status() {
return new ModelResponse<>(StatusResponse.SUCCESS, MasterRoleStatus.toArray());
}
@GetMapping("/admin/role/list.json")
@ResponseBody
public ModelResponse<List<MasterRole>> list(@UserAgentRequest UserAgent userAgent) {
if (!permissionManager.hasPermission(userAgent)) {
return new ModelResponse<>(StatusResponse.LOGOUT);
}
return new ModelResponse<>(StatusResponse.SUCCESS, masterRoleService.query());
}
@PostMapping("/admin/role/save.json")
@ResponseBody
public BaseResponse save(@UserAgentRequest UserAgent userAgent, @RequestBody @Validated MasterRole masterRole) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
if (!ObjectUtils.isEmpty(masterRoleService.queryByRoleName(masterRole.getRoleName()))) {
return new BaseResponse(StatusResponse.SAVE_FAIL, "角色名称已存在!");
}
if (masterRoleService.save(masterRole, userAgent)) {
traceLoggerService.addTraceLogger(userAgent, "添加角色成功!【{}】", masterRole.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.SAVE_FAIL);
}
}
@PutMapping("/admin/role/edit.json")
@ResponseBody
public BaseResponse edit(@UserAgentRequest UserAgent userAgent, @RequestBody @Validated MasterRole masterRole) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterRole oldMasterRole = masterRoleService.queryById(masterRole.getId());
if (ObjectUtils.isEmpty(oldMasterRole)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "修改的角色不存在!");
}
if (!oldMasterRole.getRoleName().equals(masterRole.getRoleName())
&& !ObjectUtils.isEmpty(masterRoleService.queryByRoleName(masterRole.getRoleName()))) {
return new BaseResponse(StatusResponse.SAVE_FAIL, "角色名称已存在!");
}
if (masterRoleService.edit(masterRole, userAgent)) {
traceLoggerService.addTraceLogger(userAgent, "修改角色成功!【{}】", masterRole.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.UPDATE_FAIL);
}
}
@DeleteMapping("/admin/role/delete.json")
@ResponseBody
public BaseResponse delete(@UserAgentRequest UserAgent userAgent, @RequestParam Integer id) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterRole masterRole = masterRoleService.queryById(id);
if (ObjectUtils.isEmpty(masterRole)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "删除的角色不存在!");
}
if (!ObjectUtils.isEmpty(masterGroupRoleService.queryByRoleId(masterRole.getId()))) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "此角色已添加到分组,请先删除分组下的角色!");
}
if (!ObjectUtils.isEmpty(masterRoleMenuService.queryByRoleId(masterRole.getId()))) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "此角色已分配菜单,请先删除角色下的菜单!");
}
if (!ObjectUtils.isEmpty(masterRoleOperateService.queryByRoleId(masterRole.getId()))) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "此角色已分配操作,请先删除角色下的操作!");
}
if (masterRoleService.delete(id)) {
traceLoggerService.addTraceLogger(userAgent, "删除角色成功!【{}】", masterRole.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.DELETE_FAIL);
}
}
}
package com.ifacebox.web.admin.master.controller;
import com.ifacebox.web.admin.controller.BaseBodyController;
import com.ifacebox.web.admin.master.model.MasterRole;
import com.ifacebox.web.admin.master.service.MasterRoleMenuService;
import com.ifacebox.web.admin.master.service.MasterRoleService;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.BaseResponse;
import com.ifacebox.web.common.model.StatusResponse;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.stereotype.Controller;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
/**
* @author znn
*/
@Controller
public class MasterRoleMenuController extends BaseBodyController {
@Resource
private MasterRoleMenuService masterRoleMenuService;
@Resource
private MasterRoleService masterRoleService;
@PostMapping("/admin/role/menu/save.json")
@ResponseBody
public BaseResponse save(@UserAgentRequest UserAgent userAgent, @RequestBody MasterRole masterRole) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterRole oldMasterRole = masterRoleService.queryById(masterRole.getId());
if (ObjectUtils.isEmpty(oldMasterRole)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "角色不存在!");
}
if (masterRoleMenuService.save(masterRole)) {
traceLoggerService.addTraceLogger(userAgent, "分配菜单权限成功!【{}】", oldMasterRole.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.SAVE_FAIL);
}
}
}
package com.ifacebox.web.admin.master.controller;
import com.ifacebox.web.admin.controller.BaseBodyController;
import com.ifacebox.web.admin.master.model.MasterRole;
import com.ifacebox.web.admin.master.service.MasterRoleOperateService;
import com.ifacebox.web.admin.master.service.MasterRoleService;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.BaseResponse;
import com.ifacebox.web.common.model.StatusResponse;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.stereotype.Controller;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
/**
* @author znn
*/
@Controller
public class MasterRoleOperateController extends BaseBodyController {
@Resource
private MasterRoleOperateService masterRoleOperateService;
@Resource
private MasterRoleService masterRoleService;
@PostMapping("/admin/role/operate/save.json")
@ResponseBody
public BaseResponse save(@UserAgentRequest UserAgent userAgent, @RequestBody MasterRole masterRole) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterRole oldMasterRole = masterRoleService.queryById(masterRole.getId());
if (ObjectUtils.isEmpty(oldMasterRole)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "角色不存在!");
}
if (masterRoleOperateService.save(masterRole)) {
traceLoggerService.addTraceLogger(userAgent, "分配操作权限成功!【{}】", oldMasterRole.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.SAVE_FAIL);
}
}
}
package com.ifacebox.web.admin.master.controller;
import com.ifacebox.web.admin.controller.BaseBodyController;
import com.ifacebox.web.admin.master.model.*;
import com.ifacebox.web.admin.master.service.MasterUserService;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.*;
import org.springframework.stereotype.Controller;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
@Controller
public class MasterUserController extends BaseBodyController {
@PostMapping("/admin/login.json")
@ResponseBody
public ModelResponse<MasterUser> login(@UserAgentRequest UserAgent userAgent, @RequestBody @Validated MasterUserLogin masterUserLogin) {
if (!masterUserService.isCaptcha(userAgent.getSession(), masterUserLogin.getCaptcha())) {
return new ModelResponse<>(StatusResponse.LOGOUT, "验证码输入不正确!");
}
masterUserLogin.setPassword(permissionManager.hasPassword(masterUserLogin.getPassword()));
MasterUser masterUser = masterUserService.login(masterUserLogin, userAgent);
if (ObjectUtils.isEmpty(masterUser)) {
return new ModelResponse<>(StatusResponse.LOGOUT, "登陆失败,请检查用户名密码是否正确!");
}
if (!MasterUserStatus.ENABLE.getStatusId().equals(masterUser.getStatusId())) {
return new ModelResponse<>(StatusResponse.LOGOUT, "账号未启用,请联系管理员!");
}
traceLoggerService.addTraceLogger(userAgent, "用户登陆成功!【{}】", masterUser.toString());
return new ModelResponse<>(StatusResponse.SUCCESS, masterUser);
}
@GetMapping("/admin/user/attr.json")
@ResponseBody
public ModelResponse<List<Map<String, Object>>> attr() {
return new ModelResponse<>(StatusResponse.SUCCESS, MasterUserAttr.toArray());
}
@GetMapping("/admin/user/status.json")
@ResponseBody
public ModelResponse<List<Map<String, Object>>> status() {
return new ModelResponse<>(StatusResponse.SUCCESS, MasterUserStatus.toArray());
}
@GetMapping("/admin/user/list.json")
@ResponseBody
public ModelResponse<List<MasterUser>> list(@UserAgentRequest UserAgent userAgent, MasterUserQuery userQuery) {
if (!permissionManager.hasPermission(userAgent)) {
return new ModelResponse<>(StatusResponse.LOGOUT);
}
return new ModelResponse<>(StatusResponse.SUCCESS, masterUserService.total(userQuery), masterUserService.query(userQuery));
}
@PostMapping("/admin/user/save.json")
@ResponseBody
public BaseResponse save(@UserAgentRequest UserAgent userAgent, @RequestBody @Validated MasterUser masterUser) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
if (!ObjectUtils.isEmpty(masterUserService.queryByUsername(masterUser.getUsername()))) {
return new BaseResponse(StatusResponse.SAVE_FAIL, "用户名称已存在!");
}
if (!ObjectUtils.isEmpty(masterUserService.queryByMobile(masterUser.getMobile()))) {
return new BaseResponse(StatusResponse.SAVE_FAIL, "用户手机号码已存在!");
}
if (!ObjectUtils.isEmpty(masterUserService.queryByEmail(masterUser.getEmail()))) {
return new BaseResponse(StatusResponse.SAVE_FAIL, "用户邮箱地址已存在!");
}
//默认密码为手机号码的后6位
masterUser.setPassword(permissionManager.hasPassword(masterUser.getMobile().substring(masterUser.getMobile().length() - 6)));
if (masterUserService.save(masterUser, userAgent)) {
traceLoggerService.addTraceLogger(userAgent, "添加用户成功!【{}】", masterUser.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.SAVE_FAIL);
}
}
@PutMapping("/admin/user/edit.json")
@ResponseBody
public BaseResponse edit(@UserAgentRequest UserAgent userAgent, @RequestBody @Validated MasterUser masterUser) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterUser oldMasterUser = masterUserService.queryById(masterUser.getId());
if (ObjectUtils.isEmpty(oldMasterUser)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "修改的用户不存在!");
}
if (MasterUserService.ADMIN_NAME.equals(oldMasterUser.getUsername())
&& !MasterUserService.ADMIN_NAME.equals(userAgent.getMasterUser().getUsername())) {
return new BaseResponse(StatusResponse.SAVE_FAIL, "你不能修改超级管理员的信息!");
}
if (!oldMasterUser.getUsername().equals(masterUser.getUsername())) {
return new BaseResponse(StatusResponse.SAVE_FAIL, "用户名称不能修改!");
}
if (!oldMasterUser.getMobile().equals(masterUser.getMobile())
&& !ObjectUtils.isEmpty(masterUserService.queryByMobile(masterUser.getMobile()))) {
return new BaseResponse(StatusResponse.SAVE_FAIL, "用户手机号码已存在!");
}
if (!oldMasterUser.getEmail().equals(masterUser.getEmail())
&& !ObjectUtils.isEmpty(masterUserService.queryByEmail(masterUser.getEmail()))) {
return new BaseResponse(StatusResponse.SAVE_FAIL, "用户邮箱地址已存在!");
}
if (masterUserService.edit(masterUser, userAgent)) {
traceLoggerService.addTraceLogger(userAgent, "修改用户成功!【{}】", masterUser.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.UPDATE_FAIL);
}
}
@DeleteMapping("/admin/user/delete.json")
@ResponseBody
public BaseResponse delete(@UserAgentRequest UserAgent userAgent, @RequestParam Integer id) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterUser masterUser = masterUserService.queryById(id);
if (ObjectUtils.isEmpty(masterUser)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "删除的用户不存在!");
}
if (MasterUserService.ADMIN_NAME.equals(masterUser.getUsername())) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "超级管理员不能删除!");
}
if (masterUser.getId().equals(userAgent.getMasterUser().getId())) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "自己不能删除自己!");
}
if (masterUserService.delete(id)) {
traceLoggerService.addTraceLogger(userAgent, "删除用户成功!【{}】", masterUser.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.DELETE_FAIL);
}
}
@GetMapping("/admin/user/reset.json")
@ResponseBody
public BaseResponse reset(@UserAgentRequest UserAgent userAgent, @RequestParam Integer id) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterUser masterUser = masterUserService.queryById(id);
if (ObjectUtils.isEmpty(masterUser)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "重置密码的用户不存在!");
}
if (MasterUserService.ADMIN_NAME.equals(masterUser.getUsername())) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "超级管理员的密码不能重置!");
}
if (masterUser.getId().equals(userAgent.getMasterUser().getId())) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "自己不能重置自己的密码!");
}
//默认密码为手机号码的后6位
masterUser.setPassword(permissionManager.hasPassword(masterUser.getMobile().substring(masterUser.getMobile().length() - 6)));
if (masterUserService.editPassword(masterUser)) {
traceLoggerService.addTraceLogger(userAgent, "重置用户密码成功!【{}】", masterUser.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.DELETE_FAIL);
}
}
@GetMapping("/admin/user/unlock.json")
@ResponseBody
public BaseResponse unlock(@UserAgentRequest UserAgent userAgent, String lockPassword) {
if (!permissionManager.hasLogin(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
if (!userAgent.getMasterUser().getPassword().equals(permissionManager.hasPassword(lockPassword))) {
return new BaseResponse(StatusResponse.VALID_FAIL, "密码输入错误,解锁失败!");
}
return new BaseResponse(StatusResponse.SUCCESS);
}
@PostMapping("/admin/user/password.json")
@ResponseBody
public BaseResponse password(@UserAgentRequest UserAgent userAgent, @RequestBody @Validated MasterUserPassword userPassword) {
if (!permissionManager.hasPermission(userAgent)) {
return new BaseResponse(StatusResponse.LOGOUT);
}
MasterUser masterUser = masterUserService.queryById(userAgent.getMasterUser().getId());
if (ObjectUtils.isEmpty(masterUser)) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "用户不存在!");
}
if (!masterUser.getPassword().equals(permissionManager.hasPassword(userPassword.getOldPassword()))) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "原密码输入不正确!");
}
if (!userPassword.getPassword().equals(userPassword.getConfirmPassword())) {
return new BaseResponse(StatusResponse.DELETE_FAIL, "新密码输入不一致!");
}
masterUser.setPassword(permissionManager.hasPassword(userPassword.getPassword()));
if (masterUserService.editPassword(masterUser)) {
traceLoggerService.addTraceLogger(userAgent, "用户修改密码成功!【{}】", masterUser.toString());
return new BaseResponse(StatusResponse.SUCCESS);
} else {
return new BaseResponse(StatusResponse.DELETE_FAIL);
}
}
}
\ No newline at end of file
package com.ifacebox.web.admin.master.controller;
import com.ifacebox.web.admin.controller.BaseViewController;
import com.ifacebox.web.admin.master.model.MasterUser;
import com.ifacebox.web.admin.os.manager.OsMonitorManager;
import com.ifacebox.web.admin.os.model.OsDiskSpace;
import com.ifacebox.web.common.annotation.UserAgentRequest;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.stereotype.Controller;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;
/**
* @author znn
*/
@Controller
public class MasterViewController extends BaseViewController {
@GetMapping({"/", "/views", "/views/admin", "/views/admin/login.html"})
public ModelAndView login() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("platformProperties", platformManager.getPlatformProperties());
modelAndView.setViewName("views/admin/login");
return modelAndView;
}
@GetMapping("/views/admin/captcha.jpg")
public void captcha(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setDateHeader("Expires", 0L);
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("image/jpeg");
String text = calcMathCaptcha.getProducer().createText();
masterUserService.setCaptcha(request.getSession(true), calcMathCaptcha.parseResult(text));
BufferedImage image = calcMathCaptcha.getProducer().createImage(calcMathCaptcha.parseText(text));
ImageIO.write(image, "jpg", response.getOutputStream());
}
@GetMapping("/views/admin/logout.html")
public ModelAndView logout(@UserAgentRequest UserAgent userAgent) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("platformProperties", platformManager.getPlatformProperties());
modelAndView.setViewName("views/admin/login");
MasterUser masterUser = userAgent.getMasterUser();
if (!ObjectUtils.isEmpty(masterUser)) {
traceLoggerService.addTraceLogger(userAgent, "用户登出成功!【{}】", masterUser.toString());
}
userAgent.setMasterUser(null);
return modelAndView;
}
@GetMapping("/views/admin/index.html")
public ModelAndView index(@UserAgentRequest UserAgent userAgent) {
ModelAndView modelAndView = new ModelAndView();
if (!permissionManager.hasLogin(userAgent)) {
modelAndView.setViewName(VIEWS_ADMIN_LOGOUT);
return modelAndView;
}
modelAndView.addObject("platformProperties", platformManager.getPlatformProperties());
modelAndView.addObject("systemProperties", OsMonitorManager.getSystemProperties());
modelAndView.setViewName("views/admin/index");
return modelAndView;
}
@GetMapping("/views/admin/home.html")
public ModelAndView home(@UserAgentRequest UserAgent userAgent) {
ModelAndView modelAndView = new ModelAndView();
if (!permissionManager.hasLogin(userAgent)) {
modelAndView.setViewName(VIEWS_ADMIN_LOGOUT);
return modelAndView;
}
List<OsDiskSpace> osDiskSpaceList = OsMonitorManager.getDiskSpace();
modelAndView.addObject("osDiskSpaceList", osDiskSpaceList);
modelAndView.addObject("osDiskSpace", OsMonitorManager.getDiskSpace(osDiskSpaceList));
modelAndView.addObject("osCpu", OsMonitorManager.getOsCpu());
modelAndView.addObject("osMemory", OsMonitorManager.getOsMemory());
modelAndView.addObject("jvmMemory", OsMonitorManager.getJvmMemory());
modelAndView.setViewName("views/admin/home");
return modelAndView;
}
@GetMapping("/views/admin/user.html")
public ModelAndView user(@UserAgentRequest UserAgent userAgent) {
ModelAndView modelAndView = new ModelAndView();
if (!permissionManager.hasPermission(userAgent)) {
modelAndView.setViewName(VIEWS_ADMIN_LOGOUT);
return modelAndView;
}
modelAndView.setViewName("views/admin/master/user");
return modelAndView;
}
@GetMapping("/views/admin/group.html")
public ModelAndView group(@UserAgentRequest UserAgent userAgent) {
ModelAndView modelAndView = new ModelAndView();
if (!permissionManager.hasPermission(userAgent)) {
modelAndView.setViewName(VIEWS_ADMIN_LOGOUT);
return modelAndView;
}
modelAndView.setViewName("views/admin/master/group");
return modelAndView;
}
@GetMapping("/views/admin/role.html")
public ModelAndView role(@UserAgentRequest UserAgent userAgent) {
ModelAndView modelAndView = new ModelAndView();
if (!permissionManager.hasPermission(userAgent)) {
modelAndView.setViewName(VIEWS_ADMIN_LOGOUT);
return modelAndView;
}
modelAndView.setViewName("views/admin/master/role");
return modelAndView;
}
@GetMapping("/views/admin/menu.html")
public ModelAndView menu(@UserAgentRequest UserAgent userAgent) {
ModelAndView modelAndView = new ModelAndView();
if (!permissionManager.hasPermission(userAgent)) {
modelAndView.setViewName(VIEWS_ADMIN_LOGOUT);
return modelAndView;
}
modelAndView.setViewName("views/admin/master/menu");
return modelAndView;
}
@GetMapping("/views/admin/operate.html")
public ModelAndView operate(@UserAgentRequest UserAgent userAgent) {
ModelAndView modelAndView = new ModelAndView();
if (!permissionManager.hasPermission(userAgent)) {
modelAndView.setViewName(VIEWS_ADMIN_LOGOUT);
return modelAndView;
}
modelAndView.setViewName("views/admin/master/operate");
return modelAndView;
}
@GetMapping("/views/admin/role_menu.html")
public ModelAndView roleMenu(@UserAgentRequest UserAgent userAgent) {
ModelAndView modelAndView = new ModelAndView();
if (!permissionManager.hasPermission(userAgent)) {
modelAndView.setViewName(VIEWS_ADMIN_LOGOUT);
return modelAndView;
}
modelAndView.setViewName("views/admin/master/role_menu");
return modelAndView;
}
@GetMapping("/views/admin/role_operate.html")
public ModelAndView roleOperate(@UserAgentRequest UserAgent userAgent) {
ModelAndView modelAndView = new ModelAndView();
if (!permissionManager.hasPermission(userAgent)) {
modelAndView.setViewName(VIEWS_ADMIN_LOGOUT);
return modelAndView;
}
modelAndView.setViewName("views/admin/master/role_operate");
return modelAndView;
}
}
package com.ifacebox.web.admin.master.dao;
import com.ifacebox.web.admin.master.model.MasterGroup;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author znn
*/
@Mapper
@Component
public interface MasterGroupDao {
@Select({"<script>"
, "SELECT * FROM master_group"
, "</script>"})
List<MasterGroup> query();
@Select({"<script>"
, "SELECT COUNT(*) FROM master_group"
, "</script>"})
Long total();
@Select({"<script>"
, "SELECT * FROM master_group WHERE id = #{id}"
, "</script>"})
MasterGroup queryById(Integer id);
@Select({"<script>"
, "SELECT * FROM master_group WHERE group_name = #{groupName}"
, "</script>"})
MasterGroup queryByGroupName(String groupName);
@Insert({"<script>"
, "INSERT INTO master_group"
, "( group_name, group_explain, status_id, create_user )"
, "VALUES ( #{groupName}, #{groupExplain}, #{statusId}, #{createUser} )"
, "</script>"})
@Options(useGeneratedKeys = true, keyProperty = "id")
Integer save(MasterGroup masterGroup);
@Update({"<script>"
, "UPDATE master_group SET"
, "group_name = #{groupName}, group_explain = #{groupExplain}, status_id = #{statusId}, update_user = #{updateUser}, update_time = now()"
, " WHERE id = #{id}"
, "</script>"})
Integer edit(MasterGroup masterGroup);
@Delete({"<script>"
, "DELETE FROM master_group WHERE id = #{id}"
, "</script>"})
Integer delete(Integer id);
}
package com.ifacebox.web.admin.master.dao;
import com.ifacebox.web.admin.master.model.MasterGroupRole;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author znn
*/
@Mapper
@Component
public interface MasterGroupRoleDao {
@Select({"<script>"
, "SELECT * FROM master_group_role WHERE group_id = #{groupId}"
, "</script>"})
List<MasterGroupRole> queryByGroupId(Integer groupId);
@Select({"<script>"
, "SELECT * FROM master_group_role WHERE role_id = #{roleId}"
, "</script>"})
List<MasterGroupRole> queryByRoleId(Integer roleId);
@Insert({"<script>"
, "INSERT INTO master_group_role ( group_id, role_id ) VALUES ( #{groupId}, #{roleId} )"
, "</script>"})
@Options(useGeneratedKeys = true, keyProperty = "id")
Integer save(MasterGroupRole groupRole);
@Delete({"<script>"
, "DELETE FROM master_group_role WHERE group_id = #{groupId}"
, "</script>"})
Integer delete(Integer groupId);
}
package com.ifacebox.web.admin.master.dao;
import com.ifacebox.web.admin.master.model.MasterMenu;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author znn
*/
@Mapper
@Component
public interface MasterMenuDao {
@Select({"<script>"
, "SELECT * FROM master_menu WHERE parent_id = #{parentId} ORDER BY order_id"
, "</script>"})
List<MasterMenu> queryByParentId(Integer parentId);
@Select({"<script>"
, "SELECT master_menu.* FROM"
, "master_menu, master_role_menu, master_group_role, master_user_group, master_role, master_group, master_user"
, "WHERE master_user.id = master_user_group.user_id"
, "AND master_user_group.group_id = master_group.id"
, "AND master_user_group.group_id = master_group_role.group_id "
, "AND master_group_role.role_id = master_role.id"
, "AND master_group_role.role_id = master_role_menu.role_id"
, "AND master_role_menu.menu_id = master_menu.id"
, "AND master_group.status_id = 1 AND master_role.status_id = 1"
, "AND master_menu.attr_id = 1 AND master_menu.status_id = 1"
, "AND master_menu.parent_id = #{parentId} AND master_user.id = #{userId}"
, "ORDER BY master_menu.order_id"
, "</script>"})
List<MasterMenu> queryByParentIdAndUserId(Integer parentId, Integer userId);
@Select({"<script>"
, "SELECT master_menu.* FROM"
, "master_menu, master_role_menu, master_group_role, master_user_group, master_role, master_group, master_user"
, "WHERE master_user.id = master_user_group.user_id"
, "AND master_user_group.group_id = master_group.id"
, "AND master_user_group.group_id = master_group_role.group_id "
, "AND master_group_role.role_id = master_role.id"
, "AND master_group_role.role_id = master_role_menu.role_id"
, "AND master_role_menu.menu_id = master_menu.id"
, "AND master_group.status_id = 1 AND master_role.status_id = 1"
, "AND master_menu.attr_id = 1 AND master_menu.status_id = 1"
, "AND master_user.id = #{userId}"
, "</script>"})
List<MasterMenu> queryByUserId(Integer userId);
@Select({"<script>"
, "SELECT * FROM master_menu WHERE id = #{id}"
, "</script>"})
MasterMenu queryById(Integer id);
@Select({"<script>"
, "SELECT * FROM master_menu WHERE title = #{title}"
, "</script>"})
MasterMenu queryByTitle(String title);
@Insert({"<script>"
, "INSERT INTO master_menu"
, "( parent_id, title, address, attr_id, icon_cls, status_id, order_id, create_user )"
, "VALUES ( #{parentId}, #{title}, #{address}, #{attrId}, #{iconCls}, #{statusId}, #{orderId}, #{createUser} )"
, "</script>"})
@Options(useGeneratedKeys = true, keyProperty = "id")
Integer save(MasterMenu masterMenu);
@Update({"<script>"
, "UPDATE master_menu SET"
, " parent_id = #{parentId}, title = #{title}, address = #{address}, attr_id = #{attrId}, icon_cls = #{iconCls}"
, ", status_id = #{statusId}, order_id = #{orderId}, update_user = #{updateUser}, update_time = now()"
, " WHERE id = #{id}"
, "</script>"})
Integer edit(MasterMenu masterMenu);
@Delete({"<script>"
, "DELETE FROM master_menu WHERE id = #{id}"
, "</script>"})
Integer delete(Integer id);
}
package com.ifacebox.web.admin.master.dao;
import com.ifacebox.web.admin.master.model.MasterOperate;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author znn
*/
@Mapper
@Component
public interface MasterOperateDao {
@Select({"<script>"
, "SELECT * FROM master_operate WHERE parent_id = #{parentId} ORDER BY order_id"
, "</script>"})
List<MasterOperate> queryByParentId(Integer parentId);
@Select({"<script>"
, "SELECT master_operate.* FROM"
, "master_operate, master_role_operate, master_group_role, master_user_group, master_role, master_group, master_user"
, "WHERE master_user.id = master_user_group.user_id"
, "AND master_user_group.group_id = master_group.id"
, "AND master_user_group.group_id = master_group_role.group_id "
, "AND master_group_role.role_id = master_role.id"
, "AND master_group_role.role_id = master_role_operate.role_id"
, "AND master_role_operate.operate_id = master_operate.id"
, "AND master_group.status_id = 1 AND master_role.status_id = 1"
, "AND master_operate.attr_id = 1 AND master_operate.status_id = 1"
, "AND master_user.id = #{userId}"
, "</script>"})
List<MasterOperate> queryByUserId(Integer userId);
@Select({"<script>"
, "SELECT * FROM master_operate WHERE id = #{id}"
, "</script>"})
MasterOperate queryById(Integer id);
@Select({"<script>"
, "SELECT * FROM master_operate WHERE title = #{title}"
, "</script>"})
MasterOperate queryByTitle(String title);
@Insert({"<script>"
, "INSERT INTO master_operate"
, "( parent_id, title, address, method, attr_id, icon_cls, status_id, order_id, create_user )"
, "VALUES ( #{parentId}, #{title}, #{address}, #{method}, #{attrId}, #{iconCls}, #{statusId}, #{orderId}, #{createUser} )"
, "</script>"})
@Options(useGeneratedKeys = true, keyProperty = "id")
Integer save(MasterOperate masterOperate);
@Update({"<script>"
, "UPDATE master_operate SET"
, " parent_id = #{parentId}, title = #{title}, address = #{address}, method = #{method}, attr_id = #{attrId}"
, ", icon_cls = #{iconCls}, status_id = #{statusId}, order_id = #{orderId}, update_user = #{updateUser}, update_time = now()"
, " WHERE id = #{id}"
, "</script>"})
Integer edit(MasterOperate masterOperate);
@Delete({"<script>"
, "DELETE FROM master_operate WHERE id = #{id}"
, "</script>"})
Integer delete(Integer id);
}
package com.ifacebox.web.admin.master.dao;
import com.ifacebox.web.admin.master.model.MasterRole;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author znn
*/
@Mapper
@Component
public interface MasterRoleDao {
@Select({"<script>"
, "SELECT * FROM master_role"
, "</script>"})
List<MasterRole> query();
@Select({"<script>"
, "SELECT COUNT(*) FROM master_role"
, "</script>"})
Long total();
@Select({"<script>"
, "SELECT * FROM master_role WHERE id = #{id}"
, "</script>"})
MasterRole queryById(Integer id);
@Select({"<script>"
, "SELECT * FROM master_role WHERE role_name = #{roleName}"
, "</script>"})
MasterRole queryByRoleName(String roleName);
@Insert({"<script>"
, "INSERT INTO master_role"
, "( role_name, role_explain, status_id, create_user )"
, "VALUES ( #{roleName}, #{roleExplain}, #{statusId}, #{createUser} )"
, "</script>"})
@Options(useGeneratedKeys = true, keyProperty = "id")
Integer save(MasterRole masterRole);
@Update({"<script>"
, "UPDATE master_role SET"
, "role_name = #{roleName}, role_explain = #{roleExplain}, status_id = #{statusId}, update_user = #{updateUser}, update_time = now()"
, " WHERE id = #{id}"
, "</script>"})
Integer edit(MasterRole masterRole);
@Delete({"<script>"
, "DELETE FROM master_role WHERE id = #{id}"
, "</script>"})
Integer delete(Integer id);
}
package com.ifacebox.web.admin.master.dao;
import com.ifacebox.web.admin.master.model.MasterRoleMenu;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author znn
*/
@Mapper
@Component
public interface MasterRoleMenuDao {
@Select({"<script>"
, "SELECT * FROM master_role_menu WHERE role_id = #{roleId}"
, "</script>"})
List<MasterRoleMenu> queryByRoleId(Integer roleId);
@Select({"<script>"
, "SELECT * FROM master_role_menu WHERE menu_id = #{menuId}"
, "</script>"})
List<MasterRoleMenu> queryByMenuId(Integer menuId);
@Insert({"<script>"
, "INSERT INTO master_role_menu ( role_id, menu_id ) VALUES ( #{roleId}, #{menuId} )"
, "</script>"})
@Options(useGeneratedKeys = true, keyProperty = "id")
Integer save(MasterRoleMenu masterRoleMenu);
@Delete({"<script>"
, "DELETE FROM master_role_menu WHERE role_id = #{roleId}"
, "</script>"})
Integer delete(Integer roleId);
}
package com.ifacebox.web.admin.master.dao;
import com.ifacebox.web.admin.master.model.MasterRoleOperate;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author znn
*/
@Mapper
@Component
public interface MasterRoleOperateDao {
@Select({"<script>"
, "SELECT * FROM master_role_operate WHERE role_id = #{roleId}"
, "</script>"})
List<MasterRoleOperate> queryByRoleId(Integer roleId);
@Select({"<script>"
, "SELECT * FROM master_role_operate WHERE operate_id = #{operateId}"
, "</script>"})
List<MasterRoleOperate> queryByOperateId(Integer operateId);
@Insert({"<script>"
, "INSERT INTO master_role_operate ( role_id, operate_id ) VALUES ( #{roleId}, #{operateId} )"
, "</script>"})
@Options(useGeneratedKeys = true, keyProperty = "id")
Integer save(MasterRoleOperate masterRoleOperate);
@Delete({"<script>"
, "DELETE FROM master_role_operate WHERE role_id = #{roleId}"
, "</script>"})
Integer delete(Integer roleId);
}
package com.ifacebox.web.admin.master.dao;
import com.ifacebox.web.admin.master.model.MasterUser;
import com.ifacebox.web.admin.master.model.MasterUserQuery;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author znn
*/
@Mapper
@Component
public interface MasterUserDao {
@Select({"<script>"
, "SELECT * FROM master_user ORDER BY create_time DESC"
, "</script>"})
List<MasterUser> queryByAll();
@Select({"<script>"
, "SELECT * FROM master_user"
, "ORDER BY create_time DESC LIMIT #{offset}, #{limit}"
, "</script>"})
List<MasterUser> query(MasterUserQuery masterUserQuery);
@Select({"<script>"
, "SELECT COUNT(*) FROM master_user"
, "</script>"})
Long total(MasterUserQuery masterUserQuery);
@Select({"<script>"
, "SELECT * FROM master_user WHERE id = #{id}"
, "</script>"})
MasterUser queryById(Integer id);
@Select({"<script>"
, "SELECT * FROM master_user WHERE username = #{username} AND password = #{password}"
, "</script>"})
MasterUser queryByUsernameAndPassword(String username, String password);
@Select({"<script>"
, "SELECT * FROM master_user WHERE username = #{username}"
, "</script>"})
MasterUser queryByUsername(String username);
@Select({"<script>"
, "SELECT * FROM master_user WHERE mobile = #{mobile} AND password = #{password}"
, "</script>"})
MasterUser queryByMobileAndPassword(String mobile, String password);
@Select({"<script>"
, "SELECT * FROM master_user WHERE mobile = #{mobile}"
, "</script>"})
MasterUser queryByMobile(String mobile);
@Select({"<script>"
, "SELECT * FROM master_user WHERE email = #{email} AND password = #{password}"
, "</script>"})
MasterUser queryByEmailAndPassword(String email, String password);
@Select({"<script>"
, "SELECT * FROM master_user WHERE email = #{email}"
, "</script>"})
MasterUser queryByEmail(String email);
@Insert({"<script>"
, "INSERT INTO master_user"
, "( name, username, password, mobile, email, attr_id, status_id, create_user )"
, "VALUES ( #{name}, #{username}, #{password}, #{mobile}, #{email}, #{attrId}, #{statusId}, #{createUser} )"
, "</script>"})
@Options(useGeneratedKeys = true, keyProperty = "id")
Integer save(MasterUser masterUser);
@Update({"<script>"
, "UPDATE master_user SET"
, "name = #{name}, username = #{username}, mobile = #{mobile}, email = #{email}"
, ", attr_id = #{attrId}, status_id = #{statusId}, update_user = #{updateUser}, update_time = now()"
, " WHERE id = #{id}"
, "</script>"})
Integer edit(MasterUser masterUser);
@Update({"<script>"
, "UPDATE master_user SET login_ip = #{loginIp}, login_time = now() WHERE id = #{id}"
, "</script>"})
Integer editLogin(MasterUser masterUser);
@Update({"<script>"
, "UPDATE master_user SET password = #{password} WHERE id = #{id}"
, "</script>"})
Integer editPassword(MasterUser masterUser);
@Delete({"<script>"
, "DELETE FROM master_user WHERE id = #{id}"
, "</script>"})
Integer delete(Integer id);
}
package com.ifacebox.web.admin.master.dao;
import com.ifacebox.web.admin.master.model.MasterUserGroup;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author znn
*/
@Mapper
@Component
public interface MasterUserGroupDao {
@Select({"<script>"
, "SELECT * FROM master_user_group WHERE user_id = #{userId}"
, "</script>"})
List<MasterUserGroup> queryByUserId(Integer userId);
@Select({"<script>"
, "SELECT * FROM master_user_group WHERE group_id = #{groupId}"
, "</script>"})
List<MasterUserGroup> queryByGroupId(Integer groupId);
@Insert({"<script>"
, "INSERT INTO master_user_group ( user_id, group_id ) VALUES ( #{userId}, #{groupId} )"
, "</script>"})
@Options(useGeneratedKeys = true, keyProperty = "id")
Integer save(MasterUserGroup userGroup);
@Delete({"<script>"
, "DELETE FROM master_user_group WHERE user_id = #{userId}"
, "</script>"})
Integer delete(Integer userId);
}
package com.ifacebox.web.admin.master.model;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* @author znn
*/
public class MasterGroup {
private Integer id;
@NotBlank(message = "分组名称不能为空!")
@Size(min = 2, max = 64, message = "分组名称长度应在2-64之间!")
private String groupName;
@NotBlank(message = "分组说明不能为空!")
@Size(min = 2, max = 255, message = "分组说明长度应在2-255之间!")
private String groupExplain;
@NotNull(message = "分组状态不能为空!")
private Integer statusId;
private String statusExplain;
private String createUser;
private String updateUser;
private String createTime;
private String updateTime;
private Integer[] roleId;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public String getGroupExplain() {
return groupExplain;
}
public void setGroupExplain(String groupExplain) {
this.groupExplain = groupExplain;
}
public Integer getStatusId() {
return statusId;
}
public void setStatusId(Integer statusId) {
this.statusId = statusId;
}
public String getStatusExplain() {
return statusExplain;
}
public void setStatusExplain(String statusExplain) {
this.statusExplain = statusExplain;
}
public String getCreateUser() {
return createUser;
}
public void setCreateUser(String createUser) {
this.createUser = createUser;
}
public String getUpdateUser() {
return updateUser;
}
public void setUpdateUser(String updateUser) {
this.updateUser = updateUser;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public Integer[] getRoleId() {
return roleId;
}
public void setRoleId(Integer[] roleId) {
this.roleId = roleId;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("编码=").append(id);
sb.append(",名称=").append(groupName);
sb.append(",说明=").append(groupExplain);
sb.append(",状态=").append(statusId);
sb.append(",创建用户=").append(createUser);
sb.append(",修改用户=").append(updateUser);
sb.append(",创建时间=").append(createTime);
sb.append(",修改时间=").append(updateTime);
return sb.toString();
}
}
package com.ifacebox.web.admin.master.model;
/**
* @author znn
*/
public class MasterGroupRole {
private Integer id;
private Integer groupId;
private Integer roleId;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getGroupId() {
return groupId;
}
public void setGroupId(Integer groupId) {
this.groupId = groupId;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
}
package com.ifacebox.web.admin.master.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
public enum MasterGroupStatus {
/**
* 状态
*/
UNKNOWN(0, "未知"),
ENABLE(1, "启用"),
DISABLE(2, "禁用");
private Integer statusId;
private String statusExplain;
MasterGroupStatus(Integer statusId, String statusExplain) {
this.setStatusId(statusId);
this.setStatusExplain(statusExplain);
}
public Integer getStatusId() {
return statusId;
}
public void setStatusId(Integer statusId) {
this.statusId = statusId;
}
public String getStatusExplain() {
return statusExplain;
}
public void setStatusExplain(String statusExplain) {
this.statusExplain = statusExplain;
}
public static List<Map<String, Object>> toArray() {
List<Map<String, Object>> items = new ArrayList<>();
for (MasterGroupStatus status : MasterGroupStatus.values()) {
Map<String, Object> item = new HashMap<>();
item.put("statusId", status.getStatusId());
item.put("statusExplain", status.getStatusExplain());
items.add(item);
}
return items;
}
}
package com.ifacebox.web.admin.master.model;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* @author znn
*/
public class MasterMenu {
protected Integer id;
@NotNull(message = "上级菜单不能为空!")
protected Integer parentId;
@NotBlank(message = "菜单标题不能为空!")
@Size(min = 2, max = 64, message = "菜单标题长度应在2-64之间!")
protected String title;
@Size(min = 0, max = 255, message = "菜单地址长度不能大于255!")
protected String address;
@NotNull(message = "菜单属性不能为空!")
protected Integer attrId;
protected String attrExplain;
@Size(min = 0, max = 255, message = "菜单图标长度不能大于255!")
protected String iconCls;
@NotNull(message = "菜单状态不能为空!")
protected Integer statusId;
protected String statusExplain;
@NotNull(message = "菜单排序不能为空!")
@Max(value = 9999, message = "菜单排序不能大于9999!")
protected Integer orderId;
protected String createUser;
protected String updateUser;
protected String createTime;
protected String updateTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getAttrId() {
return attrId;
}
public void setAttrId(Integer attrId) {
this.attrId = attrId;
}
public String getAttrExplain() {
return attrExplain;
}
public void setAttrExplain(String attrExplain) {
this.attrExplain = attrExplain;
}
public String getIconCls() {
return iconCls;
}
public void setIconCls(String iconCls) {
this.iconCls = iconCls;
}
public Integer getStatusId() {
return statusId;
}
public void setStatusId(Integer statusId) {
this.statusId = statusId;
}
public String getStatusExplain() {
return statusExplain;
}
public void setStatusExplain(String statusExplain) {
this.statusExplain = statusExplain;
}
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public String getCreateUser() {
return createUser;
}
public void setCreateUser(String createUser) {
this.createUser = createUser;
}
public String getUpdateUser() {
return updateUser;
}
public void setUpdateUser(String updateUser) {
this.updateUser = updateUser;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("编码=").append(id);
sb.append(",父编码=").append(parentId);
sb.append(",标题=").append(title);
sb.append(",地址=").append(address);
sb.append(",属性=").append(attrId);
sb.append(",图标=").append(iconCls);
sb.append(",状态=").append(statusId);
sb.append(",排序=").append(orderId);
sb.append(",创建用户=").append(createUser);
sb.append(",修改用户=").append(updateUser);
sb.append(",创建时间=").append(createTime);
sb.append(",修改时间=").append(updateTime);
return sb.toString();
}
}
package com.ifacebox.web.admin.master.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
public enum MasterMenuAttr {
/**
* 菜单属性
*/
UNKNOWN(0, "未知"),
HTML(1, "HTML");
private Integer attrId;
private String attrExplain;
MasterMenuAttr(Integer attrId, String attrExplain) {
this.setAttrId(attrId);
this.setAttrExplain(attrExplain);
}
public Integer getAttrId() {
return attrId;
}
public void setAttrId(Integer attrId) {
this.attrId = attrId;
}
public String getAttrExplain() {
return attrExplain;
}
public void setAttrExplain(String attrExplain) {
this.attrExplain = attrExplain;
}
public static List<Map<String, Object>> toArray() {
List<Map<String, Object>> items = new ArrayList<>();
for (MasterMenuAttr attr : MasterMenuAttr.values()) {
Map<String, Object> item = new HashMap<>();
item.put("attrId", attr.getAttrId());
item.put("attrExplain", attr.getAttrExplain());
items.add(item);
}
return items;
}
}
package com.ifacebox.web.admin.master.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
public enum MasterMenuStatus {
/**
* 状态
*/
UNKNOWN(0, "未知"),
ENABLE(1, "启用"),
DISABLE(2, "禁用");
private Integer statusId;
private String statusExplain;
MasterMenuStatus(Integer statusId, String statusExplain) {
this.setStatusId(statusId);
this.setStatusExplain(statusExplain);
}
public Integer getStatusId() {
return statusId;
}
public void setStatusId(Integer statusId) {
this.statusId = statusId;
}
public String getStatusExplain() {
return statusExplain;
}
public void setStatusExplain(String statusExplain) {
this.statusExplain = statusExplain;
}
public static List<Map<String, Object>> toArray() {
List<Map<String, Object>> items = new ArrayList<>();
for (MasterMenuStatus status : MasterMenuStatus.values()) {
Map<String, Object> item = new HashMap<>();
item.put("statusId", status.getStatusId());
item.put("statusExplain", status.getStatusExplain());
items.add(item);
}
return items;
}
}
package com.ifacebox.web.admin.master.model;
import java.util.List;
/**
* @author znn
*/
public class MasterMenuTree extends MasterMenu {
private List<MasterMenuTree> children;
public List<MasterMenuTree> getChildren() {
return children;
}
public void setChildren(List<MasterMenuTree> children) {
this.children = children;
}
}
package com.ifacebox.web.admin.master.model;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* @author znn
*/
public class MasterOperate {
protected Integer id;
@NotNull(message = "上级操作不能为空!")
protected Integer parentId;
@NotBlank(message = "操作标题不能为空!")
@Size(min = 2, max = 64, message = "操作标题长度应在2-64之间!")
protected String title;
@Size(min = 0, max = 255, message = "操作地址长度不能大于255!")
protected String address;
@Size(min = 0, max = 8, message = "请求方法长度不能大于8!")
protected String method;
@NotNull(message = "操作属性不能为空!")
protected Integer attrId;
protected String attrExplain;
@Size(min = 0, max = 255, message = "操作图标长度不能大于255!")
protected String iconCls;
@NotNull(message = "操作状态不能为空!")
protected Integer statusId;
protected String statusExplain;
@NotNull(message = "操作排序不能为空!")
@Max(value = 9999, message = "操作排序不能大于9999!")
protected Integer orderId;
protected String createUser;
protected String updateUser;
protected String createTime;
protected String updateTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public Integer getAttrId() {
return attrId;
}
public void setAttrId(Integer attrId) {
this.attrId = attrId;
}
public String getAttrExplain() {
return attrExplain;
}
public void setAttrExplain(String attrExplain) {
this.attrExplain = attrExplain;
}
public String getIconCls() {
return iconCls;
}
public void setIconCls(String iconCls) {
this.iconCls = iconCls;
}
public Integer getStatusId() {
return statusId;
}
public void setStatusId(Integer statusId) {
this.statusId = statusId;
}
public String getStatusExplain() {
return statusExplain;
}
public void setStatusExplain(String statusExplain) {
this.statusExplain = statusExplain;
}
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public String getCreateUser() {
return createUser;
}
public void setCreateUser(String createUser) {
this.createUser = createUser;
}
public String getUpdateUser() {
return updateUser;
}
public void setUpdateUser(String updateUser) {
this.updateUser = updateUser;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("编码=").append(id);
sb.append(",父编码=").append(parentId);
sb.append(",标题=").append(title);
sb.append(",地址=").append(address);
sb.append(",方法=").append(method);
sb.append(",属性=").append(attrId);
sb.append(",图标=").append(iconCls);
sb.append(",状态=").append(statusId);
sb.append(",排序=").append(orderId);
sb.append(",创建用户=").append(createUser);
sb.append(",修改用户=").append(updateUser);
sb.append(",创建时间=").append(createTime);
sb.append(",修改时间=").append(updateTime);
return sb.toString();
}
}
package com.ifacebox.web.admin.master.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
public enum MasterOperateAttr {
/**
* 属性
*/
UNKNOWN(0, "未知"),
JSON(1, "JSON");
private Integer attrId;
private String attrExplain;
MasterOperateAttr(Integer attrId, String attrExplain) {
this.setAttrId(attrId);
this.setAttrExplain(attrExplain);
}
public Integer getAttrId() {
return attrId;
}
public void setAttrId(Integer attrId) {
this.attrId = attrId;
}
public String getAttrExplain() {
return attrExplain;
}
public void setAttrExplain(String attrExplain) {
this.attrExplain = attrExplain;
}
public static List<Map<String, Object>> toArray() {
List<Map<String, Object>> items = new ArrayList<>();
for (MasterOperateAttr attr : MasterOperateAttr.values()) {
Map<String, Object> item = new HashMap<>();
item.put("attrId", attr.getAttrId());
item.put("attrExplain", attr.getAttrExplain());
items.add(item);
}
return items;
}
}
package com.ifacebox.web.admin.master.model;
/**
* @author znn
*/
public enum MasterOperateMethod {
GET, POST, PUT, DELETE;
}
package com.ifacebox.web.admin.master.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
public enum MasterOperateStatus {
/**
* 状态
*/
UNKNOWN(0, "未知"),
ENABLE(1, "启用"),
DISABLE(2, "禁用");
private Integer statusId;
private String statusExplain;
MasterOperateStatus(Integer statusId, String statusExplain) {
this.setStatusId(statusId);
this.setStatusExplain(statusExplain);
}
public Integer getStatusId() {
return statusId;
}
public void setStatusId(Integer statusId) {
this.statusId = statusId;
}
public String getStatusExplain() {
return statusExplain;
}
public void setStatusExplain(String statusExplain) {
this.statusExplain = statusExplain;
}
public static List<Map<String, Object>> toArray() {
List<Map<String, Object>> items = new ArrayList<>();
for (MasterOperateStatus status : MasterOperateStatus.values()) {
Map<String, Object> item = new HashMap<>();
item.put("statusId", status.getStatusId());
item.put("statusExplain", status.getStatusExplain());
items.add(item);
}
return items;
}
}
package com.ifacebox.web.admin.master.model;
import java.util.List;
/**
* @author znn
*/
public class MasterOperateTree extends MasterOperate {
private List<MasterOperateTree> children;
public List<MasterOperateTree> getChildren() {
return children;
}
public void setChildren(List<MasterOperateTree> children) {
this.children = children;
}
}
package com.ifacebox.web.admin.master.model;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* @author znn
*/
public class MasterRole {
private Integer id;
@NotBlank(message = "角色名称不能为空!")
@Size(min = 2, max = 64, message = "角色名称长度应在2-64之间!")
private String roleName;
@NotBlank(message = "角色说明不能为空!")
@Size(min = 2, max = 255, message = "角色说明长度应在2-255之间!")
private String roleExplain;
@NotNull(message = "角色状态不能为空!")
private Integer statusId;
private String statusExplain;
private String createUser;
private String updateUser;
private String createTime;
private String updateTime;
private Integer[] menuId;
private Integer[] operateId;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getRoleExplain() {
return roleExplain;
}
public void setRoleExplain(String roleExplain) {
this.roleExplain = roleExplain;
}
public Integer getStatusId() {
return statusId;
}
public void setStatusId(Integer statusId) {
this.statusId = statusId;
}
public String getStatusExplain() {
return statusExplain;
}
public void setStatusExplain(String statusExplain) {
this.statusExplain = statusExplain;
}
public String getCreateUser() {
return createUser;
}
public void setCreateUser(String createUser) {
this.createUser = createUser;
}
public String getUpdateUser() {
return updateUser;
}
public void setUpdateUser(String updateUser) {
this.updateUser = updateUser;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public Integer[] getMenuId() {
return menuId;
}
public void setMenuId(Integer[] menuId) {
this.menuId = menuId;
}
public Integer[] getOperateId() {
return operateId;
}
public void setOperateId(Integer[] operateId) {
this.operateId = operateId;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("编码=").append(id);
sb.append(",名称=").append(roleName);
sb.append(",说明=").append(roleExplain);
sb.append(",状态=").append(statusId);
sb.append(",创建用户=").append(createUser);
sb.append(",修改用户=").append(updateUser);
sb.append(",创建时间=").append(createTime);
sb.append(",修改时间=").append(updateTime);
return sb.toString();
}
}
package com.ifacebox.web.admin.master.model;
/**
* @author znn
*/
public class MasterRoleMenu {
private Integer id;
private Integer roleId;
private Integer menuId;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public Integer getMenuId() {
return menuId;
}
public void setMenuId(Integer menuId) {
this.menuId = menuId;
}
}
package com.ifacebox.web.admin.master.model;
/**
* @author znn
*/
public class MasterRoleOperate {
private Integer id;
private Integer roleId;
private Integer operateId;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public Integer getOperateId() {
return operateId;
}
public void setOperateId(Integer operateId) {
this.operateId = operateId;
}
}
package com.ifacebox.web.admin.master.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
public enum MasterRoleStatus {
/**
* 状态
*/
UNKNOWN(0, "未知"),
ENABLE(1, "启用"),
DISABLE(2, "禁用");
private Integer statusId;
private String statusExplain;
MasterRoleStatus(Integer statusId, String statusExplain) {
this.setStatusId(statusId);
this.setStatusExplain(statusExplain);
}
public Integer getStatusId() {
return statusId;
}
public void setStatusId(Integer statusId) {
this.statusId = statusId;
}
public String getStatusExplain() {
return statusExplain;
}
public void setStatusExplain(String statusExplain) {
this.statusExplain = statusExplain;
}
public static List<Map<String, Object>> toArray() {
List<Map<String, Object>> items = new ArrayList<>();
for (MasterRoleStatus status : MasterRoleStatus.values()) {
Map<String, Object> item = new HashMap<>();
item.put("statusId", status.getStatusId());
item.put("statusExplain", status.getStatusExplain());
items.add(item);
}
return items;
}
}
package com.ifacebox.web.admin.master.model;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* @author znn
*/
public class MasterUser {
private Integer id;
@NotBlank(message = "用户姓名不能为空!")
@Size(min = 2, max = 32, message = "用户姓名长度应在2-32之间!")
private String name;
@NotBlank(message = "用户名称不能为空!")
@Size(min = 2, max = 32, message = "用户名称长度应在2-32之间!")
private String username;
private String password;
@NotBlank(message = "手机号码不能为空!")
@Size(min = 8, max = 11, message = "手机号码长度应在8-11之间!")
private String mobile;
@NotBlank(message = "邮箱地址不能为空!")
@Email(message = "邮箱地址不正确!")
private String email;
@NotNull(message = "用户属性不能为空!")
private Integer attrId;
private String attrExplain;
@NotNull(message = "用户状态不能为空!")
private Integer statusId;
private String statusExplain;
private String loginIp;
private String loginTime;
private String createUser;
private String updateUser;
private String createTime;
private String updateTime;
private Integer[] groupId;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAttrId() {
return attrId;
}
public void setAttrId(Integer attrId) {
this.attrId = attrId;
}
public String getAttrExplain() {
return attrExplain;
}
public void setAttrExplain(String attrExplain) {
this.attrExplain = attrExplain;
}
public Integer getStatusId() {
return statusId;
}
public void setStatusId(Integer statusId) {
this.statusId = statusId;
}
public String getStatusExplain() {
return statusExplain;
}
public void setStatusExplain(String statusExplain) {
this.statusExplain = statusExplain;
}
public String getLoginIp() {
return loginIp;
}
public void setLoginIp(String loginIp) {
this.loginIp = loginIp;
}
public String getLoginTime() {
return loginTime;
}
public void setLoginTime(String loginTime) {
this.loginTime = loginTime;
}
public String getCreateUser() {
return createUser;
}
public void setCreateUser(String createUser) {
this.createUser = createUser;
}
public String getUpdateUser() {
return updateUser;
}
public void setUpdateUser(String updateUser) {
this.updateUser = updateUser;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public Integer[] getGroupId() {
return groupId;
}
public void setGroupId(Integer[] groupId) {
this.groupId = groupId;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("编码=").append(id);
sb.append(",用户姓名=").append(name);
sb.append(",用户名称=").append(username);
sb.append(",手机号码=").append(mobile);
sb.append(",邮箱地址=").append(email);
sb.append(",属性=").append(attrId);
sb.append(",状态=").append(statusId);
sb.append(",创建用户=").append(createUser);
sb.append(",修改用户=").append(updateUser);
sb.append(",创建时间=").append(createTime);
sb.append(",修改时间=").append(updateTime);
return sb.toString();
}
}
package com.ifacebox.web.admin.master.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
public enum MasterUserAttr {
/**
* 属性
*/
UNKNOWN(0, "未知"),
ADMIN(1, "管理员"),
USER(2, "用户");
private Integer attrId;
private String attrExplain;
MasterUserAttr(Integer attrId, String attrExplain) {
this.setAttrId(attrId);
this.setAttrExplain(attrExplain);
}
public Integer getAttrId() {
return attrId;
}
public void setAttrId(Integer attrId) {
this.attrId = attrId;
}
public String getAttrExplain() {
return attrExplain;
}
public void setAttrExplain(String attrExplain) {
this.attrExplain = attrExplain;
}
public static List<Map<String, Object>> toArray() {
List<Map<String, Object>> items = new ArrayList<>();
for (MasterUserAttr attr : MasterUserAttr.values()) {
Map<String, Object> item = new HashMap<>();
item.put("attrId", attr.getAttrId());
item.put("attrExplain", attr.getAttrExplain());
items.add(item);
}
return items;
}
}
package com.ifacebox.web.admin.master.model;
/**
* @author znn
*/
public class MasterUserGroup {
private Integer id;
private Integer userId;
private Integer groupId;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public Integer getGroupId() {
return groupId;
}
public void setGroupId(Integer groupId) {
this.groupId = groupId;
}
}
package com.ifacebox.web.admin.master.model;
import javax.validation.constraints.NotBlank;
/**
* @author znn
*/
public class MasterUserLogin {
@NotBlank(message = "用户名称不能为空!")
private String username;
@NotBlank(message = "用户密码不能为空!")
private String password;
@NotBlank(message = "验证码不能为空!")
private String captcha;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCaptcha() {
return captcha;
}
public void setCaptcha(String captcha) {
this.captcha = captcha;
}
}
package com.ifacebox.web.admin.master.model;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
/**
* @author znn
*/
public class MasterUserPassword {
private String oldPassword;
@NotBlank(message = "密码不能为空!")
@Size(min = 6, max = 64, message = "密码长度应在6-64之间!")
private String password;
private String confirmPassword;
public String getOldPassword() {
return oldPassword;
}
public void setOldPassword(String oldPassword) {
this.oldPassword = oldPassword;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getConfirmPassword() {
return confirmPassword;
}
public void setConfirmPassword(String confirmPassword) {
this.confirmPassword = confirmPassword;
}
}
package com.ifacebox.web.admin.master.model;
import com.ifacebox.web.common.model.Pagination;
/**
* @author znn
*/
public class MasterUserQuery extends Pagination {
}
package com.ifacebox.web.admin.master.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author znn
*/
public enum MasterUserStatus {
/**
* 状态
*/
UNKNOWN(0, "未知"),
ENABLE(1, "启用"),
DISABLE(2, "禁用");
private Integer statusId;
private String statusExplain;
MasterUserStatus(Integer statusId, String statusExplain) {
this.setStatusId(statusId);
this.setStatusExplain(statusExplain);
}
public Integer getStatusId() {
return statusId;
}
public void setStatusId(Integer statusId) {
this.statusId = statusId;
}
public String getStatusExplain() {
return statusExplain;
}
public void setStatusExplain(String statusExplain) {
this.statusExplain = statusExplain;
}
public static List<Map<String, Object>> toArray() {
List<Map<String, Object>> items = new ArrayList<>();
for (MasterUserStatus status : MasterUserStatus.values()) {
Map<String, Object> item = new HashMap<>();
item.put("statusId", status.getStatusId());
item.put("statusExplain", status.getStatusExplain());
items.add(item);
}
return items;
}
}
package com.ifacebox.web.admin.master.service;
import com.ifacebox.web.admin.master.dao.MasterGroupRoleDao;
import com.ifacebox.web.admin.master.model.MasterGroupRole;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author znn
*/
@Service
public class MasterGroupRoleService {
@Resource
private MasterGroupRoleDao masterGroupRoleDao;
public List<MasterGroupRole> queryByRoleId(Integer roleId) {
return masterGroupRoleDao.queryByRoleId(roleId);
}
}
package com.ifacebox.web.admin.master.service;
import com.ifacebox.web.admin.master.dao.MasterGroupDao;
import com.ifacebox.web.admin.master.dao.MasterGroupRoleDao;
import com.ifacebox.web.admin.master.model.MasterGroup;
import com.ifacebox.web.admin.master.model.MasterGroupRole;
import com.ifacebox.web.admin.master.model.MasterGroupStatus;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @author znn
*/
@Service
public class MasterGroupService {
@Resource
private MasterGroupDao masterGroupDao;
@Resource
private MasterGroupRoleDao masterGroupRoleDao;
public List<MasterGroup> query() {
List<MasterGroup> groupList = masterGroupDao.query();
for (MasterGroup group : groupList) {
group.setStatusExplain(this.getStatusExplain(group.getStatusId()));
List<MasterGroupRole> groupRoleList = masterGroupRoleDao.queryByGroupId(group.getId());
List<Integer> roleId = new ArrayList<>();
for (MasterGroupRole groupRole : groupRoleList) {
roleId.add(groupRole.getRoleId());
}
group.setRoleId(roleId.toArray(new Integer[0]));
}
return groupList;
}
public MasterGroup queryById(Integer id) {
return masterGroupDao.queryById(id);
}
public MasterGroup queryByGroupName(String groupName) {
return masterGroupDao.queryByGroupName(groupName);
}
@Transactional(rollbackFor = Exception.class)
public boolean save(MasterGroup masterGroup, UserAgent userAgent) {
masterGroup.setCreateUser(userAgent.getMasterUser().getUsername());
if (!ObjectUtils.isEmpty(masterGroupDao.save(masterGroup))) {
this.save(masterGroup);
return true;
}
return false;
}
@Transactional(rollbackFor = Exception.class)
public boolean edit(MasterGroup masterGroup, UserAgent userAgent) {
masterGroup.setUpdateUser(userAgent.getMasterUser().getUsername());
if (!ObjectUtils.isEmpty(masterGroupDao.edit(masterGroup))) {
this.save(masterGroup);
return true;
}
return false;
}
private void save(MasterGroup masterGroup) {
masterGroupRoleDao.delete(masterGroup.getId());
for (Integer roleId : masterGroup.getRoleId()) {
MasterGroupRole groupRole = new MasterGroupRole();
groupRole.setGroupId(masterGroup.getId());
groupRole.setRoleId(roleId);
masterGroupRoleDao.save(groupRole);
}
}
@Transactional(rollbackFor = Exception.class)
public boolean delete(Integer id) {
if (!ObjectUtils.isEmpty(masterGroupDao.delete(id))) {
masterGroupRoleDao.delete(id);
return true;
}
return false;
}
private String getStatusExplain(Integer statusId) {
for (MasterGroupStatus groupStatus : MasterGroupStatus.values()) {
if (groupStatus.getStatusId().equals(statusId)) {
return groupStatus.getStatusExplain();
}
}
return MasterGroupStatus.UNKNOWN.getStatusExplain();
}
}
package com.ifacebox.web.admin.master.service;
import com.ifacebox.web.admin.master.dao.MasterMenuDao;
import com.ifacebox.web.admin.master.model.*;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @author znn
*/
@Service
public class MasterMenuService {
/**
* 顶级菜单的上级菜单编码
*/
public static final int TREE_ROOT = 0;
@Resource
private MasterMenuDao masterMenuDao;
public MasterMenu queryById(Integer id) {
return masterMenuDao.queryById(id);
}
public MasterMenu queryByTitle(String title) {
return masterMenuDao.queryByTitle(title);
}
public List<MasterMenu> queryByParentId(Integer parentId) {
return masterMenuDao.queryByParentId(parentId);
}
public List<MasterMenu> queryByParentIdAndUserId(Integer parentId, Integer userId) {
return masterMenuDao.queryByParentIdAndUserId(parentId, userId);
}
public List<MasterMenuTree> queryTree() {
List<MasterMenuTree> masterMenuTreeList = this.queryTreeByParentId(TREE_ROOT);
for (MasterMenuTree masterMenuTree : masterMenuTreeList) {
masterMenuTree.setChildren(this.queryTreeByParentId(masterMenuTree.getId()));
}
return masterMenuTreeList;
}
public List<MasterMenuTree> queryTreeByUserId(Integer userId) {
List<MasterMenuTree> masterMenuTreeList = this.queryTreeByParentIdAndUserId(TREE_ROOT, userId);
for (MasterMenuTree masterMenuTree : masterMenuTreeList) {
masterMenuTree.setChildren(this.queryTreeByParentIdAndUserId(masterMenuTree.getId(), userId));
}
return masterMenuTreeList;
}
private List<MasterMenuTree> queryTreeByParentId(Integer parentId) {
List<MasterMenuTree> masterMenuTreeList = new ArrayList<>();
List<MasterMenu> masterMenuList = this.queryByParentId(parentId);
for (MasterMenu masterMenu : masterMenuList) {
MasterMenuTree masterMenuTree = new MasterMenuTree();
BeanUtils.copyProperties(masterMenu, masterMenuTree);
masterMenuTree.setAttrExplain(this.getAttrExplain(masterMenuTree.getAttrId()));
masterMenuTree.setStatusExplain(this.getStatusExplain(masterMenuTree.getStatusId()));
masterMenuTree.setChildren(this.queryTreeByParentId(masterMenuTree.getId()));
masterMenuTreeList.add(masterMenuTree);
}
return masterMenuTreeList;
}
private List<MasterMenuTree> queryTreeByParentIdAndUserId(Integer parentId, Integer userId) {
List<MasterMenuTree> masterMenuTreeList = new ArrayList<>();
List<MasterMenu> masterMenuList = this.queryByParentIdAndUserId(parentId, userId);
for (MasterMenu masterMenu : masterMenuList) {
MasterMenuTree masterMenuTree = new MasterMenuTree();
BeanUtils.copyProperties(masterMenu, masterMenuTree);
masterMenuTree.setAttrExplain(this.getAttrExplain(masterMenuTree.getAttrId()));
masterMenuTree.setStatusExplain(this.getStatusExplain(masterMenuTree.getStatusId()));
masterMenuTree.setChildren(this.queryTreeByParentIdAndUserId(masterMenuTree.getId(), userId));
masterMenuTreeList.add(masterMenuTree);
}
return masterMenuTreeList;
}
public boolean save(MasterMenu masterMenu, UserAgent userAgent) {
masterMenu.setCreateUser(userAgent.getMasterUser().getUsername());
return !ObjectUtils.isEmpty(masterMenuDao.save(masterMenu));
}
public boolean edit(MasterMenu masterMenu, UserAgent userAgent) {
masterMenu.setUpdateUser(userAgent.getMasterUser().getUsername());
return !ObjectUtils.isEmpty(masterMenuDao.edit(masterMenu));
}
public boolean delete(Integer id) {
return !ObjectUtils.isEmpty(masterMenuDao.delete(id));
}
private String getAttrExplain(Integer attrId) {
for (MasterMenuAttr menuBarAttr : MasterMenuAttr.values()) {
if (menuBarAttr.getAttrId().equals(attrId)) {
return menuBarAttr.getAttrExplain();
}
}
return MasterMenuAttr.UNKNOWN.getAttrExplain();
}
private String getStatusExplain(Integer statusId) {
for (MasterMenuStatus menuBarStatus : MasterMenuStatus.values()) {
if (menuBarStatus.getStatusId().equals(statusId)) {
return menuBarStatus.getStatusExplain();
}
}
return MasterMenuStatus.UNKNOWN.getStatusExplain();
}
}
package com.ifacebox.web.admin.master.service;
import com.ifacebox.web.admin.master.dao.MasterOperateDao;
import com.ifacebox.web.admin.master.model.*;
import com.ifacebox.web.common.model.UserAgent;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @author znn
*/
@Service
public class MasterOperateService {
/**
* 顶级菜单的上级菜单编码
*/
public static final int TREE_ROOT = 0;
@Resource
private MasterOperateDao masterOperateDao;
public MasterOperate queryById(Integer id) {
return masterOperateDao.queryById(id);
}
public MasterOperate queryByTitle(String title) {
return masterOperateDao.queryByTitle(title);
}
public List<MasterOperate> queryByParentId(Integer parentId) {
return masterOperateDao.queryByParentId(parentId);
}
public List<MasterOperateTree> queryTree() {
List<MasterOperateTree> masterOperateTreeList = this.queryTreeByParentId(TREE_ROOT);
for (MasterOperateTree masterOperateTree : masterOperateTreeList) {
masterOperateTree.setChildren(this.queryTreeByParentId(masterOperateTree.getId()));
}
return masterOperateTreeList;
}
private List<MasterOperateTree> queryTreeByParentId(Integer parentId) {
List<MasterOperateTree> masterOperateTreeList = new ArrayList<>();
List<MasterOperate> masterOperateList = this.queryByParentId(parentId);
for (MasterOperate masterOperate : masterOperateList) {
MasterOperateTree masterOperateTree = new MasterOperateTree();
BeanUtils.copyProperties(masterOperate, masterOperateTree);
masterOperateTree.setAttrExplain(this.getAttrExplain(masterOperateTree.getAttrId()));
masterOperateTree.setStatusExplain(this.getStatusExplain(masterOperateTree.getStatusId()));
masterOperateTree.setChildren(this.queryTreeByParentId(masterOperateTree.getId()));
masterOperateTreeList.add(masterOperateTree);
}
return masterOperateTreeList;
}
public boolean save(MasterOperate masterOperate, UserAgent userAgent) {
masterOperate.setCreateUser(userAgent.getMasterUser().getUsername());
return !ObjectUtils.isEmpty(masterOperateDao.save(masterOperate));
}
public boolean edit(MasterOperate masterOperate, UserAgent userAgent) {
masterOperate.setUpdateUser(userAgent.getMasterUser().getUsername());
return !ObjectUtils.isEmpty(masterOperateDao.edit(masterOperate));
}
public boolean delete(Integer id) {
return !ObjectUtils.isEmpty(masterOperateDao.delete(id));
}
private String getAttrExplain(Integer attrId) {
for (MasterOperateAttr masterOperateAttr : MasterOperateAttr.values()) {
if (masterOperateAttr.getAttrId().equals(attrId)) {
return masterOperateAttr.getAttrExplain();
}
}
return MasterOperateAttr.UNKNOWN.getAttrExplain();
}
private String getStatusExplain(Integer statusId) {
for (MasterOperateStatus masterOperateStatus : MasterOperateStatus.values()) {
if (masterOperateStatus.getStatusId().equals(statusId)) {
return masterOperateStatus.getStatusExplain();
}
}
return MasterOperateStatus.UNKNOWN.getStatusExplain();
}
}
package com.ifacebox.web.admin.master.service;
import com.ifacebox.web.admin.master.dao.MasterRoleMenuDao;
import com.ifacebox.web.admin.master.model.MasterRole;
import com.ifacebox.web.admin.master.model.MasterRoleMenu;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* @author znn
*/
@Service
public class MasterRoleMenuService {
@Resource
private MasterRoleMenuDao masterRoleMenuDao;
public List<MasterRoleMenu> queryByRoleId(Integer roleId) {
return masterRoleMenuDao.queryByRoleId(roleId);
}
public List<MasterRoleMenu> queryByMenuId(Integer menuId) {
return masterRoleMenuDao.queryByMenuId(menuId);
}
@Transactional(rollbackFor = Exception.class)
public boolean save(MasterRole masterRole) {
masterRoleMenuDao.delete(masterRole.getId());
for (Integer menuId : masterRole.getMenuId()) {
MasterRoleMenu roleMenu = new MasterRoleMenu();
roleMenu.setRoleId(masterRole.getId());
roleMenu.setMenuId(menuId);
masterRoleMenuDao.save(roleMenu);
}
return true;
}
}
package com.ifacebox.web.admin.master.service;
import com.ifacebox.web.admin.master.dao.MasterUserGroupDao;
import com.ifacebox.web.admin.master.model.MasterUserGroup;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author znn
*/
@Service
public class MasterUserGroupService {
@Resource
private MasterUserGroupDao masterUserGroupDao;
public List<MasterUserGroup> queryByGroupId(Integer groupId) {
return masterUserGroupDao.queryByGroupId(groupId);
}
}
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册