diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 23210b5..3316f7d 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-flowable-plus com.ruoyi - 0.8.3 + 0.8.2 4.0.0 jar @@ -21,6 +21,7 @@ org.springframework.boot spring-boot-devtools + runtime true @@ -66,6 +67,11 @@ ruoyi-oss + + com.ruoyi + ruoyi-sms + + com.ruoyi @@ -78,6 +84,7 @@ ruoyi-demo + com.ruoyi @@ -105,7 +112,7 @@ - ${project.artifactId} + pay org.springframework.boot diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java index 0153428..50fc468 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java @@ -3,6 +3,7 @@ package com.ruoyi; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; +import org.springframework.scheduling.annotation.EnableScheduling; /** * 启动程序 @@ -11,6 +12,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt */ @SpringBootApplication +@EnableScheduling public class RuoYiApplication { public static void main(String[] args) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java index f5a603a..f0712e4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java @@ -4,21 +4,16 @@ import cn.dev33.satoken.annotation.SaIgnore; import cn.hutool.captcha.AbstractCaptcha; import cn.hutool.captcha.generator.CodeGenerator; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.RandomUtil; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.CaptchaType; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.email.MailUtils; import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.common.utils.reflect.ReflectUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.framework.config.properties.CaptchaProperties; -import com.ruoyi.framework.config.properties.MailProperties; import com.ruoyi.sms.config.properties.SmsProperties; -import com.ruoyi.sms.core.SmsTemplate; -import com.ruoyi.sms.entity.SmsResult; import com.ruoyi.system.service.ISysConfigService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -49,7 +44,6 @@ public class CaptchaController { private final CaptchaProperties captchaProperties; private final SmsProperties smsProperties; private final ISysConfigService configService; - private final MailProperties mailProperties; /** * 短信验证码 @@ -57,45 +51,33 @@ public class CaptchaController { * @param phonenumber 用户手机号 */ @GetMapping("/captchaSms") - public R smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { - if (!smsProperties.getEnabled()) { + public R smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") + String phonenumber) { + //实际使用时放开 + /* if (!smsProperties.getEnabled()) { return R.fail("当前系统没有开启短信功能!"); } + if (!SpringUtils.containsBean("aliyunSmsTemplate")) { + return R.fail("阿里云依赖未引入!"); + }*/ String key = CacheConstants.CAPTCHA_CODE_KEY + phonenumber; - String code = RandomUtil.randomNumbers(4); + + //实际使用时注掉这个 放开下面的代码,注意修改templateId + String code = "1234"; + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + /*String code = RandomUtil.randomNumbers(4); RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); // 验证码模板id 自行处理 (查数据库或写死均可) - String templateId = ""; + String templateId = "SMS_206546421"; //自己阿里云设置的模板id Map map = new HashMap<>(1); map.put("code", code); - SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class); + //SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class); + SmsTemplate smsTemplate = SpringUtils.getBean(AliyunSmsTemplate.class); SmsResult result = smsTemplate.send(phonenumber, templateId, map); if (!result.isSuccess()) { log.error("验证码短信发送异常 => {}", result); return R.fail(result.getMessage()); - } - return R.ok(); - } - - /** - * 邮箱验证码 - * - * @param email 邮箱 - */ - @GetMapping("/captchaEmail") - public R emailCode(@NotBlank(message = "{user.email.not.blank}") String email) { - if (!mailProperties.getEnabled()) { - return R.fail("当前系统没有开启邮箱功能!"); - } - String key = CacheConstants.CAPTCHA_CODE_KEY + email; - String code = RandomUtil.randomNumbers(4); - RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); - try { - MailUtils.sendText(email, "登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。"); - } catch (Exception e) { - log.error("验证码短信发送异常 => {}", e.getMessage()); - return R.fail(e.getMessage()); - } + }*/ return R.ok(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java index f0ecce1..74585fc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java @@ -33,6 +33,7 @@ public class CacheController { private final static List CACHES = new ArrayList<>(); static { + CACHES.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息")); CACHES.add(new SysCache(CacheConstants.ONLINE_TOKEN_KEY, "在线用户")); CACHES.add(new SysCache(CacheNames.SYS_CONFIG, "配置信息")); CACHES.add(new SysCache(CacheNames.SYS_DICT, "数据字典")); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java index 33d425a..b0b574c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java @@ -45,7 +45,7 @@ public class SysUserOnlineController extends BaseController { List keys = StpUtil.searchTokenValue("", 0, -1, false); List userOnlineDTOList = new ArrayList<>(); for (String key : keys) { - String token = StringUtils.substringAfterLast(key, ":"); + String token = key.replace(CacheConstants.LOGIN_TOKEN_KEY, ""); // 如果已经过期则跳过 if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) { continue; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java index 01613db..3a14980 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java @@ -37,7 +37,7 @@ public class SysDictDataController extends BaseController { /** * 查询字典数据列表 */ - @SaCheckPermission("system:dict:list") + // @SaCheckPermission("system:dict:list") @GetMapping("/list") public TableDataInfo list(SysDictData dictData, PageQuery pageQuery) { return dictDataService.selectPageDictDataList(dictData, pageQuery); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index f982a5f..24d58fe 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -5,12 +5,13 @@ import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.EmailLoginBody; import com.ruoyi.common.core.domain.model.LoginBody; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.model.SmsLoginBody; +import com.ruoyi.common.core.service.DictService; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.system.domain.vo.RouterVo; +import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.SysLoginService; @@ -22,9 +23,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.validation.constraints.NotBlank; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.text.ParseException; +import java.util.*; /** * 登录验证 @@ -39,7 +39,9 @@ public class SysLoginController { private final SysLoginService loginService; private final ISysMenuService menuService; private final ISysUserService userService; - + private final SysUserMapper userMapper; + private final DictService dictService; + // private final IAsSubscriptionInfoService iAsSubscriptionInfoService; /** * 登录方法 * @@ -48,17 +50,71 @@ public class SysLoginController { */ @SaIgnore @PostMapping("/login") - public R> login(@Validated @RequestBody LoginBody loginBody) { + /*public R> login(@Validated @RequestBody LoginBody loginBody) throws ParseException { + Map ajax = new HashMap<>(); + // 生成令牌 + String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), + loginBody.getUuid()); + + //除管理员用户外,所有用户根据用户公司拿到到期时间 未到期允许登录 否则不允许登录 + String companyName = LoginHelper.getCompanyName(); + if(companyName!=null&&companyName!=""){ + String expire_time = dictService.getDictValue("expire_time", companyName); + if(expire_time==null||expire_time.equals("")){ + // return R.fail("公司没有系统的使用期限,请联系管理员或开发人员!"); + }else{ + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + int result = format.parse(expire_time).compareTo(new Date()); + if(result<0){ + return R.fail("系统已到期,请联系管理员或开发人员!"); + } + } + } + ajax.put(Constants.TOKEN, token); + return R.ok(ajax); + }*/ + public R> login(@Validated @RequestBody LoginBody loginBody) throws ParseException { Map ajax = new HashMap<>(); // 生成令牌 String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), loginBody.getUuid()); + + //除管理员用户外,所有用户根据用户公司拿到到期时间 未到期允许登录 否则不允许登录 + String companyName = LoginHelper.getCompanyName(); + Long tenantId = LoginHelper.getTenantId(); + /*if(companyName!=null&&companyName!=""){ + //查询订阅信息中的结束时间 + AsSubscriptionInfoBo bo = new AsSubscriptionInfoBo(); + bo.setTenantId(tenantId); + List asSubscriptionInfoVos = iAsSubscriptionInfoService.queryList(bo); + if(asSubscriptionInfoVos!=null&&asSubscriptionInfoVos.size()>0){ + AsSubscriptionInfoVo subscriptionInfo = asSubscriptionInfoVos.get(0); + //截止日期不为空并且激活状态为已激活(默认0已激活) + if(subscriptionInfo.getEndTime()!=null&&subscriptionInfo.getActive().equals("0")){ + Date endTime= subscriptionInfo.getEndTime(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(endTime); + // 在当前日期上加一天(包含失效日期) + calendar.add(Calendar.DAY_OF_MONTH, 1); + Date expireTime = calendar.getTime(); + Date currentTime = new Date(); + int result = expireTime.compareTo(currentTime); + if(result<0){ + return R.fail("系统已到期,请联系管理员或开发人员!"); + } + }else{ + return R.fail("公司没有系统的使用权限,请联系管理员或开发人员!"); + } + }else{ + return R.fail("公司没有订阅信息,请联系管理员或开发人员!"); + } + }*/ ajax.put(Constants.TOKEN, token); return R.ok(ajax); } /** - * 短信登录 + * 短信登录(示例) * * @param smsLoginBody 登录信息 * @return 结果 @@ -73,21 +129,6 @@ public class SysLoginController { return R.ok(ajax); } - /** - * 邮件登录 - * - * @param body 登录信息 - * @return 结果 - */ - @PostMapping("/emailLogin") - public R> emailLogin(@Validated @RequestBody EmailLoginBody body) { - Map ajax = new HashMap<>(); - // 生成令牌 - String token = loginService.emailLogin(body.getEmail(), body.getEmailCode()); - ajax.put(Constants.TOKEN, token); - return R.ok(ajax); - } - /** * 小程序登录(示例) * @@ -123,10 +164,16 @@ public class SysLoginController { public R> getInfo() { LoginUser loginUser = LoginHelper.getLoginUser(); SysUser user = userService.selectUserById(loginUser.getUserId()); + if ("client".equals(user.getUserType())) { + user.setClientId(userMapper.getClientIdByUserId(user.getUserId())); + } else if ("maintenance".equals(user.getUserType())) { + user.setMaintainerId(userMapper.getMaintainerIdByUserId(user.getUserId())); + } Map ajax = new HashMap<>(); ajax.put("user", user); ajax.put("roles", loginUser.getRolePermission()); ajax.put("permissions", loginUser.getMenuPermission()); + ajax.put("companyName",LoginHelper.getCompanyName()); return R.ok(ajax); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java index 2a7cc11..606895a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java @@ -2,7 +2,10 @@ package com.ruoyi.web.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpException; +import cn.hutool.http.HttpUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.PageQuery; @@ -10,6 +13,11 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.validate.QueryGroup; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.file.FileUtils; +import com.ruoyi.oss.core.OssClient; +import com.ruoyi.oss.factory.OssFactory; +import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.domain.bo.SysOssBo; import com.ruoyi.system.domain.vo.SysOssVo; import com.ruoyi.system.service.ISysOssService; @@ -72,7 +80,7 @@ public class SysOssController extends BaseController { @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public R> upload(@RequestPart("file") MultipartFile file) { if (ObjectUtil.isNull(file)) { - return R.fail("上传文件不能为空"); + throw new ServiceException("上传文件不能为空"); } SysOssVo oss = iSysOssService.upload(file); Map map = new HashMap<>(2); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java index 2644582..76922d0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java @@ -1,12 +1,18 @@ package com.ruoyi.web.controller.system; import cn.dev33.satoken.annotation.SaIgnore; +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.RegisterBody; -import com.ruoyi.system.service.ISysConfigService; -import com.ruoyi.system.service.SysRegisterService; +import com.ruoyi.common.core.service.DictService; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.*; import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -24,7 +30,11 @@ public class SysRegisterController extends BaseController { private final SysRegisterService registerService; private final ISysConfigService configService; + private final ISysRoleService roleService; + private final ISysUserService userService; + private final SysLoginService loginService; + private final DictService dictService; /** * 用户注册 */ @@ -37,4 +47,160 @@ public class SysRegisterController extends BaseController { registerService.register(user); return R.ok(); } + //用户注册修改为3步:公司注册——》2添加默认角色(公司注册成功后,系统自动添加)——》3添加用户 + /** + * 公司注册并添加默认角色 + */ +/* @SaIgnore + @PostMapping("/registerGs") + public R> register1(@Validated(AddGroup.class) @RequestBody AsCompanyBo bo) { + //添加验证 手机号相同或者公司名相同不允许注册 + AsCompanyBo queryBo = new AsCompanyBo(); + queryBo.setPhone(bo.getPhone()); + List asCompanyVos = iAsCompanyService.queryList(queryBo); + if(asCompanyVos!=null&&asCompanyVos.size()>0){ + return new R().fail("手机号已注册"); + } + queryBo.setName(bo.getName()); + queryBo.setPhone(null); + List asCompanyVos2 = iAsCompanyService.queryList(queryBo); + if(asCompanyVos2!=null&&asCompanyVos2.size()>0){ + return new R().fail("公司名已注册"); + } + if(iAsCompanyService.insertByBo(bo)){ + //公司注册成功后自动添加3个角色:管理员、客户、运维 + Long[] adids={1655371202140614657L, 1642699828651147266L, 1642699828651147267L, 1642699828651147268L, 1642699828651147269L, 1642699828651147270L, 1642699828651147271L, 1702576150650126337L, 1642699829787803649L, 1642699829787803650L, 1642699829787803651L, 1642699829787803652L, 1642699829787803653L, 1642699829787803654L, 1702576351469207553L, 1642699830664413186L, 1642699830664413187L, 1642699830664413188L, 1642699830664413189L, 1642699830664413190L, 1655482882922754049L, 1655840316736458753L, 1655448497192230913L, 1654661619136454657L, 1655842888306184194L, 1654661698882756610L, 1654661489897365506L, 1642699830664413191L, 1666004221847199746L, 1702576545644511234L, 1645595648910704641L, 1645314322216816642L, 1645314322216816643L, 1645314322216816644L, 1645314322216816645L, 1645314322216816646L, 1645314322216816647L, 1702576946385092610L, 1658662667209936897L, 1658662667209936898L, 1658662667209936899L, 1658662667209936900L, 1658662667209936901L, 1658662667209936902L, 1701529461713534977L, 1645688918156320769L, 1645688918156320770L, 1645688918156320771L, 1645688918156320772L, 1645688918156320773L, 1645688918156320774L, 1702577106473287681L, 1658662668782800897L, 1658662668782800898L, 1658662668782800899L, 1658662668782800900L, 1658662668782800901L, 1658662668782800902L, 1702577252363763714L, 1647137024584462337L, 1647137024584462338L, 1647137024584462339L, 1647137024584462340L, 1647137024584462341L, 1647137024584462342L, 1661650957882208257L, 1702578000103309314L, 1645688916713480193L, 1645688916713480194L, 1645688916713480195L, 1645688916713480196L, 1645688916713480197L, 1645688916713480198L, 1702578372427481090L, 1642699829523562497L, 1642699829523562498L, 1642699829523562499L, 1642699829523562500L, 1642699829523562501L, 1642699829523562502L, 1702581675269914626L, 1642699828978302977L, 1642699828978302978L, 1642699828978302979L, 1642699828978302980L, 1642699828978302981L, 1642699828978302982L, 1701527993971376129L, 1661257205264498690L, 1661257343563284481L, 1662289656452018177L, 1662289815781044225L, 1662289897637081089L, 1662289992025698306L, 1669951329203130370L, 1645314323366055938L, 1702567199455936513L, 1645314323366055939L, 1645314323366055940L, 1645314323366055941L, 1645314323366055942L, 1645314323366055943L, 1642699830974791687L, 1642699830320480257L, 1642699830320480258L, 1642699830320480259L, 1642699830320480260L, 1642699830320480261L, 1642699830320480262L, 1702582089298051073L, 1642699830031073281L, 1642699830031073282L, 1642699830031073283L, 1642699830031073284L, 1642699830031073285L, 1642699830031073286L, 1644533653729988609L, 1702582246030802945L, 1645597336069488641L, 1645688917699141633L, 1645688917699141634L, 1645688917699141635L, 1645688917699141636L, 1645688917699141637L, 1645688917699141638L, 1702582588248260610L, 1642699829242544129L, 1642699829242544130L, 1642699829242544131L, 1642699829242544132L, 1642699829242544133L, 1642699829242544134L, 1702582422652944386L, 1645688917497815042L, 1645688917497815043L, 1645688917497815044L, 1645688917497815045L, 1645688917497815046L, 1645688917497815047L, 1702582710013100034L, 1645329015545835521L, 1645329015545835522L, 1645329015545835523L, 1645329015545835524L, 1645329015545835525L, 1645329015545835526L, 1702582843756871681L, 1645688917900468225L, 1645688917900468226L, 1645688917900468227L, 1645688917900468228L, 1645688917900468229L, 1645688917900468230L, 1702582979249668098L, 1L, 100L, 1001L, 1002L, 1003L, 1004L, 1005L, 1006L, 1007L, 1702585719430414338L, 101L, 1010L, 1011L, 1012L, 1013L, 1702585850393362434L}; + Long[] khids={1655371202140614657L, 1642699828651147266L, 1642699828651147268L, 1642699830664413186L, 1642699830664413187L, 1642699830664413188L, 1642699830664413189L, 1642699830664413190L, 1655482882922754049L, 1655840316736458753L, 1655842888306184194L, 1654661489897365506L, 1702576545644511234L, 1661257205264498690L, 1661257343563284481L, 1662289656452018177L, 1662289815781044225L, 1662289897637081089L, 1662289992025698306L, 1669951329203130370L}; + Long[] wxids = {1702576150650126337L, 1642699829787803649L, 1642699829787803650L, 1642699829787803651L, 1642699829787803652L, 1642699829787803653L, 1642699829787803654L, 1642699830664413186L, 1642699830664413187L, 1642699830664413188L, 1642699830664413189L, 1642699830664413190L, 1655482882922754049L, 1655840316736458753L, 1655448497192230913L, 1654661619136454657L, 1655842888306184194L, 1654661698882756610L, 1654661489897365506L, 1642699830664413191L, 1702576545644511234L, 1702576946385092610L, 1701529461713534977L, 1702577106473287681L, 1702577252363763714L, 1702578372427481090L, 1702581675269914626L, 1701527993971376129L, 1661257205264498690L, 1661257343563284481L, 1662289656452018177L, 1662289815781044225L, 1662289897637081089L, 1662289992025698306L, 1669951329203130370L}; + SysRole role1 = new SysRole(); + role1.setRoleKey("companyAdmin"); + role1.setRoleName("公司管理员"); + role1.setTenantId(bo.getId()); + role1.setStatus("0"); + role1.setRoleSort(0); + role1.setMenuCheckStrictly(false); + role1.setDeptCheckStrictly(true); + role1.setFlag(false); + role1.setMenuIds(adids); + + SysRole role2 = new SysRole(); + role2.setRoleKey("client"); + role2.setRoleName("客户"); + role2.setTenantId(bo.getId()); + role2.setStatus("0"); + role2.setRoleSort(0); + role2.setMenuCheckStrictly(false); + role2.setDeptCheckStrictly(true); + role2.setFlag(false); + role2.setMenuIds(khids); + + SysRole role3 = new SysRole(); + role3.setRoleKey("maintainer"); + role3.setRoleName("维修"); + role3.setTenantId(bo.getId()); + role3.setStatus("0"); + role3.setRoleSort(0); + role3.setMenuCheckStrictly(false); + role3.setDeptCheckStrictly(true); + role3.setFlag(false); + role3.setMenuIds(wxids); + roleService.insertRole(role1); + roleService.insertRole(role2); + roleService.insertRole(role3); + Map data = new HashMap<>(); + List roles = new ArrayList<>(); + roles.add(role1); + roles.add(role2); + roles.add(role3); + // data.put("id",bo.getId()); + data.put("roles",roles); + return new R().ok(data); + }else{ + return new R().fail("注册失败,请重试"); + } + }*/ + /** + * 添加公司管理员用户 + */ + @SaIgnore + @Transactional + @PostMapping("/registerUser") + public R register2(@Validated @RequestBody SysUser user) { + if (!userService.checkUserNameUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkNickNameUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,用户已存在"); + } + user.setPassword(BCrypt.hashpw(user.getPassword())); +/* //1.查询试用的订阅计划信息 2.注册管理员用户同时添加公司的订阅计划——免费试用3月 + AsSubscriptionInfoBo bo = new AsSubscriptionInfoBo(); + AsSubscriptionPlanBo planBo= new AsSubscriptionPlanBo(); + planBo.setName(dictService.getDictValue("trial_plan","sub_name")); //对应字典的使用计划名称查询试用计划 + List asSubscriptionPlanVos = iAsSubscriptionPlanService.queryList(planBo); + if(asSubscriptionPlanVos!=null&&asSubscriptionPlanVos.size()>0){ + Date date = new Date(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); // 设置当前日期 + calendar.add(Calendar.MONTH, 3); // 增加三个月 + Date endDate = calendar.getTime(); // 获取新的日期 + bo.setActive("0"); + bo.setTenantId(user.getTenantId()); + bo.setCompanyName(user.getTenantName()); + bo.setSubplanId(asSubscriptionPlanVos.get(0).getId()); + bo.setSubplanName(asSubscriptionPlanVos.get(0).getName()); + bo.setStartTime(date); + bo.setEndTime(endDate); + bo.setRemark("用户注册默认试用"); + }else{ + bo.setActive("1"); + bo.setTenantId(user.getTenantId()); + bo.setCompanyName(user.getTenantName()); + bo.setEndTime(null); + bo.setStartTime(null); + bo.setRemark("用户注册时未找到试用计划"); + } + iAsSubscriptionInfoService.insertByBo(bo);*/ + user.setTenantName(null); + return toAjax(userService.insertUser(user)); + } + //忘记密码功能分3步:1、发送短信验证码 2、查找是否有该用户并验证短信验证码是否正确 3、验证码通过后修改密码 + //发送手机短信调用CaptchaController的 captchaSms接口发送短信 当前测试用的自己的阿里云账号,先不真正发送短信设置code=1234 + /** + * 验证短信验证码——2分钟 验证码有效期(分钟)Constants接口CAPTCHA_EXPIRATION + * @param phonenumber + * @param smsCode + * @return + */ + @SaIgnore + @PostMapping("/validateSmsCode") + public R validateSmsCode(String phonenumber, String smsCode) { + // 通过手机号查找用户 + SysUser user = loginService.loadUserByPhonenumber(phonenumber); + //验证短信验证码 + if(loginService.validateSmsCode(phonenumber, smsCode)){ + return R.ok(user); + }else{ + return R.fail("验证码错误"); + } + } + + /** + * 密码修改 + * @return + */ + @SaIgnore + @PostMapping("/modifyPass") + public R modifyPass(@RequestBody SysUser user) { + if (ObjectUtil.isNotNull(user.getUserId()) && user.isAdmin()) { + throw new ServiceException("不允许操作超级管理员用户"); + } + //注释掉数据权限验证 userService.checkUserDataScope(user.getUserId()); + user.setPassword(BCrypt.hashpw(user.getPassword())); + System.out.println("用户——"+user.getUserId()+"——通过短信重置密码"); + return toAjax(userService.resetPwd(user)); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java index f8edb5d..cecfcc0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -1,29 +1,38 @@ package com.ruoyi.web.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollUtil; import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.SysUserRole; +import com.ruoyi.system.mapper.SysRoleMapper; import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; -import com.ruoyi.system.service.SysPermissionService; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 角色信息 @@ -39,7 +48,7 @@ public class SysRoleController extends BaseController { private final ISysRoleService roleService; private final ISysUserService userService; private final ISysDeptService deptService; - private final SysPermissionService permissionService; + private final SysRoleMapper baseMapper; /** * 获取角色信息列表 @@ -96,6 +105,17 @@ public class SysRoleController extends BaseController { @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody SysRole role) { + //非admin用户不得修改客户、维修 这两个角色 + if(!LoginHelper.isAdmin()){ + // 获取角色列表 + List sysRoles = baseMapper.selectBatchIds(Arrays.asList(role.getRoleId())); + // 筛选出roleKey=="client"或者"maintainer"的角色 + List collect = sysRoles.stream().filter(sysRole ->"companyAdmin".equals(sysRole.getRoleKey()) || "client".equals(sysRole.getRoleKey()) || "maintainer".equals(sysRole.getRoleKey())).collect(Collectors.toList()); + if (collect.size() > 0) { + throw new ServiceException("不能修改系统角色"); + } + } + roleService.checkRoleAllowed(role); roleService.checkRoleDataScope(role.getRoleId()); if (!roleService.checkRoleNameUnique(role)) { @@ -105,7 +125,25 @@ public class SysRoleController extends BaseController { } if (roleService.updateRole(role) > 0) { - roleService.cleanOnlineUserByRole(role.getRoleId()); + List keys = StpUtil.searchTokenValue("", 0, -1, false); + if (CollUtil.isEmpty(keys)) { + return R.ok(); + } + // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作 + keys.parallelStream().forEach(key -> { + String token = key.replace(CacheConstants.LOGIN_TOKEN_KEY, ""); + // 如果已经过期则跳过 + if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) { + return; + } + LoginUser loginUser = LoginHelper.getLoginUser(token); + if (loginUser.getRoles().stream().anyMatch(r -> r.getRoleId().equals(role.getRoleId()))) { + try { + StpUtil.logoutByTokenValue(token); + } catch (NotLoginException ignored) { + } + } + }); return R.ok(); } return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); @@ -130,6 +168,17 @@ public class SysRoleController extends BaseController { @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") public R changeStatus(@RequestBody SysRole role) { + //非admin用户不得停用公司管理员这个角色 + if(!LoginHelper.isAdmin()){ + // 获取角色列表 + List sysRoles = baseMapper.selectBatchIds(Arrays.asList(role.getRoleId())); + // 筛选出roleKey=="client"或者"maintainer"的角色 + List collect = sysRoles.stream().filter(sysRole ->"companyAdmin".equals(sysRole.getRoleKey())).collect(Collectors.toList()); + if (collect.size() > 0) { + throw new ServiceException("不能停用公司管理员角色"); + } + } + roleService.checkRoleAllowed(role); roleService.checkRoleDataScope(role.getRoleId()); return toAjax(roleService.updateRoleStatus(role)); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index bab44ec..4e56a02 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -41,7 +41,7 @@ import java.util.List; import java.util.Map; /** - * 用户信息 + * 用户管理 * * @author Lion Li */ @@ -56,6 +56,7 @@ public class SysUserController extends BaseController { private final ISysPostService postService; private final ISysDeptService deptService; + /** * 获取用户列表 */ @@ -151,6 +152,8 @@ public class SysUserController extends BaseController { return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkNickNameUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,用户已存在"); } user.setPassword(BCrypt.hashpw(user.getPassword())); return toAjax(userService.insertUser(user)); @@ -185,7 +188,7 @@ public class SysUserController extends BaseController { @DeleteMapping("/{userIds}") public R remove(@PathVariable Long[] userIds) { if (ArrayUtil.contains(userIds, getUserId())) { - return R.fail("当前用户不能删除"); + return R.fail("不能删除当前用户"); } return toAjax(userService.deleteUserByIds(userIds)); } @@ -255,4 +258,44 @@ public class SysUserController extends BaseController { return R.ok(deptService.selectDeptTreeList(dept)); } + /** + * 删除公司信息 + * + * @param ids 主键串 + */ +/* @SaCheckPermission("aftersale:company:remove") + @Log(title = "公司信息", businessType = BusinessType.DELETE) + @Transactional + @DeleteMapping("/company/{ids}") + public R delete(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + for(Long id:ids){ + //公司下有用户的不能删除 + SysUser user = new SysUser(); + user.setTenantId(id); + List users = userService.selectUserList(user); + if(users!=null&&users.size()>0){ + return R.fail("公司下已有用户,不能删除"); + } + } + for(Long id:ids){ + //删除公司下的所有角色 + SysRole role = new SysRole(); + role.setTenantId(id); + List roles = roleService.selectRoleList(role); + if(roles!=null&&roles.size()>0){ + List rids = roles.stream().map(SysRole::getRoleId).collect(Collectors.toList()); + roleService.deleteRoleByIds(rids.toArray(rids.toArray(new Long[rids.size()]))); + } + //删除公司订阅信息 + AsSubscriptionInfoBo subInfo=new AsSubscriptionInfoBo(); + subInfo.setTenantId(id); + List infoVos = iAsSubscriptionInfoService.queryList(subInfo); + List sids = infoVos.stream().map(AsSubscriptionInfoVo::getId).collect(Collectors.toList()); + if(sids!=null&&sids.size()>0){ + iAsSubscriptionInfoService.deleteWithValidByIds(sids,true); + } + } + return toAjax(iAsCompanyService.deleteWithValidByIds(Arrays.asList(ids), true)); + }*/ } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfInstanceController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfInstanceController.java index 5030e9a..4de0cdc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfInstanceController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfInstanceController.java @@ -51,7 +51,6 @@ public class WfInstanceController { * @param instanceId 流程实例ID * @param deleteReason 删除原因 */ - @Deprecated @DeleteMapping(value = "/delete") public R delete(@RequestParam String instanceId, String deleteReason) { instanceService.delete(instanceId, deleteReason); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfProcessController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfProcessController.java index 04f48ad..4aa9173 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfProcessController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfProcessController.java @@ -9,6 +9,7 @@ import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.flowable.core.domain.ProcessQuery; import com.ruoyi.workflow.domain.bo.WfCopyBo; @@ -187,9 +188,9 @@ public class WfProcessController extends BaseController { @GetMapping("/getProcessForm") @SaCheckPermission("workflow:process:start") public R getForm(@RequestParam(value = "definitionId") String definitionId, - @RequestParam(value = "deployId") String deployId, - @RequestParam(value = "procInsId", required = false) String procInsId) { - return R.ok(processService.selectFormContent(definitionId, deployId, procInsId)); + @RequestParam(value = "deployId") String deployId) { + String formContent = processService.selectFormContent(definitionId, deployId); + return R.ok(JsonUtils.parseObject(formContent, Map.class)); } /** @@ -206,17 +207,6 @@ public class WfProcessController extends BaseController { } - /** - * 删除流程实例 - * - * @param instanceIds 流程实例ID串 - */ - @DeleteMapping("/instance/{instanceIds}") - public R delete(@PathVariable String[] instanceIds) { - processService.deleteProcessByIds(instanceIds); - return R.ok(); - } - /** * 读取xml文件 * @param processDefId 流程定义ID diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfTaskController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfTaskController.java index 97b0ec8..01345c3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfTaskController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfTaskController.java @@ -31,7 +31,7 @@ public class WfTaskController { private final IWfTaskService flowTaskService; /** - * 取消流程 + * 取消申请 */ @PostMapping(value = "/stopProcess") @SaCheckPermission("workflow:process:cancel") diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 33ad318..dd8cdcd 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -53,13 +53,13 @@ spring: username: root password: hs123456 # 从库数据源 - slave: - lazy: true - type: ${spring.datasource.type} - driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/ry-flowable-plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true - username: - password: +# slave: +# lazy: true +# type: ${spring.datasource.type} +# driverClassName: com.mysql.cj.jdbc.Driver +# url: jdbc:mysql://localhost:3306/ry-flowable-plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true +# username: +# password: # oracle: # type: ${spring.datasource.type} # driverClassName: oracle.jdbc.OracleDriver diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 85f6e93..a275fa7 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -14,7 +14,7 @@ spring.boot.admin.client: --- # xxl-job 配置 xxl.job: # 执行器开关 - enabled: true + enabled: false # 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。 admin-addresses: http://localhost:9100/xxl-job-admin # 执行器通讯TOKEN:非空时启用 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 00da41f..b4be53e 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -53,7 +53,7 @@ logging: level: com.ruoyi: @logging.level@ org.springframework: warn - config: classpath:logback-plus.xml + config: classpath:logback.xml # 用户配置 user: diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties index ffdd8f3..4ff55f4 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -18,7 +18,6 @@ user.password.not.blank=用户密码不能为空 user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间 user.password.not.valid=* 5-50个字符 user.email.not.valid=邮箱格式错误 -user.email.not.blank=邮箱不能为空 user.phonenumber.not.blank=用户手机号不能为空 user.mobile.phone.number.not.valid=手机号格式错误 user.login.success=登录成功 @@ -43,7 +42,4 @@ rate.limiter.message=访问过于频繁,请稍候再试 sms.code.not.blank=短信验证码不能为空 sms.code.retry.limit.count=短信验证码输入错误{0}次 sms.code.retry.limit.exceed=短信验证码输入错误{0}次,帐户锁定{1}分钟 -email.code.not.blank=邮箱验证码不能为空 -email.code.retry.limit.count=邮箱验证码输入错误{0}次 -email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,帐户锁定{1}分钟 xcx.code.not.blank=小程序code不能为空 diff --git a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties index c1ca439..c0faca9 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties @@ -18,7 +18,6 @@ user.password.not.blank=Password cannot be empty user.password.length.valid=Password length must be between {min} and {max} characters user.password.not.valid=* 5-50 characters user.email.not.valid=Mailbox format error -user.email.not.blank=Mailbox cannot be blank user.phonenumber.not.blank=Phone number cannot be blank user.mobile.phone.number.not.valid=Phone number format error user.login.success=Login successful @@ -43,7 +42,4 @@ rate.limiter.message=Visit too frequently, please try again later sms.code.not.blank=Sms code cannot be blank sms.code.retry.limit.count=Sms code input error {0} times sms.code.retry.limit.exceed=Sms code input error {0} times, account locked for {1} minutes -email.code.not.blank=Email code cannot be blank -email.code.retry.limit.count=Email code input error {0} times -email.code.retry.limit.exceed=Email code input error {0} times, account locked for {1} minutes xcx.code.not.blank=Mini program code cannot be blank diff --git a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties index ffdd8f3..4ff55f4 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties @@ -18,7 +18,6 @@ user.password.not.blank=用户密码不能为空 user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间 user.password.not.valid=* 5-50个字符 user.email.not.valid=邮箱格式错误 -user.email.not.blank=邮箱不能为空 user.phonenumber.not.blank=用户手机号不能为空 user.mobile.phone.number.not.valid=手机号格式错误 user.login.success=登录成功 @@ -43,7 +42,4 @@ rate.limiter.message=访问过于频繁,请稍候再试 sms.code.not.blank=短信验证码不能为空 sms.code.retry.limit.count=短信验证码输入错误{0}次 sms.code.retry.limit.exceed=短信验证码输入错误{0}次,帐户锁定{1}分钟 -email.code.not.blank=邮箱验证码不能为空 -email.code.retry.limit.count=邮箱验证码输入错误{0}次 -email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,帐户锁定{1}分钟 xcx.code.not.blank=小程序code不能为空 diff --git a/ruoyi-admin/src/main/resources/ip2region.xdb b/ruoyi-admin/src/main/resources/ip2region.xdb deleted file mode 100644 index 31f96a1..0000000 Binary files a/ruoyi-admin/src/main/resources/ip2region.xdb and /dev/null differ diff --git a/ruoyi-admin/src/main/resources/logback-plus.xml b/ruoyi-admin/src/main/resources/logback-plus.xml deleted file mode 100644 index 40fa33b..0000000 --- a/ruoyi-admin/src/main/resources/logback-plus.xml +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - ${console.log.pattern} - utf-8 - - - - - - ${log.path}/sys-console.log - - - ${log.path}/sys-console.%d{yyyy-MM-dd}.log - - 1 - - - ${log.pattern} - utf-8 - - - - INFO - - - - - - ${log.path}/sys-info.log - - - - ${log.path}/sys-info.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - - - INFO - - ACCEPT - - DENY - - - - - ${log.path}/sys-error.log - - - - ${log.path}/sys-error.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - - - ERROR - - ACCEPT - - DENY - - - - - - - 0 - - 512 - - - - - - - - 0 - - 512 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ruoyi-admin/src/test/java/com/ruoyi/test/DemoUnitTest.java b/ruoyi-admin/src/test/java/com/ruoyi/test/DemoUnitTest.java deleted file mode 100644 index a40fd82..0000000 --- a/ruoyi-admin/src/test/java/com/ruoyi/test/DemoUnitTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.ruoyi.test; - -import com.ruoyi.common.config.RuoYiConfig; -import org.junit.jupiter.api.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.concurrent.TimeUnit; - -/** - * 单元测试案例 - * - * @author Lion Li - */ -@SpringBootTest // 此注解只能在 springboot 主包下使用 需包含 main 方法与 yml 配置文件 -@DisplayName("单元测试案例") -public class DemoUnitTest { - - @Autowired - private RuoYiConfig ruoYiConfig; - - @DisplayName("测试 @SpringBootTest @Test @DisplayName 注解") - @Test - public void testTest() { - System.out.println(ruoYiConfig); - } - - @Disabled - @DisplayName("测试 @Disabled 注解") - @Test - public void testDisabled() { - System.out.println(ruoYiConfig); - } - - @Timeout(value = 2L, unit = TimeUnit.SECONDS) - @DisplayName("测试 @Timeout 注解") - @Test - public void testTimeout() throws InterruptedException { - Thread.sleep(3000); - System.out.println(ruoYiConfig); - } - - - @DisplayName("测试 @RepeatedTest 注解") - @RepeatedTest(3) - public void testRepeatedTest() { - System.out.println(666); - } - - @BeforeAll - public static void testBeforeAll() { - System.out.println("@BeforeAll =================="); - } - - @BeforeEach - public void testBeforeEach() { - System.out.println("@BeforeEach =================="); - } - - @AfterEach - public void testAfterEach() { - System.out.println("@AfterEach =================="); - } - - @AfterAll - public static void testAfterAll() { - System.out.println("@AfterAll =================="); - } - -} diff --git a/ruoyi-admin/src/test/java/com/ruoyi/test/ParamUnitTest.java b/ruoyi-admin/src/test/java/com/ruoyi/test/ParamUnitTest.java deleted file mode 100644 index 04bf1b5..0000000 --- a/ruoyi-admin/src/test/java/com/ruoyi/test/ParamUnitTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.ruoyi.test; - -import com.ruoyi.common.enums.UserType; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; -import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - -/** - * 带参数单元测试案例 - * - * @author Lion Li - */ -@DisplayName("带参数单元测试案例") -public class ParamUnitTest { - - @DisplayName("测试 @ValueSource 注解") - @ParameterizedTest - @ValueSource(strings = {"t1", "t2", "t3"}) - public void testValueSource(String str) { - System.out.println(str); - } - - @DisplayName("测试 @NullSource 注解") - @ParameterizedTest - @NullSource - public void testNullSource(String str) { - System.out.println(str); - } - - @DisplayName("测试 @EnumSource 注解") - @ParameterizedTest - @EnumSource(UserType.class) - public void testEnumSource(UserType type) { - System.out.println(type.getUserType()); - } - - @DisplayName("测试 @MethodSource 注解") - @ParameterizedTest - @MethodSource("getParam") - public void testMethodSource(String str) { - System.out.println(str); - } - - public static Stream getParam() { - List list = new ArrayList<>(); - list.add("t1"); - list.add("t2"); - list.add("t3"); - return list.stream(); - } - - @BeforeEach - public void testBeforeEach() { - System.out.println("@BeforeEach =================="); - } - - @AfterEach - public void testAfterEach() { - System.out.println("@AfterEach =================="); - } - - -} diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 664d4d4..c8c413f 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -5,7 +5,7 @@ ruoyi-flowable-plus com.ruoyi - 0.8.3 + 0.8.2 4.0.0 @@ -78,6 +78,18 @@ com.baomidou mybatis-plus-boot-starter + + + + jsqlparser + com.github.jsqlparser + + + + + com.github.jsqlparser + jsqlparser + 4.3 @@ -159,12 +171,6 @@ bcprov-jdk15to18 - - - org.lionsoul - ip2region - - diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java index 0fb2c3f..1cdf07e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -7,6 +7,11 @@ package com.ruoyi.common.constant; */ public interface CacheConstants { + /** + * 登录用户 redis key + */ + String LOGIN_TOKEN_KEY = "Authorization:login:token:"; + /** * 在线用户 redis key */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheNames.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheNames.java index 7d4164b..1396b6d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheNames.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheNames.java @@ -35,11 +35,6 @@ public interface CacheNames { */ String SYS_USER_NAME = "sys_user_name#30d"; - /** - * 用户昵称 - */ - String SYS_NICK_NAME = "sys_nick_name#30d"; - /** * 部门 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index e634ed2..b0b6ad4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -32,6 +32,11 @@ public interface Constants { */ String HTTPS = "https://"; + /** + * 资源映射路径 前缀 + */ + String RESOURCE_PREFIX = "/profile"; + /** * 通用成功标识 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java index 4a095fa..ebe1d3e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java @@ -11,6 +11,8 @@ public interface UserConstants { * 平台内系统用户的唯一标志 */ String SYS_USER = "SYS_USER"; + String CLIENT = "client"; + String MAINTENANCE = "maintenance"; /** * 正常状态 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/RoleDTO.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/RoleDTO.java index e25243f..d610744 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/RoleDTO.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/RoleDTO.java @@ -30,6 +30,11 @@ public class RoleDTO implements Serializable { */ private String roleKey; + /** + * 所属公司 + */ + private Long tenantId; + /** * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java index 5949569..7b600ce 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java @@ -61,6 +61,12 @@ public class SysRole extends BaseEntity { @NotNull(message = "显示顺序不能为空") private Integer roleSort; + /** + * 所属公司 + */ + @ExcelProperty(value = "所属公司ID") + private Long tenantId; + /** * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index c1a5342..f849dda 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -1,6 +1,5 @@ package com.ruoyi.common.core.domain.entity; -import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; @@ -37,16 +36,20 @@ public class SysUser extends BaseEntity { @TableId(value = "user_id") private Long userId; + /** + * 部门ID + */ + private Long deptId; + /** * 租户ID */ - @ExcelProperty(value = "所属租户ID") private Long tenantId; /** - * 部门ID + * 租户公司名称 */ - private Long deptId; + private String tenantName; /** * 用户账号 @@ -68,6 +71,16 @@ public class SysUser extends BaseEntity { */ private String userType; + /** + * 客户ID + */ + private Long clientId; + + /** + * 维修工ID + */ + private Long maintainerId; + /** * 用户邮箱 */ @@ -79,7 +92,7 @@ public class SysUser extends BaseEntity { /** * 手机号码 */ - @Sensitive(strategy = SensitiveStrategy.PHONE) + //@Sensitive(strategy = SensitiveStrategy.PHONE) private String phonenumber; /** @@ -140,6 +153,18 @@ public class SysUser extends BaseEntity { @TableField(exist = false) private SysDept dept; + /** + * 客户地址 + */ + @TableField(exist = false) + private String address; + + /** + * 客户类型 + */ + @TableField(exist = false) + private String companyType; + /** * 角色对象 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/EmailLoginBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/EmailLoginBody.java deleted file mode 100644 index b7bf81b..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/EmailLoginBody.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ruoyi.common.core.domain.model; - -import lombok.Data; - -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; - -/** - * 短信登录对象 - * - * @author Lion Li - */ - -@Data -public class EmailLoginBody { - - /** - * 邮箱 - */ - @NotBlank(message = "{user.email.not.blank}") - @Email(message = "{user.email.not.valid}") - private String email; - - /** - * 邮箱code - */ - @NotBlank(message = "{email.code.not.blank}") - private String emailCode; - -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java index 2821393..d4592c4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java @@ -25,6 +25,11 @@ public class LoginUser implements Serializable { */ private Long userId; + /** + * 部门ID + */ + private Long deptId; + /** * 公司ID */ @@ -35,11 +40,6 @@ public class LoginUser implements Serializable { */ private String companyName; - /** - * 部门ID - */ - private Long deptId; - /** * 部门名 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsLoginBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsLoginBody.java index b12e74c..ce774ac 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsLoginBody.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsLoginBody.java @@ -14,13 +14,13 @@ import javax.validation.constraints.NotBlank; public class SmsLoginBody { /** - * 手机号 + * 用户名 */ @NotBlank(message = "{user.phonenumber.not.blank}") private String phonenumber; /** - * 短信code + * 用户密码 */ @NotBlank(message = "{sms.code.not.blank}") private String smsCode; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java index 0a8539a..251e04d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.*; +import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.toolkit.Db; import com.ruoyi.common.utils.BeanCopyUtils; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java index 0d98240..a2da2f9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java @@ -14,13 +14,4 @@ public interface UserService { * @return 用户账户 */ String selectUserNameById(Long userId); - - /** - * 通过用户ID查询用户昵称 - * - * @param userId 用户ID - * @return 用户昵称 - */ - String selectNickNameById(Long userId); - } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/LoginType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/LoginType.java index 875e476..c91a4b9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/LoginType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/LoginType.java @@ -22,11 +22,6 @@ public enum LoginType { */ SMS("sms.code.retry.limit.exceed", "sms.code.retry.limit.count"), - /** - * 邮箱登录 - */ - EMAIL("email.code.retry.limit.exceed", "email.code.retry.limit.count"), - /** * 小程序登录 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java index 2a3fc3b..6cd6d28 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java @@ -42,7 +42,7 @@ public class DefaultExcelListener extends AnalysisEventListener implements private ExcelResult excelResult; public DefaultExcelListener(boolean isValidate) { - this.excelResult = new DefaultExcelResult<>(); + this.excelResult = new DefautExcelResult<>(); this.isValidate = isValidate; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelResult.java deleted file mode 100644 index 5ef65bf..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelResult.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.ruoyi.common.excel; - -import cn.hutool.core.util.StrUtil; -import lombok.Setter; - -import java.util.ArrayList; -import java.util.List; - -/** - * 默认excel返回对象 - * - * @author Yjoioooo - * @author Lion Li - */ -public class DefaultExcelResult implements ExcelResult { - - /** - * 数据对象list - */ - @Setter - private List list; - - /** - * 错误信息列表 - */ - @Setter - private List errorList; - - public DefaultExcelResult() { - this.list = new ArrayList<>(); - this.errorList = new ArrayList<>(); - } - - public DefaultExcelResult(List list, List errorList) { - this.list = list; - this.errorList = errorList; - } - - public DefaultExcelResult(ExcelResult excelResult) { - this.list = excelResult.getList(); - this.errorList = excelResult.getErrorList(); - } - - @Override - public List getList() { - return list; - } - - @Override - public List getErrorList() { - return errorList; - } - - /** - * 获取导入回执 - * - * @return 导入回执 - */ - @Override - public String getAnalysis() { - int successCount = list.size(); - int errorCount = errorList.size(); - if (successCount == 0) { - return "读取失败,未解析到数据"; - } else { - if (errorCount == 0) { - return StrUtil.format("恭喜您,全部读取成功!共{}条", successCount); - } else { - return ""; - } - } - } -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java index 33e0a78..1960356 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java @@ -66,7 +66,7 @@ public class DataBaseHelper { // instr(',0,100,101,' , ',100,') <> 0 return "instr(','||" + var2 + "||',' , '," + var + ",') <> 0"; } - // find_in_set('100' , '0,100,101') - return "find_in_set('" + var + "' , " + var2 + ") <> 0"; + // find_in_set(100 , '0,100,101') + return "find_in_set(" + var + " , " + var2 + ") <> 0"; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java index c3b8b47..e2b1129 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java @@ -10,7 +10,6 @@ import lombok.NoArgsConstructor; import java.util.HashMap; import java.util.Map; -import java.util.function.Supplier; /** * 数据权限助手 @@ -62,32 +61,4 @@ public class DataPermissionHelper { InterceptorIgnoreHelper.clearIgnoreStrategy(); } - /** - * 在忽略数据权限中执行 - * - * @param handle 处理执行方法 - */ - public static void ignore(Runnable handle) { - enableIgnore(); - try { - handle.run(); - } finally { - disableIgnore(); - } - } - - /** - * 在忽略数据权限中执行 - * - * @param handle 处理执行方法 - */ - public static T ignore(Supplier handle) { - enableIgnore(); - try { - return handle.get(); - } finally { - disableIgnore(); - } - } - } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java index c0c8775..ff6d60d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java @@ -116,6 +116,18 @@ public class LoginHelper { return getLoginUser().getNickName(); } + /** + * 获取用户所属单位 + */ + public static Long getTenantId() { return getLoginUser().getTenantId(); } + + /** + * 获取用户所属单位名称 + */ + public static String getCompanyName() { + return getLoginUser().getCompanyName(); + } + /** * 获取用户类型 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/DeptNameTranslationImpl.java b/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/DeptNameTranslationImpl.java index ada3c25..6919617 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/DeptNameTranslationImpl.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/DeptNameTranslationImpl.java @@ -18,8 +18,7 @@ import org.springframework.stereotype.Component; public class DeptNameTranslationImpl implements TranslationInterface { private final DeptService deptService; - - @Override + public String translation(Object key, String other) { return deptService.selectDeptNameByIds(key.toString()); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/DictTypeTranslationImpl.java b/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/DictTypeTranslationImpl.java index 1e97b66..210312c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/DictTypeTranslationImpl.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/DictTypeTranslationImpl.java @@ -20,7 +20,6 @@ public class DictTypeTranslationImpl implements TranslationInterface { private final DictService dictService; - @Override public String translation(Object key, String other) { if (key instanceof String && StringUtils.isNotBlank(other)) { return dictService.getDictLabel(other, key.toString()); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/OssUrlTranslationImpl.java b/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/OssUrlTranslationImpl.java index 863e4d6..69ebd9a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/OssUrlTranslationImpl.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/OssUrlTranslationImpl.java @@ -19,7 +19,6 @@ public class OssUrlTranslationImpl implements TranslationInterface { private final OssService ossService; - @Override public String translation(Object key, String other) { return ossService.selectUrlByIds(key.toString()); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/UserNameTranslationImpl.java b/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/UserNameTranslationImpl.java index eccf1c8..36fd6c3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/UserNameTranslationImpl.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/UserNameTranslationImpl.java @@ -19,7 +19,6 @@ public class UserNameTranslationImpl implements TranslationInterface { private final UserService userService; - @Override public String translation(Object key, String other) { if (key instanceof Long) { return userService.selectUserNameById((Long) key); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/EncryptUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/EncryptUtils.java deleted file mode 100644 index 691b6c0..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/EncryptUtils.java +++ /dev/null @@ -1,243 +0,0 @@ -package com.ruoyi.common.utils; - -import cn.hutool.core.codec.Base64; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.crypto.SecureUtil; -import cn.hutool.crypto.SmUtil; -import cn.hutool.crypto.asymmetric.KeyType; -import cn.hutool.crypto.asymmetric.RSA; -import cn.hutool.crypto.asymmetric.SM2; - -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; - -/** - * 安全相关工具类 - * - * @author 老马 - */ -public class EncryptUtils { - /** - * 公钥 - */ - public static final String PUBLIC_KEY = "publicKey"; - /** - * 私钥 - */ - public static final String PRIVATE_KEY = "privateKey"; - - /** - * Base64加密 - * - * @param data 待加密数据 - * @return 加密后字符串 - */ - public static String encryptByBase64(String data) { - return Base64.encode(data, StandardCharsets.UTF_8); - } - - /** - * Base64解密 - * - * @param data 待解密数据 - * @return 解密后字符串 - */ - public static String decryptByBase64(String data) { - return Base64.decodeStr(data, StandardCharsets.UTF_8); - } - - /** - * AES加密 - * - * @param data 待解密数据 - * @param password 秘钥字符串 - * @return 加密后字符串, 采用Base64编码 - */ - public static String encryptByAes(String data, String password) { - if (StrUtil.isBlank(password)) { - throw new IllegalArgumentException("AES需要传入秘钥信息"); - } - // aes算法的秘钥要求是16位、24位、32位 - int[] array = {16, 24, 32}; - if (!ArrayUtil.contains(array, password.length())) { - throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位"); - } - return SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8)).encryptBase64(data, StandardCharsets.UTF_8); - } - - /** - * AES解密 - * - * @param data 待解密数据 - * @param password 秘钥字符串 - * @return 解密后字符串 - */ - public static String decryptByAes(String data, String password) { - if (StrUtil.isBlank(password)) { - throw new IllegalArgumentException("AES需要传入秘钥信息"); - } - // aes算法的秘钥要求是16位、24位、32位 - int[] array = {16, 24, 32}; - if (!ArrayUtil.contains(array, password.length())) { - throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位"); - } - return SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8)).decryptStr(data, StandardCharsets.UTF_8); - } - - /** - * sm4加密 - * - * @param data 待加密数据 - * @param password 秘钥字符串 - * @return 加密后字符串, 采用Base64编码 - */ - public static String encryptBySm4(String data, String password) { - if (StrUtil.isBlank(password)) { - throw new IllegalArgumentException("SM4需要传入秘钥信息"); - } - // sm4算法的秘钥要求是16位长度 - int sm4PasswordLength = 16; - if (sm4PasswordLength != password.length()) { - throw new IllegalArgumentException("SM4秘钥长度要求为16位"); - } - return SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)).encryptBase64(data, StandardCharsets.UTF_8); - } - - /** - * sm4解密 - * - * @param data 待解密数据 - * @param password 秘钥字符串 - * @return 解密后字符串 - */ - public static String decryptBySm4(String data, String password) { - if (StrUtil.isBlank(password)) { - throw new IllegalArgumentException("SM4需要传入秘钥信息"); - } - // sm4算法的秘钥要求是16位长度 - int sm4PasswordLength = 16; - if (sm4PasswordLength != password.length()) { - throw new IllegalArgumentException("SM4秘钥长度要求为16位"); - } - return SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)).decryptStr(data, StandardCharsets.UTF_8); - } - - /** - * 产生sm2加解密需要的公钥和私钥 - * - * @return 公私钥Map - */ - public static Map generateSm2Key() { - Map keyMap = new HashMap<>(2); - SM2 sm2 = SmUtil.sm2(); - keyMap.put(PRIVATE_KEY, sm2.getPrivateKeyBase64()); - keyMap.put(PUBLIC_KEY, sm2.getPublicKeyBase64()); - return keyMap; - } - - /** - * sm2公钥加密 - * - * @param data 待加密数据 - * @param publicKey 公钥 - * @return 加密后字符串, 采用Base64编码 - */ - public static String encryptBySm2(String data, String publicKey) { - if (StrUtil.isBlank(publicKey)) { - throw new IllegalArgumentException("SM2需要传入公钥进行加密"); - } - SM2 sm2 = SmUtil.sm2(null, publicKey); - return sm2.encryptBase64(data, StandardCharsets.UTF_8, KeyType.PublicKey); - } - - /** - * sm2私钥解密 - * - * @param data 待加密数据 - * @param privateKey 私钥 - * @return 解密后字符串 - */ - public static String decryptBySm2(String data, String privateKey) { - if (StrUtil.isBlank(privateKey)) { - throw new IllegalArgumentException("SM2需要传入私钥进行解密"); - } - SM2 sm2 = SmUtil.sm2(privateKey, null); - return sm2.decryptStr(data, KeyType.PrivateKey, StandardCharsets.UTF_8); - } - - /** - * 产生RSA加解密需要的公钥和私钥 - * - * @return 公私钥Map - */ - public static Map generateRsaKey() { - Map keyMap = new HashMap<>(2); - RSA rsa = SecureUtil.rsa(); - keyMap.put(PRIVATE_KEY, rsa.getPrivateKeyBase64()); - keyMap.put(PUBLIC_KEY, rsa.getPublicKeyBase64()); - return keyMap; - } - - /** - * rsa公钥加密 - * - * @param data 待加密数据 - * @param publicKey 公钥 - * @return 加密后字符串, 采用Base64编码 - */ - public static String encryptByRsa(String data, String publicKey) { - if (StrUtil.isBlank(publicKey)) { - throw new IllegalArgumentException("RSA需要传入公钥进行加密"); - } - RSA rsa = SecureUtil.rsa(null, publicKey); - return rsa.encryptBase64(data, StandardCharsets.UTF_8, KeyType.PublicKey); - } - - /** - * rsa私钥解密 - * - * @param data 待加密数据 - * @param privateKey 私钥 - * @return 解密后字符串 - */ - public static String decryptByRsa(String data, String privateKey) { - if (StrUtil.isBlank(privateKey)) { - throw new IllegalArgumentException("RSA需要传入私钥进行解密"); - } - RSA rsa = SecureUtil.rsa(privateKey, null); - return rsa.decryptStr(data, KeyType.PrivateKey, StandardCharsets.UTF_8); - } - - /** - * md5加密 - * - * @param data 待加密数据 - * @return 加密后字符串, 采用Hex编码 - */ - public static String encryptByMd5(String data) { - return SecureUtil.md5(data); - } - - /** - * sha256加密 - * - * @param data 待加密数据 - * @return 加密后字符串, 采用Hex编码 - */ - public static String encryptBySha256(String data) { - return SecureUtil.sha256(data); - } - - /** - * sm3加密 - * - * @param data 待加密数据 - * @return 加密后字符串, 采用Hex编码 - */ - public static String encryptBySm3(String data) { - return SmUtil.sm3(data); - } - -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java index 6ca97fe..e3cf52e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java @@ -37,4 +37,23 @@ public class MimeTypeUtils { // pdf "pdf"}; + public static String getExtension(String prefix) + { + switch (prefix) + { + case IMAGE_PNG: + return "png"; + case IMAGE_JPG: + return "jpg"; + case IMAGE_JPEG: + return "jpeg"; + case IMAGE_BMP: + return "bmp"; + case IMAGE_GIF: + return "gif"; + default: + return ""; + } + } + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java index 9bf203b..8d3515e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java @@ -1,7 +1,12 @@ package com.ruoyi.common.utils.ip; +import cn.hutool.core.lang.Dict; import cn.hutool.core.net.NetUtil; import cn.hutool.http.HtmlUtil; +import cn.hutool.http.HttpUtil; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.StringUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -16,18 +21,40 @@ import lombok.extern.slf4j.Slf4j; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class AddressUtils { + // IP地址查询 + public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; + // 未知地址 public static final String UNKNOWN = "XX XX"; public static String getRealAddressByIP(String ip) { + String address = UNKNOWN; if (StringUtils.isBlank(ip)) { - return UNKNOWN; + return address; } // 内网不查询 ip = "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip); if (NetUtil.isInnerIP(ip)) { return "内网IP"; } - return RegionUtils.getCityInfo(ip); + if (RuoYiConfig.isAddressEnabled()) { + try { + String rspStr = HttpUtil.createGet(IP_URL) + .body("ip=" + ip + "&json=true", Constants.GBK) + .execute() + .body(); + if (StringUtils.isEmpty(rspStr)) { + log.error("获取地理位置异常 {}", ip); + return UNKNOWN; + } + Dict obj = JsonUtils.parseMap(rspStr); + String region = obj.getStr("pro"); + String city = obj.getStr("city"); + return String.format("%s %s", region, city); + } catch (Exception e) { + log.error("获取地理位置异常 {}", ip); + } + } + return UNKNOWN; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/RegionUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/RegionUtils.java deleted file mode 100644 index 581061a..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/RegionUtils.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.ruoyi.common.utils.ip; - -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.resource.ClassPathResource; -import cn.hutool.core.util.ObjectUtil; -import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.file.FileUtils; -import lombok.extern.slf4j.Slf4j; -import org.lionsoul.ip2region.xdb.Searcher; - -import java.io.File; - -/** - * 根据ip地址定位工具类,离线方式 - * 参考地址:集成 ip2region 实现离线IP地址定位库 - * - * @author lishuyan - */ -@Slf4j -public class RegionUtils { - - private static final Searcher SEARCHER; - - static { - String fileName = "/ip2region.xdb"; - File existFile = FileUtils.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName); - if (!FileUtils.exist(existFile)) { - ClassPathResource fileStream = new ClassPathResource(fileName); - if (ObjectUtil.isEmpty(fileStream.getStream())) { - throw new ServiceException("RegionUtils初始化失败,原因:IP地址库数据不存在!"); - } - FileUtils.writeFromStream(fileStream.getStream(), existFile); - } - - String dbPath = existFile.getPath(); - - // 1、从 dbPath 加载整个 xdb 到内存。 - byte[] cBuff; - try { - cBuff = Searcher.loadContentFromFile(dbPath); - } catch (Exception e) { - throw new ServiceException("RegionUtils初始化失败,原因:从ip2region.xdb文件加载内容失败!" + e.getMessage()); - } - // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。 - try { - SEARCHER = Searcher.newWithBuffer(cBuff); - } catch (Exception e) { - throw new ServiceException("RegionUtils初始化失败,原因:" + e.getMessage()); - } - } - - /** - * 根据IP地址离线获取城市 - */ - public static String getCityInfo(String ip) { - try { - ip = ip.trim(); - // 3、执行查询 - String region = SEARCHER.search(ip); - return region.replace("0|", "").replace("|0", ""); - } catch (Exception e) { - log.error("IP地址离线获取城市异常 {}", ip); - return "未知"; - } - } -} diff --git a/ruoyi-demo/pom.xml b/ruoyi-demo/pom.xml index 2328512..2334836 100644 --- a/ruoyi-demo/pom.xml +++ b/ruoyi-demo/pom.xml @@ -5,7 +5,7 @@ ruoyi-flowable-plus com.ruoyi - 0.8.3 + 0.8.2 4.0.0 @@ -29,10 +29,10 @@ - - - - + + com.aliyun + dysmsapi20170525 + diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java index d040195..ee2e530 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java @@ -49,16 +49,4 @@ public class RedisRateLimiterController { return R.ok("操作成功", value); } - /** - * 测试请求IP限流(key基于参数获取) - * 同一IP请求受影响 - * - * 简单变量获取 #变量 复杂表达式 #{#变量 != 1 ? 1 : 0} - */ - @RateLimiter(count = 2, time = 10, limitType = LimitType.IP, key = "#value") - @GetMapping("/testObj") - public R testObj(String value) { - return R.ok("操作成功", value); - } - } diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml index a62ce18..84a5d80 100644 --- a/ruoyi-extend/pom.xml +++ b/ruoyi-extend/pom.xml @@ -5,7 +5,7 @@ ruoyi-flowable-plus com.ruoyi - 0.8.3 + 0.8.2 4.0.0 ruoyi-extend diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 4fedc79..76da696 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-extend com.ruoyi - 0.8.3 + 0.8.2 4.0.0 jar diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml index 1b729ef..22ef1ab 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml @@ -6,9 +6,6 @@ spring: profiles: active: @profiles.active@ -logging: - config: classpath:logback-plus.xml - --- # 监控中心服务端配置 spring: security: diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/logback-plus.xml b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/logback-plus.xml deleted file mode 100644 index 16bb937..0000000 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/logback-plus.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - logback - - - - - - - ${console.log.pattern} - utf-8 - - - - - ${log.path}.log - - ${log.path}.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - - - - - - - - \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml index ef29a34..8abec22 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml @@ -4,7 +4,7 @@ ruoyi-extend com.ruoyi - 0.8.3 + 0.8.2 ruoyi-xxl-job-admin jar diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java index 5cbf872..82ec2de 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java @@ -1,6 +1,5 @@ package com.xxl.job.admin.controller; -import com.xxl.job.admin.controller.annotation.PermissionLimit; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobRegistry; import com.xxl.job.admin.core.util.I18nUtil; @@ -36,14 +35,12 @@ public class JobGroupController { private XxlJobRegistryDao xxlJobRegistryDao; @RequestMapping - @PermissionLimit(adminuser = true) public String index(Model model) { return "jobgroup/jobgroup.index"; } @RequestMapping("/pageList") @ResponseBody - @PermissionLimit(adminuser = true) public Map pageList(HttpServletRequest request, @RequestParam(required = false, defaultValue = "0") int start, @RequestParam(required = false, defaultValue = "10") int length, @@ -63,7 +60,6 @@ public class JobGroupController { @RequestMapping("/save") @ResponseBody - @PermissionLimit(adminuser = true) public ReturnT save(XxlJobGroup xxlJobGroup) { // valid @@ -107,7 +103,6 @@ public class JobGroupController { @RequestMapping("/update") @ResponseBody - @PermissionLimit(adminuser = true) public ReturnT update(XxlJobGroup xxlJobGroup) { // valid if (xxlJobGroup.getAppname() == null || xxlJobGroup.getAppname().trim().length() == 0) { @@ -176,7 +171,6 @@ public class JobGroupController { @RequestMapping("/remove") @ResponseBody - @PermissionLimit(adminuser = true) public ReturnT remove(int id) { // valid @@ -196,7 +190,6 @@ public class JobGroupController { @RequestMapping("/loadById") @ResponseBody - @PermissionLimit(adminuser = true) public ReturnT loadById(int id) { XxlJobGroup jobGroup = xxlJobGroupDao.load(id); return jobGroup != null ? new ReturnT(jobGroup) : new ReturnT(ReturnT.FAIL_CODE, null); diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java index e741c17..3369edb 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -130,26 +130,22 @@ public class JobLogController { model.addAttribute("triggerCode", jobLog.getTriggerCode()); model.addAttribute("handleCode", jobLog.getHandleCode()); + model.addAttribute("executorAddress", jobLog.getExecutorAddress()); + model.addAttribute("triggerTime", jobLog.getTriggerTime().getTime()); model.addAttribute("logId", jobLog.getId()); return "joblog/joblog.detail"; } @RequestMapping("/logDetailCat") @ResponseBody - public ReturnT logDetailCat(long logId, int fromLineNum) { + public ReturnT logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum) { try { - // valid - XxlJobLog jobLog = xxlJobLogDao.load(logId); // todo, need to improve performance - if (jobLog == null) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_logid_unvalid")); - } - - // log cat - ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(jobLog.getExecutorAddress()); - ReturnT logResult = executorBiz.log(new LogParam(jobLog.getTriggerTime().getTime(), logId, fromLineNum)); + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress); + ReturnT logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum)); // is end if (logResult.getContent() != null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) { + XxlJobLog jobLog = xxlJobLogDao.load(logId); if (jobLog.getHandleCode() > 0) { logResult.getContent().setEnd(true); } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application.yml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application.yml index 6d08292..d4fda93 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application.yml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application.yml @@ -16,9 +16,6 @@ spring: resources: static-locations: classpath:/static/ -logging: - config: classpath:logback-plus.xml - --- # mybatis 配置 mybatis: mapper-locations: classpath:/mybatis-mapper/*Mapper.xml diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_en.properties b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_en.properties index 881bb8d..8b3c801 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_en.properties +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_en.properties @@ -1,6 +1,6 @@ admin_name=Scheduling Center admin_name_full=Distributed Task Scheduling Platform XXL-JOB -admin_version=2.4.0 +admin_version=2.3.1 admin_i18n=en ## system diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties index 5be17ff..b3860e4 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties @@ -1,6 +1,6 @@ admin_name=任务调度中心 admin_name_full=分布式任务调度平台XXL-JOB -admin_version=2.4.0 +admin_version=2.3.1 admin_i18n= ## system diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties index 3250f1a..ca069b3 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties @@ -1,6 +1,6 @@ admin_name=任務調度中心 admin_name_full=分布式任務調度平臺XXL-JOB -admin_version=2.4.0 +admin_version=2.3.1 admin_i18n= ## system diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/logback-plus.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/logback-plus.xml deleted file mode 100644 index 9c2e772..0000000 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/logback-plus.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - logback - - - - - - - ${console.log.pattern} - utf-8 - - - - - ${log.path}.log - - ${log.path}.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - - - - - - - - \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js index 0638eee..ddefd46 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js @@ -25,6 +25,8 @@ $(function() { async: false, // sync, make log ordered url : base_url + '/joblog/logDetailCat', data : { + "executorAddress":executorAddress, + "triggerTime":triggerTime, "logId":logId, "fromLineNum":fromLineNum }, diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl index 0ea69c7..3881cfa 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl @@ -62,9 +62,11 @@ // 参数 var triggerCode = '${triggerCode}'; var handleCode = '${handleCode}'; + var executorAddress = '${executorAddress!}'; + var triggerTime = '${triggerTime?c}'; var logId = '${logId}'; - + \ No newline at end of file diff --git a/ruoyi-flowable/pom.xml b/ruoyi-flowable/pom.xml index 23ac875..3f7ca5d 100644 --- a/ruoyi-flowable/pom.xml +++ b/ruoyi-flowable/pom.xml @@ -5,7 +5,7 @@ ruoyi-flowable-plus com.ruoyi - 0.8.3 + 0.8.2 4.0.0 diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index cf1f6c0..e3cd99d 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -5,7 +5,7 @@ ruoyi-flowable-plus com.ruoyi - 0.8.3 + 0.8.2 4.0.0 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java index a9d61fb..d558a4c 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -18,7 +18,6 @@ import org.redisson.api.RateType; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.expression.EvaluationContext; -import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.ParserContext; import org.springframework.expression.common.TemplateParserContext; @@ -103,14 +102,7 @@ public class RateLimiterAspect { } // 解析返回给key try { - Expression expression; - if (StringUtils.startsWith(key, parserContext.getExpressionPrefix()) - && StringUtils.endsWith(key, parserContext.getExpressionSuffix())) { - expression = parser.parseExpression(key, parserContext); - } else { - expression = parser.parseExpression(key); - } - key = expression.getValue(context, String.class) + ":"; + key = parser.parseExpression(key, parserContext).getValue(context, String.class) + ":"; } catch (Exception e) { throw new ServiceException("限流key解析异常!请联系管理员!"); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java index a91d14f..c22cdc6 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java @@ -36,21 +36,77 @@ import java.util.Locale; @Configuration @MapperScan("${mybatis-plus.mapperPackage}") public class MybatisPlusConfig { -/* @Autowired - private TenantHandler tenantHandler;*/ -@Bean -public MybatisPlusInterceptor mybatisPlusInterceptor() { - MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); - // 数据权限处理 - interceptor.addInnerInterceptor(dataPermissionInterceptor()); - // 分页插件 - interceptor.addInnerInterceptor(paginationInnerInterceptor()); - // 乐观锁插件 - interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); - return interceptor; -} + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + //多租户插件 + interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() { + @Override + public Expression getTenantId() { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (ObjectUtil.isEmpty(loginUser.getTenantId())) { + return new NullValue(); + } + return new LongValue(loginUser.getTenantId()); + } + + //这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件 + @Override + public boolean ignoreTable(String tableName) { + // 判断是否登录,如果登录则过滤 + if (StpUtil.getLoginIdDefaultNull() != null) { + // 判断是否平台超级管理员,如果是平台超级管理员则拥有所有数据权限 + if (!LoginHelper.isAdmin(LoginHelper.getLoginUser().getUserId())) { + // 需要拼接租户条件的表 + String[] tenantTables = { + //系统表 + "sys_user", + "sys_role", + //业务表 + "as_maintainer", + "as_client", + "as_event", + "as_spare_part", + "as_spare_log", + "as_repair_log", + // "as_repair_info", + "as_evaluation", + "as_work_order", + "as_warehouse", + "as_out_in_type", + "as_product_type", + "as_product_unit", + "as_project", + "as_asset", + "as_asset_sxt", + "as_area", + "as_asset_common" + }; + // 转为 List + List list = Arrays.asList(tenantTables); + // 判断tableName是否在tenantTables中, 在的话返回false, 不在的话返回true + return !list.contains(tableName.toLowerCase(Locale.ROOT)); + } + } + return true; + } + @Override + public String getTenantIdColumn() { + // 对应数据库租户ID的列名 + return "tenant_id"; + } + })); + + // 数据权限处理 + interceptor.addInnerInterceptor(dataPermissionInterceptor()); + // 分页插件 + interceptor.addInnerInterceptor(paginationInnerInterceptor()); + // 乐观锁插件 + interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); + return interceptor; + } /** * 数据权限拦截器 @@ -95,7 +151,6 @@ public MybatisPlusInterceptor mybatisPlusInterceptor() { return new DefaultIdentifierGenerator(NetUtil.getLocalhost()); } - /** * PaginationInnerInterceptor 分页插件,自动识别数据库类型 * https://baomidou.com/pages/97710a/ diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java index ea83338..1af784c 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java @@ -1,6 +1,8 @@ package com.ruoyi.framework.config; +import com.ruoyi.common.constant.Constants; import com.ruoyi.framework.interceptor.PlusWebInvokeTimeInterceptor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; @@ -17,6 +19,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; */ @Configuration public class ResourcesConfig implements WebMvcConfigurer { + @Value("${ruoyi.profile}") + private String profile; @Override public void addInterceptors(InterceptorRegistry registry) { @@ -26,6 +30,9 @@ public class ResourcesConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { + /** 本地文件上传路径 */ + registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**") + .addResourceLocations("file:" + profile + "/"); } /** diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/TenantProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/TenantProperties.java deleted file mode 100644 index 4f52ba2..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/TenantProperties.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.ruoyi.framework.config.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -/** - * 多租户配置 - * - * @author vishun - */ -@Configuration -@ConfigurationProperties(prefix = "tenant") -@Data -public class TenantProperties { - - /** - * 是否开启多租户 - */ - private Boolean enable; - - /** - * 租户字段名 - */ - private String column; - - /** - * 需要忽略的租户表名 - */ - private List excludes; - -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/MybatisDecryptInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/MybatisDecryptInterceptor.java index 90b3133..8755e7d 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/MybatisDecryptInterceptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/MybatisDecryptInterceptor.java @@ -1,6 +1,6 @@ package com.ruoyi.framework.encrypt; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.annotation.EncryptField; import com.ruoyi.common.encrypt.EncryptContext; @@ -62,12 +62,12 @@ public class MybatisDecryptInterceptor implements Interceptor { } if (sourceObject instanceof List) { List sourceList = (List) sourceObject; - if(CollUtil.isEmpty(sourceList)) { + if(CollectionUtil.isEmpty(sourceList)) { return; } // 判断第一个元素是否含有注解。如果没有直接返回,提高效率 Object firstItem = sourceList.get(0); - if (ObjectUtil.isNull(firstItem) || CollUtil.isEmpty(encryptorManager.getFieldCache(firstItem.getClass()))) { + if (CollectionUtil.isEmpty(encryptorManager.getFieldCache(firstItem.getClass()))) { return; } ((List) sourceObject).forEach(this::decryptHandler); @@ -91,9 +91,6 @@ public class MybatisDecryptInterceptor implements Interceptor { * @return 加密后结果 */ private String decryptField(String value, Field field) { - if (ObjectUtil.isNull(value)) { - return null; - } EncryptField encryptField = field.getAnnotation(EncryptField.class); EncryptContext encryptContext = new EncryptContext(); encryptContext.setAlgorithm(encryptField.algorithm() == AlgorithmType.DEFAULT ? defaultProperties.getAlgorithm() : encryptField.algorithm()); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/MybatisEncryptInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/MybatisEncryptInterceptor.java index f5ffb2b..e2ce195 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/MybatisEncryptInterceptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/encrypt/MybatisEncryptInterceptor.java @@ -1,6 +1,6 @@ package com.ruoyi.framework.encrypt; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.annotation.EncryptField; import com.ruoyi.common.encrypt.EncryptContext; @@ -72,12 +72,12 @@ public class MybatisEncryptInterceptor implements Interceptor { } if (sourceObject instanceof List) { List sourceList = (List) sourceObject; - if(CollUtil.isEmpty(sourceList)) { + if(CollectionUtil.isEmpty(sourceList)) { return; } // 判断第一个元素是否含有注解。如果没有直接返回,提高效率 Object firstItem = sourceList.get(0); - if (ObjectUtil.isNull(firstItem) || CollUtil.isEmpty(encryptorManager.getFieldCache(firstItem.getClass()))) { + if (CollectionUtil.isEmpty(encryptorManager.getFieldCache(firstItem.getClass()))) { return; } ((List) sourceObject).forEach(this::encryptHandler); @@ -101,9 +101,6 @@ public class MybatisEncryptInterceptor implements Interceptor { * @return 加密后结果 */ private String encryptField(String value, Field field) { - if (ObjectUtil.isNull(value)) { - return null; - } EncryptField encryptField = field.getAnnotation(EncryptField.class); EncryptContext encryptContext = new EncryptContext(); encryptContext.setAlgorithm(encryptField.algorithm() == AlgorithmType.DEFAULT ? defaultProperties.getAlgorithm() : encryptField.algorithm()); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java index 3f0e122..6d7c977 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java @@ -73,7 +73,7 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { log.warn("自动注入警告 => 用户未登录"); return null; } - return ObjectUtil.isNotNull(loginUser) ? loginUser.getUsername() : null; + return loginUser.getUsername(); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaPermissionImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaPermissionImpl.java index 632cc71..01940cd 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaPermissionImpl.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaPermissionImpl.java @@ -26,6 +26,7 @@ public class SaPermissionImpl implements StpInterface { return new ArrayList<>(loginUser.getMenuPermission()); } else if (userType == UserType.APP_USER) { // 其他端 自行根据业务编写 + return new ArrayList<>(loginUser.getMenuPermission()); } return new ArrayList<>(); } diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml index fb960ac..85e3e87 100644 --- a/ruoyi-generator/pom.xml +++ b/ruoyi-generator/pom.xml @@ -5,7 +5,7 @@ ruoyi-flowable-plus com.ruoyi - 0.8.3 + 0.8.2 4.0.0 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java index 93578f2..fbb82da 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java @@ -11,7 +11,7 @@ import java.util.List; * * @author Lion Li */ -@InterceptorIgnore(dataPermission = "true") +@InterceptorIgnore(dataPermission = "true",tenantLine = "1") public interface GenTableColumnMapper extends BaseMapperPlus { /** * 根据表名称查询列信息 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java index f70a11e..5568832 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java @@ -13,7 +13,7 @@ import java.util.List; * * @author Lion Li */ -@InterceptorIgnore(dataPermission = "true") +@InterceptorIgnore(dataPermission = "true",tenantLine = "1") public interface GenTableMapper extends BaseMapperPlus { /** diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index 34c4569..085589f 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -317,11 +317,13 @@ public class GenTableServiceImpl implements IGenTableService { column.setIsRequired(prevColumn.getIsRequired()); column.setHtmlType(prevColumn.getHtmlType()); } + genTableColumnMapper.updateById(column); + } else { + genTableColumnMapper.insert(column); } - saveColumns.add(column); }); if (CollUtil.isNotEmpty(saveColumns)) { - genTableColumnMapper.insertOrUpdateBatch(saveColumns); + genTableColumnMapper.insertBatch(saveColumns); } List delColumns = StreamUtils.filter(tableColumns, column -> !dbTableColumnNames.contains(column.getColumnName())); if (CollUtil.isNotEmpty(delColumns)) { diff --git a/ruoyi-generator/src/main/resources/generator.yml b/ruoyi-generator/src/main/resources/generator.yml index d7e9a1a..5758bc9 100644 --- a/ruoyi-generator/src/main/resources/generator.yml +++ b/ruoyi-generator/src/main/resources/generator.yml @@ -3,8 +3,8 @@ gen: # 作者 author: ruoyi # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool - packageName: com.ruoyi.system + packageName: com.ruoyi.pay # 自动去除表前缀,默认是false autoRemovePre: false # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) - tablePrefix: sys_ + tablePrefix: sys_,pay_ diff --git a/ruoyi-job/pom.xml b/ruoyi-job/pom.xml index 83c36eb..4c74377 100644 --- a/ruoyi-job/pom.xml +++ b/ruoyi-job/pom.xml @@ -5,7 +5,7 @@ ruoyi-flowable-plus com.ruoyi - 0.8.3 + 0.8.2 4.0.0 jar diff --git a/ruoyi-oss/pom.xml b/ruoyi-oss/pom.xml index 0b1a37f..8371f0b 100644 --- a/ruoyi-oss/pom.xml +++ b/ruoyi-oss/pom.xml @@ -5,7 +5,7 @@ ruoyi-flowable-plus com.ruoyi - 0.8.3 + 0.8.2 4.0.0 diff --git a/ruoyi-sms/pom.xml b/ruoyi-sms/pom.xml index d8b8c42..23d7aa2 100644 --- a/ruoyi-sms/pom.xml +++ b/ruoyi-sms/pom.xml @@ -5,7 +5,7 @@ ruoyi-flowable-plus com.ruoyi - 0.8.3 + 0.8.2 4.0.0 diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index 6f4bb78..914ed57 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -5,7 +5,7 @@ ruoyi-flowable-plus com.ruoyi - 0.8.3 + 0.8.2 4.0.0 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java index 13cce2d..8096242 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysConfig; @@ -8,6 +9,7 @@ import com.ruoyi.system.domain.SysConfig; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysConfigMapper extends BaseMapperPlus { } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java index 7e7a441..fa6c214 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.ruoyi.common.annotation.DataColumn; @@ -15,6 +16,7 @@ import java.util.List; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysDeptMapper extends BaseMapperPlus { /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java index 0d506bc..7b5c427 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysDictData; @@ -12,6 +13,7 @@ import java.util.List; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysDictDataMapper extends BaseMapperPlus { default List selectDictDataByType(String dictType) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java index 7107aed..0d29af4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.common.core.domain.entity.SysDictType; import com.ruoyi.common.core.mapper.BaseMapperPlus; @@ -8,6 +9,7 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysDictTypeMapper extends BaseMapperPlus { } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java index b74f3ff..51ed267 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysLogininfor; @@ -8,6 +9,7 @@ import com.ruoyi.system.domain.SysLogininfor; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysLogininforMapper extends BaseMapperPlus { } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java index 0043903..4386c94 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; @@ -15,6 +16,7 @@ import java.util.List; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysMenuMapper extends BaseMapperPlus { /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java index 69fa3ba..a5ffac1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysNotice; @@ -8,6 +9,7 @@ import com.ruoyi.system.domain.SysNotice; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysNoticeMapper extends BaseMapperPlus { } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java index bbb265d..1f20efd 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysOperLog; @@ -8,6 +9,7 @@ import com.ruoyi.system.domain.SysOperLog; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysOperLogMapper extends BaseMapperPlus { } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOssConfigMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOssConfigMapper.java index 72f29a7..82075e2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOssConfigMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOssConfigMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysOssConfig; import com.ruoyi.system.domain.vo.SysOssConfigVo; @@ -11,6 +12,7 @@ import com.ruoyi.system.domain.vo.SysOssConfigVo; * @author 孤舟烟雨 * @date 2021-08-13 */ +@InterceptorIgnore(tenantLine = "1") public interface SysOssConfigMapper extends BaseMapperPlus { } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java index edbaed6..08b4ea0 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.domain.vo.SysOssVo; @@ -9,5 +10,6 @@ import com.ruoyi.system.domain.vo.SysOssVo; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysOssMapper extends BaseMapperPlus { } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java index 7330494..48c13b5 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysPost; @@ -10,6 +11,7 @@ import java.util.List; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysPostMapper extends BaseMapperPlus { /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java index 0428d98..a35aa1b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysRoleDept; @@ -8,6 +9,7 @@ import com.ruoyi.system.domain.SysRoleDept; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysRoleDeptMapper extends BaseMapperPlus { } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java index e2b3c01..1c7f009 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java @@ -16,6 +16,7 @@ import java.util.List; * * @author Lion Li */ +//@InterceptorIgnore(tenantLine = "1") public interface SysRoleMapper extends BaseMapperPlus { @DataPermission({ diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java index e9987cc..b29af44 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysRoleMenu; @@ -8,6 +9,7 @@ import com.ruoyi.system.domain.SysRoleMenu; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysRoleMenuMapper extends BaseMapperPlus { } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java index 7147198..f4faaeb 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -8,6 +8,7 @@ import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.mapper.BaseMapperPlus; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import java.util.List; @@ -16,6 +17,7 @@ import java.util.List; * * @author Lion Li */ +//@InterceptorIgnore(tenantLine = "1") public interface SysUserMapper extends BaseMapperPlus { @DataPermission({ @@ -76,14 +78,6 @@ public interface SysUserMapper extends BaseMapperPlus { } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java index be8fb8f..b8d91a4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysUserRole; @@ -10,6 +11,7 @@ import java.util.List; * * @author Lion Li */ +@InterceptorIgnore(tenantLine = "1") public interface SysUserRoleMapper extends BaseMapperPlus { List selectUserIdsByRoleId(Long roleId); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java index d046984..107ccf2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java @@ -176,6 +176,4 @@ public interface ISysRoleService { * @return 结果 */ int insertAuthUsers(Long roleId, Long[] userIds); - - void cleanOnlineUserByRole(Long roleId); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index cfa6e16..54faef3 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -88,6 +88,16 @@ public interface ISysUserService { */ boolean checkUserNameUnique(SysUser user); + /** + * 校验用户昵称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkNickNameUnique(SysUser user); + + + /** * 校验手机号码是否唯一 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java index b76b818..93817d3 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java @@ -8,9 +8,9 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.event.LogininforEvent; import com.ruoyi.common.core.domain.dto.RoleDTO; import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.event.LogininforEvent; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.model.XcxLoginUser; import com.ruoyi.common.enums.DeviceType; @@ -32,6 +32,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import javax.servlet.http.HttpServletRequest; import java.time.Duration; import java.util.List; import java.util.function.Supplier; @@ -66,10 +67,11 @@ public class SysLoginService { * @return 结果 */ public String login(String username, String password, String code, String uuid) { + HttpServletRequest request = ServletUtils.getRequest(); boolean captchaEnabled = configService.selectCaptchaEnabled(); // 验证码开关 if (captchaEnabled) { - validateCaptcha(username, code, uuid); + validateCaptcha(username, code, uuid, request); } SysUser user = loadUserByUsername(username); checkLogin(LoginType.PASSWORD, username, () -> !BCrypt.checkpw(password, user.getPassword())); @@ -98,20 +100,6 @@ public class SysLoginService { return StpUtil.getTokenValue(); } - public String emailLogin(String email, String emailCode) { - // 通过手机号查找用户 - SysUser user = loadUserByEmail(email); - - checkLogin(LoginType.EMAIL, user.getUserName(), () -> !validateEmailCode(email, emailCode)); - // 此处可根据登录用户的数据不同 自行创建 loginUser - LoginUser loginUser = buildLoginUser(user); - // 生成token - LoginHelper.loginByDevice(loginUser, DeviceType.APP); - - recordLogininfor(user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); - recordLoginInfo(user.getUserId(), user.getUserName()); - return StpUtil.getTokenValue(); - } public String xcxLogin(String xcxCode) { // xcxCode 为 小程序调用 wx.login 授权后获取 @@ -152,6 +140,7 @@ public class SysLoginService { * @param username 用户名 * @param status 状态 * @param message 消息内容 + * @return */ private void recordLogininfor(String username, String status, String message) { LogininforEvent logininforEvent = new LogininforEvent(); @@ -165,7 +154,7 @@ public class SysLoginService { /** * 校验短信验证码 */ - private boolean validateSmsCode(String phonenumber, String smsCode) { + public boolean validateSmsCode(String phonenumber, String smsCode) { String code = RedisUtils.getCacheObject(CacheConstants.CAPTCHA_CODE_KEY + phonenumber); if (StringUtils.isBlank(code)) { recordLogininfor(phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); @@ -174,18 +163,6 @@ public class SysLoginService { return code.equals(smsCode); } - /** - * 校验邮箱验证码 - */ - private boolean validateEmailCode(String email, String emailCode) { - String code = RedisUtils.getCacheObject(CacheConstants.CAPTCHA_CODE_KEY + email); - if (StringUtils.isBlank(code)) { - recordLogininfor(email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); - throw new CaptchaExpireException(); - } - return code.equals(emailCode); - } - /** * 校验验证码 * @@ -193,7 +170,7 @@ public class SysLoginService { * @param code 验证码 * @param uuid 唯一标识 */ - public void validateCaptcha(String username, String code, String uuid) { + public void validateCaptcha(String username, String code, String uuid, HttpServletRequest request) { String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, ""); String captcha = RedisUtils.getCacheObject(verifyKey); RedisUtils.deleteObject(verifyKey); @@ -221,7 +198,7 @@ public class SysLoginService { return userMapper.selectUserByUserName(username); } - private SysUser loadUserByPhonenumber(String phonenumber) { + public SysUser loadUserByPhonenumber(String phonenumber) { SysUser user = userMapper.selectOne(new LambdaQueryWrapper() .select(SysUser::getPhonenumber, SysUser::getStatus) .eq(SysUser::getPhonenumber, phonenumber)); @@ -235,20 +212,6 @@ public class SysLoginService { return userMapper.selectUserByPhonenumber(phonenumber); } - private SysUser loadUserByEmail(String email) { - SysUser user = userMapper.selectOne(new LambdaQueryWrapper() - .select(SysUser::getPhonenumber, SysUser::getStatus) - .eq(SysUser::getEmail, email)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", email); - throw new UserException("user.not.exists", email); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", email); - throw new UserException("user.blocked", email); - } - return userMapper.selectUserByEmail(email); - } - private SysUser loadUserByOpenid(String openid) { // 使用 openid 查询绑定用户 如未绑定用户 则根据业务自行处理 例如 创建默认用户 // todo 自行实现 userService.selectUserByOpenid(openid); @@ -270,6 +233,10 @@ public class SysLoginService { LoginUser loginUser = new LoginUser(); loginUser.setUserId(user.getUserId()); loginUser.setTenantId(user.getTenantId()); + /*AsCompany company = companyMapper.selectOne(new LambdaQueryWrapper() + .select(AsCompany::getName) + .eq(AsCompany::getId, user.getTenantId())); + loginUser.setCompanyName(ObjectUtil.isEmpty(company) ? null : company.getName());*/ loginUser.setDeptId(user.getDeptId()); loginUser.setUsername(user.getUserName()); loginUser.setNickName(user.getNickName()); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysRegisterService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysRegisterService.java index 1a034e5..886aec3 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysRegisterService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysRegisterService.java @@ -3,6 +3,7 @@ package com.ruoyi.system.service; import cn.dev33.satoken.secure.BCrypt; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.event.LogininforEvent; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.RegisterBody; @@ -18,6 +19,8 @@ import com.ruoyi.common.utils.spring.SpringUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import javax.servlet.http.HttpServletRequest; + /** * 注册校验方法 * @@ -34,6 +37,7 @@ public class SysRegisterService { * 注册 */ public void register(RegisterBody registerBody) { + HttpServletRequest request = ServletUtils.getRequest(); String username = registerBody.getUsername(); String password = registerBody.getPassword(); // 校验用户类型是否存在 @@ -42,7 +46,7 @@ public class SysRegisterService { boolean captchaEnabled = configService.selectCaptchaEnabled(); // 验证码开关 if (captchaEnabled) { - validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); + validateCaptcha(username, registerBody.getCode(), registerBody.getUuid(), request); } SysUser sysUser = new SysUser(); sysUser.setUserName(username); @@ -66,8 +70,9 @@ public class SysRegisterService { * @param username 用户名 * @param code 验证码 * @param uuid 唯一标识 + * @return 结果 */ - public void validateCaptcha(String username, String code, String uuid) { + public void validateCaptcha(String username, String code, String uuid, HttpServletRequest request) { String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, ""); String captcha = RedisUtils.getCacheObject(verifyKey); RedisUtils.deleteObject(verifyKey); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java index 8e3fad9..e917d94 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java @@ -73,6 +73,9 @@ public class SysMenuServiceImpl implements ISysMenuService { .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + //非管理员需要隐藏的权限菜单 + .notIn("m.menu_id",Arrays.asList(2,3,4,5,102,103,104,105,106,107,108,118)) + .notIn("m.parent_id",Arrays.asList(2,3,4,5,102,103,104,105,106,107,108,118)) .orderByAsc("m.parent_id") .orderByAsc("m.order_num"); menuList = baseMapper.selectMenuListByUserId(wrapper); @@ -207,11 +210,12 @@ public class SysMenuServiceImpl implements ISysMenuService { if (CollUtil.isEmpty(menus)) { return CollUtil.newArrayList(); } - return TreeBuildUtils.build(menus, (menu, tree) -> + List> build = TreeBuildUtils.build(menus, (menu, tree) -> tree.setId(menu.getMenuId()) .setParentId(menu.getParentId()) .setName(menu.getMenuName()) .setWeight(menu.getOrderNum())); + return build; } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java index b28df9e..736a6ed 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java @@ -1,7 +1,5 @@ package com.ruoyi.system.service.impl; -import cn.dev33.satoken.exception.NotLoginException; -import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; @@ -12,7 +10,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysRole; -import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.helper.LoginHelper; @@ -31,6 +28,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.stream.Collectors; /** * 角色 业务层处理 @@ -67,13 +65,14 @@ public class SysRoleServiceImpl implements ISysRoleService { Map params = role.getParams(); QueryWrapper wrapper = Wrappers.query(); wrapper.eq("r.del_flag", UserConstants.ROLE_NORMAL) + .eq(ObjectUtil.isNotNull(role.getTenantId()), "r.tenant_id", role.getTenantId()) .eq(ObjectUtil.isNotNull(role.getRoleId()), "r.role_id", role.getRoleId()) .like(StringUtils.isNotBlank(role.getRoleName()), "r.role_name", role.getRoleName()) .eq(StringUtils.isNotBlank(role.getStatus()), "r.status", role.getStatus()) .like(StringUtils.isNotBlank(role.getRoleKey()), "r.role_key", role.getRoleKey()) .between(params.get("beginTime") != null && params.get("endTime") != null, "r.create_time", params.get("beginTime"), params.get("endTime")) - .orderByAsc("r.role_sort").orderByAsc("r.create_time"); + .orderByAsc("r.role_sort"); return wrapper; } @@ -158,6 +157,7 @@ public class SysRoleServiceImpl implements ISysRoleService { public boolean checkRoleNameUnique(SysRole role) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysRole::getRoleName, role.getRoleName()) + .eq(SysRole::getTenantId, role.getTenantId()) .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); return !exist; } @@ -172,6 +172,7 @@ public class SysRoleServiceImpl implements ISysRoleService { public boolean checkRoleKeyUnique(SysRole role) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysRole::getRoleKey, role.getRoleKey()) + .eq(SysRole::getTenantId, role.getTenantId()) .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); return !exist; } @@ -349,6 +350,15 @@ public class SysRoleServiceImpl implements ISysRoleService { throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName())); } } + if(!LoginHelper.isAdmin()){ + // 获取角色列表 + List sysRoles = baseMapper.selectBatchIds(Arrays.asList(roleIds)); + // 筛选出roleKey=="client"或者"maintainer"的角色 + List collect = sysRoles.stream().filter(sysRole -> "companyAdmin".equals(sysRole.getRoleKey())||"client".equals(sysRole.getRoleKey()) || "maintainer".equals(sysRole.getRoleKey())).collect(Collectors.toList()); + if (collect.size() > 0) { + throw new ServiceException("不能删除系统角色"); + } + } List ids = Arrays.asList(roleIds); // 删除角色与菜单关联 roleMenuMapper.delete(new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, ids)); @@ -365,13 +375,9 @@ public class SysRoleServiceImpl implements ISysRoleService { */ @Override public int deleteAuthUser(SysUserRole userRole) { - int rows = userRoleMapper.delete(new LambdaQueryWrapper() + return userRoleMapper.delete(new LambdaQueryWrapper() .eq(SysUserRole::getRoleId, userRole.getRoleId()) .eq(SysUserRole::getUserId, userRole.getUserId())); - if (rows > 0) { - cleanOnlineUserByRole(userRole.getRoleId()); - } - return rows; } /** @@ -383,13 +389,9 @@ public class SysRoleServiceImpl implements ISysRoleService { */ @Override public int deleteAuthUsers(Long roleId, Long[] userIds) { - int rows = userRoleMapper.delete(new LambdaQueryWrapper() + return userRoleMapper.delete(new LambdaQueryWrapper() .eq(SysUserRole::getRoleId, roleId) .in(SysUserRole::getUserId, Arrays.asList(userIds))); - if (rows > 0) { - cleanOnlineUserByRole(roleId); - } - return rows; } /** @@ -412,32 +414,6 @@ public class SysRoleServiceImpl implements ISysRoleService { if (CollUtil.isNotEmpty(list)) { rows = userRoleMapper.insertBatch(list) ? list.size() : 0; } - if (rows > 0) { - cleanOnlineUserByRole(roleId); - } return rows; } - - @Override - public void cleanOnlineUserByRole(Long roleId) { - List keys = StpUtil.searchTokenValue("", 0, -1, false); - if (CollUtil.isEmpty(keys)) { - return; - } - // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作 - keys.parallelStream().forEach(key -> { - String token = StringUtils.substringAfterLast(key, ":"); - // 如果已经过期则跳过 - if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) { - return; - } - LoginUser loginUser = LoginHelper.getLoginUser(token); - if (loginUser.getRoles().stream().anyMatch(r -> r.getRoleId().equals(roleId))) { - try { - StpUtil.logoutByTokenValue(token); - } catch (NotLoginException ignored) { - } - } - }); - } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 3e0626f..58d7f8e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -54,6 +54,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService { private final SysUserRoleMapper userRoleMapper; private final SysUserPostMapper userPostMapper; + @Override public TableDataInfo selectPageUserList(SysUser user, PageQuery pageQuery) { Page page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); @@ -77,6 +78,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService { wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId()) .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .eq(ObjectUtil.isNotNull(user.getTenantId()), "u.tenant_id", user.getTenantId()) .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) .between(params.get("beginTime") != null && params.get("endTime") != null, @@ -206,6 +208,20 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return !exist; } + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean checkNickNameUnique(SysUser user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getNickName, user.getNickName()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); + return !exist; + } + /** * 校验手机号码是否唯一 * @@ -482,12 +498,4 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return ObjectUtil.isNull(sysUser) ? null : sysUser.getUserName(); } - @Cacheable(cacheNames = CacheNames.SYS_NICK_NAME, key = "#userId") - @Override - public String selectNickNameById(Long userId) { - SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() - .select(SysUser::getNickName).eq(SysUser::getUserId, userId)); - return ObjectUtil.isNull(sysUser) ? null : sysUser.getNickName(); - } - } diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfTaskVo.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfTaskVo.java index 6ffef1b..04518cb 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfTaskVo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfTaskVo.java @@ -38,12 +38,10 @@ public class WfTaskVo implements Serializable { /** * 部门名称 */ - @Deprecated private String deptName; /** * 流程发起人部门名称 */ - @Deprecated private String startDeptName; /** * 任务执行人名称 @@ -52,7 +50,7 @@ public class WfTaskVo implements Serializable { /** * 流程发起人Id */ - private Long startUserId; + private String startUserId; /** * 流程发起人名称 */ diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/handler/MultiInstanceHandler.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/handler/MultiInstanceHandler.java index 0f94079..28bdd37 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/handler/MultiInstanceHandler.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/handler/MultiInstanceHandler.java @@ -3,21 +3,20 @@ package com.ruoyi.workflow.handler; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery; import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.flowable.common.constant.ProcessConstants; -import com.ruoyi.system.domain.SysUserRole; +import com.ruoyi.system.mapper.SysUserMapper; +import com.ruoyi.system.mapper.SysUserRoleMapper; import lombok.AllArgsConstructor; import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.UserTask; import org.flowable.engine.delegate.DelegateExecution; import org.springframework.stereotype.Component; -import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; /** @@ -29,32 +28,32 @@ import java.util.stream.Collectors; @Component("multiInstanceHandler") public class MultiInstanceHandler { - public Set getUserIds(DelegateExecution execution) { - Set candidateUserIds = new LinkedHashSet<>(); + public HashSet getUserIds(DelegateExecution execution) { + HashSet candidateUserIds = new LinkedHashSet<>(); FlowElement flowElement = execution.getCurrentFlowElement(); if (ObjectUtil.isNotEmpty(flowElement) && flowElement instanceof UserTask) { UserTask userTask = (UserTask) flowElement; String dataType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_DATA_TYPE); if ("USERS".equals(dataType) && CollUtil.isNotEmpty(userTask.getCandidateUsers())) { - // 添加候选用户id candidateUserIds.addAll(userTask.getCandidateUsers()); } else if (CollUtil.isNotEmpty(userTask.getCandidateGroups())) { - // 获取组的ID,角色ID集合或部门ID集合 - List groups = userTask.getCandidateGroups().stream() - .map(item -> Long.parseLong(item.substring(4))) - .collect(Collectors.toList()); - List userIds = new ArrayList<>(); + List groups = userTask.getCandidateGroups() + .stream().map(item -> item.substring(4)).collect(Collectors.toList()); if ("ROLES".equals(dataType)) { - // 通过角色id,获取所有用户id集合 - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(SysUserRole.class).select(SysUserRole::getUserId).in(SysUserRole::getRoleId, groups); - userIds = SimpleQuery.list(lqw, SysUserRole::getUserId); + SysUserRoleMapper userRoleMapper = SpringUtils.getBean(SysUserRoleMapper.class); + groups.forEach(item -> { + List userIds = userRoleMapper.selectUserIdsByRoleId(Long.parseLong(item)) + .stream().map(String::valueOf).collect(Collectors.toList()); + candidateUserIds.addAll(userIds); + }); } else if ("DEPTS".equals(dataType)) { - // 通过部门id,获取所有用户id集合 - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(SysUser.class).select(SysUser::getUserId).in(SysUser::getDeptId, groups); - userIds = SimpleQuery.list(lqw, SysUser::getUserId); + SysUserMapper userMapper = SpringUtils.getBean(SysUserMapper.class); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .select(SysUser::getUserId).in(SysUser::getDeptId, groups); + List userIds = userMapper.selectList(lambdaQueryWrapper) + .stream().map(k -> String.valueOf(k.getUserId())).collect(Collectors.toList()); + candidateUserIds.addAll(userIds); } - // 添加候选用户id - userIds.forEach(id -> candidateUserIds.add(String.valueOf(id))); } } return candidateUserIds; diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java index 1befc0b..24501af 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java @@ -2,7 +2,6 @@ package com.ruoyi.workflow.service; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.flowable.core.FormConf; import com.ruoyi.flowable.core.domain.ProcessQuery; import com.ruoyi.workflow.domain.vo.WfDefinitionVo; import com.ruoyi.workflow.domain.vo.WfDetailVo; @@ -78,7 +77,7 @@ public interface IWfProcessService { * @param definitionId 流程定义ID * @param deployId 部署ID */ - FormConf selectFormContent(String definitionId, String deployId, String procInsId); + String selectFormContent(String definitionId, String deployId); /** * 启动流程实例 @@ -94,11 +93,6 @@ public interface IWfProcessService { */ void startProcessByDefKey(String procDefKey, Map variables); - /** - * 删除流程实例 - */ - void deleteProcessByIds(String[] instanceIds); - /** * 读取xml文件 diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfTaskService.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfTaskService.java index 27c53f9..55ed5cb 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfTaskService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfTaskService.java @@ -1,7 +1,7 @@ package com.ruoyi.workflow.service; import com.ruoyi.workflow.domain.bo.WfTaskBo; -import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.UserTask; import org.flowable.engine.runtime.ProcessInstance; import java.io.InputStream; @@ -42,7 +42,7 @@ public interface IWfTaskService { * @param bo * @return */ - List findReturnTaskList(WfTaskBo bo); + List findReturnTaskList(WfTaskBo bo); /** * 删除任务 diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfInstanceServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfInstanceServiceImpl.java index 703615f..de0362e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfInstanceServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfInstanceServiceImpl.java @@ -7,7 +7,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; -import com.ruoyi.common.core.service.UserService; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.StringUtils; @@ -15,6 +15,7 @@ import com.ruoyi.flowable.common.constant.TaskConstants; import com.ruoyi.flowable.factory.FlowServiceFactory; import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysRoleService; +import com.ruoyi.system.service.ISysUserService; import com.ruoyi.workflow.domain.bo.WfTaskBo; import com.ruoyi.workflow.domain.vo.WfFormVo; import com.ruoyi.workflow.domain.vo.WfTaskVo; @@ -44,7 +45,7 @@ import java.util.*; public class WfInstanceServiceImpl extends FlowServiceFactory implements IWfInstanceService { private final IWfDeployFormService deployFormService; - private final UserService userService; + private final ISysUserService userService; private final ISysRoleService roleService; private final ISysDeptService deptService; @@ -142,10 +143,10 @@ public class WfInstanceServiceImpl extends FlowServiceFactory implements IWfInst taskVo.setCreateTime(taskInstance.getStartTime()); taskVo.setFinishTime(taskInstance.getEndTime()); if (StringUtils.isNotBlank(taskInstance.getAssignee())) { - Long userId = Long.parseLong(taskInstance.getAssignee()); - String nickName = userService.selectNickNameById(userId); - taskVo.setAssigneeId(userId); - taskVo.setAssigneeName(nickName); + SysUser user = userService.selectUserById(Long.parseLong(taskInstance.getAssignee())); + taskVo.setAssigneeId(user.getUserId()); + taskVo.setAssigneeName(user.getNickName()); + taskVo.setDeptName(user.getDept().getDeptName()); } // 展示审批人员 List linksForTask = historyService.getHistoricIdentityLinksForTask(taskInstance.getId()); @@ -153,9 +154,8 @@ public class WfInstanceServiceImpl extends FlowServiceFactory implements IWfInst for (HistoricIdentityLink identityLink : linksForTask) { if ("candidate".equals(identityLink.getType())) { if (StringUtils.isNotBlank(identityLink.getUserId())) { - Long userId = Long.parseLong(identityLink.getUserId()); - String nickName = userService.selectNickNameById(userId); - stringBuilder.append(nickName).append(","); + SysUser user = userService.selectUserById(Long.parseLong(identityLink.getUserId())); + stringBuilder.append(user.getNickName()).append(","); } if (StringUtils.isNotBlank(identityLink.getGroupId())) { if (identityLink.getGroupId().startsWith(TaskConstants.ROLE_GROUP_PREFIX)) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfModelServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfModelServiceImpl.java index ab66dd7..e74d444 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfModelServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfModelServiceImpl.java @@ -1,6 +1,5 @@ package com.ruoyi.workflow.service.impl; -import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -320,9 +319,6 @@ public class WfModelServiceImpl extends FlowServiceFactory implements IWfModelSe } // 获取流程图 byte[] bpmnBytes = repositoryService.getModelEditorSource(modelId); - if (ArrayUtil.isEmpty(bpmnBytes)) { - throw new RuntimeException("请先设计流程图!"); - } String bpmnXml = StringUtils.toEncodedString(bpmnBytes, StandardCharsets.UTF_8); BpmnModel bpmnModel = ModelUtils.getBpmnModel(bpmnXml); String processName = model.getName() + ProcessConstants.SUFFIX; diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java index 10ce59a..6a7d9ec 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java @@ -13,8 +13,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.core.service.UserService; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.JsonUtils; @@ -32,6 +32,7 @@ import com.ruoyi.flowable.utils.ProcessUtils; import com.ruoyi.flowable.utils.TaskUtils; import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysRoleService; +import com.ruoyi.system.service.ISysUserService; import com.ruoyi.workflow.domain.WfDeployForm; import com.ruoyi.workflow.domain.vo.*; import com.ruoyi.workflow.mapper.WfDeployFormMapper; @@ -72,7 +73,7 @@ import java.util.stream.Collectors; public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProcessService { private final IWfTaskService wfTaskService; - private final UserService userService; + private final ISysUserService userService; private final ISysRoleService roleService; private final ISysDeptService deptService; private final WfDeployFormMapper deployFormMapper; @@ -289,13 +290,13 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(task.getProcessInstanceId()) .singleResult(); - Long userId = Long.parseLong(historicProcessInstance.getStartUserId()); - String nickName = userService.selectNickNameById(userId); - flowTask.setStartUserId(userId); - flowTask.setStartUserName(nickName); + SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); + flowTask.setStartUserId(startUser.getNickName()); + flowTask.setStartUserName(startUser.getNickName()); + flowTask.setStartDeptName(startUser.getDept().getDeptName()); // 流程变量 - flowTask.setProcVars(task.getProcessVariables()); + flowTask.setProcVars(this.getProcessVariables(task.getId())); flowList.add(flowTask); } @@ -336,10 +337,12 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(task.getProcessInstanceId()) .singleResult(); - Long userId = Long.parseLong(historicProcessInstance.getStartUserId()); - String nickName = userService.selectNickNameById(userId); - taskVo.setStartUserId(userId); - taskVo.setStartUserName(nickName); + SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); + taskVo.setStartUserId(startUser.getNickName()); + taskVo.setStartUserName(startUser.getNickName()); + taskVo.setStartDeptName(startUser.getDept().getDeptName()); + // 流程变量 + taskVo.setProcVars(this.getProcessVariables(task.getId())); taskVoList.add(taskVo); } @@ -382,10 +385,10 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(task.getProcessInstanceId()) .singleResult(); - Long userId = Long.parseLong(historicProcessInstance.getStartUserId()); - String nickName = userService.selectNickNameById(userId); - flowTask.setStartUserId(userId); - flowTask.setStartUserName(nickName); + SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); + flowTask.setStartUserId(startUser.getNickName()); + flowTask.setStartUserName(startUser.getNickName()); + flowTask.setStartDeptName(startUser.getDept().getDeptName()); flowList.add(flowTask); } @@ -426,10 +429,10 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(task.getProcessInstanceId()) .singleResult(); - Long userId = Long.parseLong(historicProcessInstance.getStartUserId()); - String nickName = userService.selectNickNameById(userId); - flowTask.setStartUserId(userId); - flowTask.setStartUserName(nickName); + SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); + flowTask.setStartUserId(startUser.getNickName()); + flowTask.setStartUserName(startUser.getNickName()); + flowTask.setStartDeptName(startUser.getDept().getDeptName()); flowList.add(flowTask); } @@ -476,13 +479,13 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(histTask.getProcessInstanceId()) .singleResult(); - Long userId = Long.parseLong(historicProcessInstance.getStartUserId()); - String nickName = userService.selectNickNameById(userId); - flowTask.setStartUserId(userId); - flowTask.setStartUserName(nickName); + SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); + flowTask.setStartUserId(startUser.getNickName()); + flowTask.setStartUserName(startUser.getNickName()); + flowTask.setStartDeptName(startUser.getDept().getDeptName()); // 流程变量 - flowTask.setProcVars(histTask.getProcessVariables()); + flowTask.setProcVars(this.getProcessVariables(histTask.getId())); hisTaskList.add(flowTask); } @@ -532,13 +535,13 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(histTask.getProcessInstanceId()) .singleResult(); - Long userId = Long.parseLong(historicProcessInstance.getStartUserId()); - String nickName = userService.selectNickNameById(userId); - flowTask.setStartUserId(userId); - flowTask.setStartUserName(nickName); + SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); + flowTask.setStartUserId(startUser.getNickName()); + flowTask.setStartUserName(startUser.getNickName()); + flowTask.setStartDeptName(startUser.getDept().getDeptName()); // 流程变量 - flowTask.setProcVars(histTask.getProcessVariables()); + flowTask.setProcVars(this.getProcessVariables(histTask.getId())); hisTaskList.add(flowTask); } @@ -546,30 +549,17 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce } @Override - public FormConf selectFormContent(String definitionId, String deployId, String procInsId) { + public String selectFormContent(String definitionId, String deployId) { BpmnModel bpmnModel = repositoryService.getBpmnModel(definitionId); if (ObjectUtil.isNull(bpmnModel)) { throw new RuntimeException("获取流程设计失败!"); } StartEvent startEvent = ModelUtils.getStartEvent(bpmnModel); - WfDeployForm deployForm = deployFormMapper.selectOne(new LambdaQueryWrapper() + WfDeployFormVo deployFormVo = deployFormMapper.selectVoOne(new LambdaQueryWrapper() .eq(WfDeployForm::getDeployId, deployId) .eq(WfDeployForm::getFormKey, startEvent.getFormKey()) .eq(WfDeployForm::getNodeKey, startEvent.getId())); - FormConf formConf = JsonUtils.parseObject(deployForm.getContent(), FormConf.class); - if (ObjectUtil.isNull(formConf)) { - throw new RuntimeException("获取流程表单失败!"); - } - if (ObjectUtil.isNotEmpty(procInsId)) { - // 获取流程实例 - HistoricProcessInstance historicProcIns = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(procInsId) - .includeProcessVariables() - .singleResult(); - // 填充表单信息 - ProcessFormUtils.fillFormData(formConf, historicProcIns.getProcessVariables()); - } - return formConf; + return deployFormVo.getContent(); } /** @@ -610,20 +600,6 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce } } - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteProcessByIds(String[] instanceIds) { - List ids = Arrays.asList(instanceIds); - // 校验流程是否结束 - long activeInsCount = runtimeService.createProcessInstanceQuery() - .processInstanceIds(new HashSet<>(ids)).active().count(); - if (activeInsCount > 0) { - throw new ServiceException("不允许删除进行中的流程实例"); - } - // 删除历史流程实例 - historyService.bulkDeleteHistoricProcessInstances(ids); - } - /** * 读取xml文件 * @param processDefId 流程定义ID @@ -775,10 +751,7 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce .eq(WfDeployForm::getDeployId, historicProcIns.getDeploymentId()) .eq(WfDeployForm::getFormKey, formKey) .eq(localScope, WfDeployForm::getNodeKey, flowElement.getId())); - - //@update by Brath:避免空集合导致的NULL空指针 - WfDeployFormVo formInfo = formInfoList.stream().findFirst().orElse(null); - + WfDeployFormVo formInfo = formInfoList.iterator().next(); if (ObjectUtil.isNotNull(formInfo)) { // 旧数据 formInfo.getFormName() 为 null String formName = Optional.ofNullable(formInfo.getFormName()).orElse(StringUtils.EMPTY); @@ -888,18 +861,17 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce if (BpmnXMLConstants.ELEMENT_EVENT_START.equals(activityInstance.getActivityType())) { if (ObjectUtil.isNotNull(historicProcIns)) { Long userId = Long.parseLong(historicProcIns.getStartUserId()); - String nickName = userService.selectNickNameById(userId); - if (nickName != null) { - elementVo.setAssigneeId(userId); - elementVo.setAssigneeName(nickName); + SysUser user = userService.selectUserById(userId); + if (user != null) { + elementVo.setAssigneeId(user.getUserId()); + elementVo.setAssigneeName(user.getNickName()); } } } else if (BpmnXMLConstants.ELEMENT_TASK_USER.equals(activityInstance.getActivityType())) { if (StringUtils.isNotBlank(activityInstance.getAssignee())) { - Long userId = Long.parseLong(activityInstance.getAssignee()); - String nickName = userService.selectNickNameById(userId); - elementVo.setAssigneeId(userId); - elementVo.setAssigneeName(nickName); + SysUser user = userService.selectUserById(Long.parseLong(activityInstance.getAssignee())); + elementVo.setAssigneeId(user.getUserId()); + elementVo.setAssigneeName(user.getNickName()); } // 展示审批人员 List linksForTask = historyService.getHistoricIdentityLinksForTask(activityInstance.getTaskId()); @@ -907,9 +879,8 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce for (HistoricIdentityLink identityLink : linksForTask) { if ("candidate".equals(identityLink.getType())) { if (StringUtils.isNotBlank(identityLink.getUserId())) { - Long userId = Long.parseLong(identityLink.getUserId()); - String nickName = userService.selectNickNameById(userId); - stringBuilder.append(nickName).append(","); + SysUser user = userService.selectUserById(Long.parseLong(identityLink.getUserId())); + stringBuilder.append(user.getNickName()).append(","); } if (StringUtils.isNotBlank(identityLink.getGroupId())) { if (identityLink.getGroupId().startsWith(TaskConstants.ROLE_GROUP_PREFIX)) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java index 993f890..5496016 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java @@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.ruoyi.common.core.service.UserService; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; @@ -17,6 +17,7 @@ import com.ruoyi.flowable.flow.CustomProcessDiagramGenerator; import com.ruoyi.flowable.flow.FlowableUtils; import com.ruoyi.flowable.utils.ModelUtils; import com.ruoyi.flowable.utils.TaskUtils; +import com.ruoyi.system.service.ISysUserService; import com.ruoyi.workflow.domain.bo.WfTaskBo; import com.ruoyi.workflow.service.IWfCopyService; import com.ruoyi.workflow.service.IWfTaskService; @@ -55,7 +56,7 @@ import java.util.stream.Collectors; @Slf4j public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskService { - private final UserService sysUserService; + private final ISysUserService sysUserService; private final IWfCopyService copyService; @@ -73,7 +74,6 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ } // 获取 bpmn 模型 BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); - identityService.setAuthenticatedUserId(TaskUtils.getUserId()); if (DelegationState.PENDING.equals(task.getDelegationState())) { taskService.addComment(taskBo.getTaskId(), taskBo.getProcInsId(), FlowComment.DELEGATE.getType(), taskBo.getComment()); taskService.resolveTask(taskBo.getTaskId()); @@ -129,7 +129,6 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ .processDefinitionId(task.getProcessDefinitionId()) .singleResult(); - identityService.setAuthenticatedUserId(TaskUtils.getUserId()); // 添加审批意见 taskService.addComment(taskBo.getTaskId(), taskBo.getProcInsId(), FlowComment.REJECT.getType(), taskBo.getComment()); // 设置流程状态为已终结 @@ -168,18 +167,36 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ } // 获取流程定义信息 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); - // 获取流程模型信息 - BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); + // 获取所有节点信息 + Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); + // 获取全部节点列表,包含子节点 + Collection allElements = FlowableUtils.getAllElements(process.getFlowElements(), null); // 获取当前任务节点元素 - FlowElement source = ModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); + FlowElement source = null; // 获取跳转的节点元素 - FlowElement target = ModelUtils.getFlowElementById(bpmnModel, bo.getTargetKey()); - // 从当前节点向前扫描,判断当前节点与目标节点是否属于串行,若目标节点是在并行网关上或非同一路线上,不可跳转 - boolean isSequential = ModelUtils.isSequentialReachable(source, target, new HashSet<>()); + FlowElement target = null; + if (allElements != null) { + for (FlowElement flowElement : allElements) { + // 当前任务节点元素 + if (flowElement.getId().equals(task.getTaskDefinitionKey())) { + source = flowElement; + } + // 跳转的节点元素 + if (flowElement.getId().equals(bo.getTargetKey())) { + target = flowElement; + } + } + } + + // 从当前节点向前扫描 + // 如果存在路线上不存在目标节点,说明目标节点是在网关上或非同一路线上,不可跳转 + // 否则目标节点相对于当前节点,属于串行 + Boolean isSequential = FlowableUtils.iteratorCheckSequentialReferTarget(source, bo.getTargetKey(), null, null); if (!isSequential) { throw new RuntimeException("当前节点相对于目标节点,不属于串行关系,无法回退"); } + // 获取所有正常进行的任务节点 Key,这些任务不能直接使用,需要找出其中需要撤回的任务 List runTaskList = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); List runTaskKeyList = new ArrayList<>(); @@ -197,7 +214,6 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ currentTaskIds.add(runTask.getId()); } })); - identityService.setAuthenticatedUserId(TaskUtils.getUserId()); // 设置回退意见 for (String currentTaskId : currentTaskIds) { taskService.addComment(currentTaskId, task.getProcessInstanceId(), FlowComment.REBACK.getType(), bo.getComment()); @@ -229,36 +245,38 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ * @return */ @Override - public List findReturnTaskList(WfTaskBo bo) { + public List findReturnTaskList(WfTaskBo bo) { // 当前任务 task Task task = taskService.createTaskQuery().taskId(bo.getTaskId()).singleResult(); // 获取流程定义信息 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); - // 获取流程模型信息 - BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); - // 查询历史节点实例 - List activityInstanceList = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(task.getProcessInstanceId()) - .activityType(BpmnXMLConstants.ELEMENT_TASK_USER) - .finished() - .orderByHistoricActivityInstanceEndTime().asc() - .list(); - List activityIdList = activityInstanceList.stream() - .map(HistoricActivityInstance::getActivityId) - .filter(activityId -> !StringUtils.equals(activityId, task.getTaskDefinitionKey())) - .distinct() - .collect(Collectors.toList()); + // 获取所有节点信息,暂不考虑子流程情况 + Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); + Collection flowElements = process.getFlowElements(); // 获取当前任务节点元素 - FlowElement source = ModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); - List elementList = new ArrayList<>(); - for (String activityId : activityIdList) { - FlowElement target = ModelUtils.getFlowElementById(bpmnModel, activityId); - boolean isSequential = ModelUtils.isSequentialReachable(source, target, new HashSet<>()); - if (isSequential) { - elementList.add(target); + UserTask source = null; + if (flowElements != null) { + for (FlowElement flowElement : flowElements) { + // 类型为用户节点 + if (flowElement.getId().equals(task.getTaskDefinitionKey())) { + source = (UserTask) flowElement; + } } } - return elementList; + // 获取节点的所有路线 + List> roads = FlowableUtils.findRoad(source, null, null, null); + // 可回退的节点列表 + List userTaskList = new ArrayList<>(); + for (List road : roads) { + if (userTaskList.size() == 0) { + // 还没有可回退节点直接添加 + userTaskList = road; + } else { + // 如果已有回退节点,则比对取交集部分 + userTaskList.retainAll(road); + } + } + return userTaskList; } /** @@ -269,7 +287,6 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ @Override public void deleteTask(WfTaskBo bo) { // todo 待确认删除任务是物理删除任务 还是逻辑删除,让这个任务直接通过? - identityService.setAuthenticatedUserId(TaskUtils.getUserId()); taskService.deleteTask(bo.getTaskId(), bo.getComment()); } @@ -314,16 +331,15 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ } StringBuilder commentBuilder = new StringBuilder(LoginHelper.getNickName()) .append("->"); - String nickName = sysUserService.selectNickNameById(Long.parseLong(bo.getUserId())); - if (StringUtils.isNotBlank(nickName)) { - commentBuilder.append(nickName); + SysUser user = sysUserService.selectUserById(Long.parseLong(bo.getUserId())); + if (ObjectUtil.isNotNull(user)) { + commentBuilder.append(user.getNickName()); } else { commentBuilder.append(bo.getUserId()); } if (StringUtils.isNotBlank(bo.getComment())) { commentBuilder.append(": ").append(bo.getComment()); } - identityService.setAuthenticatedUserId(TaskUtils.getUserId()); // 添加审批意见 taskService.addComment(bo.getTaskId(), task.getProcessInstanceId(), FlowComment.DELEGATE.getType(), commentBuilder.toString()); // 设置办理人为当前登录人 @@ -354,16 +370,15 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ } StringBuilder commentBuilder = new StringBuilder(LoginHelper.getNickName()) .append("->"); - String nickName = sysUserService.selectNickNameById(Long.parseLong(bo.getUserId())); - if (StringUtils.isNotBlank(nickName)) { - commentBuilder.append(nickName); + SysUser user = sysUserService.selectUserById(Long.parseLong(bo.getUserId())); + if (ObjectUtil.isNotNull(user)) { + commentBuilder.append(user.getNickName()); } else { commentBuilder.append(bo.getUserId()); } if (StringUtils.isNotBlank(bo.getComment())) { commentBuilder.append(": ").append(bo.getComment()); } - identityService.setAuthenticatedUserId(TaskUtils.getUserId()); // 添加审批意见 taskService.addComment(bo.getTaskId(), task.getProcessInstanceId(), FlowComment.TRANSFER.getType(), commentBuilder.toString()); // 设置拥有者为当前登录人 @@ -386,8 +401,8 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ */ @Override public void stopProcess(WfTaskBo bo) { - List taskList = taskService.createTaskQuery().processInstanceId(bo.getProcInsId()).list(); - if (CollectionUtils.isEmpty(taskList)) { + List task = taskService.createTaskQuery().processInstanceId(bo.getProcInsId()).list(); + if (CollectionUtils.isEmpty(task)) { throw new RuntimeException("流程未启动或已执行完成,取消申请失败"); } @@ -399,10 +414,8 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ List endNodes = process.findFlowElementsOfType(EndEvent.class, false); if (CollectionUtils.isNotEmpty(endNodes)) { Authentication.setAuthenticatedUserId(TaskUtils.getUserId()); - runtimeService.setVariable(processInstance.getId(), ProcessConstants.PROCESS_STATUS_KEY, ProcessStatus.CANCELED.getStatus()); - for (Task task : taskList) { - taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.STOP.getType(), "取消流程"); - } +// taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.STOP.getType(), +// StringUtils.isBlank(flowTaskVo.getComment()) ? "取消申请" : flowTaskVo.getComment()); // 获取当前流程最后一个节点 String endId = endNodes.get(0).getId(); List executions = runtimeService.createExecutionQuery() @@ -464,7 +477,6 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ // 获取所有激活的任务节点,找到需要撤回的任务 List activateTaskList = taskService.createTaskQuery().processInstanceId(procInsId).list(); List revokeExecutionIds = new ArrayList<>(); - identityService.setAuthenticatedUserId(TaskUtils.getUserId()); for (Task task : activateTaskList) { // 检查激活的任务节点是否存在下一级中,如果存在,则加入到需要撤回的节点 if (CollUtil.contains(nextUserTaskKeys, task.getTaskDefinitionKey())) { @@ -564,7 +576,6 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ List tasks = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).list(); if (CollUtil.isNotEmpty(tasks)) { String userIdStr = (String) variables.get(TaskConstants.PROCESS_INITIATOR); - identityService.setAuthenticatedUserId(TaskUtils.getUserId()); for (Task task : tasks) { if (StrUtil.equals(task.getAssignee(), userIdStr)) { taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), LoginHelper.getNickName() + "发起流程申请"); diff --git a/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml index 90dff50..94523ae 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -9,6 +9,7 @@ + @@ -26,6 +27,7 @@ r.role_name, r.role_key, r.role_sort, + r.tenant_id, r.data_scope, r.menu_check_strictly, r.dept_check_strictly, diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index e73e715..dc9ebc7 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -7,6 +7,7 @@ + @@ -50,6 +51,7 @@ select u.user_id, u.dept_id, + u.tenant_id, u.user_name, u.nick_name, u.user_type, @@ -128,11 +130,6 @@ where u.del_flag = '0' and u.phonenumber = #{phonenumber} - -