Browse Source

Merge branch 'feature/1026-tenantalbum' into develop-new

# Conflicts:
#	cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
#	cooleshow-app/src/main/resources/logback-spring.xml
#	cooleshow-auth/auth-server/src/main/resources/logback-spring.xml
#	cooleshow-common/pom.xml
#	cooleshow-common/src/main/java/com/yonge/cooleshow/common/redis/config/RedisConfig.java
#	cooleshow-gateway/gateway-web/src/main/resources/logback-spring.xml
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
#	pom.xml
yuanliang 1 year ago
parent
commit
272c6b6b07
34 changed files with 466 additions and 81 deletions
  1. 8 2
      audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java
  2. 19 1
      audio-analysis/src/main/resources/logback-spring.xml
  3. 1 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  4. 12 13
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java
  5. 1 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/config/AppServerConfig.java
  6. 16 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantInfoController.java
  7. 52 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantStaffController.java
  8. 2 2
      cooleshow-app/src/main/resources/bootstrap-pre.yml
  9. 1 1
      cooleshow-app/src/main/resources/bootstrap-prod.yml
  10. 50 8
      cooleshow-app/src/main/resources/logback-spring.xml
  11. 6 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java
  12. 25 5
      cooleshow-auth/auth-server/src/main/resources/logback-spring.xml
  13. 16 3
      cooleshow-cms/src/main/resources/logback-spring.xml
  14. 11 10
      cooleshow-common/pom.xml
  15. 2 2
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/controller/BaseController.java
  16. 48 3
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/redis/config/RedisConfig.java
  17. 1 0
      cooleshow-gateway/gateway-web/src/main/java/com/yonge/gateway/web/config/SwaggerDocumentConfig.java
  18. 44 2
      cooleshow-gateway/gateway-web/src/main/resources/logback-spring.xml
  19. 16 3
      cooleshow-mall/mall-admin/src/main/resources/logback-spring.xml
  20. 5 0
      cooleshow-mall/mall-common/pom.xml
  21. 16 3
      cooleshow-mall/mall-portal/src/main/resources/logback-spring.xml
  22. 12 0
      cooleshow-task/src/main/resources/logback-spring.xml
  23. 10 11
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java
  24. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java
  25. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  26. 0 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  27. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  28. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantInfoServiceImpl.java
  29. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  30. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareWeekDataMapper.xml
  31. 15 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantInfoController.java
  32. 52 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantStaffController.java
  33. 1 1
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenTenantController.java
  34. 6 0
      pom.xml

+ 8 - 2
audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java

@@ -1,5 +1,7 @@
 package com.yonge.netty.server.service;
 
+import com.microsvc.toolkit.middleware.oss.OssPluginContext;
+import com.microsvc.toolkit.middleware.oss.impl.TencentOssPlugin;
 import io.netty.channel.Channel;
 
 import java.io.File;
