提交 748992ec 编写于 作者: 夏天飘过的风's avatar 夏天飘过的风

Merge branches 'deploy' and 'dev' of http://gitlab.roncoos.com/opens/roncoo-education into deploy

 Conflicts:
	roncoo-education-user/roncoo-education-user-service/src/main/java/com/roncoo/education/user/service/api/biz/ApiUserInfoBiz.java

要显示的变更太多。

To preserve performance only 1000 of 1000+ files are displayed.
### 版本升级日志
---
###### v10.0.0-RELEASE
1. 增加视频类型和存储类型的说明
2. 增加工程的模块说明
3. 切换网关组件为Spring CLoud Gateway
4. 增加nacos_cofig.zip配置,nacos可以一键导入
5. 将file_storage的表file_type修改为file_classify
1. 升级spring boot主版本,多个组件版本升级
2. 全新架构,重构项目结构
3. 增加视频类型和存储类型的说明,增加minio支持
4. 切换网关组件为Spring CLoud Gateway
5. 增加nacos_cofig.zip配置,nacos可以一键导入
6. 将file_storage的表file_type修改为file_classify
---
###### v9.0.0-RELEASE
......
#### 端口设置
| 服务名称 | 服务端口 |
| service | port |
| --------------------------------- | --------------- |
| roncoo-education-app-eureka | 5761 |
| roncoo-education-app-confg | 5741 |
| roncoo-education-app-sba | 5721 |
| roncoo-education-app-job | 5820 |
| roncoo-education-app-gateway | 5840 |
| roncoo-education-system | 5730 |
| roncoo-education-user | 5720 |
| roncoo-education-course | 5710 |
| roncoo-education-app-gateway | 5840 |
| roncoo-education-app-job | 5820 |
| roncoo-education-app-sba | 5800 |
| roncoo-education-system | 5710 |
| roncoo-education-user | 5720 |
| roncoo-education-course | 5730 |
-------------------------------------------------------
#### 如何进行docker部署
```
1. maven打包
# mvn clean package
2. 利用docker-compose构建
# docker-compose build
3. 启动docker-compose
# docker-compose up -d
```
> 特别说明:请提前配置好MySQL、Redis、Elasticsearch
> 配置文件在 **./roncoo-education-app-config/src/main/resources/config**
The MIT License (MIT)
Copyright © 2019 lingke
Copyright © 2016 LingKe, Co., Ltd.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
<div align=center><img src="logo.jpg"/></div>
```
roncoo-education
├── roncoo-education-app-gateway 网关服务:所有请求的入口,主要实现权限校验和请求转发
├── roncoo-education-app-job 定时任务:实现分布式任务调度功能,主要实现订单超时处理等
├── roncoo-education-app-sba 应用监控:基于Spring Boot Admin(不启动,不影响功能)
├── roncoo-education-app-course 课程服务
├── roncoo-education-app-system 系统服务
├── roncoo-education-app-user 用户服务
└── roncoo-education-util 公共工具类,抽取的工具类包
```
### 项目分支使用组件说明
| 名称 | 主分支(Alibaba分支) | Nextfile分支 |
|:---|:---|:---|
| 核心组件 | spring cloud alibaba 2.2.3.RELEASE | spring cloud netflix Hoxton.SR3 |
| 注册中心 | spring cloud alibaba nacos | spring cloud netflix eureka |
| 配置中心 | spring cloud alibaba nacos | spring cloud config |
| 服务熔断 | spring cloud alibaba sentinel | spring cloud netflix hystrix |
| 服务网关 | spring cloud gateway | spring cloud netflix zuul |
---
##### 领课教育系统(roncoo-education):[CodeChina](https://codechina.csdn.net/roncoocom/roncoo-education) | [码云地址](https://gitee.com/roncoocom/roncoo-education) | [Github地址](https://github.com/roncoo/roncoo-education)
> roncoo-education是后台工程,核心框架:Spring Cloud
##### 前端门户工程(roncoo-education-web):[CodeChina](https://codechina.csdn.net/roncoocom/roncoo-education-web) | [码云地址](https://gitee.com/roncoocom/roncoo-education-web) | [Github地址](https://github.com/roncoo/roncoo-education-web)
> roncoo-education-web是前端门户工程,核心框架:Vuejs + Nuxt.js
##### 后台管理工程(roncoo-education-admin):[CodeChina](https://codechina.csdn.net/roncoocom/roncoo-education-admin) | [码云地址](https://gitee.com/roncoocom/roncoo-education-admin) | [Github地址](https://github.com/roncoo/roncoo-education-admin)
> roncoo-education-admin是后台管理工程,核心框架:vue-element-admin
---
### 演示地址
* [前端演示地址](http://edu.os.roncoo.com/) | [后台演示地址](http://edu.os.roncoo.com/admin)
### 帮助文档(如果对你有用,请给个star!)
* [项目文档](http://doc.os.roncoos.com/) | [常见问题](https://blog.roncoo.com/article/1105309620724858882) | [部署文档](https://blog.roncoo.com/article/1103554925858197505)
* [MySQL安装](https://blog.roncoo.com/article/1280781211745636354) | [Redis安装](https://blog.roncoo.com/article/1281402533735550977) | [Elasticsearch安装](https://blog.roncoo.com/article/1281405654742323202) | [FastDFS安装](https://blog.roncoo.com/article/1275251133292867586)
---
<div align=center>
<img src="logo.jpg" alt="领课教育系统-开源版"/>
<div align=center>
<a href="http://spring.io/projects/spring-boot">
<img src="https://img.shields.io/badge/spring--boot-2.3.5-blue.svg" alt="spring-boot">
</a>
<a href="https://spring.io/projects/spring-cloud-alibaba">
<img src="https://img.shields.io/badge/spring--cloud--alibaba-2.2.6-blue.svg" alt="mybatis-plus">
</a>
</div>
</div>
### 项目介绍
领课教育系统(roncoo-education)是基于领课网络多年的在线教育平台开发和运营经验打造出来的产品,致力于打造一个各行业都适用的分布式在线教育系统。系统采用前后端分离模式,前台采用vue.js为核心框架,后台采用Spring Cloud为核心框架。系统目前主要功能有课程点播功能,支持多家视频云的接入,课程附件管理功能,支持多家存储云的接入,讲师管理功能,支持讲师入驻功能,可以帮助个人或者企业快速搭建一个轻量级的在线教育平台。
......@@ -70,6 +34,22 @@ roncoo-education
* 广告管理功能,后台自定义广告设置,增加营销效果
* 支付功能模块,无缝对接 [龙果支付系统商业版](https://pay.roncoo.net/)
---
##### 领课教育系统(roncoo-education):[码云地址](https://gitee.com/roncoocom/roncoo-education) | [Github地址](https://github.com/roncoo/roncoo-education) | [CodeChina](https://codechina.csdn.net/roncoocom/roncoo-education)
> roncoo-education是后台工程,核心框架:Spring Cloud Alibaba
##### 前端门户工程(roncoo-education-web): [码云地址](https://gitee.com/roncoocom/roncoo-education-web) | [Github地址](https://github.com/roncoo/roncoo-education-web) | [CodeChina](https://codechina.csdn.net/roncoocom/roncoo-education-web)
> roncoo-education-web是前端门户工程,核心框架:Vuejs + Nuxt.js
##### 后台管理工程(roncoo-education-admin):[码云地址](https://gitee.com/roncoocom/roncoo-education-admin) | [Github地址](https://github.com/roncoo/roncoo-education-admin) | [CodeChina](https://codechina.csdn.net/roncoocom/roncoo-education-admin)
> roncoo-education-admin是后台管理工程,核心框架:vue-element-admin
### 演示地址
* [前端门户演示地址:https://eduos.roncoo.net/](https://eduos.roncoo.net/)
* [后台管理演示地址:https://eduos.roncoo.net/admin](https://eduos.roncoo.net/admin)
* [项目帮助文档地址:https://eduos.roncoo.net/doc](https://eduos.roncoo.net/doc)
### 官方QQ群(加群免费获取sql脚本)
<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=BpOlarqoFOUReMfHsinOBDrFJhVln6LO&jump_from=webapi"><img border="0" src="http://pub.idqqimg.com/wpa/images/group.png" alt="在线教育系统-领课⑪" title="在线教育系统-领课⑪"> 624670981</a> 可加
......
......@@ -4,7 +4,7 @@ services:
build:
context: ./roncoo-education-app-sba
args:
JAVA_OPTS: '-Xmn128M -Xmx512M'
JAVA_OPTS: '-Xmn256M -Xmx256M'
RUN_ARGS: '--spring.profiles.active=demo --spring.cloud.nacos.server-addr=192.168.100.11:8848'
image: roncoo-education-app-sba
container_name: sba
......@@ -14,12 +14,12 @@ services:
networks:
- education
ports:
- "5721:5721"
- "5800:5800"
app-job:
build:
context: ./roncoo-education-app-job
args:
JAVA_OPTS: '-Xmn128M -Xmx512M'
JAVA_OPTS: '-Xmn256M -Xmx256M'
RUN_ARGS: '--spring.profiles.active=demo --spring.cloud.nacos.server-addr=192.168.100.11:8848'
image: roncoo-education-app-job
container_name: job
......@@ -34,7 +34,7 @@ services:
build:
context: ./roncoo-education-app-gateway
args:
JAVA_OPTS: '-Xmn128M -Xmx512M'
JAVA_OPTS: '-Xmn256M -Xmx256M'
RUN_ARGS: '--spring.profiles.active=demo --spring.cloud.nacos.server-addr=192.168.100.11:8848'
image: roncoo-education-app-gateway
container_name: gateway
......@@ -49,7 +49,7 @@ services:
build:
context: ./roncoo-education-system/roncoo-education-system-service
args:
JAVA_OPTS: '-Xmn128M -Xmx512M'
JAVA_OPTS: '-Xmn256M -Xmx256M'
RUN_ARGS: '--spring.profiles.active=demo --spring.cloud.nacos.server-addr=192.168.100.11:8848'
image: roncoo-education-system-service
container_name: system
......@@ -59,12 +59,12 @@ services:
networks:
- education
ports:
- "5730:5730"
- "5710:5710"
user-service:
build:
context: ./roncoo-education-user/roncoo-education-user-service
args:
JAVA_OPTS: '-Xmn128M -Xmx512M'
JAVA_OPTS: '-Xmn256M -Xmx256M'
RUN_ARGS: '--spring.profiles.active=demo --spring.cloud.nacos.server-addr=192.168.100.11:8848'
image: roncoo-education-user-service
container_name: user
......@@ -79,7 +79,7 @@ services:
build:
context: ./roncoo-education-course/roncoo-education-course-service
args:
JAVA_OPTS: '-Xmn128M -Xmx512M'
JAVA_OPTS: '-Xmn256M -Xmx256M'
RUN_ARGS: '--spring.profiles.active=demo --spring.cloud.nacos.server-addr=192.168.100.11:8848'
image: roncoo-education-course-service
container_name: course
......@@ -89,7 +89,7 @@ services:
networks:
- education
ports:
- "5710:5710"
- "5730:5730"
networks:
education:
driver: bridge
......@@ -80,7 +80,7 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<version>2.3.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
......@@ -89,7 +89,7 @@
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
......@@ -98,7 +98,7 @@
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.3.RELEASE</version>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
......@@ -121,133 +121,13 @@
</dependency>
<dependency>
<groupId>com.roncoo</groupId>
<artifactId>roncoo-education-util</artifactId>
<artifactId>roncoo-education-common-core</artifactId>
<version>${project.version}</version>
</dependency>
<!-- fastdfs -->
<!-- https://mvnrepository.com/artifact/com.roncoo/roncoo-spring-boot-starter-fastdfs -->
<dependency>
<groupId>com.roncoo</groupId>
<artifactId>roncoo-spring-boot-starter-fastdfs</artifactId>
<version>1.2.1</version>
</dependency>
<!-- aliyun -->
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.aliyun.oas</groupId>
<artifactId>aliyun-oas</artifactId>
<version>0.2.5</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
<!-- Swagger -->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.9.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-ui</artifactId>
<version>2.0.7</version>
</dependency>
<!-- jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.2.0</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- logback -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.2</version>
</dependency>
<!-- excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<!-- ECharts -->
<dependency>
<groupId>com.github.abel533</groupId>
<artifactId>ECharts</artifactId>
<version>3.0.0.2</version>
</dependency>
<!-- hutool -->
<dependency>
<groupId>com.xiaoleilu</groupId>
<artifactId>hutool</artifactId>
<version>2.16.2</version>
</dependency>
<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.8</version>
</dependency>
<!-- jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.2</version>
</dependency>
<!-- pdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<!-- de.codecentric -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.2.4</version>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
<artifactId>roncoo-education-common-service</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
......@@ -335,9 +215,8 @@
<module>roncoo-education-app-job</module>
<!-- 监控中心 -->
<module>roncoo-education-app-sba</module>
<!-- 基础工程 -->
<module>roncoo-education-util</module>
<module>roncoo-education-common</module>
<!-- 系统管理 -->
<module>roncoo-education-system</module>
<!-- 用户管理 -->
......
......@@ -41,7 +41,7 @@
<dependency>
<groupId>com.roncoo</groupId>
<artifactId>roncoo-education-util</artifactId>
<artifactId>roncoo-education-common-core</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
......
......@@ -7,8 +7,8 @@ import reactor.core.publisher.Mono;
@RestController
public class IndexController {
@GetMapping("/")
public Mono<String> index() {
return Mono.just("SUCCESS");
}
@GetMapping("/")
public Mono<String> index() {
return Mono.just("SUCCESS");
}
}
package com.roncoo.education.app.gateway.filter;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.roncoo.education.util.base.BaseException;
import com.roncoo.education.util.enums.RedisPreEnum;
import com.roncoo.education.util.enums.ResultEnum;
import com.roncoo.education.util.tools.JWTUtil;
import com.xiaoleilu.hutool.json.JSONObject;
import com.xiaoleilu.hutool.json.JSONUtil;
import com.xiaoleilu.hutool.util.ObjectUtil;
import com.roncoo.education.common.core.base.BaseException;
import com.roncoo.education.common.core.enums.RedisPreEnum;
import com.roncoo.education.common.core.enums.ResultEnum;
import com.roncoo.education.common.core.tools.JSUtil;
import com.roncoo.education.common.core.tools.JWTUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -86,7 +87,7 @@ public class EduGlobalFilter implements GlobalFilter, Ordered {
// 校验用户是否有权限
private static Boolean checkUri(String uri, String tk) {
List<String> menuVOList1 = com.roncoo.education.util.tools.JSONUtil.parseArray(tk, String.class);
List<String> menuVOList1 = JSUtil.parseArray(tk, String.class);
if (StringUtils.hasText(uri) && uri.endsWith("/")) {
uri = uri.substring(0, uri.length() - 1);
}
......@@ -121,7 +122,7 @@ public class EduGlobalFilter implements GlobalFilter, Ordered {
bodyJson = JSONUtil.parseObj(body);
}
if (ObjectUtil.isNotNull(userNo)) {
bodyJson.put(USERNO, userNo);
bodyJson.set(USERNO, userNo);
}
return Mono.just(JSONUtil.toJsonStr(bodyJson));
});
......@@ -193,7 +194,6 @@ public class EduGlobalFilter implements GlobalFilter, Ordered {
// 更新时间,使token不过期
stringRedisTemplate.opsForValue().set(userNo.toString(), token, 1, TimeUnit.HOURS);
return userNo;
}
......
# application
spring.application.name=roncoo-education-app-gateway
# profile
spring.profiles.active=dev
spring.profiles.active=opens
# server
server.port=5840
# nacos
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.password=RonCoo.123
spring.cloud.nacos.server-addr=10.65.3.41:8848
spring.cloud.nacos.namespace=${spring.profiles.active}
spring.cloud.nacos.discovery.namespace=${spring.cloud.nacos.namespace}
spring.cloud.nacos.config.namespace=${spring.cloud.nacos.namespace}
......
......@@ -5,7 +5,6 @@ package com.roncoo.education;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableScheduling;
......
package com.roncoo.education.app.job;
import com.roncoo.education.common.core.base.BaseController;
import com.roncoo.education.system.feign.interfaces.IFeignMsg;
import com.roncoo.education.util.base.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
......
package com.roncoo.education.app.job;
import com.roncoo.education.common.core.base.BaseController;
import com.roncoo.education.course.feign.interfaces.IFeignOrderInfo;
import com.roncoo.education.util.base.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
......
package com.roncoo.education.app.job;
import cn.hutool.core.io.FileUtil;
import com.roncoo.education.common.core.base.BaseController;
import com.roncoo.education.common.core.config.SystemUtil;
import com.roncoo.education.course.feign.interfaces.IFeignCourseVideo;
import com.roncoo.education.util.base.BaseController;
import com.roncoo.education.util.config.SystemUtil;
import com.xiaoleilu.hutool.io.FileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
......
......@@ -3,13 +3,13 @@ spring.application.name=roncoo-education-app-job
# main
spring.main.allow-bean-definition-overriding=true
# profile
spring.profiles.active=dev
spring.profiles.active=opens
# server
server.port=5820
# nacos
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.password=RonCoo.123
spring.cloud.nacos.server-addr=10.65.3.41:8848
spring.cloud.nacos.namespace=${spring.profiles.active}
spring.cloud.nacos.discovery.namespace=${spring.cloud.nacos.namespace}
spring.cloud.nacos.config.namespace=${spring.cloud.nacos.namespace}
......
......@@ -25,12 +25,12 @@
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
......
# application
spring.application.name=roncoo-education-app-sba
# profile
spring.profiles.active=dev
spring.profiles.active=opens
# server
server.port=5800
# nacos
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.password=RonCoo.123
spring.cloud.nacos.server-addr=10.65.3.41:8848
spring.cloud.nacos.namespace=${spring.profiles.active}
spring.cloud.nacos.discovery.namespace=${spring.cloud.nacos.namespace}
spring.cloud.nacos.discovery.metadata.management.context-path=${server.servlet.context-path}/actuator
......
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<springProperty name="springApplicationName" source="spring.application.name" defaultValue="roncoo-education"/>
<springProperty name="FILE_PATH" source="management.endpoint.logfile.external-file" defaultValue="/home/roncoo/logs"/>
<springProperty name="springApplicationName" source="spring.application.name" defaultValue="roncoo-education"/>
<springProperty name="FILE_PATH" source="management.endpoint.logfile.external-file"
defaultValue="/home/roncoo/logs"/>
<property name="PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n"/>
<!-- 开发环境 -->
<springProfile name="local">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<!-- 开发环境 -->
<springProfile name="local">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="CONSOLE" />
</root>
</springProfile>
<root level="info">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
<!-- 测试环境 -->
<!-- 测试环境 -->
<springProfile name="dev,test">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
......@@ -45,27 +46,27 @@
</appender>
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="TEST-FILE" />
<appender-ref ref="CONSOLE"/>
<appender-ref ref="TEST-FILE"/>
</root>
</springProfile>
<!-- 生产环境 -->
<springProfile name="prod">
<appender name="PROD_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${FILE_PATH}/warn</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${FILE_PATH}/warn.%d{yyyy-MM-dd}.log
</fileNamePattern>
<MaxHistory>100</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${PATTERN}</pattern>
</layout>
</appender>
<!-- 生产环境 -->
<springProfile name="prod">
<appender name="PROD_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${FILE_PATH}/warn</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${FILE_PATH}/warn.%d{yyyy-MM-dd}.log
</fileNamePattern>
<MaxHistory>100</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${PATTERN}</pattern>
</layout>
</appender>
<root level="warn">
<appender-ref ref="PROD_FILE" />
</root>
</springProfile>
<root level="warn">
<appender-ref ref="PROD_FILE"/>
</root>
</springProfile>
</configuration>
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.roncoo</groupId>
<artifactId>roncoo-education</artifactId>
<version>10.0.0-RELEASE</version>
</parent>
<artifactId>roncoo-education-common</artifactId>
<packaging>pom</packaging>
<name>roncoo-education-common</name>
<modules>
<module>roncoo-education-common-core</module>
<module>roncoo-education-common-service</module>
</modules>
</project>
<?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>
<groupId>com.roncoo</groupId>
<artifactId>roncoo-education-common</artifactId>
<version>10.0.0-RELEASE</version>
</parent>
<artifactId>roncoo-education-common-core</artifactId>
<name>roncoo-education-common-core</name>
<dependencies>
<!-- aliyun oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.11.2</version>
</dependency>
<!-- aliyun -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.10</version>
</dependency>
<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.8</version>
</dependency>
<!-- jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.3</version>
</dependency>
<!-- excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<!-- ECharts -->
<dependency>
<groupId>com.github.abel533</groupId>
<artifactId>ECharts</artifactId>
<version>3.0.0.6</version>
</dependency>
<!-- jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.1</version>
</dependency>
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.9.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-ui</artifactId>
<version>2.0.7</version>
</dependency>
<!-- org.apache.httpcomponents -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<!-- log -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.4</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<targetPath>${project.build.directory}/classes</targetPath>
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources/config/${env}</directory>
<targetPath>${project.build.directory}/classes</targetPath>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
package com.roncoo.education.common.core.aliyun;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author wujing
*/
@Data
@Accessors(chain = true)
public class Aliyun implements Serializable {
private static final long serialVersionUID = 1L;
private String polyvUseid;
private String polyvWritetoken;
private String polyvReadtoken;
private String polyvSecretkey;
private String aliyunAccessKeyId;
private String aliyunAccessKeySecret;
private String aliyunOssUrl;
private String aliyunOssBucket;
private String aliyunOssEndpoint;
private String aliyunOasVault;
private String payUrl;
private String payKey;
private String paySecret;
private String notifyUrl;
private String smsCode;
private String signName;
}
package com.roncoo.education.common.core.aliyun;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.roncoo.education.common.core.config.SystemUtil;
import com.roncoo.education.common.core.enums.PlatformEnum;
import com.roncoo.education.common.core.tools.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
@Slf4j
public final class AliyunUtil {
private AliyunUtil() {
}
public static String getUrlSign(Aliyun aliyun, String url, Date expires) {
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(aliyun.getAliyunOssBucket(), url.replace(aliyun.getAliyunOssUrl(), ""));
generatePresignedUrlRequest.setExpiration(expires);
return url + "?" + getOssClient(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret()).generatePresignedUrl(generatePresignedUrlRequest).getQuery();
}
public static File download(Aliyun aliyun, String url) {
String key = check(url, aliyun.getAliyunOssUrl());
File file = new File(SystemUtil.PIC_PATH + url.substring(url.lastIndexOf("/")));
if (file.exists()) {
return file;
}
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try {
downloadObject(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret(), aliyun.getAliyunOssBucket(), key, file);
} catch (IOException e) {
log.error("上传失败", e);
}
return file;
}
public static String uploadPic(PlatformEnum platformEnum, File file, Aliyun aliyun) {
// 上传
try {
String name = file.getName();
String filePath = platformEnum.name().toLowerCase() + "/" + StrUtil.get32UUID() + name.substring(name.lastIndexOf("."));
getOssClient(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret()).putObject(aliyun.getAliyunOssBucket(), filePath, file);
return aliyun.getAliyunOssUrl() + filePath;
} catch (Exception e) {
log.error("上传失败", e);
return "";
}
}
public static String uploadPic(PlatformEnum platformEnum, MultipartFile file, Aliyun aliyun) {
// 上传
InputStream in = null;
try {
in = file.getInputStream();
String name = file.getOriginalFilename();
String filePath = platformEnum.name().toLowerCase() + "/" + StrUtil.get32UUID() + name.substring(name.lastIndexOf("."));
getOssClient(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret()).putObject(aliyun.getAliyunOssBucket(), filePath, in);
return aliyun.getAliyunOssUrl() + filePath;
} catch (Exception e) {
log.error("上传失败", e);
return "";
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
}
public static String uploadDoc(PlatformEnum platformEnum, File file, Aliyun aliyun) {
// 上传
try {
String name = file.getName();
String filePath = platformEnum.name().toLowerCase() + "/" + StrUtil.get32UUID() + name.substring(name.lastIndexOf("."));
putObjectForFile(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret(), aliyun.getAliyunOssBucket(), filePath, new FileInputStream(file), file.getName());
return aliyun.getAliyunOssUrl() + filePath;
} catch (Exception e) {
log.error("上传失败", e);
return "";
}
}
public static String uploadVideo(PlatformEnum platformEnum, File file, Aliyun aliyun) {
// 上传
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
String name = file.getName();
String filePath = platformEnum.name().toLowerCase() + "/" + StrUtil.get32UUID() + name.substring(name.lastIndexOf("."));
putObjectForFile(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret(), aliyun.getAliyunOasVault(), filePath, fileInputStream, file.getName());
return aliyun.getAliyunOssUrl() + filePath;
} catch (Exception e) {
log.error("上传失败", e);
return "";
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
log.error("上传失败", e);
}
}
}
}
public static String uploadDoc(PlatformEnum platformEnum, MultipartFile file, Aliyun aliyun) {
InputStream in = null;
// 上传
try {
in = file.getInputStream();
String name = file.getOriginalFilename();
String filePath = platformEnum.name().toLowerCase() + "/" + StrUtil.get32UUID() + name.substring(name.lastIndexOf("."));
putObjectForFile(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret(), aliyun.getAliyunOssBucket(), filePath, in, file.getOriginalFilename());
return aliyun.getAliyunOssUrl() + filePath;
} catch (Exception e) {
log.error("上传失败", e);
return "";
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
}
/**
* 根据url删除
*
* @param url
*/
public static void delete(String url, Aliyun aliyun) {
try {
String filePath = url.replace(aliyun.getAliyunOssUrl(), "");
deleteObject(aliyun.getAliyunOssBucket(), filePath, aliyun);
} catch (Exception e) {
log.error("上传失败", e);
}
}
public static boolean sendMsg(String phone, String code, Aliyun aliyun) throws ClientException {
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret());
IAcsClient acsClient = new DefaultAcsClient(profile);
// 组装请求对象
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("RegionId", "cn-hangzhou");
request.putQueryParameter("PhoneNumbers", phone);
request.putQueryParameter("SignName", aliyun.getSignName());
request.putQueryParameter("TemplateCode", aliyun.getSmsCode());
request.putQueryParameter("TemplateParam", "{\"code\":\"{code}\",\"product\":\"领课开源\"}".replace("{code}", code));
CommonResponse response = acsClient.getCommonResponse(request);
log.info("发送成功,返回报文={}", response.toString());
return true;
}
private static String check(String url, String ossUrl) {
String key = url.replace(ossUrl, "");
if (key.startsWith("http")) {
if (ossUrl.startsWith("https")) {
ossUrl = "http" + ossUrl.substring(5, ossUrl.length());
} else {
ossUrl = "https" + ossUrl.substring(4, ossUrl.length());
}
}
return key.replace(ossUrl, "");
}
/**
* 文件存储入OSS
*
* @param bucketName
* @param key
* @param inputStream
*/
private static PutObjectResult putObjectForFile(String endpoint, String keyId, String keySecret, String bucketName, String key, InputStream inputStream, String fileName) {
OSS ossClient = getOssClient(endpoint, keyId, keySecret);
ObjectMetadata meta = new ObjectMetadata();
if (StringUtils.hasText(fileName)) {
meta.setContentDisposition("attachment;filename={}".replace("{}", fileName));
meta.setObjectAcl(CannedAccessControlList.Private);
}
return ossClient.putObject(bucketName, key, inputStream, meta);
}
private static void downloadObject(String endpoint, String keyId, String keySecret, String bucketName, String key, File file) throws IOException {
getOssClient(endpoint, keyId, keySecret).getObject(new GetObjectRequest(bucketName, key), file);
}
private static OSS getOssClient(String endpoint, String keyId, String keySecret) {
return new OSSClientBuilder().build(endpoint, keyId, keySecret);
}
/**
* 删除Bucket中的Object
*
* @param bucketName
* @param key
* @throws IOException
*/
private static void deleteObject(String bucketName, String key, Aliyun aliyun) throws IOException {
getOssClient(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret()).deleteObject(bucketName, key);
}
}
package com.roncoo.education.common.core.annotation;
import java.lang.annotation.*;
/**
* 系统日志注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AdminLog {
String value() default "操作日志";
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.base;
import cn.hutool.json.JSONUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 基础类
*
* @author wujing
*/
public class Base {
protected static final String REGEX_MOBILE = "^((13[0-9])|(14[5,7,9])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199)\\d{8}$";// 手机号码校验
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
protected static final ExecutorService callbackExecutor = Executors.newFixedThreadPool(50);
public final static Integer FREEZE = 3;// 冻结状态
public final static BigDecimal LECTURER_DEFAULT_PROPORTION = BigDecimal.valueOf(0.70); // 讲师默认分成
public static String getString(Map<String, Object> map, String key) {
if (null != map.get(key)) {
return map.get(key).toString();
}
return "";
}
public static Map<String, Object> getMap() {
return new HashMap<>();
}
public void log(Object obj) {
logger.info(JSONUtil.toJsonPrettyStr(obj));
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.base;
/**
* 基础类
*
* @author wujing
*/
public class BaseBiz extends Base {
}
package com.roncoo.education.common.core.base;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 缓存基本支撑类
*
* @param <K>
* @param <V>
* @author wujing
*/
public abstract class BaseCached<K, V> {
private ConcurrentMap<K, V> cached = new ConcurrentHashMap<K, V>();
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
private final static ScheduledExecutorService ses = new ScheduledThreadPoolExecutor(10);
/**
* 读写锁, 读的时候不互斥,写的时候互斥,保证在更新数据的时候,都不能读
*/
protected final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
/**
* @param initialDelay 开始更新的时间,单位秒
* @param period 更新一次的时间段,单位秒
*/
public void init(Long initialDelay, Long period) {
initialDelay = initialDelay + new Random().nextInt(60); // 防止缓存同一时间更新。
ses.scheduleAtFixedRate(new Runnable() {
public void run() {
reload();
}
}, initialDelay, period, TimeUnit.SECONDS);
reload();
}
public void reload() {
Long timeStart = System.currentTimeMillis();
ConcurrentMap<K, V> newCached = createNewCahcedObject();
ConcurrentMap<K, V> tempCached = cached;
// reload from db
reloadFromDb(newCached);
if (newCached.isEmpty()) {
logger.error(this.getClass().getName() + " reload elements is empty");
return;
}
try {
lock.writeLock().lock();
resetCachedObject(newCached);
tempCached.clear();
tempCached = null;
} finally {
lock.writeLock().unlock();
}
logger.warn("缓存更新所使用时间:" + (System.currentTimeMillis() - timeStart) + "ms");
}
public abstract void reloadFromDb(ConcurrentMap<K, V> cached);
public V get(K k) {
V result;
try {
lock.readLock().lock();
result = cached.get(k);
} finally {
lock.readLock().unlock();
}
return result;
}
public Map<K, V> getMap() {
Map<K, V> map = new HashMap<K, V>();
try {
lock.readLock().lock();
for (Map.Entry<K, V> entry : cached.entrySet()) {
map.put(entry.getKey(), entry.getValue());
}
return map;
} finally {
lock.readLock().unlock();
}
}
public List<V> getList() {
List<V> list = new ArrayList<V>();
try {
lock.readLock().lock();
for (Map.Entry<K, V> entry : cached.entrySet()) {
list.add(entry.getValue());
}
return list;
} finally {
lock.readLock().unlock();
}
}
private ConcurrentMap<K, V> createNewCahcedObject() {
return new ConcurrentHashMap<K, V>();
}
private void resetCachedObject(ConcurrentMap<K, V> newCached) {
cached = newCached;
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.base;
import com.roncoo.education.common.core.enums.*;
import com.roncoo.education.common.core.tools.JSUtil;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import javax.servlet.http.HttpServletRequest;
import java.io.DataInputStream;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Map;
import java.util.TreeMap;
/**
* 控制基础类,所以controller都应该继承这个类
*
* @author wujing
*/
public class BaseController extends Base {
public static final String TEXT_UTF8 = "text/html;charset=UTF-8";
public static final String JSON_UTF8 = "application/json;charset=UTF-8";
public static final String XML_UTF8 = "application/xml;charset=UTF-8";
public static final int OK = 200;
public static final int ER = 300;
public static final int TO = 301;
public static final boolean CLOSE = true;
public static final boolean OPEN = false;
@ModelAttribute
public void enums(ModelMap modelMap) {
modelMap.put("advTargetEnums", AdvTargetEnum.values());
modelMap.put("auditStatusEnums", AuditStatusEnum.values());
modelMap.put("categoryTypeEnums", CategoryTypeEnum.values());
modelMap.put("channelTypeEnums", ChannelTypeEnum.values());
modelMap.put("courseCategoryEnums", CourseCategoryEnum.values());
modelMap.put("courseTypeEnums", CourseTypeEnum.values());
modelMap.put("isEnableStatisticsEnums", IsEnableStatisticsEnum.values());
modelMap.put("isFreeEnums", IsFreeEnum.values());
modelMap.put("isPayEnums", IsPayEnum.values());
modelMap.put("isPutawayEnums", IsPutawayEnum.values());
modelMap.put("isShowServiceEnums", IsShowServiceEnum.values());
modelMap.put("navEnum", NavEnum.values());
modelMap.put("orderStatusEnums", OrderStatusEnum.values());
modelMap.put("payTypeEnums", PayTypeEnum.values());
modelMap.put("profitList", ExtractStatusEnum.values());
modelMap.put("profitStatusEnums", ProfitStatusEnum.values());
modelMap.put("platformEnums", PlatformEnum.values());
modelMap.put("sexEnums", SexEnum.values());
modelMap.put("statusIdEnums", StatusIdEnum.values());
modelMap.put("tradeStatusEnums", TradeStatusEnum.values());
modelMap.put("tradeTypeEnums", TradeTypeEnum.values());
modelMap.put("userTypeEnums", UserTypeEnum.values());
modelMap.put("videoStatusEnums", VideoStatusEnum.values());
modelMap.put("zoneLocationEnums", ZoneLocationEnum.values());
modelMap.put("videoTypeEnums", VideoTypeEnum.values());
modelMap.put("sysTypeEnums", SysTypeEnum.values());
modelMap.put("fileTypeEnums", FileTypeEnum.values());
modelMap.put("isDefaultEnums", IsDefaultEnum.values());
modelMap.put("isSendEnums", IsSendEnum.values());
modelMap.put("isTimeSendEnums", IsTimeSendEnum.values());
modelMap.put("msgTypeEnums", MsgTypeEnum.values());
modelMap.put("isSuccessEnums", IsSuccessEnum.values());
}
/**
* 重定向
*
* @param format
* @param arguments
* @return
*/
public static String redirect(String format, Object... arguments) {
return new StringBuffer("redirect:").append(MessageFormat.format(format, arguments)).toString();
}
public static String getString(HttpServletRequest request) {
DataInputStream in = null;
try {
in = new DataInputStream(request.getInputStream());
byte[] buf = new byte[request.getContentLength()];
in.readFully(buf);
return new String(buf, "UTF-8");
} catch (Exception e) {
return "";
} finally {
if (null != in)
try {
in.close();// 关闭数据流
} catch (IOException e) {
}
}
}
@SuppressWarnings("unchecked")
public static TreeMap<String, Object> getParamMap(HttpServletRequest request) {
TreeMap<String, Object> paramMap = new TreeMap<>();
Map<String, String[]> map = request.getParameterMap();
for (String key : map.keySet()) {
paramMap.put(key, map.get(key)[0]);
}
if (paramMap.isEmpty()) {
return new TreeMap<>(JSUtil.parseObject(getString(request), TreeMap.class));
}
return paramMap;
}
/**
* 成功提示,关闭当前对话框,并对tabid进行刷新
*
* @param tabid 需要刷新的tabid或者dialogid
* @return json字符串
*/
protected static String success(String targetId) {
return bjui(OK, CLOSE, targetId, "操作成功");
}
/**
* 成功提示,关闭当前对话框,并对tabid进行刷新
*
* @param tabid 需要刷新的tabid或者dialogid
* @param message 提示信息
* @return json字符串
*/
protected static String success(String targetId, String message) {
return bjui(OK, CLOSE, targetId, message);
}
/**
* 删除成功提示,不关闭当前对话框
*
* @param tabid 需要刷新的tabid或者dialogid
* @return
*/
protected static String delete(String targetId) {
return delete(targetId, "操作成功");
}
/**
* 删除成功提示,不关闭当前对话框
*
* @param tabid 需要刷新的tabid或者dialogid
* @param message 提示信息
* @return
*/
protected static String delete(String targetId, String message) {
return bjui(OK, OPEN, targetId, message);
}
/**
* 信息提示,不关闭当前对话框
*
* @param tabid 需要刷新的tabid或者dialogid
* @param message 提示信息
* @return
*/
protected static String ties(String message) {
return bjui(OK, OPEN, "", message);
}
/**
* 错误提示,不关闭当前对话框,自定义提示信息
*
* @param message 提示信息
* @return
*/
protected static String error(String message) {
return bjui(ER, OPEN, "", message);
}
/**
* 错误提示,不关闭当前对话框,自定义提示信息
*
* @param message 提示信息
* @return
*/
protected static String error(BindingResult bindingResult) {
StringBuilder sb = new StringBuilder();
for (FieldError fieldError : bindingResult.getFieldErrors()) {
sb.append(fieldError.getDefaultMessage()).append("<br/>");
}
return error(sb.toString());
}
/**
*
*/
protected static String redirectForBJUI(String forward) {
Bjui bj = new Bjui();
bj.setStatusCode(OK);
bj.setForward(forward);
return JSUtil.toJSONString(bj);
}
/**
*
*/
private static String bjui(int statusCode, Boolean closeCurrent, String targetId, String message) {
Bjui bj = new Bjui();
bj.setStatusCode(statusCode);
bj.setCloseCurrent(closeCurrent);
bj.setTabid(targetId);
bj.setMessage(message);
return JSUtil.toJSONString(bj);
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.base;
import com.roncoo.education.common.core.enums.ResultEnum;
/**
* 异常处理类
*
* @author wujing
*/
public class BaseException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* 异常码
*/
protected int code;
public BaseException() {
super("系统异常");
this.code = 99;
}
public BaseException(ResultEnum resultEnum) {
super(resultEnum.getDesc());
this.code = resultEnum.getCode();
}
public BaseException(String message) {
super(message);
this.code = 99;
}
public BaseException(int code, String message) {
super(message);
this.code = code;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.base;
import java.io.Serializable;
public class Bjui implements Serializable {
private static final long serialVersionUID = 486427439928047616L;
private int statusCode; // 必选。状态码
private String message; // 可选。信息内容。
private String tabid; // 可选。
private String dialogid; // 可选。
private String divid; // 可选。
private boolean closeCurrent; // 可选
private String forward; // 可选
private String forwardConfirm; // 可选
public int getStatusCode() {
return statusCode;
}
public void setStatusCode(int statusCode) {
this.statusCode = statusCode;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getTabid() {
return tabid;
}
public void setTabid(String tabid) {
this.tabid = tabid;
}
public String getDialogid() {
return dialogid;
}
public void setDialogid(String dialogid) {
this.dialogid = dialogid;
}
public String getDivid() {
return divid;
}
public void setDivid(String divid) {
this.divid = divid;
}
public boolean isCloseCurrent() {
return closeCurrent;
}
public void setCloseCurrent(boolean closeCurrent) {
this.closeCurrent = closeCurrent;
}
public String getForward() {
return forward;
}
public void setForward(String forward) {
this.forward = forward;
}
public String getForwardConfirm() {
return forwardConfirm;
}
public void setForwardConfirm(String forwardConfirm) {
this.forwardConfirm = forwardConfirm;
}
@Override
public String toString() {
return "Bjui [statusCode=" + statusCode + ", message=" + message + ", tabid=" + tabid + ", dialogid=" + dialogid + ", divid=" + divid + ", closeCurrent=" + closeCurrent + ", forward=" + forward + ", forwardConfirm=" + forwardConfirm + "]";
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.base;
import java.io.Serializable;
import java.util.List;
/**
* 分页
*
* @param <T>
* @author wujing
*/
public class Page<T extends Serializable> implements Serializable {
private static final long serialVersionUID = -5764853545343945831L;
/**
* 当前分页的数据集
*/
private List<T> list = null;
/**
* 总记录数
*/
private int totalCount = 0;
/**
* 总页数
*/
private int totalPage = 0;
/**
* 当前页
*/
private int pageCurrent = 1;
/**
* 每页记录数
*/
private int pageSize = 20;
/**
* 默认构造函数
*/
public Page() {
}
/**
* 构造函数
*
* @param totalCount 总记录数
* @param totalPage 总页数
* @param pageCurrent
* @param pageSize
* @param list
*/
public Page(int totalCount, int totalPage, int pageCurrent, int pageSize, List<T> list) {
this.totalCount = totalCount;
this.totalPage = totalPage;
this.pageCurrent = pageCurrent;
this.pageSize = pageSize;
this.list = list;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getPageCurrent() {
return pageCurrent;
}
public void setPageCurrent(int pageCurrent) {
this.pageCurrent = pageCurrent;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
@Override
public String toString() {
return "Page [list=" + list + ", totalCount=" + totalCount + ", totalPage=" + totalPage + ", pageCurrent=" + pageCurrent + ", pageSize=" + pageSize + "]";
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.base;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 分页
*
* @param <T>
* @author wujing
*/
public final class PageUtil<T extends Serializable> implements Serializable {
private static final Logger logger = LoggerFactory.getLogger(PageUtil.class);
private static final long serialVersionUID = 1L;
/**
* 默认每页记录数(20)
*/
public static final int DEFAULT_PAGE_SIZE = 20;
/**
* 最大每页记录数(1000)
*/
public static final int MAX_PAGE_SIZE = 1000;
private PageUtil() {
}
public static <T extends Serializable> Page<T> transform(Page<?> page, Class<T> classType) {
Page<T> pb = new Page<>();
try {
pb.setList(copyList(page.getList(), classType));
} catch (Exception e) {
logger.error("transform error", e);
}
pb.setPageCurrent(page.getPageCurrent());
pb.setPageSize(page.getPageSize());
pb.setTotalCount(page.getTotalCount());
pb.setTotalPage(page.getTotalPage());
return pb;
}
/**
* @param source
* @param clazz
* @return
* @throws IllegalAccessException
* @throws InvocationTargetException
* @throws InstantiationException
*/
public static <T> List<T> copyList(List<?> source, Class<T> clazz) {
if (source == null || source.size() == 0) {
return Collections.emptyList();
}
List<T> res = new ArrayList<>(source.size());
for (Object o : source) {
try {
T t = clazz.newInstance();
res.add(t);
BeanUtils.copyProperties(o, t);
} catch (Exception e) {
logger.error("copyList error", e);
}
}
return res;
}
/**
* 检测sql,防止sql注入
*
* @param sql sql
* @return 正常返回sql;异常返回""
*/
public static String checkSql(String sql) {
String inj_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|+|,";
String inj_stra[] = inj_str.split("\\|");
for (int i = 0; i < inj_stra.length; i++) {
if (sql.indexOf(inj_stra[i]) >= 0) {
return "";
}
}
return sql;
}
/**
* 计算总页数
*
* @param totalCount 总记录数.
* @param pageSize 每页记录数.
* @return totalPage 总页数.
*/
public static int countTotalPage(final int totalCount, final int pageSize) {
if (totalCount == 0) {
return 1;
}
if (totalCount % pageSize == 0) {
return totalCount / pageSize; // 刚好整除
} else {
return totalCount / pageSize + 1; // 不能整除则总页数为:商 + 1
}
}
/**
* 校验当前页数pageCurrent<br/>
* 1、先根据总记录数totalCount和每页记录数pageSize,计算出总页数totalPage<br/>
* 2、判断页面提交过来的当前页数pageCurrent是否大于总页数totalPage,大于则返回totalPage<br/>
* 3、判断pageCurrent是否小于1,小于则返回1<br/>
* 4、其它则直接返回pageCurrent
*
* @param totalCount 要分页的总记录数
* @param pageSize 每页记录数大小
* @param pageCurrent 输入的当前页数
* @return pageCurrent
*/
public static int checkPageCurrent(int totalCount, int pageSize, int pageCurrent) {
int totalPage = countTotalPage(totalCount, pageSize); // 最大页数
if (pageCurrent > totalPage) {
// 如果页面提交过来的页数大于总页数,则将当前页设为总页数
// 此时要求totalPage要大于获等于1
if (totalPage < 1) {
return 1;
}
return totalPage;
} else if (pageCurrent < 1) {
return 1; // 当前页不能小于1(避免页面输入不正确值)
} else {
return pageCurrent;
}
}
/**
* 校验页面输入的每页记录数pageSize是否合法<br/>
* 1、当页面输入的每页记录数pageSize大于允许的最大每页记录数MAX_PAGE_SIZE时,返回MAX_PAGE_SIZE
* 2、如果pageSize小于1,则返回默认的每页记录数DEFAULT_PAGE_SIZE
*
* @param pageSize 页面输入的每页记录数
* @return checkPageSize
*/
public static int checkPageSize(int pageSize) {
if (pageSize > MAX_PAGE_SIZE) {
return MAX_PAGE_SIZE;
} else if (pageSize < 1) {
return DEFAULT_PAGE_SIZE;
} else {
return pageSize;
}
}
/**
* 计算当前分页的开始记录的索引
*
* @param pageCurrent 当前第几页
* @param pageSize 每页记录数
* @return 当前页开始记录号
*/
public static int countOffset(final int pageCurrent, final int pageSize) {
return (pageCurrent - 1) * pageSize;
}
/**
* 根据总记录数,对页面传来的分页参数进行校验,并返分页的SQL语句
*
* @param pageCurrent 当前页
* @param pageSize 每页记录数
* @param pageBean DWZ分页查询参数
* @return limitSql
*/
public static String limitSql(int totalCount, int pageCurrent, int pageSize) {
// 校验当前页数
pageCurrent = checkPageCurrent(totalCount, pageSize, pageCurrent);
pageSize = checkPageSize(pageSize); // 校验每页记录数
return new StringBuffer().append(" limit ").append(countOffset(pageCurrent, pageSize)).append(",").append(pageSize).toString();
}
/**
* 根据分页查询的SQL语句,获取统计总记录数的语句
*
* @param sql 分页查询的SQL
* @return countSql
*/
public static String countSql(String sql) {
String countSql = sql.substring(sql.toLowerCase().indexOf("from")); // 去除第一个from前的内容
return new StringBuffer().append("select count(*) ").append(removeOrderBy(countSql)).toString();
}
/**
* 移除SQL语句中的的order by子句(用于分页前获取总记录数,不需要排序)
*
* @param sql 原始SQL
* @return 去除order by子句后的内容
*/
private static String removeOrderBy(String sql) {
Pattern pat = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE);
Matcher mc = pat.matcher(sql);
StringBuffer strBuf = new StringBuffer();
while (mc.find()) {
mc.appendReplacement(strBuf, "");
}
mc.appendTail(strBuf);
return strBuf.toString();
}
/**
* 模糊查询
*
* @param str
* @return
*/
public static String like(String str) {
return new StringBuffer().append("%").append(str).append("%").toString();
}
/**
* 模糊查询
*
* @param str
* @return
*/
public static String rightLike(String str) {
return new StringBuffer().append(str).append("%").toString();
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.base;
import com.roncoo.education.common.core.enums.ResultEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
/**
* 接口返回对象实体
*
* @param <T>
* @author wujing
*/
public final class Result<T extends Serializable> implements Serializable {
private static final Logger logger = LoggerFactory.getLogger(Result.class);
private static final long serialVersionUID = 1L;
/**
* 错误码
*/
private Integer code = ResultEnum.ERROR.getCode();
/**
* 错误信息
*/
private String msg = null;
/**
* 返回结果实体
*/
private T data = null;
public Result() {
}
private Result(int code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public static <T extends Serializable> Result<T> error(String msg) {
logger.debug("返回错误:code={}, msg={}", ResultEnum.ERROR.getCode(), msg);
return new Result<T>(ResultEnum.ERROR.getCode(), msg, null);
}
public static <T extends Serializable> Result<T> error(ResultEnum resultEnum) {
logger.debug("返回错误:code={}, msg={}", resultEnum.getCode(), resultEnum.getDesc());
return new Result<T>(resultEnum.getCode(), resultEnum.getDesc(), null);
}
public static <T extends Serializable> Result<T> error(int code, String msg) {
logger.debug("返回错误:code={}, msg={}", code, msg);
return new Result<T>(code, msg, null);
}
public static <T extends Serializable> Result<T> success(T data) {
return new Result<T>(ResultEnum.SUCCESS.getCode(), "", data);
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return "Result [code=" + code + ", msg=" + msg + ", data=" + data + "]";
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.config;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.util.Properties;
/**
* 配置文件读取工具类
*
* @author wujing
*/
@Slf4j
public final class ConfigUtil {
private ConfigUtil() {
}
private static final Properties properties = new Properties();
static {
try {
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties"));
log.warn("当前环境配置为:{}", getProperty("env"));
} catch (IOException e) {
e.printStackTrace();
}
}
private static String getProperty(String keyName) {
return properties.getProperty(keyName, "").trim();
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.config;
import java.io.IOException;
import java.util.Properties;
/**
* 配置文件读取工具类
*
* @author wujing
*/
public final class SystemUtil {
private SystemUtil() {
}
private static final Properties properties = new Properties();
static {
try {
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("system.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
private static String getProperty(String keyName) {
return properties.getProperty(keyName, "").trim();
}
public static final String PERIOD_VIDEO_PATH = getProperty("period_video_path");
public static final String PIC_PATH = getProperty("pic_path");
public static final String DOC_STORAGE_PATH = getProperty("doc_storage_path");
public static final String PIC_STORAGE_PATH = getProperty("pic_storage_path");
public static final String TEST_COURSE = getProperty("test_course");
public static final String POLYV_UPLOADVIDEO = getProperty("polyv_uploadVideo");
public static final String POLYV_DELETEVIDEO = getProperty("polyv_deleteVideo");
public static final String POLYV_QUESTION = getProperty("polyv_question");
public static final String POLYV_GETTOKEN = getProperty("polyv_getToken");
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum AdvTargetEnum {
BLANK("_blank", "新窗口打开"), SELF("_self", "同窗口打开");
private String code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum AuditStatusEnum {
WAIT(0, "待审核", ""),
//
SUCCESS(1, "审核通过", "green"),
//
FAIL(2, "审核不通过", "red");
private Integer code;
private String desc;
private String color;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum CategoryTypeEnum {
COURSE(1, "课程分类"), RESOURCE(2, "资源分类");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum ChannelTypeEnum {
PC(1, "PC端");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author LHR
*/
@Getter
@AllArgsConstructor
public enum CourseCategoryEnum {
ORDINARY(1, "普通课程", ""), RESOURCES(0, "资源区课程", "red");
private Integer code;
private String desc;
private String color;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum CourseTypeEnum {
COURSE(1, "课程"), CHAPTER(2, "章节"), PERIOD(3, "课时");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
/**
* 日期格式
*
* @author forest
*/
public enum DateFormatEnum {
YYYYMMDDHHMMSSSSS("yyyyMMddHHmmssSSS"), YYYYMMDD("yyyyMMdd"), YYYYMMDDHHMMSS("yyyyMMddHHmmss");
private String dateFormat;
/**
* @param dateFormat
*/
private DateFormatEnum(String dateFormat) {
this.dateFormat = dateFormat;
}
public String getDateFormat() {
return dateFormat;
}
public void setDateFormat(String dateFormat) {
this.dateFormat = dateFormat;
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author LHR
*/
@Getter
@AllArgsConstructor
public enum ExtractStatusEnum {
APPLICATION(1, "审核中"), PAYING(2, "支付中"), CONFIRMING(3, "确认中"), SUCCESS(4, "成功"), FAIL(5, "失败");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author YZJ
*/
@Getter
@AllArgsConstructor
public enum FileClassifyEnum {
DOC(1, "附件"), PICTURE(2, "图片"), VIDEO(3, "视频");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum FileTypeEnum {
LOCAL(0, "本地"), ALIYUN(1, "阿里云"), FDSF(2, "FastDFS"), MINIO(3, "MinIO");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum FloorEnum {
ONE(1, "1"), TWO(2, "2");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author forest
*/
@Getter
@AllArgsConstructor
public enum FundDirectionEnum {
ADD(1, "增加"), SUBSTRACT(2, "减少");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wuyun
*/
@Getter
@AllArgsConstructor
public enum HasNoticeEnum {
YES(1, "已提醒"), NO(0, "未提醒");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 是否显示(1: 显示;0:不显示)
*/
@Getter
@AllArgsConstructor
public enum HiddenTypeEnum {
YES(1, "显示"), NO(0, "不显示");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wuyun
*/
@Getter
@AllArgsConstructor
public enum IsDefaultEnum {
YES(1, "是"), NO(0, "否");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 是否存在文档
*
* @author wuyun
*/
@Getter
@AllArgsConstructor
public enum IsDocEnum {
YES(1, "存在"), NO(0, "否");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 是否开启统计
*
* @author wuyun
*/
@Getter
@AllArgsConstructor
public enum IsEnableStatisticsEnum {
YES(1, "开启"), NO(0, "关闭");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum IsFreeEnum {
FREE(1, "免费", ""), CHARGE(0, "收费", "green");
private Integer code;
private String desc;
private String color;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 是否高亮(1高亮;0不高亮)
*
* @author wuyun
*/
@Getter
@AllArgsConstructor
public enum IsHfield {
NO(0, "不高亮"), YES(1, "高亮");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum IsPayEnum {
YES(1, "已支付"), NO(0, "未支付");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author LHR
*/
@Getter
@AllArgsConstructor
public enum IsPutawayEnum {
YES(1, "上架", ""), NO(0, "下架", "red");
private Integer code;
private String desc;
private String color;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum IsReadEnum {
YES(1, "已读"), NO(0, "未读");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 是否是最新
*
* @author Administrator
*/
@Getter
@AllArgsConstructor
public enum IsSendEnum {
YES(1, "已发送"), NO(0, "待发送");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum IsShowEnum {
YES(1, "显示"), NO(0, "不显示");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 是否显示客服信息
*
* @author wuyun
*/
@Getter
@AllArgsConstructor
public enum IsShowServiceEnum {
YES(1, "是"), NO(0, "否");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum IsShowUserEnum {
YES(1, "显示"), NO(0, "不显示");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 是否学习枚举类
*
* @author forest
*/
@Getter
@AllArgsConstructor
public enum IsStudyEnum {
YES(1, "已学习"), NO(0, "未学习");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum IsSuccessEnum {
SUCCESS(1, "成功", "green"), FAIL(0, "失败", "red");
private Integer code;
private String desc;
private String color;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 是否定时发送
*
* @author wuyun
*/
@Getter
@AllArgsConstructor
public enum IsTimeSendEnum {
YES(1, "是"), NO(0, "否");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 是否置顶
*/
@Getter
@AllArgsConstructor
public enum IsTopEnum {
YES(1, "是"), NO(0, "否");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wuyun
*/
@Getter
@AllArgsConstructor
public enum IsVideoEnum {
YES("1", "存在"), NO("0", "否");
private String code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum LoginStatusEnum {
SUCCESS(1, "登录成功", ""),
//
FAIL(0, "登录失败", "red");
private Integer code;
private String desc;
private String color;
}
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 菜单类型(1:目录 2:菜单 3:按钮)
*/
@Getter
@AllArgsConstructor
public enum MenuTypeEnum {
DIRECTORY(1, "目录"), MENU(2, "菜单"), BUTTON(3, "按钮");
private Integer code;
private String desc;
}
/**
* Copyright 2015-2017 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 短信类型
*
* @author wuyun
*/
@Getter
@AllArgsConstructor
public enum MsgTypeEnum {
SYSTEM(1, "系统消息"), OTHER(2, "其他");
private Integer code;
private String desc;
}
/**
* Copyright 2015-2017 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum NavEnum {
INDEX("/index", "首页"), COURSE("/list", "录播中心"), RECRUIT("/recruit", "讲师招募");
private String code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum OperateTypeEnum {
INCREASE(1, "增加"), EDIT(2, "修改"), DISADLE(3, "禁用");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum OrderStatusEnum {
WAIT(1, "待支付"), SUCCESS(2, "支付成功"), FAIL(3, "支付失败"), CLOSE(4, "已关闭");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
/**
* 状态码描述
*
* @author hugovon
* @version 1.0
*/
public enum PayProductTypeEnum {
WEIXIN_T1("10000101", "微信T1扫码支付"), ZHIFUBAO_T1("20000301", "支付宝T1扫码支付");
private String code;
private String desc;
private PayProductTypeEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum PayTypeEnum {
WEIXIN(1, "微信支付"), ALIPAY(2, "支付宝支付");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
/**
* @author wujing
*/
public enum PlatformEnum {
COURSE, USER, SYSTEM;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 平台展示枚举类
*
* @author Administrator
*/
@Getter
@AllArgsConstructor
public enum PlatformShowEnum {
PC(1, "PC端", ""), EDIT(0, "微信端", "green");
private Integer code;
private String desc;
private String color;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author LHR
*/
@Getter
@AllArgsConstructor
public enum ProfitStatusEnum {
CONFIRMING(1, "确认中"), SUCCESS(2, "成功"), FAIL(3, "失败");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 缓存前缀
*
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum RedisPreEnum {
SYS_MSG_SEND("sys_msg_send_", "发送站内信-sys_msg_send_"), //
SYS_MSG_SEND_NUM("sys_msg_send_num_", "发送站内信key数量-sys_msg_send_num_"), //
SYS_MSG("sys_msg_", "站内信-sys_msg"), //
ADMINI_MENU("admini_menu_", "管理员菜单-admini_menu_"); //
private String code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ResultEnum {
// 成功
SUCCESS(200, "成功"),
// token异常
TOKEN_PAST(301, "token过期"), TOKEN_ERROR(302, "token异常"),
// 登录异常
LOGIN_ERROR(303, "登录异常"), REMOTE_ERROR(304, "异地登录"),
MENU_PAST(305, "菜单过期"), MENU_NO(306, "没此权限,请联系管理员!"),
// 课程异常,4开头
COURSE_SAVE_FAIL(403, "添加失败"), COURSE_UPDATE_FAIL(404, "更新失败"), COURSE_DELETE_FAIL(405, "删除失败"),
//
COLLECTION(406, "已收藏"), USER_ADVICE(406, "保存建议失败,不能重复提建议"), COURSE_AUDIT_FAIL(407, "审核失败"),
// 用户异常,5开头
LECTURER_REQUISITION_REGISTERED(501, "申请失败!该手机没注册,请先注册账号"), LECTURER_REQUISITION_WAIT(502, "申请失败!该账号已提交申请入驻成为讲师,待审核中,在7个工作日内会有相关人员与您联系确认"), LECTURER_REQUISITION_YET(503, "申请失败!该账号已成为讲师,请直接登录"),
//
USER_SAVE_FAIL(504, "添加失败"), USER_UPDATE_FAIL(505, "更新失败"), LECTURER_REQUISITION_FAIL(506, "申请失败!该账号已提交申请入驻成为讲师,审核不通过,请联系平台管理员"), USER_LECTURER_AUDIT(507, "审核失败"), USER_SEND_FAIL(508, "发送失败"),
USER_DELETE_FAIL(509, "删除失败"),
// 系統异常,6开头
SYSTEM_SAVE_FAIL(601, "添加失败"), SYSTEM_UPDATE_FAIL(602, "更新失败"), SYSTEM_DELETE_FAIL(603, "删除失败"),
// 错误
ERROR(999, "错误");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum SexEnum {
MALE(1, "男", "green"), FEMALE(2, "女", "red"), SECRET(3, "保密", "orange");
private Integer code;
private String desc;
private String color;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum SourceTypeEnum {
REGISTER(1, "注册"), VIEW(2, "观看");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum StatusIdEnum {
YES(1, "正常", ""), NO(0, "禁用", "red");
private Integer code;
private String desc;
private String color;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum SysTypeEnum {
RONCOOPAY(1, "龙果支付"), OTHERPAYMENT(2, "其他");
private Integer code;
private String desc;
}
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 跳转方式
*/
@Getter
@AllArgsConstructor
public enum TargetEnum {
_BLANK("_blank", "新窗口打开"), _SELF("_self", "同窗口打开");
private String code;
private String desc;
}
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum TradeStatusEnum {
SUCCESS("SUCCESS", "交易成功", ""), //
FINISH("FINISH", "交易完成", "green"), //
FAILED("FAILED", "交易失败", "red"), //
WAITING_PAYMENT("WAITING_PAYMENT", "等待支付", "orange");
private String code;
private String desc;
private String color;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum TradeTypeEnum {
ONLINE(1, "线上支付"), OFFLINE(2, "线下支付");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum UserTypeEnum {
USER(1, "用户", ""), LECTURER(2, "讲师", "blue");
private Integer code;
private String desc;
private String color;
}
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 视频上传状态
*
* @author LHR
*/
@Getter
@AllArgsConstructor
public enum VideoStatusEnum {
WAIT(1, "待上传", ""), SUCCES(2, "上传成功", "green"), FINAL(3, "上传失败", "red");
private Integer code;
private String desc;
private String color;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum VideoTypeEnum {
POLYV(1, "保利威视"), OTHER(2, "其他");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum ZoneLocationEnum {
PC(0, "PC端", ""),
//
WX(1, "微信端", "green");
private Integer code;
private String desc;
private String color;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wujing
*/
@Getter
@AllArgsConstructor
public enum recruitTypeEnum {
LECTURER(1, "讲师招募"), AGENT(2, "代理招募");
private Integer code;
private String desc;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.pay;
import com.roncoo.education.common.core.tools.MD5Util;
import org.springframework.util.StringUtils;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
/**
* @author forest
*/
public final class MerchantApiUtil {
private MerchantApiUtil() {
}
/**
* 获取参数签名
*
* @param paramMap 签名参数
* @param paySecret 签名密钥
* @return
*/
public static String getSign(Map<String, Object> paramMap, String paySecret) {
if (paramMap.isEmpty()) {
return "";
}
SortedMap<String, Object> smap = new TreeMap<String, Object>(paramMap);
StringBuffer stringBuffer = new StringBuffer();
for (Map.Entry<String, Object> m : smap.entrySet()) {
String value = String.valueOf(m.getValue());
if (StringUtils.hasText(value)) {
stringBuffer.append(m.getKey()).append("=").append(value).append("&");
}
}
stringBuffer.delete(stringBuffer.length() - 1, stringBuffer.length());
String argPreSign = stringBuffer.append("&paySecret=").append(paySecret).toString();
String signStr = MD5Util.MD5(argPreSign).toUpperCase();
return signStr;
}
/**
* 获取参数拼接串
*
* @param paramMap
* @return
*/
public static String getParamStr(Map<String, String> paramMap) {
SortedMap<String, Object> smap = new TreeMap<String, Object>(paramMap);
StringBuffer stringBuffer = new StringBuffer();
for (Map.Entry<String, Object> m : smap.entrySet()) {
stringBuffer.append(m.getKey()).append("=").append(m.getValue()).append("&");
}
stringBuffer.delete(stringBuffer.length() - 1, stringBuffer.length());
return stringBuffer.toString();
}
/**
* 验证商户签名
*
* @param paramMap 签名参数
* @param paySecret 签名私钥
* @param signStr 原始签名密文
* @return
*/
public static boolean isRightSign(Map<String, Object> paramMap, String paySecret, String signStr) {
if (!StringUtils.hasText(signStr)) {
return false;
}
String sign = getSign(paramMap, paySecret);
if (signStr.equals(sign)) {
return true;
} else {
return false;
}
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.pay;
import com.roncoo.education.common.core.enums.DateFormatEnum;
import com.roncoo.education.common.core.enums.PayProductTypeEnum;
import com.roncoo.education.common.core.enums.PayTypeEnum;
import com.roncoo.education.common.core.tools.HttpUtil;
import com.roncoo.education.common.core.tools.JSUtil;
import com.roncoo.education.common.core.tools.MD5Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;
public final class PayUtil {
private PayUtil() {
}
private static final Logger logger = LoggerFactory.getLogger(PayUtil.class);
/**
* roncoo支付
*/
public static String roncooPay(String serialNumber, String productName, BigDecimal productPrice, Integer payType, String payKey, String paySecret, String payUrl, String notifyUrl) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("payKey", payKey);
paramMap.put("orderPrice", productPrice);
paramMap.put("outTradeNo", serialNumber);
// 判断是什么支付方式-支付方式编码 支付宝: ALIPAY 微信:WEIXIN
if (payType.equals(PayTypeEnum.WEIXIN.getCode())) {
paramMap.put("productType", PayProductTypeEnum.WEIXIN_T1.getCode());
} else if (payType.equals(PayTypeEnum.ALIPAY.getCode())) {
paramMap.put("productType", PayProductTypeEnum.ZHIFUBAO_T1.getCode());
} else {
// 匹配不上,设置为支付宝支付
paramMap.put("productType", PayProductTypeEnum.ZHIFUBAO_T1.getCode());
}
paramMap.put("orderTime", new SimpleDateFormat(DateFormatEnum.YYYYMMDDHHMMSS.getDateFormat()).format(new Date()));
// 把商品名中的特殊字符过滤掉
String regEx = "[`~!@#$%^&*()+=|{}':;',_\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
productName = Pattern.compile(regEx).matcher(productName).replaceAll("").trim();
if (productName.length() > 15) {
paramMap.put("productName", productName.substring(0, 15));
} else {
paramMap.put("productName", productName);
}
paramMap.put("orderIp", "127.0.0.1");// 下单IP
paramMap.put("returnUrl", notifyUrl); // 页面通知返回url
paramMap.put("notifyUrl", notifyUrl);
paramMap.put("remark", serialNumber);
String sign = getSign(paramMap, paySecret);
paramMap.put("sign", sign);
String resp = HttpUtil.postForPay(payUrl, paramMap);
logger.debug("roncoo支付返回报文={}", resp);
try {
@SuppressWarnings("unchecked")
Map<String, String> res = JSUtil.parseObject(resp, HashMap.class);
if (res.get("resultCode").equals("0000")) {
return res.get("payMessage");
}
} catch (Exception e) {
logger.error("roncoo支付接口请求失败,resp={}", resp);
}
return "";
}
private static String getSign(Map<String, Object> paramMap, String paySecret) {
if (paramMap.isEmpty()) {
return "";
}
SortedMap<String, Object> smap = new TreeMap<String, Object>(paramMap);
StringBuffer stringBuffer = new StringBuffer();
for (Map.Entry<String, Object> m : smap.entrySet()) {
String value = String.valueOf(m.getValue());
if (StringUtils.hasText(value)) {
stringBuffer.append(m.getKey()).append("=").append(value).append("&");
}
}
stringBuffer.delete(stringBuffer.length() - 1, stringBuffer.length());
String argPreSign = stringBuffer.append("&paySecret=").append(paySecret).toString();
return MD5Util.MD5(argPreSign).toUpperCase();
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.polyv;
import java.io.Serializable;
public class PolyvAuth implements Serializable {
private String vid;
private String t;
private String code;
private String callback;
private String secretkey;
private static final long serialVersionUID = 1L;
public String getVid() {
return vid;
}
public void setVid(String vid) {
this.vid = vid;
}
public String getT() {
return t;
}
public void setT(String t) {
this.t = t;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getCallback() {
return callback;
}
public void setCallback(String callback) {
this.callback = callback;
}
public String getSecretkey() {
return secretkey;
}
public void setSecretkey(String secretkey) {
this.secretkey = secretkey;
}
@Override
public String toString() {
return "PolyvAuth [vid=" + vid + ", t=" + t + ", code=" + code + ", callback=" + callback + ", secretkey=" + secretkey + "]";
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.polyv;
import java.io.Serializable;
public class PolyvAuthResult implements Serializable {
// 状态:1正常播放, 2禁止播放
private Integer status = 2;
// 用户名
private String username = "";
// 签名
private String sign;
// 自定义错误提示
private String msg = "系统异常,请重试";
// 跑马灯文字字体大小
private Integer fontSize = 10;
// 跑马灯文字字体颜色
private String fontColor = "0x000000";
// 跑马灯文字移动指定像素所需时间
private Integer speed = 200;
// 是否描边
private String filter = "on";
// 跑马灯样式: 1自屏幕右方至左方一直滚动,2屏幕内随机位置闪烁,3自屏幕右方至左方一直滚动,渐隐渐现
private Integer setting = 2;
// 跑马灯文本透明度:0~1
private Float alpha = 0.5F;
// 跑马灯描边透明度:0~1
private Float filterAlpha = 0.5F;
// 跑马灯描边颜色
private String filterColor = "0x000000";
// 跑马灯描边水平模糊量
private Integer blurX = 0;
// 跑马灯描边垂直模糊量
private Integer blurY = 0;
// 跑马灯文本隐藏间隔时间
private Integer interval = 5;
// 跑马灯文本显示时间
private Integer lifeTime = 5;
// 跑马灯文本渐隐渐现时间
private Integer tweenTime = 3;
// 跑马灯描边强度
private Integer strength = 0;
// 是否显示跑马灯,默认为否=off
private String show = "on";
private static final long serialVersionUID = 1L;
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Integer getFontSize() {
return fontSize;
}
public void setFontSize(Integer fontSize) {
this.fontSize = fontSize;
}
public Integer getSetting() {
return setting;
}
public void setSetting(Integer setting) {
this.setting = setting;
}
public Integer getInterval() {
return interval;
}
public void setInterval(Integer interval) {
this.interval = interval;
}
public Integer getLifeTime() {
return lifeTime;
}
public void setLifeTime(Integer lifeTime) {
this.lifeTime = lifeTime;
}
public Integer getTweenTime() {
return tweenTime;
}
public void setTweenTime(Integer tweenTime) {
this.tweenTime = tweenTime;
}
public String getFontColor() {
return fontColor;
}
public void setFontColor(String fontColor) {
this.fontColor = fontColor;
}
public Integer getSpeed() {
return speed;
}
public void setSpeed(Integer speed) {
this.speed = speed;
}
public String getFilter() {
return filter;
}
public void setFilter(String filter) {
this.filter = filter;
}
public Float getAlpha() {
return alpha;
}
public void setAlpha(Float alpha) {
this.alpha = alpha;
}
public Float getFilterAlpha() {
return filterAlpha;
}
public void setFilterAlpha(Float filterAlpha) {
this.filterAlpha = filterAlpha;
}
public String getFilterColor() {
return filterColor;
}
public void setFilterColor(String filterColor) {
this.filterColor = filterColor;
}
public Integer getBlurX() {
return blurX;
}
public void setBlurX(Integer blurX) {
this.blurX = blurX;
}
public Integer getBlurY() {
return blurY;
}
public void setBlurY(Integer blurY) {
this.blurY = blurY;
}
public Integer getStrength() {
return strength;
}
public void setStrength(Integer strength) {
this.strength = strength;
}
public String getShow() {
return show;
}
public void setShow(String show) {
this.show = show;
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.polyv;
import java.io.Serializable;
public class PolyvCode implements Serializable {
private static final long serialVersionUID = 1L;
private Long userNo;
private Long periodNo;
public Long getUserNo() {
return userNo;
}
public void setUserNo(Long userNo) {
this.userNo = userNo;
}
public Long getPeriodNo() {
return periodNo;
}
public void setPeriodNo(Long periodNo) {
this.periodNo = periodNo;
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.polyv;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 获取课时code值实体类
*
* @author forest
*/
@Data
@Accessors(chain = true)
public class PolyvSign implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 课时vid
*/
private String vid;
/**
* 播放ip
*/
private String ip;
/**
* 用户编号
*/
private Long userNo;
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.common.core.polyv;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 课时信息获取sign值
*
* @author forest
*/
@Data
@Accessors(chain = true)
public class PolyvSignResult implements Serializable {
private static final long serialVersionUID = 1L;
private String ts;
private String sign;
private String token;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册