This commit is contained in:
xijue 2025-04-25 14:02:24 +08:00
parent fc86e47a8f
commit 252a14d47d
753 changed files with 767446 additions and 6 deletions

103
mms-admin/.gitignore vendored Normal file
View File

@ -0,0 +1,103 @@
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# Eclipse & IntelliJ IDEA
.classpath
.settings/
.idea
.idea/
*.iws
*.iml
*.ipr
.settings
.project
.flattened-pom.xml
# Maven
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar
# Gradle
.gradle
.gradle/
build/
**/build/
bin/
!src/**/build/
gradle-app.setting
!gradle-wrapper.jar
.gradletasknamecache
gradle/wrapper/gradle-wrapper.properties
# VS Code
.vscode/
# STS
.apt_generated
.factorypath
.springBeans
.sts4-cache
# NetBeans
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
!**/src/main/**/build/
!**/src/test/**/build/
# DB
/script/db/.back_sxpcwlkj/
/script/db/.version_sxpcwlkj/
!/script/db/.back_sxpcwlkj/
.DS_Store
node_modules
/dist
package-lock.json
yarn.lock
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

27
mms-admin/Dockerfile Normal file
View File

@ -0,0 +1,27 @@
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER SXPCWLKJ
RUN mkdir -p /sxpcwlkj \
/sxpcwlkj/mms-admin \
/sxpcwlkj/mms-admin/logs \
/sxpcwlkj/mms-admin/files \
/sxpcwlkj/mms-admin/temp \
/sxpcwlkj/mms-admin/skywalking/agent
WORKDIR /sxpcwlkj/mms-admin
ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
EXPOSE ${SERVER_PORT}
ADD ./target/mms-system.jar ./app.jar
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \
# 应用名称 如果想区分集群节点监控 改成不同的名称即可
#-Dskywalking.agent.service_name=sxpcwlkj-mms \
#-javaagent:/sxpcwlkj/mms/skywalking/agent/skywalking-agent.jar \
-jar app.jar \
-XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS}

21
mms-admin/LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 mmsAdmin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

103
mms-admin/pom.xml Normal file
View File

@ -0,0 +1,103 @@
<?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>
<artifactId>mms</artifactId>
<groupId>com.sxpcwlkj</groupId>
<version>${revision}</version>
</parent>
<packaging>jar</packaging>
<artifactId>mms-admin</artifactId>
<description>后台系统模块</description>
<dependencies>
<!-- 低代码生产 -->
<dependency>
<groupId>com.sxpcwlkj</groupId>
<artifactId>mms-gen</artifactId>
</dependency>
<!--存储模块-->
<dependency>
<groupId>com.sxpcwlkj</groupId>
<artifactId>mms-oss</artifactId>
<exclusions>
<!-- 解决slf4j冲突 -->
<exclusion>
<artifactId>slf4j-reload4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!--短信模块-->
<dependency>
<groupId>com.sxpcwlkj</groupId>
<artifactId>mms-sms</artifactId>
</dependency>
<!--邮件模块-->
<dependency>
<groupId>com.sxpcwlkj</groupId>
<artifactId>mms-email</artifactId>
</dependency>
<!--redis模块-->
<dependency>
<groupId>com.sxpcwlkj</groupId>
<artifactId>mms-redis</artifactId>
</dependency>
<!--微信模块-->
<dependency>
<groupId>com.sxpcwlkj</groupId>
<artifactId>mms-wx</artifactId>
</dependency>
<!--阿里云模块-->
<dependency>
<groupId>com.sxpcwlkj</groupId>
<artifactId>mms-aliyun</artifactId>
</dependency>
<!--AI模块-->
<dependency>
<groupId>com.sxpcwlkj</groupId>
<artifactId>mms-ai</artifactId>
</dependency>
<!-- adminMall模块-->
<!-- <dependency>-->
<!-- <groupId>com.sxpcwlkj</groupId>-->
<!-- <artifactId>mms-admin-mall</artifactId>-->
<!-- </dependency>-->
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${maven-war-plugin.version}</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${project.artifactId}</warName>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,46 @@
package com.sxpcwlkj;
import lombok.extern.slf4j.Slf4j;
import org.dromara.x.file.storage.spring.EnableFileStorage;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.core.env.Environment;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* @author xijue
*/
@SpringBootApplication
@Slf4j
@EnableAspectJAutoProxy(exposeProxy = true)
@MapperScan(basePackages = {"com.sxpcwlkj.**.mapper"})
@EnableFileStorage
public class MmsAdminApplication {
public static void main(String[] args) throws UnknownHostException {
ConfigurableApplicationContext applicationContext = SpringApplication.run(MmsAdminApplication.class, args);
Environment env = applicationContext.getEnvironment();
System.out.println("后端: 系统启动成功,当前环境为: " + env.getProperty("spring.profiles.active"));
log.info("\n----------------------------------------------------------\n\t" +
"Application '{}' is running! Access URLs:\n\t" +
"Local: \t\thttp://localhost:{}\n\t" +
"External: \thttp://{}:{}\n\t" +
"Doc: \t\t{}\n" +
"----------------------------------------------------------",
env.getProperty("sxpcwlkj.name"),
env.getProperty("server.port"),
InetAddress.getLocalHost().getHostAddress(),
env.getProperty("server.port"),
env.getProperty("sxpcwlkj.docUrl"));
}
}

View File

@ -0,0 +1,22 @@
package com.sxpcwlkj;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* 自定义Web容器配置
*
* @name: ServletInitializer
* @author: 西决
* @date: 2022/12/01
**/
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MmsAdminApplication.class);
}
}

View File

@ -0,0 +1,66 @@
package com.sxpcwlkj.system.config;
import cn.dev33.satoken.stp.StpInterface;
import cn.hutool.core.lang.Console;
import com.sxpcwlkj.authority.LoginObject;
import com.sxpcwlkj.common.utils.MapstructUtil;
import com.sxpcwlkj.system.entity.vo.SysRoleVo;
import com.sxpcwlkj.system.entity.vo.SysUserVo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 自定义权限加载接口实现类
* 保证此类被 SpringBoot 扫描完成 Sa-Token 的自定义权限验证扩展
* @author xijue
*/
@Component
@RequiredArgsConstructor
public class SaTokenStpInterfaceImpl implements StpInterface {
/**
* 返回一个账号所拥有的权限码集合
* @param loginId账号id
* @param loginType账号体系标识
*/
@Override
public List<String> getPermissionList(Object loginId, String loginType) {
// list 仅做模拟实际项目中要根据具体业务逻辑来查询权限
List<String> list = new ArrayList<>();
SysUserVo sysUserVo = LoginObject.getLoginObject(SysUserVo.class);
assert sysUserVo != null;
List<SysRoleVo> roleVoList = sysUserVo.getRoleVoList();
for (SysRoleVo r:roleVoList) {
list.addAll(Arrays.asList(r.getPermissions()));
}
Console.log(list.toString());
return list;
}
/**
* 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
* @param loginId账号id
* @param loginType账号体系标识
*/
@Override
public List<String> getRoleList(Object loginId, String loginType) {
// list 仅做模拟实际项目中要根据具体业务逻辑来查询角色
List<String> list = new ArrayList<>();
SysUserVo userVo = LoginObject.getLoginObject(SysUserVo.class);
SysUserVo sysUserVo = MapstructUtil.convert(userVo, SysUserVo.class);
assert sysUserVo != null;
String[] roleCodes = sysUserVo.getRoleCodes();
list= Arrays.asList(roleCodes);
return list;
}
}

View File

@ -0,0 +1,88 @@
package com.sxpcwlkj.system.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.convert.Convert;
import com.sxpcwlkj.authority.LoginObject;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.constant.Constants;
import com.sxpcwlkj.common.utils.R;
import com.sxpcwlkj.framework.sercice.SysSignService;
import com.sxpcwlkj.redis.RedisUtil;
import com.sxpcwlkj.redis.constant.RedisConstant;
import com.sxpcwlkj.system.entity.bo.LoginBodyBo;
import com.sxpcwlkj.system.entity.vo.SysUserVo;
import com.sxpcwlkj.system.service.SysLoginService;
import com.sxpcwlkj.system.service.SysUserService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.time.Duration;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 系统登录
* @author xijue
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("system/auth")
public class AuthController extends BaseController {
private final SysLoginService loginService;
private final SysUserService sysUserService;
private final SysSignService sysSignService;
/**
* 登录方法
* @param loginBodyBo 登录参数
* @return 登录结果
*/
@SaIgnore
@PostMapping("/login")
public R<Map<String, Object>> login(@Validated @RequestBody LoginBodyBo loginBodyBo,
HttpServletRequest request,
HttpServletResponse response) {
Map<String, Object> ajax = new HashMap<>(16);
// 生成令牌
String token = loginService.login(request,loginBodyBo);
ajax.put(Constants.TOKEN, token);
SysUserVo sysUser = sysUserService.getUserRoleAnfFunctionInfo(LoginObject.getLoginId());
RedisUtil.setCacheObject(RedisConstant.ADMIN_TENANT_KEY+sysUser.getUserId(),sysUser.getTenantId(), Duration.ofHours(24));
RedisUtil.setCacheObject(RedisConstant.ADMIN_KEY+sysUser.getUserId(),sysUser, Duration.ofHours(24));
ajax.put(Constants.USERINFO, sysUserService.getUserInfo(sysUser));
if(LoginObject.isLogin()){
//给浏览器端设置一个 Cookie clientKey值 3天
sysSignService.loginSetCookie(request,response,1000*60*60*24*3);
}
return success(ajax);
}
/**
* 退出登录
* @return 退出结果
*/
@SaIgnore
@PostMapping("/logout")
public R<String> logout() {
loginService.logout();
return success("退出成功");
}
}

View File

@ -0,0 +1,67 @@
package com.sxpcwlkj.system.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.code.entity.CaptchaEntity;
import com.sxpcwlkj.common.properties.MsProperties;
import com.sxpcwlkj.common.utils.DataUtil;
import com.sxpcwlkj.common.utils.R;
import com.sxpcwlkj.system.service.CaptchaService;
import com.sxpcwlkj.system.service.SysTenantService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* 验证码处理类
* @author xijue
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("system/visitor")
public class CaptchaController extends BaseController {
private final SysTenantService sysTenantService;
private final CaptchaService captchaService;
private final MsProperties msProperties;
/**
* 系统配置
*/
@SaIgnore
@GetMapping("/sysInfo")
public R<Map<String,Object>> sysInfo() {
Map<String,Object> map=new HashMap<>();
map.put("sysInfo",msProperties);
map.put("tenantList",sysTenantService.selectOpenList());
return success(map);
}
/**
* 登录验证码
*
*/
@SaIgnore
@GetMapping("/{code}")
public R<Object> captcha(@PathVariable String code) {
if(StringUtils.isEmpty(code)){
return R.fail("缺少验证[code]参数");
}
Map<String, Object> ajax = captchaService.getCaptcha(CaptchaEntity.TYPE.系统登录.getValue(), code);
DataUtil.getString(ajax.get(CaptchaEntity.CODE.CAPTCHA.getValue()));
return R.success(ajax);
}
}

View File

