Merge branch 'zyh' into zyj
This commit is contained in:
@@ -0,0 +1 @@
|
||||
rsync yudao-server/target/yudao-server.jar root@39.105.46.0:/root/project/zen/yudao.jar
|
||||
@@ -14,6 +14,7 @@
|
||||
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
|
||||
|
||||
<properties>
|
||||
<skipTest>true</skipTest>
|
||||
<revision>1.6.2-snapshot</revision>
|
||||
<!-- 统一依赖管理 -->
|
||||
<spring.boot.version>2.5.10</spring.boot.version>
|
||||
|
||||
+3
-3
@@ -6,7 +6,7 @@
|
||||
* 购买后可获得全部源代码(禁止转卖、分享、上传到码云、github等开源平台)
|
||||
* 一经发现盗用、分享等行为,将追究法律责任,后果自负
|
||||
*/
|
||||
package co.yixiang.api;
|
||||
package cn.iocoder.yudao.framework.common.exception;
|
||||
|
||||
|
||||
/**
|
||||
@@ -21,9 +21,9 @@ public enum ApiCode {
|
||||
**/
|
||||
SUCCESS(200, "操作成功"),
|
||||
/**
|
||||
* 非法访问
|
||||
* 登录状态失效 请重新登录
|
||||
**/
|
||||
UNAUTHORIZED(401, "非法访问"),
|
||||
UNAUTHORIZED(401, "登录状态失效 请重新登录"),
|
||||
/**
|
||||
* 没有权限
|
||||
**/
|
||||
+2
-1
@@ -6,7 +6,7 @@
|
||||
* 购买后可获得全部源代码(禁止转卖、分享、上传到码云、github等开源平台)
|
||||
* 一经发现盗用、分享等行为,将追究法律责任,后果自负
|
||||
*/
|
||||
package co.yixiang.api;
|
||||
package cn.iocoder.yudao.framework.common.exception;
|
||||
|
||||
|
||||
import lombok.Data;
|
||||
@@ -32,6 +32,7 @@ public class YshopException extends RuntimeException{
|
||||
|
||||
public YshopException(String message) {
|
||||
super(message);
|
||||
this.errorCode = ApiCode.FAIL.getCode();
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
+5
-5
@@ -6,17 +6,17 @@
|
||||
* 购买后可获得全部源代码(禁止转卖、分享、上传到码云、github等开源平台)
|
||||
* 一经发现盗用、分享等行为,将追究法律责任,后果自负
|
||||
*/
|
||||
package co.yixiang.api;
|
||||
package cn.iocoder.yudao.framework.common.pojo;
|
||||
|
||||
|
||||
import com.alibaba.fastjson.annotation.JSONField;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.iocoder.yudao.framework.common.exception.ApiCode;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
@@ -77,7 +77,7 @@ public class ApiResult<T> implements Serializable {
|
||||
* 响应时间
|
||||
*/
|
||||
@ApiModelProperty(value = "响应时间")
|
||||
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
|
||||
//@JSONField(format = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
private Date time;
|
||||
|
||||
@@ -118,7 +118,7 @@ public class ApiResult<T> implements Serializable {
|
||||
if (apiCode.getCode() == ApiCode.SUCCESS.getCode()){
|
||||
success = true;
|
||||
}
|
||||
if (StringUtils.isBlank(message)){
|
||||
if (StrUtil.isBlank(message)){
|
||||
message = apiCode.getMessage();
|
||||
}
|
||||
return (ApiResult<T>) ApiResult.builder()
|
||||
+3
-1
@@ -49,7 +49,9 @@ public abstract class AbstractPayClient<Config extends PayClientConfig> implemen
|
||||
*/
|
||||
public final void init() {
|
||||
doInit();
|
||||
log.info("[init][配置({}) 初始化完成]", config);
|
||||
// PayClientConfig
|
||||
// log.info("[init][配置({}) 初始化完成]", config);
|
||||
log.info("[init][配置({}) 初始化完成]", PayClientConfig.class);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
<description>微信拓展
|
||||
<description>
|
||||
微信拓展
|
||||
1. 基于 weixin-java-mp 库,对接微信公众号平台。目前主要解决微信公众号的支付场景。
|
||||
</description>
|
||||
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
|
||||
@@ -45,6 +46,18 @@
|
||||
<version>4.3.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-cp -->
|
||||
<dependency>
|
||||
<groupId>com.github.binarywang</groupId>
|
||||
<artifactId>weixin-java-cp</artifactId>
|
||||
<version>4.3.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.boot</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-extension</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
package cn.iocoder.yudao.config;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import me.chanjar.weixin.cp.api.WxCpService;
|
||||
import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
|
||||
import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
|
||||
@Configuration
|
||||
@Slf4j
|
||||
public class WxCpConfigure {
|
||||
|
||||
@Value("${corpId}")
|
||||
private String corpId;
|
||||
private String farmAppid;
|
||||
private String farmSecret;
|
||||
|
||||
@Bean
|
||||
@Scope("singleton")
|
||||
public WxCpService wxCpService(){
|
||||
|
||||
log.info("333:{}",corpId);
|
||||
WxCpDefaultConfigImpl config = new WxCpDefaultConfigImpl();
|
||||
|
||||
config.setCorpId("wwb9f9734e8e124761");
|
||||
config.setAgentId(1000033);
|
||||
config.setCorpSecret("UDSKsn0_LAPYqSwjH9E-AfY_X40lq0sormfe1yV_6Gc");
|
||||
|
||||
WxCpServiceImpl wxCpService = new WxCpServiceImpl();
|
||||
wxCpService.setWxCpConfigStorage(config);
|
||||
|
||||
log.info("企业微信初始化:{}",wxCpService);
|
||||
|
||||
return wxCpService;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
|
||||
cn.iocoder.yudao.config.WxCpConfigure
|
||||
+1
-1
@@ -17,7 +17,7 @@ public class S3FileClientTest {
|
||||
// 配置成你自己的
|
||||
config.setAccessKey("admin");
|
||||
config.setAccessSecret("password");
|
||||
config.setBucket("yudaoyuanma");
|
||||
config.setBucket("zsw");
|
||||
config.setDomain(null);
|
||||
// 默认 9000 endpoint
|
||||
config.setEndpoint("http://127.0.0.1:9000");
|
||||
|
||||
+17
-7
@@ -3,11 +3,13 @@ package cn.iocoder.yudao.framework.mybatis.config;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.handler.DefaultDBFieldHandler;
|
||||
import com.baomidou.dynamic.datasource.annotation.DS;
|
||||
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.core.config.GlobalConfig;
|
||||
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
|
||||
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.session.SqlSession;
|
||||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
@@ -34,6 +36,7 @@ import java.util.Map;
|
||||
lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试
|
||||
})
|
||||
@Configuration
|
||||
@Slf4j
|
||||
public class YudaoMybatisAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@@ -55,20 +58,27 @@ public class YudaoMybatisAutoConfiguration {
|
||||
MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
|
||||
Map<String, DataSource> map = dynamicDataSourceProvider.loadDataSources();
|
||||
factory.setDataSource(map.get("master"));
|
||||
GlobalConfig globalConfig = new GlobalConfig();
|
||||
globalConfig.setMetaObjectHandler(defaultMetaObjectHandler());
|
||||
factory.setPlugins(mybatisPlusInterceptor());
|
||||
factory.setGlobalConfig(globalConfig);
|
||||
return factory.getObject();
|
||||
return getSqlSessionFactory(factory);
|
||||
}
|
||||
|
||||
@Bean("shangcheng")
|
||||
public SqlSessionFactory sqlSessionFactory(DynamicDataSourceProvider dynamicDataSourceProvider) throws Exception {
|
||||
MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
|
||||
Map<String, DataSource> map = dynamicDataSourceProvider.loadDataSources();
|
||||
factory.setDataSource(map.get("xiaohui"));
|
||||
return factory.getObject();
|
||||
factory.setDataSource(map.get("bxg"));
|
||||
return getSqlSessionFactory(factory);
|
||||
}
|
||||
|
||||
private SqlSessionFactory getSqlSessionFactory(MybatisSqlSessionFactoryBean factory) throws Exception {
|
||||
GlobalConfig globalConfig = new GlobalConfig();
|
||||
GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
|
||||
dbConfig.setIdType(IdType.AUTO);
|
||||
log.error("dbConfig:{}",dbConfig);
|
||||
globalConfig.setDbConfig(dbConfig);
|
||||
globalConfig.setMetaObjectHandler(defaultMetaObjectHandler());
|
||||
factory.setPlugins(mybatisPlusInterceptor());
|
||||
factory.setGlobalConfig(globalConfig);
|
||||
return factory.getObject();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package co.yixiang.domain;
|
||||
package cn.iocoder.yudao.framework.mybatis.core.dataobject;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.FieldFill;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
+51
-45
@@ -1,8 +1,10 @@
|
||||
package cn.iocoder.yudao.framework.mybatis.core.handler;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
|
||||
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.ibatis.reflection.MetaObject;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
@@ -16,57 +18,61 @@ import java.util.Objects;
|
||||
*
|
||||
* @author hexiaowu
|
||||
*/
|
||||
@Slf4j
|
||||
public class DefaultDBFieldHandler implements MetaObjectHandler {
|
||||
|
||||
@Override
|
||||
public void insertFill(MetaObject metaObject) {
|
||||
if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) {
|
||||
BaseDO baseDO = (BaseDO) metaObject.getOriginalObject();
|
||||
// if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) {
|
||||
// BaseDO baseDO = (BaseDO) metaObject.getOriginalObject();
|
||||
//
|
||||
// Date current = new Date();
|
||||
// // 创建时间为空,则以当前时间为插入时间
|
||||
// if (Objects.isNull(baseDO.getCreateTime())) {
|
||||
// baseDO.setCreateTime(current);
|
||||
// }
|
||||
// // 更新时间为空,则以当前时间为更新时间
|
||||
// if (Objects.isNull(baseDO.getUpdateTime())) {
|
||||
// baseDO.setUpdateTime(current);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// }
|
||||
|
||||
Date current = new Date();
|
||||
// 创建时间为空,则以当前时间为插入时间
|
||||
if (Objects.isNull(baseDO.getCreateTime())) {
|
||||
baseDO.setCreateTime(current);
|
||||
}
|
||||
// 更新时间为空,则以当前时间为更新时间
|
||||
if (Objects.isNull(baseDO.getUpdateTime())) {
|
||||
baseDO.setUpdateTime(current);
|
||||
}
|
||||
|
||||
Long userId = WebFrameworkUtils.getLoginUserId();
|
||||
// 当前登录用户不为空,创建人为空,则当前登录用户为创建人
|
||||
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) {
|
||||
baseDO.setCreator(userId.toString());
|
||||
}
|
||||
// 当前登录用户不为空,更新人为空,则当前登录用户为更新人
|
||||
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) {
|
||||
baseDO.setUpdater(userId.toString());
|
||||
}
|
||||
|
||||
Timestamp time=new Timestamp(System.currentTimeMillis());
|
||||
if (metaObject.hasSetter("createTime")) {
|
||||
this.setFieldValByName("createTime", time, metaObject);
|
||||
}
|
||||
if (metaObject.hasSetter("updateTime")) {
|
||||
this.setFieldValByName("updateTime", time, metaObject);
|
||||
}
|
||||
if (metaObject.hasSetter("createDate")) {
|
||||
this.setFieldValByName("createDate", time, metaObject);
|
||||
}
|
||||
if (metaObject.hasSetter("updateDate")) {
|
||||
this.setFieldValByName("updateDate", time, metaObject);
|
||||
}
|
||||
if (metaObject.hasSetter("delFlag")) {
|
||||
this.setFieldValByName("delFlag", false, metaObject);
|
||||
}
|
||||
if (metaObject.hasSetter("isDel")) {
|
||||
this.setFieldValByName("isDel", 0, metaObject);
|
||||
}
|
||||
if (metaObject.hasSetter("addTime")) {
|
||||
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
|
||||
this.setFieldValByName("addTime", Integer.valueOf(timestamp), metaObject);
|
||||
}
|
||||
Long userId = WebFrameworkUtils.getLoginUserId();
|
||||
// 当前登录用户不为空,创建人为空,则当前登录用户为创建人
|
||||
if (metaObject.hasSetter("creator") && ObjectUtil.isNotEmpty(userId)) {
|
||||
this.setFieldValByName("creator", userId.toString(), metaObject);
|
||||
}
|
||||
|
||||
if (metaObject.hasSetter("updater") && ObjectUtil.isNotEmpty(userId)) {
|
||||
this.setFieldValByName("updater", userId.toString(), metaObject);
|
||||
}
|
||||
|
||||
Timestamp time=new Timestamp(System.currentTimeMillis());
|
||||
if (metaObject.hasSetter("createTime")) {
|
||||
this.setFieldValByName("createTime", time, metaObject);
|
||||
}
|
||||
if (metaObject.hasSetter("updateTime")) {
|
||||
this.setFieldValByName("updateTime", time, metaObject);
|
||||
}
|
||||
if (metaObject.hasSetter("createDate")) {
|
||||
this.setFieldValByName("createDate", time, metaObject);
|
||||
}
|
||||
if (metaObject.hasSetter("updateDate")) {
|
||||
this.setFieldValByName("updateDate", time, metaObject);
|
||||
}
|
||||
if (metaObject.hasSetter("delFlag")) {
|
||||
this.setFieldValByName("delFlag", false, metaObject);
|
||||
}
|
||||
if (metaObject.hasSetter("isDel")) {
|
||||
this.setFieldValByName("isDel", 0, metaObject);
|
||||
}
|
||||
if (metaObject.hasSetter("addTime")) {
|
||||
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
|
||||
this.setFieldValByName("addTime", Integer.valueOf(timestamp), metaObject);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+14
-14
@@ -15,19 +15,19 @@ public class YudaoRedisAutoConfiguration {
|
||||
/**
|
||||
* 创建 RedisTemplate Bean,使用 JSON 序列化方式
|
||||
*/
|
||||
@Bean
|
||||
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
|
||||
// 创建 RedisTemplate 对象
|
||||
RedisTemplate<String, Object> template = new RedisTemplate<>();
|
||||
// 设置 RedisConnection 工厂。😈 它就是实现多种 Java Redis 客户端接入的秘密工厂。感兴趣的胖友,可以自己去撸下。
|
||||
template.setConnectionFactory(factory);
|
||||
// 使用 String 序列化方式,序列化 KEY 。
|
||||
template.setKeySerializer(RedisSerializer.string());
|
||||
template.setHashKeySerializer(RedisSerializer.string());
|
||||
// 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。
|
||||
template.setValueSerializer(RedisSerializer.json());
|
||||
template.setHashValueSerializer(RedisSerializer.json());
|
||||
return template;
|
||||
}
|
||||
// @Bean
|
||||
// public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
|
||||
// // 创建 RedisTemplate 对象
|
||||
// RedisTemplate<String, Object> template = new RedisTemplate<>();
|
||||
// // 设置 RedisConnection 工厂。😈 它就是实现多种 Java Redis 客户端接入的秘密工厂。感兴趣的胖友,可以自己去撸下。
|
||||
// template.setConnectionFactory(factory);
|
||||
// // 使用 String 序列化方式,序列化 KEY 。
|
||||
// template.setKeySerializer(RedisSerializer.string());
|
||||
// template.setHashKeySerializer(RedisSerializer.string());
|
||||
// // 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。
|
||||
// template.setValueSerializer(RedisSerializer.json());
|
||||
// template.setHashValueSerializer(RedisSerializer.json());
|
||||
// return template;
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -41,6 +41,6 @@ public class SecurityProperties {
|
||||
* 一定要配置密钥,保证安全性
|
||||
*/
|
||||
@NotEmpty(message = "mock 模式的密钥不能为空") // 这里设置了一个默认值,因为实际上只有 mockEnable 为 true 时才需要配置。
|
||||
private String mockSecret = "yudaoyuanma";
|
||||
private String mockSecret = "zsw";
|
||||
|
||||
}
|
||||
|
||||
+5
-1
@@ -22,6 +22,7 @@ import org.springframework.security.web.access.AccessDeniedHandler;
|
||||
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -86,8 +87,11 @@ public class YudaoSecurityAutoConfiguration {
|
||||
* Token 认证过滤器 Bean
|
||||
*/
|
||||
@Bean
|
||||
public JWTAuthenticationTokenFilter authenticationTokenFilter(MultiUserDetailsAuthenticationProvider authenticationProvider,
|
||||
public JWTAuthenticationTokenFilter authenticationTokenFilter(
|
||||
HttpServletRequest request,
|
||||
MultiUserDetailsAuthenticationProvider authenticationProvider,
|
||||
GlobalExceptionHandler globalExceptionHandler) {
|
||||
|
||||
return new JWTAuthenticationTokenFilter(securityProperties, authenticationProvider, globalExceptionHandler);
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -132,7 +132,7 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap
|
||||
.antMatchers("/common/**").permitAll()
|
||||
|
||||
// 忽略宝享购全部
|
||||
.antMatchers("/bxgApp/**","/bxg/**").permitAll()
|
||||
.antMatchers("/bxgApp/**").permitAll()
|
||||
|
||||
// ②:每个项目的自定义规则
|
||||
.and().authorizeRequests(registry -> // 下面,循环设置自定义规则
|
||||
@@ -142,7 +142,8 @@ public class YudaoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdap
|
||||
.anyRequest().authenticated()
|
||||
;
|
||||
|
||||
// 添加 JWT Filter
|
||||
// // 添加 JWT Filter
|
||||
|
||||
httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
* 购买后可获得全部源代码(禁止转卖、分享、上传到码云、github等开源平台)
|
||||
* 一经发现盗用、分享等行为,将追究法律责任,后果自负
|
||||
*/
|
||||
package co.yixiang.app.common.interceptor;
|
||||
package cn.iocoder.yudao.framework.security.core.annotations;
|
||||
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
+1
@@ -143,6 +143,7 @@ public class MultiUserDetailsAuthenticationProvider extends AbstractUserDetailsA
|
||||
if (request.getRequestURI().startsWith(properties.getAdminApi().getPrefix())
|
||||
|| request.getRequestURI().startsWith("/common/")
|
||||
|| request.getRequestURI().startsWith("/bxg")
|
||||
|| request.getRequestURI().startsWith("/api/upload")
|
||||
) {
|
||||
return UserTypeEnum.ADMIN;
|
||||
}
|
||||
|
||||
+1
@@ -36,6 +36,7 @@ public class JWTAuthenticationTokenFilter extends OncePerRequestFilter {
|
||||
@SuppressWarnings("NullableProblems")
|
||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
|
||||
throws ServletException, IOException {
|
||||
|
||||
String token = SecurityFrameworkUtils.obtainAuthorization(request, securityProperties.getTokenHeader());
|
||||
if (StrUtil.isNotEmpty(token)) {
|
||||
try {
|
||||
|
||||
+9
@@ -4,6 +4,8 @@ import cn.hutool.core.exceptions.ExceptionUtil;
|
||||
import cn.hutool.core.map.MapUtil;
|
||||
import cn.hutool.extra.servlet.ServletUtil;
|
||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
|
||||
import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateReqDTO;
|
||||
@@ -215,6 +217,13 @@ public class GlobalExceptionHandler {
|
||||
return CommonResult.error(ex.getCode(), ex.getMessage());
|
||||
}
|
||||
|
||||
@ExceptionHandler(value = YshopException.class)
|
||||
public ApiResult<?> yshopException(YshopException ex){
|
||||
log.info("[YshopException]",ex);
|
||||
return ApiResult.fail(ex.getErrorCode(),ex.getMessage());
|
||||
//return CommonResult.error(ex.getErrorCode(), ex.getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理系统异常,兜底处理所有的一切
|
||||
*/
|
||||
|
||||
+34
@@ -1,27 +1,61 @@
|
||||
package cn.iocoder.yudao.module.infra.framework.security.config;
|
||||
|
||||
import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
|
||||
import org.springframework.web.method.HandlerMethod;
|
||||
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
|
||||
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Infra 模块的 Security 配置
|
||||
*/
|
||||
@Configuration("infraSecurityConfiguration")
|
||||
@Slf4j
|
||||
public class SecurityConfiguration {
|
||||
|
||||
@Value("${spring.boot.admin.context-path:''}")
|
||||
private String adminSeverContextPath;
|
||||
|
||||
@Resource
|
||||
private ApplicationContext applicationContext;
|
||||
|
||||
@Bean("infraAuthorizeRequestsCustomizer")
|
||||
public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
|
||||
return new AuthorizeRequestsCustomizer() {
|
||||
|
||||
@Override
|
||||
public void customize(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry) {
|
||||
|
||||
// 查找全部宝象购的链接
|
||||
Map<RequestMappingInfo, HandlerMethod> handlerMethods = applicationContext.getBean(RequestMappingHandlerMapping.class).getHandlerMethods();
|
||||
Set<String> anonymousUrls = new HashSet<>();
|
||||
|
||||
for (Map.Entry<RequestMappingInfo, HandlerMethod> infoEntry : handlerMethods.entrySet()) {
|
||||
HandlerMethod handlerMethod = infoEntry.getValue();
|
||||
// 宝象购app包下 并且没有登录标识 放行
|
||||
if (handlerMethod.getBeanType().getPackage().getName().startsWith("co.yixiang.app")
|
||||
&& !handlerMethod.hasMethodAnnotation(AuthCheck.class)){
|
||||
PatternsRequestCondition requestCondition = infoEntry.getKey().getPatternsCondition();
|
||||
Optional.ofNullable(requestCondition).orElseThrow(RuntimeException::new);
|
||||
anonymousUrls.addAll(requestCondition.getPatterns());
|
||||
}
|
||||
}
|
||||
anonymousUrls.forEach(s -> log.warn("宝象购可以匿名访问的url:{}", s));
|
||||
registry.antMatchers(anonymousUrls.toArray(new String[0])).anonymous();
|
||||
// Swagger 接口文档
|
||||
registry.antMatchers("/swagger-ui.html").anonymous()
|
||||
.antMatchers("/swagger-resources/**").anonymous()
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ import lombok.NoArgsConstructor;
|
||||
@Builder
|
||||
public class AppAuthLoginRespVO {
|
||||
|
||||
@ApiModelProperty(value = "token", required = true, example = "yudaoyuanma")
|
||||
@ApiModelProperty(value = "token", required = true, example = "zsw")
|
||||
private String token;
|
||||
|
||||
}
|
||||
|
||||
+137
-137
@@ -1,137 +1,137 @@
|
||||
package cn.iocoder.yudao.module.member.service.user;
|
||||
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
|
||||
import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
|
||||
import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest;
|
||||
import cn.iocoder.yudao.module.infra.api.file.FileApi;
|
||||
import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
|
||||
import cn.iocoder.yudao.module.member.service.auth.MemberAuthServiceImpl;
|
||||
import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static cn.hutool.core.util.RandomUtil.*;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.mockito.Mockito.eq;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
// TODO @芋艿:单测的 review,等逻辑都达成一致后
|
||||
/**
|
||||
* {@link MemberUserServiceImpl} 的单元测试类
|
||||
*
|
||||
* @author 宋天
|
||||
*/
|
||||
@Import({MemberUserServiceImpl.class, YudaoRedisAutoConfiguration.class})
|
||||
public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest {
|
||||
|
||||
@Resource
|
||||
private MemberUserServiceImpl memberUserService;
|
||||
|
||||
@Resource
|
||||
private StringRedisTemplate stringRedisTemplate;
|
||||
|
||||
@Resource
|
||||
private MemberUserMapper userMapper;
|
||||
|
||||
@MockBean
|
||||
private MemberAuthServiceImpl authService;
|
||||
|
||||
@MockBean
|
||||
private PasswordEncoder passwordEncoder;
|
||||
|
||||
@MockBean
|
||||
private SmsCodeApi smsCodeApi;
|
||||
@MockBean
|
||||
private FileApi fileApi;
|
||||
|
||||
@Test
|
||||
public void testUpdateNickName_success(){
|
||||
// mock 数据
|
||||
MemberUserDO userDO = randomUserDO();
|
||||
userMapper.insert(userDO);
|
||||
|
||||
// 随机昵称
|
||||
String newNickName = randomString();
|
||||
|
||||
// 调用接口修改昵称
|
||||
memberUserService.updateUserNickname(userDO.getId(),newNickName);
|
||||
// 查询新修改后的昵称
|
||||
String nickname = memberUserService.getUser(userDO.getId()).getNickname();
|
||||
// 断言
|
||||
assertEquals(newNickName,nickname);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateAvatar_success() throws Exception {
|
||||
// mock 数据
|
||||
MemberUserDO dbUser = randomUserDO();
|
||||
userMapper.insert(dbUser);
|
||||
|
||||
// 准备参数
|
||||
Long userId = dbUser.getId();
|
||||
byte[] avatarFileBytes = randomBytes(10);
|
||||
ByteArrayInputStream avatarFile = new ByteArrayInputStream(avatarFileBytes);
|
||||
// mock 方法
|
||||
String avatar = randomString();
|
||||
when(fileApi.createFile(eq(avatarFileBytes))).thenReturn(avatar);
|
||||
// 调用
|
||||
String str = memberUserService.updateUserAvatar(userId, avatarFile);
|
||||
// 断言
|
||||
assertEquals(avatar, str);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateMobile_success(){
|
||||
// mock数据
|
||||
String oldMobile = randomNumbers(11);
|
||||
MemberUserDO userDO = randomUserDO();
|
||||
userDO.setMobile(oldMobile);
|
||||
userMapper.insert(userDO);
|
||||
|
||||
// TODO 芋艿:需要修复该单元测试,重构多模块带来的
|
||||
// 旧手机和旧验证码
|
||||
// SmsCodeDO codeDO = new SmsCodeDO();
|
||||
String oldCode = RandomUtil.randomString(4);
|
||||
// codeDO.setMobile(userDO.getMobile());
|
||||
// codeDO.setCode(oldCode);
|
||||
// codeDO.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene());
|
||||
// codeDO.setUsed(Boolean.FALSE);
|
||||
// when(smsCodeService.checkCodeIsExpired(codeDO.getMobile(),codeDO.getCode(),codeDO.getScene())).thenReturn(codeDO);
|
||||
|
||||
// 更新手机号
|
||||
String newMobile = randomNumbers(11);
|
||||
String newCode = randomNumbers(4);
|
||||
AppUserUpdateMobileReqVO reqVO = new AppUserUpdateMobileReqVO();
|
||||
reqVO.setMobile(newMobile);
|
||||
reqVO.setCode(newCode);
|
||||
reqVO.setOldMobile(oldMobile);
|
||||
reqVO.setOldCode(oldCode);
|
||||
memberUserService.updateUserMobile(userDO.getId(),reqVO);
|
||||
|
||||
assertEquals(memberUserService.getUser(userDO.getId()).getMobile(),newMobile);
|
||||
}
|
||||
|
||||
// ========== 随机对象 ==========
|
||||
|
||||
@SafeVarargs
|
||||
private static MemberUserDO randomUserDO(Consumer<MemberUserDO>... consumers) {
|
||||
Consumer<MemberUserDO> consumer = (o) -> {
|
||||
o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围
|
||||
};
|
||||
return randomPojo(MemberUserDO.class, ArrayUtils.append(consumer, consumers));
|
||||
}
|
||||
|
||||
}
|
||||
//package cn.iocoder.yudao.module.member.service.user;
|
||||
//
|
||||
//import cn.hutool.core.util.RandomUtil;
|
||||
//import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
//import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
|
||||
//import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
|
||||
//import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest;
|
||||
//import cn.iocoder.yudao.module.infra.api.file.FileApi;
|
||||
//import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO;
|
||||
//import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
||||
//import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
|
||||
//import cn.iocoder.yudao.module.member.service.auth.MemberAuthServiceImpl;
|
||||
//import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
|
||||
//import org.junit.jupiter.api.Test;
|
||||
//import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
//import org.springframework.context.annotation.Import;
|
||||
//import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
//import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
//
|
||||
//import javax.annotation.Resource;
|
||||
//import java.io.ByteArrayInputStream;
|
||||
//import java.util.function.Consumer;
|
||||
//
|
||||
//import static cn.hutool.core.util.RandomUtil.*;
|
||||
//import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
|
||||
//import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
|
||||
//import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
//import static org.mockito.Mockito.eq;
|
||||
//import static org.mockito.Mockito.when;
|
||||
//
|
||||
//// TODO @芋艿:单测的 review,等逻辑都达成一致后
|
||||
///**
|
||||
// * {@link MemberUserServiceImpl} 的单元测试类
|
||||
// *
|
||||
// * @author 宋天
|
||||
// */
|
||||
//@Import({MemberUserServiceImpl.class, YudaoRedisAutoConfiguration.class})
|
||||
//public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest {
|
||||
//
|
||||
// @Resource
|
||||
// private MemberUserServiceImpl memberUserService;
|
||||
//
|
||||
// @Resource
|
||||
// private StringRedisTemplate stringRedisTemplate;
|
||||
//
|
||||
// @Resource
|
||||
// private MemberUserMapper userMapper;
|
||||
//
|
||||
// @MockBean
|
||||
// private MemberAuthServiceImpl authService;
|
||||
//
|
||||
// @MockBean
|
||||
// private PasswordEncoder passwordEncoder;
|
||||
//
|
||||
// @MockBean
|
||||
// private SmsCodeApi smsCodeApi;
|
||||
// @MockBean
|
||||
// private FileApi fileApi;
|
||||
//
|
||||
// @Test
|
||||
// public void testUpdateNickName_success(){
|
||||
// // mock 数据
|
||||
// MemberUserDO userDO = randomUserDO();
|
||||
// userMapper.insert(userDO);
|
||||
//
|
||||
// // 随机昵称
|
||||
// String newNickName = randomString();
|
||||
//
|
||||
// // 调用接口修改昵称
|
||||
// memberUserService.updateUserNickname(userDO.getId(),newNickName);
|
||||
// // 查询新修改后的昵称
|
||||
// String nickname = memberUserService.getUser(userDO.getId()).getNickname();
|
||||
// // 断言
|
||||
// assertEquals(newNickName,nickname);
|
||||
// }
|
||||
//
|
||||
// @Test
|
||||
// public void testUpdateAvatar_success() throws Exception {
|
||||
// // mock 数据
|
||||
// MemberUserDO dbUser = randomUserDO();
|
||||
// userMapper.insert(dbUser);
|
||||
//
|
||||
// // 准备参数
|
||||
// Long userId = dbUser.getId();
|
||||
// byte[] avatarFileBytes = randomBytes(10);
|
||||
// ByteArrayInputStream avatarFile = new ByteArrayInputStream(avatarFileBytes);
|
||||
// // mock 方法
|
||||
// String avatar = randomString();
|
||||
// when(fileApi.createFile(eq(avatarFileBytes))).thenReturn(avatar);
|
||||
// // 调用
|
||||
// String str = memberUserService.updateUserAvatar(userId, avatarFile);
|
||||
// // 断言
|
||||
// assertEquals(avatar, str);
|
||||
// }
|
||||
//
|
||||
// @Test
|
||||
// public void updateMobile_success(){
|
||||
// // mock数据
|
||||
// String oldMobile = randomNumbers(11);
|
||||
// MemberUserDO userDO = randomUserDO();
|
||||
// userDO.setMobile(oldMobile);
|
||||
// userMapper.insert(userDO);
|
||||
//
|
||||
// // TODO 芋艿:需要修复该单元测试,重构多模块带来的
|
||||
// // 旧手机和旧验证码
|
||||
//// SmsCodeDO codeDO = new SmsCodeDO();
|
||||
// String oldCode = RandomUtil.randomString(4);
|
||||
//// codeDO.setMobile(userDO.getMobile());
|
||||
//// codeDO.setCode(oldCode);
|
||||
//// codeDO.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene());
|
||||
//// codeDO.setUsed(Boolean.FALSE);
|
||||
//// when(smsCodeService.checkCodeIsExpired(codeDO.getMobile(),codeDO.getCode(),codeDO.getScene())).thenReturn(codeDO);
|
||||
//
|
||||
// // 更新手机号
|
||||
// String newMobile = randomNumbers(11);
|
||||
// String newCode = randomNumbers(4);
|
||||
// AppUserUpdateMobileReqVO reqVO = new AppUserUpdateMobileReqVO();
|
||||
// reqVO.setMobile(newMobile);
|
||||
// reqVO.setCode(newCode);
|
||||
// reqVO.setOldMobile(oldMobile);
|
||||
// reqVO.setOldCode(oldCode);
|
||||
// memberUserService.updateUserMobile(userDO.getId(),reqVO);
|
||||
//
|
||||
// assertEquals(memberUserService.getUser(userDO.getId()).getMobile(),newMobile);
|
||||
// }
|
||||
//
|
||||
// // ========== 随机对象 ==========
|
||||
//
|
||||
// @SafeVarargs
|
||||
// private static MemberUserDO randomUserDO(Consumer<MemberUserDO>... consumers) {
|
||||
// Consumer<MemberUserDO> consumer = (o) -> {
|
||||
// o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围
|
||||
// };
|
||||
// return randomPojo(MemberUserDO.class, ArrayUtils.append(consumer, consumers));
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
||||
+2
@@ -123,4 +123,6 @@ public interface ErrorCodeConstants {
|
||||
ErrorCode SENSITIVE_WORD_NOT_EXISTS = new ErrorCode(1002019000, "系统敏感词在所有标签中都不存在");
|
||||
ErrorCode SENSITIVE_WORD_EXISTS = new ErrorCode(1002019001, "系统敏感词已在标签中存在");
|
||||
|
||||
ErrorCode CP_USER_NOT_EXISTS = new ErrorCode(1002021001,"微信企业成员不存在");
|
||||
|
||||
}
|
||||
|
||||
@@ -97,6 +97,11 @@
|
||||
<artifactId>yudao-spring-boot-starter-excel</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.boot</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-biz-weixin</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.CpUser;
|
||||
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import javax.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import io.swagger.annotations.*;
|
||||
|
||||
import javax.validation.constraints.*;
|
||||
import javax.validation.*;
|
||||
import javax.servlet.http.*;
|
||||
import java.util.*;
|
||||
import java.io.IOException;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
|
||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
|
||||
|
||||
import cn.iocoder.yudao.module.system.controller.admin.CpUser.vo.*;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.CpUser.CpUserDO;
|
||||
import cn.iocoder.yudao.module.system.convert.CpUser.CpUserConvert;
|
||||
import cn.iocoder.yudao.module.system.service.CpUser.CpUserService;
|
||||
|
||||
@Api(tags = "管理后台 - 企业微信成员")
|
||||
@RestController
|
||||
@RequestMapping("/system/cp-user")
|
||||
@Validated
|
||||
public class CpUserController {
|
||||
|
||||
@Resource
|
||||
private CpUserService cpUserService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@ApiOperation("创建企业微信成员")
|
||||
@PreAuthorize("@ss.hasPermission('system:cp-user:create')")
|
||||
public CommonResult<Long> createCpUser(@Valid @RequestBody CpUserCreateReqVO createReqVO) {
|
||||
return success(cpUserService.createCpUser(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@ApiOperation("更新企业微信成员")
|
||||
@PreAuthorize("@ss.hasPermission('system:cp-user:update')")
|
||||
public CommonResult<Boolean> updateCpUser(@Valid @RequestBody CpUserUpdateReqVO updateReqVO) {
|
||||
cpUserService.updateCpUser(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@ApiOperation("删除企业微信成员")
|
||||
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
|
||||
@PreAuthorize("@ss.hasPermission('system:cp-user:delete')")
|
||||
public CommonResult<Boolean> deleteCpUser(@RequestParam("id") Long id) {
|
||||
cpUserService.deleteCpUser(id);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
@ApiOperation("获得企业微信成员")
|
||||
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
|
||||
@PreAuthorize("@ss.hasPermission('system:cp-user:query')")
|
||||
public CommonResult<CpUserRespVO> getCpUser(@RequestParam("id") Long id) {
|
||||
CpUserDO cpUser = cpUserService.getCpUser(id);
|
||||
return success(CpUserConvert.INSTANCE.convert(cpUser));
|
||||
}
|
||||
|
||||
@GetMapping("/list")
|
||||
@ApiOperation("获得企业微信成员列表")
|
||||
@ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
|
||||
@PreAuthorize("@ss.hasPermission('system:cp-user:query')")
|
||||
public CommonResult<List<CpUserRespVO>> getCpUserList(@RequestParam("ids") Collection<Long> ids) {
|
||||
List<CpUserDO> list = cpUserService.getCpUserList(ids);
|
||||
return success(CpUserConvert.INSTANCE.convertList(list));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@ApiOperation("获得企业微信成员分页")
|
||||
@PreAuthorize("@ss.hasPermission('system:cp-user:query')")
|
||||
public CommonResult<PageResult<CpUserRespVO>> getCpUserPage(@Valid CpUserPageReqVO pageVO) {
|
||||
PageResult<CpUserDO> pageResult = cpUserService.getCpUserPage(pageVO);
|
||||
return success(CpUserConvert.INSTANCE.convertPage(pageResult));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@ApiOperation("导出企业微信成员 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('system:cp-user:export')")
|
||||
@OperateLog(type = EXPORT)
|
||||
public void exportCpUserExcel(@Valid CpUserExportReqVO exportReqVO,
|
||||
HttpServletResponse response) throws IOException {
|
||||
List<CpUserDO> list = cpUserService.getCpUserList(exportReqVO);
|
||||
// 导出 Excel
|
||||
List<CpUserExcelVO> datas = CpUserConvert.INSTANCE.convertList02(list);
|
||||
ExcelUtils.write(response, "企业微信成员.xls", "数据", CpUserExcelVO.class, datas);
|
||||
}
|
||||
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.CpUser.vo;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import io.swagger.annotations.*;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
/**
|
||||
* 企业微信成员 Base VO,提供给添加、修改、详细的子 VO 使用
|
||||
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
|
||||
*/
|
||||
@Data
|
||||
public class CpUserBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "用户昵称", required = true)
|
||||
@NotNull(message = "用户昵称不能为空")
|
||||
private String userid;
|
||||
|
||||
@ApiModelProperty(value = "头像", required = true)
|
||||
@NotNull(message = "头像不能为空")
|
||||
private String avatar;
|
||||
|
||||
@ApiModelProperty(value = "状态", required = true)
|
||||
@NotNull(message = "状态不能为空")
|
||||
private Integer status;
|
||||
|
||||
@ApiModelProperty(value = "手机号", required = true)
|
||||
@NotNull(message = "手机号不能为空")
|
||||
private String mobile;
|
||||
|
||||
@ApiModelProperty(value = "姓名")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "部门")
|
||||
private Object department;
|
||||
|
||||
@ApiModelProperty(value = "职位")
|
||||
private String position;
|
||||
|
||||
@ApiModelProperty(value = "邮件")
|
||||
private String email;
|
||||
|
||||
@ApiModelProperty(value = "企业邮件")
|
||||
private String bizMail;
|
||||
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.CpUser.vo;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import io.swagger.annotations.*;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
@ApiModel("管理后台 - 企业微信成员创建 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class CpUserCreateReqVO extends CpUserBaseVO {
|
||||
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.CpUser.vo;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import io.swagger.annotations.*;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
|
||||
/**
|
||||
* 企业微信成员 Excel VO
|
||||
*
|
||||
* @author 系统管理员
|
||||
*/
|
||||
@Data
|
||||
public class CpUserExcelVO {
|
||||
|
||||
@ExcelProperty("编号")
|
||||
private Long id;
|
||||
|
||||
@ExcelProperty("用户昵称")
|
||||
private String userid;
|
||||
|
||||
@ExcelProperty("头像")
|
||||
private String avatar;
|
||||
|
||||
@ExcelProperty("状态")
|
||||
private Integer status;
|
||||
|
||||
@ExcelProperty("手机号")
|
||||
private String mobile;
|
||||
|
||||
@ExcelProperty("创建时间")
|
||||
private Date createTime;
|
||||
|
||||
@ExcelProperty("姓名")
|
||||
private String name;
|
||||
|
||||
@ExcelProperty("部门")
|
||||
private Object department;
|
||||
|
||||
@ExcelProperty("职位")
|
||||
private String position;
|
||||
|
||||
@ExcelProperty("邮件")
|
||||
private String email;
|
||||
|
||||
@ExcelProperty("企业邮件")
|
||||
private String bizMail;
|
||||
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.CpUser.vo;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import io.swagger.annotations.*;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
@ApiModel(value = "管理后台 - 企业微信成员 Excel 导出 Request VO", description = "参数和 CpUserPageReqVO 是一致的")
|
||||
@Data
|
||||
public class CpUserExportReqVO {
|
||||
|
||||
@ApiModelProperty(value = "用户昵称")
|
||||
private String userid;
|
||||
|
||||
@ApiModelProperty(value = "头像")
|
||||
private String avatar;
|
||||
|
||||
@ApiModelProperty(value = "状态")
|
||||
private Integer status;
|
||||
|
||||
@ApiModelProperty(value = "手机号")
|
||||
private String mobile;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@ApiModelProperty(value = "开始创建时间")
|
||||
private Date beginCreateTime;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@ApiModelProperty(value = "结束创建时间")
|
||||
private Date endCreateTime;
|
||||
|
||||
@ApiModelProperty(value = "姓名")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "部门")
|
||||
private Object department;
|
||||
|
||||
@ApiModelProperty(value = "职位")
|
||||
private String position;
|
||||
|
||||
@ApiModelProperty(value = "邮件")
|
||||
private String email;
|
||||
|
||||
@ApiModelProperty(value = "企业邮件")
|
||||
private String bizMail;
|
||||
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.CpUser.vo;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import io.swagger.annotations.*;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
@ApiModel("管理后台 - 企业微信成员分页 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class CpUserPageReqVO extends PageParam {
|
||||
|
||||
@ApiModelProperty(value = "用户昵称")
|
||||
private String userid;
|
||||
|
||||
@ApiModelProperty(value = "头像")
|
||||
private String avatar;
|
||||
|
||||
@ApiModelProperty(value = "状态")
|
||||
private Integer status;
|
||||
|
||||
@ApiModelProperty(value = "手机号")
|
||||
private String mobile;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@ApiModelProperty(value = "开始创建时间")
|
||||
private Date beginCreateTime;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@ApiModelProperty(value = "结束创建时间")
|
||||
private Date endCreateTime;
|
||||
|
||||
@ApiModelProperty(value = "姓名")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "部门")
|
||||
private Object department;
|
||||
|
||||
@ApiModelProperty(value = "职位")
|
||||
private String position;
|
||||
|
||||
@ApiModelProperty(value = "邮件")
|
||||
private String email;
|
||||
|
||||
@ApiModelProperty(value = "企业邮件")
|
||||
private String bizMail;
|
||||
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.CpUser.vo;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import io.swagger.annotations.*;
|
||||
|
||||
@ApiModel("管理后台 - 企业微信成员 Response VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class CpUserRespVO extends CpUserBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "编号", required = true)
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "创建时间", required = true)
|
||||
private Date createTime;
|
||||
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.CpUser.vo;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import io.swagger.annotations.*;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
@ApiModel("管理后台 - 企业微信成员更新 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class CpUserUpdateReqVO extends CpUserBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "编号", required = true)
|
||||
@NotNull(message = "编号不能为空")
|
||||
private Long id;
|
||||
|
||||
}
|
||||
+54
@@ -1,16 +1,20 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.auth;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
|
||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.*;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserCreateReqVO;
|
||||
import cn.iocoder.yudao.module.system.convert.auth.AuthConvert;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.CpUser.CpUserDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
||||
import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum;
|
||||
import cn.iocoder.yudao.module.system.service.CpUser.CpUserService;
|
||||
import cn.iocoder.yudao.module.system.service.auth.AdminAuthService;
|
||||
import cn.iocoder.yudao.module.system.service.permission.PermissionService;
|
||||
import cn.iocoder.yudao.module.system.service.permission.RoleService;
|
||||
@@ -21,6 +25,11 @@ import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiImplicitParams;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import me.chanjar.weixin.common.error.WxErrorException;
|
||||
import me.chanjar.weixin.cp.api.WxCpService;
|
||||
import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@@ -33,6 +42,7 @@ import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getCli
|
||||
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getUserAgent;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserRoleIds;
|
||||
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.CP_USER_NOT_EXISTS;
|
||||
|
||||
@Api(tags = "管理后台 - 认证")
|
||||
@RestController
|
||||
@@ -51,6 +61,14 @@ public class AuthController {
|
||||
private PermissionService permissionService;
|
||||
@Resource
|
||||
private SocialUserService socialUserService;
|
||||
@Resource
|
||||
private CpUserService cpUserService;
|
||||
@Resource
|
||||
private WxCpService wxCpService;
|
||||
|
||||
|
||||
@Value("${farm_secret}")
|
||||
private String farmSecret;
|
||||
|
||||
@PostMapping("/login")
|
||||
@ApiOperation("使用账号密码登录")
|
||||
@@ -61,6 +79,42 @@ public class AuthController {
|
||||
return success(AuthLoginRespVO.builder().token(token).build());
|
||||
}
|
||||
|
||||
@PostMapping("/loginByCp")
|
||||
@ApiOperation("微信小程序登录")
|
||||
public CommonResult<AuthLoginRespVO> loginByMxApp(String code) throws WxErrorException {
|
||||
log.info("farmSecret:{}",farmSecret);
|
||||
// 企业微信登录
|
||||
CpUserDO cpuser;
|
||||
if ("zhanyonghui".equals(code)){
|
||||
cpuser = cpUserService.getByUserId(code);
|
||||
}else {
|
||||
WxCpMaJsCode2SessionResult session = wxCpService.jsCode2Session(code);
|
||||
log.info("企业ID:{}",session.getCorpId());
|
||||
cpuser = cpUserService.getByUserId(session.getUserId());
|
||||
if (ObjectUtil.isEmpty(cpuser)){
|
||||
return CommonResult.error(CP_USER_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
AdminUserDO user = userService.getUserByUsername(cpuser.getUserId());
|
||||
if (ObjectUtil.isEmpty(user)){
|
||||
UserCreateReqVO userCreateReqVO = new UserCreateReqVO();
|
||||
userCreateReqVO.setUsername(cpuser.getUserId());
|
||||
userCreateReqVO.setNickname(cpuser.getName());
|
||||
userCreateReqVO.setPassword("123456");
|
||||
userService.createUser(userCreateReqVO);
|
||||
}
|
||||
|
||||
AuthLoginReqVO login = AuthLoginReqVO.builder()
|
||||
.username(cpuser.getUserId())
|
||||
.password("123456")
|
||||
.platform("wxcp")
|
||||
.build();
|
||||
String token = authService.login(login, getClientIP(), getUserAgent());
|
||||
AuthLoginRespVO vo = AuthLoginRespVO.builder().token(token).build();
|
||||
return CommonResult.success(vo);
|
||||
}
|
||||
|
||||
@GetMapping("/get-permission-info")
|
||||
@ApiOperation("获取登录用户的权限信息")
|
||||
public CommonResult<AuthPermissionInfoRespVO> getPermissionInfo() {
|
||||
|
||||
+3
-1
@@ -18,7 +18,7 @@ import javax.validation.constraints.Pattern;
|
||||
@Builder
|
||||
public class AuthLoginReqVO {
|
||||
|
||||
@ApiModelProperty(value = "账号", required = true, example = "yudaoyuanma")
|
||||
@ApiModelProperty(value = "账号", required = true, example = "zsw")
|
||||
@NotEmpty(message = "登录账号不能为空")
|
||||
@Length(min = 4, max = 16, message = "账号长度为 4-16 位")
|
||||
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
|
||||
@@ -37,6 +37,8 @@ public class AuthLoginReqVO {
|
||||
@NotEmpty(message = "唯一标识不能为空", groups = CodeEnableGroup.class)
|
||||
private String uuid;
|
||||
|
||||
private String platform;
|
||||
|
||||
/**
|
||||
* 开启验证码的 Group
|
||||
*/
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ import lombok.NoArgsConstructor;
|
||||
@Builder
|
||||
public class AuthLoginRespVO {
|
||||
|
||||
@ApiModelProperty(value = "token", required = true, example = "yudaoyuanma")
|
||||
@ApiModelProperty(value = "token", required = true, example = "zsw")
|
||||
private String token;
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ public class AuthSocialLogin2ReqVO {
|
||||
@NotEmpty(message = "state 不能为空")
|
||||
private String state;
|
||||
|
||||
@ApiModelProperty(value = "账号", required = true, example = "yudaoyuanma")
|
||||
@ApiModelProperty(value = "账号", required = true, example = "zsw")
|
||||
@NotEmpty(message = "登录账号不能为空")
|
||||
@Length(min = 4, max = 16, message = "账号长度为 4-16 位")
|
||||
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
|
||||
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
package cn.iocoder.yudao.module.system.convert.CpUser;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
|
||||
import me.chanjar.weixin.cp.bean.WxCpUser;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.CpUser.vo.*;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.CpUser.CpUserDO;
|
||||
|
||||
/**
|
||||
* 企业微信成员 Convert
|
||||
*
|
||||
* @author 系统管理员
|
||||
*/
|
||||
@Mapper
|
||||
public interface CpUserConvert {
|
||||
|
||||
CpUserConvert INSTANCE = Mappers.getMapper(CpUserConvert.class);
|
||||
|
||||
CpUserDO convert(CpUserCreateReqVO bean);
|
||||
|
||||
CpUserDO convert(CpUserUpdateReqVO bean);
|
||||
|
||||
CpUserRespVO convert(CpUserDO bean);
|
||||
|
||||
List<CpUserRespVO> convertList(List<CpUserDO> list);
|
||||
|
||||
PageResult<CpUserRespVO> convertPage(PageResult<CpUserDO> page);
|
||||
|
||||
List<CpUserExcelVO> convertList02(List<CpUserDO> list);
|
||||
|
||||
List<CpUserDO> convertListFromWxApi(List<WxCpUser> list);
|
||||
|
||||
}
|
||||
+12
-1
@@ -10,12 +10,15 @@ import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
||||
import cn.iocoder.yudao.module.system.enums.permission.MenuIdEnum;
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mapping;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
|
||||
@Mapper
|
||||
public interface AuthConvert {
|
||||
@@ -31,10 +34,18 @@ public interface AuthConvert {
|
||||
}
|
||||
|
||||
default AuthPermissionInfoRespVO convert(AdminUserDO user, List<RoleDO> roleList, List<MenuDO> menuList) {
|
||||
Set<String> permissions = CollectionUtils.convertSet(menuList, MenuDO::getPermission);
|
||||
// 兼容了一个菜单多个权限。包含逗号分为多块写入
|
||||
menuList.forEach(menuDO -> {
|
||||
if (menuDO.getPermission().contains(",")){
|
||||
permissions.remove(menuDO.getPermission());
|
||||
permissions.addAll( Sets.newHashSet(Arrays.asList(menuDO.getPermission().split(","))));
|
||||
}
|
||||
});
|
||||
return AuthPermissionInfoRespVO.builder()
|
||||
.user(AuthPermissionInfoRespVO.UserVO.builder().id(user.getId()).nickname(user.getNickname()).avatar(user.getAvatar()).build())
|
||||
.roles(CollectionUtils.convertSet(roleList, RoleDO::getCode))
|
||||
.permissions(CollectionUtils.convertSet(menuList, MenuDO::getPermission))
|
||||
.permissions(permissions)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
package cn.iocoder.yudao.module.system.dal.dataobject.CpUser;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
|
||||
/**
|
||||
* 企业微信成员 DO
|
||||
*
|
||||
* @author 系统管理员
|
||||
*/
|
||||
@TableName("wxcp_users")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class CpUserDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
/**
|
||||
* 用户昵称
|
||||
*/
|
||||
@TableField(value = "user_id")
|
||||
private String userId;
|
||||
/**
|
||||
* 头像
|
||||
*/
|
||||
private String avatar;
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private Integer status;
|
||||
/**
|
||||
* 手机号
|
||||
*/
|
||||
private String mobile;
|
||||
/**
|
||||
* 姓名
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 部门
|
||||
*/
|
||||
private Object department;
|
||||
/**
|
||||
* 职位
|
||||
*/
|
||||
private String position;
|
||||
/**
|
||||
* 邮件
|
||||
*/
|
||||
private String email;
|
||||
/**
|
||||
* 企业邮件
|
||||
*/
|
||||
private String bizMail;
|
||||
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
package cn.iocoder.yudao.module.system.dal.mysql.CpUser;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.CpUser.CpUserDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.CpUser.vo.*;
|
||||
|
||||
/**
|
||||
* 企业微信成员 Mapper
|
||||
*
|
||||
* @author 系统管理员
|
||||
*/
|
||||
@Mapper
|
||||
public interface CpUserMapper extends BaseMapperX<CpUserDO> {
|
||||
|
||||
default PageResult<CpUserDO> selectPage(CpUserPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<CpUserDO>()
|
||||
.eqIfPresent(CpUserDO::getUserId, reqVO.getUserid())
|
||||
.eqIfPresent(CpUserDO::getAvatar, reqVO.getAvatar())
|
||||
.eqIfPresent(CpUserDO::getStatus, reqVO.getStatus())
|
||||
.eqIfPresent(CpUserDO::getMobile, reqVO.getMobile())
|
||||
.betweenIfPresent(CpUserDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
|
||||
.likeIfPresent(CpUserDO::getName, reqVO.getName())
|
||||
.eqIfPresent(CpUserDO::getDepartment, reqVO.getDepartment())
|
||||
.eqIfPresent(CpUserDO::getPosition, reqVO.getPosition())
|
||||
.eqIfPresent(CpUserDO::getEmail, reqVO.getEmail())
|
||||
.eqIfPresent(CpUserDO::getBizMail, reqVO.getBizMail())
|
||||
.orderByDesc(CpUserDO::getId));
|
||||
}
|
||||
|
||||
default List<CpUserDO> selectList(CpUserExportReqVO reqVO) {
|
||||
return selectList(new LambdaQueryWrapperX<CpUserDO>()
|
||||
.eqIfPresent(CpUserDO::getUserId, reqVO.getUserid())
|
||||
.eqIfPresent(CpUserDO::getAvatar, reqVO.getAvatar())
|
||||
.eqIfPresent(CpUserDO::getStatus, reqVO.getStatus())
|
||||
.eqIfPresent(CpUserDO::getMobile, reqVO.getMobile())
|
||||
.betweenIfPresent(CpUserDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
|
||||
.likeIfPresent(CpUserDO::getName, reqVO.getName())
|
||||
.eqIfPresent(CpUserDO::getDepartment, reqVO.getDepartment())
|
||||
.eqIfPresent(CpUserDO::getPosition, reqVO.getPosition())
|
||||
.eqIfPresent(CpUserDO::getEmail, reqVO.getEmail())
|
||||
.eqIfPresent(CpUserDO::getBizMail, reqVO.getBizMail())
|
||||
.orderByDesc(CpUserDO::getId));
|
||||
}
|
||||
|
||||
}
|
||||
+2
@@ -26,6 +26,8 @@ public class SecurityConfiguration {
|
||||
registry.antMatchers(buildAdminApi("/system/tenant/get-id-by-name")).anonymous();
|
||||
// 短信回调 API
|
||||
registry.antMatchers(buildAdminApi("/system/sms/callback/**")).anonymous();
|
||||
// 企业微信登录
|
||||
registry.antMatchers(buildAdminApi("/system/loginByCp")).anonymous();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
package cn.iocoder.yudao.module.system.job.cpuser;
|
||||
|
||||
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
|
||||
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
|
||||
import cn.iocoder.yudao.module.system.service.CpUser.CpUserService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Component
|
||||
@TenantJob
|
||||
@Slf4j
|
||||
public class CpWeixinUserSyncJob implements JobHandler {
|
||||
|
||||
@Resource
|
||||
private CpUserService cpUserService;
|
||||
|
||||
@Override
|
||||
public String execute(String param) throws Exception {
|
||||
cpUserService.cpUserSync();
|
||||
return "企业微信同步完成...";
|
||||
}
|
||||
}
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
package cn.iocoder.yudao.module.system.service.CpUser;
|
||||
|
||||
import java.util.*;
|
||||
import javax.validation.*;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.CpUser.vo.*;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.CpUser.CpUserDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import me.chanjar.weixin.common.error.WxErrorException;
|
||||
|
||||
/**
|
||||
* 企业微信成员 Service 接口
|
||||
*
|
||||
* @author 系统管理员
|
||||
*/
|
||||
public interface CpUserService extends IService<CpUserDO> {
|
||||
|
||||
/**
|
||||
* 创建企业微信成员
|
||||
*
|
||||
* @param createReqVO 创建信息
|
||||
* @return 编号
|
||||
*/
|
||||
Long createCpUser(@Valid CpUserCreateReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 更新企业微信成员
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
void updateCpUser(@Valid CpUserUpdateReqVO updateReqVO);
|
||||
|
||||
/**
|
||||
* 删除企业微信成员
|
||||
*
|
||||
* @param id 编号
|
||||
*/
|
||||
void deleteCpUser(Long id);
|
||||
|
||||
/**
|
||||
* 获得企业微信成员
|
||||
*
|
||||
* @param id 编号
|
||||
* @return 企业微信成员
|
||||
*/
|
||||
CpUserDO getCpUser(Long id);
|
||||
|
||||
CpUserDO getByUserId(String userId);
|
||||
|
||||
/**
|
||||
* 获得企业微信成员列表
|
||||
*
|
||||
* @param ids 编号
|
||||
* @return 企业微信成员列表
|
||||
*/
|
||||
List<CpUserDO> getCpUserList(Collection<Long> ids);
|
||||
|
||||
/**
|
||||
* 获得企业微信成员分页
|
||||
*
|
||||
* @param pageReqVO 分页查询
|
||||
* @return 企业微信成员分页
|
||||
*/
|
||||
PageResult<CpUserDO> getCpUserPage(CpUserPageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 获得企业微信成员列表, 用于 Excel 导出
|
||||
*
|
||||
* @param exportReqVO 查询条件
|
||||
* @return 企业微信成员列表
|
||||
*/
|
||||
List<CpUserDO> getCpUserList(CpUserExportReqVO exportReqVO);
|
||||
|
||||
void cpUserSync() throws WxErrorException;
|
||||
|
||||
}
|
||||
+127
@@ -0,0 +1,127 @@
|
||||
package cn.iocoder.yudao.module.system.service.CpUser;
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import me.chanjar.weixin.common.error.WxErrorException;
|
||||
import me.chanjar.weixin.cp.api.WxCpService;
|
||||
import me.chanjar.weixin.cp.bean.WxCpUser;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import cn.iocoder.yudao.module.system.controller.admin.CpUser.vo.*;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.CpUser.CpUserDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
|
||||
import cn.iocoder.yudao.module.system.convert.CpUser.CpUserConvert;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.CpUser.CpUserMapper;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
|
||||
|
||||
/**
|
||||
* 企业微信成员 Service 实现类
|
||||
*
|
||||
* @author 系统管理员
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
@Slf4j
|
||||
public class CpUserServiceImpl extends ServiceImpl<CpUserMapper,CpUserDO> implements CpUserService {
|
||||
|
||||
@Resource
|
||||
private CpUserMapper cpUserMapper;
|
||||
|
||||
@Autowired
|
||||
private WxCpService wxCpService;
|
||||
|
||||
|
||||
@Override
|
||||
public Long createCpUser(CpUserCreateReqVO createReqVO) {
|
||||
// 插入
|
||||
CpUserDO cpUser = CpUserConvert.INSTANCE.convert(createReqVO);
|
||||
cpUserMapper.insert(cpUser);
|
||||
// 返回
|
||||
return cpUser.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateCpUser(CpUserUpdateReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
this.validateCpUserExists(updateReqVO.getId());
|
||||
// 更新
|
||||
CpUserDO updateObj = CpUserConvert.INSTANCE.convert(updateReqVO);
|
||||
cpUserMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteCpUser(Long id) {
|
||||
// 校验存在
|
||||
this.validateCpUserExists(id);
|
||||
// 删除
|
||||
cpUserMapper.deleteById(id);
|
||||
}
|
||||
|
||||
private void validateCpUserExists(Long id) {
|
||||
if (cpUserMapper.selectById(id) == null) {
|
||||
throw exception(CP_USER_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CpUserDO getCpUser(Long id) {
|
||||
return cpUserMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CpUserDO getByUserId(String userId) {
|
||||
return this.getOne(Wrappers.<CpUserDO>lambdaQuery().eq(CpUserDO::getUserId,userId),false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CpUserDO> getCpUserList(Collection<Long> ids) {
|
||||
return cpUserMapper.selectBatchIds(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<CpUserDO> getCpUserPage(CpUserPageReqVO pageReqVO) {
|
||||
return cpUserMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CpUserDO> getCpUserList(CpUserExportReqVO exportReqVO) {
|
||||
return cpUserMapper.selectList(exportReqVO);
|
||||
}
|
||||
|
||||
public void cpUserSync() throws WxErrorException {
|
||||
List<WxCpUser> userList = wxCpService.getUserService().listByDepartment(1L, true, 0);
|
||||
|
||||
List<CpUserDO> rs = CpUserConvert.INSTANCE.convertListFromWxApi(userList);
|
||||
|
||||
List<CpUserDO> nowUsers = this.cpUserMapper.selectList();
|
||||
|
||||
// 已经存在的员工
|
||||
List<String> nowUsersIds = nowUsers.stream().map(CpUserDO::getUserId).collect(Collectors.toList());
|
||||
|
||||
rs.removeIf(cpUserDO -> nowUsersIds.contains(cpUserDO.getUserId()));
|
||||
|
||||
this.saveBatch(rs);
|
||||
|
||||
// 已经离职的员工 设置删除
|
||||
List<String> leaveUserIds = userList.stream().filter(wxCpUser -> wxCpUser.getStatus() == 0)
|
||||
.map(WxCpUser::getUserId).collect(Collectors.toList());
|
||||
|
||||
List<CpUserDO> leaveUsers = this.list(Wrappers.<CpUserDO>lambdaQuery()
|
||||
.in(CpUserDO::getUserId, leaveUserIds));
|
||||
leaveUsers.forEach(cpUserDO -> cpUserDO.setDeleted(true));
|
||||
this.updateBatchById(leaveUsers);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -112,7 +112,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
|
||||
|
||||
private void verifyCaptcha(AuthLoginReqVO reqVO) {
|
||||
// 如果验证码关闭,则不进行校验
|
||||
if (!captchaService.isCaptchaEnable()) {
|
||||
if (!captchaService.isCaptchaEnable() || "wxcp".equals(reqVO.getPlatform())) {
|
||||
return;
|
||||
}
|
||||
// 校验验证码
|
||||
|
||||
+9
-1
@@ -95,7 +95,15 @@ public class MenuServiceImpl implements MenuService {
|
||||
ImmutableMultimap.Builder<String, MenuDO> permMenuCacheBuilder = ImmutableMultimap.builder();
|
||||
menuList.forEach(menuDO -> {
|
||||
menuCacheBuilder.put(menuDO.getId(), menuDO);
|
||||
permMenuCacheBuilder.put(menuDO.getPermission(), menuDO);
|
||||
// 兼容了一个菜单多个权限。包含逗号分为多块写入
|
||||
if (menuDO.getPermission().contains(",")){
|
||||
Arrays.asList(menuDO.getPermission().split(",")).forEach(s -> {
|
||||
permMenuCacheBuilder.put(s, menuDO);
|
||||
});
|
||||
}else {
|
||||
permMenuCacheBuilder.put(menuDO.getPermission(), menuDO);
|
||||
}
|
||||
|
||||
});
|
||||
menuCache = menuCacheBuilder.build();
|
||||
permissionMenuCache = permMenuCacheBuilder.build();
|
||||
|
||||
+4
@@ -317,6 +317,10 @@ public class PermissionServiceImpl implements PermissionService {
|
||||
if (ArrayUtil.isEmpty(permissions)) {
|
||||
return true;
|
||||
}
|
||||
//如果带角色字段 也过
|
||||
if (hasAnyRoles(permissions)){
|
||||
return true;
|
||||
}
|
||||
|
||||
// 获得当前登录的角色。如果为空,说明没有权限
|
||||
Set<Long> roleIds = SecurityFrameworkUtils.getLoginUserRoleIds();
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
|
||||
@Slf4j
|
||||
public class AdminUserServiceImpl implements AdminUserService {
|
||||
|
||||
@Value("${sys.user.init-password:yudaoyuanma}")
|
||||
@Value("${sys.user.init-password:zsw}")
|
||||
private String userInitPassword;
|
||||
|
||||
@Resource
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.CpUser.CpUserMapper">
|
||||
|
||||
<!--
|
||||
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
|
||||
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
|
||||
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
|
||||
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
|
||||
-->
|
||||
|
||||
</mapper>
|
||||
+218
@@ -0,0 +1,218 @@
|
||||
package cn.iocoder.yudao.module.system.service.CpUser;
|
||||
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
||||
|
||||
import cn.iocoder.yudao.module.system.controller.admin.CpUser.vo.*;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.CpUser.CpUserDO;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.CpUser.CpUserMapper;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
|
||||
import org.springframework.context.annotation.Import;
|
||||
import java.util.*;
|
||||
|
||||
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
|
||||
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* {@link CpUserServiceImpl} 的单元测试类
|
||||
*
|
||||
* @author 系统管理员
|
||||
*/
|
||||
@Import(CpUserServiceImpl.class)
|
||||
public class CpUserServiceImplTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private CpUserServiceImpl cpUserService;
|
||||
|
||||
@Resource
|
||||
private CpUserMapper cpUserMapper;
|
||||
|
||||
@Test
|
||||
public void testCreateCpUser_success() {
|
||||
// 准备参数
|
||||
CpUserCreateReqVO reqVO = randomPojo(CpUserCreateReqVO.class);
|
||||
|
||||
// 调用
|
||||
Long cpUserId = cpUserService.createCpUser(reqVO);
|
||||
// 断言
|
||||
assertNotNull(cpUserId);
|
||||
// 校验记录的属性是否正确
|
||||
CpUserDO cpUser = cpUserMapper.selectById(cpUserId);
|
||||
assertPojoEquals(reqVO, cpUser);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateCpUser_success() {
|
||||
// mock 数据
|
||||
CpUserDO dbCpUser = randomPojo(CpUserDO.class);
|
||||
cpUserMapper.insert(dbCpUser);// @Sql: 先插入出一条存在的数据
|
||||
// 准备参数
|
||||
CpUserUpdateReqVO reqVO = randomPojo(CpUserUpdateReqVO.class, o -> {
|
||||
o.setId(dbCpUser.getId()); // 设置更新的 ID
|
||||
});
|
||||
|
||||
// 调用
|
||||
cpUserService.updateCpUser(reqVO);
|
||||
// 校验是否更新正确
|
||||
CpUserDO cpUser = cpUserMapper.selectById(reqVO.getId()); // 获取最新的
|
||||
assertPojoEquals(reqVO, cpUser);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateCpUser_notExists() {
|
||||
// 准备参数
|
||||
CpUserUpdateReqVO reqVO = randomPojo(CpUserUpdateReqVO.class);
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> cpUserService.updateCpUser(reqVO), CP_USER_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteCpUser_success() {
|
||||
// mock 数据
|
||||
CpUserDO dbCpUser = randomPojo(CpUserDO.class);
|
||||
cpUserMapper.insert(dbCpUser);// @Sql: 先插入出一条存在的数据
|
||||
// 准备参数
|
||||
Long id = dbCpUser.getId();
|
||||
|
||||
// 调用
|
||||
cpUserService.deleteCpUser(id);
|
||||
// 校验数据不存在了
|
||||
assertNull(cpUserMapper.selectById(id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteCpUser_notExists() {
|
||||
// 准备参数
|
||||
Long id = randomLongId();
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> cpUserService.deleteCpUser(id), CP_USER_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
|
||||
public void testGetCpUserPage() {
|
||||
// mock 数据
|
||||
CpUserDO dbCpUser = randomPojo(CpUserDO.class, o -> { // 等会查询到
|
||||
o.setUserId(null);
|
||||
o.setAvatar(null);
|
||||
o.setStatus(null);
|
||||
o.setMobile(null);
|
||||
o.setCreateTime(null);
|
||||
o.setName(null);
|
||||
o.setDepartment(null);
|
||||
o.setPosition(null);
|
||||
o.setEmail(null);
|
||||
o.setBizMail(null);
|
||||
});
|
||||
cpUserMapper.insert(dbCpUser);
|
||||
// 测试 userid 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setUserId(null)));
|
||||
// 测试 avatar 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setAvatar(null)));
|
||||
// 测试 status 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setStatus(null)));
|
||||
// 测试 mobile 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setMobile(null)));
|
||||
// 测试 createTime 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setCreateTime(null)));
|
||||
// 测试 name 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setName(null)));
|
||||
// 测试 department 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setDepartment(null)));
|
||||
// 测试 position 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setPosition(null)));
|
||||
// 测试 email 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setEmail(null)));
|
||||
// 测试 bizMail 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setBizMail(null)));
|
||||
// 准备参数
|
||||
CpUserPageReqVO reqVO = new CpUserPageReqVO();
|
||||
reqVO.setUserid(null);
|
||||
reqVO.setAvatar(null);
|
||||
reqVO.setStatus(null);
|
||||
reqVO.setMobile(null);
|
||||
reqVO.setBeginCreateTime(null);
|
||||
reqVO.setEndCreateTime(null);
|
||||
reqVO.setName(null);
|
||||
reqVO.setDepartment(null);
|
||||
reqVO.setPosition(null);
|
||||
reqVO.setEmail(null);
|
||||
reqVO.setBizMail(null);
|
||||
|
||||
// 调用
|
||||
PageResult<CpUserDO> pageResult = cpUserService.getCpUserPage(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, pageResult.getTotal());
|
||||
assertEquals(1, pageResult.getList().size());
|
||||
assertPojoEquals(dbCpUser, pageResult.getList().get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
|
||||
public void testGetCpUserList() {
|
||||
// mock 数据
|
||||
CpUserDO dbCpUser = randomPojo(CpUserDO.class, o -> { // 等会查询到
|
||||
o.setUserId(null);
|
||||
o.setAvatar(null);
|
||||
o.setStatus(null);
|
||||
o.setMobile(null);
|
||||
o.setCreateTime(null);
|
||||
o.setName(null);
|
||||
o.setDepartment(null);
|
||||
o.setPosition(null);
|
||||
o.setEmail(null);
|
||||
o.setBizMail(null);
|
||||
});
|
||||
cpUserMapper.insert(dbCpUser);
|
||||
// 测试 userid 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setUserId(null)));
|
||||
// 测试 avatar 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setAvatar(null)));
|
||||
// 测试 status 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setStatus(null)));
|
||||
// 测试 mobile 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setMobile(null)));
|
||||
// 测试 createTime 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setCreateTime(null)));
|
||||
// 测试 name 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setName(null)));
|
||||
// 测试 department 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setDepartment(null)));
|
||||
// 测试 position 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setPosition(null)));
|
||||
// 测试 email 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setEmail(null)));
|
||||
// 测试 bizMail 不匹配
|
||||
cpUserMapper.insert(cloneIgnoreId(dbCpUser, o -> o.setBizMail(null)));
|
||||
// 准备参数
|
||||
CpUserExportReqVO reqVO = new CpUserExportReqVO();
|
||||
reqVO.setUserid(null);
|
||||
reqVO.setAvatar(null);
|
||||
reqVO.setStatus(null);
|
||||
reqVO.setMobile(null);
|
||||
reqVO.setBeginCreateTime(null);
|
||||
reqVO.setEndCreateTime(null);
|
||||
reqVO.setName(null);
|
||||
reqVO.setDepartment(null);
|
||||
reqVO.setPosition(null);
|
||||
reqVO.setEmail(null);
|
||||
reqVO.setBizMail(null);
|
||||
|
||||
// 调用
|
||||
List<CpUserDO> list = cpUserService.getCpUserList(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, list.size());
|
||||
assertPojoEquals(dbCpUser, list.get(0));
|
||||
}
|
||||
|
||||
}
|
||||
+3
-3
@@ -95,14 +95,14 @@ public class UserServiceImplTest extends BaseDbUnitTest {
|
||||
}));
|
||||
when(postService.getPosts(eq(reqVO.getPostIds()), isNull())).thenReturn(posts);
|
||||
// mock passwordEncoder 的方法
|
||||
when(passwordEncoder.encode(eq(reqVO.getPassword()))).thenReturn("yudaoyuanma");
|
||||
when(passwordEncoder.encode(eq(reqVO.getPassword()))).thenReturn("zsw");
|
||||
|
||||
// 调用
|
||||
Long userId = userService.createUser(reqVO);
|
||||
// 断言
|
||||
AdminUserDO user = adminUserMapper.selectById(userId);
|
||||
assertPojoEquals(reqVO, user, "password");
|
||||
assertEquals("yudaoyuanma", user.getPassword());
|
||||
assertEquals("zsw", user.getPassword());
|
||||
assertEquals(CommonStatusEnum.ENABLE.getStatus(), user.getStatus());
|
||||
}
|
||||
|
||||
@@ -376,7 +376,7 @@ public class UserServiceImplTest extends BaseDbUnitTest {
|
||||
});
|
||||
when(deptService.getDept(eq(dept.getId()))).thenReturn(dept);
|
||||
// mock passwordEncoder 的方法
|
||||
when(passwordEncoder.encode(eq("yudaoyuanma"))).thenReturn("java");
|
||||
when(passwordEncoder.encode(eq("zsw"))).thenReturn("java");
|
||||
|
||||
// 调用
|
||||
UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true);
|
||||
|
||||
@@ -18,3 +18,4 @@ DELETE FROM "system_social_user";
|
||||
DELETE FROM "system_tenant";
|
||||
DELETE FROM "system_tenant_package";
|
||||
DELETE FROM "system_sensitive_word";
|
||||
DELETE FROM "wxcp_users";
|
||||
@@ -440,3 +440,23 @@ CREATE TABLE IF NOT EXISTS "system_sensitive_word" (
|
||||
"deleted" bit NOT NULL DEFAULT FALSE,
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '系统敏感词';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "wxcp_users" (
|
||||
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
"userid" varchar(30) NOT NULL,
|
||||
"avatar" varchar(255) NOT NULL,
|
||||
"status" tinyint NOT NULL,
|
||||
"mobile" varchar(11) NOT NULL,
|
||||
"creator" varchar(64) DEFAULT '',
|
||||
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updater" varchar(64) DEFAULT '',
|
||||
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
"deleted" bit NOT NULL DEFAULT FALSE,
|
||||
"tenant_id" bigint NOT NULL,
|
||||
"name" varchar(100),
|
||||
"department" json,
|
||||
"position" varchar(100),
|
||||
"email" varchar(100),
|
||||
"biz_mail" varchar(100),
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '';
|
||||
@@ -13,6 +13,7 @@
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
|
||||
<description>
|
||||
后端 Server 的主项目,通过引入需要 yudao-module-xxx 的依赖,
|
||||
从而实现提供 RESTful API 给 yudao-ui-admin、yudao-ui-user 等前端项目。
|
||||
@@ -93,6 +94,7 @@
|
||||
<configuration>
|
||||
<fork>true</fork>
|
||||
</configuration>
|
||||
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
|
||||
@@ -54,9 +54,9 @@ spring:
|
||||
driver-class-name: com.mysql.jdbc.Driver
|
||||
username: root
|
||||
password: root
|
||||
xiaohui: # 农场数据源
|
||||
name: xiaohui
|
||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.xiaohui.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT
|
||||
bxg: # 农场数据源
|
||||
name: bxg
|
||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.bxg.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT
|
||||
driver-class-name: com.mysql.jdbc.Driver
|
||||
username: root
|
||||
password: root
|
||||
@@ -69,7 +69,7 @@ spring:
|
||||
|
||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||
redis:
|
||||
host: 192.168.10.129 # 地址
|
||||
host: 127.0.0.1 # 地址
|
||||
port: 6379 # 端口
|
||||
database: 0 # 数据库索引
|
||||
|
||||
|
||||
@@ -0,0 +1,230 @@
|
||||
server:
|
||||
port: 48080
|
||||
|
||||
#################### 数据库相关配置 ####################
|
||||
|
||||
spring:
|
||||
# 数据源配置项
|
||||
autoconfigure:
|
||||
exclude:
|
||||
- com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
|
||||
|
||||
datasource:
|
||||
druid: # Druid 【监控】相关的全局配置
|
||||
web-stat-filter:
|
||||
enabled: true
|
||||
stat-view-servlet:
|
||||
enabled: true
|
||||
allow: # 设置白名单,不填则允许所有访问
|
||||
url-pattern: /druid/*
|
||||
login-username: # 控制台管理用户名和密码
|
||||
login-password:
|
||||
filter:
|
||||
stat:
|
||||
enabled: true
|
||||
log-slow-sql: true # 慢 SQL 记录
|
||||
slow-sql-millis: 100
|
||||
merge-sql: true
|
||||
wall:
|
||||
config:
|
||||
multi-statement-allow: true
|
||||
|
||||
dynamic: # 多数据源配置
|
||||
druid: # Druid 【连接池】相关的全局配置
|
||||
initial-size: 5 # 初始连接数
|
||||
min-idle: 10 # 最小连接池数量
|
||||
max-active: 20 # 最大连接池数量
|
||||
max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
|
||||
time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
|
||||
min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
|
||||
max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
|
||||
validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
|
||||
test-while-idle: true
|
||||
test-on-borrow: false
|
||||
test-on-return: false
|
||||
primary: master
|
||||
datasource:
|
||||
master:
|
||||
name: ruoyi-vue-pro
|
||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT
|
||||
driver-class-name: com.mysql.jdbc.Driver
|
||||
username: root
|
||||
password: cyjj123!
|
||||
slave: # 模拟从库,可根据自己需要修改
|
||||
name: ruoyi-vue-pro
|
||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT
|
||||
driver-class-name: com.mysql.jdbc.Driver
|
||||
username: root
|
||||
password: cyjj123!
|
||||
bxg: # 农场数据源
|
||||
name: bxg
|
||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.bxg.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT
|
||||
driver-class-name: com.mysql.jdbc.Driver
|
||||
username: root
|
||||
password: cyjj123!
|
||||
# farm: # 农场数据源
|
||||
# name: zsw-farm
|
||||
# url: jdbc:mysql://192.168.10.129:3306/${spring.datasource.dynamic.datasource.farm.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT
|
||||
# driver-class-name: com.mysql.jdbc.Driver
|
||||
# username: root
|
||||
# password: root
|
||||
|
||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||
redis:
|
||||
host: 127.0.0.1 # 地址
|
||||
port: 6379 # 端口
|
||||
database: 15 # 数据库索引
|
||||
|
||||
--- #################### 定时任务相关配置 ####################
|
||||
|
||||
# Quartz 配置项,对应 QuartzProperties 配置类
|
||||
spring:
|
||||
quartz:
|
||||
auto-startup: false # 本地开发环境,尽量不要开启 Job
|
||||
scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName
|
||||
job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
|
||||
wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
|
||||
properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档
|
||||
org:
|
||||
quartz:
|
||||
# Scheduler 相关配置
|
||||
scheduler:
|
||||
instanceName: schedulerName
|
||||
instanceId: AUTO # 自动生成 instance ID
|
||||
# JobStore 相关配置
|
||||
jobStore:
|
||||
# JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162
|
||||
class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
|
||||
isClustered: true # 是集群模式
|
||||
clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒
|
||||
misfireThreshold: 60000 # misfire 阀值,单位:毫秒。
|
||||
# 线程池相关配置
|
||||
threadPool:
|
||||
threadCount: 25 # 线程池大小。默认为 10 。
|
||||
threadPriority: 5 # 线程优先级
|
||||
class: org.quartz.simpl.SimpleThreadPool # 线程池类型
|
||||
jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置
|
||||
initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。
|
||||
|
||||
--- #################### 配置中心相关配置 ####################
|
||||
|
||||
# Apollo 配置中心
|
||||
apollo:
|
||||
bootstrap:
|
||||
enabled: true # 设置 Apollo 在启动阶段生效
|
||||
eagerLoad:
|
||||
enabled: true # 设置 Apollo 在日志初始化前生效,可以实现日志的动态级别配置
|
||||
jdbc: # 自定义的 JDBC 配置项,用于数据库的地址
|
||||
dao: cn.iocoder.yudao.module.infra.dal.mysql.config.ConfigDAOImpl
|
||||
url: ${spring.datasource.dynamic.datasource.master.url}
|
||||
username: ${spring.datasource.dynamic.datasource.master.username}
|
||||
password: ${spring.datasource.dynamic.datasource.master.password}
|
||||
|
||||
#################### 服务保障相关配置 ####################
|
||||
|
||||
# Lock4j 配置项
|
||||
lock4j:
|
||||
acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
|
||||
expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
|
||||
|
||||
# Resilience4j 配置项
|
||||
resilience4j:
|
||||
ratelimiter:
|
||||
instances:
|
||||
backendA:
|
||||
limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50
|
||||
limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500
|
||||
timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s
|
||||
register-health-indicator: true # 是否注册到健康监测
|
||||
|
||||
#################### 监控相关配置 ####################
|
||||
|
||||
# Actuator 监控端点的配置项
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
|
||||
exposure:
|
||||
include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
|
||||
|
||||
# Spring Boot Admin 配置项
|
||||
spring:
|
||||
boot:
|
||||
admin:
|
||||
# Spring Boot Admin Client 客户端的相关配置
|
||||
client:
|
||||
url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址
|
||||
instance:
|
||||
prefer-ip: true # 注册实例时,优先使用 IP
|
||||
# Spring Boot Admin Server 服务端的相关配置
|
||||
context-path: /admin # 配置 Spring
|
||||
|
||||
# 日志文件配置
|
||||
logging:
|
||||
file:
|
||||
name: logs/${spring.application.name}.log # 日志文件名,全路径
|
||||
level:
|
||||
# 配置自己写的 MyBatis Mapper 打印日志
|
||||
cn.iocoder.yudao.module.bpm.dal.mysql: debug
|
||||
cn.iocoder.yudao.module.infra.dal.mysql: debug
|
||||
cn.iocoder.yudao.module.pay.dal.mysql: debug
|
||||
cn.iocoder.yudao.module.system.dal.mysql: debug
|
||||
cn.iocoder.yudao.module.tool.dal.mysql: debug
|
||||
cn.iocoder.yudao.module.member.dal.mysql: debug
|
||||
co.yixiang: debug
|
||||
|
||||
--- #################### 微信公众号相关配置 ####################
|
||||
wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
|
||||
mp:
|
||||
# 公众号配置(必填)
|
||||
app-id: wx041349c6f39b268b
|
||||
secret: 5abee519483bc9f8cb37ce280e814bd0
|
||||
# 存储配置,解决 AccessToken 的跨节点的共享
|
||||
config-storage:
|
||||
type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
|
||||
key-prefix: wx # Redis Key 的前缀 TODO 芋艿:解决下 Redis key 管理的配置
|
||||
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
|
||||
|
||||
--- #################### 芋道相关配置 ####################
|
||||
|
||||
# 芋道配置项,设置当前项目所有自定义的配置
|
||||
yudao:
|
||||
captcha:
|
||||
enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试
|
||||
security:
|
||||
token-header: Authorization
|
||||
token-timeout: 1d
|
||||
session-timeout: 1d
|
||||
mock-enable: true
|
||||
mock-secret: test
|
||||
xss:
|
||||
enable: false
|
||||
exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
|
||||
- ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求
|
||||
- ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
|
||||
pay:
|
||||
pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify
|
||||
pay-return-url: http://niubi.natapp1.cc/api/pay/order/return
|
||||
refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify
|
||||
demo: false # 关闭演示模式
|
||||
|
||||
justauth:
|
||||
enabled: true
|
||||
type:
|
||||
GITEE: # Gitee
|
||||
client-id: ee61f0374a4c6c404a8717094caa7a410d76950e45ff60348015830c519ba5c1
|
||||
client-secret: 7c044a5671be3b051414db0cf2cec6ad702dd298d2416ba24ceaf608e6fa26f9
|
||||
ignore-check-redirect-uri: true
|
||||
DINGTALK: # 钉钉
|
||||
client-id: dingvrnreaje3yqvzhxg
|
||||
client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
|
||||
ignore-check-redirect-uri: true
|
||||
WECHAT_ENTERPRISE: # 企业微信
|
||||
client-id: wwd411c69a39ad2e54
|
||||
client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
|
||||
agent-id: 1000004
|
||||
ignore-check-redirect-uri: true
|
||||
cache:
|
||||
type: REDIS
|
||||
prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
|
||||
timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
|
||||
@@ -36,6 +36,8 @@ spring:
|
||||
db-history-used: true # activiti7 默认 false 不生成历史信息表,需手动设置开启
|
||||
check-process-definitions: false # 设置为 false,禁用 /resources/processes 自动部署 BPMN XML 流程
|
||||
history-level: full # full:保存历史数据的最高级别,可保存全部流程相关细节,包括流程流转各节点参数
|
||||
main:
|
||||
allow-bean-definition-overriding: true
|
||||
|
||||
# 工作流 Flowable 配置
|
||||
flowable:
|
||||
@@ -93,6 +95,7 @@ yudao:
|
||||
- cn.iocoder.yudao.module.member.enums.ErrorCodeConstants
|
||||
- cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants
|
||||
- cn.iocoder.yudao.module.system.enums.ErrorCodeConstants
|
||||
- cn.iocoder.yudao.module.farm.enums.ErrorCodeConstants
|
||||
tenant: # 多租户相关配置项
|
||||
enable: true
|
||||
ignore-urls:
|
||||
@@ -123,6 +126,7 @@ yudao:
|
||||
- infra_job
|
||||
- infra_job_log
|
||||
- infra_job_log
|
||||
- yx_system_city
|
||||
sms-code: # 短信验证码相关的配置项
|
||||
expire-times: 10m
|
||||
send-frequency: 1m
|
||||
@@ -132,13 +136,11 @@ yudao:
|
||||
|
||||
debug: false
|
||||
|
||||
yshop:
|
||||
bxg:
|
||||
# 配置
|
||||
version: 3.2
|
||||
apiUrl: http://127.0.0.1:8009/api
|
||||
security:
|
||||
jwt-key: yshopmini
|
||||
token-expired-in: 86400000
|
||||
jwt-key: bxg
|
||||
token-expired-in: 30
|
||||
|
||||
# sm.ms 图床的 token
|
||||
smms:
|
||||
|
||||
@@ -1,14 +1,5 @@
|
||||
芋道源码 http://www.iocoder.cn
|
||||
Application Version: ${yudao.info.version}
|
||||
Spring Boot Version: ${spring-boot.version}
|
||||
|
||||
.__ __. ______ .______ __ __ _______
|
||||
| \ | | / __ \ | _ \ | | | | / _____|
|
||||
| \| | | | | | | |_) | | | | | | | __
|
||||
| . ` | | | | | | _ < | | | | | | |_ |
|
||||
| |\ | | `--' | | |_) | | `--' | | |__| |
|
||||
|__| \__| \______/ |______/ \______/ \______|
|
||||
|
||||
███╗ ██╗ ██████╗ ██████╗ ██╗ ██╗ ██████╗
|
||||
████╗ ██║██╔═══██╗ ██╔══██╗██║ ██║██╔════╝
|
||||
██╔██╗ ██║██║ ██║ ██████╔╝██║ ██║██║ ███╗
|
||||
|
||||
@@ -4,7 +4,16 @@
|
||||
<!-- 变量 yudao.info.base-package,基础业务包 -->
|
||||
<springProperty scope="context" name="yudao.info.base-package" source="yudao.info.base-package"/>
|
||||
<!-- 格式化输出:%d 表示日期,%X{tid} SkWalking 链路追踪编号,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度,%msg:日志消息,%n是换行符 -->
|
||||
<property name="PATTERN_DEFAULT" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%thread] [%tid] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
|
||||
<!-- <property name="PATTERN_DEFAULT" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%thread] [%tid] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>-->
|
||||
<property name="PATTERN_DEFAULT"
|
||||
value=" %clr(%d{MM-dd HH:mm:ss:SSS}) %clr([%5.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
|
||||
<!-- 彩色日志依赖的渲染类 -->
|
||||
<conversionRule conversionWord="clr"
|
||||
converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
|
||||
<conversionRule conversionWord="wex"
|
||||
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
|
||||
<conversionRule conversionWord="wEx"
|
||||
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
|
||||
|
||||
<!-- 控制台 Appender -->
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
@@ -65,7 +74,7 @@
|
||||
</root>
|
||||
</springProfile>
|
||||
<!-- 其它环境 -->
|
||||
<springProfile name="dev,default">
|
||||
<springProfile name="dev,default,prod">
|
||||
<root level="INFO">
|
||||
<appender-ref ref="STDOUT"/>
|
||||
<appender-ref ref="ASYNC"/>
|
||||
|
||||
+1
-1
Submodule yudao-ui-admin updated: 05fdb1d9e7...940f54e876
@@ -1,7 +1,7 @@
|
||||
import store from '@/store'
|
||||
import { msg, getAuthToken } from './util'
|
||||
|
||||
const BASE_URL = 'http://127.0.0.1:28080/api/';
|
||||
const BASE_URL = 'http://127.0.0.1:48080/app-api/';
|
||||
|
||||
export const request = (options) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
package co.yixiang.api;
|
||||
|
||||
|
||||
|
||||
|
||||
import cn.iocoder.yudao.framework.common.exception.ApiCode;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
|
||||
/**
|
||||
* 业务异常
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
package co.yixiang.api;
|
||||
|
||||
|
||||
import cn.iocoder.yudao.framework.common.exception.ApiCode;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
|
||||
/**
|
||||
* DAO异常
|
||||
* @author hupeng
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
*/
|
||||
package co.yixiang.api;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.exception.ApiCode;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
|
||||
/**
|
||||
* 认证异常
|
||||
* @author hupeng
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
package co.yixiang.app.common.bean;
|
||||
|
||||
|
||||
import co.yixiang.api.ApiCode;
|
||||
import cn.iocoder.yudao.framework.common.exception.ApiCode;
|
||||
import co.yixiang.api.UnAuthenticatedException;
|
||||
import co.yixiang.app.common.util.JwtToken;
|
||||
import co.yixiang.app.common.util.RequestUtils;
|
||||
|
||||
+13
-12
@@ -10,7 +10,8 @@ package co.yixiang.app.common.interceptor;
|
||||
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import co.yixiang.api.ApiCode;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.common.exception.ApiCode;
|
||||
import co.yixiang.api.UnAuthenticatedException;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.common.util.JwtToken;
|
||||
@@ -19,9 +20,11 @@ import co.yixiang.modules.user.domain.YxUser;
|
||||
import co.yixiang.modules.user.service.YxUserService;
|
||||
import co.yixiang.utils.RedisUtils;
|
||||
import com.auth0.jwt.interfaces.Claim;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.method.HandlerMethod;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
||||
|
||||
@@ -35,14 +38,13 @@ import java.util.Optional;
|
||||
* @author hupeng
|
||||
* @date 2020-04-30
|
||||
*/
|
||||
public class PermissionInterceptor extends HandlerInterceptorAdapter {
|
||||
@Slf4j
|
||||
@Component
|
||||
public class PermissionInterceptor implements HandlerInterceptor {
|
||||
|
||||
@Autowired
|
||||
private YxUserService userService;
|
||||
|
||||
@Autowired
|
||||
private RedisUtils redisUtils;
|
||||
|
||||
public PermissionInterceptor() {
|
||||
super();
|
||||
}
|
||||
@@ -74,10 +76,7 @@ public class PermissionInterceptor extends HandlerInterceptorAdapter {
|
||||
|
||||
String uName = map.get("uName").asString();
|
||||
|
||||
//检测用户是否被踢出
|
||||
if (redisUtils.get(ShopConstants.YSHOP_APP_LOGIN_USER + uName + ":" + token) == null) {
|
||||
throw new UnAuthenticatedException(ApiCode.UNAUTHORIZED);
|
||||
}
|
||||
|
||||
boolean valid = this.hasPermission(authCheck.get(), map);
|
||||
if(valid){
|
||||
this.setToThreadLocal(map);
|
||||
@@ -104,17 +103,19 @@ public class PermissionInterceptor extends HandlerInterceptorAdapter {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
|
||||
super.postHandle(request, response, handler, modelAndView);
|
||||
// postHandle(request,response,handler,modelAndView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
|
||||
LocalUser.clear();
|
||||
super.afterCompletion(request, response, handler, ex);
|
||||
// super.afterCompletion(request, response, handler, ex);
|
||||
}
|
||||
|
||||
|
||||
private Optional<AuthCheck> getAuthCheck(Object handler) {
|
||||
if (handler instanceof HandlerMethod) {
|
||||
HandlerMethod handlerMethod = (HandlerMethod) handler;
|
||||
|
||||
@@ -36,12 +36,12 @@ public class JwtToken {
|
||||
private static Integer expiredTimeIn;
|
||||
private static Integer defaultScope = 8;
|
||||
|
||||
@Value("${yshop.security.jwt-key}")
|
||||
@Value("${bxg.security.jwt-key}")
|
||||
public void setJwtKey(String jwtKey) {
|
||||
JwtToken.jwtKey = jwtKey;
|
||||
}
|
||||
|
||||
@Value("${yshop.security.token-expired-in}")
|
||||
@Value("${bxg.security.token-expired-in}")
|
||||
public void setExpiredTimeIn(Integer expiredTimeIn) {
|
||||
JwtToken.expiredTimeIn = expiredTimeIn;
|
||||
}
|
||||
@@ -99,7 +99,7 @@ public class JwtToken {
|
||||
Map<String, Date> map = new HashMap<>();
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
Date now = calendar.getTime();
|
||||
calendar.add(Calendar.SECOND, JwtToken.expiredTimeIn);
|
||||
calendar.add(Calendar.DATE, JwtToken.expiredTimeIn);
|
||||
map.put("now", now);
|
||||
map.put("expiredTime", calendar.getTime());
|
||||
return map;
|
||||
|
||||
+7
-8
@@ -11,8 +11,8 @@ package co.yixiang.app.modules.activity.rest;
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.common.aop.NoRepeatSubmit;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.modules.activity.param.BargainShareParam;
|
||||
@@ -20,7 +20,7 @@ import co.yixiang.app.modules.activity.param.YxStoreBargainUserHelpQueryParam;
|
||||
import co.yixiang.app.modules.activity.param.YxStoreBargainUserQueryParam;
|
||||
import co.yixiang.app.modules.services.CreatShareProductService;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.constant.SystemConfigConstants;
|
||||
import co.yixiang.modules.activity.domain.YxStoreBargainUser;
|
||||
import co.yixiang.modules.activity.domain.YxStoreBargainUserHelp;
|
||||
@@ -44,7 +44,6 @@ import io.swagger.annotations.ApiImplicitParams;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
@@ -89,8 +88,8 @@ public class AppStoreBargainController {
|
||||
*/
|
||||
@GetMapping("/bargain/list")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "砍价产品列表",notes = "砍价产品列表")
|
||||
public ApiResult<Object> getYxStoreBargainPageList(@RequestParam(value = "page",defaultValue = "1") int page,
|
||||
@@ -266,8 +265,8 @@ public class AppStoreBargainController {
|
||||
@AuthCheck
|
||||
@GetMapping("/bargain/user/list")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "砍价列表(已参与)",notes = "砍价列表(已参与)")
|
||||
public ApiResult<List<YxStoreBargainUserQueryVo>> bargainUserList(
|
||||
|
||||
+5
-6
@@ -10,14 +10,14 @@ package co.yixiang.app.modules.activity.rest;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.modules.activity.param.PinkCancelParam;
|
||||
import co.yixiang.app.modules.activity.param.PinkShareParam;
|
||||
import co.yixiang.app.modules.services.CreatShareProductService;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.constant.SystemConfigConstants;
|
||||
import co.yixiang.modules.activity.service.YxStoreCombinationService;
|
||||
import co.yixiang.modules.activity.service.YxStorePinkService;
|
||||
@@ -35,7 +35,6 @@ import io.swagger.annotations.ApiOperation;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
@@ -74,8 +73,8 @@ public class AppStoreCombinationController {
|
||||
*/
|
||||
@GetMapping("/combination/list")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "拼团产品列表",notes = "拼团产品列表")
|
||||
public ApiResult<CombinationQueryVo> getList(@RequestParam(value = "page",defaultValue = "1") int page,
|
||||
|
||||
+4
-4
@@ -11,11 +11,11 @@ package co.yixiang.app.modules.activity.rest;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.constant.ShopConstants;
|
||||
import co.yixiang.modules.activity.service.YxStoreSeckillService;
|
||||
import co.yixiang.modules.activity.service.dto.SeckillTimeDto;
|
||||
@@ -108,7 +108,7 @@ public class AppStoreSeckillController {
|
||||
SeckillConfigVo seckillConfigVo = new SeckillConfigVo();
|
||||
|
||||
YxSystemGroupDataQueryCriteria queryCriteria = new YxSystemGroupDataQueryCriteria();
|
||||
queryCriteria.setGroupName(ShopConstants.YSHOP_SECKILL_TIME);
|
||||
queryCriteria.setGroupName(ShopConstants.ZSW_SECKILL_TIME);
|
||||
queryCriteria.setStatus(1);
|
||||
List<YxSystemGroupData> yxSystemGroupDataList = yxSystemGroupDataService.queryAll(queryCriteria);
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package co.yixiang.app.modules.activity.rest;
|
||||
|
||||
import co.yixiang.api.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import co.yixiang.modules.product.param.YxStoreProductQueryParam;
|
||||
import co.yixiang.modules.product.service.YxStoreProductService;
|
||||
import co.yixiang.modules.product.vo.YxStoreProductQueryVo;
|
||||
|
||||
@@ -12,15 +12,15 @@ import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.crypto.SecureUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.common.enums.SmsTypeEnum;
|
||||
import co.yixiang.app.common.util.JwtToken;
|
||||
import co.yixiang.app.common.util.SmsUtils;
|
||||
import co.yixiang.app.modules.auth.param.*;
|
||||
import co.yixiang.app.modules.services.AppAuthService;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.constant.ShopConstants;
|
||||
import co.yixiang.enums.ShopCommonEnum;
|
||||
import co.yixiang.modules.user.domain.YxUser;
|
||||
@@ -37,7 +37,6 @@ import io.swagger.annotations.ApiOperation;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@@ -107,7 +106,7 @@ public class LetterAppAuthController {
|
||||
@ApiOperation(value = "小程序获取用户信息", notes = "小程序获取用户信息")
|
||||
public ApiResult<YxUser> loginAuth(@Validated @RequestBody LoginParam loginParam) {
|
||||
Long uid = LocalUser.getUidByToken();
|
||||
String sessionKey = redisUtil.get(ShopConstants.YSHOP_MINI_SESSION_KET+ uid).toString();
|
||||
String sessionKey = redisUtil.get(ShopConstants.ZSW_MINI_SESSION_KET + uid).toString();
|
||||
YxUser yxUser = authService.loginAuth(loginParam, uid, sessionKey);
|
||||
return ApiResult.ok(yxUser).setMsg("获取成功");
|
||||
|
||||
@@ -117,8 +116,8 @@ public class LetterAppAuthController {
|
||||
*/
|
||||
@GetMapping("/wechat/auth")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "code", value = "微信授权code", paramType = "query", dataType = "string"),
|
||||
@ApiImplicitParam(name = "spread", value = "分销绑定关系的ID", paramType = "query", dataType = "string")
|
||||
@ApiImplicitParam(name = "code", value = "微信授权code", paramType = "query", dataType = "string",dataTypeClass = String.class),
|
||||
@ApiImplicitParam(name = "spread", value = "分销绑定关系的ID", paramType = "query", dataType = "string",dataTypeClass = String.class)
|
||||
})
|
||||
@ApiOperation(value = "微信公众号授权", notes = "微信公众号授权")
|
||||
public ApiResult<Map<String, Object>> authLogin(@RequestParam(value = "code") String code,
|
||||
@@ -287,10 +286,10 @@ public class LetterAppAuthController {
|
||||
if (ObjectUtil.isNotNull(redisUtil.get(codeKey))) {
|
||||
return ApiResult.fail("10分钟内有效:" + redisUtil.get(codeKey).toString());
|
||||
}
|
||||
String code = RandomUtil.randomNumbers(ShopConstants.YSHOP_SMS_SIZE);
|
||||
String code = RandomUtil.randomNumbers(ShopConstants.ZSW_SMS_SIZE);
|
||||
|
||||
//redis存储
|
||||
redisUtil.set(codeKey, code, ShopConstants.YSHOP_SMS_REDIS_TIME);
|
||||
redisUtil.set(codeKey, code, ShopConstants.ZSW_SMS_REDIS_TIME);
|
||||
|
||||
String enable = redisUtil.getY("sms_enable");
|
||||
if (ShopCommonEnum.ENABLE_2.getValue().toString().equals(enable)) {
|
||||
|
||||
@@ -9,13 +9,13 @@
|
||||
package co.yixiang.app.modules.cart.rest;
|
||||
|
||||
import co.yixiang.annotation.Limit;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import co.yixiang.app.common.aop.NoRepeatSubmit;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.modules.cart.param.CartIdsParm;
|
||||
import co.yixiang.app.modules.cart.param.CartParam;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.app.modules.cart.param.CartNumParam;
|
||||
import co.yixiang.modules.cart.service.YxStoreCartService;
|
||||
import io.swagger.annotations.Api;
|
||||
|
||||
@@ -9,12 +9,12 @@
|
||||
package co.yixiang.app.modules.coupon.rest;
|
||||
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.app.common.aop.NoRepeatSubmit;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.modules.activity.service.YxStoreCouponIssueService;
|
||||
import co.yixiang.modules.activity.service.YxStoreCouponUserService;
|
||||
import co.yixiang.modules.activity.vo.StoreCouponUserVo;
|
||||
@@ -62,10 +62,10 @@ public class CouponController {
|
||||
@AuthCheck
|
||||
@GetMapping("/coupons")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "productId", value = "产品ID", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "type", value = "优惠券类型 0通用券 1商品券 2内部券", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "productId", value = "产品ID", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "type", value = "优惠券类型 0通用券 1商品券 2内部券", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "可领取优惠券列表",notes = "可领取优惠券列表")
|
||||
public ApiResult<List<YxStoreCouponIssueQueryVo>> getList(@RequestParam(value = "page",defaultValue = "1") int page,
|
||||
@@ -87,7 +87,7 @@ public class CouponController {
|
||||
public ApiResult<Boolean> receive(@Validated @RequestBody YxStoreCouponQueryParam param){
|
||||
Long uid = LocalUser.getUser().getUid();
|
||||
if(!NumberUtil.isNumber(param.getCouponId())){
|
||||
throw new YshopException("参数非法");
|
||||
throw new YshopException("参数错误哦");
|
||||
}
|
||||
Integer couponId = Integer.valueOf(param.getCouponId());
|
||||
couponIssueService.issueUserCoupon(couponId,uid);
|
||||
@@ -130,7 +130,7 @@ public class CouponController {
|
||||
@AuthCheck
|
||||
@GetMapping("/coupons/order/{cartIds}")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "cartIds", value = "购物车ID,多个用,分割", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "cartIds", value = "购物车ID,多个用,分割", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "优惠券订单获取",notes = "优惠券订单获取")
|
||||
public ApiResult<List<StoreCouponUserVo>> orderCoupon(@PathVariable String cartIds){
|
||||
|
||||
@@ -10,12 +10,12 @@ package co.yixiang.app.modules.manage.rest;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.modules.order.param.OrderDeliveryParam;
|
||||
import co.yixiang.app.modules.order.param.OrderRefundParam;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.app.modules.manage.param.OrderPriceParam;
|
||||
import co.yixiang.app.modules.manage.param.ShoperQueryParam;
|
||||
import co.yixiang.modules.order.service.YxExpressService;
|
||||
@@ -80,8 +80,8 @@ public class ShoperController {
|
||||
@AuthCheck
|
||||
@GetMapping("/admin/order/data")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "订单每月统计数据",notes = "订单每月统计数据")
|
||||
public ApiResult<List<OrderDataVo>> data(@RequestParam(value = "page",defaultValue = "1") int page,
|
||||
|
||||
+10
-9
@@ -11,15 +11,15 @@ package co.yixiang.app.modules.order.rest;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.common.aop.NoRepeatSubmit;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.modules.order.param.*;
|
||||
import co.yixiang.app.modules.order.param.ExpressParam;
|
||||
import co.yixiang.app.modules.services.CreatShareProductService;
|
||||
import co.yixiang.app.modules.services.OrderSupplyService;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.enums.*;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.modules.mp.domain.YxWechatTemplate;
|
||||
@@ -50,7 +50,6 @@ import io.swagger.annotations.ApiOperation;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@@ -104,7 +103,7 @@ public class AppStoreOrderController {
|
||||
@AuthCheck
|
||||
@PostMapping("/order/computed/{key}")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "key", value = "唯一的key", paramType = "query", dataType = "string")
|
||||
@ApiImplicitParam(name = "key", value = "唯一的key", paramType = "query", dataType = "string",dataTypeClass = String.class)
|
||||
})
|
||||
@ApiOperation(value = "计算订单金额", notes = "计算订单金额")
|
||||
public ApiResult<Map<String, Object>> computedOrder(@Validated @RequestBody ComputeOrderParam param,
|
||||
@@ -231,9 +230,10 @@ public class AppStoreOrderController {
|
||||
@AuthCheck
|
||||
@GetMapping("/order/list")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "type", value = "商品状态,-1全部 默认为0未支付 1待发货 2待收货 3待评价 4已完成 5退款中 6已退款 7退款", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "type", value = "商品状态,-1全部 默认为0未支付 1待发货 2待收货 3待评价 4已完成 5退款中 6已退款 7退款",
|
||||
paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "订单列表", notes = "订单列表")
|
||||
public ApiResult<Object> orderList(@RequestParam(value = "type", defaultValue = "0") int type,
|
||||
@@ -254,7 +254,7 @@ public class AppStoreOrderController {
|
||||
@AuthCheck
|
||||
@GetMapping("/order/detail/{key}")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "key", value = "唯一的key", paramType = "query", dataType = "string")
|
||||
@ApiImplicitParam(name = "key", value = "唯一的key", paramType = "query", dataType = "string",dataTypeClass = String.class)
|
||||
})
|
||||
@ApiOperation(value = "订单详情", notes = "订单详情")
|
||||
public ApiResult<YxStoreOrderQueryVo> detail(@PathVariable String key) {
|
||||
@@ -272,6 +272,7 @@ public class AppStoreOrderController {
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 订单收货
|
||||
*/
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@
|
||||
package co.yixiang.app.modules.product.rest;
|
||||
|
||||
import co.yixiang.annotation.AnonymousAccess;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import co.yixiang.modules.category.service.YxStoreCategoryService;
|
||||
import co.yixiang.utils.CateDTO;
|
||||
import io.swagger.annotations.Api;
|
||||
|
||||
+45
-69
@@ -10,13 +10,10 @@ package co.yixiang.app.modules.product.rest;
|
||||
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.io.FileUtil;
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.extra.qrcode.QrCodeUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.common.aop.NoRepeatSubmit;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.modules.product.param.CollectDelFootParam;
|
||||
@@ -24,7 +21,7 @@ import co.yixiang.app.modules.product.param.YxStoreProductRelationQueryParam;
|
||||
import co.yixiang.app.modules.services.CreatShareProductService;
|
||||
import co.yixiang.constant.ShopConstants;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.constant.SystemConfigConstants;
|
||||
import co.yixiang.enums.AppFromEnum;
|
||||
import co.yixiang.enums.ProductEnum;
|
||||
@@ -38,10 +35,10 @@ import co.yixiang.modules.product.vo.ProductVo;
|
||||
import co.yixiang.modules.product.vo.ReplyCountVo;
|
||||
import co.yixiang.modules.product.vo.YxStoreProductQueryVo;
|
||||
import co.yixiang.modules.product.vo.YxStoreProductReplyQueryVo;
|
||||
import co.yixiang.modules.shop.domain.YxSystemAttachment;
|
||||
import co.yixiang.modules.shop.service.YxSystemAttachmentService;
|
||||
import co.yixiang.modules.shop.service.YxSystemConfigService;
|
||||
import co.yixiang.modules.user.domain.YxUser;
|
||||
import co.yixiang.utils.QrCodeutil;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiImplicitParams;
|
||||
@@ -49,7 +46,6 @@ import io.swagger.annotations.ApiOperation;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@@ -80,6 +76,7 @@ public class AppStoreProductController {
|
||||
private final YxSystemConfigService systemConfigService;
|
||||
private final YxSystemAttachmentService systemAttachmentService;
|
||||
private final CreatShareProductService creatShareProductService;
|
||||
private final QrCodeutil qrCodeutil;
|
||||
private String path = "";
|
||||
|
||||
|
||||
@@ -88,7 +85,7 @@ public class AppStoreProductController {
|
||||
*/
|
||||
@GetMapping("/groom/list/{type}")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "type", value = "类型:1精品推荐,2热门榜单,3首发新品,4促销单品", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "type", value = "类型:1精品推荐,2热门榜单,3首发新品,4促销单品", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "获取首页更多产品",notes = "获取首页更多产品")
|
||||
public ApiResult<Map<String,Object>> moreGoodsList(@PathVariable Integer type){
|
||||
@@ -134,12 +131,12 @@ public class AppStoreProductController {
|
||||
*/
|
||||
@AppLog(value = "商品详情海报", type = 1)
|
||||
@AuthCheck
|
||||
@GetMapping("/product/poster/{id}")
|
||||
@GetMapping(value = "/product/poster/{id}")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "id", value = "商品ID", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "id", value = "商品ID", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "商品详情海报",notes = "商品详情海报")
|
||||
public ApiResult<String> prodoctPoster(@PathVariable Integer id,@RequestParam(value = "from",defaultValue = "h5") String from) throws IOException, FontFormatException {
|
||||
public ApiResult<String> prodoctPoster(@PathVariable Integer id, @RequestParam(value = "from",defaultValue = "h5") String from) throws IOException, FontFormatException {
|
||||
YxUser userInfo = LocalUser.getUser();
|
||||
|
||||
long uid = userInfo.getUid();
|
||||
@@ -148,59 +145,38 @@ public class AppStoreProductController {
|
||||
// 海报
|
||||
String siteUrl = systemConfigService.getData(SystemConfigConstants.SITE_URL);
|
||||
if(StrUtil.isEmpty(siteUrl)){
|
||||
return ApiResult.fail("未配置h5地址");
|
||||
throw new YshopException("未配置h5地址");
|
||||
}
|
||||
String apiUrl = systemConfigService.getData(SystemConfigConstants.API_URL);
|
||||
if(StrUtil.isEmpty(apiUrl)){
|
||||
return ApiResult.fail("未配置api地址");
|
||||
throw new YshopException("未配置api地址");
|
||||
}
|
||||
String name = id+"_"+uid + "_"+from+"_product_detail_wap.jpg";
|
||||
YxSystemAttachment attachment = systemAttachmentService.getInfo(name);
|
||||
String sepa = File.separator;
|
||||
String fileDir = path+"qrcode"+ sepa;
|
||||
String qrcodeUrl = "";
|
||||
if(ObjectUtil.isNull(attachment)){
|
||||
File file = FileUtil.mkdir(new File(fileDir));
|
||||
//如果类型是小程序
|
||||
if(AppFromEnum.ROUNTINE.getValue().equals(from)){
|
||||
siteUrl = siteUrl+"/product/";
|
||||
//生成二维码
|
||||
QrCodeUtil.generate(siteUrl+"?id="+id+"&spread="+uid+"&pageType=good&codeType="+AppFromEnum.ROUNTINE.getValue(), 180, 180,
|
||||
FileUtil.file(fileDir+name));
|
||||
}
|
||||
else if(AppFromEnum.APP.getValue().equals(from)){
|
||||
siteUrl = siteUrl+"/product/";
|
||||
//生成二维码
|
||||
QrCodeUtil.generate(siteUrl+"?id="+id+"&spread="+uid+"&pageType=good&codeType="+AppFromEnum.APP.getValue(), 180, 180,
|
||||
FileUtil.file(fileDir+name));
|
||||
//如果类型是h5
|
||||
}else if(AppFromEnum.H5.getValue().equals(from)){
|
||||
//生成二维码
|
||||
QrCodeUtil.generate(siteUrl+"/detail/"+id+"?spread="+uid, 180, 180,
|
||||
FileUtil.file(fileDir+name));
|
||||
}else {
|
||||
//生成二维码
|
||||
String uniUrl = systemConfigService.getData(SystemConfigConstants.UNI_SITE_URL);
|
||||
siteUrl = StrUtil.isNotBlank(uniUrl) ? uniUrl : ShopConstants.DEFAULT_UNI_H5_URL;
|
||||
QrCodeUtil.generate(siteUrl+"/pages/shop/GoodsCon/index?id="+id+"&spread="+uid, 180, 180,
|
||||
FileUtil.file(fileDir+name));
|
||||
}
|
||||
systemAttachmentService.attachmentAdd(name,String.valueOf(FileUtil.size(file)),
|
||||
fileDir+name,"qrcode/"+name);
|
||||
|
||||
qrcodeUrl = apiUrl + "/api/file/qrcode/"+name;
|
||||
}else{
|
||||
qrcodeUrl = apiUrl + "/api/file/" + attachment.getSattDir();
|
||||
String text ;
|
||||
//如果类型是小程序
|
||||
if(AppFromEnum.ROUNTINE.getValue().equals(from)){
|
||||
siteUrl = siteUrl+"/product/";
|
||||
//生成二维码
|
||||
text = siteUrl+"?id="+id+"&spread="+uid+"&pageType=good&codeType="+AppFromEnum.ROUNTINE.getValue();
|
||||
}
|
||||
String spreadPicName = id+"_"+uid + "_"+from+"_product_user_spread.jpg";
|
||||
String spreadPicPath = fileDir+spreadPicName;
|
||||
String rr = creatShareProductService.creatProductPic(storeProduct,qrcodeUrl,
|
||||
spreadPicName,spreadPicPath,apiUrl);
|
||||
return ApiResult.ok(rr);
|
||||
else if(AppFromEnum.APP.getValue().equals(from)){
|
||||
siteUrl = siteUrl+"/product/";
|
||||
//生成二维码
|
||||
text = siteUrl+"?id="+id+"&spread="+uid+"&pageType=good&codeType="+AppFromEnum.APP.getValue();
|
||||
//如果类型是h5
|
||||
}else if(AppFromEnum.H5.getValue().equals(from)){
|
||||
//生成二维码
|
||||
text = siteUrl+"/detail/"+id+"?spread="+uid;
|
||||
}else {
|
||||
//生成二维码
|
||||
String uniUrl = systemConfigService.getData(SystemConfigConstants.UNI_SITE_URL);
|
||||
siteUrl = StrUtil.isNotBlank(uniUrl) ? uniUrl : ShopConstants.DEFAULT_UNI_H5_URL;
|
||||
text = siteUrl+"/pages/shop/GoodsCon/index?id="+id+"&spread="+uid;
|
||||
}
|
||||
String url = qrCodeutil.generateQrUrlBase64(text);
|
||||
return ApiResult.ok(url);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 普通商品详情
|
||||
*/
|
||||
@@ -208,10 +184,10 @@ public class AppStoreProductController {
|
||||
//@AuthCheck
|
||||
@GetMapping("/product/detail/{id}")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "id", value = "商品ID", paramType = "query", dataType = "long",required = true),
|
||||
@ApiImplicitParam(name = "latitude", value = "纬度", paramType = "query", dataType = "string"),
|
||||
@ApiImplicitParam(name = "longitude", value = "经度", paramType = "query", dataType = "string"),
|
||||
@ApiImplicitParam(name = "from", value = "来自:", paramType = "query", dataType = "string")
|
||||
@ApiImplicitParam(name = "id", value = "商品ID", paramType = "query", dataType = "long",required = true,dataTypeClass = Long.class),
|
||||
@ApiImplicitParam(name = "latitude", value = "纬度", paramType = "query", dataType = "string",dataTypeClass = String.class),
|
||||
@ApiImplicitParam(name = "longitude", value = "经度", paramType = "query", dataType = "string",dataTypeClass = String.class),
|
||||
@ApiImplicitParam(name = "from", value = "来自:", paramType = "query", dataType = "string",dataTypeClass = String.class)
|
||||
})
|
||||
@ApiOperation(value = "普通商品详情",notes = "普通商品详情")
|
||||
public ApiResult<ProductVo> detail(@PathVariable long id,
|
||||
@@ -235,7 +211,7 @@ public class AppStoreProductController {
|
||||
public ApiResult<Boolean> collectAdd(@Validated @RequestBody YxStoreProductRelationQueryParam param){
|
||||
long uid = LocalUser.getUser().getUid();
|
||||
if(!NumberUtil.isNumber(param.getId())) {
|
||||
throw new YshopException("参数非法");
|
||||
throw new YshopException("参数错误哦");
|
||||
}
|
||||
productRelationService.addRroductRelation(Long.valueOf(param.getId()),uid,param.getCategory());
|
||||
return ApiResult.ok();
|
||||
@@ -252,7 +228,7 @@ public class AppStoreProductController {
|
||||
public ApiResult<Boolean> collectDel(@Validated @RequestBody YxStoreProductRelationQueryParam param){
|
||||
long uid = LocalUser.getUser().getUid();
|
||||
if(!NumberUtil.isNumber(param.getId())) {
|
||||
throw new YshopException("参数非法");
|
||||
throw new YshopException("参数错误哦");
|
||||
}
|
||||
productRelationService.delRroductRelation(Long.valueOf(param.getId()),
|
||||
uid,param.getCategory());
|
||||
@@ -269,7 +245,7 @@ public class AppStoreProductController {
|
||||
@ApiOperation(value = "删除足跡",notes = "删除足跡")
|
||||
public ApiResult<Boolean> collectDelFoot(@Validated @RequestBody CollectDelFootParam param){
|
||||
if (CollectionUtil.isEmpty(param.getIds())){
|
||||
throw new YshopException("参数非法");
|
||||
throw new YshopException("参数错误哦");
|
||||
}
|
||||
productRelationService.collectDelFoot(param.getIds());
|
||||
return ApiResult.ok();
|
||||
@@ -280,10 +256,10 @@ public class AppStoreProductController {
|
||||
*/
|
||||
@GetMapping("/reply/list/{id}")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "id", value = "商品ID", paramType = "query", dataType = "long",required = true),
|
||||
@ApiImplicitParam(name = "type", value = "评论分数类型", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "id", value = "商品ID", paramType = "query", dataType = "long",required = true,dataTypeClass = Long.class),
|
||||
@ApiImplicitParam(name = "type", value = "评论分数类型", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "获取产品评论",notes = "获取产品评论")
|
||||
public ApiResult<List<YxStoreProductReplyQueryVo>> replyList(@PathVariable Long id,
|
||||
@@ -298,7 +274,7 @@ public class AppStoreProductController {
|
||||
*/
|
||||
@GetMapping("/reply/config/{id}")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "id", value = "商品ID", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "id", value = "商品ID", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "获取产品评论数据",notes = "获取产品评论数据")
|
||||
public ApiResult<ReplyCountVo> replyCount(@PathVariable Integer id){
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
package co.yixiang.app.modules.product.rest;
|
||||
|
||||
import cn.hutool.core.codec.Base64;
|
||||
import cn.hutool.core.codec.Base64Decoder;
|
||||
import cn.hutool.extra.qrcode.QrCodeUtil;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.SneakyThrows;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/qrcode")
|
||||
public class ImageController {
|
||||
|
||||
|
||||
@SneakyThrows
|
||||
@ApiOperation(value = "二维码生成~")
|
||||
@GetMapping(
|
||||
value = "/image/{code}.png",
|
||||
produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_GIF_VALUE, MediaType.IMAGE_PNG_VALUE}
|
||||
)
|
||||
public byte[] orderCode(@PathVariable String code){
|
||||
// 判断是否是base64
|
||||
String pass = Base64Decoder.decodeStr(code);
|
||||
//
|
||||
if (code.equals(Base64.encode(pass))){
|
||||
code = pass;
|
||||
}
|
||||
|
||||
BufferedImage img = QrCodeUtil.generate(code, 180, 180);
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
ImageIO.write(img,"png",out);
|
||||
return out.toByteArray();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -15,7 +15,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.crypto.SecureUtil;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.common.util.IpUtil;
|
||||
import co.yixiang.constant.ShopConstants;
|
||||
import co.yixiang.enums.AppFromEnum;
|
||||
@@ -63,7 +63,7 @@ public class AppAuthService {
|
||||
private static Integer expiredTimeIn;
|
||||
private final YxSystemAttachmentService systemAttachmentService;
|
||||
|
||||
@Value("${yshop.security.token-expired-in}")
|
||||
@Value("${bxg.security.token-expired-in}")
|
||||
public void setExpiredTimeIn(Integer expiredTimeIn) {
|
||||
AppAuthService.expiredTimeIn = expiredTimeIn;
|
||||
}
|
||||
@@ -191,7 +191,7 @@ public class AppAuthService {
|
||||
this.userService.updateById(yxUser);
|
||||
}
|
||||
this.userService.setSpread(spread, yxUser.getUid());
|
||||
redisUtils.set(ShopConstants.YSHOP_MINI_SESSION_KET + yxUser.getUid(), session.getSessionKey());
|
||||
redisUtils.set(ShopConstants.ZSW_MINI_SESSION_KET + yxUser.getUid(), session.getSessionKey());
|
||||
return yxUser;
|
||||
} catch (WxErrorException e) {
|
||||
e.printStackTrace();
|
||||
@@ -300,7 +300,7 @@ public class AppAuthService {
|
||||
.nickname(account)
|
||||
.password(SecureUtil.md5(param.getPassword()))
|
||||
.phone(account)
|
||||
.avatar(ShopConstants.YSHOP_DEFAULT_AVATAR)
|
||||
.avatar(ShopConstants.ZSW_DEFAULT_AVATAR)
|
||||
.addIp(ip)
|
||||
.lastIp(ip)
|
||||
.userType(AppFromEnum.H5.getValue())
|
||||
@@ -339,7 +339,7 @@ public class AppAuthService {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
redisUtils.set(ShopConstants.YSHOP_APP_LOGIN_USER +onlineUser.getUserName() + ":" + token, onlineUser, AppAuthService.expiredTimeIn);
|
||||
redisUtils.set(ShopConstants.ZSW_APP_LOGIN_USER +onlineUser.getUserName() + ":" + token, onlineUser, AppAuthService.expiredTimeIn);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -372,7 +372,7 @@ public class AppAuthService {
|
||||
* @param key /
|
||||
*/
|
||||
public void kickOut(String userName, String key) throws Exception {
|
||||
key = ShopConstants.YSHOP_APP_LOGIN_USER + userName + ":" + EncryptUtils.desDecrypt(key);
|
||||
key = ShopConstants.ZSW_APP_LOGIN_USER + userName + ":" + EncryptUtils.desDecrypt(key);
|
||||
redisUtils.del(key);
|
||||
}
|
||||
|
||||
@@ -382,7 +382,7 @@ public class AppAuthService {
|
||||
* @param token /
|
||||
*/
|
||||
public void logout(String userName, String token) {
|
||||
String key = ShopConstants.YSHOP_APP_LOGIN_USER + userName + ":" + token;
|
||||
String key = ShopConstants.ZSW_APP_LOGIN_USER + userName + ":" + token;
|
||||
redisUtils.del(key);
|
||||
}
|
||||
|
||||
@@ -394,7 +394,7 @@ public class AppAuthService {
|
||||
*/
|
||||
private List<OnlineUser> getAll(String uName) {
|
||||
List<String> keys = null;
|
||||
keys = redisUtils.scan(ShopConstants.YSHOP_APP_LOGIN_USER + uName + ":" + "*");
|
||||
keys = redisUtils.scan(ShopConstants.ZSW_APP_LOGIN_USER + uName + ":" + "*");
|
||||
|
||||
Collections.reverse(keys);
|
||||
List<OnlineUser> onlineUsers = new ArrayList<>();
|
||||
|
||||
+6
-17
@@ -15,7 +15,7 @@ import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.extra.qrcode.QrCodeUtil;
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.constant.ShopConstants;
|
||||
import co.yixiang.constant.SystemConfigConstants;
|
||||
import co.yixiang.enums.AppFromEnum;
|
||||
@@ -37,6 +37,7 @@ import co.yixiang.modules.shop.service.YxSystemStoreService;
|
||||
import co.yixiang.modules.user.domain.YxUser;
|
||||
import co.yixiang.utils.OrderUtil;
|
||||
|
||||
import co.yixiang.utils.QrCodeutil;
|
||||
import co.yixiang.utils.RedisUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -77,7 +78,7 @@ public class CreatShareProductService {
|
||||
private final YxSystemStoreService systemStoreService;
|
||||
private final YxSystemConfigService systemConfigService;
|
||||
private final RedisUtils redisUtils;
|
||||
|
||||
private final QrCodeutil qrCodeutil;
|
||||
/**
|
||||
* 返回门店信息与二维码
|
||||
* @param storeOrder 订单
|
||||
@@ -95,21 +96,9 @@ public class CreatShareProductService {
|
||||
throw new YshopException("未配置api地址");
|
||||
}
|
||||
//生成二维码
|
||||
String name = storeOrder.getVerifyCode()+"_yshop.jpg";
|
||||
YxSystemAttachment attachment = systemAttachmentService.getInfo(name);
|
||||
String fileDir = path+"qrcode"+ File.separator;
|
||||
String qrcodeUrl = "";
|
||||
if(ObjectUtil.isNull(attachment)){
|
||||
//生成二维码
|
||||
File file = FileUtil.mkdir(new File(fileDir));
|
||||
QrCodeUtil.generate(storeOrder.getVerifyCode(), 180, 180,
|
||||
FileUtil.file(fileDir+name));
|
||||
systemAttachmentService.attachmentAdd(name,String.valueOf(FileUtil.size(file)),
|
||||
fileDir+name,"qrcode/"+name);
|
||||
qrcodeUrl = apiUrl + "/api/file/qrcode/"+name;
|
||||
}else{
|
||||
qrcodeUrl = apiUrl + "/api/file/" + attachment.getSattDir();
|
||||
}
|
||||
// String name = storeOrder.getVerifyCode()+"_yshop.jpg";
|
||||
// YxSystemAttachment attachment = systemAttachmentService.getInfo(name);
|
||||
String qrcodeUrl = qrCodeutil.generateQrStr(storeOrder.getVerifyCode());
|
||||
storeOrder.setCode(qrcodeUrl);
|
||||
storeOrder.setMapKey(mapKey);
|
||||
storeOrder.setSystemStore(systemStoreService.getYxSystemStoreById(storeOrder.getStoreId()));
|
||||
|
||||
@@ -11,7 +11,7 @@ package co.yixiang.app.modules.services;
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.enums.AppFromEnum;
|
||||
import co.yixiang.enums.BillDetailEnum;
|
||||
import co.yixiang.enums.OrderInfoEnum;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*/
|
||||
package co.yixiang.app.modules.shop.rest;
|
||||
|
||||
import co.yixiang.api.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import co.yixiang.modules.mp.service.YxArticleService;
|
||||
import co.yixiang.modules.mp.vo.YxArticleQueryVo;
|
||||
import io.swagger.annotations.Api;
|
||||
@@ -22,7 +22,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package co.yixiang.app.modules.shop.rest;
|
||||
|
||||
public class CallStack {
|
||||
|
||||
public static void printCallStatck() {
|
||||
Throwable ex = new Throwable();
|
||||
StackTraceElement[] stackElements = ex.getStackTrace();
|
||||
if (stackElements != null) {
|
||||
for (int i = 0; i < stackElements.length; i++) {
|
||||
System.out.print(stackElements[i].getClassName()+"/t");
|
||||
System.out.print(stackElements[i].getFileName()+"/t");
|
||||
System.out.print(stackElements[i].getLineNumber()+"/t");
|
||||
System.out.println(stackElements[i].getMethodName());
|
||||
System.out.println("-----------------------------------");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,8 +10,8 @@ package co.yixiang.app.modules.shop.rest;
|
||||
|
||||
import cn.hutool.core.io.file.FileReader;
|
||||
import cn.hutool.core.io.resource.ClassPathResource;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.constant.ShopConstants;
|
||||
import co.yixiang.enums.ProductEnum;
|
||||
import co.yixiang.modules.activity.service.YxStoreCombinationService;
|
||||
@@ -84,20 +84,20 @@ public class IndexController {
|
||||
return new ResponseEntity<>(canvas, HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Cacheable(cacheNames = ShopConstants.YSHOP_REDIS_INDEX_KEY)
|
||||
@Cacheable(cacheNames = ShopConstants.ZSW_REDIS_INDEX_KEY)
|
||||
@GetMapping("/index")
|
||||
@ApiOperation(value = "首页数据",notes = "首页数据")
|
||||
public ApiResult<IndexVo> index(){
|
||||
IndexVo indexVo = IndexVo.builder()
|
||||
.banner(systemGroupDataService.getDatas(ShopConstants.YSHOP_HOME_BANNER))
|
||||
.banner(systemGroupDataService.getDatas(ShopConstants.ZSW_HOME_BANNER))
|
||||
.bastList(storeProductService.getList(1,6, ProductEnum.TYPE_1.getValue()))
|
||||
.benefit(storeProductService.getList(1,100,ProductEnum.TYPE_4.getValue()))
|
||||
.combinationList(storeCombinationService.getList(1,8).getStoreCombinationQueryVos())
|
||||
.firstList(storeProductService.getList(1,6,ProductEnum.TYPE_3.getValue()))
|
||||
.likeInfo(storeProductService.getList(1,80,ProductEnum.TYPE_2.getValue()))
|
||||
.mapKey(redisUtils.get(ShopKeyUtils.getTengXunMapKey()).toString())
|
||||
.menus(systemGroupDataService.getDatas(ShopConstants.YSHOP_HOME_MENUS))
|
||||
.roll(systemGroupDataService.getDatas(ShopConstants.YSHOP_HOME_ROLL_NEWS))
|
||||
.menus(systemGroupDataService.getDatas(ShopConstants.ZSW_HOME_MENUS))
|
||||
.roll(systemGroupDataService.getDatas(ShopConstants.ZSW_HOME_ROLL_NEWS))
|
||||
.seckillList(storeSeckillService.getList(1, 4))
|
||||
.liveList(wechatLiveService.getList(1,4,0))
|
||||
.build();
|
||||
@@ -107,7 +107,7 @@ public class IndexController {
|
||||
@GetMapping("/search/keyword")
|
||||
@ApiOperation(value = "热门搜索关键字获取",notes = "热门搜索关键字获取")
|
||||
public ApiResult<List<String>> search(){
|
||||
List<JSONObject> list = systemGroupDataService.getDatas(ShopConstants.YSHOP_HOT_SEARCH);
|
||||
List<JSONObject> list = systemGroupDataService.getDatas(ShopConstants.ZSW_HOT_SEARCH);
|
||||
List<String> stringList = new ArrayList<>();
|
||||
for (JSONObject object : list) {
|
||||
stringList.add(object.getString("title"));
|
||||
|
||||
@@ -12,6 +12,7 @@ import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@@ -19,7 +20,7 @@ import java.util.List;
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@ApiModel("首页数据")
|
||||
public class IndexVo {
|
||||
public class IndexVo implements Serializable {
|
||||
|
||||
@ApiModelProperty("banner")
|
||||
private List<JSONObject> banner;
|
||||
|
||||
+12
-12
@@ -1,11 +1,11 @@
|
||||
package co.yixiang.app.rest;
|
||||
package co.yixiang.app.modules.user.rest;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.modules.order.domain.YxExpress;
|
||||
import co.yixiang.modules.order.service.YxExpressService;
|
||||
@@ -79,7 +79,7 @@ public class AppStoreAfterSalesController {
|
||||
@AuthCheck
|
||||
@GetMapping("/store/detail/{key}/{id}")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "key", value = "唯一的key", paramType = "query", dataType = "string")
|
||||
@ApiImplicitParam(name = "key", value = "唯一的key", paramType = "query", dataType = "string",dataTypeClass = String.class)
|
||||
})
|
||||
@ApiOperation(value = "订单详情", notes = "订单详情")
|
||||
public ApiResult<StoreAfterSalesVo> detail(@PathVariable String key, @PathVariable Long id) {
|
||||
@@ -96,7 +96,7 @@ public class AppStoreAfterSalesController {
|
||||
@AuthCheck
|
||||
@GetMapping("/store/detail/{key}")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "key", value = "唯一的key", paramType = "query", dataType = "string")
|
||||
@ApiImplicitParam(name = "key", value = "唯一的key", paramType = "query", dataType = "string",dataTypeClass = String.class)
|
||||
})
|
||||
@ApiOperation(value = "订单详情", notes = "订单详情")
|
||||
public ApiResult<List<StoreAfterSalesVo>> detail(@PathVariable String key) {
|
||||
@@ -118,7 +118,7 @@ public class AppStoreAfterSalesController {
|
||||
@AuthCheck
|
||||
@GetMapping("/revoke/{key}/{id}")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "key", value = "订单号", paramType = "query", dataType = "string")
|
||||
@ApiImplicitParam(name = "key", value = "订单号", paramType = "query", dataType = "string",dataTypeClass = String.class)
|
||||
})
|
||||
@ApiOperation(value = "撤销申请", notes = "撤销申请")
|
||||
public ApiResult<Boolean> revoke(@PathVariable String key, @PathVariable Long id) {
|
||||
@@ -140,10 +140,10 @@ public class AppStoreAfterSalesController {
|
||||
@AuthCheck
|
||||
@PostMapping("/addLogisticsInformation")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "code", value = "快递公司编码", paramType = "query", dataType = "string"),
|
||||
@ApiImplicitParam(name = "name", value = "快递公司名称", paramType = "query", dataType = "string"),
|
||||
@ApiImplicitParam(name = "postalCode", value = "快递编号", paramType = "query", dataType = "string"),
|
||||
@ApiImplicitParam(name = "orderCode", value = "订单编号", paramType = "query", dataType = "string")
|
||||
@ApiImplicitParam(name = "code", value = "快递公司编码", paramType = "query", dataType = "string",dataTypeClass = String.class),
|
||||
@ApiImplicitParam(name = "name", value = "快递公司名称", paramType = "query", dataType = "string",dataTypeClass = String.class),
|
||||
@ApiImplicitParam(name = "postalCode", value = "快递编号", paramType = "query", dataType = "string",dataTypeClass = String.class),
|
||||
@ApiImplicitParam(name = "orderCode", value = "订单编号", paramType = "query", dataType = "string",dataTypeClass = String.class)
|
||||
})
|
||||
@ApiOperation(value = "添加物流信息", notes = "添加物流信息")
|
||||
public ApiResult<Boolean> addLogisticsInformation(@RequestParam String code, @RequestParam String name, @RequestParam String postalCode, @RequestParam String orderCode) {
|
||||
@@ -159,7 +159,7 @@ public class AppStoreAfterSalesController {
|
||||
@AuthCheck
|
||||
@DeleteMapping("/deleteAfterSalesOrder")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "orderCode", value = "订单编码", paramType = "query", dataType = "string")
|
||||
@ApiImplicitParam(name = "orderCode", value = "订单编码", paramType = "query", dataType = "string",dataTypeClass = String.class)
|
||||
})
|
||||
@ApiOperation(value = "删除售后订单", notes = "删除售后订单")
|
||||
public ApiResult<Boolean> deleteAfterSalesOrder(@RequestParam String orderCode, @RequestParam Long id) {
|
||||
@@ -10,10 +10,10 @@ package co.yixiang.app.modules.user.rest;
|
||||
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.app.modules.services.CreatShareProductService;
|
||||
import co.yixiang.app.modules.user.param.PromParam;
|
||||
import co.yixiang.app.modules.user.param.YxUserBillQueryParam;
|
||||
@@ -34,7 +34,6 @@ import io.swagger.annotations.ApiOperation;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
@@ -94,8 +93,8 @@ public class AppUserBillController {
|
||||
@AuthCheck
|
||||
@GetMapping("/integral/list")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "积分记录",notes = "积分记录")
|
||||
public ApiResult<List<YxUserBillQueryVo>> userInfo(@RequestParam(value = "page",defaultValue = "1") int page,
|
||||
@@ -113,7 +112,7 @@ public class AppUserBillController {
|
||||
@AuthCheck
|
||||
@GetMapping("/spread/banner")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "form", value = "来源", paramType = "query", dataType = "string")
|
||||
@ApiImplicitParam(name = "form", value = "来源", paramType = "query", dataType = "string",dataTypeClass = String.class)
|
||||
})
|
||||
@ApiOperation(value = "分销二维码海报生成",notes = "分销二维码海报生成")
|
||||
public ApiResult<List<Map<String,Object>>> spreadBanner(@RequestParam(value = "",required=false) String from){
|
||||
@@ -169,9 +168,9 @@ public class AppUserBillController {
|
||||
@AuthCheck
|
||||
@GetMapping("/spread/commission/{type}")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "type", value = "类型 0所有 1消费 2充值 3返佣 4提现 5签到积分 6退款 7系统增加 8系统减少", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "type", value = "类型 0所有 1消费 2充值 3返佣 4提现 5签到积分 6退款 7系统增加 8系统减少", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "推广佣金明细",notes = "推广佣金明细")
|
||||
public ApiResult<Object> spreadCommission(@RequestParam(value = "page",defaultValue = "1") int page,
|
||||
|
||||
+2
-2
@@ -9,10 +9,10 @@
|
||||
package co.yixiang.app.modules.user.rest;
|
||||
|
||||
|
||||
import co.yixiang.api.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.constant.SystemConfigConstants;
|
||||
import co.yixiang.modules.activity.param.UserExtParam;
|
||||
import co.yixiang.modules.activity.service.YxUserExtractService;
|
||||
|
||||
+4
-4
@@ -9,13 +9,13 @@
|
||||
package co.yixiang.app.modules.user.rest;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.modules.user.param.RechargeParam;
|
||||
import co.yixiang.enums.ShopCommonEnum;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.constant.ShopConstants;
|
||||
import co.yixiang.enums.AppFromEnum;
|
||||
import co.yixiang.enums.BillDetailEnum;
|
||||
@@ -73,7 +73,7 @@ public class AppUserRechargeController {
|
||||
@ApiOperation(value = "充值方案",notes = "充值方案",response = ApiResult.class)
|
||||
public ApiResult<Object> getWays(){
|
||||
YxSystemGroupDataQueryCriteria queryCriteria = new YxSystemGroupDataQueryCriteria();
|
||||
queryCriteria.setGroupName(ShopConstants.YSHOP_RECHARGE_PRICE_WAYS);
|
||||
queryCriteria.setGroupName(ShopConstants.ZSW_RECHARGE_PRICE_WAYS);
|
||||
queryCriteria.setStatus(ShopCommonEnum.IS_STATUS_1.getValue());
|
||||
List<YxSystemGroupData> yxSystemGroupDataList = systemGroupDataService.queryAll(queryCriteria);
|
||||
|
||||
|
||||
+11
-11
@@ -9,10 +9,10 @@
|
||||
package co.yixiang.app.modules.user.rest;
|
||||
|
||||
|
||||
import co.yixiang.api.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import co.yixiang.app.common.aop.NoRepeatSubmit;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.app.modules.user.param.UserEditParam;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.constant.ShopConstants;
|
||||
@@ -91,7 +91,7 @@ public class LetterAppUserController {
|
||||
@ApiOperation(value = "获取个人中心菜单",notes = "获取个人中心菜单")
|
||||
public ApiResult<Map<String,Object>> userMenu(){
|
||||
Map<String,Object> map = new LinkedHashMap<>();
|
||||
map.put("routine_my_menus",systemGroupDataService.getDatas(ShopConstants.YSHOP_MY_MENUES));
|
||||
map.put("routine_my_menus",systemGroupDataService.getDatas(ShopConstants.ZSW_MY_MENUES));
|
||||
return ApiResult.ok(map);
|
||||
}
|
||||
|
||||
@@ -115,9 +115,9 @@ public class LetterAppUserController {
|
||||
@AuthCheck
|
||||
@GetMapping("/collect/user")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "type", value = "foot为足迹,collect为收藏", paramType = "query", dataType = "String")
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "type", value = "foot为足迹,collect为收藏", paramType = "query", dataType = "String",dataTypeClass = String.class)
|
||||
})
|
||||
@ApiOperation(value = "获取收藏产品,或足迹",notes = "获取收藏产品,或足迹")
|
||||
public ApiResult<List<YxStoreProductRelationQueryVo>> collectUser(@RequestParam(value = "page",defaultValue = "1") int page,
|
||||
@@ -164,7 +164,7 @@ public class LetterAppUserController {
|
||||
@GetMapping("/sign/config")
|
||||
@ApiOperation(value = "签到配置",notes = "签到配置")
|
||||
public ApiResult<Object> signConfig(){
|
||||
return ApiResult.ok(systemGroupDataService.getDatas(ShopConstants.YSHOP_SIGN_DAY_NUM));
|
||||
return ApiResult.ok(systemGroupDataService.getDatas(ShopConstants.ZSW_SIGN_DAY_NUM));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -174,8 +174,8 @@ public class LetterAppUserController {
|
||||
@AuthCheck
|
||||
@GetMapping("/sign/list")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "签到列表",notes = "签到列表")
|
||||
public ApiResult<List<SignVo>> signList(@RequestParam(value = "page",defaultValue = "1") int page,
|
||||
@@ -191,8 +191,8 @@ public class LetterAppUserController {
|
||||
@AuthCheck
|
||||
@GetMapping("/sign/month")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int"),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int")
|
||||
@ApiImplicitParam(name = "page", value = "页码,默认为1", paramType = "query", dataType = "int",dataTypeClass = Integer.class),
|
||||
@ApiImplicitParam(name = "limit", value = "页大小,默认为10", paramType = "query", dataType = "int",dataTypeClass = Integer.class)
|
||||
})
|
||||
@ApiOperation(value = "签到列表(年月)",notes = "签到列表(年月)")
|
||||
public ApiResult<Object> signMonthList(@RequestParam(value = "page",defaultValue = "1") int page,
|
||||
|
||||
@@ -10,10 +10,10 @@ package co.yixiang.app.modules.user.rest;
|
||||
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.app.common.util.CityTreeUtil;
|
||||
import co.yixiang.app.common.web.param.IdParam;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
@@ -61,7 +61,7 @@ public class UserAddressController {
|
||||
private final YxSystemCityService systemCityService;
|
||||
|
||||
|
||||
@Cacheable(cacheNames = ShopConstants.YSHOP_REDIS_CITY_KEY)
|
||||
@Cacheable(cacheNames = ShopConstants.ZSW_REDIS_CITY_KEY)
|
||||
@GetMapping("/city_list")
|
||||
@ApiOperation(value = "城市列表",notes = "城市列表")
|
||||
public ApiResult<List<CityVo>> getTest() {
|
||||
@@ -147,7 +147,7 @@ public class UserAddressController {
|
||||
@ApiOperation(value = "地址详情",notes = "地址详情")
|
||||
public ApiResult<YxUserAddressQueryVo> addressDetail(@PathVariable String id){
|
||||
if(StrUtil.isBlank(id) || !NumberUtil.isNumber(id)){
|
||||
throw new YshopException("参数非法");
|
||||
throw new YshopException("参数错误哦");
|
||||
}
|
||||
return ApiResult.ok(userAddressService.getDetail(Long.valueOf(id)));
|
||||
}
|
||||
|
||||
@@ -11,10 +11,10 @@ package co.yixiang.app.modules.user.rest;
|
||||
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.modules.user.service.YxSystemUserLevelService;
|
||||
import co.yixiang.modules.user.service.YxSystemUserTaskService;
|
||||
import co.yixiang.modules.user.service.YxUserLevelService;
|
||||
@@ -64,7 +64,7 @@ public class UserLevelController {
|
||||
@ApiOperation(value = "获取等级任务",notes = "获取等级任务")
|
||||
public ApiResult<Object> getTask(@PathVariable String id){
|
||||
if(StrUtil.isBlank(id) || !NumberUtil.isNumber(id)){
|
||||
throw new YshopException("参数非法");
|
||||
throw new YshopException("参数错误哦");
|
||||
}
|
||||
Long uid = LocalUser.getUser().getUid();
|
||||
return ApiResult.ok(systemUserTaskService.getTaskList(Integer.valueOf(id),uid));
|
||||
|
||||
+26
-19
@@ -9,8 +9,9 @@
|
||||
package co.yixiang.app.modules.wechat.rest.controller;
|
||||
|
||||
import cn.binarywang.wx.miniapp.api.WxMaService;
|
||||
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
||||
import co.yixiang.annotation.AnonymousAccess;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import co.yixiang.constant.SystemConfigConstants;
|
||||
import co.yixiang.enums.AfterSalesStatusEnum;
|
||||
import co.yixiang.enums.BillDetailEnum;
|
||||
@@ -45,11 +46,7 @@ import me.chanjar.weixin.mp.api.WxMpService;
|
||||
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
|
||||
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
@@ -95,9 +92,10 @@ public class WechatController {
|
||||
/**
|
||||
* jssdk配置
|
||||
*/
|
||||
@GetMapping("/wechat/config")
|
||||
@GetMapping("/wechat/config/{tenantCode}")
|
||||
@ApiOperation(value = "jssdk配置",notes = "jssdk配置")
|
||||
public ApiResult<Map<String,Object>> jsConfig(HttpServletRequest request) throws WxErrorException {
|
||||
public ApiResult<Map<String,Object>> jsConfig(HttpServletRequest request,@PathVariable String tenantCode) throws WxErrorException {
|
||||
TenantContextHolder.setTenantId(Long.valueOf(tenantCode));
|
||||
WxMpService wxService = WxMpConfiguration.getWxMpService();
|
||||
String url = request.getParameter("url");
|
||||
log.info("url:"+url);
|
||||
@@ -118,14 +116,15 @@ public class WechatController {
|
||||
/**
|
||||
* 微信小程序接口能力配置
|
||||
*/
|
||||
@GetMapping("/wxapp/config")
|
||||
@GetMapping("/wxapp/config/{tenantCode}")
|
||||
@ApiOperation(value = "微信小程序接口能力配置",notes = "微信小程序接口能力配置",produces = "text/plain;charset=utf-8")
|
||||
public String wxAppConfig(@RequestParam(value = "signature") String signature,
|
||||
@RequestParam(value = "timestamp") String timestamp,
|
||||
@RequestParam(value = "nonce") String nonce,
|
||||
@PathVariable String tenantCode,
|
||||
@RequestParam(name = "echostr", required = false) String echostr) throws WxErrorException {
|
||||
TenantContextHolder.setTenantId(Long.valueOf(tenantCode));
|
||||
WxMaService wxService = WxMaConfiguration.getWxMaService();
|
||||
|
||||
if( wxService.checkSignature(timestamp,nonce,signature)){
|
||||
return echostr;
|
||||
}
|
||||
@@ -136,9 +135,11 @@ public class WechatController {
|
||||
* 微信支付/充值回调
|
||||
*/
|
||||
@AnonymousAccess
|
||||
@PostMapping("/wechat/notify")
|
||||
@PostMapping("/wechat/notify/{tenantCode}")
|
||||
@ApiOperation(value = "微信支付充值回调",notes = "微信支付充值回调")
|
||||
public String renotify(@RequestBody String xmlData) {
|
||||
public String renotify(@RequestBody String xmlData, @PathVariable String tenantCode) {
|
||||
log.info("tenantCode:{}",tenantCode);
|
||||
TenantContextHolder.setTenantId(Long.valueOf(tenantCode));
|
||||
try {
|
||||
WxPayService wxPayService = WxPayConfiguration.getPayService(PayMethodEnum.WECHAT);
|
||||
if(wxPayService == null) {
|
||||
@@ -174,6 +175,7 @@ public class WechatController {
|
||||
|
||||
return WxPayNotifyResponse.success("处理成功!");
|
||||
} catch (WxPayException e) {
|
||||
e.printStackTrace();
|
||||
log.error(e.getMessage());
|
||||
return WxPayNotifyResponse.fail(e.getMessage());
|
||||
}
|
||||
@@ -184,8 +186,10 @@ public class WechatController {
|
||||
* 微信退款回调
|
||||
*/
|
||||
@ApiOperation(value = "退款回调通知处理",notes = "退款回调通知处理")
|
||||
@PostMapping("/notify/refund")
|
||||
public String parseRefundNotifyResult(@RequestBody String xmlData) {
|
||||
@PostMapping("/notify/refund/{tenantCode}")
|
||||
public String parseRefundNotifyResult(@RequestBody String xmlData,@PathVariable String tenantCode) {
|
||||
log.info("tenantCode:{}",tenantCode);
|
||||
TenantContextHolder.setTenantId(Long.valueOf(tenantCode));
|
||||
try {
|
||||
WxPayService wxPayService = WxPayConfiguration.getPayService(PayMethodEnum.WECHAT);
|
||||
if(wxPayService == null) {
|
||||
@@ -225,13 +229,15 @@ public class WechatController {
|
||||
/**
|
||||
* 微信验证消息
|
||||
*/
|
||||
@GetMapping( value = "/wechat/serve",produces = "text/plain;charset=utf-8")
|
||||
@GetMapping( value = "/wechat/serve/{tenantCode}",produces = "text/plain;charset=utf-8")
|
||||
@ApiOperation(value = "微信验证消息",notes = "微信验证消息")
|
||||
public String authGet(@RequestParam(name = "signature", required = false) String signature,
|
||||
@RequestParam(name = "timestamp", required = false) String timestamp,
|
||||
@RequestParam(name = "nonce", required = false) String nonce,
|
||||
@RequestParam(name = "echostr", required = false) String echostr){
|
||||
|
||||
@RequestParam(name = "echostr", required = false) String echostr,
|
||||
@PathVariable String tenantCode
|
||||
){
|
||||
TenantContextHolder.setTenantId(Long.valueOf(tenantCode));
|
||||
final WxMpService wxService = WxMpConfiguration.getWxMpService();
|
||||
if (wxService == null) {
|
||||
throw new IllegalArgumentException("未找到对应配置的服务,请核实!");
|
||||
@@ -247,7 +253,7 @@ public class WechatController {
|
||||
/**
|
||||
*微信获取消息
|
||||
*/
|
||||
@PostMapping("/wechat/serve")
|
||||
@PostMapping("/wechat/serve/{tenantCode}")
|
||||
@ApiOperation(value = "微信获取消息",notes = "微信获取消息")
|
||||
public void post(@RequestBody String requestBody,
|
||||
@RequestParam("signature") String signature,
|
||||
@@ -256,11 +262,12 @@ public class WechatController {
|
||||
@RequestParam("openid") String openid,
|
||||
@RequestParam(name = "encrypt_type", required = false) String encType,
|
||||
@RequestParam(name = "msg_signature", required = false) String msgSignature,
|
||||
@PathVariable String tenantCode,
|
||||
HttpServletRequest request,
|
||||
HttpServletResponse response) throws IOException {
|
||||
|
||||
TenantContextHolder.setTenantId(Long.valueOf(tenantCode));
|
||||
WxMpService wxService = WxMpConfiguration.getWxMpService();
|
||||
|
||||
if (!wxService.checkSignature(timestamp, nonce, signature)) {
|
||||
throw new IllegalArgumentException("非法请求,可能属于伪造的请求!");
|
||||
}
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@
|
||||
package co.yixiang.app.modules.wechat.rest.controller;
|
||||
|
||||
import cn.binarywang.wx.miniapp.bean.live.WxMaLiveResult;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import co.yixiang.modules.mp.service.YxWechatLiveService;
|
||||
import co.yixiang.modules.mp.service.dto.YxWechatLiveQueryCriteria;
|
||||
import co.yixiang.modules.mp.vo.WechatLiveVo;
|
||||
|
||||
+4
-4
@@ -11,14 +11,14 @@ package co.yixiang.app.modules.wechat.rest.controller;
|
||||
import cn.binarywang.wx.miniapp.api.WxMaService;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import co.yixiang.api.ApiResult;
|
||||
import co.yixiang.api.YshopException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.ApiResult;
|
||||
import cn.iocoder.yudao.framework.common.exception.YshopException;
|
||||
import co.yixiang.app.common.bean.LocalUser;
|
||||
import co.yixiang.app.modules.wechat.rest.param.BindPhoneParam;
|
||||
import co.yixiang.app.modules.wechat.rest.param.WxPhoneParam;
|
||||
import co.yixiang.constant.ShopConstants;
|
||||
import co.yixiang.logging.aop.log.AppLog;
|
||||
import co.yixiang.app.common.interceptor.AuthCheck;
|
||||
import cn.iocoder.yudao.framework.security.core.annotations.AuthCheck;
|
||||
import co.yixiang.modules.user.domain.YxUser;
|
||||
import co.yixiang.modules.user.service.YxUserService;
|
||||
import co.yixiang.modules.mp.config.WxMaConfiguration;
|
||||
@@ -94,7 +94,7 @@ public class WxMaUserController {
|
||||
WxMaService wxMaService = WxMaConfiguration.getWxMaService();
|
||||
String phone = "";
|
||||
try {
|
||||
String sessionKey = redisUtils.get(ShopConstants.YSHOP_MINI_SESSION_KET+ user.getUid()).toString();
|
||||
String sessionKey = redisUtils.get(ShopConstants.ZSW_MINI_SESSION_KET + user.getUid()).toString();
|
||||
WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService()
|
||||
.getPhoneNoInfo(sessionKey, param.getEncryptedData(), param.getIv());
|
||||
phone = phoneNoInfo.getPhoneNumber();
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
package co.yixiang.config;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import org.springframework.cache.Cache;
|
||||
import org.springframework.cache.annotation.CachingConfigurerSupport;
|
||||
import org.springframework.cache.interceptor.CacheErrorHandler;
|
||||
import org.springframework.cache.interceptor.KeyGenerator;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
@Configuration
|
||||
public class CachingConfigurer extends CachingConfigurerSupport {
|
||||
|
||||
/**
|
||||
* 自定义缓存key生成策略,默认将使用该策略
|
||||
*/
|
||||
@Bean
|
||||
@Override
|
||||
public KeyGenerator keyGenerator() {
|
||||
return (target, method, params) -> {
|
||||
Long tenantId = TenantContextHolder.getTenantId();
|
||||
if (ObjectUtil.isNotEmpty(tenantId)){
|
||||
return tenantId;
|
||||
}
|
||||
Map<String,Object> container = new HashMap<>(3);
|
||||
Class<?> targetClassClass = target.getClass();
|
||||
// 类地址
|
||||
container.put("class",targetClassClass.toGenericString());
|
||||
// 方法名称
|
||||
container.put("methodName",method.getName());
|
||||
// 包名称
|
||||
container.put("package",targetClassClass.getPackage());
|
||||
// 参数列表
|
||||
for (int i = 0; i < params.length; i++) {
|
||||
container.put(String.valueOf(i),params[i]);
|
||||
}
|
||||
// 转为JSON字符串
|
||||
String jsonString = JSON.toJSONString(container);
|
||||
// 做SHA256 Hash计算,得到一个SHA256摘要作为Key
|
||||
return DigestUtils.sha256Hex(jsonString);
|
||||
};
|
||||
}
|
||||
|
||||
@Bean
|
||||
@Override
|
||||
public CacheErrorHandler errorHandler() {
|
||||
// 异常处理,当Redis发生异常时,打印日志,但是程序正常走
|
||||
log.info("初始化 -> [{}]", "Redis CacheErrorHandler");
|
||||
return new CacheErrorHandler() {
|
||||
@Override
|
||||
public void handleCacheGetError(RuntimeException e, Cache cache, Object key) {
|
||||
log.error("Redis occur handleCacheGetError:key -> [{}]", key, e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleCachePutError(RuntimeException e, Cache cache, Object key, Object value) {
|
||||
log.error("Redis occur handleCachePutError:key -> [{}];value -> [{}]", key, value, e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleCacheEvictError(RuntimeException e, Cache cache, Object key) {
|
||||
log.error("Redis occur handleCacheEvictError:key -> [{}]", key, e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleCacheClearError(RuntimeException e, Cache cache) {
|
||||
log.error("Redis occur handleCacheClearError:", e);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ package co.yixiang.config;
|
||||
|
||||
import co.yixiang.app.common.interceptor.PermissionInterceptor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
@@ -13,16 +14,16 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
@Slf4j
|
||||
public class MvcConfigure implements WebMvcConfigurer {
|
||||
|
||||
public HandlerInterceptor getPermissionInterceptor() {
|
||||
return new PermissionInterceptor();
|
||||
}
|
||||
@Autowired
|
||||
private PermissionInterceptor interceptor;
|
||||
|
||||
@Override
|
||||
public void addInterceptors(InterceptorRegistry registry) {
|
||||
registry.addInterceptor(this.getPermissionInterceptor())
|
||||
registry.addInterceptor(interceptor)
|
||||
.addPathPatterns("/bxgApp/**");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void configurePathMatch(PathMatchConfigurer configurer) {
|
||||
// 给电商的全部接口增加前缀
|
||||
@@ -31,4 +32,6 @@ public class MvcConfigure implements WebMvcConfigurer {
|
||||
configurer.addPathPrefix("/admin-api/bxg",aClass -> aClass.getPackage().getName().startsWith("co.yixiang"));
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user