Browse Source

网络教室单独起一个服务

zouxuan 2 years ago
parent
commit
d525a2a2b7

+ 0 - 1
cooleshow-im/.gitignore

@@ -1 +0,0 @@
-/bin/

+ 0 - 26
cooleshow-im/im-api/pom.xml

@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>com.yonge.cooleshow</groupId>
-    <artifactId>cooleshow-im</artifactId>
-    <version>1.0</version>
-  </parent>
-  <groupId>com.yonge.cooleshow</groupId>
-  <artifactId>im-api</artifactId>
-  <version>1.0</version>
-  <name>im-api</name>
-  <url>http://maven.apache.org</url>
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-  </properties>
-  <dependencies>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>3.8.1</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 22
cooleshow-im/im-server/pom.xml

@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<project
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>com.yonge.cooleshow</groupId>
-		<artifactId>cooleshow-im</artifactId>
-		<version>1.0</version>
-	</parent>
-	<groupId>com.yonge.cooleshow</groupId>
-	<artifactId>im-server</artifactId>
-	<version>1.0</version>
-	<name>im-server</name>
-	<url>http://maven.apache.org</url>
-	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-	</properties>
-	<dependencies>
-	</dependencies>
-
-</project>

+ 0 - 26
cooleshow-im/pom.xml

@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>com.yonge.cooleshow</groupId>
-		<artifactId>cooleshow</artifactId>
-		<version>1.0</version>
-	</parent>
-	<groupId>com.yonge.cooleshow</groupId>
-	<artifactId>cooleshow-im</artifactId>
-	<version>1.0</version>
-	<packaging>pom</packaging>
-
-	<name>cooleshow-im</name>
-	<url>http://maven.apache.org</url>
-	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-	</properties>
-	<dependencies>
-	</dependencies>
-	<modules>
-		<module>im-api</module>
-		<module>im-server</module>
-	</modules>
-</project>

+ 1 - 0
cooleshow-user/pom.xml

@@ -37,6 +37,7 @@
 	<modules>
 		<module>user-student</module>
 		<module>user-teacher</module>
+		<module>user-classroom</module>
 		<module>user-admin</module>
 		<module>user-biz</module>
 	</modules>

+ 80 - 0
cooleshow-user/user-classroom/pom.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>cooleshow</artifactId>
+        <groupId>com.yonge.cooleshow</groupId>
+        <version>1.0</version>
+    </parent>
+    <groupId>com.yonge.cooleshow</groupId>
+    <artifactId>user-classroom</artifactId>
+    <version>1.0</version>
+    <name>user-classroom</name>
+    <url>http://maven.apache.org</url>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-security</artifactId>
+        </dependency>
+
+        <!-- swagger-spring-boot -->
+        <dependency>
+            <groupId>com.spring4all</groupId>
+            <artifactId>swagger-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yonge.toolset</groupId>
+            <artifactId>audit-log</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yonge.toolset</groupId>
+            <artifactId>thirdparty-component</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yonge.cooleshow</groupId>
+            <artifactId>user-biz</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.whvcse</groupId>
+            <artifactId>easy-captcha</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security.oauth</groupId>
+            <artifactId>spring-security-oauth2</artifactId>
+            <version>2.3.3.RELEASE</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 28 - 0
cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/ClassroomApplication.java

@@ -0,0 +1,28 @@
+package com.yonge.cooleshow.classroom;
+
+import com.spring4all.swagger.EnableSwagger2Doc;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableFeignClients("com.yonge.cooleshow")
+@MapperScan(basePackages = {"com.yonge.cooleshow.biz.dal.dao", "com.yonge.toolset.payment.core.dao"})
+@ComponentScan(basePackages = {
+        "com.yonge.cooleshow.classroom", "com.yonge.cooleshow.auth", "com.yonge.cooleshow.biz",
+        "com.yonge.cooleshow.common", "com.yonge.cooleshow.common.security",
+        "com.yonge.toolset.log", "com.yonge.toolset.thirdparty", "com.yonge.toolset.payment"
+})
+@Configuration
+@EnableSwagger2Doc
+public class ClassroomApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ClassroomApplication.class, args);
+    }
+
+}