@ -0,0 +1,350 @@
package com.sxpcwlkj.system.controller;
import com.sxpcwlkj.common.code.entity.WxCodeBo;
import com.sxpcwlkj.common.constant.Constants;
import com.sxpcwlkj.common.enums.DeviceEnum;
import com.sxpcwlkj.common.enums.WxCodeStatusEnum;
import com.sxpcwlkj.common.utils.MapstructUtil;
import com.sxpcwlkj.framework.sercice.SysSignService;
import com.sxpcwlkj.redis.constant.RedisConstant;
import com.sxpcwlkj.system.entity.SysUser;
import com.sxpcwlkj.system.service.SysLoginService;
import com.sxpcwlkj.wx.service.WxCodeService;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.RandomUtil;
import com.sxpcwlkj.authority.LoginObject;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.code.entity.ConfigEntity;
import com.sxpcwlkj.common.enums.ConfigKeyNum;
import com.sxpcwlkj.common.enums.SystemCommonEnum;
import com.sxpcwlkj.common.exception.MmsException;
import com.sxpcwlkj.common.utils.DataUtil;
import com.sxpcwlkj.common.utils.R;
import com.sxpcwlkj.email.service.EmailService;
import com.sxpcwlkj.common.utils.IPUtil;
import com.sxpcwlkj.redis.RedisUtil;
import com.sxpcwlkj.sms.service.SmsService;
import com.sxpcwlkj.system.entity.AdminMenuTree;
import com.sxpcwlkj.system.entity.bo.EmailBo;
import com.sxpcwlkj.system.entity.bo.SmsBo;
import com.sxpcwlkj.system.entity.vo.SysUserVo;
import com.sxpcwlkj.system.service.SysDictService;
import com.sxpcwlkj.system.service.SysUserService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.*;
import java.time.Duration;
import java.util.*;
/**
* mms公共接口
* @author xijue
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping("common")
public class CommonController extends BaseController {
private final SmsService smsService;
private final EmailService emailService;
private final SysUserService sysUserService;
private final SysLoginService sysLoginService;
private final Environment environment;
private final SysDictService sysDictService;
private final WxCodeService wxCodeService;
private final SysSignService sysSignService;
@Value("${server.port}")
private String port;
/**
* 获取系统基础配置
*/
@PostMapping("/startBase")
@SaIgnore
public R<Object> startBase(HttpServletRequest request, HttpServletResponse response,String key){
List<ConfigEntity> convert = RedisUtil.getCacheList(ConfigKeyNum.config_base.getKey());
Map<String, Object> map = new HashMap<>();
if(convert.isEmpty()){
List<String> list=new ArrayList<>();
list.add("1");
map.put("loginType",list);
}
convert.forEach(smsConfigEntity -> {
if("sys_base_title".equals(smsConfigEntity.getConfigKey())){
map.put("globalTitle",smsConfigEntity.getConfigValue());
}
if("sys_base_description".equals(smsConfigEntity.getConfigKey())){
map.put("globalDescription",smsConfigEntity.getConfigValue());
}
if("sys_base_logo".equals(smsConfigEntity.getConfigKey())){
map.put("logo",smsConfigEntity.getConfigValue());
}
if("sys_base_captcha_state".equals(smsConfigEntity.getConfigKey())){
map.put("captchaState", Objects.equals(Convert.toInt(smsConfigEntity.getConfigValue()), SystemCommonEnum.SYS_COMMON_STATE_OPEN.getValue()));
}
if("sys_base_login_type".equals(smsConfigEntity.getConfigKey())){
map.put("loginType", DataUtil.getStringToList(smsConfigEntity.getConfigValue()));
}
if("sys_base_tenant_state".equals(smsConfigEntity.getConfigKey())){
map.put("tenantState", Convert.toInt(smsConfigEntity.getConfigValue()) == 1);
}
if("sys_base_login_bg".equals(smsConfigEntity.getConfigKey())){
map.put("loginBg",smsConfigEntity.getConfigValue());
}
if("sys_base_tenant_exclusion_table".equals(smsConfigEntity.getConfigKey())){
map.put("tenantExclusionTable", DataUtil.getStringToList(smsConfigEntity.getConfigValue()));
}
});
return R.success("base system config.",map);
}
/**
* 获取二维码
* @param key 二维码key
* @return 二维码
*/
@SaIgnore
@PostMapping("/getWxCode")
public R<Object> getWxCode(String key) {
if(key==null){
return R.fail("key不能为空");
}
//登录二维码
String codeUrl= wxCodeService.getCode(new WxCodeBo(key)
.typeLogin()
.paramData(key));
return success("二维码获取成功",codeUrl);
}
/**
* 查询二维码状态
* @param key 二维码key
*/
@SaIgnore
@PostMapping("/queryWxCodeState")
public R<Object> queryWxCodeState(String key,HttpServletRequest request,
HttpServletResponse response) {
if(key==null){
return R.fail("key不能为空");
}
//登录二维码
WxCodeBo wxCodeBo= wxCodeService.getCodeState(new WxCodeBo(key).typeLogin());
if(Objects.equals(wxCodeBo.getState(), WxCodeStatusEnum.WAITING.getValue())){
return fail("等待扫码中...");
}
if(Objects.equals(wxCodeBo.getState(), WxCodeStatusEnum.SCANNED.getValue())){
return okFail("二维码已被扫!");
}
if(Objects.equals(wxCodeBo.getState(), WxCodeStatusEnum.FAILING.getValue())){
return okFail("扫码失败!");
}
if(Objects.equals(wxCodeBo.getState(), WxCodeStatusEnum.SUCCEED.getValue())){
log.info(wxCodeBo.getOpenId());
SysUserVo sysUserVo= sysUserService.selectOpenId(wxCodeBo.getOpenId());
if(sysUserVo==null){
return okFail("该微信未绑定账号!");
}
if(!Objects.equals(sysUserVo.getStatus(), SystemCommonEnum.SYS_COMMON_STATE_OPEN.getValue())){
return okFail("该账号已被禁用!");
}
//进行登记登记
SysUser user = MapstructUtil.convert(sysUserVo, SysUser.class);
sysLoginService.updateSysUser(request,user);
// 获取当前会话的token值
assert user != null;
String token = LoginObject.loginToken(user.getUserId(), DeviceEnum.ADMIN.getType(), 10000000L, "id", user.getUserId());
Map<String, Object> ajax = new HashMap<>(16);
ajax.put(Constants.TOKEN, token);
SysUserVo sysUser = sysUserService.getUserRoleAnfFunctionInfo(LoginObject.getLoginId());
ajax.put(Constants.USERINFO, sysUserService.getUserInfo(sysUser));
RedisUtil.setCacheObject(RedisConstant.ADMIN_KEY+sysUser.getUserId(),sysUser, Duration.ofHours(24));
if(LoginObject.isLogin()){
//给浏览器端设置一个 Cookie clientKey值 3天
sysSignService.loginSetCookie(request,response,1000*60*60*24*3);
}
return success(ajax);
}
return R.fail("系统异常!");
}
/**
* 发送验证码
* @param bo 验证码业务对象
*/
@SaIgnore
@PostMapping("/smsCode")
public R<Object> smsCode(@RequestBody SmsBo bo, HttpServletRequest request) {
Integer type = bo.getType();
String phone = bo.getPhone();
String keytype = "register:";
if (type == 1) {
keytype = "register:";
}
if (type == 2) {
List<ConfigEntity> convert = RedisUtil.getCacheList(ConfigKeyNum.config_base.getKey());
for (ConfigEntity smsConfigEntity : convert) {
if("sys_base_login_type".equals(smsConfigEntity.getConfigKey())){
List<String> toList = DataUtil.getStringToList(smsConfigEntity.getConfigValue());
if(toList.contains("1")){
return R.fail("当前系统不支持手机号登录!");
}
}
}
keytype = "login:";
}
if (type == 3) {
keytype = "password:";
}
if (type == 4) {
keytype = "passwordPay:";
}
if (type == 5) {
keytype = "updatePhone:";
}
if (Objects.equals(environment.getProperty("spring.profiles.active"), "prod")) {
try {
String ip = null;
ip = IPUtil.getIp(request);
log.info("ips:" + ip);
Object s = RedisUtil.getCacheObject("ip:phone:" + ip);
int num = Convert.toInt(s == null ? 0 : Convert.toInt(s), 0);
if (num >= 5) {
log.info("ips>=5,拦截:" + ip);
return R.fail("当前IP发送频繁,请一天后再发送哦!");
}
num++;
RedisUtil.setCacheObject("ip:phone:" + ip, num);
RedisUtil.setCacheObject("ip:phone:" + ip, num, Duration.ofDays(1));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
SysUserVo userVo=null;
if (type == 1) {
userVo = sysUserService.selectVoByPhone(phone);
if (userVo != null) {
return R.fail("该手机号已注册!");
}
}
if (type == 2 || type == 3) {
userVo = sysUserService.selectVoByPhone(phone);
if (userVo == null) {
return R.fail("该手机号账号不存在!");
}
}
if(type==4||type==5){
userVo=LoginObject.getLoginObject(SysUserVo.class);
if (userVo == null) {
return R.fail("登录失效请重新登录!");
}
if(type==5){
userVo = sysUserService.selectVoByPhone(phone);
if (userVo != null) {
return R.fail("该手机号已被绑定!");
}
}
}
if(LoginObject.isLogin()){
if (!Objects.equals(Convert.toInt(LoginObject.getLoginObject(SysUserVo.class).getStatus()), SystemCommonEnum.SYS_COMMON_STATE_OPEN.getValue())) {
throw new MmsException("账号状态不正常!");
}
}
String key = RedisUtil.PHONE_CODES_KEY + keytype + phone;
Object object = RedisUtil.getCacheObject(key);
if (object != null) {
RedisUtil.deleteObject(key);
return R.fail("发送频繁,请稍后再发送哦!");
}
String code = RandomUtil.randomNumbers(6);
R<Object> result = smsService.sendSms(phone, code);
if (result.getStatus()!=0) {
log.error("验证码短信发送异常 => {}", result.getMsg());
return result;
}
RedisUtil.setCacheObject(key, code);
RedisUtil.expire(key, Duration.ofMinutes(1));
return R.success("手机短信码已发送!");
}
/**
* 获取所有字典列表
* @return 字典列表
*/
@SaCheckLogin
@PostMapping("/listDictAll")
public R<Object> listDictAll() {
return R.success(sysDictService.selectAll());
}
/**
* 登录用户系统菜单
* @return 菜单列表
*/
@SaCheckLogin
@GetMapping("/getMenu")
public R<Object> getMenu() {
List<AdminMenuTree> menuTree = sysUserService.getAdminMenuTree(LoginObject.getLoginId());
return success(menuTree);
}
@SaCheckLogin
@PostMapping("/emailCode")
public R<Object> emailCode(@RequestBody EmailBo bo, HttpServletRequest request) {
Integer type = bo.getType();
String emali = bo.getEmail();
String keytype = "updatePhone:";
if (Objects.equals(environment.getProperty("spring.profiles.active"), "prod")) {
try {
String ip = null;
ip = IPUtil.getIp(request);
log.info("ips:" + ip);
Object s = RedisUtil.getCacheObject("ip:email:" + ip);
int num = Convert.toInt(s == null ? 0 : Convert.toInt(s), 0);
if (num >= 5) {
log.info("ips>=5,拦截:" + ip);
return R.fail("当前IP发送频繁,请一天后再发送哦!");
}
num++;
RedisUtil.setCacheObject("ip:email:" + ip, num);
RedisUtil.setCacheObject("ip:email:" + ip, num, Duration.ofDays(1));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
String key = RedisUtil.EMAIL_CODES_KEY + keytype + emali;
Object object = RedisUtil.getCacheObject(key);
if (object != null) {
RedisUtil.deleteObject(key);
return R.fail("发送频繁,请稍后再发送哦!");
}
String code = RandomUtil.randomNumbers(6);
R<Object> result = emailService.sendEmailCode(bo.getEmail(), code);
if (result.getStatus()!=0) {
log.error("验证码发送异常 => {}", result.getMsg());
return result;
}
RedisUtil.setCacheObject(key, code);
RedisUtil.expire(key, Duration.ofMinutes(10));
return R.success("邮箱验证码已发送!");
}
}

View File

@ -0,0 +1,272 @@
package com.sxpcwlkj.system.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateRange;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.sxpcwlkj.authority.LoginObject;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.utils.R;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 首页控制台
* @author xijue
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("system/home")
public class HomeController extends BaseController {
/**
* 会员类别
*/
@SaCheckLogin
@GetMapping("/memberSex")
public R<Object> memberSex() {
List<Number> list = new ArrayList<>();
Long count = 0L;
list.add(count);
Long count2 = 0L;
list.add(count2);
Long count3 = 0L;
list.add(count3);
return R.success(list);
}
//1:会员总人数 今日新增
//2:代发货总数量 今日数量
//3:待还机总数量 今到期数量
//4:分期付款总订单 今日付款数量
/**
* 待处理任务
*/
@SaCheckLogin
@GetMapping("/info")
public R<Object> homeInfo() {
String loginId = LoginObject.getLoginId();
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<>();
//总人数
Long memberCount = 0L;
map.put("num1", memberCount);
//今日数量
Long todayMemberCount = 0L;
map.put("num2", todayMemberCount);
map.put("num3", "会员人数");
//https://icones.js.org
map.put("num4", "iconoir:accessibility");
map.put("num5", "");
map.put("color1", "#FF6462");
map.put("color2", "--next-color-primary-lighter");
map.put("color3", "--el-color-primary");
list.add(map);
Map<String, Object> map2 = new HashMap<>();
//待发货
Long orderCount = 0L;
map2.put("num1", orderCount);
//今日数量
Long todayOrderCount = 0L;
map2.put("num2", todayOrderCount);
map2.put("num3", "订单发货");
map2.put("num4", "octicon:copilot-16");
map2.put("num5", "");
map2.put("color1", "#6690F9");
map2.put("color2", "--next-color-success-lighter");
map2.put("color3", "--el-color-success");
list.add(map2);
Map<String, Object> map3 = new HashMap<>();
//待发货
Long orderCountGuiHai = 0L;
map3.put("num1", orderCountGuiHai);
//今日数量
Long todayOrderCountGuiHai = 0L;
map3.put("num2", todayOrderCountGuiHai);
map3.put("num3", "到期待还");
map3.put("num4", "emojione-monotone:alembic");
map3.put("num5", "");
map3.put("color1", "#6690F9");
map3.put("color2", "--next-color-warning-lighter");
map3.put("color3", "--el-color-warning");
list.add(map3);
Map<String, Object> map4 = new HashMap<>();
//待发货
Long orderCountFenQi = 0L;
map4.put("num1", orderCountFenQi);
//今日数量
Long todayOrderCountFenQi = 0L;
map4.put("num2", todayOrderCountFenQi);
map4.put("num3", "分期待付");
map4.put("num4", "emojione-monotone:bear-face");
map4.put("num5", "");
map4.put("color1", "#FF6462");
map4.put("color2", "--next-color-danger-lighter");
map4.put("color3", "--el-color-danger");
list.add(map4);
return R.success(list);
}
/**
* 快捷菜单
*
*/
@SaCheckLogin
@GetMapping("/menu")
public R<Object> homeMenu() {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<>();
map.put("icon", "iconfont icon-yangan");
map.put("label", "会员管理");
map.put("path", "/sxpcwlkj/storeMember");
map.put("iconColor", "#F72B3F");
Map<String, Object> query = new HashMap<>();
map.put("query", query);
list.add(map);
Map<String, Object> map2 = new HashMap<>();
map2.put("icon", "iconfont icon-wendu");
map2.put("label", "实名认证");
map2.put("path", "/sxpcwlkj/storeMemberAuthentication");
map2.put("iconColor", "#91BFF8");
Map<String, Object> query2 = new HashMap<>();
map2.put("query", query2);
list.add(map2);
Map<String, Object> map3 = new HashMap<>();
map3.put("icon", "iconfont icon-neiqianshujuchucun");
map3.put("label", "商品列表");
map3.put("path", "/sxpcwlkj/storeProduct");
map3.put("iconColor", "#88D565");
Map<String, Object> query3 = new HashMap<>();
map3.put("query", query3);
list.add(map3);
Map<String, Object> map4 = new HashMap<>();
map4.put("icon", "iconfont icon-fuwenbenkuang");
map4.put("label", "文章列表");
map4.put("path", "/sxpcwlkj/storeArticle");
map4.put("iconColor", "#88D565");
Map<String, Object> query4 = new HashMap<>();
map4.put("query", query4);
list.add(map4);
Map<String, Object> map5 = new HashMap<>();
map5.put("icon", "iconfont icon-yangan");
map5.put("label", "待付款订单");
map5.put("path", "/sxpcwlkj/storeOrder");
map5.put("iconColor", "#FBD4A0");
Map<String, Object> query5 = new HashMap<>();
query5.put("status", 10);
map5.put("query", query5);
list.add(map5);
Map<String, Object> map6 = new HashMap<>();
map6.put("icon", "iconfont icon-shouye_dongtaihui");
map6.put("label", "待发货订单");
map6.put("path", "/sxpcwlkj/storeOrder");
map6.put("iconColor", "#FBD4A0");
Map<String, Object> query6 = new HashMap<>();
query6.put("status", 20);
map6.put("query", query6);
list.add(map6);
return R.success(list);
}
/**
* 订单数量
*
*/
@SaCheckLogin
@GetMapping("/orderNum")
public R<Object> orderNum() {
Map<String, Object> map = new HashMap<>();
List<BigDecimal> list1 = new ArrayList<>();
List<BigDecimal> list2 = new ArrayList<>();
//月份集合
// 创建日期范围生成器
DateTime start = DateUtil.parse("2024-01-01");
DateTime end = DateUtil.parse("2024-12-31");
DateRange range = DateUtil.range(start, end, DateField.MONTH);
for (DateTime date : range) {
BigDecimal num1 = new BigDecimal(0);
list1.add(num1 == null ? new BigDecimal(0) : num1);
BigDecimal num2 = new BigDecimal(0);
list2.add(num2 == null ? new BigDecimal(0) : num2);
}
map.put("list1", list1);
map.put("list2", list2);
return R.success(map);
}
/**
* 订单走势
*
*/
@SaCheckLogin
@GetMapping("/orderPrice")
public R<Object> orderPrice() {
Map<String, Object> map = new HashMap<>();
List<Map<String, Object>> list1 = new ArrayList<>();
List<Map<String, Object>> list2 = new ArrayList<>();
List<Map<String, Object>> list3 = new ArrayList<>();
//月份集合
// 创建日期范围生成器
DateTime start = DateUtil.parse("2024-01-01");
DateTime end = DateUtil.parse("2024-12-31");
DateRange range = DateUtil.range(start, end, DateField.MONTH);
int i = 1;
for (DateTime date : range) {
//{ value: 0, stationName: 's1' },
Map<String, Object> map1 = new HashMap<>();
BigDecimal num1 = new BigDecimal(0);
num1 = num1 == null ? new BigDecimal(0) : num1;
map1.put("value", num1);
map1.put("stationName", "s" + i);
list1.add(map1);
Map<String, Object> map2 = new HashMap<>();
BigDecimal num2 = new BigDecimal(0);
num2 = num2 == null ? new BigDecimal(0) : num2;
map2.put("value", num2);
map2.put("stationName", "s" + i);
list2.add(map2);
Map<String, Object> map3 = new HashMap<>();
map3.put("value", num1.add(num2));
map3.put("stationName", "s" + i);
list3.add(map3);
i++;
}
map.put("list1", list1);
map.put("list2", list2);
map.put("list3", list3);
return R.success(map);
}
}

View File

@ -0,0 +1,129 @@
package com.sxpcwlkj.system.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import com.sxpcwlkj.common.annotation.MssSafety;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.utils.R;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import com.sxpcwlkj.sms.service.SmsService;
import com.sxpcwlkj.system.entity.bo.SysConfigBo;
import com.sxpcwlkj.system.entity.vo.SysConfigVo;
import com.sxpcwlkj.system.service.SysConfigService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 系统配置
* @author xijue
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("system/config")
public class SysConfigController extends BaseController{
private final SysConfigService baseService;
/**
* 分页查询
*
* @param bo 查询条件
* @return 分页结果
*/
@MssSafety
@SaCheckPermission("system:config:list")
@PostMapping("/list")
public TableDataInfo<SysConfigVo> listPage(@RequestBody @Validated(ValidatedGroupConfig.query.class) SysConfigBo bo){
return baseService.selectListVoPage(bo, bo.getPageQuery());
}
/**
* 查询详情
*
* @param id 主键id
* @return 查询结果
*/
@SaCheckPermission("system:config:query")
@GetMapping("/{id}")
public R<SysConfigVo> queryById(@PathVariable String id) {
return success(baseService.selectVoById(id));
}
/**
* 更新
*
* @param bo 更新实体
* @return 更新结果
*/
@SaCheckPermission("system:config:edit")
@PutMapping
public R<Boolean> edit(@Validated @RequestBody SysConfigBo bo) {
return success(baseService.updateById(bo));
}
/**
* 新增
*
* @param bo 新增实体
* @return 新增结果
*/
@SaCheckPermission("system:config:insert")
@PostMapping
public R<Boolean> insert(@Validated @RequestBody SysConfigBo bo) {
return success(baseService.insert(bo));
}
/**
* 删除
*
* @param ids 主键id
* @return 删除结果
*/
@SaCheckPermission("system:config:delete")
@DeleteMapping("/{ids}")
public R<Boolean> delete(@PathVariable String ids) {
return success(baseService.deleteById(ids));
}
//========================系统配置扩展========================
/**
* 系统配置回显
* @param bos 查询对象
* @return 配置集合
*/
@SaCheckRole("super_admin")
@PostMapping("/getConfigs")
public R<List<SysConfigVo>> getConfigs(@Validated @RequestBody List<SysConfigBo> bos) {
return success(baseService.selectByCodes(bos));
}
/**
* 编辑系统配置
* @param bos 配置集合
* @return 编辑结果
*/
@SaCheckRole("super_admin")
@PostMapping("/configs")
public R<Boolean> configs(@Validated @RequestBody(required = false) List<SysConfigBo> bos) {
return success(baseService.updateByCodes(bos));
}
private final SmsService smsService;
@SaCheckLogin
@GetMapping("/sendSms/{phone}")
public R<Object> sendSms(@PathVariable String phone) {
return smsService.sendSms(phone, "123456");
}
}

View File

@ -0,0 +1,148 @@
package com.sxpcwlkj.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.sxpcwlkj.common.annotation.MssSafety;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.utils.MapstructUtil;
import com.sxpcwlkj.common.utils.R;
import com.sxpcwlkj.common.code.entity.PrintObject;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import com.sxpcwlkj.framework.utils.ExcelUtil;
import com.sxpcwlkj.common.code.entity.ThreeQueryBo;
import com.sxpcwlkj.system.entity.bo.SysDeptBo;
import com.sxpcwlkj.system.entity.vo.SysDeptVo;
import com.sxpcwlkj.system.entity.export.SysDeptExport;
import com.sxpcwlkj.system.service.SysDeptService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
import java.util.Set;
/**
* 系统部门
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("system/dept")
public class SysDeptController extends BaseController{
private final SysDeptService baseService;
/**
* 树结构列表
* @param bo 查询参数
* @return 树结构列表
*/
@SaCheckPermission("system:dept:list")
@PostMapping("/list")
public R<List<SysDeptVo>> listPage(@RequestBody @Validated(ValidatedGroupConfig.query.class) ThreeQueryBo bo) {
return success(baseService.queryTree(bo.getIsAll(),bo.getShowLevel()));
}
/**
* 根据id查询
* @param id ID
* @return 对象
*/
@SaCheckPermission("system:dept:query")
@GetMapping("/{id}")
public R<SysDeptVo> queryById(@PathVariable String id) {
return success(baseService.selectVoById(id));
}
/**
* 修改
* @param bo 对象
* @return true:成功 false:失败
*/
@SaCheckPermission("system:dept:edit")
@PutMapping
public R<Boolean> edit(@RequestBody @Validated(ValidatedGroupConfig.update.class) SysDeptBo bo) {
return success(baseService.updateById(bo));
}
/**
* 新增
* @param bo 对象
* @return true:成功 false:失败
*/
@SaCheckPermission("system:dept:insert")
@PostMapping
public R<Boolean> insert(@RequestBody @Validated(ValidatedGroupConfig.insert.class) SysDeptBo bo) {
return success(baseService.insert(bo));
}
/**
* 删除
* @param ids ID
* @return true:成功 false:失败
*/
@SaCheckPermission("system:dept:delete")
@DeleteMapping("/{ids}")
public R<Boolean> delete(@PathVariable String ids) {
return success(baseService.deleteById(ids));
}
/**
* 模版下载
*/
@SaCheckPermission("system:dept:import")
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) throws IOException {
ExcelUtil.download(response, SysDeptExport.class, "系统部门");
}
/**
* 导入系统用户
* @param file 模版文件
*/
@MssSafety
@Transactional
@SaCheckPermission("system:dept:import")
@PostMapping("/import")
public R<Boolean> imports(@RequestParam("file") MultipartFile file) throws Exception {
Set<SysDeptExport> list= ExcelUtil.imports(file, SysDeptExport.class);
Boolean state= baseService.imports(list);
return R.ok(state,state?"数据导入成功!":"数据导入失败!");
}
/**
* 导出系统用户
*/
@MssSafety
@Transactional
@SaCheckPermission("system:dept:export")
@PostMapping("/export")
public void export(@RequestBody @Validated(ValidatedGroupConfig.query.class) SysDeptBo bo,HttpServletResponse response) throws IOException {
List<SysDeptVo> list= baseService.selectListVoPage(bo, bo.getPageQuery()).getRows();
List<SysDeptExport> data= MapstructUtil.convert(list,SysDeptExport.class);
ExcelUtil.export(response, SysDeptExport.class, "系统部门",data);
}
/**
* 打印系统用户
*/
@MssSafety
@Transactional
@SaCheckPermission("system:dept:print")
@PostMapping("/print")
public R<PrintObject<SysDeptExport>> print(@RequestBody @Validated(ValidatedGroupConfig.query.class) SysDeptBo bo) throws Exception {
List<SysDeptVo> list= baseService.selectListVoPage(bo, bo.getPageQuery()).getRows();
List<SysDeptExport> data= MapstructUtil.convert(list,SysDeptExport.class);
PrintObject<SysDeptExport> printObject= new PrintObject<SysDeptExport>()
.setTitle("系统部门")
.setData(data);
return R.response(Boolean.TRUE,printObject);
}
}

View File

@ -0,0 +1,89 @@
package com.sxpcwlkj.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.sxpcwlkj.common.annotation.MssSafety;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.utils.R;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import com.sxpcwlkj.system.entity.bo.SysDictBo;
import com.sxpcwlkj.system.entity.vo.SysDictVo;
import com.sxpcwlkj.system.service.SysDictService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 系统字典
* @author xijue
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@RequestMapping("system/dict")
@RestController
@RequiredArgsConstructor
public class SysDictController extends BaseController {
private final SysDictService baseService;
/**
* 分页查询字典列表
*
* @param bo 查询条件
* @param pageQuery 分页条件
* @return 分页结果
*/
@MssSafety
@SaCheckPermission("system:dict:list")
@PostMapping("/list")
public TableDataInfo<SysDictVo> listPage(@RequestBody @Validated(ValidatedGroupConfig.query.class)SysDictBo bo) {
return baseService.selectPageList(bo, bo.getPageQuery());
}
/**
* 获取字典详细信息
*
* @return 字典详细信息
*/
@SaCheckPermission("system:dict:query")
@GetMapping("/{id}")
public R<SysDictVo> queryById(@PathVariable Long id) {
return success(baseService.selectVoById(id));
}
/**
* 编辑字典
* @param bo 字典信息
* @return 成功失败
*/
@SaCheckPermission("system:dict:edit")
@PutMapping
public R<Boolean> edit(@Validated @RequestBody(required = false) SysDictBo bo) {
return success(baseService.updateById(bo));
}
/**
* 新增字典
* @param bo 字典信息
* @return 成功失败
*/
@SaCheckPermission("system:dict:insert")
@PostMapping
public R<Boolean> insert(@Validated @RequestBody(required = false) SysDictBo bo) {
return success(baseService.insert(bo));
}
/**
* 删除字典
* @param id 字典ID
* @return vo
*/
@SaCheckPermission("system:dict:delete")
@DeleteMapping("/{id}")
public R<Boolean> delete(@PathVariable Long id) {
return success(baseService.deleteById(id));
}
}

View File

@ -0,0 +1,104 @@
package com.sxpcwlkj.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.sxpcwlkj.common.annotation.MssSafety;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.utils.R;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import com.sxpcwlkj.system.entity.AdminMenuTree;
import com.sxpcwlkj.system.entity.bo.SysFunctionBo;
import com.sxpcwlkj.system.entity.vo.SysFunctionVo;
import com.sxpcwlkj.system.service.SysFunctionService;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 系统资源
* @author xijue
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@RequestMapping("system/function")
@RestController
@RequiredArgsConstructor
public class SysFunctionController extends BaseController {
private final SysFunctionService baseService;
/**
* 获取资源列表
*
* @return vo
*/
@MssSafety
@SaCheckPermission("system:function:list")
@PostMapping("/list")
public R<List<SysFunctionVo>> listPage(@RequestBody @Validated(ValidatedGroupConfig.query.class) SysFunctionBo bo) {
return R.success(baseService.selectPageList(bo, bo.getPageQuery()));
}
/**
* 所有菜单
*/
@SaCheckPermission("system:function:list")
@PostMapping("/menuList")
public R<List<AdminMenuTree>> menuList(){
List<AdminMenuTree> functionTree = baseService.getAllMenuTree();
return success(functionTree);
}
/**
* 获取详细信息
*
* @return vo
*/
@SaCheckPermission("system:function:query")
@GetMapping("/{id}")
public R<SysFunctionVo> queryById(@PathVariable String id) {
return success(baseService.selectVoById(id));
}
/**
* 编辑资源
*
* @return vo
*/
@MssSafety
@Transactional
@SaCheckPermission("system:function:edit")
@PutMapping
public R<Boolean> edit(@Validated @RequestBody SysFunctionBo bo) {
return success(baseService.updateById(bo));
}
/**
* 新增资源
*
* @return vo
*/
@MssSafety
@Transactional
@SaCheckPermission("system:function:insert")
@PostMapping
public R<Boolean> insert(@Validated @RequestBody SysFunctionBo bo) {
return success(baseService.insert(bo));
}
/**
* 删除
*
* @return vo
*/
@MssSafety
@Transactional
@SaCheckPermission("system:function:delete")
@DeleteMapping("/{id}")
public R<Boolean> delete(@PathVariable String id) {
return success(baseService.deleteById(id));
}
}

View File

@ -0,0 +1,148 @@
package com.sxpcwlkj.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.sxpcwlkj.common.annotation.MssSafety;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.utils.MapstructUtil;
import com.sxpcwlkj.common.utils.R;
import com.sxpcwlkj.common.code.entity.PrintObject;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import com.sxpcwlkj.framework.utils.ExcelUtil;
import com.sxpcwlkj.system.entity.bo.SysNoticeBo;
import com.sxpcwlkj.system.entity.vo.SysNoticeVo;
import com.sxpcwlkj.system.entity.export.SysNoticeExport;
import com.sxpcwlkj.system.service.SysNoticeService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
import java.util.Set;
/**
* 系统公告
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("system/notice")
public class SysNoticeController extends BaseController{
private final SysNoticeService baseService;
/**
* 分页列表
* @param bo 查询条件
* @return 分页对象
*/
@SaCheckPermission("system:notice:list")
@PostMapping("/list")
public TableDataInfo<SysNoticeVo> listPage(@RequestBody @Validated(ValidatedGroupConfig.query.class) SysNoticeBo bo){
return baseService.selectListVoPage(bo, bo.getPageQuery());
}
/**
* 根据id查询
* @param id ID
* @return 对象
*/
@SaCheckPermission("system:notice:query")
@GetMapping("/{id}")
public R<SysNoticeVo> queryById(@PathVariable String id) {
return success(baseService.selectVoById(id));
}
/**
* 修改
* @param bo 对象
* @return true:成功 false:失败
*/
@SaCheckPermission("system:notice:edit")
@PutMapping
public R<Boolean> edit(@RequestBody @Validated(ValidatedGroupConfig.update.class) SysNoticeBo bo) {
return success(baseService.updateById(bo));
}
/**
* 新增
* @param bo 对象
* @return true:成功 false:失败
*/
@SaCheckPermission("system:notice:insert")
@PostMapping
public R<Boolean> insert(@RequestBody @Validated(ValidatedGroupConfig.insert.class) SysNoticeBo bo) {
return success(baseService.insert(bo));
}
/**
* 删除
* @param ids ID
* @return true:成功 false:失败
*/
@SaCheckPermission("system:notice:delete")
@DeleteMapping("/{ids}")
public R<Boolean> delete(@PathVariable String ids) {
return success(baseService.deleteById(ids));
}
/**
* 模版下载
*/
@SaCheckPermission("system:notice:import")
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) throws IOException {
ExcelUtil.download(response, SysNoticeExport.class, "系统公告");
}
/**
* 导入系统用户
* @param file 模版文件
*/
@MssSafety
@Transactional
@SaCheckPermission("system:notice:import")
@PostMapping("/import")
public R<Boolean> imports(@RequestParam("file") MultipartFile file) throws Exception {
Set<SysNoticeExport> list= ExcelUtil.imports(file, SysNoticeExport.class);
Boolean state= baseService.imports(list);
return R.ok(state,state?"数据导入成功!":"数据导入失败!");
}
/**
* 导出系统用户
*/
@MssSafety
@Transactional
@SaCheckPermission("system:notice:export")
@PostMapping("/export")
public void export(@RequestBody @Validated(ValidatedGroupConfig.query.class) SysNoticeBo bo,HttpServletResponse response) throws IOException {
List<SysNoticeVo> list= baseService.selectListVoPage(bo, bo.getPageQuery()).getRows();
List<SysNoticeExport> data= MapstructUtil.convert(list,SysNoticeExport.class);
ExcelUtil.export(response, SysNoticeExport.class, "系统公告",data);
}
/**
* 打印系统用户
*/
@MssSafety
@Transactional
@SaCheckPermission("system:notice:print")
@PostMapping("/print")
public R<PrintObject<SysNoticeExport>> print(@RequestBody @Validated(ValidatedGroupConfig.query.class) SysNoticeBo bo) throws Exception {
List<SysNoticeVo> list= baseService.selectListVoPage(bo, bo.getPageQuery()).getRows();
List<SysNoticeExport> data= MapstructUtil.convert(list,SysNoticeExport.class);
PrintObject<SysNoticeExport> printObject= new PrintObject<SysNoticeExport>()
.setTitle("系统公告")
.setData(data);
return R.response(Boolean.TRUE,printObject);
}
}

