Commit 189dba5d authored by 法拉51246's avatar 法拉51246

init

parent 58f1f687
Pipeline #39 failed with stages

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

######################################################################
# Build Tools
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
target/
!.mvn/wrapper/maven-wrapper.jar
######################################################################
# IDE
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
idea/
target/
### JRebel ###
rebel.xml
### NetBeans ###
nbproject/private/
build/*
nbbuild/
dist/
nbdist/
.nb-gradle/
######################################################################
# Others
*.log
*.xml.versionsBackup
*.swp
!*/build/*.java
!*/build/*.html
!*/build/*.xml
The MIT License (MIT)
Copyright (c) 2018 RuoYi
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
@echo off
echo.
echo [信息] 清理工程target生成路径。
echo.
%~d0
cd %~dp0
cd ..
call mvn clean
pause
\ No newline at end of file
@echo off
echo.
echo [信息] 打包Web工程,生成war/jar包文件。
echo.
%~d0
cd %~dp0
cd ..
call mvn clean package -Dmaven.test.skip=true
pause
\ No newline at end of file
@echo off
echo.
echo [信息] 使用Jar命令运行Web工程。
echo.
cd %~dp0
cd ../ruoyi-admin/target
set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
java -jar %JAVA_OPTS% ruoyi-admin.jar
cd bin
pause
\ No newline at end of file
This diff is collapsed.
<?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">
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.8.8</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>ruoyi-admin</artifactId>
<description>
web服务入口
</description>
<dependencies>
<dependency>
<groupId>com.github.kuaidi100-api</groupId>
<artifactId>sdk</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<!--json转化-->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160212</version>
</dependency>
<!--微信支付-->
<dependency>
<groupId>com.github.javen205</groupId>
<artifactId>IJPay-WxPay</artifactId>
<version>${ijapy.version}</version>
</dependency>
<!--支付宝支付-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.40.8.ALL</version>
</dependency>
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- swagger3-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
</dependency>
<!-- 防止进入swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.6.2</version>
</dependency>
<!-- Mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 核心模块-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-framework</artifactId>
</dependency>
<!-- 定时任务-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-quartz</artifactId>
</dependency>
<!-- 代码生成-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-generator</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.15</version>
<configuration>
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
<includeSystemScope>true</includeSystemScope>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${project.artifactId}</warName>
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project>
package com.ruoyi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* 启动程序
*
* @author ruoyi
*/
@EnableScheduling
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication
{
public static void main(String[] args)
{
// System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(RuoYiApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ 学信考试启动成功 ლ(´ڡ`ლ)゙ \n" +
" .-------. ____ __ \n" +
" | _ _ \\ \\ \\ / / \n" +
" | ( ' ) | \\ _. / ' \n" +
" |(_ o _) / _( )_ .' \n" +
" | (_,_).' __ ___(_ o _)' \n" +
" | |\\ \\ | || |(_,_)' \n" +
" | | \\ `' /| `-' / \n" +
" | | \\ / \\ / \n" +
" ''-' `'-' `-..-' ");
}
}
package com.ruoyi;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* web容器中进行部署
*
* @author ruoyi
*/
public class RuoYiServletInitializer extends SpringBootServletInitializer
{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
{
return application.sources(RuoYiApplication.class);
}
}
package com.ruoyi.hezhi.api.course;
import com.ruoyi.common.annotation.RateLimiter;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.qiniu.QiNiuUploadUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.hezhi.domain.TbCourseChapter;
import com.ruoyi.hezhi.domain.dto.CourseDTO;
import com.ruoyi.hezhi.domain.dto.CourseEvaluateDTO;
import com.ruoyi.hezhi.service.ITbCourseChapterService;
import com.ruoyi.hezhi.service.ITbCourseEvaluateService;
import com.ruoyi.hezhi.service.ITbCourseService;
import io.swagger.annotations.Api;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* @Author: LCL
* @Date: 2024/9/14
* @Description:课程API
*/
@Api("课程API")
@RestController
@RequestMapping("/api/course")
public class ApiCourseController {
@Resource
private QiNiuUploadUtils qiNiuUploadUtils;
@Resource
private ITbCourseService courseService;
@Resource
private ITbCourseEvaluateService courseEvaluateService;
@Resource
private ITbCourseChapterService courseChapterService;
/**
* 查询课程列表
*
* @param params classType 课程类型(1-思政示范课程,2-精品在线课程)
* classId 课程分类ID
* beginTime 开始时间
* endTime 结束时间
* searchValue 搜索词
* @return success
*/
@GetMapping("/getCourseList")
public AjaxResult getCourseList(@RequestParam Map<String, Object> params) {
List<Map<String, Object>> courseList = courseService.getCourseList(params);
return AjaxResult.success(courseList);
}
/**
* 查询课程详情
*
* @param params courseId 课程ID
* @return success
*/
@GetMapping("/getCourseInfo")
public AjaxResult getCourseInfo(@RequestParam Map<String, Object> params) {
if (!params.containsKey("courseId") || StringUtils.isBlank(params.get("courseId").toString())) {
return AjaxResult.error("缺少courseId");
}
// 浏览量+1
courseService.addViewsNum(Long.parseLong(params.get("courseId").toString()));
Map<String, Object> courseInfo = courseService.getCourseInfo(params);
return AjaxResult.success(courseInfo);
}
/**
* 查询课程评价列表
*
* @param params courseId 课程ID
* sort 排序(0或不传-倒序,1-正序)
* @return success
*/
@GetMapping("/getCourseEvaluateList")
public AjaxResult getCourseEvaluateList(@RequestParam Map<String, Object> params) {
List<Map<String, Object>> courseEvaluateList = courseEvaluateService.getCourseEvaluateList(params);
return AjaxResult.success(courseEvaluateList);
}
/**
* 查询课程评价评分
*
* @param params courseId 课程ID
* @return success
*/
@GetMapping("/getCourseEvaluateScore")
public AjaxResult getCourseEvaluateScore(@RequestParam Map<String, Object> params) {
Map<String, Object> evaluateScore = courseEvaluateService.getCourseEvaluateScore(params);
return AjaxResult.success(evaluateScore);
}
/**
* 提交评价
*
* @param courseEvaluateDTO
* @return ok
*/
@RepeatSubmit
@RateLimiter(key = "API_submitEvaluation", time = 5, count = 50)
@PostMapping("/submitEvaluation")
public AjaxResult submitEvaluation(@RequestBody @Validated({CourseEvaluateDTO.submitEvaluation.class}) CourseEvaluateDTO courseEvaluateDTO, BindingResult bindingResult) {
// 参数校验
if (bindingResult.hasErrors()) {
return AjaxResult.allParameterErrors(bindingResult);
}
try {
return courseEvaluateService.submitEvaluation(courseEvaluateDTO);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("提交评价异常");
}
}
/**
* 立即参加
*
* @param courseDTO
* @return ok
*/
@RepeatSubmit
@RateLimiter(key = "API_joinNow", time = 5, count = 50)
@PostMapping("/joinNow")
public AjaxResult joinNow(@RequestBody @Validated({CourseDTO.joinNow.class}) CourseDTO courseDTO, BindingResult bindingResult) {
// 参数校验
if (bindingResult.hasErrors()) {
return AjaxResult.allParameterErrors(bindingResult);
}
try {
return courseService.joinNow(courseDTO);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("立即参加异常");
}
}
/**
* 查询课程章节列表
*
* @param params courseId 课程ID
* @return success
*/
@GetMapping("/getCourseChapterTreeList")
public AjaxResult getCourseChapterTreeList(@RequestParam Map<String, Object> params) {
List<TbCourseChapter> chapterTreeList = courseChapterService.getCourseChapterTreeList(Long.parseLong(params.get("courseId").toString()));
return AjaxResult.success(chapterTreeList);
}
}
//package com.ruoyi.hezhi.api.entity;
//
//import lombok.Data;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.context.properties.ConfigurationProperties;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.stereotype.Component;
//
///**
// * 微信支付配置 Bean
// *
// * @author lhgg
// * @date 2022/4/25
// */
//@Component
//@Data
//@Configuration
//public class AliPayBean {
//
// @Value("${alipay.appId}")
// private String appId;
//
// @Value("${alipay.charset}")
// private String charset;
//
// @Value("${alipay.format}")
// private String format;
//
// /** 签名算法 */
// @Value("${alipay.signType}")
// private String signType;
//
// /** 私钥 */
// @Value("${alipay.privateKey}")
// private String privateKey;
//
// /** 公钥 */
// @Value("${alipay.publicKey}")
// private String publicKey;
//
// /** 应用公钥证书路径 */
// @Value("${alipay.appCertPath}")
// private String appCertPath;
//
// /** 支付宝公钥证书路径 */
// @Value("${alipay.aliPayCertPath}")
// private String aliPayCertPath;
//
// /** 支付宝根证书路径 */
// @Value("${alipay.aliPayRootCertPath}")
// private String aliPayRootCertPath;
//
// /** 支付请求地址 */
// @Value("${alipay.serverUrl}")
// private String serverUrl;
//
// @Value("${alipay.domain}")
// private String domain;
//
// @Value("${alipay.notifyUrl}")
// private String notifyUrl;
//
//}
package com.ruoyi.hezhi.api.entity;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
@Data
public class AliPayConfig {
@Value("${alipay.appPay.appId}")
private String appId;
@Value("${alipay.appPay.url}")
private String url;
@Value("${alipay.appPay.charset}")
private String charset;
@Value("${alipay.appPay.format}")
private String format;
/** 签名算法 */
@Value("${alipay.appPay.signType}")
private String signType;
@Value("${alipay.appPay.notifyUrl}")
private String notifyUrl;
/** 私钥 */
@Value("${alipay.appPay.privateKey}")
private String privateKey;
/** 公钥 */
@Value("${alipay.appPay.publicKey}")
private String publicKey;
}
package com.ruoyi.hezhi.api.entity;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.hezhi.domain.TbMemberOrder;
import com.ruoyi.hezhi.service.ITbMemberOrderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.rmi.server.ServerCloneException;
import java.util.Map;
/**
* 支付宝支付
* @author Wzp
*/
@Component
public class AlipayService {
private static Logger log = LoggerFactory.getLogger(AlipayService.class);
@Resource
private AliPayConfig aliPayConfig;
@Resource
private ITbMemberOrderService memberOrderService;
public AlipayClient getAlipayClient() throws AlipayApiException {
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl(aliPayConfig.getUrl());// 设置网关地址
alipayConfig.setAppId(aliPayConfig.getAppId());// 设置应用APPID
alipayConfig.setPrivateKey(aliPayConfig.getPrivateKey());// 设置应用私钥
alipayConfig.setFormat("json");// 设置请求格式,固定值json
alipayConfig.setCharset(aliPayConfig.getCharset());// 设置字符集
alipayConfig.setAlipayPublicKey(aliPayConfig.getPublicKey());// 设置支付宝公钥
alipayConfig.setSignType(aliPayConfig.getSignType());// 设置签名类型
return new DefaultAlipayClient(alipayConfig);// 构造client
}
/**
* 支付宝支付生成预付单
* @param realPay 支付金额
* @param paySn 支付单号
* @param description 描述
* @return 结果
*/
public String aliPaySubmit(BigDecimal realPay, String paySn, String description,Long examId,Long memberUserId) {
try {
// 初始化SDK
AlipayClient alipayClient = getAlipayClient();
// 构造请求参数以调用接口
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.setOutTradeNo(paySn);// 设置商户订单号
model.setTotalAmount(realPay.toString());// 设置订单总金额
model.setSubject(description);// 设置订单标题
model.setProductCode("FAST_INSTANT_TRADE_PAY");// 设置产品码
model.setQrPayMode("1");// 设置PC扫码支付的方式
model.setQrcodeWidth(100L);// 设置商户自定义二维码宽度
model.setRequestFromUrl("https://www.chsie.com.cn/payTheFees?examId="+examId+"&memberUserId="+memberUserId);
request.setBizModel(model);
request.setNotifyUrl(aliPayConfig.getNotifyUrl()+"/api/pay/aliPayBoilerNotify");
request.setReturnUrl("https://www.chsie.com.cn/payTheFees?examId="+examId+"&memberUserId="+memberUserId);
AlipayTradePagePayResponse response = alipayClient.pageExecute(request, "POST");
// 如果需要返回GET请求,请使用
if (response.isSuccess()){
return response.getBody();
}else {
throw new ServerCloneException("支付宝支付失败");
}
}catch (Exception e){
e.printStackTrace();
throw new ServiceException("支付宝支付异常");
}
}
/**
* 支付宝退款
* @param orderSn 订单号
* @param payment 支付金额
* @return 结果
*/
public String tradeRefund(String orderSn, BigDecimal payment) {
System.out.println("开始调用支付宝退款****************");
try {
//实例化客户端
AlipayClient alipayClient = this.getAlipayClient();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeRefundModel refundModel = new AlipayTradeRefundModel();
refundModel.setOutTradeNo(orderSn);
refundModel.setRefundAmount(payment.toString());
refundModel.setRefundReason("退款");
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
request.setBizModel(refundModel);
AlipayTradeRefundResponse response = alipayClient.certificateExecute(request);
if (response.isSuccess()){
log.info("支付宝退款调用成功" + response);
return "SUCCESS";
}else{
log.error("支付宝退款调用失败" + response);
return "FAIL";
}
}catch(Exception e) {
e.printStackTrace();
log.error("支付宝退款错误!", e.getMessage());
return "FAIL";
}
}
/**
* 校验回调参数
* @param params 参数
* @return
*/
public String checkParams(Map<String, String> params) {
// 查询订单是否是本平台的
String outTradeNo = params.get("out_trade_no");
TbMemberOrder order = memberOrderService.selectOrderByOrderNo(outTradeNo);
if (ObjectUtils.isEmpty(order)) {
return "FAIL";
}
// 验证商户app_id
String appId = params.get("app_id");
if(! appId.equals(aliPayConfig.getAppId())){
log.error("app_id 错误");
return "FAIL";
}
return "success";
}
}
package com.ruoyi.hezhi.api.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 微信支付配置 Bean
*
* @author lhgg
* @date 2022/4/23
*/
@Component
@ConfigurationProperties(prefix = "wxpay")
public class WxPayBean {
private String appId;
private String appSecret;
private String mchId;
private String partnerKey;
private String certPath;
private String domain;
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getAppSecret() {
return appSecret;
}
public void setAppSecret(String appSecret) {
this.appSecret = appSecret;
}
public String getMchId() {
return mchId;
}
public void setMchId(String mchId) {
this.mchId = mchId;
}
public String getPartnerKey() {
return partnerKey;
}
public void setPartnerKey(String partnerKey) {
this.partnerKey = partnerKey;
}
public String getCertPath() {
return certPath;
}
public void setCertPath(String certPath) {
this.certPath = certPath;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
@Override
public String toString() {
return "WxPayBean{" +
"appId='" + appId + '\'' +
", appSecret='" + appSecret + '\'' +
", mchId='" + mchId + '\'' +
", partnerKey='" + partnerKey + '\'' +
", certPath='" + certPath + '\'' +
", domain='" + domain + '\'' +
'}';
}
}
package com.ruoyi.hezhi.api.kaoshi;
import com.ruoyi.common.annotation.RateLimiter;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.hezhi.domain.dto.ConferenceRegistrationDTO;
import com.ruoyi.hezhi.domain.dto.StudentDTO;
import com.ruoyi.hezhi.domain.dto.StudyCenterDTO;
import com.ruoyi.hezhi.service.ITbConferenceRegistrationService;
import com.ruoyi.hezhi.service.ITbExamRegistrationService;
import com.ruoyi.hezhi.service.ITbStudentService;
import com.ruoyi.hezhi.service.ITbStudyCenterService;
import io.swagger.annotations.Api;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @Author: LCL
* @Date: 2024/10/08
* @Description:通用API
*/
@Api("申请")
@RestController
@RequestMapping("/api/apply")
public class ApiApplyController {
@Resource
private ITbStudyCenterService studyCenterService;
@Resource
private ITbStudentService studentService;
@Resource
private ITbConferenceRegistrationService conferenceRegistrationService;
@Resource
private ITbExamRegistrationService examRegistrationService;
/**
* 学习中心入驻
*
* @param studyCenterDTO
* @return ok
*/
@RepeatSubmit
@RateLimiter(key = "API_joinInStudyCenter", time = 5, count = 50)
@PostMapping("/joinInStudyCenter")
public AjaxResult joinInStudyCenter(@RequestBody @Validated({StudyCenterDTO.joinInStudyCenter.class}) StudyCenterDTO studyCenterDTO, BindingResult bindingResult) {
// 参数校验
if (bindingResult.hasErrors()) {
return AjaxResult.allParameterErrors(bindingResult);
}
try {
return studyCenterService.joinInStudyCenter(studyCenterDTO);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("学习中心入驻异常");
}
}
/**
* 学员认证
*
* @param studentDTO
* @return ok
*/
@RepeatSubmit
@RateLimiter(key = "API_authenticationStudent", time = 5, count = 50)
@PostMapping("/authenticationStudent")
public AjaxResult authenticationStudent(@RequestBody @Validated({StudentDTO.authenticationStudent.class}) StudentDTO studentDTO, BindingResult bindingResult) {
// 参数校验
if (bindingResult.hasErrors()) {
return AjaxResult.allParameterErrors(bindingResult);
}
try {
return studentService.authenticationStudent(studentDTO);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("学员认证异常");
}
}
/**
* 参会报名
*
* @param conferenceRegistrationDTO
* @return ok
*/
@RepeatSubmit
@RateLimiter(key = "API_conferenceRegistration", time = 5, count = 50)
@PostMapping("/conferenceRegistration")
public AjaxResult conferenceRegistration(@RequestBody @Validated({ConferenceRegistrationDTO.conferenceRegistration.class}) ConferenceRegistrationDTO conferenceRegistrationDTO, BindingResult bindingResult) {
// 参数校验
if (bindingResult.hasErrors()) {
return AjaxResult.allParameterErrors(bindingResult);
}
try {
return conferenceRegistrationService.conferenceRegistration(conferenceRegistrationDTO);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("参会报名异常");
}
}
}
package com.ruoyi.hezhi.api.kaoshi;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.hezhi.domain.vo.DictParamVO;
import com.ruoyi.hezhi.service.*;
import com.ruoyi.system.service.ISysDictDataService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* @Author: LCL
* @Date: 2024/10/08
* @Description:通用API
*/
@Api("分类")
@RestController
@RequestMapping("/api/class")
public class ApiClassController {
@Resource
private ITbCareerClassService tbCareerClassService;
@Resource
private ITbMajorClassService majorClassService;
@Resource
private ITbRegionService regionService;
@Resource
private ITbConfigService configService;
@Resource
private ITbEvaluateAgencyClassService evaluateAgencyClassService;
@Resource
private ITbStudyCenterClassService studyCenterClassService;
@Resource
private ITbContinuingEducationClassService continuingEducationClassService;
@Resource
private ISysDictDataService dictDataService;
@Resource
private ITbDownloadService downloadService;
@Resource
private ITbEnterpriseProgressService enterpriseProgressService;
/**
* 获取字典参数列表
*
* @param paramType 字典类型(0-企业规模)
* @return 结果
*/
@GetMapping("/getDictParamList")
public AjaxResult getDictParamList(String paramType) {
List<DictParamVO> dictParamList = dictDataService.getDictParamList(paramType);
return AjaxResult.success(dictParamList);
}
/**
* 职业分类树列表
*
* @return success
*/
@GetMapping("/getCareerClassTreeList")
public AjaxResult getCareerClassTreeList() {
try {
return AjaxResult.success().put("data", tbCareerClassService.selectTbCareerClassTreeList());
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("职业分类树列表异常");
}
}
/**
* 职业分类列表
*
* @param params careerId 1-职业技能,2-职业教育
* @return success
*/
@GetMapping("/getCareerClassMapList")
public AjaxResult getCareerClassMapList(@RequestParam Map<String, Object> params) {
try {
return AjaxResult.success().put("data", tbCareerClassService.selectTbCareerClassMapList(params));
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("职业分类列表异常");
}
}
/**
* 专业分类列表
*
* @param params pid
* @return success
*/
@GetMapping("/getMajorClassMapList")
public AjaxResult getMajorClassMapList(@RequestParam Map<String, Object> params) {
try {
return AjaxResult.success().put("data", majorClassService.selectTbMajorClassMapList(params));
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("专业分类列表异常");
}
}
/**
* 专业分类树列表
*
* @return success
*/
@GetMapping("/getMajorClassTreeList")
public AjaxResult getMajorClassTreeList() {
try {
return AjaxResult.success().put("data", majorClassService.selectTbMajorClassTreeList());
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("专业分类列表异常");
}
}
/**
* 行政区域列表
*
* @param params pid 上级ID
* @return success
*/
@GetMapping("/getRegionList")
public AjaxResult getRegionList(@RequestParam Map<String, Object> params) {
try {
return AjaxResult.success().put("data", regionService.getRegionList(params));
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("行政区域列表异常");
}
}
/**
* 行政区域树列表
*
* @return success
*/
@GetMapping("/getRegionTreeList")
public AjaxResult getRegionTreeList() {
try {
return AjaxResult.success().put("data", regionService.selectTbRegionTreeList());
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("行政区域树列表异常");
}
}
/**
* 相关设置
*
* @param params identifying 设置标识
* @return ok
*/
@GetMapping("/getConfigInfo")
public AjaxResult getConfigInfo(@RequestParam Map<String, Object> params) {
if (!params.containsKey("identifying") || StringUtils.isBlank(params.get("identifying").toString())) {
return AjaxResult.error("缺少 identifying 设置标识");
}
try {
return AjaxResult.success().put("data", configService.getLiveBroadcastInfo(params));
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("相关设置异常");
}
}
/**
* 评价机构分类列表
*
* @param params
* @return success
*/
@GetMapping("/getEvaluateAgencyClassMapList")
public AjaxResult getEvaluateAgencyClassMapList(@RequestParam Map<String, Object> params) {
try {
return AjaxResult.success().put("data", evaluateAgencyClassService.getEvaluateAgencyClassMapList(params));
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("评价机构分类列表异常");
}
}
/**
* 学习中心分类列表
*
* @param params
* @return success
*/
@GetMapping("/getStudyCenterClassMapList")
public AjaxResult getStudyCenterClassMapList(@RequestParam Map<String, Object> params) {
try {
return AjaxResult.success().put("data", studyCenterClassService.getStudyCenterClassMapList(params));
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("学习中心分类列表异常");
}
}
/**
* 继续教育分类列表
*
* @param params
* @return success
*/
@GetMapping("/getContinuingEducationClassMapList")
public AjaxResult getContinuingEducationClassMapList(@RequestParam Map<String, Object> params) {
try {
return AjaxResult.success().put("data", continuingEducationClassService.getContinuingEducationClassMapList(params));
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("继续教育分类列表异常");
}
}
/**
* 在线下载列表
*
* @param pageNum 页码
* @param pageSize 每页数据量
* @param params searchValue 搜索词
* @return success
*/
@GetMapping("/getDownloadList")
public AjaxResult getDownloadList(@RequestParam(value = "pageNum", defaultValue = "1", required = false) Integer pageNum,
@RequestParam(value = "pageSize", defaultValue = "100", required = false) Integer pageSize,
@RequestParam Map<String, Object> params) {
try {
PageHelper.startPage(pageNum, pageSize);
List<Map<String, Object>> list = downloadService.getDownloadList(params);
PageInfo<Map<String, Object>> pageInfo = new PageInfo(list);
return AjaxResult.success().put("data", pageInfo);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("在线下载列表异常");
}
}
/**
* 企业历程列表
*
* @return success
*/
@GetMapping("/getEnterpriseProgressList")
public AjaxResult getEnterpriseProgressList() {
try {
return AjaxResult.success().put("data", enterpriseProgressService.getEnterpriseProgressList());
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("企业历程列表异常");
}
}
}
package com.ruoyi.hezhi.api.kaoshi;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.hezhi.service.*;
import com.ruoyi.system.service.ISysDictDataService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Map;
/**
* @Author: LCL
* @Date: 2024/10/08
* @Description:通用API
*/
@Api("List")
@RestController
@RequestMapping("/api/list")
public class ApiListController {
@Resource
private ITbBannerService bannerService;
@Resource
private ITbNewsService newsService;
@Resource
private ITbTrendsService tbTrendsService;
@Resource
private ITbCaseTypeService caseTypeService;
@Resource
private ITbCaseService caseService;
@Resource
private ITbNoticeService noticeService;
@Resource
private ITbTeacherService teacherService;
@Resource
private ISysDictDataService dictDataService;
@Resource
private ITbCareerClassService tbCareerClassService;
@Resource
private ITbExamNoticeService examNoticeService;
@Resource
private ITbCooperatePartnerService cooperatePartnerService;
@Resource
private ITbAuthorizeHonorService authorizeHonorService;
@Resource
private ITbMajorClassService majorClassService;
@Resource
private ITbRegionService regionService;
@Resource
private ITbLiveBroadcastService liveBroadcastService;
@Resource
private ITbConfigService configService;
@Resource
private ITbStudyCenterService studyCenterService;
@Resource
private ITbEvaluateAgencyService evaluateAgencyService;
@Resource
private ITbContinuingEducationClassService continuingEducationClassService;
@Resource
private ITbConferenceNoticeService conferenceNoticeService;
@Resource
private ITbConferencePeopleService conferencePeopleService;
@Resource
private ITbConferenceRegistrationService conferenceRegistrationService;
@Resource
private ITbExamService examService;
@Resource
private ITbMemberJoinService memberJoinService;
/**
* 评价机构列表
*
* @param params searchValue 搜索词
* evaluateAgencyClassId 评价机构分类ID(0或不传查全部)
* @return success
*/
@GetMapping("/getEvaluateAgencyList")
public AjaxResult getEvaluateAgencyList(@RequestParam Map<String, Object> params) {
try {
return AjaxResult.success().put("data", evaluateAgencyService.getEvaluateAgencyList(params));
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("评价机构列表异常");
}
}
/**
* 职业分类列表
*
* @param params careerId 1-职业技能,2-职业教育
* @return success
*/
@GetMapping("/getCareerClassMapList")
public AjaxResult getCareerClassMapList(@RequestParam Map<String, Object> params) {
try {
params.put("careerId", 1);
params.put("level", 2);
return AjaxResult.success().put("data", tbCareerClassService.selectTbCareerClassMapList(params));
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("职业分类列表异常");
}
}
/**
* 学习中心列表
*
* @param params searchValue 搜索词
* studyCenterClassId 学习中心分类ID(0或不传查全部)
* @return success
*/
@GetMapping("/getStudyCenterList")
public AjaxResult getStudyCenterList(@RequestParam Map<String, Object> params) {
try {
return AjaxResult.success().put("data", studyCenterService.getStudyCenterList(params));
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("学习中心列表异常");
}
}
}
package com.ruoyi.hezhi.controller;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.hezhi.domain.TbAuthorizeHonor;
import com.ruoyi.hezhi.service.ITbAuthorizeHonorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 授权荣誉Controller
*
* @author ruoyi
* @date 2024-10-16
*/
@RestController
@RequestMapping("/hezhi/authorizeHonor")
public class TbAuthorizeHonorController extends BaseController
{
@Autowired
private ITbAuthorizeHonorService tbAuthorizeHonorService;
/**
* 查询授权荣誉列表
*/
@PreAuthorize("@ss.hasPermi('hezhi:authorizeHonor:list')")
@GetMapping("/list")
public TableDataInfo list(TbAuthorizeHonor tbAuthorizeHonor)
{
startPage();
List<TbAuthorizeHonor> list = tbAuthorizeHonorService.selectTbAuthorizeHonorList(tbAuthorizeHonor);
return getDataTable(list);
}
/**
* 导出授权荣誉列表
*/
@PreAuthorize("@ss.hasPermi('hezhi:authorizeHonor:export')")
@Log(title = "授权荣誉", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, TbAuthorizeHonor tbAuthorizeHonor)
{
List<TbAuthorizeHonor> list = tbAuthorizeHonorService.selectTbAuthorizeHonorList(tbAuthorizeHonor);
ExcelUtil<TbAuthorizeHonor> util = new ExcelUtil<TbAuthorizeHonor>(TbAuthorizeHonor.class);
util.exportExcel(response, list, "授权荣誉数据");
}
/**
* 获取授权荣誉详细信息
*/
@PreAuthorize("@ss.hasPermi('hezhi:authorizeHonor:query')")
@GetMapping(value = "/{authorizeHonorId}")
public AjaxResult getInfo(@PathVariable("authorizeHonorId") Long authorizeHonorId)
{
return success(tbAuthorizeHonorService.selectTbAuthorizeHonorByAuthorizeHonorId(authorizeHonorId));
}
/**
* 新增授权荣誉
*/
@PreAuthorize("@ss.hasPermi('hezhi:authorizeHonor:add')")
@Log(title = "授权荣誉", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody TbAuthorizeHonor tbAuthorizeHonor)
{
return toAjax(tbAuthorizeHonorService.insertTbAuthorizeHonor(tbAuthorizeHonor));
}
/**
* 修改授权荣誉
*/
@PreAuthorize("@ss.hasPermi('hezhi:authorizeHonor:edit')")
@Log(title = "授权荣誉", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody TbAuthorizeHonor tbAuthorizeHonor)
{
return toAjax(tbAuthorizeHonorService.updateTbAuthorizeHonor(tbAuthorizeHonor));
}
/**
* 删除授权荣誉
*/
@PreAuthorize("@ss.hasPermi('hezhi:authorizeHonor:remove')")
@Log(title = "授权荣誉", businessType = BusinessType.DELETE)
@DeleteMapping("/{authorizeHonorIds}")
public AjaxResult remove(@PathVariable Long[] authorizeHonorIds)
{
return toAjax(tbAuthorizeHonorService.deleteTbAuthorizeHonorByAuthorizeHonorIds(authorizeHonorIds));
}
}
package com.ruoyi.hezhi.controller;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.hezhi.domain.TbBanner;
import com.ruoyi.hezhi.service.ITbBannerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 轮播图Controller
*
* @author CC
* @date 2024-03-12
*/
@RestController
@RequestMapping("/hezhi/banner")
public class TbBannerController extends BaseController
{
@Autowired
private ITbBannerService tbBannerService;
/**
* 查询轮播图列表
*/
@PreAuthorize("@ss.hasPermi('hezhi:banner:list')")
@GetMapping("/list")
public TableDataInfo list(TbBanner tbBanner)
{
startPage();
List<TbBanner> list = tbBannerService.selectTbBannerList(tbBanner);
return getDataTable(list);
}
/**
* 导出轮播图列表
*/
@PreAuthorize("@ss.hasPermi('hezhi:banner:export')")
@Log(title = "轮播图", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, TbBanner tbBanner)
{
List<TbBanner> list = tbBannerService.selectTbBannerList(tbBanner);
ExcelUtil<TbBanner> util = new ExcelUtil<TbBanner>(TbBanner.class);
util.exportExcel(response, list, "轮播图数据");
}
/**
* 获取轮播图详细信息
*/
@PreAuthorize("@ss.hasPermi('hezhi:banner:query')")
@GetMapping(value = "/{bannerId}")
public AjaxResult getInfo(@PathVariable("bannerId") String bannerId)
{
return success(tbBannerService.selectTbBannerByBannerId(bannerId));
}
/**
* 新增轮播图
*/
@PreAuthorize("@ss.hasPermi('hezhi:banner:add')")
@Log(title = "轮播图", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody TbBanner tbBanner)
{
return toAjax(tbBannerService.insertTbBanner(tbBanner));
}
/**
* 修改轮播图
*/
@PreAuthorize("@ss.hasPermi('hezhi:banner:edit')")
@Log(title = "轮播图", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody TbBanner tbBanner)
{
return toAjax(tbBannerService.updateTbBanner(tbBanner));
}
/**
* 删除轮播图
*/
@PreAuthorize("@ss.hasPermi('hezhi:banner:remove')")
@Log(title = "轮播图", businessType = BusinessType.DELETE)
@DeleteMapping("/{bannerIds}")
public AjaxResult remove(@PathVariable String[] bannerIds)
{
return toAjax(tbBannerService.deleteTbBannerByBannerIds(bannerIds));
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This image diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment