Compare commits

..

66 Commits

Author SHA1 Message Date
hui
f0c292cabd linshi 2025-01-07 11:35:53 +08:00
hui
ab38597570 linshi 2025-01-07 11:08:44 +08:00
joshen
a205effce1 Merge remote-tracking branch 'yx/20241118-upframework' into dev250106
# Conflicts:
#	modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/ElasticsearchConfig.java
#	servers/boe-server-all/pom.xml
#	servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java
#	servers/boe-server-all/src/main/resources/application-pro.properties
#	servers/boe-server-all/src/main/resources/application-test.properties
#	servers/boe-server-all/src/main/resources/application.properties
2025-01-06 13:53:58 +08:00
yang
5698a3ea58 es数据同步 2024-12-19 16:40:24 +08:00
yang
0804c47d22 Merge branch 'refs/heads/zxwy-esSync' into dev1107 2024-12-18 15:26:47 +08:00
yang
aab50a0ff0 es数据同步 2024-12-18 15:26:17 +08:00
yang
c95e0faf63 Merge branch 'refs/heads/zxwy-esSync' into dev1107 2024-12-18 13:39:57 +08:00
yang
9866618110 es数据同步 2024-12-18 13:39:21 +08:00
yang
d6744bb990 Merge branch 'refs/heads/zxwy-esSync' into dev1107 2024-12-18 13:20:53 +08:00
yang
be18f7477b es数据同步 2024-12-17 10:53:57 +08:00
yang
157e692203 Merge branch 'refs/heads/zxwy-esSync' into dev1107 2024-12-13 20:52:30 +08:00
yang
492032a77a Merge remote-tracking branch 'origin/dev1107' into dev1107 2024-12-13 20:22:00 +08:00
yang
1c6a64e504 Merge branch 'refs/heads/zxwy-esSync' into dev1107 2024-12-13 20:21:17 +08:00
Wangxxz
6f861c3d2c Merge remote-tracking branch '121/dev1107' into dev1107 2024-12-13 14:34:08 +08:00
Wangxxz
b701f88586 Merge branch 'yx1101-teacher-l' into dev1107 2024-12-13 14:33:51 +08:00
Wangxxz
6532cf75e3 修改方法名称 2024-12-13 14:33:25 +08:00
Wangxxz
ad357a61b7 修改方法名称 2024-12-13 14:17:48 +08:00
yang
f70b4cb32a Merge branch 'refs/heads/zxwy-esSync' into dev1107 2024-12-12 17:53:21 +08:00
Wangxxz
f577e82551 Merge branch 'yx1101-teacher-l' into dev1107 2024-12-12 11:27:05 +08:00
Wangxxz
ee25fa40cd Merge remote-tracking branch '121/dev1107' into dev1107 2024-12-03 10:11:18 +08:00
Wangxxz
45d38d6df7 Merge branch 'yx1101-teacher-l' into dev1107 2024-12-03 10:10:20 +08:00
yang
3703cfb9c8 Merge remote-tracking branch 'origin/dev1107' into dev1107 2024-11-30 12:11:41 +08:00
yang
3a1908532e Merge branch 'refs/heads/master-1129' into dev1107
# Conflicts:
#	servers/boe-server-all/pom.xml
2024-11-30 12:09:09 +08:00
Wangxxz
963fae8191 Merge branch 'yx1101-teacher-l' into dev1107 2024-11-26 11:25:33 +08:00
Wangxxz
b2bad03ba9 Merge branch 'yx1101-teacher-l' into dev1107 2024-11-26 11:21:08 +08:00
Wangxxz
4152baf8de Merge branch 'yx1101-teacher-l' into dev1107 2024-11-26 10:16:32 +08:00
Wangxxz
0f2d8af1e4 Merge branch 'yx1101-teacher-l' into dev1107 2024-11-22 11:42:17 +08:00
Wangxxz
4d161a1d36 Merge branch 'yx1101-teacher-l' into dev1107 2024-11-16 10:28:06 +08:00
zhaolongfei
971478f206 Merge branch 'zcwy1030-llf' into dev1107-121 2024-11-11 15:15:55 +08:00
zhaolongfei
eaafb57b83 视频进行工号验证 2024-11-11 15:15:28 +08:00
zhaolongfei
ee74f47261 视频进行工号验证 2024-11-11 15:12:27 +08:00
zhaolongfei
c0a00e9647 Merge remote-tracking branch 'origin/dev1107' into dev1107-121 2024-11-11 10:49:58 +08:00
zhaolongfei
9d3bbcbf3a Merge branch 'zcwy1108-llf' into dev1107-121 2024-11-11 10:49:43 +08:00
zhaolongfei
05dc7b984f 注释代码 2024-11-11 10:49:04 +08:00
nisen
5b4afdde65 Merge remote-tracking branch '121/dev1107' into dev1107-121 2024-11-10 20:36:50 +08:00
nisen
53ff0d979e Merge branch 'zcwy1108-llf' into dev1107-121
# Conflicts:
#	servers/boe-server-all/src/main/java/com/xboe/system/api/SysUploaderApi.java
2024-11-10 20:36:14 +08:00
nisen
9a28d65c54 Merge branch 'zcwy1108-llf' into dev1107-121
# Conflicts:
#	servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java
2024-11-10 20:34:58 +08:00
zhaolongfei
32fcc830de Merge branch 'zcwy1108-llf' into dev1107-121 2024-11-10 20:32:48 +08:00
zhaolongfei
d0e5f8c329 编辑视频时长的时候直接修改文件时长 2024-11-10 20:31:47 +08:00
zhaolongfei
9c5941fd6b Merge branch 'zcwy1108-llf' into dev1107-121
# Conflicts:
#	servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java
#	servers/boe-server-all/src/main/java/com/xboe/system/api/SysUploaderApi.java
2024-11-10 19:31:56 +08:00
zhaolongfei
2c94b09199 在线课上传视频失败修改 2024-11-10 19:25:08 +08:00
zhaolongfei
d147a5f861 添加日志 2024-11-08 19:35:12 +08:00
zhaolongfei
e9995753c7 添加日志 2024-11-08 19:34:36 +08:00
zhaolongfei
e59aab127f 添加日志 2024-11-08 19:21:47 +08:00
zhaolongfei
ede76f74e8 添加日志 2024-11-08 19:13:41 +08:00
zhaolongfei
f28d120688 添加日志 2024-11-08 19:01:56 +08:00
zhaolongfei
425a1edf01 添加日志 2024-11-08 18:45:14 +08:00
zhaolongfei
d9d1e0fecc 视频进行工号验证 2024-11-08 17:34:07 +08:00
zhaolongfei
cb9e94ce5e 视频进行工号验证 2024-11-08 17:32:55 +08:00
nisen
16df953a86 Merge remote-tracking branch 'yx/zcwy1030-llf' into dev1107 2024-11-08 17:13:34 +08:00
zhaolongfei
af0c26294d 视频进行工号验证 2024-11-08 17:12:01 +08:00
zhaolongfei
485b110613 Merge branch 'zcwy1021-llf' into dev1107 2024-11-08 13:54:16 +08:00
zhaolongfei
15fcfdcc2b 配置测试es的ip地址 2024-11-08 11:01:59 +08:00
zhaolongfei
f54eae0cec 配置测试es的ip地址 2024-11-08 09:00:32 +08:00
zhaolongfei
2d0b79878b 配置测试环境 2024-11-07 17:48:40 +08:00
zhaolongfei
00deb3f825 无目录有权限就报名 2024-11-06 17:10:21 +08:00
zhaolongfei
76a10ec726 无目录有权限就报名 2024-11-06 16:02:30 +08:00
zhaolongfei
87adf2aca5 在线视频播放时进行token和工号验证 2024-11-06 09:03:06 +08:00
zhaolongfei
b6f188389d 无目录的在线课无权限情况下不能报名 2024-11-05 18:12:54 +08:00
zhaolongfei
f61f344f60 无目录的在线课无权限情况下不能报名 2024-11-05 17:50:32 +08:00
zhaolongfei
2a214530f6 去除无用类 2024-11-04 15:38:17 +08:00
zhaolongfei
05656669ca 教师审批添加教师工号 2024-11-04 15:37:49 +08:00
zhaolongfei
5905fd6db8 视频上传添加视频时长 2024-11-01 17:39:00 +08:00
zhaolongfei
ddd35b4731 视频上传添加视频时长 2024-11-01 17:25:03 +08:00
zhaolongfei
5af8ca335c 视频上传添加视频回退 2024-11-01 16:28:25 +08:00
zhaolongfei
cd029d43c1 视频上传添加视频为0时的错误信息 2024-11-01 15:13:18 +08:00
47 changed files with 583 additions and 1025 deletions

View File

@@ -219,13 +219,13 @@
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.9.0</version> <!-- 请根据实际需求选择合适的版本 -->
<version>7.10.2</version> <!-- 请根据实际需求选择合适的版本 -->
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.9.0</version> <!-- 请根据实际需求选择合适的版本 -->
<version>7.10.2</version> <!-- 请根据实际需求选择合适的版本 -->
</dependency>
<dependency>
@@ -237,9 +237,10 @@
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version> <!-- 请根据实际需求选择版本 -->
<version>2.3.0</version>
</dependency>
</dependencies>
<build>
<plugins>
@@ -269,9 +270,9 @@
</build>
<profiles>
<profile>
<id>prod</id>
<id>pro</id>
<properties>
<profileActive>prod</profileActive>
<profileActive>pro</profileActive>
</properties>
</profile>
<profile>

View File