View File

@ -0,0 +1,163 @@
package com.sxpcwlkj.system.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import com.sxpcwlkj.common.annotation.MssSafety;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.utils.R;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import com.sxpcwlkj.oss.service.OssService;
import com.sxpcwlkj.system.entity.bo.SysOssBo;
import com.sxpcwlkj.system.entity.bo.SysOssConfigBo;
import com.sxpcwlkj.system.entity.vo.SysOssConfigVo;
import com.sxpcwlkj.system.entity.vo.SysOssVo;
import com.sxpcwlkj.system.service.SysOssConfigService;
import com.sxpcwlkj.system.service.SysOssService;
import lombok.RequiredArgsConstructor;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.FileStorageService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
/**
* 对象存储
* @author xijue
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@RequestMapping("system/oss")
@RestController
@RequiredArgsConstructor
public class SysOssController extends BaseController {
private final SysOssService baseService;
private final FileStorageService fileStorageService;
private final OssService ossService;
private final SysOssConfigService sysOssConfigService;
/**
* 列表
*/
@MssSafety
@SaCheckPermission("system:oss:list")
@PostMapping("/list")
public TableDataInfo<SysOssVo> listPage(@RequestBody @Validated(ValidatedGroupConfig.query.class) SysOssBo bo) {
return baseService.selectPageList(bo, bo.getPageQuery());
}
/**
* 查询
*
* @return
*/
@SaCheckPermission("system:oss:query")
@GetMapping("/{id}")
public R<SysOssVo> queryById(@PathVariable Long id) {
return success(baseService.selectVoById(id));
}
/**
* 编辑
*
* @return
*/
@SaCheckPermission("system:oss:edit")
@PutMapping
public R<Boolean> edit(@Validated @RequestBody SysOssBo bo) {
return success(baseService.updateById(bo));
}
/**
* 新增
*
* @return vo
*/
@SaCheckPermission("system:oss:insert")
@PostMapping
public R<Boolean> insert(MultipartFile file) {
FileInfo fileInfo=ossService.upload(file);
SysOssBo sysOssBo = new SysOssBo();
sysOssBo.setUrl(fileInfo.getUrl());
sysOssBo.setFileName(fileInfo.getFilename());
sysOssBo.setOriginalName(fileInfo.getOriginalFilename());
sysOssBo.setFileSuffix(fileInfo.getExt());
sysOssBo.setPlatform(fileInfo.getPlatform());
sysOssBo.setContentType(fileInfo.getContentType());
sysOssBo.setBasePath(fileInfo.getBasePath());
sysOssBo.setStatus(0);
sysOssBo.setSort(0);
return success(baseService.insert(sysOssBo));
}
/**
* 删除
*
* @return vo
*/
@SaCheckPermission("system:oss:delete")
@DeleteMapping("/{id}")
public R<Boolean> delete(@PathVariable Long id) {
SysOssVo vo = baseService.selectVoById(id);
if (vo != null) {
boolean delete = fileStorageService.delete(vo.getUrl());
if (!delete) {
return R.fail("桶删除失败");
}
}
return success(baseService.deleteById(id));
}
/**
* 获取OSS配置的默认启用项
* @return 配置项明细
*/
@SaCheckRole("super_admin")
@GetMapping("/config/queryDef")
public R<String> queryDef() {
return success("success",sysOssConfigService.queryDef());
}
/**
* 获取OSS配置详情
* @param key 配置项key
* @return 配置项明细
*/
@SaCheckRole("super_admin")
@GetMapping("/config/{key}")
public R<SysOssConfigVo> queryByKey(@PathVariable String key) {
return success(sysOssConfigService.selectVoByKey(key));
}
/**
* 编辑配置
* @param bo 配置对象
* @return 编辑结果
*/
@SaCheckRole("super_admin")
@PutMapping("/config/edit")
public R<Boolean> edit(@Validated @RequestBody SysOssConfigBo bo) {
return success(sysOssConfigService.updateByIdXml(bo));
}
/**
* 上传文件
*/
@SaCheckLogin
@PostMapping("/elUpload")
public R<FileInfo> elUpload(MultipartFile file) {
return R.success(ossService.upload(file));
}
/**
* 上传文件
*/
@SaCheckLogin
@PostMapping("/wangEditor")
public R<FileInfo> wangEditor(MultipartFile file) {
return R.success(ossService.upload(file));
}
}

View File

@ -0,0 +1,87 @@
package com.sxpcwlkj.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.sxpcwlkj.common.annotation.MssSafety;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.utils.R;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import com.sxpcwlkj.system.entity.bo.SysRoleBo;
import com.sxpcwlkj.system.entity.vo.SysRoleVo;
import com.sxpcwlkj.system.service.SysRoleService;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 系统角色
* @author xijue
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@RequestMapping("system/role")
@RestController
@RequiredArgsConstructor
public class SysRoleController extends BaseController {
private final SysRoleService baseService;
/**
* 获取列表
*/
@MssSafety
@SaCheckPermission("system:role:list")
@PostMapping("/list")
public TableDataInfo<SysRoleVo> listPage(@RequestBody @Validated(ValidatedGroupConfig.query.class) SysRoleBo bo) {
return baseService.selectPageUserList(bo, bo.getPageQuery());
}
/**
* 获取详细信息
*/
@SaCheckPermission("system:role:query")
@GetMapping("/{id}")
public R<SysRoleVo> queryById(@PathVariable String id) {
return success(baseService.selectVoById(id));
}
/**
* 编辑
*/
@MssSafety
@Transactional
@SaCheckPermission("system:role:edit")
@PutMapping
public R<Boolean> edit(@Validated @RequestBody SysRoleBo bo) {
return success(baseService.updateById(bo));
}
/**
* 新增
*
* @return vo
*/
@MssSafety
@Transactional
@SaCheckPermission("system:role:insert")
@PostMapping
public R<Boolean> insert(@Validated @RequestBody SysRoleBo bo) {
return success(baseService.insert(bo));
}
/**
* 删除
*
* @return vo
*/
@MssSafety
@Transactional
@SaCheckPermission("system:role:delete")
@DeleteMapping("/{ids}")
public R<Boolean> delete(@PathVariable String ids) {
return success(baseService.deleteById(ids));
}
}

View File

@ -0,0 +1,331 @@
package com.sxpcwlkj.system.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaIgnore;
import com.sxpcwlkj.authority.LoginObject;
import com.sxpcwlkj.common.annotation.MssSafety;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.code.entity.PrintObject;
import com.sxpcwlkj.common.code.entity.WxCodeBo;
import com.sxpcwlkj.common.enums.WxCodeStatusEnum;
import com.sxpcwlkj.common.utils.MapstructUtil;
import com.sxpcwlkj.common.utils.R;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import com.sxpcwlkj.framework.utils.ExcelUtil;
import com.sxpcwlkj.redis.RedisUtil;
import com.sxpcwlkj.system.entity.bo.*;
import com.sxpcwlkj.system.entity.export.SysUserExportVo;
import com.sxpcwlkj.system.entity.vo.SysUserVo;
import com.sxpcwlkj.system.service.SysUserService;
import com.sxpcwlkj.wx.service.WxCodeService;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.*;
/**
* 系统用户
* @author xijue
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("system/user")
public class SysUserController extends BaseController {
private final SysUserService baseService;
private final WxCodeService wxCodeService;
/**
* 获取用户分页列表
*
* @return 用户列表
*/
@MssSafety(decryptRequest = true)
@SaCheckPermission("system:user:list")
@PostMapping("/list")
public TableDataInfo<SysUserVo> listPage(@RequestBody @Validated(ValidatedGroupConfig.query.class) SysUserBo user) {
return baseService.selectPageUserList(user, user.getPageQuery());
}
/**
* 获取用户详细信息
*
* @return PageDataInfo
*/
@SaCheckPermission("system:user:query")
@GetMapping("/{id}")
public R<SysUserVo> queryById(@PathVariable String id) {
return success(baseService.selectVoById(id));
}
/**
* 编辑用户
*
* @return true/false
*/
@MssSafety
@Transactional
@SaCheckPermission("system:user:edit")
@PutMapping
public R<Boolean> edit(@RequestBody @Validated(ValidatedGroupConfig.update.class) SysUserBo bo) {
return success(baseService.updateById(bo));
}
/**
* 新增用户
*
* @return vo
*/
@MssSafety
@Transactional
@SaCheckPermission("system:user:insert")
@PostMapping
public R<Boolean> insert(@RequestBody @Validated(ValidatedGroupConfig.insert.class) SysUserBo bo) {
return success(baseService.insert(bo));
}
/**
* 删除用户
*
* @return vo
*/
@MssSafety
@Transactional
@SaCheckPermission("system:user:delete")
@DeleteMapping("/{ids}")
public R<Boolean> delete(@PathVariable String ids) {
return success(baseService.deleteById(ids));
}
/**
* 模版下载
*/
@SaCheckPermission("system:user:import")
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) throws IOException {
ExcelUtil.download(response, SysUserExportVo.class, "系统用户");
}
/**
* 导入系统用户
* @param file 模版文件
*/
@MssSafety
@Transactional
@SaCheckPermission("system:user:import")
@PostMapping("/import")
public R<Boolean> imports(@RequestParam("file") MultipartFile file) throws Exception {
Set<SysUserExportVo> list= ExcelUtil.imports(file, SysUserExportVo.class);
Boolean state= baseService.imports(list);
return R.ok(state,state?"数据导入成功!":"数据导入失败!");
}
/**
* 导出系统用户
*/
@MssSafety
@Transactional
@SaCheckPermission("system:user:export")
@PostMapping("/export")
public void export(SysUserBo user, PageQuery pageQuery,HttpServletResponse response) throws IOException {
List<SysUserVo> list= baseService.selectPageUserList(user, pageQuery).getRows();
List<SysUserExportVo> data= MapstructUtil.convert(list,SysUserExportVo.class);
ExcelUtil.export(response, SysUserExportVo.class, "系统用户",data);
}
/**
* 打印系统用户
* @param user 查询条件
* @param pageQuery 分页条件
*/
@MssSafety
@Transactional
@SaCheckPermission("system:user:print")
@PostMapping("/print")
public R<PrintObject<SysUserExportVo>> print(SysUserBo user, PageQuery pageQuery) throws Exception {
List<SysUserVo> list= baseService.selectPageUserList(user, pageQuery).getRows();
List<SysUserExportVo> data= MapstructUtil.convert(list,SysUserExportVo.class);
PrintObject<SysUserExportVo> printObject= new PrintObject<SysUserExportVo>()
.setTitle("系统用户")
.setData(data);
return R.response(Boolean.TRUE,printObject);
}
//====================================个人信息=====================================
/**
* 重置密码
*
* @return vo
*/
@SaCheckLogin
@PostMapping("/resetPwd")
public R<Boolean> resetPwd(@Validated @RequestBody(required = false)ResetPwdBo bo) {
return success(baseService.resetPwd(bo));
}
/**
* 重置密码:管理员
*
* @return vo
*/
@SaCheckLogin
@PostMapping("/resetPwdSuper")
public R<Boolean> resetPwdSuper(@Validated @RequestBody ResetPwdSuperBo bo) {
return success(baseService.resetPwdSuper(bo));
}
/**
* 修改头像
*
* @param avatar 图片
* @return true/false
*/
@SaCheckLogin
@GetMapping(value = "/editHeaderImg")
public R<Boolean> editHeaderImg(@Validated @NotBlank(message = "头像不能为空") String avatar) {
return success("修改头像成功",baseService.updateHeaderImgById(avatar));
}
/**
* 设置用户角色
* @param bo bo
* @return true/false
*/
@PostMapping("/setUserRole")
public R<Boolean> setUserRole(@Validated @RequestBody SetUserRoleSuperBo bo) {
return success("设置用户角色成功",baseService.setUserRoleSuper(bo));
}
/**
* 解绑手机号 邮箱 微信
*
* @return vo
*/
@SaCheckLogin
@GetMapping("/unbind")
public R<Boolean> unbind(int type) {
return success(baseService.unbind(type)?"解绑成功":"解绑失败");
}
/**
* 绑定手机号
*
* @return vo
*/
@SaCheckLogin
@PostMapping("/bindingPhone")
public R<Boolean> bindingPhone(@Validated({ValidatedGroupConfig.update.class}) @RequestBody SmsBo bo) {
String keyType = "updatePhone:";
String phone = bo.getPhone();
String key = RedisUtil.PHONE_CODES_KEY + keyType + phone;
Object code = RedisUtil.getCacheObject(key);
if (code == null) {
return R.fail("验证码已过期!");
}
if (!bo.getCode().equals(code)) {
return R.fail("验证码不正确!");
}
RedisUtil.deleteObject(key);
return success(baseService.bindingPhone(phone)? "绑定手机号成功":"绑定手机号失败");
}
/**
* 绑定邮件
*
* @return vo
*/
@SaCheckLogin
@PostMapping("/bindingEmail")
public R<Boolean> bindingEmail(@Validated({ValidatedGroupConfig.update.class}) @RequestBody EmailBo bo) {
String keyType = "updatePhone:";
String email = bo.getEmail();
String key = RedisUtil.EMAIL_CODES_KEY + keyType + email;
Object code = RedisUtil.getCacheObject(key);
if (code == null) {
return R.fail("验证码已过期!");
}
if (!bo.getCode().equals(code)) {
return R.fail("验证码不正确!");
}
RedisUtil.deleteObject(key);
return success(baseService.bindingEmail(email)? "绑定邮箱成功":"绑定邮箱失败");
}
@SaCheckLogin
@GetMapping("/getWxCode")
public R<String> getWxCode(String uuid) {
if(uuid==null){
return R.fail("uuid不能为空");
}
//获取微信绑定的二维码
String codeUrl= wxCodeService.getCode(new WxCodeBo(uuid)
.typeBinding()
.expireTime(1000*60)
.paramData(LoginObject.getLoginId()));
return success("二维码获取成功",codeUrl);
}
/**
* 查询二维码状态
* @param uuid 二维码key
* @return
*/
@SaIgnore
@GetMapping("/queryWxCodeState")
public R<Object> queryWxCodeState(String uuid) {
if(uuid==null){
return R.fail("key不能为空");
}
//登录二维码
WxCodeBo wxCodeBo= wxCodeService.getCodeState(new WxCodeBo(uuid).typeBinding());
if(Objects.equals(wxCodeBo.getState(), WxCodeStatusEnum.WAITING.getValue())){
return fail("等待扫码中...");
}
if(Objects.equals(wxCodeBo.getState(), WxCodeStatusEnum.SCANNED.getValue())){
return okFail("二维码已被扫!");
}
if(Objects.equals(wxCodeBo.getState(), WxCodeStatusEnum.FAILING.getValue())){
return okFail("扫码失败!");
}
if(Objects.equals(wxCodeBo.getState(), WxCodeStatusEnum.SUCCEED.getValue())){
log.info(wxCodeBo.getOpenId());
SysUserVo sysUserVo= baseService.selectOpenId(wxCodeBo.getOpenId());
if(sysUserVo!=null){
return okFail("该微信已绑定账号!");
}
return success(baseService.bindingOpenId(wxCodeBo.getOpenId())?"绑定微信成功":"绑定微信失败");
}
return R.fail("系统异常!");
}
/**
* 获取最新登录对象信息
* @return 登录对象
*/
@SaCheckLogin
@GetMapping("/getUserInfo")
public R<Map<String, Object>> getUserInfo(){
SysUserVo sysUser = baseService.getUserRoleAnfFunctionInfo(LoginObject.getLoginId());
return R.success(baseService.getUserInfo(sysUser));
}
}