@@ -65,6 +67,9 @@ public class AudioCompareHandler implements MessageHandler {
     @Autowired
     private StoragePluginContext storagePluginContext;
 
+    @Autowired
+    private OssPluginContext ossPluginContext;
+
 	/**
 	 * @describe 采样率
 	 */
@@ -93,7 +98,7 @@ public class AudioCompareHandler implements MessageHandler {
 
 	private AudioFloatConverter converter = AudioFloatConverter.getConverter(audioFormat);
 
-	private String tmpFileDir = "/mdata/soundCompare/";
+	private String tmpFileDir = "/mnt/datadisk/soundCompare/";
 
 	private SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmSS");
 	
@@ -203,7 +208,8 @@ public class AudioCompareHandler implements MessageHandler {
 		            String url = null;
 		            try {
 		                String folder = UploadUtil.getFileFloder();
-		                url = storagePluginContext.asyncUploadFile(KS3StoragePlugin.PLUGIN_NAME,"soundCompare/" + folder, waveFileProcessor.getFile(), true);
+//		                url = storagePluginContext.asyncUploadFile(TencentOssPlugin.PLUGIN_NAME,"soundCompare/" + folder, waveFileProcessor.getFile(), true);
+                        url = ossPluginContext.getPluginService(TencentOssPlugin.PLUGIN_NAME).asyncUploadFile("cloud-coach/" + folder, waveFileProcessor.getFile(), true);
 		            } catch (Exception e) {
 		                LOGGER.error("录音文件上传失败:{}", e);
 		            }

+ 19 - 1
audio-analysis/src/main/resources/logback-spring.xml

@@ -26,6 +26,16 @@
 			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
 		</encoder>
 	</appender>
+	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+		<appName>cooleshow-audio</appName>
+		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
+		<redisAuth>dyym</redisAuth>
+		<model>sentinel</model>
+		<masterName>mymaster</masterName>
+		<env>prod</env>
+		<redisDb>10</redisDb>
+		<runModel>2</runModel>
+	</appender>
 
 	<logger name="com.yonge" level="info" />
 
@@ -53,10 +63,18 @@
 	</springProfile>
 
 	<!--生产环境:输出到文件 -->
+	<springProfile name="pre">
+		<root level="WARN">
+<!--			<appender-ref ref="stdout" />-->
+			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
+		</root>
+	</springProfile>
 	<springProfile name="prod">
 		<root level="WARN">
-			<appender-ref ref="stdout" />
+<!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 

+ 1 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java

@@ -202,4 +202,5 @@ public interface AdminFeignService {
     @GetMapping("/task/sendTenantAlbumMessage")
     HttpResponseResult<Object> sendTenantAlbumMessage();
 
+
 }

+ 12 - 13
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java

@@ -199,9 +199,10 @@ public class TenantAlbumController {
     @PreAuthorize("@pcs.hasPermissions('tenantAlbum/save')")
     public HttpResponseResult<Boolean> save(@Validated @RequestBody TenantAlbumVo.TenantAlbum album) {
         //判断当前机构是否已经绑定机构专辑
-        Long tenantId = album.getTenantId();
-        List<TenantAlbumMusic> list = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getTenantId, tenantId).list();
-        if (CollectionUtils.isNotEmpty(list)){
+        List<TenantAlbumRef> list = tenantAlbumRefService.lambdaQuery()
+                .eq(TenantAlbumRef::getTenantId, album.getTenantId())
+                .list();
+        if (CollectionUtils.isNotEmpty(list)) {
             throw new BizException("当前机构已有专辑");
         }
 
@@ -227,11 +228,11 @@ public class TenantAlbumController {
                         tenantAlbumSheet.setLevel(m.getLevel());
                         tenantAlbumSheet.setType(m.getType());
                         tenantAlbumSheet.setId(m.getId().toString());
-                       return tenantAlbumSheet;
+                        return tenantAlbumSheet;
                     }).collect(Collectors.toList()));
                     sheetData.setSubjectType(next.getSubjectType());
                     return sheetData;
-        }
+                }
         ).collect(Collectors.toList());
         tenantAlbumService.insertTenantAlbum(album.getTenantId(), tenantAlbum, musicSheetDataList);
         return HttpResponseResult.succeed();