+ 43 - 0
cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/config/ResourceServerConfig.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.classroom.config;
+
+import com.yonge.cooleshow.common.security.BaseAccessDeniedHandler;
+import com.yonge.cooleshow.common.security.BaseAuthenticationEntryPoint;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
+import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
+
+@Configuration
+@EnableResourceServer
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
+
+	@Autowired
+	private BaseAccessDeniedHandler baseAccessDeniedHandler;
+
+	@Autowired
+	private BaseAuthenticationEntryPoint baseAuthenticationEntryPoint;
+
+	@Override
+	public void configure(HttpSecurity http) throws Exception {
+		http.csrf()
+				.disable()
+				.exceptionHandling()
+				.accessDeniedHandler(baseAccessDeniedHandler)
+				.authenticationEntryPoint(baseAuthenticationEntryPoint)
+				.and()
+				.authorizeRequests()
+				.antMatchers("/task/**").hasIpAddress("0.0.0.0/0")
+				.antMatchers("/v2/api-docs")
+                .permitAll().anyRequest().authenticated().and().httpBasic();
+	}
+
+	@Override
+	public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
+		resources.authenticationEntryPoint(baseAuthenticationEntryPoint).accessDeniedHandler(baseAccessDeniedHandler);
+	}
+
+}

+ 56 - 0
cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/config/WebMvcConfig.java

@@ -0,0 +1,56 @@
+package com.yonge.cooleshow.classroom.config;
+
+import com.yonge.cooleshow.classroom.interceptor.MDCInterceptor;
+import com.yonge.cooleshow.classroom.interceptor.OperationLogInterceptor;
+import com.yonge.cooleshow.biz.dal.config.LocalFastJsonHttpMessageConverter;
+import com.yonge.cooleshow.common.config.EnumConverterFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.format.FormatterRegistry;
+import org.springframework.http.MediaType;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+	@Autowired
+	private MDCInterceptor mdcInterceptor;
+
+	@Autowired
+	private OperationLogInterceptor operationLogInterceptor;
+
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+		List<String> includePathPatterns = new ArrayList<String>();
+		includePathPatterns.add("/**");
+		List<String> excludePathPatterns = new ArrayList<String>();
+		excludePathPatterns.add("/login");
+		registry.addInterceptor(mdcInterceptor).addPathPatterns(includePathPatterns).excludePathPatterns(excludePathPatterns);
+
+		registry.addInterceptor(operationLogInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
+	}
+
+	/**
+	 * 枚举类的转换器 addConverterFactory
+	 */
+	@Override
+	public void addFormatters(FormatterRegistry registry) {
+		registry.addConverterFactory(new EnumConverterFactory());
+	}
+	
+	@Bean
+    public HttpMessageConverters fastJsonHttpMessageConverters(){
+		LocalFastJsonHttpMessageConverter converter = new LocalFastJsonHttpMessageConverter();
+        List<MediaType> fastMediaTypes =  new ArrayList<MediaType>();
+        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
+        converter.setSupportedMediaTypes(fastMediaTypes);
+        return new HttpMessageConverters(converter);
+    }
+
+}

+ 166 - 0
cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/controller/ImNetworkRoomController.java