View File

@ -0,0 +1,39 @@
package com.sxpcwlkj.system.entity;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* 后端菜单
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
public class AdminMenuTree {
// ID
private String id;
// 路由路径
private String path;
// 路由名称
private String name;
// 组件路径
private String component;
// 组件路径别名
private String componentAlias;
// 路由重定向有子集 children
private String redirect;
// 菜单排序
//private Integer menuSort;
// 是否外链
//private Boolean isLink;
// 菜单类型为按钮时权限标识
//private String btnPower;
private Map<String,Object> meta;
private List<AdminMenuTree> children;
}

View File

@ -0,0 +1,59 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 系统配置
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper=false)
@Data
@TableName("sys_config")
public class SysConfig extends BaseEntity {
/**
* 主键ID
*/
@TableId
private String id;
/**
* 配置名称
*/
private String configName;
/**
* 配置键
*/
private String configKey;
/**
* 配置类型
*/
private Integer configType;
/**
* 配置值
*/
private String configValue;
/**
* 配置值
*/
@TableField(exist = false)
private List<String> configValues;
/**
* 配置类型
*/
@TableField(exist = false)
private String valueType;
/**
* 序号
*/
@TableField(exist = false)
private Integer index;
}

View File

@ -0,0 +1,51 @@
package com.sxpcwlkj.system.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.baomidou.mybatisplus.annotation.*;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import java.util.Date;
/**
* 系统部门
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Data
@TableName("sys_dept")
@EqualsAndHashCode(callSuper = true)
public class SysDept extends BaseEntity {
/**
* 部门编号
*/
@TableId
private String deptId;
/**
* 父级编号
*/
private String parentId;
/**
* 部门名称
*/
private String deptName;
/**
* 负责人
*/
private String leader;
/**
* 联系方式
*/
private String phone;
/**
* 邮箱
*/
private String email;
/**
* 详细地址
*/
private String address;
}

View File

@ -0,0 +1,41 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 系统字典
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("sys_dict")
public class SysDict extends BaseEntity {
/**
* 字典主键
*/
@TableId(value = "id")
private String id;
/**
* 字典名称
*/
private String name;
/**
* 字典名称
*/
private String fieldName;
/**
* 字典类型
*/
private String type;
}

View File

@ -0,0 +1,34 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 系统字典数据
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("sys_dict_data")
public class SysDictData extends BaseEntity {
@TableId(value = "id")
private String id;
private String label;
private String fieldName;
private String value;
private String dictType;
private String colorType;
}

View File

@ -0,0 +1,97 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 系统功能资源
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("sys_function")
public class SysFunction extends BaseEntity {
/**
* 菜单ID
*/
@TableId(value = "id")
private String id;
/**
* 菜单名称
*/
private String name;
/**
* i18n编码
*/
private String languageCode;
/**
* 权限标识
*/
private String permission;
/**
* 菜单类型
*/
private Integer type;
/**
* 显示顺序
*/
private Integer sort;
/**
* 父菜单ID
*/
private Long parentId;
/**
* 路由地址
*/
private String path;
/**
* 菜单图标
*/
private String icon;
/**
* 组件路径
*/
private String component;
/**
* 组件名
*/
private String componentName;
/**
* 状态;0正常 1停用
*/
private Integer status;
/**
* 是否可见
*/
private Integer visible;
/**
* 是否缓存
*/
private Integer keepAlive;
/**
* 链接地址
*/
private String isLink;
/**
* 是否外链
*/
private Integer isOpenLink;
/**
* 是否内嵌 true
* 外链path=内嵌url
*/
private Integer isIframe;
/**
* 是否总是显示
*/
private Integer alwaysShow;
}

View File

@ -0,0 +1,41 @@
package com.sxpcwlkj.system.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.baomidou.mybatisplus.annotation.*;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import java.util.Date;
/**
* 系统公告
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Data
@TableName("sys_notice")
@EqualsAndHashCode(callSuper = true)
public class SysNotice extends BaseEntity {
/**
* 公告ID
*/
@TableId
private String id;
/**
* 公告标题
*/
private String title;
/**
* 公告内容
*/
private String content;
/**
* 公告类型
*/
private Integer type;
}

View File

@ -0,0 +1,50 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 对象存储
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("sys_oss")
public class SysOss extends BaseEntity {
@TableId(value = "oss_id")
private String ossId;
/**
* 文件名
*/
private String fileName;
/**
* 原名
*/
private String originalName;
/**
* 文件后缀名
*/
private String fileSuffix;
/**
* URL地址
*/
private String url;
/**
* MIME 类型
*/
private String contentType;
/**
* 基础存储路径
*/
private String basePath;
/**
* 存储平台
*/
private String platform;
}

View File

@ -0,0 +1,67 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 对象存储配置表
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper=false)
@Data
@TableName("sys_oss_config")
public class SysOssConfig extends BaseEntity {
/**
* 主建
*/
@TableId
private Long id;
/**
* 配置key
*/
private String configKey;
/**
* accessKey
*/
private String accessKey;
/**
* 秘钥
*/
private String secretKey;
/**
* 桶名称
*/
private String bucketName;
/**
* 前缀
*/
private String prefix;
/**
* 访问站点
*/
private String endpoint;
/**
* 自定义域名
*/
private String domain;
/**
* 是否https
*/
private String isHttps;
/**
*
*/
private String region;
/**
* 桶权限类型
*/
private String accessPolicy;
/**
* 扩展字段
*/
private String ext1;
}

View File

@ -0,0 +1,49 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 系统岗位
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("sys_dept")
public class SysPost extends BaseEntity {
/**
* 岗位ID
*/
@TableId(value = "id")
private String id;
/**
* 岗位编码
*/
private String code;
/**
* 岗位名称
*/
private String name;
/**
* 显示顺序
*/
private Integer sort;
/**
* 状态;0正常 1停用
*/
private Integer status;
}

View File

@ -0,0 +1,42 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 系统角色
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("sys_role")
public class SysRole extends BaseEntity {
/**
* 角色ID
*/
@TableId(value = "id")
private String id;
/**
* 角色名称
*/
private String name;
/**
* 角色权限字符串
*/
private String code;
/**
* 级别
*/
private Integer level;
}

View File

@ -0,0 +1,36 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 系统角色功能
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_role_function")
public class SysRoleFunction extends BaseEntity {
/**
* 主键编码
*/
@TableId(value = "id")
private String id;
/**
* 角色ID
*/
private String roleId;
/**
* 功能ID
*/
private String functionId;
}

View File

@ -0,0 +1,121 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 系统租户
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@NoArgsConstructor
@TableName("sys_tenant")
public class SysTenant{
/**
* 租户编号
*/
@TableId(value = "tenant_id")
private String tenantId;
/**
* 租户名
*/
private String name;
/**
* 联系人的用户编号
*/
private String contactUserId;
/**
* 联系人
*/
private String contactName;
/**
* 联系手机
*/
private String contactMobile;
/**
* 租户状态;0正常 1停用
*/
private Integer status;
/**
* 绑定域名
*/
private String domain;
/**
* 租户套餐编号
*/
private String packageId;
/**
* 过期时间
*/
private Date expireTime;
/**
* 账号数量
*/
private Integer accountCount;
/**
* 备注
*/
@TableField(fill = FieldFill.INSERT)
private String remark;
/**
* 乐观锁
*/
@TableField(fill = FieldFill.INSERT)
private String revision;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String createdBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createdTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updatedBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updatedTime;
/**
* 搜索值
*/
@JsonIgnore
@TableField(exist = false)
private String searchValue;
/**
* 请求参数
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
}

View File

@ -0,0 +1,41 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 系统租户套餐
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("sys_tenant_package")
public class SysTenantPackage extends BaseEntity {
/**
* 套餐编号
*/
@TableId(value = "id")
private String id;
/**
* 套餐名
*/
private String name;
/**
* 租户状态;0正常 1停用
*/
private Integer status;
/**
* 关联的菜单编号
*/
private String functionIds;
}

View File

@ -0,0 +1,126 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* 系统用户
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("sys_user")
public class SysUser extends BaseEntity {
/**
* 主键ID
*/
@TableId(value = "user_id")
private String userId;
/**
* 部门ID
*/
private String deptId;
/**
* 部门名称
*/
@TableField(exist = false)
private String department;
/**
* 岗位编号数组
*/
private String postIds;
/**
* 用户账号
*/
private String userName;
/**
* 用户昵称
*/
private String nickName;
/**
* 用户类型
*/
private String userType;
/**
* 邮箱
*/
private String email;
/**
* 手机号
*/
private String phoneNumber;
/**
* 微信id
*/
private String wxOpenid;
/**
* 微信开发者id
*/
private String wxUnOpenId;
/**
* 性别;0保密 1男2
*/
private Integer sex;
/**
* 头像
*/
private String avatar;
/**
* 密码
*/
@TableField(
insertStrategy = FieldStrategy.NOT_EMPTY,
updateStrategy = FieldStrategy.NOT_EMPTY,
whereStrategy = FieldStrategy.NOT_EMPTY
)
private String password;
/**
* 密码强度
*/
private String passwordStrength;
/**
* 状态;0正常 1停用
*/
private Integer status;
/**
* 删除标志;0代表存在 2代表删除
*/
private Integer delFlag;
/**
* 最后登录ip
*/
private String loginIp;
/**
* 最后登录时间
*/
private Date loginDate;
/**
* 对称性秘钥
*/
@TableField("aes_key")
private String aesKey;
/**
* 角色编码
*/
@TableField(exist = false)
private String[] roleCodes;
/**
* 角色id
*/
@TableField(exist = false)
private String roleName;
}

View File

@ -0,0 +1,37 @@
package com.sxpcwlkj.system.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 系统用户角色
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("sys_user_role")
public class SysUserRole extends BaseEntity {
/**
* 主键编码
*/
@TableId(value = "id")
private String id;
/**
* 用户ID
*/
private String userId;
/**
* 角色ID
*/
private String roleId;
}

View File

@ -0,0 +1,27 @@
package com.sxpcwlkj.system.entity.bo;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
* 发生邮件bo
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
public class EmailBo {
@NotBlank(message = "邮箱不能为空",groups = {ValidatedGroupConfig.query.class,ValidatedGroupConfig.del.class})
private String email;
/**
* 1:注册 2:登录 3:修改密码 4:支付密码 5:更换手机号
*/
@NotBlank(message = "类型不能为空",groups = {ValidatedGroupConfig.insert.class})
private Integer type;
@NotBlank(message = "验证码不能为空",groups = {ValidatedGroupConfig.update.class})
private String code;
}

View File

@ -0,0 +1,52 @@
package com.sxpcwlkj.system.entity.bo;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 登录bo
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
public class LoginBodyBo {
/**
* 用户名
*/
@NotBlank(message = "账号不能为空")
@Size(min = 3, max = 16, message = "账号长度在{min}到{max}个字符")
private String username;
/**
* 用户密码
*/
@NotBlank(message = "密码不能为空")
@Size(min = 6, max = 32, message = "密码长度在{min}到{max}个字符")
private String password;
/**
* 验证码
*/
private String code;
/**
* 验证码Key
*/
private String codeKey;
/**
* uuid
*/
private String uuid;
/**
* 租户ID(改为租户由后端控制)
*/
private String tenantId;
/**
* 记住我
*/
private Boolean rememberMe=true;
}

View File

@ -0,0 +1,23 @@
package com.sxpcwlkj.system.entity.bo;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 重置密码bo
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
public class ResetPwdBo {
@NotBlank(message = "旧密码不能为空")
@Size(min = 4, max = 16, message = "旧密码长度在{min}到{max}个字符")
private String oldPassword;
@NotBlank(message = "新密码不能为空")
@Size(min = 4, max = 16, message = "新密码长度在{min}到{max}个字符")
private String password;
}

View File

@ -0,0 +1,22 @@
package com.sxpcwlkj.system.entity.bo;
import lombok.Data;
import org.apache.logging.log4j.core.config.plugins.validation.constraints.NotBlank;
import org.hibernate.validator.constraints.Length;
/**
* 重置用户密码bo
*
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
public class ResetPwdSuperBo {
@NotBlank(message = "用户ID不能为空")
private String userId;
@NotBlank(message = "新密码不能为空")
@Length(min = 6, max = 16, message = "新密码长度在{min}到{max}个字符")
private String password;
}

View File

@ -0,0 +1,22 @@
package com.sxpcwlkj.system.entity.bo;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import org.apache.logging.log4j.core.config.plugins.validation.constraints.NotBlank;
import java.util.List;
/**
* 管理员重置用户密码
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
public class SetUserRoleSuperBo {
@NotBlank(message = "用户ID不能为空")
private String userId;
@NotEmpty(message = "角色至少选择一个")
private List<String> roleCodes;
}

View File

@ -0,0 +1,28 @@
package com.sxpcwlkj.system.entity.bo;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 发生短信bo
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
public class SmsBo {
@NotBlank(message = "手机号不能为空",groups = {ValidatedGroupConfig.query.class,ValidatedGroupConfig.del.class})
private String phone;
/**
* 1:绑定邮箱
*/
@NotBlank(message = "类型不能为空",groups = {ValidatedGroupConfig.insert.class})
private Integer type;
@NotBlank(message = "验证码不能为空",groups = {ValidatedGroupConfig.update.class})
private String code;
}

View File

@ -0,0 +1,55 @@
package com.sxpcwlkj.system.entity.bo;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import com.sxpcwlkj.system.entity.SysConfig;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 系统配置bo
*
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper = false)
@Data
@AutoMapper(target = SysConfig.class)
public class SysConfigBo extends BaseEntity {
/**
* 主键ID
*/
private String id;
/**
* 配置名称
*/
private String configName;
/**
* 配置键
*/
private String configKey;
/**
* 配置类型
*/
private Integer configType;
/**
* 配置值
*/
private String configValue;
/**
* 配置值
*/
private List<String> configValues;
/**
* 配置值类型
*/
private String valueType;
/**
* 序号
*/
private Integer index;
}

View File

@ -0,0 +1,72 @@
package com.sxpcwlkj.system.entity.bo;
import java.io.Serial;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import io.github.linpeilie.annotations.AutoMapper;
import com.sxpcwlkj.system.entity.SysDept;
import java.util.Date;
import com.sxpcwlkj.datasource.entity.BaseEntity;
/**
* 系统部门Bo
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Data
@AutoMapper(target = SysDept.class, reverseConvertGenerate = false)
@EqualsAndHashCode(callSuper=false)
public class SysDeptBo extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 部门编号
*/
@NotBlank(message = "部门编号不能为空",groups = {ValidatedGroupConfig.update.class})
private String deptId;
/**
* 父级编号
*/
@NotBlank(message = "父级编号不能为空",groups = {ValidatedGroupConfig.insert.class,ValidatedGroupConfig.update.class})
private String parentId;
/**
* 部门名称
*/
@NotBlank(message = "部门名称不能为空",groups = {ValidatedGroupConfig.insert.class,ValidatedGroupConfig.update.class})
private String deptName;
/**
* 负责人
*/
@NotBlank(message = "负责人不能为空",groups = {ValidatedGroupConfig.insert.class,ValidatedGroupConfig.update.class})
private String leader;
/**
* 联系方式
*/
@NotBlank(message = "联系方式不能为空",groups = {ValidatedGroupConfig.insert.class,ValidatedGroupConfig.update.class})
@Pattern(regexp = "^1[3456789]\\d{9}$",message = "手机号格式不正确",groups = {ValidatedGroupConfig.insert.class,ValidatedGroupConfig.update.class})
private String phone;
/**
* 邮箱
*/
@NotBlank(message = "邮箱不能为空",groups = {ValidatedGroupConfig.insert.class,ValidatedGroupConfig.update.class})
@Email(message = "邮箱格式不正确",groups = {ValidatedGroupConfig.insert.class,ValidatedGroupConfig.update.class})
private String email;
/**
* 详细地址
*/
@NotBlank(message = "详细地址不能为空")
private String address;
}

View File

@ -0,0 +1,37 @@
package com.sxpcwlkj.system.entity.bo;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import com.sxpcwlkj.system.entity.SysDict;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 系统字典bo
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AutoMapper(target = SysDict.class)
public class SysDictBo extends BaseEntity {
private String id;
/**
* 字典名称
*/
private String name;
/**
* 字典名称
*/
private String fieldName;
/**
* 字典类型
*/
private Integer type;
private List<SysDictDataBo> list;
}

View File

@ -0,0 +1,32 @@
package com.sxpcwlkj.system.entity.bo;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import com.sxpcwlkj.system.entity.SysDictData;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 系统字典数据
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AutoMapper(target = SysDictData.class)
public class SysDictDataBo extends BaseEntity {
private String id;
private String label;
private String fieldName;
private String value;
private String dictType;
private String colorType;
}

View File

@ -0,0 +1,102 @@
package com.sxpcwlkj.system.entity.bo;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import com.sxpcwlkj.system.entity.SysFunction;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 系统资源bo
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AutoMapper(target = SysFunction.class)
public class SysFunctionBo extends BaseEntity {
/**
* 菜单ID
* */
@NotBlank(message = "主键ID不能为空",groups = {ValidatedGroupConfig.update.class})
private String id;
/**
* 父菜单ID
*/
@NotBlank(message = "主键ID不能为空",groups = {ValidatedGroupConfig.insert.class,ValidatedGroupConfig.update.class})
private String parentId;
/**
* 菜单名称
*/
@NotBlank(message = "主键ID不能为空",groups = {ValidatedGroupConfig.insert.class,ValidatedGroupConfig.update.class})
private String name;
/**
* i18n编码
*/
private String languageCode;
/**
* 权限标识
*/
private String permission;
/**
* 菜单类型
*/
@NotBlank(message = "菜单类型不能为空",groups = {ValidatedGroupConfig.insert.class,ValidatedGroupConfig.update.class})
private Integer type;
/**
* 显示顺序
*/
@Min(message = "显示顺序小于1",value = 1 ,groups = {ValidatedGroupConfig.insert.class,ValidatedGroupConfig.update.class})
private Integer sort;
/**
* 路由地址
*/
private String path;
/**
* 菜单图标
*/
private String icon;
/**
* 组件路径
*/
private String component;
/**
* 组件名
*/
private String componentName;
/**
* 状态;0正常 1停用
*/
private Integer status;
/**
* 是否可见
*/
private Integer visible;
/**
* 是否缓存
*/
private Integer keepAlive;
/**
* 链接地址
*/
private String isLink;
/**
* 是否外链
*/
private Integer isOpenLink;
/**
* 是否内嵌 true
* 外链path=内嵌url
*/
private Integer isIframe;
/**
* 是否总是显示
*/
private Integer alwaysShow;
private Integer level=0;
}

View File