@@ -243,14 +244,12 @@ public class TenantAlbumController {
     public HttpResponseResult<Boolean> update( @RequestBody TenantAlbumVo.TenantAlbum album) {
 
         //判断当前机构是否已经绑定机构专辑
-        Long tenantId = album.getTenantId();
-        List<TenantAlbumMusic> list = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getTenantId, tenantId).list();
-        if (CollectionUtils.isNotEmpty(list)){
-            list.stream().forEach(i->{
-                if (!i.getTenantAlbumId().equals(album.getId())){
-                    throw new BizException("当前机构已有专辑");
-                }
-            });
+        List<TenantAlbumRef> list = tenantAlbumRefService.lambdaQuery()
+                .eq(TenantAlbumRef::getTenantId, album.getTenantId())
+                .ne(TenantAlbumRef::getTenantAlbumId, album.getId())
+                .list();
+        if (CollectionUtils.isNotEmpty(list)) {
+            throw new BizException("当前机构已有专辑");
         }
 
         // 检查曲目重复

+ 1 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/config/AppServerConfig.java

@@ -25,7 +25,7 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 @EnableDiscoveryClient
 @EnableFeignClients("com.yonge.cooleshow")
 @MapperScan(basePackages = {"com.yonge.cooleshow.biz.dal.dao", "com.yonge.cooleshow.biz.dal.mapper", "com.yonge.toolset.payment.core.dao"})
-@ComponentScan(basePackages = {"com.yonge.cooleshow", "com.yonge.toolset", "com.yonge.cooleshow.auth.config"})
+@ComponentScan(basePackages = {"com.yonge.cooleshow", "com.yonge.toolset", "com.yonge.cooleshow.auth.config","com.yonge.redisson"})
 @Configuration
 public class AppServerConfig {
 

+ 16 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantInfoController.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.tenant.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
@@ -107,7 +108,7 @@ public class TenantInfoController extends BaseController {
     public HttpResponseResult<Boolean> updateTenantInfo(@Valid @RequestBody TenantInfoVo.TenantInfo info) {
 
         TenantInfo tenantInfo = JSON.parseObject(info.jsonString(), TenantInfo.class);
-            tenantInfoService.updateById(tenantInfo);
+        tenantInfoService.updateById(tenantInfo);
 
         return  HttpResponseResult.succeed(true);
 
@@ -308,6 +309,20 @@ public class TenantInfoController extends BaseController {
 
         }
 
+        // 修改了手机号码,清理token和WXOpenId
+        if (StringUtils.isNotEmpty(sysUser.getPhone()) && !user.getPhone().equals(sysUser.getPhone())) {
+            // 清除登录token信息
+            TenantStaff tenantStaff = tenantStaffService.getByUserId(user.getId());
+            if (tenantStaff != null) {
+                sysUserFeignService.exitByPhoneAndOpenId(ClientEnum.ORGANIZATION.getCode().toLowerCase(),
+                        user.getPhone(), tenantStaff.getWxOpenid());
+            }
+            // 清除WXOpenId
+            tenantStaffService.update(null, Wrappers.<TenantStaff>lambdaUpdate()
+                    .set(TenantStaff::getWxOpenid, null)
+                    .eq(TenantStaff::getUserId, user.getId()));
+        }
+
         return HttpResponseResult.succeed(true);
     }
 }

+ 52 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantStaffController.java

@@ -0,0 +1,52 @@
+package com.yonge.cooleshow.tenant.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.microsvc.toolkit.common.response.template.R;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+
+@RestController
+@RequestMapping("${app-config.url.tenant:}/tenantStaff")
+@Api(value = "机构员工表", tags = "机构员工信息")
+public class TenantStaffController extends BaseController {
+
+    @Resource
+    SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TenantStaffService tenantStaffService;
+
+    @PostMapping("/logout")
+    @ApiOperation(value = "退出登录", notes = "传入TenantInfo")
+    public R<JSONObject> logout() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return R.defaultR();
+        }
+        // 清理token和WXOpenId
+        TenantStaff tenantStaff = tenantStaffService.getByUserId(sysUser.getId());
+        if (tenantStaff != null) {
+            sysUserFeignService.exitByPhoneAndOpenId(ClientEnum.ORGANIZATION.getCode().toLowerCase(),
+                    sysUser.getPhone(), tenantStaff.getWxOpenid());
+            // 清除WXOpenId
+            tenantStaffService.update(null, Wrappers.<TenantStaff>lambdaUpdate()
+                    .set(TenantStaff::getWxOpenid, null)
+                    .eq(TenantStaff::getUserId, sysUser.getId()));
+        }
+        return R.defaultR();
+    }
+}

+ 2 - 2
cooleshow-app/src/main/resources/bootstrap-pre.yml

@@ -2,8 +2,8 @@ spring:
   cloud:
     nacos:
       config:
-        server-addr: 121.41.82.151:8848
-        namespace: ef2e98b4-c2d5-48e8-955c-0b2f2e33a8c0
+        server-addr: 10.206.0.16:8848
+        namespace: e456599c-bef6-453d-927f-0e4a321259ed
         group: DEFAULT_GROUP
         prefix: app
         file-extension: yaml

+ 1 - 1
cooleshow-app/src/main/resources/bootstrap-prod.yml

@@ -3,7 +3,7 @@ spring:
     nacos:
       config:
         server-addr: 10.206.0.16:8848
-        namespace: e456599c-bef6-453d-927f-0e4a321259ed
+        namespace: dba505ee-020c-4c2b-bab2-e91d89cf248e
         group: DEFAULT_GROUP
         prefix: app
         file-extension: yaml

+ 50 - 8
cooleshow-app/src/main/resources/logback-spring.xml

@@ -11,8 +11,7 @@
 		</encoder>
 	</appender>
 
-	<appender name="file"
-		class="ch.qos.logback.core.rolling.RollingFileAppender">
+	<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
 			<FileNamePattern>${LOG_HOME}</FileNamePattern>
 			<MaxHistory>90</MaxHistory>
@@ -21,16 +20,59 @@
 				<MaxFileSize>20MB</MaxFileSize>
 			</TimeBasedFileNamingAndTriggeringPolicy>
 		</rollingPolicy>
-
 		<encoder>
 			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
 		</encoder>
 	</appender>
+	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+		<appName>cooleshow-app</appName>
+		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
+		<redisAuth>dyym</redisAuth>
+		<model>sentinel</model>
+		<masterName>mymaster</masterName>
+		<env>prod</env>
+		<redisDb>10</redisDb>
+		<runModel>2</runModel>
+	</appender>
+	<logger name="com.yonge" level="DEBUG" />
+
+	<!--本地环境:打印控制台 -->
+	<springProfile name="local">
+		<root level="INFO">
+<!--			<appender-ref ref="stdout" />-->
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+	<!--开发环境:打印控制台 -->
+	<springProfile name="dev">
+		<root level="INFO">
+<!--			<appender-ref ref="stdout" />-->
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
+	<springProfile name="test">
+		<root level="INFO">
+<!--			<appender-ref ref="stdout" />-->
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
+	<springProfile name="pre">
+		<root level="INFO">
+<!--			<appender-ref ref="stdout" />-->
+			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
+		</root>
+	</springProfile>
 
-	<logger name="com.yonge" level="INFO" />
-	<root level="INFO">
-		<appender-ref ref="stdout" />
-		<appender-ref ref="file" />
-	</root>
+	<!--生产环境:输出到文件 -->
+	<springProfile name="prod">
+		<root level="INFO">
+<!--			<appender-ref ref="stdout" />-->
+			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
+		</root>
+	</springProfile>
 
 </configuration>

+ 6 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java

@@ -205,6 +205,12 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
                     throw new LockedException("用户不存在");
                 }
 
