Commit b74ea3d7 authored by 霍传世's avatar 霍传世

Initial commit

parents
/mvnw text eol=lf
*.cmd text eol=crlf
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
This diff is collapsed.
This diff is collapsed.
<# : batch portion
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.3.2
@REM
@REM Optional ENV vars
@REM MVNW_REPOURL - repo url base for downloading maven distribution
@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output
@REM ----------------------------------------------------------------------------
@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
@SET __MVNW_CMD__=
@SET __MVNW_ERROR__=
@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
@SET PSModulePath=
@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
)
@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
@SET __MVNW_PSMODULEP_SAVE=
@SET __MVNW_ARG0_NAME__=
@SET MVNW_USERNAME=
@SET MVNW_PASSWORD=
@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
@echo Cannot start maven from wrapper >&2 && exit /b 1
@GOTO :EOF
: end batch / begin powershell #>
$ErrorActionPreference = "Stop"
if ($env:MVNW_VERBOSE -eq "true") {
$VerbosePreference = "Continue"
}
# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
if (!$distributionUrl) {
Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
}
switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
"maven-mvnd-*" {
$USE_MVND = $true
$distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
$MVN_CMD = "mvnd.cmd"
break
}
default {
$USE_MVND = $false
$MVN_CMD = $script -replace '^mvnw','mvn'
break
}
}
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
if ($env:MVNW_REPOURL) {
$MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
$distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
}
$distributionUrlName = $distributionUrl -replace '^.*/',''
$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
if ($env:MAVEN_USER_HOME) {
$MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
}
$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
exit $?
}
if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
}
# prepare tmp dir
$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
trap {
if ($TMP_DOWNLOAD_DIR.Exists) {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
}
New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
# Download and Install Apache Maven
Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
Write-Verbose "Downloading from: $distributionUrl"
Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
$webclient = New-Object System.Net.WebClient
if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
$webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
# If specified, validate the SHA-256 sum of the Maven distribution zip file
$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
if ($distributionSha256Sum) {
if ($USE_MVND) {
Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
}
Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
}
}
# unzip and move
Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
try {
Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
} catch {
if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
Write-Error "fail to move MAVEN_HOME"
}
} finally {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yuda</groupId>
<artifactId>PaperStudentConfig</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>PaperStudentConfig</name>
<description>PaperStudentConfig</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.155</version> <!-- 确保版本支持Region类 -->
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos-sts_api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-cells</artifactId>
<version>24.10</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version> <!-- 根据需要选择版本 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version> <!-- 请根据实际需求选择版本 -->
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
package com.yuda.paperstudentconfig;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.yuda.paperstudentconfig.mapper")
public class PaperStudentConfigApplication {
public static void main(String[] args) {
SpringApplication.run(PaperStudentConfigApplication.class, args);
}
}
package com.yuda.paperstudentconfig.anotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 注解定义
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExcelColumn {
String value(); // 表头名
}
package com.yuda.paperstudentconfig.config;
//
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration//spring2.0以上
public class CORSConfiguration {
private CorsConfiguration corsConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
// 允许哪个请求来源进行跨域
// corsConfiguration.addAllowedOrigin("*");
// 这是因为springboot升级成2.4.0以上时对AllowedOrigin设置发生了改变,不能有”*“
corsConfiguration.addAllowedOriginPattern("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
corsConfiguration.setMaxAge(3600L);
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig());
return new CorsFilter(source);
}
}
package com.yuda.paperstudentconfig.config;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.region.Region;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CommonConfig {
@Bean(name = "cosClient")
public COSClient cosClient() {
COSCredentials cred = new BasicCOSCredentials("AKID61zliQDpBOgqALHvLl25sRmvnV9cohPt", "TkqtgCUaYJhx1rTpztY2LQRO9h2pPmun");
Region region = new Region("ap-beijing");
ClientConfig clientConfig = new ClientConfig(region);
clientConfig.setHttpProtocol(HttpProtocol.https);
// 3 生成 cos 客户端。
return new COSClient(cred, clientConfig);
}
// @Bean(name = "cosClient")
// public COSClient cosClient() {
// COSCredentials cred = new BasicCOSCredentials("AKIDsa6QWP5Wl8RZUDzZx8FArKZbS5lFWZOi", "hBRTIsEH7j7HDwUoxvgIo9IEzELzTlqh");
// Region region = new Region("ap-beijing");
// ClientConfig clientConfig = new ClientConfig(region);
// clientConfig.setHttpProtocol(HttpProtocol.https);
//
// // 3 生成 cos 客户端。
// return new COSClient(cred, clientConfig);
// }
}
package com.yuda.paperstudentconfig.config;
public class ConstantProperties {
public static String cosBucketName = "checkpad-20240229-1317275686";
public static final String cosBucketSecretId = "AKID61zliQDpBOgqALHvLl25sRmvnV9cohPt";
public static final String cosBucketSecreteKey = "TkqtgCUaYJhx1rTpztY2LQRO9h2pPmun";
public static final String cosRegion = "ap-beijing";
}
package com.yuda.paperstudentconfig.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
\ No newline at end of file
package com.yuda.paperstudentconfig.config;
import com.yuda.paperstudentconfig.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 和springmvc的webmvc拦截配置一样
*
* @author BIANP
*/
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 拦截所有请求,通过判断是否有 @LoginRequired 注解 决定是否需要登录
registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login/signIn")
.excludePathPatterns(// 允许对于网站静态资源的无授权访问
"/",
"/*.html",
"/favicon.ico",
"/**/*.html",
"/**/*.css",
"/**/*.js",
"/**/*.png",
"/**/*.jpg",
"/swagger-resources/**",
"/v2/api-docs/**"
);
}
}
package com.yuda.paperstudentconfig.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yuda.paperstudentconfig.entity.SpartaUser;
import com.yuda.paperstudentconfig.service.impl.SpartaUserServiceImpl;
import com.yuda.paperstudentconfig.utils.Constant;
import com.yuda.paperstudentconfig.utils.ResponseResult;
import com.yuda.paperstudentconfig.vo.AccountVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@RestController
@RequestMapping("/login")
public class LoginController {
@Resource
private SpartaUserServiceImpl spartaUserService;
@Resource
private StringRedisTemplate stringRedisTemplate;
@PostMapping("/signIn")
public ResponseResult login(@RequestBody AccountVo accountVo){
String username = accountVo.getUsername();
String password = accountVo.getPassword();
if (StringUtils.isEmpty(username)) {
return ResponseResult.fail(400, "请填写登录账号");
}
if (StringUtils.isEmpty(password)) {
return ResponseResult.fail(400, "请填写登录密码");
}
QueryWrapper<SpartaUser> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", username).eq("password",password);
// .eq("password", DigestUtils.md5DigestAsHex(password.getBytes()));
SpartaUser account = spartaUserService.getOne(queryWrapper);
if (account != null) { // 账号正确
String token = spartaUserService.generatorToken(account);
stringRedisTemplate.opsForValue().set(Constant.token + account.getUsername(), token, 24, TimeUnit.HOURS);
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", token);
jsonObject.put("userId", account.getId());
return ResponseResult.success("操作成功", jsonObject);
} else {
return ResponseResult.fail(400, "用户名或密码不正确");
}
}
@PostMapping("/signOut")
public ResponseResult logout(@RequestBody AccountVo accountVo) {
// 从Redis中删除token
String key = Constant.token + accountVo.getUsername();
Boolean deleted = stringRedisTemplate.delete(key);
if (Boolean.TRUE.equals(deleted)) {
return ResponseResult.success("退出成功");
} else {
return ResponseResult.fail(400, "退出失败,token不存在或已过期");
}
}
}
package com.yuda.paperstudentconfig.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.model.COSObjectSummary;
import com.qcloud.cos.model.ListObjectsRequest;
import com.qcloud.cos.model.ObjectListing;
import com.yuda.paperstudentconfig.entity.SpartaExamStudent;
import com.yuda.paperstudentconfig.entity.SpartaPaper;
import com.yuda.paperstudentconfig.entity.SpartaUserPaper;
import com.yuda.paperstudentconfig.service.impl.SpartaExamStudentServiceImpl;
import com.yuda.paperstudentconfig.service.impl.SpartaPaperServiceImpl;
import com.yuda.paperstudentconfig.service.impl.SpartaUserPaperServiceImpl;
import com.yuda.paperstudentconfig.utils.ExcelImportUtil;
import com.yuda.paperstudentconfig.utils.ResponseResult;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/main")
public class MainController {
@Resource
private SpartaPaperServiceImpl spartaPaperService;
@Resource
private SpartaUserPaperServiceImpl spartaUserPaperService;
@Resource
private SpartaPaperServiceImpl spartaPaperServiceImpl;
@Resource
private SpartaExamStudentServiceImpl spartaExamStudentService;
@Resource
private COSClient cosClient;
@RequestMapping("/index")
public ResponseResult index(
@RequestParam String userId,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
Page<SpartaPaper> page = new Page<>(pageNum, pageSize);
Page<SpartaPaper> result = spartaPaperService.getPapersByUserId(page, userId);
return ResponseResult.success("查询成功", result);
}
@PostMapping("/addPaper")
public ResponseResult addPaper(@RequestBody SpartaUserPaper spartaUserPaper) {
if (spartaUserPaper.getUserId() == null || spartaUserPaper.getPaperId() == null) {
return ResponseResult.fail(400, "用户ID和试卷ID不能为空");
}
SpartaUserPaper spartaUserPaper1 = spartaUserPaperService.getByUserIdAndPaperId(spartaUserPaper.getUserId(),spartaUserPaper.getPaperId(),spartaUserPaper.getExamUuid());
if(spartaUserPaper1!=null){
return ResponseResult.success("试卷添加成功");
}
boolean result = spartaUserPaperService.save(spartaUserPaper);
if (result) {
return new ResponseResult(200, "试卷添加成功");
} else {
return ResponseResult.fail(500, "试卷添加失败");
}
}
@GetMapping("/papers")
public ResponseResult getPapers(
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
Page<SpartaPaper> page = new Page<>(pageNum, pageSize);
Page<SpartaPaper> result = spartaPaperService.page(page);
return ResponseResult.success("查询成功", result);
}
@PostMapping("/importStudents")
@Transactional(rollbackFor = Exception.class)
public ResponseResult importStudents(
@RequestParam("file") MultipartFile file,
@RequestParam String userId,
@RequestParam Integer paperId,
@RequestParam String examUuid) throws IOException {
// 校验文件类型
if (!file.getOriginalFilename().endsWith(".xlsx") && !file.getOriginalFilename().endsWith(".xls")) {
return ResponseResult.fail(400, "仅支持Excel文件上传");
}
// 解析Excel文件
List<SpartaExamStudent> students = ExcelImportUtil.importExcel(file, SpartaExamStudent.class);
for (SpartaExamStudent student : students) {
if(student.getZkzNum()==null){
return ResponseResult.fail(400, "准考证号不能为空");
}
if(student.getSfzNum()==null){
return ResponseResult.fail(400, "身份证号不能为空");
}
if(student.getName()==null){
return ResponseResult.fail(400, "姓名不能为空");
}
if(!student.getZkzNum().equals(student.getSfzNum())){
return ResponseResult.fail(400, "准考证号和身份证号不一致");
}
}
// 绑定用户和试卷关系
for (SpartaExamStudent student : students) {
student.setUserId(userId);
student.setPaperId(paperId);
student.setExamUuid(examUuid);
student.setAvatarKey("qj240612/test.png");
student.setAvatarBucket("xjheadphoto-1317275686");
student.setAvatarEndpoint("ap-beijing");
}
// 批量保存或更新到数据库
boolean result = true;
for (SpartaExamStudent student : students) {
QueryWrapper<SpartaExamStudent> wrapper = new QueryWrapper<>();
wrapper.eq("sfz_num", student.getSfzNum())
.eq("paper_id", paperId)
.eq("exam_uuid", examUuid);
SpartaExamStudent existingStudent = spartaExamStudentService.getOne(wrapper);
if (existingStudent != null) {
student.setId(existingStudent.getId()); // 设置ID以便更新
result &= spartaExamStudentService.updateById(student);
} else {
result &= spartaExamStudentService.save(student);
}
}
if (result) {
return ResponseResult.success("导入成功", students.size());
} else {
return ResponseResult.fail(500, "导入失败");
}
}
@GetMapping("/getExamStudents")
public ResponseResult getExamStudents(
@RequestParam String userId,
@RequestParam Long paperId,
@RequestParam String examUuid,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
List<String> subjectOrder = Arrays.asList(
"语文", "数学", "英语", "物理", "化学", "生物", "政治", "历史", "地理","数理探究1","数理探究2"
);
Page<SpartaExamStudent> page = new Page<>(pageNum, pageSize);
Page<SpartaExamStudent> result = spartaExamStudentService.getExamStudents(page, userId, paperId,examUuid);
if(result!=null){
List<SpartaExamStudent> students = result.getRecords();
for (SpartaExamStudent student : students) {
// 构建文件前缀
String prefix = "answer/" + student.getExamUuid()+"_"+ paperId + "_" + student.getSfzNum() + "_";
// 列出COS中的文件
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
listObjectsRequest.setBucketName("mkty-1317275686");
listObjectsRequest.setPrefix(prefix);
ObjectListing objectListing = cosClient.listObjects(listObjectsRequest);
List<String> fileNames = new ArrayList<>();
for(COSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
fileNames.add(objectSummary.getKey());
}
if(!fileNames.isEmpty()){
List<String> answerSubjectStatus = fileNames.stream()
.map(fileName -> {
String[] parts = fileName.split("_");
return parts.length > 3 ? parts[3] : ""; // 安全获取第4部分
})
.filter(s -> !s.isEmpty()) // 过滤空字符串
.distinct() // 去重// 按指定顺序排序
.collect(Collectors.toList());
String status = answerSubjectStatus.stream()
.map(s -> s.replace(".db", ""))
.sorted(Comparator.comparingInt(subjectOrder::indexOf))
.collect(Collectors.joining("|"));
student.setAnswerStatus(status);
}
}
}
return ResponseResult.success("查询成功", result);
}
}
package com.yuda.paperstudentconfig.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.yuda.paperstudentconfig.anotation.ExcelColumn;
import lombok.Data;
import lombok.Value;
@Data
@TableName("sparta_exam_student")
public class SpartaExamStudent {
@TableId(type = IdType.AUTO)
private Integer id;
private String examUuid;
@ExcelColumn(value = "姓名")
private String name;
@ExcelColumn(value = "准考证号")
private String zkzNum;
@ExcelColumn(value = "身份证号")
private String sfzNum;
private String avatarKey;
private String avatarBucket;
private String avatarEndpoint;
private Integer paperId;
private String userId;
@TableField(exist = false)
private String answerStatus;
}
\ No newline at end of file
package com.yuda.paperstudentconfig.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
@Data
@TableName("sparta_paper")
public class SpartaPaper {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField(value = "exam_uuid")
private String examUuid;
private String paperId;
private String name;
private String passwd;
private Integer switchStatus;
private String zpasswd;
private Integer beginTime;
private Integer endTime;
private Integer totalTime;
private String createTime;
private String updateTime;
private Integer useStatus;
}
\ No newline at end of file
package com.yuda.paperstudentconfig.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.util.Date;
@Data
@TableName("sparta_user")
public class SpartaUser {
@TableId(type = IdType.ASSIGN_ID)
private String id;
private String username;
private String password;
@TableField(fill = FieldFill.INSERT,value = "create_time")
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE,value = "update_time")
private Date updateTime;
}
\ No newline at end of file
package com.yuda.paperstudentconfig.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
@Data
@TableName("sparta_user_paper")
public class SpartaUserPaper {
@TableId(type = IdType.AUTO)
private Integer id;
private String userId;
private String examUuid;
private String paperId;
private String name;
private Integer status;
@TableField(fill = FieldFill.INSERT)
private String createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateTime;
}
\ No newline at end of file
package com.yuda.paperstudentconfig.interceptor;
import com.alibaba.fastjson.JSON;
import com.yuda.paperstudentconfig.utils.Constant;
import com.yuda.paperstudentconfig.utils.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Author ryze
* @Date 2024/2/22
*/
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
Boolean hasKey = stringRedisTemplate.hasKey(Constant.token + token);
String url = request.getRequestURL().toString();
log.info("访问接口 {}", url);
// token过期了
if (!hasKey) {
log.info(">>>token过期, 跳至登录页");
ResponseResult responseResult = ResponseResult.fail(401, "token过期了");
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
response.getWriter().write(JSON.toJSONString(responseResult));
return false;
}
return true;
}
}
package com.yuda.paperstudentconfig.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuda.paperstudentconfig.entity.SpartaExamStudent;
public interface SpartaExamStudentMapper extends BaseMapper<SpartaExamStudent> {
Page<SpartaExamStudent> selectExamStudents(Page<SpartaExamStudent> page, String userId, Long paperId,String examUuid);
}
\ No newline at end of file
package com.yuda.paperstudentconfig.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuda.paperstudentconfig.entity.SpartaPaper;
import org.apache.ibatis.annotations.Param;
public interface SpartaPaperMapper extends BaseMapper<SpartaPaper> {
Page<SpartaPaper> selectPapersByUserId(Page<SpartaPaper> page, String userId);
SpartaPaper getByPaperId(@Param("paperId") String paperId);
}
\ No newline at end of file
package com.yuda.paperstudentconfig.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yuda.paperstudentconfig.entity.SpartaUser;
public interface SpartaUserMapper extends BaseMapper<SpartaUser> {
}
\ No newline at end of file
package com.yuda.paperstudentconfig.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yuda.paperstudentconfig.entity.SpartaUserPaper;
public interface SpartaUserPaperMapper extends BaseMapper<SpartaUserPaper> {
SpartaUserPaper getByUserIdAndPaperId(String userId, String paperId,String examUuid);
}
\ No newline at end of file
package com.yuda.paperstudentconfig.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuda.paperstudentconfig.entity.SpartaExamStudent;
public interface SpartaExamStudentService extends IService<SpartaExamStudent> {
Page<SpartaExamStudent> getExamStudents(Page<SpartaExamStudent> page, String userId, Long paperId,String examUuid);
boolean removeByUserIdAndPaperId(String userId, Integer paperId);
}
\ No newline at end of file
package com.yuda.paperstudentconfig.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuda.paperstudentconfig.entity.SpartaPaper;
public interface SpartaPaperService extends IService<SpartaPaper> {
Page<SpartaPaper> getPapersByUserId(Page<SpartaPaper> page, String userId);
SpartaPaper getByPaperId(String paperId);
}
\ No newline at end of file
package com.yuda.paperstudentconfig.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuda.paperstudentconfig.entity.SpartaUserPaper;
public interface SpartaUserPaperService extends IService<SpartaUserPaper> {
SpartaUserPaper getByUserIdAndPaperId(String userId, String paperId,String examUuid);
}
\ No newline at end of file
package com.yuda.paperstudentconfig.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuda.paperstudentconfig.entity.SpartaUser;
public interface SpartaUserService extends IService<SpartaUser> {
String generatorToken(SpartaUser account);
}
\ No newline at end of file
package com.yuda.paperstudentconfig.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuda.paperstudentconfig.entity.SpartaExamStudent;
import com.yuda.paperstudentconfig.mapper.SpartaExamStudentMapper;
import com.yuda.paperstudentconfig.service.SpartaExamStudentService;
import org.springframework.stereotype.Service;
@Service
public class SpartaExamStudentServiceImpl extends ServiceImpl<SpartaExamStudentMapper, SpartaExamStudent> implements SpartaExamStudentService {
@Override
public Page<SpartaExamStudent> getExamStudents(Page<SpartaExamStudent> page, String userId, Long paperId,String examUuid) {
return baseMapper.selectExamStudents(page, userId, paperId,examUuid);
}
@Override
public boolean removeByUserIdAndPaperId(String userId, Integer paperId) {
QueryWrapper<SpartaExamStudent> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", userId).eq("paper_id", paperId);
return this.remove(queryWrapper);
}
}
\ No newline at end of file
package com.yuda.paperstudentconfig.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuda.paperstudentconfig.entity.SpartaPaper;
import com.yuda.paperstudentconfig.mapper.SpartaPaperMapper;
import com.yuda.paperstudentconfig.service.SpartaPaperService;
import org.springframework.stereotype.Service;
@Service
public class SpartaPaperServiceImpl extends ServiceImpl<SpartaPaperMapper, SpartaPaper> implements SpartaPaperService {
@Override
public Page<SpartaPaper> getPapersByUserId(Page<SpartaPaper> page, String userId) {
return baseMapper.selectPapersByUserId(page, userId);
}
@Override
public SpartaPaper getByPaperId(String paperId) {
return baseMapper.getByPaperId(paperId);
}
}
\ No newline at end of file
package com.yuda.paperstudentconfig.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuda.paperstudentconfig.entity.SpartaUserPaper;
import com.yuda.paperstudentconfig.mapper.SpartaUserPaperMapper;
import com.yuda.paperstudentconfig.service.SpartaUserPaperService;
import org.springframework.stereotype.Service;
@Service
public class SpartaUserPaperServiceImpl extends ServiceImpl<SpartaUserPaperMapper, SpartaUserPaper> implements SpartaUserPaperService {
@Override
public SpartaUserPaper getByUserIdAndPaperId(String userId, String paperId,String examUuid) {
return baseMapper.getByUserIdAndPaperId(userId,paperId,examUuid);
}
}
\ No newline at end of file
package com.yuda.paperstudentconfig.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuda.paperstudentconfig.entity.SpartaUser;
import com.yuda.paperstudentconfig.mapper.SpartaUserMapper;
import com.yuda.paperstudentconfig.service.SpartaUserService;
import com.yuda.paperstudentconfig.utils.Constant;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@Service
public class SpartaUserServiceImpl extends ServiceImpl<SpartaUserMapper, SpartaUser> implements SpartaUserService {
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public String generatorToken(SpartaUser account) {
String oldToken = stringRedisTemplate.opsForValue().get(Constant.tokenWithUserName + account.getUsername());
if (!StringUtils.isEmpty(oldToken)) {
//把老token删除
stringRedisTemplate.delete(Constant.token + oldToken); //实现第二个人把第一个人顶掉
}
//生成一个token
String token = UUID.randomUUID().toString();
stringRedisTemplate.opsForValue().set(Constant.token + token, JSON.toJSONString(account), Constant.tokenInvalidTime, TimeUnit.HOURS);
return token;
}
}
\ No newline at end of file
package com.yuda.paperstudentconfig.utils;
public class Constant {
public static final String token = "token:";
public static final String tokenWithUserName = "token_user_name:";
public static final Long tokenInvalidTime = 24L;//单位是小时
public static final String photoBucket = "checkpad-20240229-1317275686";//单位是小时
public static final String roomMonitor = "roommonitor-1317275686";//单位是小时
}
package com.yuda.paperstudentconfig.utils;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.Headers;
import com.qcloud.cos.http.HttpMethodName;
import com.qcloud.cos.model.GeneratePresignedUrlRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Date;
@Component
public class CosUtils {
@Autowired
private COSClient cosClient;
public String generateSimplePreSignedDownloadUrl(String bucketName, String key) {
try {
key = URLDecoder.decode(key, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
GeneratePresignedUrlRequest req =
new GeneratePresignedUrlRequest(bucketName, key, HttpMethodName.GET);
// 设置签名过期时间(可选), 若未进行设置则默认使用ClientConfig中的签名过期时间(30分钟)
// 这里设置签名在一分钟后过期
Date expirationDate = new Date(System.currentTimeMillis() + 6000 * 1000 * 60 * 24);
req.setExpiration(expirationDate);
// req.addRequestParameter("x-cos-traffic-limit", "8388608");
// 填写本次请求的头部。Host 必填
String name = cosClient.getClientConfig().getEndpointBuilder().buildGeneralApiEndpoint(bucketName);
req.putCustomRequestHeader(Headers.HOST, name);
URL url = cosClient.generatePresignedUrl(req);
return url.toString();
}
}
package com.yuda.paperstudentconfig.utils;
import com.yuda.paperstudentconfig.anotation.ExcelColumn;
import org.apache.poi.ss.usermodel.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ExcelImportUtil {
public static <T> List<T> importExcel(MultipartFile file, Class<T> clazz) throws IOException {
List<T> resultList = new ArrayList<>();
// 获取Workbook
Workbook workbook = WorkbookFactory.create(file.getInputStream());
Sheet sheet = workbook.getSheetAt(0);
// 获取表头映射
Row headerRow = sheet.getRow(0);
Map<String, Integer> headerMap = new HashMap<>();
for (Cell cell : headerRow) {
headerMap.put(cell.getStringCellValue(), cell.getColumnIndex());
}
// 遍历数据行
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
T instance = createInstanceFromRow(row, headerMap, clazz);
if (instance != null) {
resultList.add(instance);
}
}
workbook.close();
return resultList;
}
private static <T> T createInstanceFromRow(Row row, Map<String, Integer> headerMap, Class<T> clazz) {
try {
T instance = clazz.getDeclaredConstructor().newInstance();
for (Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(ExcelColumn.class)) {
ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
String columnName = annotation.value();
if (headerMap.containsKey(columnName)) {
int columnIndex = headerMap.get(columnName);
Cell cell = row.getCell(columnIndex);
field.setAccessible(true);
field.set(instance, getCellValue(cell, field.getType()));
}
}
}
return instance;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private static Object getCellValue(Cell cell, Class<?> fieldType) {
if (cell == null) {
return null;
}
switch (cell.getCellType()) {
case STRING:
return fieldType == String.class ? cell.getStringCellValue() : null;
case NUMERIC:
if (fieldType == Integer.class || fieldType == int.class) {
return (int) cell.getNumericCellValue();
} else if (fieldType == Double.class || fieldType == double.class) {
return cell.getNumericCellValue();
} else if (fieldType == Long.class || fieldType == long.class) {
return (long) cell.getNumericCellValue();
} else if (fieldType == String.class) {
// 将数字类型转换为字符串
return String.valueOf((long) cell.getNumericCellValue());
}
return null;
case BOOLEAN:
return fieldType == Boolean.class || fieldType == boolean.class ? cell.getBooleanCellValue() : null;
default:
return null;
}
}
}
\ No newline at end of file
package com.yuda.paperstudentconfig.utils;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
public class IpAddressUtil {
/**
* 获取Ip地址
* @param request
* @return
*/
public static String getIpAddress(HttpServletRequest request) {
String Xip = request.getHeader("X-Real-IP");
String XFor = request.getHeader("X-Forwarded-For");
if(StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int index = XFor.indexOf(",");
if(index != -1){
return XFor.substring(0,index);
}else{
return XFor;
}
}
XFor = Xip;
if(StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
return XFor;
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getRemoteAddr();
}
return XFor;
}
}
package com.yuda.paperstudentconfig.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JsonUtil {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 将对象转换成json字符串。
*/
public static String objectToJson(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
/**
* 将json结果集转化为对象
*
* @param jsonData json数据
* @param beanType 对象中的object类型
*/
public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
try {
T t = MAPPER.readValue(jsonData, beanType);
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将json数据转换成pojo对象list
*/
public static <T> List<T> jsonToList(String jsonData, Class<T> beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List<T> list = MAPPER.readValue(jsonData, javaType);
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package com.yuda.paperstudentconfig.utils;
import java.util.Random;
/**
* @Author ryze
* @Date 2024/2/27
*/
public class MathUtils {
/**
* 返回指定长度的随机数
*
* @param length 长度
* @return
*/
public static String getRandomStr(int length) {
String[] nums = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
StringBuilder sb = new StringBuilder();
Random random = new Random();
// 第一位不为0
try {
for (int i = 0; i < length; i++) {
if (i == 0) {
int first = random.nextInt(9) + 1;
String num = nums[first];
sb.append(num);
} else {
int other = random.nextInt(10);
String num = nums[other];
sb.append(num);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
}
package com.yuda.paperstudentconfig.utils;
import java.util.HashMap;
public class PageUtils {
public static HashMap<String, Object> getPage(Object page) {
HashMap<String, Object> hashMap = new HashMap<>();
if (page instanceof org.springframework.data.domain.Page) {
// 处理 Spring Data 的分页对象
org.springframework.data.domain.Page<?> springPage = (org.springframework.data.domain.Page<?>) page;
hashMap.put("data", springPage.getContent());
hashMap.put("totalElements", springPage.getTotalElements());
hashMap.put("totalPages", springPage.getTotalPages());
} else if (page instanceof com.baomidou.mybatisplus.extension.plugins.pagination.Page) {
// 处理 MyBatis-Plus 的分页对象
com.baomidou.mybatisplus.extension.plugins.pagination.Page<?> mybatisPage = (com.baomidou.mybatisplus.extension.plugins.pagination.Page<?>) page;
hashMap.put("data", mybatisPage.getRecords());
hashMap.put("totalElements", mybatisPage.getTotal());
hashMap.put("totalPages", mybatisPage.getPages());
} else {
throw new IllegalArgumentException("不支持的Page类型");
}
return hashMap;
}
}
package com.yuda.paperstudentconfig.utils;
import lombok.Data;
@Data
public class ResponseResult {
/**
* 结果编码
*/
private int code;
/**
* 返回值
*/
private Object data;
/**
* 提示
*/
private String message;
public ResponseResult(int code, String message) {
this.code = code;
this.message = message;
}
public ResponseResult(int code, String message, Object data) {
this.code = code;
this.message = message;
this.data = data;
}
public static ResponseResult success() {
return new ResponseResult(200, "操作成功");
}
public static ResponseResult success(String message) {
return new ResponseResult(200, message);
}
public static ResponseResult success(String message, Object data) {
return new ResponseResult(200, message, data);
}
public static ResponseResult fail() {
return new ResponseResult(500, "操作失败");
}
public static ResponseResult fail(int code, String message) {
return new ResponseResult(code, message);
}
}
package com.yuda.paperstudentconfig.utils;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class TimeZoneConvert {
public static String AsiaShangHai(String isoDateString){
Instant instant = Instant.parse(isoDateString);
// 将 Instant 对象转换为本地时区的 ZonedDateTime 对象
ZoneId localZone = ZoneId.systemDefault(); // 获取系统默认时区,你也可以使用特定时区,比如 ZoneId.of("Asia/Shanghai")
ZonedDateTime localTime = instant.atZone(localZone);
// 格式化本地时区时间为字符串
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
String localTimeString = localTime.format(formatter);
return localTimeString;
}
public static String DateFormat(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatDate = sdf.format(date);
return formatDate;
}
}
package com.yuda.paperstudentconfig.utils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipFileProcessor {
public static void unzip(InputStream zipFile, String destDir) throws IOException {
byte[] buffer = new byte[1024];
ZipInputStream zis = new ZipInputStream(zipFile);
ZipEntry zipEntry = zis.getNextEntry();
while (zipEntry != null) {
File newFile = newFile(destDir, zipEntry);
FileOutputStream fos = new FileOutputStream(newFile);
int len;
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
zipEntry = zis.getNextEntry();
}
zis.closeEntry();
zis.close();
}
private static File newFile(String destinationDir, ZipEntry zipEntry) throws IOException {
File destFile = new File(destinationDir, zipEntry.getName());
String destDirPath = destinationDir;
String destFilePath = destFile.getCanonicalPath();
if (!destFilePath.startsWith(destDirPath + File.separator)) {
throw new IOException("Entry is outside of the target dir: " + zipEntry.getName());
}
return destFile;
}
}
\ No newline at end of file
package com.yuda.paperstudentconfig.vo;
import lombok.Data;
/**
* @Author ryze
* @Date 2024/2/22
*/
@Data
public class AccountVo {
private String username;
private String password;
}
package com.yuda.paperstudentconfig.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CheckExcelVo {
private String checkLocation;
private String time;
//学生姓名
private String name;
//证件号
private String idCard;
//索引
private String index;
private Integer status;
private String photo;
private String idImg;
private String serialNo;
}
package com.yuda.paperstudentconfig.vo;
import lombok.Data;
/**
* @Author ryze
* @Date 2024/3/5
*/
@Data
public class CheckMethodDocumentVo {
private Integer id;
// 检录方式名称
private String name;
// 提示信息
private String tips;
}
package com.yuda.paperstudentconfig.vo;
import lombok.Data;
import java.util.Map;
/**
* @Author ryze
* @Date 2024/3/4
*/
@Data
public class StudentDocumentVo {
//学生姓名
private String name;
//扫码号
private String code;
//证件号
private String idCard;
//索引
private String index;
//项目id
private String projectId;
//检录方式
private String checkMethodName;
//学生上传图片地址
private String photoAddress;
//非关键字段
private Map<String, Object> customizeField;
// 环节的检录情况详情
private Map<String, Object> processStatus;
// 检录结果
private Integer status;
}
package com.yuda.paperstudentconfig.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.Map;
@Data
public class StudentPageVo {
private String name;
//索引
private String index;
private String idCard;
private String code;
private String checkType;
private String recordImg;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
private String photoAddress;
private Map<String,Object> customizeField;
}
spring.application.name=PaperStudentConfig
# ????
server.port=10086
# ?????
spring.datasource.url=jdbc:mysql://192.168.0.11:3306/mnty?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=Thu#DSS#0419
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Redis??
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.database=1
spring.redis.timeout=2000
# MyBatis-Plus??
mybatis-plus.mapper-locations=classpath*:mapper/*.xml
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.nologging.NoLoggingImpl
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
# ????
# ????
logging.level.root=INFO
logging.level.com.yuda=DEBUG
logging.level.org.springframework.web=INFO
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
# ??????
logging.file.name=logs/checkin_mysql.log
logging.file.max-size=10MB
logging.file.max-history=30
logging.file.total-size-cap=1GB
# ????
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n
# ??????
logging.async.enabled=true
logging.async.queue-capacity=1000
logging.async.discard-threshold=0
# ??????
logging.logback.rollingpolicy.max-file-size=10MB
logging.logback.rollingpolicy.max-history=30
logging.logback.rollingpolicy.total-size-cap=1GB
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuda.paperstudentconfig.mapper.SpartaExamStudentMapper">
<resultMap id="BaseResultMap" type="com.yuda.paperstudentconfig.entity.SpartaExamStudent">
<id column="id" property="id" />
<result column="exam_uuid" property="examUuid" />
<result column="name" property="name" />
<result column="zkz_num" property="zkzNum" />
<result column="sfz_num" property="sfzNum" />
<result column="avatar_key" property="avatarKey" />
<result column="avatar_bucket" property="avatarBucket" />
<result column="avatar_endpoint" property="avatarEndpoint" />
<result column="paper_id" property="paperId" />
<result column="user_id" property="userId" />
</resultMap>
<select id="selectExamStudents" resultMap="BaseResultMap">
SELECT ses.*
FROM sparta_exam_student ses
WHERE ses.user_id = #{userId}
AND ses.paper_id = #{paperId}
AND ses.exam_uuid = #{examUuid}
ORDER BY ses.id DESC
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuda.paperstudentconfig.mapper.SpartaPaperMapper">
<resultMap id="BaseResultMap" type="com.yuda.paperstudentconfig.entity.SpartaPaper">
<id column="id" property="id" />
<result column="exam_uuid" property="examUuid" />
<result column="name" property="name" />
<result column="passwd" property="passwd" />
<result column="switch_status" property="switchStatus" />
<result column="zpasswd" property="zpasswd" />
<result column="begin_time" property="beginTime" />
<result column="end_time" property="endTime" />
<result column="total_time" property="totalTime" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
<result column="use_status" property="useStatus" />
<result column="paper_id" property="paperId" />
</resultMap>
<select id="selectPapersByUserId" resultMap="BaseResultMap">
SELECT sp.*
FROM sparta_paper sp
JOIN sparta_user_paper sup ON sp.paper_id = sup.paper_id and sp.exam_uuid = sup.exam_uuid
WHERE sup.user_id = #{userId}
ORDER BY sp.create_time DESC
</select>
<select id="getByPaperId" resultMap="BaseResultMap">
parameterType="java.lang.String">
select * from sparta_paper where paper_id = #{paperId}
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuda.paperstudentconfig.mapper.SpartaUserMapper">
<resultMap id="BaseResultMap" type="com.yuda.paperstudentconfig.entity.SpartaUser">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="password" property="password" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
</resultMap>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuda.paperstudentconfig.mapper.SpartaUserPaperMapper">
<resultMap id="BaseResultMap" type="com.yuda.paperstudentconfig.entity.SpartaUserPaper">
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="exam_uuid" property="examUuid" />
<result column="paper_id" property="paperId" />
<result column="name" property="name" />
<result column="status" property="status" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
</resultMap>
<select id="getByUserIdAndPaperId" resultMap="BaseResultMap">
select * from sparta_user_paper where user_id = #{userId} and paper_id = #{paperId} and exam_uuid = #{examUuid}
</select>
</mapper>
\ No newline at end of file
package com.yuda.paperstudentconfig;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class PaperStudentConfigApplicationTests {
@Test
void contextLoads() {
}
}
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