@ -0,0 +1,50 @@
package com.sxpcwlkj.system.entity.bo;
import java.io.Serial;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import io.github.linpeilie.annotations.AutoMapper;
import com.sxpcwlkj.system.entity.SysNotice;
import java.util.Date;
import com.sxpcwlkj.datasource.entity.BaseEntity;
/**
* 系统公告Bo
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Data
@AutoMapper(target = SysNotice.class, reverseConvertGenerate = false)
@EqualsAndHashCode(callSuper=false)
public class SysNoticeBo extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 公告ID
*/
@NotBlank(message = "公告ID不能为空")
private String id;
/**
* 公告标题
*/
@NotBlank(message = "公告标题不能为空")
private String title;
/**
* 公告内容
*/
@NotBlank(message = "公告内容不能为空")
private String content;
/**
* 公告类型
*/
@NotNull(message = "公告类型不能为空")
private Integer type;
}

View File

@ -0,0 +1,53 @@
package com.sxpcwlkj.system.entity.bo;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import com.sxpcwlkj.system.entity.SysOss;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 对象存储bo
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AutoMapper(target = SysOss.class)
public class SysOssBo extends BaseEntity {
private String ossId;
/**
* 文件名
*/
private String fileName;
/**
* 原名
*/
private String originalName;
/**
* 文件后缀名
*/
private String fileSuffix;
/**
* URL地址
*/
private String url;
/**
* MIME 类型
*/
private String contentType;
/**
* 基础存储路径
*/
private String basePath;
/**
* 存储平台
*/
private String platform;
private Boolean lookImg;
}

View File

@ -0,0 +1,97 @@
package com.sxpcwlkj.system.entity.bo;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import com.sxpcwlkj.system.entity.SysOssConfig;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 对象存储配置表bo
*
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper = false)
@Data
@AutoMapper(target = SysOssConfig.class)
public class SysOssConfigBo extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主建
*/
private Long id;
/**
* 配置key
*/
@NotBlank(message = "配置key不能为空")
private String configKey;
/**
* accessKey
*/
@NotBlank(message = "accessKey不能为空")
private String accessKey;
/**
* 秘钥
*/
@NotBlank(message = "秘钥不能为空")
private String secretKey;
/**
* 桶名称
*/
@NotBlank(message = "桶名称不能为空")
private String bucketName;
/**
* 前缀
*/
private String prefix;
/**
* 访问站点
*/
private String endpoint;
/**
* 自定义域名
*/
@NotBlank(message = "自定义域名不能为空")
private String domain;
/**
* 是否https
*/
private String isHttps;
/**
*
*/
private String region;
/**
* 桶权限类型
*/
private String accessPolicy;
/**
* 扩展字段
*/
private String ext1;
private Integer status;
}

View File

@ -0,0 +1,53 @@
package com.sxpcwlkj.system.entity.bo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import com.sxpcwlkj.system.entity.SysRole;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.Length;
/**
* 系统角色
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AutoMapper(target = SysRole.class)
public class SysRoleBo extends BaseEntity {
/**
* 角色ID
*/
@TableId(value = "id")
private String id;
/**
* 级别
*/
@Min(message = "级别不能小于1",value = 1)
private Integer level;
/**
* 角色名称
*/
@NotBlank(message = "角色名称不能为空")
@Length(message = "角色名称长度控制在{min}~{max}之间",min = 2, max = 20)
private String name;
/**
* 角色权限字符串
*/
@NotBlank(message = "角色权限字符串不能为空")
@Length(message = "角色权限字符串长度控制在{min}~{max}之间",min = 4, max = 20)
private String code;
/**
* 默认选中的节点
*/
@NotNull(message = "权限节点不能为空")
private String[] defChecked;
}

View File

@ -0,0 +1,149 @@
package com.sxpcwlkj.system.entity.bo;
import com.sxpcwlkj.datasource.entity.BaseEntity;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import com.sxpcwlkj.system.entity.SysUser;
import com.sxpcwlkj.system.entity.vo.SysRoleVo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.Length;
import java.util.Date;
import java.util.List;
/**
* 系统用户bo
*
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AutoMapper(target = SysUser.class, reverseConvertGenerate = false)
public class SysUserBo extends BaseEntity {
/**
* 主键ID
*/
@NotBlank(message = "主键ID不能为空", groups = {ValidatedGroupConfig.update.class})
private String userId;
/**
* 部门ID
*/
private String deptId;
@NotEmpty(message = "部门不能为空", groups = {ValidatedGroupConfig.insert.class, ValidatedGroupConfig.update.class})
private String[] deptIds;
/**
* 部门名称
*/
private String department;
/**
* 岗位编号数组
*/
private String postIds;
/**
* 用户账号
*/
@NotBlank(message = "账号不能为空", groups = {ValidatedGroupConfig.insert.class, ValidatedGroupConfig.update.class})
@Size(min = 4, max = 20, message = "账号长度在5到20之间", groups = {ValidatedGroupConfig.insert.class, ValidatedGroupConfig.update.class})
private String userName;
/**
* 用户昵称
*/
@NotBlank(message = "账号昵称不能为空", groups = {ValidatedGroupConfig.insert.class, ValidatedGroupConfig.update.class})
@Size(min = 2, max = 20, message = "账号昵称长度在2到20之间", groups = {ValidatedGroupConfig.insert.class, ValidatedGroupConfig.update.class})
private String nickName;
/**
* 用户类型
*/
@NotBlank(message = "账号类型不能为空", groups = {ValidatedGroupConfig.insert.class, ValidatedGroupConfig.update.class})
private String userType;
/**
* 邮箱
*/
@NotBlank(message = "邮箱不能为空", groups = {ValidatedGroupConfig.insert.class, ValidatedGroupConfig.update.class})
@Email(message = "请正确填写邮箱", groups = {ValidatedGroupConfig.insert.class, ValidatedGroupConfig.update.class})
private String email;
/**
* 手机号
*/
@Length(min = 11, max = 11, message = "手机号格式不正确", groups = {ValidatedGroupConfig.insert.class, ValidatedGroupConfig.update.class})
private String phoneNumber;
/**
* 微信id
*/
private String wxOpenid;
/**
* 微信开发者id
*/
private String wxUnOpenId;
/**
* 性别;0保密 1男2
*/
@NotBlank(message = "性别不能为空", groups = {ValidatedGroupConfig.insert.class, ValidatedGroupConfig.update.class})
private String sex;
/**
* 头像
*/
private String avatar;
/**
* 密码
*/
@NotBlank(message = "密码不能为空", groups = {ValidatedGroupConfig.insert.class})
@Size(min = 6, max = 32, message = "密码长度在{min}-{max}位之间", groups = {ValidatedGroupConfig.insert.class})
private String password;
/**
* 删除标志;0代表存在 2代表删除
*/
private Integer delFlag;
/**
* 最后登录ip
*/
private String loginIp;
/**
* 最后登录时间
*/
private Date loginDate;
/**
* 对称性秘钥
*/
private String aesKey;
/**
* 用户拥有角色
*/
private List<SysRoleVo> roleVoList;
/**
* 用户角色集合
*/
private String[] roleCodes;
/**
* 角色ID
*/
private String roleId;
/**
* 角色id
*/
private String roleName;
}

View File

@ -0,0 +1,62 @@
package com.sxpcwlkj.system.entity.export;
import java.io.Serial;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.github.linpeilie.annotations.AutoMapper;
import com.sxpcwlkj.system.entity.SysDept;
import com.sxpcwlkj.framework.entity.BaseEntityVo;
import com.alibaba.excel.annotation.ExcelProperty;
import java.util.Date;
/**
* 系统部门Export
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Data
@AutoMapper(target = SysDept.class)
@EqualsAndHashCode(callSuper=false)
public class SysDeptExport extends BaseEntityVo{
@Serial
private static final long serialVersionUID = 1L;
/**
* 部门编号
*/
@ExcelProperty("部门编号")
private String deptId;
/**
* 父级编号
*/
@ExcelProperty("父级编号")
private String parentId;
/**
* 部门名称
*/
@ExcelProperty("部门名称")
private String deptName;
/**
* 负责人
*/
@ExcelProperty("负责人")
private String leader;
/**
* 联系方式
*/
@ExcelProperty("联系方式")
private String phone;
/**
* 邮箱
*/
@ExcelProperty("邮箱")
private String email;
/**
* 详细地址
*/
@ExcelProperty("详细地址")
private String address;
}

View File

@ -0,0 +1,47 @@
package com.sxpcwlkj.system.entity.export;
import java.io.Serial;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.github.linpeilie.annotations.AutoMapper;
import com.sxpcwlkj.system.entity.SysNotice;
import com.sxpcwlkj.framework.entity.BaseEntityVo;
import com.alibaba.excel.annotation.ExcelProperty;
import java.util.Date;
/**
* 系统公告Export
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Data
@AutoMapper(target = SysNotice.class)
@EqualsAndHashCode(callSuper=false)
public class SysNoticeExport extends BaseEntityVo{
@Serial
private static final long serialVersionUID = 1L;
/**
* 公告ID
*/
@ExcelProperty("公告ID")
private String id;
/**
* 公告标题
*/
@ExcelProperty("公告标题")
private String title;
/**
* 公告内容
*/
@ExcelProperty("公告内容")
private String content;
/**
* 公告类型
*/
@ExcelProperty("公告类型")
private Integer type;
}

View File

@ -0,0 +1,106 @@
package com.sxpcwlkj.system.entity.export;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.sxpcwlkj.common.annotation.Dict;
import com.sxpcwlkj.common.annotation.PrintColumn;
import com.sxpcwlkj.common.annotation.SensitivityEncrypt;
import com.sxpcwlkj.common.enums.PrintTypeEnum;
import com.sxpcwlkj.common.enums.SensitivityTypeEnum;
import com.sxpcwlkj.framework.entity.BaseEntityVo;
import com.sxpcwlkj.framework.interceptor.DictExcelConverter;
import com.sxpcwlkj.system.entity.vo.SysUserVo;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 用户导出VO
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AutoMapper(target = SysUserVo.class)
public class SysUserExportVo extends BaseEntityVo {
/**
* 主键ID
*/
@ExcelProperty("用户ID")
@PrintColumn(title = "用户ID", type = PrintTypeEnum.TEXT)
private String userId;
/**
* 部门ID
* 忽略这个字段
*/
@ExcelIgnore
private String deptId;
/**
* 部门名称
*/
@ExcelProperty("部门名称")
private String department;
/**
* 用户账号
*/
@ExcelProperty("用户账号")
@PrintColumn(title = "用户账号", type = PrintTypeEnum.TEXT)
private String userName;
/**
* 用户昵称
*/
@ExcelProperty(value = "用户昵称")
@PrintColumn(title = "用户昵称", type = PrintTypeEnum.TEXT)
private String nickName;
/**
* 用户类型
*/
@ExcelProperty("用户类型")
private String userType;
/**
* 邮箱
*/
@ExcelProperty("邮箱")
@PrintColumn(title = "邮箱", type = PrintTypeEnum.TEXT)
private String email;
/**
* 手机号
*/
@ExcelProperty("手机号")
@SensitivityEncrypt(type = SensitivityTypeEnum.PHONE)
@PrintColumn(title = "手机号", type = PrintTypeEnum.TEXT)
private String phoneNumber;
/**
* 性别;0保密 1男2
*/
@ExcelProperty(value = "性别", converter = DictExcelConverter.class)
@Dict(value="SYS_SEX")
@PrintColumn(title = "性别", type = PrintTypeEnum.TEXT)
private String sex;
/**
* 头像
*/
@ExcelProperty("头像")
@PrintColumn(title = "头像", type = PrintTypeEnum.IMAGE, width = "50", height = "50")
private String avatar;
/**
* 最后登录ip
*/
@ExcelProperty("最后登录ip")
private String loginIp;
/**
* 最后登录时间
*/
@ExcelProperty("最后登录时间")
@PrintColumn(title = "最后登录时间", type = PrintTypeEnum.TEXT)
private Date loginDate;
/**
* 状态
*/
@ExcelProperty(value = "状态", converter = DictExcelConverter.class)
@Dict("SYS_STATE")
private Integer status;
}

View File

@ -0,0 +1,56 @@
package com.sxpcwlkj.system.entity.vo;
import com.sxpcwlkj.framework.entity.BaseEntityVo;
import com.sxpcwlkj.system.entity.SysConfig;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 系统配置
*
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper = false)
@Data
@AutoMapper(target = SysConfig.class)
public class SysConfigVo extends BaseEntityVo {
/**
* 主键ID
*/
private String id;
/**
* 配置名称
*/
private String configName;
/**
* 配置键
*/
private String configKey;
/**
* 配置值
*/
private String configValue;
/**
* 配置类型
*/
private Integer configType;
/**
* 配置值
*/
private List<String> configValues;
/**
* 配置值类型
*/
private String valueType;
/**
* 序号
*/
private Integer index;
private Integer status;
}

View File

@ -0,0 +1,66 @@
package com.sxpcwlkj.system.entity.vo;
import java.io.Serial;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.github.linpeilie.annotations.AutoMapper;
import com.sxpcwlkj.system.entity.SysDept;
import com.sxpcwlkj.framework.entity.BaseEntityVo;
import com.alibaba.excel.annotation.ExcelProperty;
import java.util.List;
import java.util.Date;
/**
* 系统部门Vo
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Data
@AutoMapper(target = SysDept.class)
@EqualsAndHashCode(callSuper=false)
public class SysDeptVo extends BaseEntityVo{
@Serial
private static final long serialVersionUID = 1L;
/**
* 部门编号
*/
@ExcelProperty("部门编号")
private String deptId;
/**
* 父级编号
*/
@ExcelProperty("父级编号")
private String parentId;
/**
* 部门名称
*/
@ExcelProperty("部门名称")
private String deptName;
/**
* 负责人
*/
@ExcelProperty("负责人")
private String leader;
/**
* 联系方式
*/
@ExcelProperty("联系方式")
private String phone;
/**
* 邮箱
*/
@ExcelProperty("邮箱")
private String email;
/**
* 详细地址
*/
@ExcelProperty("详细地址")
private String address;
private String[] deptIds;
List<SysDeptVo> children;
}

View File

@ -0,0 +1,33 @@
package com.sxpcwlkj.system.entity.vo;
import com.sxpcwlkj.system.entity.SysDictData;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
/**
* 字典数据
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@AutoMapper(target = SysDictData.class)
public class SysDictDataVo {
private String id;
private String label;
private String fieldName;
private String value;
private String dictType;
private Integer sort;
private String status;
private String colorType;
private String revision;
}

View File

@ -0,0 +1,51 @@
package com.sxpcwlkj.system.entity.vo;
import com.sxpcwlkj.system.entity.SysDict;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* 系统字典
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@AutoMapper(target = SysDict.class)
public class SysDictVo {
private String id;
/**
* 字典名称
*/
private String name;
/**
* 字段名
*/
private String fieldName;
/**
* 字典类型
*/
private Integer type;
/**
* 状态;0正常 1停用
*/
private String status;
/**
* 排序
*/
private Integer sort;
/**
* 备注
*/
private String remark;
private Date createdTime;
private String revision;
/**
* 字典值
*/
private List<SysDictDataVo> list;
}

View File

@ -0,0 +1,101 @@
package com.sxpcwlkj.system.entity.vo;
import com.sxpcwlkj.system.entity.SysFunction;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* 系统资源
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@AutoMapper(target = SysFunction.class)
public class SysFunctionVo {
private String id;
/**
* 父菜单ID
*/
private String parentId;
//上级菜单
private String[] menuSuperior;
/**
* 路由名称
*/
private String name;
/**
* i18n编码
*/
private String languageCode;
/**
* 权限标识
*/
private String permission;
/**
* 菜单类型
*/
private Integer type;
/**
* 显示顺序
*/
private Integer sort;
// 路由重定向有子集 children
private String redirectPath;
/**
* 路由路径
*/
private String path;
/**
* 菜单图标
*/
private String icon;
/**
* 组件路径
*/
private String component;
/**
* 组件名
*/
private String componentName;
/**
* 状态;0正常 1停用
*/
private Integer status;
/**
* 是否可见
*/
private Integer visible;
/**
* 是否缓存
*/
private Integer keepAlive;
/**
* 链接地址
*/
private String isLink;
/**
* 是否外链
*/
private Integer isOpenLink;
/**
* 是否内嵌 true
* isLink
*/
private Integer isIframe;
/**
* 是否总是显示
*/
private Integer alwaysShow;
private String revision;
private Map<String,Object> meta;
private List<SysFunctionVo> children;
}

View File

@ -0,0 +1,49 @@
package com.sxpcwlkj.system.entity.vo;
import java.io.Serial;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.github.linpeilie.annotations.AutoMapper;
import com.sxpcwlkj.system.entity.SysNotice;
import com.sxpcwlkj.framework.entity.BaseEntityVo;
import com.alibaba.excel.annotation.ExcelProperty;
import java.util.List;
import java.util.Date;
/**
* 系统公告Vo
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Data
@AutoMapper(target = SysNotice.class)
@EqualsAndHashCode(callSuper=false)
public class SysNoticeVo extends BaseEntityVo{
@Serial
private static final long serialVersionUID = 1L;
/**
* 公告ID
*/
@ExcelProperty("公告ID")
private String id;
/**
* 公告标题
*/
@ExcelProperty("公告标题")
private String title;
/**
* 公告内容
*/
@ExcelProperty("公告内容")
private String content;
/**
* 公告类型
*/
@ExcelProperty("公告类型")
private Integer type;
}

View File

@ -0,0 +1,72 @@
package com.sxpcwlkj.system.entity.vo;
import com.sxpcwlkj.framework.entity.BaseEntityVo;
import com.sxpcwlkj.system.entity.SysOssConfig;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 对象存储配置表
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper = false)
@Data
@AutoMapper(target = SysOssConfig.class)
public class SysOssConfigVo extends BaseEntityVo {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主建
*/
private Long id;
/**
* 配置key
*/
private String configKey;
/**
* accessKey
*/
private String accessKey;
/**
* 秘钥
*/
private String secretKey;
/**
* 桶名称
*/
private String bucketName;
/**
* 前缀
*/
private String prefix;
/**
* 访问站点
*/
private String endpoint;
/**
* 自定义域名
*/
private String domain;
/**
* 是否https
*/
private String isHttps;
/**
*
*/
private String region;
/**
* 桶权限类型
*/
private String accessPolicy;
/**
* 扩展字段 storagePath
*/
private String ext1;
private Integer status;
}

View File

@ -0,0 +1,65 @@
package com.sxpcwlkj.system.entity.vo;
import com.sxpcwlkj.system.entity.SysOss;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.util.Date;
/**
* 对象存储
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@AutoMapper(target = SysOss.class)
public class SysOssVo {
private String ossId;
/**
* 文件名
*/
private String fileName;
/**
* 原名
*/
private String originalName;
/**
* 文件后缀名
*/
private String fileSuffix;
/**
* URL地址
*/
private String url;
/**
* MIME 类型
*/
private String contentType;
/**
* 基础存储路径
*/
private String basePath;
/**
* 存储平台
*/
private String platform;
private Integer status;
private Date createdTime;
private String base64;
private String width;
private String height;
private String size;
private String revision;
}

View File

@ -0,0 +1,75 @@
package com.sxpcwlkj.system.entity.vo;
import com.sxpcwlkj.system.entity.AdminMenuTree;
import com.sxpcwlkj.system.entity.SysRole;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* 用户角色
*
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@AutoMapper(target = SysRole.class)
public class SysRoleVo {
/**
* 角色ID
*/
private String id;
/**
* 角色名称
*/
private String name;
/**
* 角色权限字符串
*/
private String code;
/**
* 显示顺序
*/
private Long sort;
/**
* 状态;0正常 1停用
*/
private String status;
/**
* 级别
*/
private Integer level;
/**
* 角色拥有的资源
*/
private List<SysFunctionVo> sysFunctionVoList;
/**
* 用户角色资源集合
*/
private String[] permissions;
private Date createdTime;
private String remark;
private String revision;
/**
* 系统资源
*/
private List<AdminMenuTree> functionTree;
/**
* 默认选中的节点
*/
private String[] defChecked;
}

View File