+                // 同账号,用户信息存在的情况
+                if (!user.getUserType().contains(clientId.toUpperCase())) {
+                    // 自动添加系统默认IM帐号为好友,并自动发送通知消息
+                    sysUserService.sendSysCustomerServiceFriendMessage(userInfo.getSysUser(), clientId.toUpperCase());
+                }
+
                 user.setUpdateTime(new Date());
                 if(StringUtils.isNotEmpty(loginUserType)){
                     if (StringUtils.equalsIgnoreCase(loginUserType, "TEACHER")) {

+ 25 - 5
cooleshow-auth/auth-server/src/main/resources/logback-spring.xml

@@ -26,11 +26,31 @@
 			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
 		</encoder>
 	</appender>
+	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+		<appName>cooleshow-auth</appName>
+		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
+		<redisAuth>dyym</redisAuth>
+		<model>sentinel</model>
+		<masterName>mymaster</masterName>
+		<env>prod</env>
+		<redisDb>10</redisDb>
+		<runModel>2</runModel>
+	</appender>
 
-	<logger name="com.yonge" level="INFO" />
-	<root level="INFO">
-		<appender-ref ref="stdout" />
-		<appender-ref ref="file" />
-	</root>
+	<logger name="com.yonge" level="DEBUG" />
+	<springProfile name="pre">
+		<root level="WARN">
+<!--			<appender-ref ref="stdout" />-->
+			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
+		</root>
+	</springProfile>
+	<springProfile name="prod">
+		<root level="WARN">
+<!--			<appender-ref ref="stdout" />-->
+			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
+		</root>
+	</springProfile>
 
 </configuration>

+ 16 - 3
cooleshow-cms/src/main/resources/logback-spring.xml

@@ -27,6 +27,17 @@
 		</encoder>
 	</appender>
 
+	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+		<appName>cooleshow-cms</appName>
+		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
+		<redisAuth>dyym</redisAuth>
+		<model>sentinel</model>
+		<masterName>mymaster</masterName>
+		<env>prod</env>
+		<redisDb>10</redisDb>
+		<runModel>2</runModel>
+	</appender>
+
 	<logger name="com.yonge" level="INFO" />
 
 	<!--本地环境:打印控制台 -->
@@ -52,17 +63,19 @@
 	</springProfile>
 
 	<springProfile name="pre">
-		<root level="INFO">
-			<appender-ref ref="stdout" />
+		<root level="WARN">
+<!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 
 	<!--生产环境:输出到文件 -->
 	<springProfile name="prod">
 		<root level="WARN">
-			<appender-ref ref="stdout" />
+<!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 

+ 11 - 10
cooleshow-common/pom.xml

@@ -21,25 +21,26 @@
 
 	<dependencies>
 		<dependency>
+			<groupId>com.plumelog</groupId>
+			<artifactId>plumelog-logback</artifactId>
+			<version>3.5.3</version>
+		</dependency>
+		<dependency>
 			<groupId>com.yonge.toolset</groupId>
 			<artifactId>toolset-base</artifactId>
 			<version>1.0</version>
 		</dependency>
-		<!-- redisson -->
+		<dependency>
+			<groupId>com.yonge.toolset</groupId>
+			<artifactId>utils</artifactId>
+		</dependency>
+
 		<dependency>
 			<groupId>org.redisson</groupId>
 			<artifactId>redisson-spring-boot-starter</artifactId>
 			<version>${redisson.version}</version>
 		</dependency>
-		<dependency>
-			<groupId>com.yonge.toolset</groupId>
-			<artifactId>utils</artifactId>
-		</dependency>
-		<!-- Redis缓存整合开始 -->
-		<!--<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-data-redis</artifactId>
-		</dependency>-->
+
 		<dependency>
 			<groupId>redis.clients</groupId>
 			<artifactId>jedis</artifactId>

+ 2 - 2
cooleshow-common/src/main/java/com/yonge/cooleshow/common/controller/BaseController.java

@@ -154,13 +154,13 @@ public class BaseController {
 
     public String dingTalkRobotsSecurityParam() throws Exception {
         Long timestamp = System.currentTimeMillis();
-        String secret = "SEC06c8de454d4cbe6b67140e984d0319836b239d2cb211a2c771cdedd57e286a24";
+        String secret = "SEC7371152e58a066b358afd9e9cfaad2aee4b46471218f1aeef88d43a401d8e2f2";
         String stringToSign = timestamp + "\n" + secret;
         Mac mac = Mac.getInstance("HmacSHA256");
         mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
         byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
         String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
-        StringBuffer sb = new StringBuffer("https://oapi.dingtalk.com/robot/send?access_token=7cc2fe3178ce2432d9fef9316c9b21ff7ae9283af2d3a5acc2d5a8cf29f19fe6&timestamp=");
+        StringBuffer sb = new StringBuffer("https://oapi.dingtalk.com/robot/send?access_token=324dc48b8af4fc21223a5b8fd5d8daa611e106f2711d91abe1d73bce8c5c86b2&timestamp=");
         sb.append(timestamp).append("&sign=").append(sign);
         return sb.toString();
     }

+ 48 - 3
cooleshow-common/src/main/java/com/yonge/cooleshow/common/redis/config/RedisConfig.java

@@ -1,25 +1,70 @@
 package com.yonge.cooleshow.common.redis.config;
 
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.connection.RedisPassword;
+import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
+import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
 import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
 import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
 
+import java.io.Serializable;
+
 @Configuration
 public class RedisConfig {
 
+	/*@Value("${spring.redis.host}")
+	private String host;
+	
+	@Value("${spring.redis.port}")
+	private int port;
+	
+	@Value("${spring.redis.password}")
+	private String password;
+	
+	@Value("${spring.redis.database}")
+	private int database;
+
+	@Bean
+	public JedisConnectionFactory jedisConnectionFactory() {
+		RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
+		config.setHostName(host);
+		config.setPort(port);
+		if (StringUtils.isNotBlank(password)) {
+			config.setPassword(RedisPassword.of(password));
+		}
+		config.setDatabase(database);
+
+		JedisConnectionFactory factory = new JedisConnectionFactory(config);
+		return factory;
+	}
+
+	@Bean
+	public RedisTemplate<String, Serializable> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
+		RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
+
+		StringRedisSerializer stringSerializer = new StringRedisSerializer();
+
+		redisTemplate.setKeySerializer(stringSerializer);
+		redisTemplate.setHashKeySerializer(stringSerializer);
+		redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
+		redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
+		redisTemplate.setConnectionFactory(jedisConnectionFactory);
+		return redisTemplate;
+	}*/
+
 	@Bean
 	public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
 		// 定义redis模板
 		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
 		redisTemplate.setConnectionFactory(redisConnectionFactory);
 
-		// 设置序列化器
+		// 创建序列号对象
 		StringRedisSerializer stringSerializer = new StringRedisSerializer();
-
 		redisTemplate.setKeySerializer(stringSerializer);
 		redisTemplate.setHashKeySerializer(stringSerializer);
 		redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());

+ 1 - 0
cooleshow-gateway/gateway-web/src/main/java/com/yonge/gateway/web/config/SwaggerDocumentConfig.java

@@ -29,6 +29,7 @@ public class SwaggerDocumentConfig implements SwaggerResourcesProvider {
 		resources.add(swaggerResource("MALL_PORTAL服务", "/mall-portal-server/v2/api-docs", "2.0"));
 		resources.add(swaggerResource("网络教室", "/classroom-server/v2/api-docs", "2.0"));
 		resources.add(swaggerResource("TENANT服务", "/tenant-server/v2/api-docs", "2.0"));
+		resources.add(swaggerResource("App服务", "/app-server/v2/api-docs", "2.0"));
 		return resources;
 	}
 

+ 44 - 2
cooleshow-gateway/gateway-web/src/main/resources/logback-spring.xml

@@ -27,14 +27,56 @@
 		</encoder>
 	</appender>
 
+	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+		<appName>cooleshow-gateway</appName>
+		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
+		<redisAuth>dyym</redisAuth>
+		<model>sentinel</model>
+		<masterName>mymaster</masterName>
+		<env>prod</env>
+		<redisDb>10</redisDb>
+		<runModel>2</runModel>
+	</appender>
+
 	<logger name="com.yonge" level="INFO" />
 
-	<!--生产环境:输出到文件 -->
-	<springProfile name="prod">
+	<!--本地环境:打印控制台 -->
+	<springProfile name="local">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+	<!--开发环境:打印控制台 -->
+	<springProfile name="dev">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+	
+	<springProfile name="test">
 		<root level="INFO">
 			<appender-ref ref="stdout" />
 			<appender-ref ref="file" />
 		</root>
 	</springProfile>
 
+	<springProfile name="pre">
+		<root level="WARN">
+<!--			<appender-ref ref="stdout" />-->
+			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
+		</root>
+	</springProfile>
+
+	<!--生产环境:输出到文件 -->
+	<springProfile name="prod">
+		<root level="WARN">
+<!--			<appender-ref ref="stdout" />-->
+			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
+		</root>
+	</springProfile>
+
 </configuration>

+ 16 - 3
cooleshow-mall/mall-admin/src/main/resources/logback-spring.xml

@@ -27,6 +27,17 @@
 		</encoder>
 	</appender>
 
+	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+		<appName>cooleshow-mall-admin</appName>
+		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
+		<redisAuth>dyym</redisAuth>
+		<model>sentinel</model>
+		<masterName>mymaster</masterName>
+		<env>prod</env>
+		<redisDb>10</redisDb>
+		<runModel>2</runModel>
+	</appender>
+
 	<logger name="com.yonge" level="info" />
 
 	<!--本地环境:打印控制台 -->
@@ -52,17 +63,19 @@
 	</springProfile>
 
 	<springProfile name="pre">
-		<root level="INFO">
-			<appender-ref ref="stdout" />
+		<root level="WARN">
+<!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 
 	<!--生产环境:输出到文件 -->
 	<springProfile name="prod">
 		<root level="WARN">
-			<appender-ref ref="stdout" />
+<!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 

+ 5 - 0
cooleshow-mall/mall-common/pom.xml

@@ -18,6 +18,11 @@
     </parent>
 
     <dependencies>
+        <dependency>
+            <groupId>com.plumelog</groupId>
+            <artifactId>plumelog-logback</artifactId>
+            <version>3.5.3</version>
+        </dependency>
 
         <dependency>
             <groupId>com.yonge.cooleshow</groupId>

+ 16 - 3
cooleshow-mall/mall-portal/src/main/resources/logback-spring.xml

@@ -27,6 +27,17 @@
 		</encoder>
 	</appender>
 
+	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+		<appName>cooleshow-mall-portal</appName>
+		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
+		<redisAuth>dyym</redisAuth>
+		<model>sentinel</model>
+		<masterName>mymaster</masterName>
+		<env>prod</env>
+		<redisDb>10</redisDb>
+		<runModel>2</runModel>
+	</appender>
+
 	<logger name="com.yonge" level="info" />
 
 	<!--本地环境:打印控制台 -->
@@ -52,17 +63,19 @@
 	</springProfile>
 
 	<springProfile name="pre">
-		<root level="INFO">
-			<appender-ref ref="stdout" />
+		<root level="WARN">
+<!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 
 	<!--生产环境:输出到文件 -->
 	<springProfile name="prod">
 		<root level="WARN">
-			<appender-ref ref="stdout" />
+<!--			<appender-ref ref="stdout" />-->
 			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 

+ 12 - 0
cooleshow-task/src/main/resources/logback-spring.xml

@@ -27,6 +27,17 @@
 		</encoder>
 	</appender>
 
+	<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
+		<appName>cooleshow-task</appName>
+		<redisHost>10.206.0.13:26379,10.206.0.16:26379,10.206.0.8:26379</redisHost>
+		<redisAuth>dyym</redisAuth>
+		<model>sentinel</model>
+		<masterName>mymaster</masterName>
+		<env>prod</env>
+		<redisDb>10</redisDb>
+		<runModel>2</runModel>
+	</appender>
+
 	<logger name="com.yonge" level="info" />
 
 	<!--本地环境:打印控制台 -->
@@ -56,6 +67,7 @@
 		<root level="WARN">
 			<appender-ref ref="stdout" />
 			<appender-ref ref="file" />
+			<appender-ref ref="plumelog" />
 		</root>
 	</springProfile>
 

+ 10 - 11
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java

@@ -186,9 +186,10 @@ public class TenantAlbumController {
     @PreAuthorize("@pcs.hasPermissions('tenantAlbum/save')")
     public HttpResponseResult<Boolean> save(@Validated @RequestBody TenantAlbumVo.TenantAlbum album) {
         //判断当前机构是否已经绑定机构专辑
-        Long tenantId = album.getTenantId();
-        List<TenantAlbumMusic> list = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getTenantId, tenantId).list();
-        if (CollectionUtils.isNotEmpty(list)){
+        List<TenantAlbumRef> list = tenantAlbumRefService.lambdaQuery()
+                .eq(TenantAlbumRef::getTenantId, album.getTenantId())
+                .list();
+        if (CollectionUtils.isNotEmpty(list)) {
             throw new BizException("当前机构已有专辑");
         }
 
@@ -230,14 +231,12 @@ public class TenantAlbumController {
     public HttpResponseResult<Boolean> update( @RequestBody TenantAlbumVo.TenantAlbum album) {
 
         //判断当前机构是否已经绑定机构专辑
-        Long tenantId = album.getTenantId();
-        List<TenantAlbumMusic> list = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getTenantId, tenantId).list();
-        if (CollectionUtils.isNotEmpty(list)){
-            list.stream().forEach(i->{
-                if (!i.getTenantAlbumId().equals(album.getId())){
-                    throw new BizException("当前机构已有专辑");
-                }
-            });
+        List<TenantAlbumRef> list = tenantAlbumRefService.lambdaQuery()
+                .eq(TenantAlbumRef::getTenantId, album.getTenantId())
+                .ne(TenantAlbumRef::getTenantAlbumId, album.getId())
+                .list();
+        if (CollectionUtils.isNotEmpty(list)) {
+            throw new BizException("当前机构已有专辑");
         }
 
         // 检查曲目重复

+ 7 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java

@@ -239,6 +239,13 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
     @Override
     public Integer registerUserBindCustomerService(Long userId, List<Long> friendIds, ClientEnum clientType) {
 
+        SysUser sysUser = sysUserMapper.getByUserId(userId);
+        try {
+            imGroupService.register(sysUser.getId().toString(), clientType, sysUser.getUsername(), sysUser.getAvatar());
+            log.info("注册用户成功:" + userId);
+        } catch (Exception e) {
+            log.error("注册用户失败:" + userId + ",type:" + clientType);
+        }
         // 添加新用户好友,客服默认为老师身份
         for (Long teacherId : friendIds) {
             if (ClientEnum.STUDENT == clientType) {

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java

@@ -1304,7 +1304,8 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
 
             LivePluginService pluginService = livePluginContext.getPluginService(liveRoom.getServiceProvider());
             pluginService.sendChatRoomMessage(build);
-            log.info("sendLiveRoomMessage>>>> looker {} : roomId={}, userId={}",message.getObjectName(), message.getToChatroomId(), message.getFromUserId());
+            log.info("sendLiveRoomMessage>>>> looker {} : roomId={}, userId={}, content={}",message.getObjectName(), message.getToChatroomId(),
+                message.getFromUserId(), messageContent);
         } catch (Exception e) {
             log.error("sendLiveRoomMessage>>>>  looker error {} {}", message.getObjectName(),e.getMessage());
             log.error("sendLiveRoomMessage>>>>  looker error sendMessage {} : {} : : roomId={}, userId={}",message.getObjectName(), message, message.getToChatroomId(), message.getFromUserId());

+ 0 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java

@@ -31,7 +31,6 @@ import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
-import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
@@ -683,12 +682,6 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             sendStudentTenantChange(student,newTenantId);
         }
 
-        // 加入机构小组群
-//        if (studentInfo.getTenantGroupId() != -1L && !studentInfo.getTenantGroupId().equals(student.getTenantGroupId())) {
-//            quitFromTenantGroupIM(student.getTenantGroupId(), student.getUserId());
-//            add2TenantGroupIM(studentInfo.getTenantGroupId(), studentInfo.getId());
-//        }
-
 
         // 手机号码修改
         boolean updatePhone = false;

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java

@@ -110,6 +110,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantInfoServiceImpl.java

@@ -436,6 +436,10 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
             if(tenantStaff != null){
                 sysUserFeignService.exitByPhoneAndOpenId(ClientEnum.ORGANIZATION.getCode().toLowerCase(),
                         oldTenantInfo.getPhone(),tenantStaff.getWxOpenid());
+                // 清除WXOpenId
+                tenantStaffMapper.update(null, Wrappers.<TenantStaff>lambdaUpdate()
+                        .set(TenantStaff::getWxOpenid, null)
+                        .eq(TenantStaff::getUserId, sysUser.getId()));
             }
         }
         tenantInfoMapper.update(null, Wrappers.<TenantInfo>lambdaUpdate()

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java

@@ -1194,6 +1194,9 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                             }
 
                         }
+                        if (EPaymentStatus.WAIT_PAY == paymentStatus) {
+                            return;
+                        }
 
                         // 支付时间未超时,同步订单状态
                         if (EPaymentStatus.PAYING == paymentStatus

+ 1 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareWeekDataMapper.xml

@@ -126,7 +126,7 @@
 			</if>
 		</if>
 		WHERE smcwd.monday_ = #{monday}
-			AND stu.user_id_ = smcwd.user_id_ and smcwd.tenant_id_ = #{tenantId}
+			AND stu.user_id_ = smcwd.user_id_ and stu.tenant_id_ = #{tenantId}
 			<if test="orderType==1">
 				<if test="heardLevel==null">
 					AND smcwd.advanced_max_score_ > 0

+ 15 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantInfoController.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.tenant.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
@@ -308,6 +309,20 @@ public class TenantInfoController extends BaseController {
 
         }
 
+        // 修改了手机号码,清理token和WXOpenId
+        if (StringUtils.isNotEmpty(sysUser.getPhone()) && !user.getPhone().equals(sysUser.getPhone())) {
+            // 清除登录token信息
+            TenantStaff tenantStaff = tenantStaffService.getByUserId(user.getId());
+            if (tenantStaff != null) {
+                sysUserFeignService.exitByPhoneAndOpenId(ClientEnum.ORGANIZATION.getCode().toLowerCase(),
+                        user.getPhone(), tenantStaff.getWxOpenid());
+            }
+            // 清除WXOpenId
+            tenantStaffService.update(null, Wrappers.<TenantStaff>lambdaUpdate()
+                    .set(TenantStaff::getWxOpenid, null)
+                    .eq(TenantStaff::getUserId, user.getId()));
+        }
+
         return HttpResponseResult.succeed(true);
     }
 }

+ 52 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantStaffController.java

@@ -0,0 +1,52 @@
+package com.yonge.cooleshow.tenant.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.microsvc.toolkit.common.response.template.R;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+
+@RestController
+@RequestMapping("/tenantStaff")
+@Api(value = "机构员工表", tags = "机构员工信息")
+public class TenantStaffController extends BaseController {
+
+    @Resource
+    SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TenantStaffService tenantStaffService;
+
+    @PostMapping("/logout")
+    @ApiOperation(value = "退出登录", notes = "传入TenantInfo")
+    public R<JSONObject> logout() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return R.defaultR();
+        }
+        // 清理token和WXOpenId
+        TenantStaff tenantStaff = tenantStaffService.getByUserId(sysUser.getId());
+        if (tenantStaff != null) {
+            sysUserFeignService.exitByPhoneAndOpenId(ClientEnum.ORGANIZATION.getCode().toLowerCase(),
+                    sysUser.getPhone(), tenantStaff.getWxOpenid());
+            // 清除WXOpenId
+            tenantStaffService.update(null, Wrappers.<TenantStaff>lambdaUpdate()
+                    .set(TenantStaff::getWxOpenid, null)
+                    .eq(TenantStaff::getUserId, sysUser.getId()));
+        }
+        return R.defaultR();
+    }
+}

+ 1 - 1
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenTenantController.java

@@ -127,7 +127,7 @@ public class OpenTenantController {
         } else {
             // 判断当前账号是否已绑定
             if (StringUtils.isNotBlank(tenantStaff.getWxOpenid()) && !openId.equals(tenantStaff.getWxOpenid())) {
-                throw new BizException("请登录您所绑定的机构");
+                throw new BizException("您登录的机构账号与绑定微信不匹配");
             }
         }
 

+ 6 - 0
pom.xml

@@ -235,6 +235,12 @@
                 <version>1.3.70</version>
             </dependency>
 
+			<dependency>
+				<groupId>com.alibaba</groupId>
+				<artifactId>fastjson</artifactId>
+				<version>1.2.79</version>
+			</dependency>
+
 			<!-- redisson -->
 			<dependency>
 				<groupId>org.redisson</groupId>