@@ -8,11 +8,9 @@ import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.boe.feign.api.courseweb.entity.ExamTestDto;
import com.boe.feign.api.courseweb.entity.ProjectStudyDto;
import com.boe.feign.api.courseweb.remote.ExternalRemoteClient;
import com.boe.feign.api.courseweb.remote.OffCourseRemoteClient;
import com.boe.feign.api.courseweb.remote.ProjectAdminRemoteClient;
import com.boe.feign.api.courseweb.remote.ProjectRemoteClient;
import com.boe.feign.api.courseweb.reps.ExamStudyRecordParam;
import com.boe.feign.api.infrastructure.entity.CommonSearchVo;
import com.boe.feign.api.infrastructure.entity.Dict;
import com.boe.feign.api.infrastructure.remote.DictRemoteClient;
@@ -24,11 +22,11 @@ import com.boe.feign.api.usercenter.reps.AudienceMemberVo;
import com.boe.feign.api.usercenter.reps.Response;
import com.xboe.api.infrastructure.res.InfraResult;
import com.xboe.api.vo.*;
import com.xboe.module.course.dto.CourseParam;
import com.xboe.module.course.dto.ScoreParam;
import com.xboe.common.PageList;
import com.xboe.common.Pagination;
import com.xboe.core.JsonResponse;
import com.xboe.module.course.dto.CourseParam;
import com.xboe.module.course.dto.ScoreParam;
import com.xboe.module.course.vo.StudyCourseVo;
import com.xboe.module.course.vo.TeacherVo;
import com.xboe.module.dict.entity.DictDto;
@@ -75,8 +73,6 @@ public class ThirdApi {
@Resource
private ProjectRemoteClient projectRemoteClient;
@Resource
ExternalRemoteClient externalRemoteClient;
@Resource
private DictRemoteClient dictRemoteClient;
@@ -96,8 +92,8 @@ public class ThirdApi {
private String syncCourseStudent;
@Value("${coursesuilt.syncOnLineScore}")
private String syncOnLineScore;
@Value("${coursesuilt.updateOnLineStatua}")
private String updateOnLineStatua;
@Value("${coursesuilt.updateOnLineStatus}")
private String updateOnLineStatus;
//获取例外人员的id
@@ -266,19 +262,11 @@ public class ThirdApi {
}
public List<StudyCourse> getStudyCourseList(String studyId, String courseId, String token) {
log.info(" 1 studyId = "+ studyId + " ,courseId = " + courseId );
if ( studyId == null || courseId == null ){
log.error(" 在线课学习记录 参数不能为空 ");
return new ArrayList<>();
}
StudyCourseVo studyCourseVo = new StudyCourseVo();
studyCourseVo.setStudyId(studyId);
studyCourseVo.setCourseId(courseId);
ProjectStudyDto projectStudyDto = new ProjectStudyDto();
// BeanUtil.copyProperties(studyCourseVo, studyCourseVo);
projectStudyDto.setStudyId(Long.parseLong(studyId));
projectStudyDto.setCourseId(Long.parseLong(courseId));
log.info(" 12 在线课学习记录 studyId = "+ projectStudyDto.getStudyId() + " ,courseId = " + projectStudyDto.getCourseId() );
BeanUtil.copyProperties(studyCourseVo, studyCourseVo);
projectRemoteClient.updateStudyStatus(projectStudyDto);
return new ArrayList<>();
}
@@ -388,14 +376,10 @@ public class ThirdApi {
.body()).orElseThrow(() -> new RuntimeException("token校验失败"));
log.info("syncOnLineScore = " + resp);
}
public void updateOnLineStatua(CourseParam param, String token){
public void updateOnLineStatus(CourseParam param, String token){
String resp = Optional.ofNullable(
HttpRequest.post(updateOnLineStatua).body(JSONUtil.toJsonStr(param)).header("token", token).execute()
HttpRequest.post(updateOnLineStatus).body(JSONUtil.toJsonStr(param)).header("token", token).execute()
.body()).orElseThrow(() -> new RuntimeException("token校验失败"));
log.info("updateOrSaveCourse = " + resp);
}
public void syncExamStudyRecord(ExamStudyRecordParam param) {
externalRemoteClient.syncExamStudyRecord(param);
}
}

View File

@@ -0,0 +1,25 @@
package com.xboe.config;
public class ConditionException extends RuntimeException{
private Integer code;
private String message;
public ConditionException(Integer code, String message) {
this.code = code;
this.message = message;
}
public ConditionException(String message) {
this(600, message);
}
public Integer getCode() {
return this.code;
}
@Override
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,63 @@
package com.xboe.config;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.xboe.common.utils.Sha256Mac;
import org.apache.commons.codec.binary.Base64;
import java.util.Map;
/**
* Jwt工具类
*
* @author ruoyi
*/
public class JwtUtils {
public static final String secretKey = "JDF_BOE";
/**
* 从数据声明生成令牌
*
* @param claims 数据声明
* @return 令牌
*/
public static String createToken(Map<String, Object> claims) {
JSONObject header = new JSONObject();
header.put("alg", "HS256");
header.put("type", "token");
String payload64 = Base64.encodeBase64String(JSON.toJSONString(claims).getBytes());
String header64 = Base64.encodeBase64String(header.toString().getBytes());
String sign = Sha256Mac.sha256_mac(header64 + payload64, secretKey);
return header64 + "." + payload64 + "." + sign;
}
/**
* 从令牌中获取数据声明
*
* @param token 令牌
* @return 数据声明
*/
public static Map<String, Object> parseToken(String token) throws ConditionException {
String[] tokens = token.split("\\.");
if (tokens.length != 3) {
throw new ConditionException("token不合法 : " + token);
}
String payload = new String(Base64.decodeBase64(tokens[1]));
String sign = Sha256Mac.sha256_mac(tokens[0] + tokens[1], secretKey);
if (sign.equals(tokens[2])) {
JSONObject jsonObject = JSON.parseObject(payload);
long exp = jsonObject.getLong("exp");
long now = System.currentTimeMillis() / 1000;
if (now > exp) {
throw new ConditionException("token过期 : " + token);
}
Map<String, Object> map = JSON.parseObject(payload, new TypeReference<Map<String, Object>>() {
});
return map;
} else {
throw new ConditionException("token错误 : " + token);
}
}
}

View File

@@ -1,5 +1,6 @@
package com.xboe.config;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
@@ -7,11 +8,9 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.cbor.MappingJackson2CborHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@@ -21,15 +20,6 @@ public class WebConfig implements WebMvcConfigurer {
private static final Logger logger = LoggerFactory.getLogger(WebConfig.class);
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorParameter(true)
.defaultContentType(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
.parameterName("mediaType")
.mediaType("json", MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML);
}
//结果处理器
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
@@ -40,10 +30,9 @@ public class WebConfig implements WebMvcConfigurer {
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,true);
return mapper;
}
/**
* 在默认的消息转换器基础上添加或移除某些转换器
* 保证StringHttpMessageConverter在FastJsonHttpMessageConverter前被调用

View File

@@ -22,6 +22,8 @@ public interface CacheName {
*/
String NAME_USER = "user";
String NAME_INFO = "userInfo";
/**
* 用户名缓存KEY前缀
*/

View File

@@ -122,20 +122,13 @@ public class OutSideDataServiceImpl implements IOutSideDataService {
//这里应该是单独的线程去处理
user.setId(getNodeText(result.get("userId")));//最新接口变化id改成userId
String band=getNodeText(result.get("bandCode"));
try {
if(StringUtils.isNotBlank(band) && band.length()>4 && band.contains("band")) {
String bandNum=band.substring(4);
user.setBandLevel(Integer.valueOf(bandNum));
}else if (StringUtils.isNotBlank(band) && band.length()>4 && band.contains("Level")) {
String bandNum=band.substring(5);
user.setBandLevel(Integer.valueOf(bandNum));
}else {
user.setBandLevel(0);
}
} catch (NumberFormatException e) {
user.setBandLevel(0);
}
user.setAvatar(getNodeText(result.get("avatar")));
if(StringUtils.isNotBlank(band) && band.length()>4) {
String bandNum=band.substring(4);
user.setBandLevel(Integer.valueOf(bandNum));
}else {
user.setBandLevel(0);
}
user.setAvatar(getNodeText(result.get("avatar")));
user.setCode(getNodeText(result.get("userNo")));
if(StringUtils.isBlank(user.getCode())) {

View File

@@ -2,16 +2,11 @@ package com.xboe.data.service.impl;
import java.time.LocalDateTime;
import javax.annotation.Resource;
import javax.transaction.Transactional;
import com.boe.feign.api.serverall.entity.UserData;
import com.xboe.constants.CacheName;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
@@ -44,9 +39,6 @@ public class DataUserSyncServiceImpl implements IDataUserSyncService {
@Autowired
TeacherDao teacherDao;
@Resource
private CacheManager cacheManager;
@Override
@Transactional
@@ -67,8 +59,6 @@ public class DataUserSyncServiceImpl implements IDataUserSyncService {
a.setDeleted(user.getDeleted());
}
a.setLoginName(user.getCode());
a.setMobile(user.getMobile());
a.setEmail(user.getEmail());
log.info("更新账号code");
accountDao.update(a);
} else {
@@ -81,18 +71,14 @@ public class DataUserSyncServiceImpl implements IDataUserSyncService {
a.setRegTime(LocalDateTime.now());
a.setSysId(user.getKid());
a.setStatus(1);
a.setMobile(user.getMobile());
a.setEmail(user.getEmail());
accountDao.save(a);
log.info("账号不存在,新添加账号【" + user.getId() + "");
}
if (u != null) {
//更新部分用户字段
u.setDepartId(user.getDepartId());
u.setDepartName(user.getDepartName());
u.setName(user.getName());
u.setMobileNo(user.getMobile());
//2022-12-8 去掉用户类型的更新,因为返回的数据都是学员,
//u.setUserType(user.getUserType());
if (user.getLearningDuration() > 0) { //不大于0才会更新
@@ -120,17 +106,9 @@ public class DataUserSyncServiceImpl implements IDataUserSyncService {
} else {
u.setShowHome(true);//band16以下及其它无bandLevel的信息
}
u.setMobileNo(user.getMobile());
userDao.save(u);
log.info("添加新用户");
}
Cache cache = cacheManager.getCache(CacheName.NAME_USER);
if(cache != null) {
cache.evict(CacheName.KEY_ACCOUNT + user.getId());
cache.evict(CacheName.KEY_USER + user.getId());
}
//对机构的判断,不为空时才会处理,为空时不处理
if (StringUtils.isNotBlank(user.getDepartId())) {
org = orgDao.get(user.getDepartId());

View File

@@ -140,9 +140,6 @@ public class CasesApi extends ApiBaseController {
List<Cases> cases = views.getList();
if (CollUtil.isNotEmpty(cases)) {
for (Cases c : cases) {
if ("null".equals(c.getSummary())) {
c.setSummary(null);
}
StringBuffer stringBuffer = new StringBuffer();
List<CasesMajorType> caseId = casesMajorTypeDao.findList(FieldFilters.eq("caseId", c.getId()));
if (caseId != null && !caseId.isEmpty()) {

View File

@@ -359,7 +359,7 @@ public class CourseAuditApi extends ApiBaseController{
String token = request.getHeader("Xboe-Access-Token");
CourseParam param = new CourseParam();
param.setId(courseId);
thirdApi.updateOnLineStatua(param,token);
thirdApi.updateOnLineStatus(param,token);
}
return success(true);
} catch (Exception e) {

View File

@@ -285,9 +285,9 @@ public class CourseFullTextApi extends ApiBaseController{
paras.setTypes(dto.getTypes());//多个分类的情况
//用户的companyId
paras.setCompanyId(dto.getCompanyId());
if(StringUtils.isNotBlank(dto.getAudiences())) {
paras.setAudiences(dto.getAudiences().split(","));
}
// if(StringUtils.isNotBlank(dto.getAudiences())) {
// paras.setAudiences(dto.getAudiences().split(","));
// }
if(StringUtils.isNotBlank(userIds)) {
paras.setSysCreateAids(userIds.split(","));
}

View File

@@ -314,10 +314,8 @@ public class CoursePortalApi extends ApiBaseController{
User user = userService.get(ct.getTeacherId());
if(t!=null) {
ct.setRemark(t.getDescription());
ct.setSupplier(t.getSupplier());
ct.setTeacherType(t.getTeacherType());
if(redisTemplate.opsForValue().get(ct.getTeacherId())!=null){
if(Objects.equals(redisTemplate.opsForValue().get(ct.getTeacherId()), "1") && ( t==null || t.getTeacherType() == 1)){
if(Objects.equals(redisTemplate.opsForValue().get(ct.getTeacherId()), "1")){
ct.setTeacherName("BOE教师");
}
teacherCourseDto.setCourseId(ct.getCourseId());
@@ -329,15 +327,13 @@ public class CoursePortalApi extends ApiBaseController{
teacherCourseDto.setSysCreateBy(ct.getSysCreateBy());
teacherCourseDto.setSysCreateTime(ct.getSysCreateTime());
teacherCourseDto.setId(ct.getId());
if(user!=null){
teacherCourseDto.setUserNo(user.getUserNo());
}
teacherCourseDto.setUserNo(user.getUserNo());
teacherCourseDtos.add(teacherCourseDto);
}else if (redisTemplate.opsForValue().get(ct.getTeacherId())==null){
List<String> list=new ArrayList<>();
list.add(ct.getTeacherId());
getTeacherInfo(request.getHeader("Xboe-Access-Token"),list);
if(Objects.equals(redisTemplate.opsForValue().get(ct.getTeacherId()), "1") && ( t==null || t.getTeacherType() == 1)){
if(Objects.equals(redisTemplate.opsForValue().get(ct.getTeacherId()), "1")){
ct.setTeacherName("BOE教师");
}
teacherCourseDto.setCourseId(ct.getCourseId());
@@ -349,9 +345,7 @@ public class CoursePortalApi extends ApiBaseController{
teacherCourseDto.setSysCreateBy(ct.getSysCreateBy());
teacherCourseDto.setSysCreateTime(ct.getSysCreateTime());
teacherCourseDto.setId(ct.getId());
if(user!=null){
teacherCourseDto.setUserNo(user.getUserNo());
}
teacherCourseDto.setUserNo(user.getUserNo());
teacherCourseDtos.add(teacherCourseDto);
}
}

View File

@@ -1,16 +1,20 @@
package com.xboe.module.course.api;
import java.util.Base64;
import java.util.HashSet;
import java.util.Set;
import java.util.*;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.hutool.json.JSONUtil;
import com.xboe.constants.CacheName;
import com.xboe.data.outside.IOutSideDataService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -33,13 +37,18 @@ import com.xboe.module.course.service.ICourseFileService;
public class CourseWareApi extends ApiBaseController {
private String cookieName = "PLAYSIGN_TIME";
@Autowired
IOutSideDataService outsideDataService;
@Resource
private ICourseFileService courseFileService;
@Resource
private XFileUploader fileUploader;
@Resource
RedisTemplate<String, Object> redisTemplate;
private static Set<String> allowUrlSet = new HashSet<String>();
static {
@@ -50,7 +59,7 @@ public class CourseWareApi extends ApiBaseController {
/**
* 资源地址的加密,返回加密后的地址
*
*
* @param request
* @param response
* @param cfid 资源地址的id
@@ -85,25 +94,22 @@ public class CourseWareApi extends ApiBaseController {
/**
* 获取资源在header中保存
*
*
* @param request
* @param response
* @param cfid
* @param cf
* @throws Exception
*/
@GetMapping("/resource")
public JsonResponse<String> getVideo(HttpServletRequest request, HttpServletResponse response, String sign) throws Exception {
public JsonResponse<String> getVideo(HttpServletRequest request, HttpServletResponse response, String sign,
@CookieValue(name = "token",required = false)String token
) throws Exception {
if (StringUtils.isBlank(sign)) {
return badRequest("非法请求");
// return;
}
String httpReferer = request.getHeader("referer");
if (StringUtils.isBlank(httpReferer)) {
return badRequest("非法请求");
// return "非法请求";
}
boolean has=false;
@@ -115,21 +121,37 @@ public class CourseWareApi extends ApiBaseController {
if(!has) {
return badRequest("页面不存在");
//return "非法请求";
}
//读取cookies中的时间
String cookieTime = getSignTimeCookie(request);
if (StringUtils.isBlank(cookieTime)) {
return badRequest("不支持的请求");
// return;
// String token = request.getHeader("Xboe-Access-Token");
// if (StringUtils.isEmpty(token)) {
// token = request.getHeader("token");
// }
// 读取cookies中的时间
// String cookieTime = getSignTimeCookie(request);
// if (StringUtils.isBlank(cookieTime)) {
// return badRequest("不支持的请求");
// }
String userInfo = CacheName.NAME_INFO + ":"+ token;
log.info("请求头里的token值:"+token);
log.info("从 Redis 获取的userInfo:"+userInfo);
Object o = redisTemplate.opsForValue().get(userInfo);
if (o == null) {
log.error("从 Redis 获取的值为 null ,", userInfo);
return badRequest("token验证错误");
}
// 将对象转换为字符串
String userNoStr = o.toString();
// 检查字符串是否为空或空白
if (StringUtils.isBlank(userNoStr)) {
log.error("从 Redis 获取的值为空或空白,", userInfo);
return badRequest("token验证错误");
}
HashMap bean = JSONUtil.toBean(userNoStr, HashMap.class);
Object userNo = bean.get("userNo");
byte[] signBytes = Base64.getDecoder().decode(sign);
// byte[] signBytes = RSAUtil.decryptBase64(sign);
byte[] signDecryt = RSAUtil.decryptByPrivateKey(ConfigSecretKey.TEMP_PRIVATESTR, signBytes);
String signStr = new String(signDecryt);
// System.out.println("解密后的字符串:"+signStr);
// 第一个/前端是时间
int index = signStr.indexOf("/");
if (index <= 0) {
@@ -139,8 +161,15 @@ public class CourseWareApi extends ApiBaseController {
}
String time = signStr.substring(0, signStr.indexOf("/"));// 时间字符中long
String[] split = signStr.split("/");
String cfid = signStr.substring(index+1);// 文件路径
log.info("解密后的字符串:"+signStr);
log.info("workNum工号对比:"+split[2]);
log.info("userNo工号对比:"+userNo);
if (!split[2].equals(userNo)){
return badRequest("token验证失效");
}
// if (!time.equals(cookieTime)) {
// log.info("请求头时间和解析后的时间对比:"+"解析时间:"+time+" 请求头时间:"+cookieTime);
// log.info("解密后的字符串的时间拼接:"+signStr);
@@ -172,7 +201,7 @@ public class CourseWareApi extends ApiBaseController {
/**
* 读取cookies值
*
*
* @param request
* @return
*/

View File

@@ -10,6 +10,8 @@ import com.xboe.core.orm.BaseDao;
import com.xboe.core.orm.IFieldFilter;
import com.xboe.module.course.entity.CourseFile;
import javax.transaction.Transactional;
@Repository
public class CourseFileDao extends BaseDao<CourseFile> {
@@ -21,4 +23,5 @@ public class CourseFileDao extends BaseDao<CourseFile> {
PageList<CourseFile> page = this.getGenericDao().findPage(pageIndex, pageSize, getEntityClass(), filters,order);
return page;
}
}

View File

@@ -49,12 +49,4 @@ public class CourseTeacher extends IdBaseEntity {
@Transient
private String code;
/**供应商*/
@Transient
private String supplier;
/**讲师类型 1 内部讲师 2外部讲师*/
@Transient
private Integer teacherType;
}

View File

@@ -54,4 +54,6 @@ public interface ICourseFileService {
* @param deleted
*/
void delete(String id,boolean deleted);
// void updateDuration(String contentRefId, Integer duration);
}

View File

@@ -341,5 +341,8 @@ public interface ICourseService {
List<Course> mobiledelList(Integer num,CourseQueryDto courseQueryDto);
List<Course> findByIds(List<String> courseIds);
}

View File

@@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.xboe.common.OrderCondition;
import com.xboe.common.PageList;
import com.xboe.core.cache.IXaskCache;
import com.xboe.core.cache.XaskCacheProvider;
import com.xboe.core.orm.FieldFilters;
@@ -14,11 +15,9 @@ import com.xboe.core.orm.UpdateBuilder;
import com.xboe.module.course.dao.*;
import com.xboe.module.course.dto.CourseContentDto;
import com.xboe.module.course.dto.SortItem;
import com.xboe.module.course.entity.CourseAssess;
import com.xboe.module.course.entity.CourseContent;
import com.xboe.module.course.entity.CourseExam;
import com.xboe.module.course.entity.CourseHomeWork;
import com.xboe.module.course.entity.*;
import com.xboe.module.course.service.ICourseContentService;
import com.xboe.module.course.service.ICourseFileService;
import com.xboe.module.exam.dao.ExamPaperDao;
import com.xboe.module.exam.vo.TestQuestionVo;
import com.xboe.standard.enums.BoedxContentType;
@@ -57,7 +56,8 @@ public class CourseContentServiceImpl implements ICourseContentService {
@Resource
private ExamPaperDao examPaperDao;
@Resource
private ICourseFileService courseFileService;
@Override
@Transactional
@@ -83,6 +83,7 @@ public class CourseContentServiceImpl implements ICourseContentService {
ccDao.save(cc);
}else {
ccDao.update(cc);
// courseFileService.updateDuration(cc.getContentRefId(),cc.getDuration());
cc.setSysVersion(ccDao.getVersion(cc.getId()));
}
//添加或保存其它信息

View File

@@ -98,4 +98,14 @@ public class CourseFileServiceImpl implements ICourseFileService {
public CourseFile get(String id) {
return courseFileDao.get(id);
}
// @Override
// public void updateDuration(String contentRefId,Integer duration) {
// if (duration == null) {
// duration = 0;
// }
// String sql = "UPDATE boe_course_file SET duration = "+ duration+" WHERE id = "+ contentRefId+" ";
// courseFileDao.sqlUpdate(sql);
// }
}

View File

@@ -14,7 +14,6 @@ import java.util.stream.Stream;
import javax.annotation.Resource;
import javax.management.Query;
import cn.hutool.core.collection.CollectionUtil;
import com.xboe.api.ThirdApi;
import com.xboe.core.orm.*;
import com.xboe.school.study.dao.StudyCourseDao;
@@ -449,7 +448,6 @@ public class CourseServiceImpl implements ICourseService {
List<Course> paginate = paginate(listByFilters2, pageIndex, pageSize);
PageList<Course> rs = new PageList<>();
rs.setCount(listByFilters2.size());
rs.setPageSize(pageSize);
rs.setList(paginate);
return rs;
}
@@ -482,7 +480,7 @@ public class CourseServiceImpl implements ICourseService {
String sql = "SELECT DISTINCT\n" +
"rt.course_id\n" +
"FROM\n" +
"boe_new.student s INNER JOIN boe_new.router_task rt on s.pid=rt.router_id inner join boe_course c on c.id=rt.course_id\n" +
"boe.student s INNER JOIN boe.router_task rt on s.pid=rt.router_id inner join boe_course c on c.id=rt.course_id\n" +
"\n" +
"WHERE\n" +
"\n" +
@@ -505,7 +503,7 @@ public class CourseServiceImpl implements ICourseService {
String sql = "SELECT DISTINCT\n" +
"pt.course_id\n" +
"FROM\n" +
"boe_new.student s INNER JOIN boe_new.project_task pt on s.pid=pt.project_id inner join boe_course c on c.id=pt.course_id\n" +
"boe.student s INNER JOIN boe.project_task pt on s.pid=pt.project_id inner join boe_course c on c.id=pt.course_id\n" +
"\n" +
"WHERE\n" +
"\n" +
@@ -562,8 +560,8 @@ public class CourseServiceImpl implements ICourseService {
String sql = "SELECT DISTINCT\n" +
"\tc.id \n" +
"FROM\n" +
"\tboe_new.student s\n" +
"\tINNER JOIN boe_new.grow_task gt ON s.pid = gt.grow_id\n" +
"\tboe.student s\n" +
"\tINNER JOIN boe.grow_task gt ON s.pid = gt.grow_id\n" +
"\tINNER JOIN boe_course c ON gt.course_id = c.id \n" +
"WHERE\n" +
"\ts.type = 14 \n" +
@@ -1569,13 +1567,6 @@ public class CourseServiceImpl implements ICourseService {
return list;
}
@Override
public List<Course> findByIds(List<String> courseIds) {
QueryBuilder query = QueryBuilder.from(Course.class);
query.addFilter(FieldFilters.in("id", courseIds));
return courseDao.findList(query.builder());
}
@Override
public int countWaitAudit(String aid) {

View File

@@ -8,8 +8,6 @@ import java.util.Map;
import javax.annotation.Resource;
import com.boe.feign.api.courseweb.reps.ExamStudyRecordParam;
import com.xboe.api.ThirdApi;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -39,10 +37,7 @@ public class AloneExamServiceImpl implements IAloneExamService{
@Resource
AloneExamDao aeDao;
@Resource
private ThirdApi thirdApi;
@Override
@Transactional
public void save(AloneExamAnswer aea){
@@ -106,18 +101,7 @@ public class AloneExamServiceImpl implements IAloneExamService{
// //这种情况汶是不存在的
// }
}
try {
ExamStudyRecordParam param = new ExamStudyRecordParam();
param.setTestId(aea.getTestId());
param.setAid(aea.getAid());
thirdApi.syncExamStudyRecord(param);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
@Override
@Transactional

View File

@@ -10,7 +10,6 @@ import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

View File

@@ -43,7 +43,12 @@ public class PhpOnlineStudyRecordScheduledTasks {
@Resource
RestHighLevelClient restHighLevelClient;
// todo 定时、分批、数据库名
/**
* 定时同步PHP数据库数据到es中计划定时20分钟执行一次。具体实现是
* 第一步查询最近半小时内完成任一课件的课程学习获取的信息有课程ID学员ID学习状态、学习进度。
* 第二步根据上述得到的课程ID学员ID查询es中的未完成的记录。
* 第三步比对两者学习进度如果不一致以数据库学习记录为准修改ES
*/
@XxlJob("phpOnlineStudyRecordSyncEsTask")
public List<String> phpOnlineStudyRecordSyncEs(Long syncTimePointOfBegin, Long syncTimePointOfEnd, Integer isOnlyRead) throws IOException {
@@ -101,6 +106,9 @@ public class PhpOnlineStudyRecordScheduledTasks {
// 获取ES中的数据
List<CourseStudyDto> esDataList = getEsData(batch);
if (CollUtil.isEmpty(esDataList)){
continue;
}
// 更新ES数据
List<CourseStudyDto> toBeUpdatedEs = esDataList.stream()
@@ -130,12 +138,13 @@ public class PhpOnlineStudyRecordScheduledTasks {
}
// 调用批量更新方法
// toBeUpdatedEs(toBeUpdatedEs, indexName);
toBeUpdatedEs(toBeUpdatedEs);
}
return tempResultList;
}
private List<CourseStudyDto> getEsData(List<PhpOnlineDto> finishedCourseList) throws IOException {
log.info("待处理的数据:{}", finishedCourseList);
SearchRequest searchRequest = new SearchRequest("new_study_resource");
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
@@ -151,11 +160,13 @@ public class PhpOnlineStudyRecordScheduledTasks {
);
}
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(boolQuery).timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(sourceBuilder);
if (boolQuery.hasClauses()) {
sourceBuilder.query(boolQuery);
if (!boolQuery.hasClauses()) {
return null;
}
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.query(boolQuery)
.timeout(new TimeValue(60, TimeUnit.SECONDS))
.size(finishedCourseList.size() + 10);
searchRequest.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
@@ -175,7 +186,7 @@ public class PhpOnlineStudyRecordScheduledTasks {
return courseStudyDtoList;
}
private void toBeUpdatedEs(List<CourseStudyDto> toBeUpdatedEsData, String indexName) {
private void toBeUpdatedEs(List<CourseStudyDto> toBeUpdatedEsData) {
if (CollUtil.isEmpty(toBeUpdatedEsData)) {
return;
}
@@ -186,7 +197,7 @@ public class PhpOnlineStudyRecordScheduledTasks {
docMap.put("progress", courseStudyDto.getProgress());
// 创建更新请求并传入单一的docMap
UpdateRequest updateRequest = new UpdateRequest(indexName, courseStudyDto.getId())
UpdateRequest updateRequest = new UpdateRequest("new_study_resource", courseStudyDto.getId())
.doc(docMap, XContentType.JSON);
// 将请求添加到批量请求中
@@ -208,7 +219,11 @@ public class PhpOnlineStudyRecordScheduledTasks {
}
}
/**
* 第一步查询最近报名的学习获取的信息有课程ID学员ID学习状态、学习进度。
* 第二步根据上述得到的课程ID学员ID查询es中的未完成的记录。
* 第三步比对两者学习进度如果不一致以数据库学习记录为准修改ES。
*/
public List<String> phpOnlineStudyRecordSyncEsOfFull(Long syncTimePointOfBegin, Long syncTimePointOfEnd, Integer isOnlyRead) throws IOException {
log.info("开始同步PHP学习记录到ES");

View File

@@ -1,14 +1,9 @@
package com.xboe.school.study.api;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.nacos.shaded.com.google.common.util.concurrent.RateLimiter;
import com.xboe.api.ThirdApi;
import com.xboe.constants.CacheName;
@@ -209,8 +204,6 @@ public class StudyCourseApi extends ApiBaseController{
Teacher t = teacherService.get(ct.getTeacherId());
if(t!=null) {
ct.setRemark(t.getDescription());
ct.setSupplier(t.getSupplier());
ct.setTeacherType(t.getTeacherType());
}
if(redisTemplate.opsForValue().get(ct.getTeacherId())==null){
List<String>list=new ArrayList<>();
@@ -219,11 +212,11 @@ public class StudyCourseApi extends ApiBaseController{
redisTemplate.opsForValue().set(teacherVo.get(0).getTeacherId(), teacherVo.get(0).getStatus());
//设置过期时间为1天
redisTemplate.expire(teacherVo.get(0).getTeacherId(), 24 * 60 * 60, TimeUnit.SECONDS);
if (Objects.equals(redisTemplate.opsForValue().get(ct.getTeacherId()), "1") && ( t==null || t.getTeacherType() == 1)){
if (Objects.equals(redisTemplate.opsForValue().get(ct.getTeacherId()), "1")){
ct.setTeacherName("BOE教师");
}
}
if (Objects.equals(redisTemplate.opsForValue().get(ct.getTeacherId()), "1") && ( t==null || t.getTeacherType() == 1)){
if (Objects.equals(redisTemplate.opsForValue().get(ct.getTeacherId()), "1")){
ct.setTeacherName("BOE教师");
}
}
@@ -258,49 +251,6 @@ public class StudyCourseApi extends ApiBaseController{
rs.put("progress", sc.getProgress());
//查询上次学习的是什么资源。查询用户的学习情况
List<StudyCourseItem> items=studyService.findByStudyId(sc.getId());
// 和内容匹配,根据内容的视频时长,计算学习进度
if(CollectionUtil.isNotEmpty(items) && CollectionUtil.isNotEmpty(cclist)){
// 根据ID转换map
Map<String, CourseContent> contentMap = cclist.stream().collect(Collectors.toMap(CourseContent::getId, Function.identity()));
for (StudyCourseItem item : items) {
CourseContent content = contentMap.get(item.getContentId());
if(null == content){
continue;
}
if(null==item.getLastStudyTime()
|| item.getLastStudyTime()<=0
|| null==content.getDuration()
|| content.getDuration()<=0){
continue;
}
// 查询redis上面的key并解析value获取到lastStudyTime
String lastActive = redisTemplate.opsForValue().get("studyContentId:" + item.getId() + ":last_active");
if (StringUtil.isNotBlank(lastActive)) {
String[] parts = lastActive.split("&");
if (parts.length == 2) {
int lastStudyTimeRedis = Integer.parseInt(parts[0]);
log.info("study-video-time-redis获取---lastStudyTimeRedis = " + lastStudyTimeRedis);
if(lastStudyTimeRedis>0){
item.setLastStudyTime(lastStudyTimeRedis);
}
}
}
BigDecimal lastStudyTime = new BigDecimal(item.getLastStudyTime());
BigDecimal duration = new BigDecimal(content.getDuration());
BigDecimal progress = lastStudyTime.divide(duration, 10, RoundingMode.HALF_UP);
if(progress.compareTo(BigDecimal.ZERO) < 0){
progress = BigDecimal.ZERO;
}else if(progress.compareTo(BigDecimal.ONE) > 0){
progress = BigDecimal.ONE;
}
item.setProgressVideo(progress);
}
}
rs.put("contentStudys",items);//学习的内容
}
@@ -393,8 +343,6 @@ public class StudyCourseApi extends ApiBaseController{
}
//追加学习时长
studyService.appendStudyDuration(sci.getStudyId(),item.getId(),sci.getContentId(),sci.getDuration());
log.info(" 1 在线课学习记录 sci.getStudyId() = "+ sci.getStudyId() + " , sci.getCourseId() = " + sci.getCourseId() );
List<StudyCourse> allUserList = thirdApi.getStudyCourseList(sci.getStudyId() ,sci.getCourseId(), token);
log.info("在线课学习记录"+allUserList);
return success(item.getId());

View File

@@ -3,16 +3,9 @@ package com.xboe.school.study.api;
import java.io.IOException;
import java.time.ZoneOffset;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import cn.hutool.core.collection.CollectionUtil;
import com.xboe.module.course.entity.Course;
import com.xboe.module.course.service.ICourseService;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.StringUtils;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -49,15 +42,6 @@ public class StudyCourseESApi extends ApiBaseController{
@Autowired
IStudyCourseService service;
@Autowired
ICourseService courseService;
@Value("${xboe.upload.file.http_path}")
private String httpPath;
@Value("${xboe.image.course.default}")
private String defaultCourseImage;
@Resource
private PhpOnlineStudyRecordScheduledTasks phpOnlineStudyRecordScheduledTasks;
@@ -70,61 +54,13 @@ public class StudyCourseESApi extends ApiBaseController{
try {
dto.setAccountId(getCurrent().getAccountId());
PageList<CourseStudyDto> rs=search.search(page.getStartRow(),page.getPageSize(), dto);
handleCourseImage(rs);
return success(rs);
}catch(Exception e) {
log.error("查询报名学习ES失败",e);
return error("查询失败",e.getMessage());
}
}
private void handleCourseImage(PageList<CourseStudyDto> rs) {
if (rs == null || CollectionUtil.isEmpty(rs.getList())) {
return;
}
List<String> emptyImageCourseIds = Lists.newArrayList();
for(CourseStudyDto courseStudyDto : rs.getList()) {
if(StringUtils.isBlank(courseStudyDto.getCourseImage())) {
// 过滤课程类型
if(courseStudyDto.getCourseType()==10
|| courseStudyDto.getCourseType()==20){
emptyImageCourseIds.add(courseStudyDto.getCourseId());
}else{
log.warn("课程图片为空课程id为{},课程类型:{}",courseStudyDto.getCourseId(),courseStudyDto.getCourseType());
}
}
}
if(CollectionUtil.isEmpty(emptyImageCourseIds)){
return;
}
List<Course> courseList = courseService.findByIds(emptyImageCourseIds);
if(CollectionUtil.isNotEmpty(courseList)){
// courseList转换成map
Map<String, Course> courseMap = courseList.stream().collect(Collectors.toMap(Course::getId, course -> course));
// 赋值ES图片
for(CourseStudyDto courseStudyDto : rs.getList()) {
if(emptyImageCourseIds.contains(courseStudyDto.getCourseId())) {
Course currentCourse = courseMap.get(courseStudyDto.getCourseId());
if(null!=currentCourse){
if(StringUtils.isNotBlank(currentCourse.getCoverImg())){
// 拼接域名
courseStudyDto.setCourseImage(httpPath + currentCourse.getCoverImg());
}else{
// 赋值默认图片
courseStudyDto.setCourseImage(defaultCourseImage);
}
}
}
}
}
}
@RequestMapping(value="/list-by-ids",method = {RequestMethod.POST})
public JsonResponse<List<StudyCourse>> search(@RequestBody List<String> ids){
if(ids.isEmpty()) {

View File

@@ -1,106 +0,0 @@
package com.xboe.school.study.api;
import com.xboe.school.study.service.IStudyService;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* @author by lyc
* @date 2025/3/3
*/
@Component
@Slf4j
@RequiredArgsConstructor
public class StudyCourseTask {
private final IStudyService studyService;
private final StringRedisTemplate redisTemplate;
/**
* 定时任务
* 获取redis 中学习结束的数据更新入库
* */
@XxlJob("saveStudyCourseItemLastTime")
public void saveStudyCourseItemLastTime() {
// 1. 定义匹配模式匹配所有目标key
final String KEY_PATTERN = "studyContentId:*:last_active";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
// 2. 使用SCAN安全遍历避免阻塞
ScanOptions options = ScanOptions.scanOptions()
.match(KEY_PATTERN)
.count(100) // 分页大小
.build();
try (RedisConnection connection = Objects.requireNonNull(redisTemplate.getConnectionFactory()).getConnection()) {
Cursor<byte[]> cursor = connection.scan(options);
// 3. 遍历处理符合条件的key
while (cursor.hasNext()) {
String redisKey = new String(cursor.next());
// 4. 获取剩余TTL
Long ttl = redisTemplate.getExpire(redisKey, TimeUnit.SECONDS);
// 5. 过滤条件:剩余时间 >= 29天23小时30分钟转换为秒
// 总需时间 = (30天 - 30分钟) = 29天23小时30分钟 = 2590200秒
// 5分钟 300秒 || 2592000 - 300 = 2591700
if (ttl <= 2590200) {
try {
// 6. 提取studyContentId
String[] parts = redisKey.split(":");
if (parts.length < 2) continue;
String studyContentId = parts[1];
// 7. 获取存储的时间点(示例逻辑)
String redisValue = redisTemplate.opsForValue().get(redisKey);
if (redisValue == null) continue;
String[] partValues = redisValue.split("&");
int lastStudyTime = Integer.parseInt(partValues[0]);
LocalDateTime timestamp = null;
if (partValues.length >= 2){
timestamp = LocalDateTime.parse(partValues[1], formatter);
}
// 8. 更新数据库(调用已有服务方法)
studyService.updateStudyCourseItemLastTime(studyContentId, lastStudyTime, timestamp);
// 9. 删除Redis键原子操作
redisTemplate.delete(redisKey);
log.info("处理成功 key: {}, lastStudyTime: {}", redisKey, lastStudyTime);
} catch (Exception e) {
log.error("处理失败 key: {}", redisKey, e);
}
}
}
cursor.close();
} catch (Exception e) {
log.error("定时任务执行异常", e);
}
/* // 新增日志逻辑
if (ttl <= 172800) {
studyService.saveCourseExpireLog(
studyContentId,
lastStudyTime,
redisKey,
ttl,
"system_job"
);
}*/
}
}

View File

@@ -95,20 +95,20 @@ public class PhpOnlineCourseDao extends BaseDao<PhpOnlineDto> {
userBasicDataBase = "userbasic";
}
List<String> userIds = objectList1.stream().map(objects -> String.valueOf(objects[1])).distinct().collect(Collectors.toList());
List<Object[]> objectList2 = this.sqlFindList("select kid,user_id from " + userBasicDataBase + ".user_account where kid in (?1) and deleted=0 and account_status = 0", userIds);
List<String> userIdOfPhpList = objectList1.stream().map(objects -> String.valueOf(objects[1])).distinct().collect(Collectors.toList());
List<Object[]> objectList2 = this.sqlFindList("select kid,user_id from " + userBasicDataBase + ".user_account where kid in (?1) and deleted=0 and account_status = 0", userIdOfPhpList);
if (CollUtil.isEmpty(objectList1)) {
log.info("新系统用户数据不存在");
return null;
}
Map<Object, Object> userIdToKidMap = objectList2.stream().collect(Collectors.toMap(object -> object[0], object -> object[1]));
Map<Object, Object> kidAndUserIdMap = objectList2.stream().collect(Collectors.toMap(object -> object[0], object -> object[1]));
// 设置新系统用户ID
recentLearnRecordList = recentLearnRecordList.stream()
.map(phpOnlineDto -> {
Object userIdOfJavaObj = userIdToKidMap.get(phpOnlineDto.getUserIdOfPhp());
Object userIdOfJavaObj = kidAndUserIdMap.get(phpOnlineDto.getUserIdOfPhp());
if (userIdOfJavaObj != null) {
phpOnlineDto.setUserIdOfJava(userIdOfJavaObj.toString());
}
@@ -209,7 +209,6 @@ public class PhpOnlineCourseDao extends BaseDao<PhpOnlineDto> {
}
// 拼接获取所有新系统用户id这里不选择与上面的联表查询有效率问题
String userBasicDataBase;
if (activeProfile.equals("pro")) {
userBasicDataBase = "user_basic";

View File

@@ -1,12 +1,10 @@
package com.xboe.school.study.entity;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xboe.core.SysConstant;
@@ -130,12 +128,5 @@ public class StudyCourseItem extends IdEntity {
*/
@Column(name = "status",length=1)
private Integer status;
/**
* 视频播放进度
* */
// @Column(name = "progress_video")
@Transient
private BigDecimal progressVideo;
}

View File

@@ -1,6 +1,5 @@
package com.xboe.school.study.service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
@@ -8,6 +7,7 @@ import com.xboe.common.PageList;
import com.xboe.school.study.dto.StudyContentDto;
import com.xboe.school.study.entity.StudyCourseItem;
import com.xboe.school.study.entity.StudyTime;
import com.xboe.system.user.entity.User;
/**
* 学习情况处理,比较综合一个处理类
@@ -35,12 +35,11 @@ public interface IStudyService {
/**
* 更新最后的学习时间,及学习时间点
*
* @param studyContentId
* @param lastStudyTime
* @param aid
*/
void updateLastTime(String studyContentId, int lastStudyTime, String aid);
void updateLastTime(String studyContentId,int lastStudyTime,String aid);
/**
* 资源学习记录
@@ -100,5 +99,4 @@ public interface IStudyService {
List<StudyCourseItem> getList(String courseId, String contentId, String name, Integer status);
void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime, LocalDateTime timestamp);
}

View File

@@ -1,6 +1,5 @@
package com.xboe.school.study.service.impl;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
@@ -10,9 +9,12 @@ import java.util.Map;
import javax.transaction.Transactional;
import com.xboe.module.article.entity.Article;
import com.xboe.module.interaction.entity.Shares;
import com.xboe.school.study.entity.StudyCourse;
import com.xboe.system.user.entity.User;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import com.xboe.common.OrderCondition;
@@ -49,10 +51,7 @@ public class StudyServiceImpl implements IStudyService{
@Autowired
UserDao userDao;
@Autowired
StringRedisTemplate redisTemplate;
@Override
public StudyCourseItem checkHas(String studyId,String contentId) {
List<StudyCourseItem> items = scItemDao.findList(FieldFilters.eq("studyId", studyId),FieldFilters.eq("contentId", contentId));
@@ -324,27 +323,9 @@ public class StudyServiceImpl implements IStudyService{
}
// 更新 前端传输已学习时长
@Override
public void updateLastTime(String studyContentId, int lastStudyTime,String aid) {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
String value = lastStudyTime + "&" + now.format(formatter); // 使用ISO8601时间格式
log.info("-study-video-time-----value = " + value);
// 20250303 优化 多次更新改一次更新
// 更新Redis中的最后活跃时间带30秒过期
redisTemplate.opsForValue().set(
"studyContentId:" + studyContentId + ":last_active",
value,
Duration.ofSeconds(2592000)
);
log.info("-study-video-time-redis保存---value = " + value);
// Duration.ofDays(30) 也就是 2592000秒
}
@Override
@Transactional
public void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime,LocalDateTime timestamp) {
log.info("-study-video-time-定时---studyContentId = " + studyContentId + ",lastStudyTime = " + lastStudyTime + ", timestamp = " + timestamp);
public void updateLastTime(String studyContentId, int lastStudyTime,String aid) {
// 更新最后的学习时间点
LocalDateTime now=LocalDateTime.now();
UpdateBuilder update=UpdateBuilder.from(StudyCourseItem.class);
@@ -352,9 +333,9 @@ public class StudyServiceImpl implements IStudyService{
//只记录时间长的时候的处理
update.addFilter(FieldFilters.lt("lastStudyTime", lastStudyTime));
update.addUpdateField("lastStudyTime", lastStudyTime);
update.addUpdateField("lastTime", timestamp==null ? now : timestamp);
update.addUpdateField("lastTime", now);
scItemDao.update(update.builder());
log.info("-study-video-time-mysql保存---studyContentId = " + studyContentId);
//增加用户的学习时长,在api中调用
}
@Override

View File

@@ -1,9 +1,6 @@
package com.xboe.system.api;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
@@ -14,6 +11,11 @@ import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xboe.core.SysConstant;
import com.xboe.standard.BaseConstant;
import com.xboe.system.assist.entity.XUploadResultDto;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.MultimediaInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -115,8 +117,23 @@ public class SysUploaderApi extends ApiBaseController{
// ex.printStackTrace();
log.error("处理失败",ex);
}
return wrap(xur);
Long ls = 0L;
XUploadResultDto dto=new XUploadResultDto();
String fileFullPath = SysConstant.getConfigValue(BaseConstant.CONFIG_UPLOAD_FILES_SAVEPATH) + xur.getFilePath();
try {
Encoder encoder = new Encoder();
MultimediaInfo m = encoder.getInfo(new File(fileFullPath));
ls = m.getDuration() / 1000;//秒
}catch (Exception e){
e.printStackTrace();
log.error("读取视频时长错误");
}
dto.setDuration(ls);
dto.setDisplayName(xur.getDisplayName());
dto.setFilePath(xur.getFilePath());
dto.setFileType(xur.getFileType());
dto.setHttpPath(xur.getHttpPath());
return wrap(dto);
} catch (Exception e) {
log.error("upload file error ",e);

View File

@@ -0,0 +1,9 @@
package com.xboe.system.assist.entity;
import com.xboe.core.upload.XUploadResult;
import lombok.Data;
@Data
public class XUploadResultDto extends XUploadResult {
private Long duration;
}

View File

@@ -1,105 +1,159 @@
boe:
domain: http://192.168.0.253
spring:
# application.yml
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
web:
resources:
static-locations: file:E:/Projects/BOE/java/static
cloud:
nacos:
discovery:
server-addr: 192.168.0.253:8848
config:
server-addr: 192.168.0.253:8848
max-file-size: 500MB
max-request-size: 500MB
redis:
database: 1
host: 192.168.0.253
host: 192.168.0.101
password: boe@123
port: 6379
lettuce:
pool:
max-active: 8
min-idle: 0
max-idle: 30
max-wait: 10000ms
shutdown-timeout: 100ms
jpa:
database: MYSQL
properties:
hibernate:
naming_strategy: org.hibernate.cfg.EJB3NamingStrategy
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext
show-sql: true
hibernate:
ddl-auto: none
ddl-auto: update
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.0.253:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.0.101:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
username: root
password: boe#1234A
type: com.zaxxer.hikari.HikariDataSource
hikari:
auto-commit: true
minimum-idle: 5
idle-timeout: 60000
connection-timeout: 30000
max-lifetime: 1800000
maximum-pool-size: 20
logging:
level:
org:
hibernate:
SQL: ERROR
config: classpath:log/logback-@profileActive@.xml
web:
resources:
static-locations: file:E:/Projects/BOE/10/static
server:
port: 9090
servlet:
multipart:
max-file-size: 500MB
max-request-size: 500MB
session:
timeout: 30m
encoding:
charset: UTF-8
enabled: true
force: true
tomcat:
uri-encoding: UTF-8
servlet:
multipart:
maxFileSize: 1024MB
maxRequestSize: 1024MB
mvc:
static-path-pattern: /cdn/**
#logging.level.org.hibernate.SQL=DEBUG
#logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
#logging.config=classpath:log/logback-@profileActive@.xml
# logging:
# config: classpath:log/logback-${spring.profiles.active}.xml
# level:
# org:
# hibernate:
# SQL: DEBUG
# type:
# descriptor:
# sql:
# BasicBinder: TRACE
xcaching:
specs:
favorites:
timeout: 10s
praises:
timeout: 10s
shares:
timeout: 10s
xboe:
api:
cross_filter: true
local:
dev: true
upload:
file:
temp_path: /tmp
temp_path: D:/Projects/BOE/10/static/temp
save_path: /home/www/elearning/upload
http_path: http://192.168.0.253/upload
http_path: http://127.0.0.1/upload
externalinterface:
url:
system: http://127.0.0.1:9091
system: http://localhost:9091
old:
base:
url: http://192.168.0.253
url: http://192.168.0.101
server:
userbasic:
url: http://192.168.0.101/userbasic
stat:
base:
url: http://127.0.0.1:9080
server:
userbasic:
url: http://192.168.0.253/userbasic
elasticsearch:
server:
ip: 192.168.0.253
ip: 192.168.0.101
port: 9200
user:
password:
email:
url: http://192.168.0.253/api/b1/email/send
url: http://192.168.0.101/api/b1/email/send
from: boeu_learning@boe.com.cn
user:
security:
jasypt:
encryptor:
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
image:
course:
default: http://192.168.0.253/pc/images/bgimg/course.png
xxl:
job:
accessToken: 65ddc683-22f5-83b4-de3a-3c97a0a29af0
admin:
addresses: http://192.168.0.253/jobAdmin
executor:
appname: java-servers-job-api
port: 9995
address:
ip:
logpath: /var/log/xxl-job/dw/
logretentiondays: 30
aop-log-record:
#是否开启日志记录
enabled: true
#不进行拦截的包或者类
excludeClassNames:
activemq:
broker-url: tcp://192.168.0.253:61616
user: admin
password: admin
elasticsearch:
host: 192.168.0.253
port: 9200
jasypt:
encryptor:
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
boe:
domain: http://127.0.0.1
ok:
http:
connect-timeout: 30
read-timeout: 30
write-timeout: 30
max-idle-connections: 200
keep-alive-duration: 300
orgTree:
orgTreeList: ${boe.domain}/userbasic/org/list
orgChildTreeList: ${boe.domain}/userbasic/org/childOrgs
userBasic:
searchUserList: ${boe.domain}/userbasic/user/list
getUserBasicInfo: ${boe.domain}/userbasic/user/getUserBasicInfo
getTeacherIds: ${boe.domain}/userbasic/user/getTeacherInfo
audience:
usersByAudienceList: ${boe.domain}/userbasic/audience/memberList
getOrgUsers: ${boe.domain}/userbasic/user/getOrgUsers
statApi:
userdynamicList: ${boe.domain}/statApi/xboe/m/stat/userdynamic/list
infrasApi:
dict: ${boe.domain}/infrasApi/dict/list
manageApi:
stu:
offcourse: ${boe.domain}/manageApi/stu/offcourse/getOffCourseId
editExam: ${boe.domain}/manageApi/admin/project/editExam
getStudyStatus: ${boe.domain}/manageApi/stu/project/completeStatus
coursesuilt:
getStudyStatus: ${boe.domain}/manageApi/stu/project/completeStatus

View File

@@ -1,183 +0,0 @@
spring:
# application.yml
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
cloud:
nacos:
discovery:
server-addr: 10.251.129.51:8848
config:
server-addr: 10.251.129.51:8848
redis:
database: 1
host: 10.251.129.122
password: qwert!W588
port: 6379
lettuce:
pool:
max-active: 8
min-idle: 0
max-idle: 30
max-wait: 10000ms
shutdown-timeout: 100ms
jpa:
database: MYSQL
properties:
hibernate:
naming_strategy: org.hibernate.cfg.EJB3NamingStrategy
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext
show-sql: true
hibernate:
ddl-auto: update
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.251.129.126:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
username: admin
password: boeRds01
web:
resources:
static-locations: file:E:/Projects/BOE/10/static
server:
port: 9090
tomcat:
uri-encoding: UTF-8
servlet:
multipart:
maxFileSize: 1024MB
maxRequestSize: 1024MB
mvc:
static-path-pattern: /cdn/**
#logging.level.org.hibernate.SQL=DEBUG
#logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
#logging.config=classpath:log/logback-@profileActive@.xml
# logging:
# config: classpath:log/logback-${spring.profiles.active}.xml
# level:
# org:
# hibernate:
# SQL: DEBUG
# type:
# descriptor:
# sql:
# BasicBinder: TRACE
xcaching:
specs:
favorites:
timeout: 10s
praises:
timeout: 10s
shares:
timeout: 10s
xboe:
api:
cross_filter: true
local:
dev: true
upload:
file:
temp_path: /tmp
save_path: /home/www/elearning/upload
http_path: http://10.251.132.75/upload
externalinterface:
url:
system: http://localhost:9091
old:
base:
url: http://10.251.132.75
server:
userbasic:
url: http://10.251.132.75/userbasic
stat:
base:
url: http://10.251.132.75:9080
elasticsearch:
server:
ip: 10.251.129.21
port: 9200
user:
password:
email:
url: http://10.251.132.75/api/b1/email/send
from: boeu_learning@boe.com.cn
user:
security:
image:
course:
default: http://10.251.132.75/pc/images/bgimg/course.png
jasypt:
encryptor:
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
boe:
domain: http://10.251.132.75
ok:
http:
connect-timeout: 30
read-timeout: 30
write-timeout: 30
max-idle-connections: 200
keep-alive-duration: 300
orgTree:
orgTreeList: ${boe.domain}/userbasic/org/list
orgChildTreeList: ${boe.domain}/userbasic/org/childOrgs
userBasic:
searchUserList: ${boe.domain}/userbasic/user/list
getUserBasicInfo: ${boe.domain}/userbasic/user/getUserBasicInfo
getTeacherIds: ${boe.domain}/userbasic/user/getTeacherInfo
audience:
usersByAudienceList: ${boe.domain}/userbasic/audience/memberList
getOrgUsers: ${boe.domain}/userbasic/user/getOrgUsers
statApi:
userdynamicList: ${boe.domain}/statApi/xboe/m/stat/userdynamic/list
infrasApi:
dict: ${boe.domain}/infrasApi/dict/list
manageApi:
stu:
offcourse: ${boe.domain}/manageApi/stu/offcourse/getOffCourseId
editExam: ${boe.domain}/manageApi/admin/project/editExam
getStudyStatus: ${boe.domain}/manageApi/stu/project/completeStatus
coursesuilt:
getStudyStatus: ${boe.domain}/manageApi/stu/project/completeStatus
xxl:
job:
admin:
addresses: http://10.251.132.75/jobAdmin
accessToken: 65ddc683-22f5-83b4-de3a-3c97a0a29af0
executor:
appname: java-servers-job-api
port: 9995
address:
ip:
logpath: /var/log/xxl-job/system/
logretentiondays: 30
aop-log-record:
#是否开启日志记录
enabled: true
#不进行拦截的包或者类
excludeClassNames:
activemq:
broker-url: tcp://10.251.129.51:61616
user: admin
password: admin
elasticsearch:
host: 10.251.129.21
port: 9200

View File

@@ -1,103 +0,0 @@
spring:
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
web:
resources:
static-locations: file:E:/Projects/BOE/java/static
cloud:
nacos:
discovery:
server-addr: 10.251.113.100:8848
config:
server-addr: 10.251.113.100:8848
redis:
database: 1
host: 10.251.88.213
password: qwert!W588
port: 6379
jpa:
hibernate:
ddl-auto: none
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://10.251.88.216:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
username: admin
password: boeRds01
type: com.zaxxer.hikari.HikariDataSource
hikari:
auto-commit: true
minimum-idle: 5
idle-timeout: 60000
connection-timeout: 30000
max-lifetime: 1800000
maximum-pool-size: 20
logging:
level:
org:
hibernate:
SQL: ERROR
config: classpath:log/logback-@profileActive@.xml
xboe:
api:
cross_filter: true
upload:
file:
temp_path: /tmp
save_path: /home/www/elearning/upload
http_path: https://u.boe.com/upload
externalinterface:
url:
system: http://127.0.0.1:9091
old:
base:
url: https://u.boe.com
stat:
base:
url: http://127.0.0.1:9080
server:
userbasic:
url: https://u.boe.com/userbasic
elasticsearch:
server:
ip: 10.251.88.218
port: 9200
user:
password:
email:
url: https://u.boe.com/api/b1/email/send
from: boeu_learning@boe.com.cn
user:
security:
jasypt:
encryptor:
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
image:
course:
default: https://u.boe.com/pc/images/bgimg/course.png
xxl:
job:
accessToken: 65ddc683-22f5-83b4-de3a-3c97a0a29af0
admin:
addresses: http://u.boe.com/jobAdmin
executor:
appname: java-servers-job-api
port: 9995
address:
ip:
logpath: /var/log/xxl-job/dw/
logretentiondays: 30
aop-log-record:
#是否开启日志记录
enabled: true
#不进行拦截的包或者类
excludeClassNames:
activemq:
broker-url: tcp://10.251.113.100:61616
user: admin
password: admin
elasticsearch:
host: 10.251.88.218
port: 9200

View File

@@ -2,17 +2,11 @@ spring:
# application.yml
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
cloud:
nacos:
discovery:
server-addr: 10.251.186.27:8848
config:
server-addr: 10.251.186.27:8848
max-file-size: 500MB
max-request-size: 500MB
redis:
database: 1
host: 10.251.160.38
host: 10.251.186.27
password: qwert!W577
port: 6379
lettuce:
@@ -42,6 +36,16 @@ spring:
static-locations: file:E:/Projects/BOE/10/static
server:
port: 9090
servlet:
multipart:
max-file-size: 500MB
max-request-size: 500MB
session:
timeout: 30m
encoding:
charset: UTF-8
enabled: true
force: true
tomcat:
uri-encoding: UTF-8
servlet:
@@ -82,42 +86,40 @@ xboe:
dev: true
upload:
file:
temp_path: /tmp
temp_path: /Projects/BOE/10/static/temp
save_path: /home/www/elearning/upload
http_path: https://u-pre.boe.com/upload
http_path: http://127.0.0.1/upload
externalinterface:
url:
system: http://localhost:9091
old:
base:
url: http://10.251.186.27
url: http://localhost
server:
userbasic:
url: http://10.251.186.27/userbasic
url: http://localhost/userbasic
stat:
base:
url: http://10.251.186.27:9080
url: http://localhost:9080
elasticsearch:
server:
ip: 10.251.129.25
port: 9200
user: elastic
password: Boe@es123
user:
password:
email:
url: http://10.251.186.27/api/b1/email/send
url: http://localhost/api/b1/email/send
from: boeu_learning@boe.com.cn
user:
security:
image:
course:
default: https://u-pre.boe.com/pc/images/bgimg/course.png
jasypt:
encryptor:
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
boe:
domain: http://10.251.186.27
domain: http://127.0.0.1
ok:
http:
@@ -154,32 +156,4 @@ manageApi:
editExam: ${boe.domain}/manageApi/admin/project/editExam
getStudyStatus: ${boe.domain}/manageApi/stu/project/completeStatus
coursesuilt:
getStudyStatus: ${boe.domain}/manageApi/stu/project/completeStatus
xxl:
job:
admin:
addresses: http://10.251.186.27/jobAdmin
accessToken: 65ddc683-22f5-83b4-de3a-3c97a0a29af0
executor:
appname: java-servers-job-api
port: 9995
address:
ip:
logpath: /var/log/xxl-job/system/
logretentiondays: 30
aop-log-record:
#是否开启日志记录
enabled: true
#不进行拦截的包或者类
excludeClassNames:
activemq:
broker-url: tcp://10.251.129.25:61616
user: admin
password: admin
elasticsearch:
host: 10.251.129.25
port: 9200
user: elastic
password: Boe@es123
getStudyStatus: ${boe.domain}/manageApi/stu/project/completeStatus

View File

@@ -1,35 +1,41 @@
spring:
profiles:
active: dev
application:
name: boe-server-all
# application.yml
servlet:
multipart:
max-file-size: 500MB
max-request-size: 500MB
redis:
database: 1
host: 10.251.186.27
password: qwert!W577
port: 6379
lettuce:
pool:
max-active: 8
min-idle: 0
max-idle: 30
max-wait: 10000ms
shutdown-timeout: 100ms
jackson:
time-zone: GMT+8
mvc:
static-path-pattern: /cdn/**
shutdown-timeout: 100ms
jpa:
database: MYSQL
show-sql: false
properties:
hibernate:
naming_strategy: org.hibernate.cfg.EJB3NamingStrategy
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
logging:
config: classpath:log/logback-${spring.profiles.active}.xml
show-sql: true
hibernate:
ddl-auto: update
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.251.160.40:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
username: admin
password: boeRds01
web:
resources:
static-locations: file:E:/Projects/BOE/10/static
server:
port: 9090
tomcat:
uri-encoding: UTF-8
servlet:
multipart:
max-file-size: 500MB
@@ -40,6 +46,80 @@ server:
charset: UTF-8
enabled: true
force: true
tomcat:
uri-encoding: UTF-8
servlet:
multipart:
maxFileSize: 1024MB
maxRequestSize: 1024MB
mvc:
static-path-pattern: /cdn/**
#logging.level.org.hibernate.SQL=DEBUG
#logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
#logging.config=classpath:log/logback-@profileActive@.xml
# logging:
# config: classpath:log/logback-${spring.profiles.active}.xml
# level:
# org:
# hibernate:
# SQL: DEBUG
# type:
# descriptor:
# sql:
# BasicBinder: TRACE
xcaching:
specs:
favorites:
timeout: 10s
praises:
timeout: 10s
shares:
timeout: 10s
xboe:
api:
cross_filter: true
local:
dev: true
upload:
file:
temp_path: /Projects/BOE/10/static/temp
save_path: /home/www/elearning/upload
http_path: http://127.0.0.1/upload
externalinterface:
url:
system: http://localhost:9091
old:
base:
url: http://localhost
server:
userbasic:
url: http://localhost/userbasic
stat:
base:
url: http://localhost:9080
elasticsearch:
server:
ip: 10.251.129.25
port: 9200
user:
password:
email:
url: http://localhost/api/b1/email/send
from: boeu_learning@boe.com.cn
user:
security:
jasypt:
encryptor:
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
boe:
domain: http://127.0.0.1
ok:
http:
@@ -48,29 +128,32 @@ ok:
write-timeout: 30
max-idle-connections: 200
keep-alive-duration: 300
boe:
domain: http://127.0.0.1
orgTree:
orgTreeList: ${boe.domain}/userbasic/org/list
orgChildTreeList: ${boe.domain}/userbasic/org/childOrgs
userBasic:
searchUserList: ${boe.domain}/userbasic/user/list
getTeacherIds: ${boe.domain}/userbasic/user/getTeacherInfo
getUserBasicInfo: ${boe.domain}/userbasic/user/getUserBasicInfo
getTeacherIds: ${boe.domain}/userbasic/user/getTeacherInfo
audience:
usersByAudienceList: ${boe.domain}/userbasic/audience/memberList
getOrgUsers: ${boe.domain}/userbasic/user/getOrgUsers
statApi:
userdynamicList: ${boe.domain}/statApi/xboe/m/stat/userdynamic/list
infrasApi:
dict: ${boe.domain}/infrasApi/dict/list
manageApi:
stu:
offcourse: ${boe.domain}/manageApi/stu/offcourse/getOffCourseId
editExam: ${boe.domain}/manageApi/admin/project/editExam
coursesuilt:
getStudyStatus: ${boe.domain}/manageApi/stu/project/completeStatus
updateOrSaveCourse: ${boe.domain}/manageApi/admin/teacherRecord/updateOrSaveCourse
syncCourseStudent: ${boe.domain}/manageApi/admin/teacherRecord/syncCourseStudent
syncOnLineScore: ${boe.domain}/manageApi/admin/teacherRecord/syncOnLineScore
updateOnLineStatua: ${boe.domain}/manageApi/admin/teacherRecord/updateOnLineStatua
coursesuilt:
getStudyStatus: ${boe.domain}/manageApi/stu/project/completeStatus

View File

@@ -0,0 +1,24 @@
spring:
application:
name: boe-server-all
# profiles:
# active: test
cloud:
nacos:
discovery:
server-addr: 10.251.186.27:8848
config:
server-addr: 10.251.186.27:8848
# file-extension: yaml
# namespace: fd5741ee-c2aa-4002-a9b0-43a11436d35c
# name: boe-server-all
# group: SERVER_GROUP
# extension-configs:
# - data-id: redis0.yaml
# group: COMMON_GROUP
# refresh: true
# shared-configs:
# - data-id: redis0.yaml
# group: COMMON_GROUP
# refresh: true

View File

@@ -52,7 +52,4 @@
<appender-ref ref="debug"/>
<appender-ref ref="error"/>
</root>
<root level="INFO">
<appender-ref ref="console"/>
</root>
</configuration>

View File

@@ -50,7 +50,6 @@
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="INFO">
<appender-ref ref="info"/>
<appender-ref ref="console"/>
<!-- <appender-ref ref="error"/> -->
</root>
</configuration>

View File

@@ -1,56 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">
<springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/>
<property name="log.path" value="/home/logs/${spring.application.name}"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.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"/>
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- Log file debug output -->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
</appender>
<!-- Log file error output -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="INFO">
<appender-ref ref="info"/>
<!-- <appender-ref ref="console"/>-->
<!-- <appender-ref ref="error"/> -->
</root>
</configuration>

View File

@@ -51,6 +51,5 @@
<root level="INFO">
<appender-ref ref="debug"/>
<appender-ref ref="error"/>
<appender-ref ref="console"/>
</root>
</configuration>

View File

@@ -98,7 +98,7 @@
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>application-*.yml</include>
<include>application-${profileActive}.yml</include>
<include>application.yml</include>
</includes>
</resource>
@@ -136,9 +136,9 @@
</build>
<profiles>
<profile>
<id>prod</id>
<id>pro</id>
<properties>
<profileActive>prod</profileActive>
<profileActive>pro</profileActive>
</properties>
</profile>
<profile>

View File

@@ -1,13 +1,13 @@
# application-pro.yml
# application-dev.yml
spring:
redis:
database: 1
host: 192.168.0.253
password: boe@123
database: 2
port: 6379
host: 192.168.0.101
password: boe@123
jpa:
hibernate:
ddl-auto: update
ddl-auto: none
open-in-view: false
properties:
hibernate:
@@ -16,46 +16,41 @@ spring:
driverClassName: com.mysql.jdbc.Driver
db1:
driverClassName: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://192.168.0.253:3306/boe_basic?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
jdbc-url: jdbc:mysql://192.168.0.101:3306/boe_basic?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
username: root
password: boe#1234A
db2:
driverClassName: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://192.168.0.253:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
jdbc-url: jdbc:mysql://192.168.0.101:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
username: root
password: boe#1234A
web:
resources:
static-locations: file:E:/Projects/BOE/java/static
web:
resources:
static-locations: file:E:/Projects/BOE/java/static
logging:
level:
org:
hibernate:
SQL: ERROR
# type:
# descriptor:
# sql:
# BasicBinder: TRACE
SQL: DEBUG
type:
descriptor:
sql:
BasicBinder: TRACE
config: classpath:log/logback-dev.xml
xboe:
api:
cross_filter: true
upload:
file:
temp_path: /tmp
save_path: /home/www/elearning/upload
http_path: http://192.168.0.253/upload
temp_path: E:/Projects/BOE/java/static/temp
save_path: E:/Projects/BOE/java/static/upload
http_path: http://localhost:9090/upload
inner:
data:
sync:
baseurl: http://127.0.0.1:9090
baseurl: http://localhost:9090
jasypt:
encryptor:
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
iv-generator-classname: org.jasypt.iv.NoIvGenerator

View File

@@ -1,7 +1,9 @@
# application-pro.yml
spring:
profiles:
active: pro
redis:
database: 1
database: 3
host: 10.251.88.213
password: qwert!W588
port: 6379

View File

@@ -1,7 +1,7 @@
# application.yml
spring:
profiles:
active: dev
active: @profileActive@
application:
name: boe-server-basic
jackson:
@@ -62,4 +62,4 @@ ok:
# 设置logback.xml位置
logging:
config: classpath:log/logback-${spring.profiles.active}.xml
config: classpath:log/logback-@profileActive@.xml

View File

@@ -1,55 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">
<springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/>
<property name="log.path" value="/home/logs/${spring.application.name}"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.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"/>
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- Log file debug output -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
</appender>
<!-- Log file error output -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="WARN">
<appender-ref ref="debug"/>
<appender-ref ref="error"/>
</root>
</configuration>