@ -0,0 +1,29 @@
package com.sxpcwlkj.system.entity.vo;
import com.sxpcwlkj.common.properties.MsProperties;
import lombok.Data;
/**
* 系统租户
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
public class SysTenantVo {
/**
* 租户编号
*/
private String tenantId;
/**
* 租户名
*/
private String name;
private MsProperties properties;
private String revision;
}

View File

@ -0,0 +1,32 @@
package com.sxpcwlkj.system.entity.vo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.sxpcwlkj.system.entity.SysUserRole;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
/**
* 用户角色
* @author xijue
* @Doc mmsadmin.cn
*/
@Data
@AutoMapper(target = SysUserRole.class)
public class SysUserRoleVo {
/**
* 主键编码
*/
@TableId(value = "id")
private String id;
/**
* 用户ID
*/
private String userId;
/**
* 角色ID
*/
private String roleId;
private String revision;
}

View File

@ -0,0 +1,145 @@
package com.sxpcwlkj.system.entity.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.sxpcwlkj.common.annotation.Dict;
import com.sxpcwlkj.common.annotation.SensitivityEncrypt;
import com.sxpcwlkj.common.enums.SensitivityTypeEnum;
import com.sxpcwlkj.framework.entity.BaseEntityVo;
import com.sxpcwlkj.system.entity.SysUser;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import java.util.List;
/**
* 系统用户
*
* @author xijue
* @Doc mmsadmin.cn
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AutoMapper(target = SysUser.class)
public class SysUserVo extends BaseEntityVo {
/**
* 主键ID
*/
@ExcelProperty("用户ID")
private String userId;
/**
* 部门ID
*/
private String deptId;
private String[] deptIds;
/**
* 部门名称
*/
@ExcelProperty("部门名称")
private String department;
/**
* 岗位编号数组
*/
private String postIds;
/**
* 用户账号
*/
private String userName;
/**
* 用户昵称
*/
private String nickName;
/**
* 用户类型
*/
private String userType;
/**
* 邮箱
*/
private String email;
/**
* 手机号
*/
@SensitivityEncrypt(type = SensitivityTypeEnum.PHONE)
private String phoneNumber;
/**
* 微信id
*/
private String wxOpenid;
/**
* 微信开发者id
*/
private String wxUnOpenId;
/**
* 性别;0保密 1男2
*/
@Dict("SYS_SEX")
private String sex;
/**
* 头像
*/
private String avatar;
/**
* 密码
*/
private String password;
/**
* 密码强度
*/
private String passwordStrength;
/**
* 删除标志;0代表存在 2代表删除
*/
private Integer delFlag;
/**
* 最后登录ip
*/
private String loginIp;
/**
* 最后登录时间
*/
private Date loginDate;
/**
* 对称性秘钥
*/
private String aesKey;
/**
* 用户拥有角色
*/
private List<SysRoleVo> roleVoList;
/**
* 用户角色集合
*/
private String[] roleCodes;
private String[] butCodes;
/**
* 角色id
*/
private String roleName;
/**
* 用户状态
*/
private Integer status;
}

View File

@ -0,0 +1,21 @@
package com.sxpcwlkj.system.mapper;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.system.entity.SysConfig;
import com.sxpcwlkj.system.entity.vo.SysConfigVo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* 系统配置
*
* @author 西决 942879858@qq.com
* @since 1.0.0 2024-06-10
*/
@Mapper
@Repository
public interface SysConfigMapper extends BaseMapperPlus<SysConfig, SysConfigVo> {
}

View File

@ -0,0 +1,19 @@
package com.sxpcwlkj.system.mapper;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.system.entity.SysDept;
import com.sxpcwlkj.system.entity.vo.SysDeptVo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* 系统部门-Mapper
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Mapper
@Repository
public interface SysDeptMapper extends BaseMapperPlus<SysDept, SysDeptVo> {
}

View File

@ -0,0 +1,24 @@
package com.sxpcwlkj.system.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.system.entity.SysDictData;
import com.sxpcwlkj.system.entity.vo.SysDictDataVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
/**
* @Description TODO
* @Author sxpcwlkj
* @Version v1.0.0
*/
@Mapper
@Repository
public interface SysDictDataMapper extends BaseMapperPlus<SysDictData, SysDictDataVo> {
@InterceptorIgnore(tenantLine = "true")
Page<SysDictDataVo> selectByPage(@Param("page") Page<SysDictData> page, @Param(Constants.WRAPPER) Wrapper<SysDictData> queryWrapper);
}

View File

@ -0,0 +1,24 @@
package com.sxpcwlkj.system.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.system.entity.SysDict;
import com.sxpcwlkj.system.entity.vo.SysDictVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
/**
* @Description TODO
* @Author sxpcwlkj
* @Version v1.0.0
*/
@Mapper
@Repository
public interface SysDictMapper extends BaseMapperPlus<SysDict, SysDictVo> {
@InterceptorIgnore(tenantLine = "true")
Page<SysDictVo> selectByPage(@Param("page") Page<SysDict> page, @Param(Constants.WRAPPER) Wrapper<SysDict> queryWrapper);
}

View File

@ -0,0 +1,26 @@
package com.sxpcwlkj.system.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.system.entity.SysFunction;
import com.sxpcwlkj.system.entity.vo.SysFunctionVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Description 系统资源
* @Author sxpcwlkj
* @Date 2024/1/2 17:37
* @Version v1.0.0
*/
@Mapper
@Repository
public interface SysFunctionMapper extends BaseMapperPlus<SysFunction, SysFunctionVo> {
@InterceptorIgnore(tenantLine = "true")
@Select("SELECT f.* FROM `sys_role_function` rf RIGHT JOIN `sys_function` f ON rf.`function_id`=f.`id` WHERE rf.`role_id`=#{id} and rf.`status`=1 ORDER BY f.`parent_id` ASC , f.`sort` DESC")
List<SysFunction> selectByRoleForIds(@Param("id") String id);
}

View File

@ -0,0 +1,19 @@
package com.sxpcwlkj.system.mapper;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.system.entity.SysNotice;
import com.sxpcwlkj.system.entity.vo.SysNoticeVo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* 系统公告-Mapper
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Mapper
@Repository
public interface SysNoticeMapper extends BaseMapperPlus<SysNotice, SysNoticeVo> {
}

View File

@ -0,0 +1,21 @@
package com.sxpcwlkj.system.mapper;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.system.entity.SysOssConfig;
import com.sxpcwlkj.system.entity.vo.SysOssConfigVo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* 对象存储配置表
*
* @author 西决 942879858@qq.com
* @since 1.0.0 2024-07-07
*/
@Mapper
@Repository
public interface SysOssConfigMapper extends BaseMapperPlus<SysOssConfig, SysOssConfigVo> {
}

View File

@ -0,0 +1,25 @@
package com.sxpcwlkj.system.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.system.entity.SysOss;
import com.sxpcwlkj.system.entity.vo.SysOssVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
/**
* @Description oss
* @Author sxpcwlkj
* @Version v1.0.0
*/
@Mapper
@Repository
public interface SysOssMapper extends BaseMapperPlus<SysOss, SysOssVo> {
@InterceptorIgnore(tenantLine = "true")
Page<SysOssVo> selectByPage(@Param("page") Page<SysOss> page, @Param(Constants.WRAPPER) Wrapper<SysOss> queryWrapper);
}

View File

@ -0,0 +1,27 @@
package com.sxpcwlkj.system.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sxpcwlkj.system.entity.SysFunction;
import com.sxpcwlkj.system.entity.SysRoleFunction;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Description 角色资源
* @Author sxpcwlkj
* @Version v1.0.0
*/
@Mapper
@Repository
public interface SysRoleFunctionMapper extends BaseMapper<SysRoleFunction> {
@InterceptorIgnore(tenantLine = "true")
@Select("SELECT f.* FROM `sys_function` f LEFT JOIN `sys_role_function` o ON f.`id`=o.`function_id` WHERE o.`role_id`=#{roldId} ORDER BY f.`sort` ")
List<SysFunction> selectByRoleId(@Param("roldId") String roldId);
}

View File

@ -0,0 +1,50 @@
package com.sxpcwlkj.system.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.system.entity.SysRole;
import com.sxpcwlkj.system.entity.SysUser;
import com.sxpcwlkj.system.entity.vo.SysRoleVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Description 系统角色
* @Author sxpcwlkj
* @Version v1.0.0
*/
@Mapper
@Repository
public interface SysRoleMapper extends BaseMapperPlus<SysRole,SysRoleVo> {
@InterceptorIgnore(tenantLine = "true")
Page<SysRoleVo> selectPageList(@Param("page") Page<SysUser> page, @Param(Constants.WRAPPER) Wrapper<SysRole> queryWrapper);
/**
* 查询用户的最高的一个角色
* @param userId id
* @return vo
*/
@InterceptorIgnore(tenantLine = "true")
SysRoleVo selectByUserId(@Param("userId") String userId);
/**
* 查询用户所有角色
* @param userId id
* @return vo
*/
@InterceptorIgnore(tenantLine = "true")
List<SysRoleVo> selectByUserIdList(@Param("userId") String userId);
/**
* 根据角色编码查询
* @param roleCode 编码
* @return vo
*/
@InterceptorIgnore(tenantLine = "true")
SysRoleVo selectByCode(@Param("roleCode") String roleCode);
}

View File

@ -0,0 +1,11 @@
package com.sxpcwlkj.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sxpcwlkj.system.entity.SysTenant;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface SysTenantMapper extends BaseMapper<SysTenant> {
}

View File

@ -0,0 +1,30 @@
package com.sxpcwlkj.system.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.system.entity.SysUser;
import com.sxpcwlkj.system.entity.vo.SysUserVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
@InterceptorIgnore(tenantLine = "true")
Page<SysUserVo> selectPageUserList(@Param("page") Page<SysUser> page, @Param(Constants.WRAPPER) Wrapper<SysUser> queryWrapper);
@InterceptorIgnore(tenantLine = "true")
SysUser selectByUserName(@Param("userName") String userName);
@InterceptorIgnore(tenantLine = "true")
SysUser selectByUserPhone(@Param("userPhone") String userPhone);
@InterceptorIgnore(tenantLine = "true")
SysUser selectByUserEmail(@Param("userEmail") String userEmail);
@InterceptorIgnore(tenantLine = "true")
int updateRsa(@Param("tenantId") String tenantId, @Param("userId") String userId, @Param("publicKey") String publicKey,@Param("priverKey") String priverKey);
}

View File

@ -0,0 +1,35 @@
package com.sxpcwlkj.system.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.system.entity.SysRole;
import com.sxpcwlkj.system.entity.SysUserRole;
import com.sxpcwlkj.system.entity.vo.SysUserRoleVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Description 用户角色
* @Author sxpcwlkj
* @Version v1.0.0
*/
@Mapper
@Repository
public interface SysUserRoleMapper extends BaseMapperPlus<SysUserRole, SysUserRoleVo> {
/**
* 用户的角色
*
* @param userId
* @return
*/
@InterceptorIgnore(tenantLine = "true")
@Select("SELECT r.* FROM `sys_user_role` ur LEFT JOIN `sys_role` r ON ur.`role_id`=r.`id` WHERE ur.`user_id`=#{userId} ORDER BY r.`sort` ")
List<SysRole> roleList(@Param("userId") String userId);
}

View File

@ -0,0 +1,54 @@
package com.sxpcwlkj.system.runner;
import com.sxpcwlkj.system.service.SysConfigService;
import com.sxpcwlkj.system.service.SysDictService;
import com.sxpcwlkj.system.service.SysOssConfigService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* @author xijue
* @ClassName SystemRunner
* @description: 项目初始化
* @date 2024年03月29日
* @version: 1.0
*/
@Slf4j
@Component
@RequiredArgsConstructor
@Order(1) // 可以通过@Order注解指定执行顺序数字越小越先执行
public class SystemRunner implements CommandLineRunner {
private final ApplicationContext applicationContext;
private final SysDictService sysDictService;
private final SysOssConfigService sysOssConfigService;
private final SysConfigService sysConfigService;
@Override
public void run(String... args) throws Exception {
// 在这里执行启动时需要执行的操作
log.info("=== 1.字典已初始化:"+sysDictService.initSysDict(null)+"个: ===");
log.info("=== 2.Oss配置已初始化:"+sysOssConfigService.initOss()+ "===");
log.info("=== 3.Base配置已初始化:"+sysConfigService.initBase()+ "===");
log.info("=== 4.Sms配置已初始化:"+sysConfigService.initSms()+ "===");
log.info("=== 5.Email配置已初始化:"+sysConfigService.initEmail()+ "===");
log.info("=== 6.Wx配置已初始化:"+sysConfigService.initWx()+ "===");
applicationContext.publishEvent(new ContextRefreshedEvent(applicationContext));
}
}

View File

@ -0,0 +1,17 @@
package com.sxpcwlkj.system.service;
import java.util.Map;
public interface CaptchaService {
/**
* 获取验证码
* @param type 0注册 1登录
* @param code 对象唯一code
* @return
*/
Map<String, Object> getCaptcha(Integer type, String code);
}

View File

@ -0,0 +1,30 @@
package com.sxpcwlkj.system.service;
import com.sxpcwlkj.framework.sercice.BaseService;
import com.sxpcwlkj.system.entity.SysConfig;
import com.sxpcwlkj.system.entity.bo.SysConfigBo;
import com.sxpcwlkj.system.entity.vo.SysConfigVo;
import java.util.List;
/**
* 系统配置
*
* @author 西决 942879858@qq.com
* @since 1.0.0 2024-06-10
*/
public interface SysConfigService extends BaseService<SysConfig, SysConfigVo, SysConfigBo> {
Boolean updateByCodes(List<SysConfigBo> bos);
List<SysConfigVo> selectByCodes(List<SysConfigBo> bos);
Boolean initSms();
Boolean initBase();
Boolean getIsOpenCaptcha();
Boolean initEmail();
Boolean initWx();
}

View File

@ -0,0 +1,40 @@
package com.sxpcwlkj.system.service;
import com.sxpcwlkj.framework.sercice.BaseService;
import com.sxpcwlkj.system.entity.SysDept;
import com.sxpcwlkj.system.entity.bo.SysDeptBo;
import com.sxpcwlkj.system.entity.vo.SysDeptVo;
import com.sxpcwlkj.system.entity.export.SysDeptExport;
import java.util.List;
import java.util.Set;
/**
* 系统部门-接口
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
* @describe 支持自定义扩展,已继承接口{insertdeleteByIdupdateByIdselectByIdgetByEntityListPage}更多查看BaseService接口
*/
public interface SysDeptService extends BaseService<SysDept, SysDeptVo, SysDeptBo> {
/**
* 系统部门列表
* @param isAll true全部数据 false有效数据(status=0)
* @param showLevel 显示级别0全部 1一级 2二级 3三级
* @return 系统部门数结构列表
*/
List<SysDeptVo> queryTree(boolean isAll,int showLevel);
/**
* 按照系统部门ID查询下级所有系统部门
*
* @param id 系统部门ID
* @param endList 最终的数据
*/
void queryListSon(String id, List<SysDeptVo> endList);
/**
* 导出系统部门
* @param list 系统部门列表
* @return true成功 false 失败
*/
Boolean imports(Set<SysDeptExport> list);
}

View File

@ -0,0 +1,44 @@
package com.sxpcwlkj.system.service;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.system.entity.bo.SysDictDataBo;
import com.sxpcwlkj.system.entity.vo.SysDictDataVo;
import java.io.Serializable;
/**
* @Description TODO
* @Author sxpcwlkj
* @Version v1.0.0
*/
public interface SysDictDataService {
TableDataInfo<SysDictDataVo> selectPageList(SysDictDataBo bo, PageQuery pageQuery);
/**
* 查询
* @param id ID
* @return vo
*/
SysDictDataVo selectVoById(Long id);
/**
* 更新
* @param bo 对象
* @return vo
*/
Boolean updateById(SysDictDataBo bo);
/**
* 新增
* @param bo 对象
* @return vo
*/
Boolean insert(SysDictDataBo bo);
/**
* 删除
* @param
* @return vo
*/
Boolean deleteById(Serializable id);
}

View File

@ -0,0 +1,67 @@
package com.sxpcwlkj.system.service;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.system.entity.bo.SysDictBo;
import com.sxpcwlkj.system.entity.vo.SysDictDataVo;
import com.sxpcwlkj.system.entity.vo.SysDictVo;
import java.util.List;
import java.util.Map;
/**
* @Description TODO
* @Author sxpcwlkj
* @Version v1.0.0
*/
public interface SysDictService {
TableDataInfo<SysDictVo> selectPageList(SysDictBo bo, PageQuery pageQuery);
/**
* 查询
* @param id ID
* @return vo
*/
SysDictVo selectVoById(Long id);
/**
* 更新
* @param bo 对象
* @return vo
*/
Boolean updateById(SysDictBo bo);
/**
* 新增
* @param bo 对象
* @return vo
*/
Boolean insert(SysDictBo bo);
/**
* 删除
* @param
* @return vo
*/
Boolean deleteById(Long id);
/**
* 初始化字典
* @param code
* @return
*/
Integer initSysDict(String code);
/**
* 获取字典值列表
* @param code
* @return
*/
List<SysDictDataVo> getSysDictByCode(String code);
/**
* 获取所有字典列表
* @return
*/
List<Map<String,Object>> selectAll();
}

View File

@ -0,0 +1,48 @@
package com.sxpcwlkj.system.service;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.system.entity.AdminMenuTree;
import com.sxpcwlkj.system.entity.bo.SysFunctionBo;
import com.sxpcwlkj.system.entity.vo.SysFunctionVo;
import java.util.List;
/**
* @Description TODO
* @Author sxpcwlkj
* @Version v1.0.0
*/
public interface SysFunctionService {
List<SysFunctionVo> selectPageList(SysFunctionBo bo, PageQuery pageQuery);
/**
* 查询
* @param id ID
* @return vo
*/
SysFunctionVo selectVoById(String id);
/**
* 更新
* @param bo 对象
* @return vo
*/
Boolean updateById(SysFunctionBo bo);
/**
* 新增
* @param bo 对象
* @return vo
*/
Boolean insert(SysFunctionBo bo);
/**
* 删除
* @param
* @return vo
*/
Boolean deleteById(String id);
List<AdminMenuTree> getAllMenuTree();
}

View File

@ -0,0 +1,46 @@
package com.sxpcwlkj.system.service;
import com.sxpcwlkj.system.entity.SysUser;
import com.sxpcwlkj.system.entity.bo.LoginBodyBo;
import jakarta.servlet.http.HttpServletRequest;
/**
* @ClassName SysLoginService
* @Description TODO
* @Author 西决
* @Date 2022/12/25 12:04
*/
public interface SysLoginService {
/**
* 登录验证
* @param loginBodyBo bo
* @return vo
*/
String login(HttpServletRequest request,LoginBodyBo loginBodyBo);
/**
* 用户注销
*/
void logout();
/**
* 验证码验证
* @param username
* @param code
* @param uuid
*/
void verfyCaptcha(String username,String codeKey, String code, String uuid);
/**
* 租户验证
* @param sysUser
*/
void verfyTenement(SysUser sysUser);
/**
* 系统用户登录更新信息
* @param sysUser
*/
void updateSysUser(HttpServletRequest request,SysUser sysUser);
}

View File

@ -0,0 +1,25 @@
package com.sxpcwlkj.system.service;
import com.sxpcwlkj.framework.sercice.BaseService;
import com.sxpcwlkj.system.entity.SysNotice;
import com.sxpcwlkj.system.entity.bo.SysNoticeBo;
import com.sxpcwlkj.system.entity.vo.SysNoticeVo;
import com.sxpcwlkj.system.entity.export.SysNoticeExport;
import java.util.List;
import java.util.Set;
/**
* 系统公告-接口
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
* @describe 支持自定义扩展,已继承接口{insertdeleteByIdupdateByIdselectByIdgetByEntityListPage}更多查看BaseService接口
*/
public interface SysNoticeService extends BaseService<SysNotice, SysNoticeVo, SysNoticeBo> {
/**
* 导出系统公告
* @param list 系统公告列表
* @return true成功 false 失败
*/
Boolean imports(Set<SysNoticeExport> list);
}