@@ -0,0 +1,166 @@
+package com.yonge.cooleshow.classroom.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.yonge.cooleshow.biz.dal.dto.*;
+import com.yonge.cooleshow.biz.dal.enums.UserRoleEnum;
+import com.yonge.cooleshow.biz.dal.service.ImNetworkRoomService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Optional;
+
+/**
+ * 网络教室房间(ImNetworkRoom)表控制层
+ *
+ * @author zx
+ * @since 2022-03-30 16:36:36
+ */
+@Api(tags = "网络教室房间")
+@RestController
+@RequestMapping("/imNetworkRoom")
+public class ImNetworkRoomController extends BaseController {
+
+    private final static Logger log = LoggerFactory.getLogger(ImNetworkRoomController.class);
+    /**
+     * 服务对象
+     */
+    @Resource
+    private ImNetworkRoomService imNetworkRoomService;
+
+    @ApiOperation("加入网络教室")
+    @PostMapping(value = "/join", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    @ApiImplicitParam(name = "roomId", dataType = "Long", value = "课程编号")
+    public HttpResponseResult<ImNetworkRoomResult> joinRoom(Long roomId) throws Exception {
+        roomId = Optional.ofNullable(roomId)
+                .orElseThrow(()->new BizException("房间号不可为空"));
+        return imNetworkRoomService.joinRoom(roomId, UserRoleEnum.TEACHER);
+    }
+
+//    @ApiOperation("加入网络教室状态回调")
+//    @PostMapping(value = "joinRoomSuccess", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+//    public HttpResponseResult joinRoomSuccess(Long courseScheduleId) throws Exception {
+//        imNetworkRoomService.joinRoomSuccess(courseScheduleId.toString(),UserRoleEnum.TEACHER);
+//        return succeed();
+//    }
+
+    @ApiOperation("加入网络教室状态回调")
+    @PostMapping(value = "joinRoomFailure", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult joinRoomFailure(Long roomId){
+        imNetworkRoomService.joinRoomFailure(roomId.toString());
+        return succeed();
+    }
+
+    @RequestMapping(value = "/statusSync")
+    public void statusSync(@RequestBody String body) throws Exception {
+        ImChannelStateNotify notify = JSONObject.parseObject(body, ImChannelStateNotify.class);
+        log.info("statusSyncParam: {}",JSONObject.toJSON(notify));
+        switch (notify.getEvent()) {
+            case 11:
+                //成员加入
+                imNetworkRoomService.joinRoomSuccess(notify.getChannelId(),Long.parseLong(notify.getUserId()));
+                break;
+            case 12:
+                //成员退出
+                imNetworkRoomService.leaveRoomSuccess(notify.getChannelId(),Long.parseLong(notify.getUserId()));
+                break;
+        }
+    }
+
+    @ApiOperation("退出网络教室")
+    @ApiImplicitParam(name = "roomId", dataType = "Long", value = "课程编号")
+    @PostMapping(value = "/leave", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult leaveRoom(Long roomId) throws Exception {
+        imNetworkRoomService.leaveRoom(roomId.toString(),UserRoleEnum.TEACHER);
+        return succeed();
+    }
+
+    @ApiOperation("控制学员节拍器")
+    @PostMapping(value = "/sendImPlayMidiMessage", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult sendImPlayMidiMessage(@RequestBody ImNetworkCustomMessage customMessage) throws Exception {
+        imNetworkRoomService.sendImPlayMidiMessage(customMessage);
+        return succeed();
+    }
+
+    @ApiOperation("移动端用来渲染页面")
+    @PostMapping(value = "/display", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult display(@RequestBody ImNetworkDisplayDataDto displayData) throws Exception {
+        imNetworkRoomService.display(displayData);
+        return succeed();
+    }
+
+    @ApiOperation(value = "批量控制学员设备开关")
+    @PostMapping(value = "/device/batchControl", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public Object batchControlDevice(@RequestBody ImNetworkDeviceControlDto deviceControl)throws Exception {
+        imNetworkRoomService.batchControlDevice(deviceControl);
+        return succeed();
+    }
+
+    @ApiOperation(value = "控制学员设备开关")
+    @PostMapping(value = "/device/control", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult controlDevice(@RequestBody ImNetworkDeviceControlDto deviceControl)
+            throws Exception {
+        imNetworkRoomService.controlDevice(deviceControl);
+        return succeed();
+    }
+
+    @ApiOperation(value = "学员同意打开,麦克风、摄像头")
+    @PostMapping(value = "/device/approve", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult approveControlDevice(@RequestBody ImNetworkDeviceControlDto deviceControl) throws Exception {
+        imNetworkRoomService.approveControlDevice(deviceControl);
+        return succeed();
+    }
+
+    @ApiOperation(value = "学员拒绝打开,麦克风、摄像头")
+    @PostMapping(value = "/device/reject", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult rejectControlDevice(@RequestBody ImNetworkDeviceControlDto deviceControl)
+            throws Exception {
+        imNetworkRoomService.rejectControlDevice(deviceControl);
+        return succeed();
+    }
+
+    @ApiOperation(value = "学员设备状态同步")
+    @PostMapping(value = "/device/sync", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public Object deviceStatusSync(@RequestBody ImNetworkDeviceControlDto deviceControl)
+            throws Exception {
+        imNetworkRoomService.deviceStatusSync(deviceControl);
+        return succeed();
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomId", dataType = "String", value = "房间号",required = true),
+            @ApiImplicitParam(name = "accompanimentId", dataType = "Long", value = "伴奏编号",required = true)
+    })
+    @ApiOperation(value = "老师在网络教室选择完伴奏后、通知学员下载伴奏")
+    @PostMapping(value = "pushDownloadMusicSheetMsg", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult pushDownloadMusicSheetMsg(String roomId,Long accompanimentId) throws Exception {
+        imNetworkRoomService.pushDownloadMusicSheetMsg(roomId,accompanimentId);
+        return succeed();
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomId", dataType = "String", value = "房间号",required = true),
+            @ApiImplicitParam(name = "accompanimentId", dataType = "Long", value = "伴奏编号",required = false),
+            @ApiImplicitParam(name = "status", dataType = "Integer", value = "伴奏下载状态(1下载成功0下载中2下载失败)",required = true)
+    })
+    @ApiOperation(value = "学员伴奏下载状态回调")
+    @PostMapping(value = "musicSheetDownNotify", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult adjustMusicScore(String roomId,Long accompanimentId,Integer status) throws Exception {
+        imNetworkRoomService.musicSheetDownNotify(roomId,accompanimentId,status);
+        return succeed();
+    }
+}
+

+ 29 - 0
cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/controller/ImNetworkRoomMemberController.java

@@ -0,0 +1,29 @@
+package com.yonge.cooleshow.classroom.controller;
+
+
+import com.yonge.cooleshow.biz.dal.service.ImNetworkRoomMemberService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * 网络教室成员(ImNetworkRoomMember)表控制层
+ *
+ * @author zx
+ * @since 2022-03-30 16:36:37
+ */
+@Api(tags = "网络教室成员")
+@RestController
+@RequestMapping("/imNetworkRoomMember")
+public class ImNetworkRoomMemberController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private ImNetworkRoomMemberService imNetworkRoomMemberService;
+
+}
+

+ 41 - 0
cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/interceptor/MDCInterceptor.java

@@ -0,0 +1,41 @@
+package com.yonge.cooleshow.classroom.interceptor;
+
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.toolset.utils.web.WebUtil;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Component
+public class MDCInterceptor extends HandlerInterceptorAdapter {
+
+	private static final String IP = "ip";
+
+	private static final String USERNAME = "username";
+	
+	@Autowired
+	@Lazy
+	private SysUserFeignService sysUserFeignService;
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser != null && sysUser.getId() != null) {
+			// 存储userId以及IP
+			MDC.put(USERNAME, sysUser.getUsername() + "@" + sysUser.getId());
+		}
+		MDC.put(IP, WebUtil.getRemoteIp(request));
+
+		return true;
+	}
+
+	@Override
+	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+	}
+}

+ 31 - 0
cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/interceptor/OperationLogInterceptor.java

@@ -0,0 +1,31 @@
+package com.yonge.cooleshow.classroom.interceptor;
+
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.toolset.log.interceptor.AuditLogInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class OperationLogInterceptor extends AuditLogInterceptor {
+
+	@Autowired
+	@Lazy
+	private SysUserFeignService sysUserFeignService;
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser != null && sysUser.getId() != null) {
+			setUsername(sysUser.getRealName(),sysUser.getId());
+		}
+		return true;
+	}
+
+}

+ 12 - 0
cooleshow-user/user-classroom/src/main/resources/bootstrap-prod.yml

@@ -0,0 +1,12 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        server-addr: 47.114.1.200:8848
+        namespace: 6f8374a9-598f-4889-bb17-476070ffb8de
+        group: DEFAULT_GROUP
+        prefix: classroom
+        file-extension: yaml
+        refresh:
+          enabled: true
+        enabled: true

+ 0 - 1
pom.xml

@@ -378,7 +378,6 @@
 		<module>cooleshow-gateway</module>
 		<module>cooleshow-user</module>
 		<module>toolset</module>
-		<module>cooleshow-im</module>
 	    <module>cooleshow-task</module>
 		<module>cooleshow-mall</module>
         <module>cooleshow-websocket</module>