Merge branch 'main' of https://git.jsspisoft.com/ry-das
This commit is contained in:
commit
a76ad92166
20
das/pom.xml
20
das/pom.xml
@ -24,6 +24,7 @@
|
||||
|
||||
<postgresql.version>42.7.3</postgresql.version>
|
||||
<sa.version>1.38.0</sa.version>
|
||||
<annotations.version>4.8.6</annotations.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
@ -65,14 +66,6 @@
|
||||
<version>${sa.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- hutool 的依赖配置-->
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-all</artifactId>
|
||||
<version>${hutool.version}</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.dev33</groupId>
|
||||
<artifactId>sa-token-redis-jackson</artifactId>
|
||||
@ -108,7 +101,8 @@
|
||||
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
|
||||
<version>${mybatis.plus.spring.boot}</version>
|
||||
</dependency>
|
||||
<!--hutool-->
|
||||
|
||||
<!-- hutool 的依赖配置-->
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-core</artifactId>
|
||||
@ -142,6 +136,14 @@
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-aop</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 临时修复MAYBE枚举量未定义问题,等待Spring6.2正式发行-->
|
||||
<dependency>
|
||||
<groupId>com.github.spotbugs</groupId>
|
||||
<artifactId>spotbugs-annotations</artifactId>
|
||||
<version>${annotations.version}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
@ -2,11 +2,9 @@ package com.das.common.config;
|
||||
|
||||
import cn.dev33.satoken.stp.StpInterface;
|
||||
import cn.dev33.satoken.stp.StpUtil;
|
||||
import org.springframework.stereotype.Component;
|
||||
import com.das.modules.auth.domain.vo.SysUserVo;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.das.common.result;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.lang.Nullable;
|
||||
|
||||
import java.io.Serial;
|
||||
@ -10,6 +12,8 @@ import java.util.Optional;
|
||||
* @author chenhaojie
|
||||
* @Description 公共返回信息
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
public class R<T> implements Serializable {
|
||||
|
||||
@Serial
|
||||
@ -120,38 +124,6 @@ public class R<T> implements Serializable {
|
||||
return flag ? success("操作成功") : fail("操作失败");
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return this.code;
|
||||
}
|
||||
|
||||
public boolean isSuccess() {
|
||||
return this.success;
|
||||
}
|
||||
|
||||
public T getData() {
|
||||
return this.data;
|
||||
}
|
||||
|
||||
public String getMsg() {
|
||||
return this.msg;
|
||||
}
|
||||
|
||||
public void setCode(final int code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public void setSuccess(final boolean success) {
|
||||
this.success = success;
|
||||
}
|
||||
|
||||
public void setData(final T data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public void setMsg(final String msg) {
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "R(code=" + this.getCode() + ", success=" + this.isSuccess() + ", data=" + this.getData() + ", msg=" + this.getMsg() + ")";
|
||||
|
@ -1,8 +1,8 @@
|
||||
package com.das.common.utils;
|
||||
|
||||
import cn.hutool.http.HttpStatus;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.springframework.http.HttpStatus;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
@ -52,7 +52,7 @@ public class PageDataInfo<T> implements Serializable {
|
||||
|
||||
public static <T> PageDataInfo<T> build(List<T> list, long total) {
|
||||
PageDataInfo<T> rspData = new PageDataInfo<>();
|
||||
rspData.setCode(HttpStatus.HTTP_OK);
|
||||
rspData.setCode(HttpStatus.OK.value());
|
||||
rspData.setMsg("查询成功");
|
||||
rspData.setRows(list);
|
||||
rspData.setTotal(total);
|
||||
@ -61,7 +61,7 @@ public class PageDataInfo<T> implements Serializable {
|
||||
|
||||
public static <T> PageDataInfo<T> build(List<T> list) {
|
||||
PageDataInfo<T> rspData = new PageDataInfo<>();
|
||||
rspData.setCode(HttpStatus.HTTP_OK);
|
||||
rspData.setCode(HttpStatus.OK.value());
|
||||
rspData.setMsg("查询成功");
|
||||
rspData.setRows(list);
|
||||
rspData.setTotal(list.size());
|
||||
@ -70,7 +70,7 @@ public class PageDataInfo<T> implements Serializable {
|
||||
|
||||
public static <T> PageDataInfo<T> build() {
|
||||
PageDataInfo<T> rspData = new PageDataInfo<>();
|
||||
rspData.setCode(HttpStatus.HTTP_OK);
|
||||
rspData.setCode(HttpStatus.OK.value());
|
||||
rspData.setMsg("查询成功");
|
||||
return rspData;
|
||||
}
|
||||
|
@ -5,8 +5,6 @@ import cn.hutool.core.util.ObjectUtil;
|
||||
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.das.common.exceptions.ServiceException;
|
||||
import com.das.common.utils.SqlUtil;
|
||||
import com.das.common.utils.StringUtils;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
|
@ -6,9 +6,10 @@ import com.das.common.captcha.CaptchaUtils;
|
||||
import com.das.common.captcha.CaptchaVO;
|
||||
import com.das.common.result.R;
|
||||
import com.das.common.utils.AdminRedisTemplate;
|
||||
import com.das.modules.auth.domain.vo.LoginUserDetailsVo;
|
||||
import com.das.modules.auth.domain.dto.ChangePasswordDto;
|
||||
import com.das.modules.auth.domain.dto.LoginDto;
|
||||
import com.das.modules.auth.domain.dto.RefreshTokenDto;
|
||||
import com.das.modules.auth.domain.vo.LoginUserDetailsVo;
|
||||
import com.das.modules.auth.domain.vo.LoginVo;
|
||||
import com.das.modules.auth.service.LoginService;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
@ -17,7 +18,10 @@ import jakarta.annotation.Resource;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
|
||||
/**
|
||||
@ -56,12 +60,8 @@ public class LoginController {
|
||||
*/
|
||||
@PostMapping("/logout")
|
||||
public R<?> logout(HttpServletRequest request) {
|
||||
if (loginService.logout(request)) {
|
||||
return R.success("退出成功");
|
||||
} else {
|
||||
return R.fail("退出失败");
|
||||
}
|
||||
|
||||
loginService.logout(request);
|
||||
return R.success("退出成功");
|
||||
}
|
||||
|
||||
@PostMapping("/captchaImage")
|
||||
@ -78,5 +78,13 @@ public class LoginController {
|
||||
return R.success(loginVO);
|
||||
}
|
||||
|
||||
@PostMapping("/changePassword")
|
||||
public R<?> changePassword(@RequestBody ChangePasswordDto changePasswordDto) {
|
||||
int result = loginService.changePassword(changePasswordDto);
|
||||
if (result < 0) {
|
||||
return R.fail("密码修改失败");
|
||||
}
|
||||
return R.success("密码修改成功");
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -5,7 +5,9 @@ import com.das.common.constant.SysAuthorityIds;
|
||||
import com.das.common.result.R;
|
||||
import com.das.common.utils.PageDataInfo;
|
||||
import com.das.common.utils.PageQuery;
|
||||
import com.das.modules.auth.domain.dto.*;
|
||||
import com.das.modules.auth.domain.dto.DeleteDto;
|
||||
import com.das.modules.auth.domain.dto.SysRoleDto;
|
||||
import com.das.modules.auth.domain.dto.SysRoleQueryDto;
|
||||
import com.das.modules.auth.domain.vo.SysRoleVo;
|
||||
import com.das.modules.auth.service.SysRoleService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
@ -0,0 +1,20 @@
|
||||
package com.das.modules.auth.domain.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class ChangePasswordDto {
|
||||
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
private String phone;
|
||||
|
||||
private String email;
|
||||
|
||||
private String userName;
|
||||
|
||||
private String newPassword;
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
package com.das.modules.auth.domain.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
@ -7,5 +9,6 @@ import java.io.Serializable;
|
||||
@Data
|
||||
public class DeleteDto implements Serializable {
|
||||
/** ID */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
}
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.das.modules.auth.domain.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
@ -8,6 +10,7 @@ import java.util.Date;
|
||||
@Data
|
||||
public class SysAuthorityDto implements Serializable {
|
||||
/** 机构id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id ;
|
||||
/** 权限编码 */
|
||||
private String authorityCode;
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.das.modules.auth.domain.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
@ -8,6 +10,7 @@ import java.util.Date;
|
||||
@Data
|
||||
public class SysMenuDto implements Serializable {
|
||||
/** 菜单ID */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id ;
|
||||
/** 菜单名称 */
|
||||
private String menuName ;
|
||||
@ -20,8 +23,10 @@ public class SysMenuDto implements Serializable {
|
||||
/** 菜单操作参数 */
|
||||
private String funParam ;
|
||||
/** 权限ID */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long authorityId ;
|
||||
/** 上级菜单ID */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long parentMenuId ;
|
||||
/** 乐观锁 */
|
||||
private Integer revision ;
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.das.modules.auth.domain.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
@ -7,11 +9,13 @@ import java.io.Serializable;
|
||||
@Data
|
||||
public class SysMenuQueryDto implements Serializable {
|
||||
/** 菜单ID */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id ;
|
||||
|
||||
/** 菜单名称 */
|
||||
private String menuName ;
|
||||
/** 上级菜单ID */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long parentMenuId ;
|
||||
|
||||
/** 是否是首次查询菜单 */
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.das.modules.auth.domain.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
@ -8,6 +10,7 @@ import java.util.Date;
|
||||
@Data
|
||||
public class SysOrgDto implements Serializable {
|
||||
/** 机构id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id ;
|
||||
/** 机构名称 */
|
||||
private String name ;
|
||||
@ -28,6 +31,7 @@ public class SysOrgDto implements Serializable {
|
||||
/** 机构简称 */
|
||||
private String aliasName;
|
||||
/** 上级组织机构id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long parentOrgId ;
|
||||
/** 乐观锁 */
|
||||
private Integer revision ;
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.das.modules.auth.domain.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
@ -14,6 +16,8 @@ public class SysOrgQueryDto implements Serializable {
|
||||
private String city ;
|
||||
/** 区县 */
|
||||
private String county ;
|
||||
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long parentOrgId ;
|
||||
/** 是否是首次查询机构 */
|
||||
private Boolean recursive;
|
||||
|
@ -1,14 +1,16 @@
|
||||
package com.das.modules.auth.domain.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class SysRoleDto implements Serializable {
|
||||
/** 主键id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id ;
|
||||
/** 角色名称 */
|
||||
private String roleName ;
|
||||
|
@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
@ -39,6 +38,7 @@ public class SysUserDto implements Serializable {
|
||||
/**
|
||||
* 所属机构id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long orgId;
|
||||
/**
|
||||
* 最后登录时间
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.das.modules.auth.domain.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
@ -9,5 +11,9 @@ public class SysUserQueryDto implements Serializable {
|
||||
/** 职员名称 */
|
||||
private String userName ;
|
||||
/** 组织机构id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long orgId ;
|
||||
/** 用户主键id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id ;
|
||||
}
|
||||
|
@ -5,7 +5,6 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
public class SysOrgVo implements Serializable {
|
||||
|
@ -1,7 +1,5 @@
|
||||
package com.das.modules.auth.domain.vo;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.Version;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
@ -45,6 +45,11 @@ public class SysUserVo implements Serializable {
|
||||
*/
|
||||
private String phone;
|
||||
|
||||
/**
|
||||
* 最后登录时间
|
||||
*/
|
||||
private String lastLogin;
|
||||
|
||||
/**
|
||||
* E-Mail地址
|
||||
*/
|
||||
|
@ -4,7 +4,10 @@ import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.das.common.constant.BaseEntity;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.*;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.io.Serial;
|
||||
|
@ -1,9 +1,7 @@
|
||||
package com.das.modules.auth.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.das.modules.auth.entity.SysAuthority;
|
||||
import com.das.modules.auth.entity.SysRoleAuthority;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -1,10 +1,10 @@
|
||||
package com.das.modules.auth.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.das.modules.auth.domain.dto.SysUserQueryDto;
|
||||
import com.das.modules.auth.domain.vo.SysUserVo;
|
||||
import com.das.modules.auth.entity.SysUser;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
@ -27,7 +27,6 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
|
||||
long existUserByAccount(@Param("account") String account);
|
||||
IPage<SysUserVo> queryUserList(IPage<SysUserVo> page, @Param("sysUser") SysUserQueryDto sysUserQueryDto);
|
||||
|
||||
long existUserByUserName(@Param("userName") String userName);
|
||||
/**
|
||||
* 根据用户id查询权限列表
|
||||
* @param userId 用户id
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.das.modules.auth.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.das.modules.auth.entity.SysRoleAuthority;
|
||||
import com.das.modules.auth.entity.SysUserRole;
|
||||
|
||||
|
||||
|
@ -1,9 +1,11 @@
|
||||
package com.das.modules.auth.service;
|
||||
|
||||
|
||||
import com.das.modules.auth.domain.dto.ChangePasswordDto;
|
||||
import com.das.modules.auth.domain.vo.LoginUserDetailsVo;
|
||||
import com.das.modules.auth.domain.dto.LoginDto;
|
||||
import com.das.modules.auth.domain.dto.RefreshTokenDto;
|
||||
import com.das.modules.auth.domain.vo.LoginUserDetailsVo;
|
||||
import com.das.modules.auth.domain.vo.LoginVo;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
@ -28,7 +30,7 @@ public interface LoginService {
|
||||
* 退出登录
|
||||
* @return 是否退出成功
|
||||
*/
|
||||
boolean logout(HttpServletRequest request);
|
||||
void logout(HttpServletRequest request);
|
||||
|
||||
/**
|
||||
* 刷新token
|
||||
@ -36,4 +38,6 @@ public interface LoginService {
|
||||
* @return
|
||||
*/
|
||||
LoginVo refreshToken(RefreshTokenDto refreshToken);
|
||||
|
||||
int changePassword(ChangePasswordDto changePasswordDto);
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
package com.das.modules.auth.service;
|
||||
|
||||
import com.das.modules.auth.domain.dto.SysAuthorityDto;
|
||||
import com.das.modules.auth.entity.SysAuthority;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -7,7 +7,6 @@ import com.das.modules.auth.domain.dto.SysMenuDto;
|
||||
import com.das.modules.auth.domain.dto.SysMenuQueryDto;
|
||||
import com.das.modules.auth.domain.vo.SysMenuVo;
|
||||
import com.das.modules.auth.entity.SysMenu;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
@ -2,7 +2,9 @@ package com.das.modules.auth.service;
|
||||
|
||||
import com.das.common.utils.PageDataInfo;
|
||||
import com.das.common.utils.PageQuery;
|
||||
import com.das.modules.auth.domain.dto.*;
|
||||
import com.das.modules.auth.domain.dto.DeleteDto;
|
||||
import com.das.modules.auth.domain.dto.SysOrgDto;
|
||||
import com.das.modules.auth.domain.dto.SysOrgQueryDto;
|
||||
import com.das.modules.auth.entity.SysOrg;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -2,10 +2,11 @@ package com.das.modules.auth.service;
|
||||
|
||||
import com.das.common.utils.PageDataInfo;
|
||||
import com.das.common.utils.PageQuery;
|
||||
import com.das.modules.auth.domain.dto.*;
|
||||
import com.das.modules.auth.domain.dto.DeleteDto;
|
||||
import com.das.modules.auth.domain.dto.SysRoleDto;
|
||||
import com.das.modules.auth.domain.dto.SysRoleQueryDto;
|
||||
import com.das.modules.auth.domain.vo.SysRoleAuthVo;
|
||||
import com.das.modules.auth.domain.vo.SysRoleVo;
|
||||
import com.das.modules.auth.entity.SysRole;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
@ -6,7 +6,6 @@ import com.das.modules.auth.domain.dto.DeleteDto;
|
||||
import com.das.modules.auth.domain.dto.SysUserDto;
|
||||
import com.das.modules.auth.domain.dto.SysUserQueryDto;
|
||||
import com.das.modules.auth.domain.vo.SysUserVo;
|
||||
import com.das.modules.auth.entity.SysUser;
|
||||
|
||||
public interface SysUserService {
|
||||
SysUserDto createUser(SysUserDto sysUserDto);
|
||||
|
@ -8,10 +8,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.das.common.captcha.CaptchaUtils;
|
||||
import com.das.common.config.SaTokenProperties;
|
||||
import com.das.common.config.SessionUtil;
|
||||
import com.das.common.exceptions.ServiceException;
|
||||
import com.das.common.utils.AdminRedisTemplate;
|
||||
import com.das.modules.auth.domain.dto.ChangePasswordDto;
|
||||
import com.das.modules.auth.domain.vo.LoginUserDetailsVo;
|
||||
import com.das.modules.auth.domain.dto.LoginDto;
|
||||
import com.das.modules.auth.domain.dto.RefreshTokenDto;
|
||||
import com.das.modules.auth.domain.vo.LoginUserDetailsVo;
|
||||
import com.das.modules.auth.domain.vo.LoginVo;
|
||||
import com.das.modules.auth.domain.vo.SysUserVo;
|
||||
import com.das.modules.auth.entity.SysUser;
|
||||
@ -22,8 +25,10 @@ import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author chenhaojie
|
||||
@ -63,6 +68,9 @@ public class LoginServiceImpl implements LoginService {
|
||||
loginInfo.setMsg("账号密码错误");
|
||||
return loginInfo;
|
||||
}
|
||||
// 更新用户登录时间
|
||||
sysUser.setLastLogin(new Date());
|
||||
sysUserMapper.updateById(sysUser);
|
||||
StpUtil.login(sysUser.getAccount());// 执行登录,这里username为用户唯一标识
|
||||
String refreshTokenUuid = IdUtil.fastSimpleUUID();
|
||||
String token = StpUtil.getTokenValue().replace("-", "");
|
||||
@ -93,11 +101,10 @@ public class LoginServiceImpl implements LoginService {
|
||||
|
||||
|
||||
@Override
|
||||
public boolean logout(HttpServletRequest request) {
|
||||
public void logout(HttpServletRequest request) {
|
||||
String token = request.getHeader("token");
|
||||
adminRedisTemplate.del(token);
|
||||
StpUtil.logoutByTokenValue(token);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -126,4 +133,25 @@ public class LoginServiceImpl implements LoginService {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int changePassword(ChangePasswordDto changePasswordDto) {
|
||||
if (changePasswordDto.getId() == null) {
|
||||
throw new ServiceException("非法调用,参数缺失");
|
||||
}
|
||||
SysUser sysUser = sysUserMapper.selectById(changePasswordDto.getId());
|
||||
if (sysUser == null) {
|
||||
throw new ServiceException("用户不存在");
|
||||
}
|
||||
String newPassword ="";
|
||||
if (!StringUtils.isEmpty(changePasswordDto.getNewPassword())) {
|
||||
newPassword = BCrypt.hashpw(changePasswordDto.getNewPassword(), BCrypt.gensalt());
|
||||
sysUser.setPassword(newPassword);
|
||||
}
|
||||
sysUser.setUserName(changePasswordDto.getUserName());
|
||||
sysUser.setEmail(changePasswordDto.getEmail());
|
||||
sysUser.setPhone(changePasswordDto.getPhone());
|
||||
sysUser.setUpdatedTime(new Date());
|
||||
return sysUserMapper.updateById(sysUser);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,11 +1,10 @@
|
||||
package com.das.modules.auth.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.das.common.utils.BeanCopyUtils;
|
||||
import com.das.common.utils.SequenceUtils;
|
||||
import com.das.common.utils.PageDataInfo;
|
||||
import com.das.common.utils.PageQuery;
|
||||
import com.das.common.utils.SequenceUtils;
|
||||
import com.das.modules.auth.domain.dto.DeleteDto;
|
||||
import com.das.modules.auth.domain.dto.SysMenuDto;
|
||||
import com.das.modules.auth.domain.dto.SysMenuQueryDto;
|
||||
@ -15,7 +14,6 @@ import com.das.modules.auth.mapper.SysMenuMapper;
|
||||
import com.das.modules.auth.service.SysMenuService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
|
@ -39,6 +39,7 @@ public class SysOrgServiceImpl implements SysOrgService {
|
||||
public void updateOrg(SysOrgDto sysOrgDto) {
|
||||
SysOrg sysOrg = new SysOrg();
|
||||
BeanCopyUtils.copy(sysOrgDto,sysOrg);
|
||||
sysOrg.setUpdatedTime(new Date());
|
||||
sysOrgMapper.updateById(sysOrg);
|
||||
}
|
||||
|
||||
|
@ -135,6 +135,7 @@ public class SysRoleServiceImpl implements SysRoleService {
|
||||
sysRole.setRoleName(sysRoleDto.getRoleName());
|
||||
sysRole.setRoleCode(sysRoleDto.getRoleCode());
|
||||
sysRole.setId(sysRoleDto.getId());
|
||||
sysRole.setUpdatedTime(new Date());
|
||||
this.sysRoleMapper.updateById(sysRole);
|
||||
//验证权限有效性
|
||||
String errorAuths = checkErrorAuthorities(sysRoleDto.getAuthList());
|
||||
|
@ -5,15 +5,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.das.common.exceptions.ServiceException;
|
||||
import com.das.common.utils.BeanCopyUtils;
|
||||
import com.das.common.utils.SequenceUtils;
|
||||
import com.das.common.utils.PageDataInfo;
|
||||
import com.das.common.utils.PageQuery;
|
||||
import com.das.common.utils.SequenceUtils;
|
||||
import com.das.modules.auth.domain.dto.DeleteDto;
|
||||
import com.das.modules.auth.domain.dto.SysUserDto;
|
||||
import com.das.modules.auth.domain.dto.SysUserQueryDto;
|
||||
import com.das.modules.auth.domain.vo.SysUserVo;
|
||||
import com.das.modules.auth.entity.SysRole;
|
||||
import com.das.modules.auth.entity.SysRoleAuthority;
|
||||
import com.das.modules.auth.entity.SysUser;
|
||||
import com.das.modules.auth.entity.SysUserRole;
|
||||
import com.das.modules.auth.mapper.SysRoleMapper;
|
||||
@ -58,7 +56,7 @@ public class SysUserServiceImpl implements SysUserService {
|
||||
SysUser sysUser = new SysUser();
|
||||
BeanCopyUtils.copy(sysUserDto,sysUser);
|
||||
//密码加密
|
||||
String passwordEncode = BCrypt.hashpw(sysUserDto.getPassword(), BCrypt.gensalt());
|
||||
String passwordEncode = BCrypt.hashpw("123456789", BCrypt.gensalt());
|
||||
sysUser.setId(SequenceUtils.generateId());
|
||||
sysUser.setRevision(1);
|
||||
sysUser.setCreatedTime(new Date());
|
||||
@ -128,18 +126,19 @@ public class SysUserServiceImpl implements SysUserService {
|
||||
if (sysUser == null) {
|
||||
throw new ServiceException(String.format("账号 %d 不存在", sysUserDto.getId()));
|
||||
}
|
||||
if (StringUtils.hasText(sysUserDto.getUserName())) {
|
||||
if (StringUtils.hasText(sysUserDto.getAccount())) {
|
||||
//若与数据库中账户名相同 则表示未对名称进行修改
|
||||
if (!sysUser.getUserName().equals(sysUserDto.getUserName())) {
|
||||
if (!sysUser.getAccount().equals(sysUserDto.getAccount())) {
|
||||
//判断账户名是否存在
|
||||
long userCount = sysUserMapper.existUserByUserName(sysUserDto.getUserName());
|
||||
long userCount = sysUserMapper.existUserByAccount(sysUserDto.getAccount());
|
||||
if (userCount > 0) {
|
||||
throw new ServiceException(String.format("账户名 %s 已存在", sysUserDto.getUserName()));
|
||||
throw new ServiceException(String.format("账户名 %s 已存在", sysUserDto.getAccount()));
|
||||
}
|
||||
}
|
||||
}
|
||||
SysUser newSysUser = new SysUser();
|
||||
BeanUtils.copyProperties(sysUserDto, newSysUser, "password");
|
||||
newSysUser.setUpdatedTime(new Date());
|
||||
sysUserMapper.updateById(newSysUser);
|
||||
|
||||
if (sysUserDto.getRoleList() != null) {
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.das.modules.equipment.controller;
|
||||
|
||||
import com.das.common.result.R;
|
||||
import com.das.common.constant.EquipmentTypeIds;
|
||||
import com.das.common.result.R;
|
||||
import com.das.modules.equipment.domain.vo.EquipmentTypeVo;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
|
@ -25,6 +25,7 @@
|
||||
<result property="userName" column="user_name" jdbcType="VARCHAR"/>
|
||||
<result property="email" column="email" jdbcType="VARCHAR"/>
|
||||
<result property="phone" column="phone" jdbcType="VARCHAR"/>
|
||||
<result property="lastLogin" column="last_login" jdbcType="VARCHAR"/>
|
||||
<result property="orgId" column="org_id" jdbcType="VARCHAR"/>
|
||||
<result property="revision" column="revision" jdbcType="VARCHAR"/>
|
||||
<collection property="roleList" column="id" ofType="com.das.modules.auth.domain.vo.SysUserRoleVo" select="queryRoleByUserId"/>
|
||||
@ -42,10 +43,6 @@
|
||||
select count(1) from sys_user t where t.account=#{account}
|
||||
</select>
|
||||
|
||||
<select id="existUserByUserName" resultType="java.lang.Long">
|
||||
select count(1) from sys_user t where t.user_name=#{userName}
|
||||
</select>
|
||||
|
||||
<select id="queryRoleByUserId" resultMap="UserRoleRelationMap">
|
||||
select sr.role_code,sr.role_name ,sr.id ,sr.revision from sys_role sr left join sys_r_user_role srur on sr.id = srur.role_id
|
||||
where srur.user_id = #{id}
|
||||
@ -61,6 +58,9 @@
|
||||
<if test="sysUser.orgId != null and sysUser.orgId != ''">
|
||||
and org_id = #{sysUser.orgId}
|
||||
</if>
|
||||
<if test="sysUser.id != null and sysUser.id != ''">
|
||||
and id = #{sysUser.id}
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
|
@ -5,9 +5,13 @@ ENV = 'development'
|
||||
VITE_BASE_PATH = './'
|
||||
|
||||
# 代理配置(开发使用),必须在一行中
|
||||
# 本地
|
||||
# VITE_APP_PROXY=[["/api","http://192.168.130.12:8080/api"]]
|
||||
# 线上
|
||||
VITE_APP_PROXY=[["/api","http://192.168.109.195:8080/api"]]
|
||||
|
||||
|
||||
|
||||
# 开发环境下跨域代理,请输入要跨域的api地址 - 尾部无需带'/'
|
||||
# VITE_PROXY_URL = 'http://localhost:8000'
|
||||
VITE_AXIOS_BASE_URL = 'http://localhost:1818'
|
||||
|
@ -37,7 +37,6 @@ export function menusTree(params: object = {}) {
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
// 菜单管理查询
|
||||
export function menusQuery(params: object = {}) {
|
||||
return createAxios({
|
||||
@ -137,3 +136,11 @@ export function allRoleQuery(params: object = {}) {
|
||||
})
|
||||
}
|
||||
|
||||
// 获取绑定菜单
|
||||
export function menuTree(params: object = {}) {
|
||||
return createAxios({
|
||||
url: '/api/menus/tree',
|
||||
method: 'POST',
|
||||
data: params,
|
||||
})
|
||||
}
|
||||
|
@ -25,6 +25,7 @@ import { BEFORE_RESIZE_LAYOUT } from '/@/stores/constant/cacheKey'
|
||||
import { isEmpty } from 'lodash-es'
|
||||
import { setNavTabsWidth } from '/@/utils/layout'
|
||||
import { id } from 'element-plus/es/locales.mjs'
|
||||
import { menuTree } from '/@/api/backend'
|
||||
|
||||
defineOptions({
|
||||
components: { Default, Classic, Streamline, Double },
|
||||
@ -350,7 +351,58 @@ const menu = [
|
||||
},
|
||||
]
|
||||
|
||||
function transformNode(menu: any) {
|
||||
menu = menu.map((node: any) => {
|
||||
return {
|
||||
id: Number(node.id),
|
||||
pid: node.parentMenuId,
|
||||
type: node.children.length != 0 ? 'menu_dir' : 'menu',
|
||||
title: node.menuName,
|
||||
name: node.menuName,
|
||||
path: node.menuName,
|
||||
icon: node.menuIcon,
|
||||
menu_type: node.children.length != 0 ? null : 'tab',
|
||||
component: node.children.length != 0 ? '' : '/src/views/backend' + node.funParam,
|
||||
extend: node.menuName,
|
||||
keepalive: 0,
|
||||
children: transformNode(node.children),
|
||||
}
|
||||
})
|
||||
return menu
|
||||
}
|
||||
const init = () => {
|
||||
menuTree().then((res: any) => {
|
||||
console.log('🚀 ~ menusLoginTree ~ res:', res)
|
||||
const menu = transformNode(res.data.children)
|
||||
console.log('🚀 ~ menusLoginTree ~ menu:', menu)
|
||||
handleAdminRoute(menu)
|
||||
if (route.params.to) {
|
||||
const lastRoute = JSON.parse(route.params.to as string)
|
||||
if (lastRoute.path != adminBaseRoutePath) {
|
||||
let query = !isEmpty(lastRoute.query) ? lastRoute.query : {}
|
||||
routePush({ path: decodeURIComponent(lastRoute.path), query: query })
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 跳转到第一个菜单
|
||||
let firstRoute = getFirstRoute(navTabs.state.tabsViewRoutes)
|
||||
if (firstRoute) routePush(firstRoute.path)
|
||||
})
|
||||
// handleAdminRoute(menu)
|
||||
// if (route.params.to) {
|
||||
// const lastRoute = JSON.parse(route.params.to as string)
|
||||
// if (lastRoute.path != adminBaseRoutePath) {
|
||||
// let query = !isEmpty(lastRoute.query) ? lastRoute.query : {}
|
||||
// routePush({ path: lastRoute.path, query: query })
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
|
||||
// // 跳转到第一个菜单
|
||||
// let firstRoute = getFirstRoute(navTabs.state.tabsViewRoutes)
|
||||
// if (firstRoute) routePush(firstRoute.path)
|
||||
|
||||
/**
|
||||
* 后台初始化请求,获取站点配置,动态路由等信息
|
||||
*/
|
||||
@ -366,21 +418,9 @@ const init = () => {
|
||||
// }
|
||||
|
||||
// if (res.data) {
|
||||
handleAdminRoute(menu)
|
||||
|
||||
// 预跳转到上次路径
|
||||
if (route.params.to) {
|
||||
const lastRoute = JSON.parse(route.params.to as string)
|
||||
if (lastRoute.path != adminBaseRoutePath) {
|
||||
let query = !isEmpty(lastRoute.query) ? lastRoute.query : {}
|
||||
routePush({ path: lastRoute.path, query: query })
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 跳转到第一个菜单
|
||||
let firstRoute = getFirstRoute(navTabs.state.tabsViewRoutes)
|
||||
if (firstRoute) routePush(firstRoute.path)
|
||||
// }
|
||||
// })
|
||||
}
|
||||
|
@ -90,13 +90,11 @@ function createAxios<Data = any, T = ApiPromise<Data>>(axiosConfig: AxiosRequest
|
||||
|
||||
if (config.method === 'post' && config.data) {
|
||||
// 对data进行加密
|
||||
// const formData = new FormData()
|
||||
// formData.append('param')
|
||||
console.log(config.data)
|
||||
config.data = encrypt_aes(config.data, v)
|
||||
} else if (config.method === 'get' && config.params) {
|
||||
// 对params进行加密
|
||||
// const formData = new FormData()
|
||||
// formData.append('param')
|
||||
console.log(config.params)
|
||||
config.params = encrypt_aes(config.params, v)
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import CryptoJS from 'crypto-js'
|
||||
|
||||
const key = 'b6967ee87b86d85a'
|
||||
const ivv = '6920559358617460'
|
||||
|
||||
export function encrypt_aes(text: any, iv: string) {
|
||||
let plaintText = text
|
||||
|
@ -65,9 +65,9 @@
|
||||
:rules="rules"
|
||||
style="padding: 24px 40px; font-size: 14px; line-height: 1.5; word-wrap: break-word; font-size: 20px"
|
||||
>
|
||||
<el-form-item label="菜单路径:" prop="funParam">
|
||||
<!-- <el-form-item label="菜单路径:" prop="funParam">
|
||||
<el-input v-model="fromUpDate.funParam" placeholder="" clearable />
|
||||
</el-form-item>
|
||||
</el-form-item> -->
|
||||
|
||||
<el-form-item label="菜单名称:" prop="menuName">
|
||||
<el-input v-model="fromUpDate.menuName" placeholder="" clearable />
|
||||
@ -90,11 +90,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label=" 动作参数:">
|
||||
<el-input v-model="fromUpDate.funParam" :disabled="true">
|
||||
<template #append>
|
||||
<el-icon style="cursor: pointer; font-size: 23px" @click="clickParam"><Setting /></el-icon>
|
||||
</template>
|
||||
</el-input>
|
||||
<el-input v-model="fromUpDate.funParam"> </el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label=" 菜单权限:">
|
||||
@ -112,7 +108,7 @@
|
||||
</el-dialog>
|
||||
|
||||
<!-- 编辑页面的动作参数弹框 -->
|
||||
<el-dialog v-model="visibleParam" title="选择页面" width="500" :before-close="handleCloseParam">
|
||||
<!-- <el-dialog v-model="visibleParam" title="选择页面" width="500" :before-close="handleCloseParam">
|
||||
<el-table :data="ParamTableData" style="width: 100%">
|
||||
<el-table-column label="页面名称" width="180" />
|
||||
<el-table-column label="页面路径" width="180" />
|
||||
@ -135,7 +131,7 @@
|
||||
<el-button type="primary" @click="visibleParam1"> 确定 </el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</el-dialog> -->
|
||||
<!-- 新增弹框 -->
|
||||
<el-dialog v-model="visibleAdd" title="新增菜单" width="500" :before-close="handleCloseAdd">
|
||||
<el-form
|
||||
@ -145,9 +141,9 @@
|
||||
:rules="rules"
|
||||
style="padding: 24px 40px; font-size: 14px; line-height: 1.5; word-wrap: break-word; font-size: 20px"
|
||||
>
|
||||
<el-form-item label="菜单路径:" prop="funParam">
|
||||
<!-- <el-form-item label="菜单路径:" prop="funParam">
|
||||
<el-input v-model="formInlineAdd.funParam" placeholder="" clearable />
|
||||
</el-form-item>
|
||||
</el-form-item> -->
|
||||
|
||||
<el-form-item label="菜单名称:" prop="menuName">
|
||||
<el-input v-model="formInlineAdd.menuName" placeholder="" clearable />
|
||||
@ -170,11 +166,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label=" 动作参数:">
|
||||
<el-input v-model="formInlineAdd.funParam" :disabled="true">
|
||||
<template #append>
|
||||
<el-icon style="cursor: pointer; font-size: 23px" @click="clickParam"><Setting /></el-icon>
|
||||
</template>
|
||||
</el-input>
|
||||
<el-input v-model="formInlineAdd.funParam"> </el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label=" 菜单权限:">
|
||||
@ -191,7 +183,7 @@
|
||||
</template>
|
||||
</el-dialog>
|
||||
<!-- 新增页面动作参数弹框 -->
|
||||
<el-dialog v-model="visibleParam" title="选择页面" width="500" :before-close="handleCloseParam">
|
||||
<!-- <el-dialog v-model="visibleParam" title="选择页面" width="500" :before-close="handleCloseParam">
|
||||
<el-table :data="ParamTableData" style="width: 100%">
|
||||
<el-table-column label="页面名称" width="180" />
|
||||
<el-table-column label="页面路径" width="180" />
|
||||
@ -213,7 +205,7 @@
|
||||
<el-button type="primary" @click="visibleParam1"> 确定 </el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</el-dialog> -->
|
||||
<!-- 删除确认弹框 -->
|
||||
<el-dialog v-model="dialogVisibleDelete" title="操作提示" width="500" :before-close="handleCloseDelete">
|
||||
<span>确定是否删除?</span>
|
||||
@ -278,14 +270,19 @@ const props = {
|
||||
|
||||
const loadNode = (node: Node, resolve: (data: Tree[]) => void) => {
|
||||
if (node.level === 0) {
|
||||
return resolve([])
|
||||
}
|
||||
if (node.level > 1) return resolve([])
|
||||
|
||||
setTimeout(() => {
|
||||
const data: Tree[] = []
|
||||
|
||||
resolve(data)
|
||||
}, 500)
|
||||
const fromParameter = {
|
||||
parentMenuId: node.data.id,
|
||||
recursive: false,
|
||||
}
|
||||
menusTree(fromParameter)
|
||||
.then((res: any) => {
|
||||
return resolve(res.data)
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err)
|
||||
})
|
||||
}
|
||||
// 菜单搜索查询
|
||||
const input2 = ref('')
|
||||
|
Loading…
Reference in New Issue
Block a user