View File

@ -0,0 +1,51 @@
package com.sxpcwlkj.system.service;
import com.sxpcwlkj.common.code.entity.FileStorageConfig;
import com.sxpcwlkj.framework.sercice.BaseService;
import com.sxpcwlkj.system.entity.SysOssConfig;
import com.sxpcwlkj.system.entity.bo.SysOssConfigBo;
import com.sxpcwlkj.system.entity.vo.SysOssConfigVo;
import java.util.List;
/**
* 对象存储配置表
*
* @author 西决 942879858@qq.com
* @since 1.0.0 2024-07-07
*/
public interface SysOssConfigService extends BaseService<SysOssConfig, SysOssConfigVo, SysOssConfigBo> {
/**
* 查询默认存储
* @return
*/
String queryDef();
/**
* 根据 Key 查询配置
* @param key
* @return
*/
SysOssConfigVo selectVoByKey(String key);
/**
* 设置配置
* @param bo
* @return
*/
Boolean updateByIdXml(SysOssConfigBo bo);
/**
* 查询配置列表
* @return
*/
List<FileStorageConfig> getOss();
/**
* 初始化配置
* @return
*/
Boolean initOss();
}

View File

@ -0,0 +1,44 @@
package com.sxpcwlkj.system.service;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.system.entity.bo.SysOssBo;
import com.sxpcwlkj.system.entity.vo.SysOssVo;
import java.io.Serializable;
/**
* @Description TODO
* @Author sxpcwlkj
* @Version v1.0.0
*/
public interface SysOssService {
TableDataInfo<SysOssVo> selectPageList(SysOssBo bo, PageQuery pageQuery);
/**
* 查询
* @param id ID
* @return vo
*/
SysOssVo selectVoById(Long id) ;
/**
* 更新
* @param bo 对象
* @return vo
*/
Boolean updateById(SysOssBo bo);
/**
* 新增
* @param bo 对象
* @return vo
*/
Boolean insert(SysOssBo bo);
/**
* 删除
* @param
* @return vo
*/
Boolean deleteById(Serializable id);
}

View File

@ -0,0 +1,43 @@
package com.sxpcwlkj.system.service;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.system.entity.bo.SysRoleBo;
import com.sxpcwlkj.system.entity.vo.SysRoleVo;
/**
* @Description TODO
* @Author sxpcwlkj
* @Version v1.0.0
*/
public interface SysRoleService {
TableDataInfo<SysRoleVo> selectPageUserList(SysRoleBo bo, PageQuery pageQuery);
/**
* 查询
* @param id ID
* @return vo
*/
SysRoleVo selectVoById(String id);
/**
* 更新
* @param bo 对象
* @return vo
*/
Boolean updateById(SysRoleBo bo);
/**
* 新增
* @param bo 对象
* @return vo
*/
Boolean insert(SysRoleBo bo);
/**
* 删除
* @param
* @return vo
*/
Boolean deleteById(String id);
}

View File

@ -0,0 +1,22 @@
package com.sxpcwlkj.system.service;
import com.sxpcwlkj.system.entity.SysTenant;
import com.sxpcwlkj.system.entity.vo.SysTenantVo;
import java.util.List;
public interface SysTenantService {
/**
* 查询出系统启用的租户列表
* @return
*/
List<SysTenantVo> selectOpenList();
/**
* 租户查询
* @param tenantId
* @return
*/
SysTenant selectById(String tenantId);
}

View File

@ -0,0 +1,185 @@
package com.sxpcwlkj.system.service;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.system.entity.AdminMenuTree;
import com.sxpcwlkj.system.entity.SysUser;
import com.sxpcwlkj.system.entity.bo.ResetPwdBo;
import com.sxpcwlkj.system.entity.bo.ResetPwdSuperBo;
import com.sxpcwlkj.system.entity.bo.SetUserRoleSuperBo;
import com.sxpcwlkj.system.entity.bo.SysUserBo;
import com.sxpcwlkj.system.entity.export.SysUserExportVo;
import com.sxpcwlkj.system.entity.vo.SysUserVo;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author XIjue
*/
public interface SysUserService {
/**
* 分页查询用户列表
* @param user 用户信息
* @param pageQuery 分页参数
* @return 用户列表
*/
TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery);
/**
* 新增用户
* @param bo 对象
* @return vo
*/
Boolean insert(SysUserBo bo);
/**
* 根据用户Id
* @param userId 用户id
* @return vo
*/
SysUserVo selectVoById(String userId);
/**
* 编辑用户
* @param bo 对象
* @return true成功 false 失败
*/
Boolean updateById(SysUserBo bo);
/**
* 删除用户
* @param ids 用户id[]
* @return vo
*/
Boolean deleteById(String ids);
/**
* 导出用户
* @param list 用户列表
* @return true成功 false 失败
*/
Boolean imports(Set<SysUserExportVo> list);
/**
* 根据用户名查询用户
* @param tenantId 租户id
* @param userName 用户名
* @return 用户
*/
SysUser selectByUserName(String tenantId, String userName);
/**
* 用户更新秘钥对
* @param tenantId 租户id
* @param userId 用户id
* @return true成功 false 失败
*/
Boolean updateRsa(String tenantId, String userId);
/**
* 获取用户的角色权限基本信息
* @param userId 用户id
* @return vo
*/
SysUserVo getUserRoleAnfFunctionInfo(String userId);
/**
* 获取当前登录对象的菜单
* @param userId 用户id
* @return 菜单列表
*/
List<AdminMenuTree> getAdminMenuTree(String userId);
/**
* 更新头像
* @param headerImg 头像
* @return true成功 false 失败
*/
Boolean updateHeaderImgById(String headerImg);
/**
* 重置密码
* @param bo 对象
* @return true成功 false 失败
*/
Boolean resetPwd(ResetPwdBo bo);
/**
* 根据手机号查询用户
* @param phone 手机号
* @return 用户
*/
SysUserVo selectVoByPhone(String phone);
/**
* 根据手机号查询用户
* @param email email
* @return 用户
*/
SysUserVo selectVoByEmail(String email);
/**
* 查询所有用户
* @return 用户列表
*/
List<SysUserVo> selectAll();
/**
* 超级管理员重置用户密码
* @param bo 对象
* @return true成功 false 失败
*/
Boolean resetPwdSuper(ResetPwdSuperBo bo);
/**
* 设置用户角色
* @param bo 对象
* @return true成功 false 失败
*/
Boolean setUserRoleSuper(SetUserRoleSuperBo bo);
/**
* 解绑手机号
* @param 1解绑手机号 2解绑邮箱 3解绑微信
* @return true成功 false 失败
*/
Boolean unbind(int type);
/**
* 绑定手机号
* @param phone 绑定的新手机号
* @return true成功 false 失败
*/
Boolean bindingPhone(String phone);
/**
* 绑定手机号
* @param email 绑定的email
* @return true成功 false 失败
*/
Boolean bindingEmail(String email);
/**
* 获取登录对象信息
* @return 用户信息
*/
Map<String,Object> getUserInfo(SysUserVo sysUser);
/**
* 根据openId查询用户
* @param openId 微信openId
* @return 用户信息
*/
SysUserVo selectOpenId(String openId);
/**
* 绑定微信openId
* @param openId 微信openId
* @return true成功 false 失败
*/
boolean bindingOpenId(String openId);
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,257 @@
package com.sxpcwlkj.system.service.impl;
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sxpcwlkj.common.code.entity.ConfigEntity;
import com.sxpcwlkj.common.constant.CacheConstants;
import com.sxpcwlkj.common.enums.ConfigKeyNum;
import com.sxpcwlkj.common.enums.SystemCommonEnum;
import com.sxpcwlkj.common.exception.MmsException;
import com.sxpcwlkj.common.utils.BeanCopyUtil;
import com.sxpcwlkj.common.utils.DataUtil;
import com.sxpcwlkj.common.utils.MapstructUtil;
import com.sxpcwlkj.common.utils.StringUtil;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.framework.sercice.impl.BaseServiceImpl;
import com.sxpcwlkj.redis.RedisUtil;
import com.sxpcwlkj.system.entity.SysConfig;
import com.sxpcwlkj.system.entity.bo.SysConfigBo;
import com.sxpcwlkj.system.entity.vo.SysConfigVo;
import com.sxpcwlkj.system.mapper.SysConfigMapper;
import com.sxpcwlkj.system.service.SysConfigService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 系统配置
*
* @author XIjue
* @since 1.0.0 2024-06-10
*/
@Slf4j
@Service("sys_config")
@RequiredArgsConstructor
public class SysConfigServiceImpl extends BaseServiceImpl<SysConfig, SysConfigVo, SysConfigBo> implements SysConfigService {
private final SysConfigMapper baseMapper;
private final ApplicationContext applicationContext;
@Override
public BaseMapperPlus<SysConfig, SysConfigVo> getBaseMapper() {
return baseMapper;
}
@Override
public Boolean insert(SysConfigBo bo) {
int row;
SysConfig obj = MapstructUtil.convert(bo, SysConfig.class);
if (obj != null && obj.getValueType() != null && !obj.getValueType().isEmpty()) {
if ("Array".equals(obj.getValueType())) {
List<String> list = bo.getConfigValues();
String result = DataUtil.getListToString(list);
obj.setConfigValue(result);
}
}
assert obj != null;
SysConfigVo sysConfigVo = this.getBaseMapper().selectVoOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getConfigKey, obj.getConfigKey()).last("LIMIT 1"));
if(sysConfigVo!=null){
throw new MmsException("配置key已存在");
}
row = this.getBaseMapper().insert(obj);
return row > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteById(Serializable ids) {
String[] array = DataUtil.getCatStr(ids.toString(), ",");
return this.getBaseMapper().deleteByIds(new ArrayList<>(List.of(array)))>0;
}
@Override
public Boolean updateById(SysConfigBo bo) {
int row = 0;
SysConfig obj = MapstructUtil.convert(bo, SysConfig.class);
if (obj != null && obj.getValueType() != null && !obj.getValueType().isEmpty()) {
if ("Array".equals(obj.getValueType())) {
List<String> list = bo.getConfigValues();
String result = DataUtil.getListToString(list);
obj.setConfigValue(result);
}
}
if (obj != null && obj.getConfigKey() != null && !obj.getConfigKey().isEmpty()) {
SysConfig sysConfig = baseMapper.selectOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getConfigKey, obj.getConfigKey()).last("LIMIT 1"));
if (sysConfig != null) {
obj.setId(sysConfig.getId());
obj.setRevision(sysConfig.getRevision());
}
}
row = this.getBaseMapper().updateById(obj);
return row > 0;
}
@Override
public SysConfigVo selectVoById(Serializable id) {
SysConfigVo sysConfigVo = this.getBaseMapper().selectVoById(id);
if (sysConfigVo != null && !sysConfigVo.getConfigValue().isEmpty()) {
List<String> list = Arrays.asList(sysConfigVo.getConfigValue().split(","));
sysConfigVo.setConfigValues(list);
if (!list.isEmpty()) {
sysConfigVo.setValueType("Array");
} else {
sysConfigVo.setValueType("String");
}
}
return sysConfigVo;
}
@Override
public TableDataInfo<SysConfigVo> selectListVoPage(SysConfigBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<SysConfig> lqw = buildQueryWrapper(bo);
Page<SysConfigVo> page = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(page);
}
private LambdaQueryWrapper<SysConfig> buildQueryWrapper(SysConfigBo query) {
if (query == null) {
query = new SysConfigBo();
}
//Map<String, Object> params = query.getParams();
LambdaQueryWrapper<SysConfig> wrapper = Wrappers.lambdaQuery();
wrapper.like(StringUtil.isNotEmpty(query.getConfigName()), SysConfig::getConfigName, query.getConfigName());
wrapper.eq(StringUtil.isNotEmpty(query.getConfigKey()), SysConfig::getConfigKey, query.getConfigKey());
wrapper.eq(StringUtil.isNotEmpty(query.getConfigType()), SysConfig::getConfigType, query.getConfigType());
wrapper.eq(StringUtil.isNotEmpty(query.getStatus()), SysConfig::getStatus, query.getStatus());
return wrapper;
}
@Override
public Boolean updateByCodes(List<SysConfigBo> bos) {
if (bos != null && !bos.isEmpty()) {
for (SysConfigBo bo : bos) {
if (bo.getConfigKey() == null || bo.getConfigKey().isEmpty()) {
continue;
}
this.updateById(bo);
this.initBase();
this.initSms();
this.initEmail();
applicationContext.publishEvent(new ContextRefreshedEvent(applicationContext));
}
return true;
}
return false;
}
@Override
public List<SysConfigVo> selectByCodes(List<SysConfigBo> bos) {
List<SysConfigVo> endList = new ArrayList<>();
for (SysConfigBo bo : bos) {
SysConfigVo vo = baseMapper.selectVoOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getConfigKey, bo.getConfigKey()).last("LIMIT 1"));
if (vo == null) {
if (bo.getConfigKey() == null || bo.getConfigKey().isEmpty()) {
continue;
}
bo.setStatus(0);
bo.setConfigType(1);
this.insert(bo);
} else {
bo.setConfigValue(vo.getConfigValue());
if (bo.getValueType() != null && !bo.getValueType().isEmpty()) {
List<String> list = Arrays.asList(vo.getConfigValue().split(","));
if (!list.isEmpty()) {
bo.setValueType("Array");
//去除空字符串
list = list.stream().filter(str -> !str.isEmpty()).collect(Collectors.toList());
//去除空格
list = list.stream().map(String::trim).collect(Collectors.toList());
//去除重复
list = list.stream().distinct().collect(Collectors.toList());
} else {
bo.setValueType("String");
}
bo.setConfigValues(list);
}
bo.setConfigName(vo.getConfigName());
bo.setConfigType(vo.getConfigType());
bo.setStatus(vo.getStatus());
bo.setId(vo.getId());
bo.setRevision(vo.getRevision());
}
SysConfigVo obj = MapstructUtil.convert(bo, SysConfigVo.class);
endList.add(obj);
}
return endList;
}
@Override
public Boolean initSms() {
List<SysConfig> sysSms = baseMapper.selectList(new LambdaQueryWrapper<SysConfig>().likeRight(SysConfig::getConfigKey, "sys_sms_"));
//转为Map集合
List<ConfigEntity> convert = BeanCopyUtil.convert(sysSms, ConfigEntity.class);
RedisUtil.deleteObject(ConfigKeyNum.config_sms.getKey());
RedisUtil.setCacheList(ConfigKeyNum.config_sms.getKey(), convert);
RedisUtil.expire(ConfigKeyNum.config_sms.getKey(), Duration.ofDays(99999999));
return true;
}
@Override
public Boolean initBase() {
List<SysConfig> sysSms = baseMapper.selectList(new LambdaQueryWrapper<SysConfig>().likeRight(SysConfig::getConfigKey, "sys_base_"));
//转为Map集合
List<ConfigEntity> convert = BeanCopyUtil.convert(sysSms, ConfigEntity.class);
RedisUtil.deleteObject(ConfigKeyNum.config_base.getKey());
RedisUtil.setCacheList(ConfigKeyNum.config_base.getKey(), convert);
RedisUtil.expire(ConfigKeyNum.config_base.getKey(), Duration.ofDays(99999999));
return true;
}
@Override
public Boolean getIsOpenCaptcha() {
SysConfigVo config = baseMapper.selectVoOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getConfigKey, "sys_base_captcha_state").last("limit 1"));
return config != null && Objects.equals(Convert.toInt(config.getConfigValue()), SystemCommonEnum.SYS_COMMON_STATE_OPEN.getValue());
}
@Override
public Boolean initEmail() {
List<SysConfig> sysSms = baseMapper.selectList(new LambdaQueryWrapper<SysConfig>().likeRight(SysConfig::getConfigKey, "sys_email_"));
//转为Map集合
List<ConfigEntity> convert = BeanCopyUtil.convert(sysSms, ConfigEntity.class);
RedisUtil.deleteObject(ConfigKeyNum.config_email.getKey());
RedisUtil.setCacheList(ConfigKeyNum.config_email.getKey(), convert);
RedisUtil.expire(ConfigKeyNum.config_email.getKey(), Duration.ofDays(99999999));
return true;
}
@Override
public Boolean initWx() {
List<SysConfig> sysSms = baseMapper.selectList(new LambdaQueryWrapper<SysConfig>().likeRight(SysConfig::getConfigKey, "sys_wx_"));
//转为Map集合
List<ConfigEntity> convert = BeanCopyUtil.convert(sysSms, ConfigEntity.class);
RedisUtil.deleteObject(ConfigKeyNum.config_wx.getKey());
RedisUtil.setCacheList(ConfigKeyNum.config_wx.getKey(), convert);
RedisUtil.expire(ConfigKeyNum.config_wx.getKey(), Duration.ofDays(99999999));
return true;
}
}

View File

@ -0,0 +1,140 @@
package com.sxpcwlkj.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sxpcwlkj.common.enums.SystemCommonEnum;
import com.sxpcwlkj.common.utils.MapstructUtil;
import com.sxpcwlkj.common.utils.DataUtil;
import com.sxpcwlkj.common.utils.StringUtil;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.datasource.mapper.BaseMapperPlus;
import com.sxpcwlkj.framework.sercice.impl.BaseServiceImpl;
import com.sxpcwlkj.system.entity.SysDept;
import com.sxpcwlkj.system.entity.bo.SysDeptBo;
import com.sxpcwlkj.system.entity.vo.SysDeptVo;
import com.sxpcwlkj.system.entity.export.SysDeptExport;
import com.sxpcwlkj.system.mapper.SysDeptMapper;
import com.sxpcwlkj.system.service.SysDeptService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
import java.util.Set;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
/**
* 系统部门-接口实现
*
* @author 西决
* @Doc <a href='https://www.mmsadmin.com'>MMS文档</a>
*/
@Slf4j
@Service("sys_dept")
@RequiredArgsConstructor
public class SysDeptServiceImpl extends BaseServiceImpl<SysDept, SysDeptVo,SysDeptBo> implements SysDeptService {
private final SysDeptMapper baseMapper;
@Override
public BaseMapperPlus<SysDept, SysDeptVo> getBaseMapper() {
return baseMapper;
}
@Override
public List<SysDeptVo> queryTree(boolean isAll,int showLevel) {
List<SysDeptVo> queryTrees = baseMapper.selectVoList(new LambdaQueryWrapper<SysDept>()
.eq(!isAll,SysDept::getStatus, SystemCommonEnum.SYS_COMMON_STATE_OPEN.getValue())
.orderByAsc(SysDept::getSort));
return formatTree(queryTrees, "0",showLevel,0);
}
@Override
public void queryListSon(String id, List<SysDeptVo> endList) {
SysDeptVo vo = baseMapper.selectVoById(id);
if (vo != null) {
endList.add(vo);
queryListSon(vo.getParentId(), endList);
}
}
private List<SysDeptVo> formatTree(List<SysDeptVo> vos, String fid, int level,int currentLevel) {
List<SysDeptVo> endList = new ArrayList<>();
for (SysDeptVo s : vos) {
if (fid.equals(s.getParentId())) {
if(level > currentLevel||level==0) {
List<SysDeptVo> vo = formatTree(vos, s.getDeptId(),level,currentLevel+1);
s.setChildren(vo);
endList.add(s);
}
}
}
return endList;
}
@Override
public Boolean insert(SysDeptBo bo) {
int row;
bo.setDeptId(null);
SysDept obj = MapstructUtil.convert(bo, SysDept.class);
row = this.getBaseMapper().insert(obj);
return row > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteById(Serializable ids) {
String[] array = DataUtil.getCatStr(ids.toString(), ",");
return this.getBaseMapper().deleteByIds(new ArrayList<>(List.of(array)))>0;
}
@Override
public Boolean updateById(SysDeptBo bo) {
int row;
SysDept obj = MapstructUtil.convert(bo, SysDept.class);
row = this.getBaseMapper().updateById(obj);
return row > 0;
}
@Override
public SysDeptVo selectVoById(Serializable id) {
SysDeptVo vo= this.getBaseMapper().selectVoById(id);
List<String> end= new ArrayList<>();
getIds(end,vo.getDeptId());
Collections.reverse(end);
vo.setDeptIds(end.toArray(new String[]{}));
return vo;
}
private void getIds(List<String> end, String id) {
SysDeptVo vo = baseMapper.selectVoById(id);
if (vo != null) {
end.add(vo.getDeptId());
getIds(end, vo.getParentId());
}
}
@Override
public TableDataInfo<SysDeptVo> selectListVoPage(SysDeptBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<SysDept> lqw = buildQueryWrapper(bo);
Page<SysDeptVo> page = baseMapper.selectVoPage(pageQuery.build(),lqw);
return TableDataInfo.build(page);
}
private LambdaQueryWrapper<SysDept> buildQueryWrapper(SysDeptBo query){
if(query==null){
query=new SysDeptBo();
}
LambdaQueryWrapper<SysDept> wrapper = Wrappers.lambdaQuery();
wrapper.eq(StringUtil.isNotEmpty(query.getDeptId()), SysDept::getDeptId, query.getDeptId());
wrapper.eq(StringUtil.isNotEmpty(query.getParentId()), SysDept::getParentId, query.getParentId());
wrapper.eq(StringUtil.isNotEmpty(query.getDeptName()), SysDept::getDeptName, query.getDeptName());
return wrapper;
}
@Override
public Boolean imports(Set<SysDeptExport> list) {
return true;
}
}

View File

@ -0,0 +1,78 @@
package com.sxpcwlkj.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sxpcwlkj.common.enums.SystemCommonEnum;
import com.sxpcwlkj.common.utils.DataUtil;
import com.sxpcwlkj.common.utils.MapstructUtil;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.system.entity.SysDictData;
import com.sxpcwlkj.system.entity.bo.SysDictDataBo;
import com.sxpcwlkj.system.entity.vo.SysDictDataVo;
import com.sxpcwlkj.system.mapper.SysDictDataMapper;
import com.sxpcwlkj.system.service.SysDictDataService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* @Description 字典数据
* @Author sxpcwlkj
* @Version v1.0.0
*/
@RequiredArgsConstructor
@Service("sysDictData")
@Slf4j
public class SysDictDataServiceImpl implements SysDictDataService {
private final SysDictDataMapper baseMapper;
@Override
public TableDataInfo<SysDictDataVo> selectPageList(SysDictDataBo bo, PageQuery pageQuery) {
Page<SysDictDataVo> page = baseMapper.selectByPage(pageQuery.build(), this.buildQueryWrapper(bo));
return TableDataInfo.build(page);
}
private Wrapper<SysDictData> buildQueryWrapper(SysDictDataBo bo) {
QueryWrapper<SysDictData> wrapper = Wrappers.query();
wrapper.eq(ObjectUtil.isNotNull(bo.getStatus()), "status", SystemCommonEnum.SYS_COMMON_STATE_OPEN.getValue());
wrapper.like(ObjectUtil.isNotNull(bo.getFieldName()), "name", bo.getFieldName());
wrapper.orderByAsc("sort");
return wrapper;
}
@Override
public SysDictDataVo selectVoById(Long id) {
return baseMapper.selectVoById(id);
}
@Override
public Boolean updateById(SysDictDataBo bo) {
int row;
SysDictData convert = MapstructUtil.convert(bo, SysDictData.class);
return baseMapper.updateById(convert)>0;
}
@Override
public Boolean insert(SysDictDataBo bo) {
SysDictData convert = MapstructUtil.convert(bo, SysDictData.class);
return baseMapper.insert(convert)>0;
}
@Override
public Boolean deleteById(Serializable ids) {
String[] array = DataUtil.getCatStr(ids.toString(), ",");
return baseMapper.deleteByIds(new ArrayList<>(List.of(array)))>0;
}
}

View File

@ -0,0 +1,174 @@
package com.sxpcwlkj.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sxpcwlkj.common.constant.CacheConstants;
import com.sxpcwlkj.common.enums.SystemCommonEnum;
import com.sxpcwlkj.common.utils.MapstructUtil;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.redis.RedisUtil;
import com.sxpcwlkj.system.entity.SysDict;
import com.sxpcwlkj.system.entity.SysDictData;
import com.sxpcwlkj.system.entity.bo.SysDictBo;
import com.sxpcwlkj.system.entity.bo.SysDictDataBo;
import com.sxpcwlkj.system.entity.vo.SysDictDataVo;
import com.sxpcwlkj.system.entity.vo.SysDictVo;
import com.sxpcwlkj.system.mapper.SysDictDataMapper;
import com.sxpcwlkj.system.mapper.SysDictMapper;
import com.sxpcwlkj.system.service.SysDictService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Description TODO
* @Author sxpcwlkj
* @Version v1.0.0
*/
@RequiredArgsConstructor
@Service("sysDict")
@Slf4j
public class SysDictServiceImpl implements SysDictService {
private final SysDictMapper baseMapper;
private final SysDictDataMapper sysDictDataMapper;
@Override
public TableDataInfo<SysDictVo> selectPageList(SysDictBo bo, PageQuery pageQuery) {
Page<SysDictVo> page = baseMapper.selectByPage(pageQuery.build(), this.buildQueryWrapper(bo));
return TableDataInfo.build(page);
}
private Wrapper<SysDict> buildQueryWrapper(SysDictBo bo) {
//Map<String, Object> params = bo.getParams();
QueryWrapper<SysDict> wrapper = Wrappers.query();
wrapper.like(ObjectUtil.isNotNull(bo.getName()), "name", bo.getName());
wrapper.orderByAsc("created_time");
wrapper.orderByAsc("sort");
return wrapper;
}
@Override
public SysDictVo selectVoById(Long id) {
SysDictVo sysDictVo = baseMapper.selectVoById(id);
List<SysDictDataVo> vos = sysDictDataMapper.selectVoList(new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getFieldName, sysDictVo.getFieldName()).orderByAsc(SysDictData::getSort));
if (vos == null) {
vos = new ArrayList<>();
SysDictDataVo sysDictDataVo = new SysDictDataVo();
sysDictDataVo.setDictType("0");
sysDictDataVo.setStatus("0");
vos.add(sysDictDataVo);
}
sysDictVo.setList(vos);
return sysDictVo;
}
@Override
public Boolean updateById(SysDictBo bo) {
int row;
SysDict convert = MapstructUtil.convert(bo, SysDict.class);
// 字典值维护
List<SysDictDataBo> list = bo.getList();
if (list != null && !list.isEmpty()) {
sysDictDataMapper.delete(new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getFieldName, bo.getFieldName()));
for (SysDictDataBo data : list) {
SysDictData convertData = MapstructUtil.convert(data, SysDictData.class);
assert convertData != null;
convertData.setId(null);
convertData.setFieldName(bo.getFieldName());
sysDictDataMapper.insert(convertData);
}
}
return baseMapper.updateById(convert) > 0;
}
@Override
public Boolean insert(SysDictBo bo) {
SysDict convert = MapstructUtil.convert(bo, SysDict.class);
int row = baseMapper.insert(convert);
// 字典值维护
List<SysDictDataBo> list = bo.getList();
if (list != null && !list.isEmpty()) {
for (SysDictDataBo data : list) {
SysDictData convertData = MapstructUtil.convert(data, SysDictData.class);
assert convertData != null;
convertData.setId(null);
convertData.setFieldName(bo.getFieldName());
sysDictDataMapper.insert(convertData);
}
}
return row > 0;
}
@Override
public Boolean deleteById(Long id) {
SysDict bo = baseMapper.selectById(id);
sysDictDataMapper.delete(new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getFieldName, bo.getFieldName()));
return baseMapper.deleteById(id) > 0;
}
@Override
public Integer initSysDict(String code) {
List<SysDict> dicts = baseMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getStatus, 0).orderByAsc(SysDict::getSort));
int i = 0;
for (SysDict d : dicts) {
List<SysDictData> data = sysDictDataMapper.selectList(new LambdaQueryWrapper<SysDictData>()
.eq(SysDictData::getFieldName, d.getFieldName())
.eq(SysDictData::getStatus, 0)
.orderByAsc(SysDictData::getSort)
);
RedisUtil.deleteObject(CacheConstants.SYS_DICT_KEY + d.getFieldName());
RedisUtil.setCacheObject(CacheConstants.SYS_DICT_KEY + d.getFieldName(), data);
for (SysDictData v : data) {
i++;
RedisUtil.deleteObject(CacheConstants.SYS_DICT_KEY + v.getFieldName() + ":" + v.getValue());
RedisUtil.setCacheObject(CacheConstants.SYS_DICT_KEY + v.getFieldName() + ":" + v.getValue(), v.getLabel());
}
}
return i;
}
@Override
public List<SysDictDataVo> getSysDictByCode(String code) {
return sysDictDataMapper.selectVoList(new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getFieldName, code)
.eq(SysDictData::getStatus, 0).orderByAsc(SysDictData::getSort));
}
@Override
public List<Map<String, Object>> selectAll() {
List<SysDictVo> dataVos = baseMapper.selectVoList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getStatus, 0).orderByAsc(SysDict::getSort));
List<Map<String, Object>> end = new ArrayList<>();
for (SysDictVo dict : dataVos) {
Map<String, Object> map = new HashMap<>();
map.put("dictType", dict.getFieldName());
List<SysDictDataVo> dictData = getSysDictByCode(dict.getFieldName());
List<Map<String, Object>> item = new ArrayList<>();
for (SysDictDataVo vo : dictData) {
Map<String, Object> itemMap = new HashMap<>();
itemMap.put("dictLabel", vo.getLabel());
itemMap.put("dictValue", vo.getValue());
itemMap.put("labelClass", vo.getColorType());
item.add(itemMap);
}
map.put("dataList", item);
end.add(map);
}
return end;
}
}

View File

@ -0,0 +1,176 @@
package com.sxpcwlkj.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sxpcwlkj.common.utils.MapstructUtil;
import com.sxpcwlkj.common.utils.StringUtil;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.system.entity.AdminMenuTree;
import com.sxpcwlkj.system.entity.SysFunction;
import com.sxpcwlkj.system.entity.bo.SysFunctionBo;
import com.sxpcwlkj.system.entity.vo.SysFunctionVo;
import com.sxpcwlkj.system.mapper.SysFunctionMapper;
import com.sxpcwlkj.system.service.SysFunctionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* @Description TODO
* @Author sxpcwlkj
* @Version v1.0.0
*/
@RequiredArgsConstructor
@Service("sysFunction")
@Slf4j
public class SysFunctionServiceImpl implements SysFunctionService {
private final SysFunctionMapper baseMapper;
@Override
public List<SysFunctionVo> selectPageList(SysFunctionBo bo, PageQuery pageQuery) {
List<SysFunctionVo> functionVos = baseMapper.selectVoList(new LambdaQueryWrapper<SysFunction>().orderByAsc(SysFunction::getSort));
return getSysFunctionVo(functionVos, "0",bo.getLevel(),0);
}
@Override
public SysFunctionVo selectVoById(String id) {
SysFunctionVo vo = baseMapper.selectVoById(id);
List<SysFunctionVo> list = new ArrayList<>();
if (vo != null) {
getIds(list, vo.getParentId());
}
Collections.reverse(list);
assert vo != null;
vo.setMenuSuperior(list.stream().map(SysFunctionVo::getId).toArray(String[]::new));
return vo;
}
private List<SysFunctionVo> getIds(List<SysFunctionVo> end, String id) {
SysFunctionVo vo = baseMapper.selectVoById(id);
if (vo != null) {
end.add(vo);
getIds(end, vo.getParentId());
}
return end;
}
@Override
public Boolean updateById(SysFunctionBo bo) {
SysFunction convert = MapstructUtil.convert(bo, SysFunction.class);
return baseMapper.updateById(convert) > 0;
}
@Override
public Boolean insert(SysFunctionBo bo) {
bo.setId(null);
SysFunction convert = MapstructUtil.convert(bo, SysFunction.class);
return baseMapper.insert(convert) > 0;
}
@Override
public Boolean deleteById(String id) {
List<SysFunctionVo> functionVos = baseMapper.selectVoList(new LambdaQueryWrapper<SysFunction>().eq(SysFunction::getParentId, id));
if (!functionVos.isEmpty()) {
throw new RuntimeException("该资菜单存在子菜单,请先删除子菜单");
}
return baseMapper.deleteById(id) > 0;
}
@Override
public List<AdminMenuTree> getAllMenuTree() {
List<SysFunctionVo> functionVos = baseMapper.selectVoList(new LambdaQueryWrapper<SysFunction>().orderByAsc(SysFunction::getSort));
return getAdminMenuTree(functionVos, "0");
}
/**
* 资源格式化
*
* @param functionVos 资源集合
* @param funId 上级资源ID
* @return AdminMenuTree
*/
private List<SysFunctionVo> getSysFunctionVo(List<SysFunctionVo> functionVos, String funId, int level,int currentLevel) {
List<SysFunctionVo> endList = new ArrayList<>();
for (SysFunctionVo f : functionVos) {
//是否是属于funId
if (f.getParentId() != null && funId.equals(f.getParentId())) {
if(level > currentLevel||level==0) {
List<SysFunctionVo> children = getSysFunctionVo(functionVos, f.getId(), level, currentLevel + 1);
f.setChildren(children);
endList.add(f);
}
}
}
return endList;
}
/**
* 菜单格式化
*
* @param functionVos 资源集合
* @param funId 上级资源ID
* @return AdminMenuTree
*/
private List<AdminMenuTree> getAdminMenuTree(List<SysFunctionVo> functionVos, String funId) {
List<AdminMenuTree> endList = new ArrayList<>();
for (SysFunctionVo f : functionVos) {
//是否是属于funId
if (f.getParentId() != null && funId.equals(f.getParentId())) {
AdminMenuTree menu = new AdminMenuTree();
menu.setId(f.getId());
menu.setPath(f.getPath());
menu.setName(f.getName());
menu.setComponent(f.getComponent());
menu.setRedirect(f.getComponentName());
// 菜单名称
// private String title;
// // 外链/内嵌时链接地址http:xxx.com开启外链条件`1isLink: 链接地址不为空`
// private String isLink;
// // 是否隐藏
// private Boolean isHide;
// // 是否缓存
// private Boolean isKeepAlive;
// // 是否固定
// private Boolean isAffix;
// // 是否内嵌开启条件`1isIframe:true 2isLink链接地址不为空`
// private Boolean isIframe;
// // 权限标识取角色管理
// private String[] roles;
// // 菜单图标
// private String icon;
Map<String, Object> meta = new HashMap<>();
meta.put("title", f.getLanguageCode());
meta.put("isLink", f.getIsLink());
meta.put("isHide", f.getVisible().equals("true"));
meta.put("isKeepAlive", f.getKeepAlive().equals("true"));
meta.put("isAffix", f.getAlwaysShow().equals("true"));
meta.put("isIframe", f.getIsIframe().equals("true"));
if (!StringUtil.isEmpty(f.getPermission())) {
meta.put("roles", f.getPermission().split(","));
}
meta.put("icon", f.getIcon());
menu.setMeta(meta);
List<AdminMenuTree> children = getAdminMenuTree(functionVos, f.getId());
menu.setChildren(children);
endList.add(menu);
}
}
return endList;
}
}

View File

@ -0,0 +1,156 @@
package com.sxpcwlkj.system.service.impl;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.sxpcwlkj.authority.LoginObject;
import com.sxpcwlkj.common.code.entity.CaptchaEntity;
import com.sxpcwlkj.common.enums.DeviceEnum;
import com.sxpcwlkj.common.exception.LoginException;
import com.sxpcwlkj.common.exception.MmsException;
import com.sxpcwlkj.common.exception.TenantException;
import com.sxpcwlkj.common.properties.TenantProperties;
import com.sxpcwlkj.common.utils.IPUtil;
import com.sxpcwlkj.common.utils.StringUtil;
import com.sxpcwlkj.framework.utils.SignUtil;
import com.sxpcwlkj.redis.RedisUtil;
import com.sxpcwlkj.redis.constant.RedisConstant;
import com.sxpcwlkj.system.entity.SysTenant;
import com.sxpcwlkj.system.entity.SysUser;
import com.sxpcwlkj.system.entity.bo.LoginBodyBo;
import com.sxpcwlkj.system.mapper.SysUserMapper;
import com.sxpcwlkj.system.service.SysConfigService;
import com.sxpcwlkj.system.service.SysLoginService;
import com.sxpcwlkj.system.service.SysTenantService;
import com.sxpcwlkj.system.service.SysUserService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.Duration;
import java.util.Date;
import java.util.Map;
/**
* @ClassName SysLoginServiceImpl
* @Description TODO
* @Author 西决
* @Date 2022/12/25 12:06
*/
@RequiredArgsConstructor
@Service("sysLogin")
@Slf4j
public class SysLoginServiceImpl implements SysLoginService {
private final SysTenantService sysTenantService;
private final SysUserService sysUserService;
private final SysUserMapper sysUserMapper;
private final TenantProperties tenantProperties;
private final SysConfigService sysConfigService;
@Override
public String login(HttpServletRequest request,LoginBodyBo loginBodyBo) {
//验证验证码
verfyCaptcha(loginBodyBo.getUsername(), loginBodyBo.getCodeKey(), loginBodyBo.getCode(), loginBodyBo.getUuid());
//用户名与密码验证
SysUser sysUser = sysUserService.selectByUserName(loginBodyBo.getTenantId(), loginBodyBo.getUsername());
// 效验
if (null == sysUser) {
throw new LoginException("账号不存在!");
}
// 账号是否禁用
if (sysUser.getStatus() != 0) {
throw new LoginException("账号已禁用!");
}
//解密数据库的密码
String pressWord = SignUtil.pressWord(loginBodyBo.getPassword(), sysUser.getAesKey());
try {
Assert.equals(pressWord, sysUser.getPassword());
} catch (Exception e) {
log.error(e.getMessage());
throw new LoginException("账号与密码有误!");
}
//验证租户
verfyTenement(sysUser);
//进行登记登记
updateSysUser(request,sysUser);
//获取当前会话的token值
return LoginObject.loginToken(sysUser.getUserId(), DeviceEnum.ADMIN.getType(), 10000000L, "id", sysUser.getUserId());
}
@Override
public void logout() {
LoginObject.logout();
}
/**
* 验证码验证
*
* @param username 用户名
* @param code 验证码
* @param uuid uuid
*/
@Override
public void verfyCaptcha(String username, String codeKey, String code, String uuid) {
if(sysConfigService.getIsOpenCaptcha()){
if(StringUtil.isEmpty(code)){
throw new MmsException("The verification code cannot be empty");
}
Map<String, Object> data = RedisUtil.getCacheObject(uuid);
if (ObjectUtils.isEmpty(data)) {
log.info("登录:验证码失效!");
throw new LoginException("Verification code failure");
}
if (!codeKey.equals(data.get(CaptchaEntity.CODE.CAPTCHA_KEY.getValue()))) {
log.info("登录:验证码与验证对象不匹配!");
throw new LoginException("Verification code does not match the verification object");
}
if (!code.equalsIgnoreCase((String) data.get(CaptchaEntity.CODE.CAPTCHA_VALUE.getValue()))) {
log.info("登录:验证码不匹配!");
throw new LoginException("Verification code does not match");
}
}
return;
}
/**
* 验证租户
*
* @param sysUser
*/
@Override
public void verfyTenement(SysUser sysUser) {
if (tenantProperties.getEnable()) {
//租户
SysTenant sysTenant = sysTenantService.selectById(sysUser.getTenantId());
if (ObjectUtils.isEmpty(sysTenant)) {
log.info("登录用户ID{} 租户不存在.", sysUser.getUserId());
throw new TenantException("tenant.not.exists");
}
if (sysTenant.getStatus() != 0) {
log.info("登录用户ID{} 租户状态为禁用.", sysUser.getUserId());
throw new TenantException("tenant off state");
}
}
}
@Override
public void updateSysUser(HttpServletRequest request,SysUser sysUser) {
sysUser.setLoginIp(IPUtil.getIp(request));
sysUser.setLoginDate(new Date());
sysUserMapper.updateById(sysUser);
}
}

Some files were not shown because too many files have changed in this diff Show More