diff --git a/AES-front/src/api/user.js b/AES-front/src/api/user.js index 9797a05..7df3bcb 100644 --- a/AES-front/src/api/user.js +++ b/AES-front/src/api/user.js @@ -22,10 +22,14 @@ export default { //°༶Ïà¹Ø takeClassByInviteCode: (data) => request.post('/classes/takeClassByInviteCode', data), //¼ÓÈë°༶ + getClassStudents:(config) => + request.get('/classes/getClassStudents',(config) ),//»ñȡѧÉúËùÔڰ༶ÈËÊý //×÷ҵÌâĿ²¿·Ö getExamList: (config) => request.get('/problem/getExamList',config),//ѧÉú»ñȡ×÷ҵÁбí getStudentRank:(config) => request.get('/problem/getStudentRank', config),//»ñȡѧÉúµ±ǰ±¨¸æ³ɼ¨ÅÅÃû + getClassRanks:(config) => request.get('/problem/getClassRanks', config),//»ñȡµ±ǰ±¨¸æ°༶ÅÅÃû + } diff --git a/AES-front/src/utils/common/common.js b/AES-front/src/utils/common/common.js index 78e0116..16edd46 100644 --- a/AES-front/src/utils/common/common.js +++ b/AES-front/src/utils/common/common.js @@ -19,11 +19,20 @@ export function formatDateTimeNoSecond(time = undefined, format = 'YYYY-MM-DD HH export function formatDate(date = undefined, format = 'YYYY-MM-DD') { return formatDateTime(date, format) } -export function formatTimestamp(timestamp){ - if (timestamp) { - const date = new Date(timestamp); +export function formatTimestamp(timestampArray) { + if (timestampArray && Array.isArray(timestampArray) && timestampArray.length >= 5) { + const year = timestampArray[0]; + const month = timestampArray[1]; + const day = timestampArray[2]; + const hours = timestampArray[3]; + const minutes = timestampArray[4]; + const seconds = timestampArray.length > 5 ? timestampArray[5] : 0; // 如果有秒数则使用,否则默认为0 + + // 创建Date对象时,月份需要减1,因为JavaScript的月份是从0开始的 + const date = new Date(year, month - 1, day, hours, minutes, seconds); + return date.getFullYear() + '-' + - ('0' + (date.getMonth() + 1)).slice(-2) + '-' + + ('0' + (date.getMonth()+1)).slice(-2) + '-' +//这里再加回来 ('0' + date.getDate()).slice(-2) + ' ' + ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + ':' + diff --git a/AES-front/src/views/user/exam-list/index.vue b/AES-front/src/views/user/exam-list/index.vue index 5e9c96d..008e2fa 100644 --- a/AES-front/src/views/user/exam-list/index.vue +++ b/AES-front/src/views/user/exam-list/index.vue @@ -60,8 +60,9 @@ const onViewScore = (exam) => {//点击成绩控件的逻辑 // } const examId = exam.id + const classId = exam.classId - router.push({ name: 'UserScoreAndRank', params: { examId }, query: { fromclient: false } }); + router.push({ name: 'UserScoreAndRank', params: { examId,classId }, query: { fromclient: false } }); // switch (trainingViewScore) { // case 'NewScorePage': // 直接转向成绩排名页面 diff --git a/AES-front/src/views/user/route.js b/AES-front/src/views/user/route.js index ceea9d3..d252591 100644 --- a/AES-front/src/views/user/route.js +++ b/AES-front/src/views/user/route.js @@ -127,7 +127,7 @@ export default { }, { name: 'UserScoreAndRank', - path: 'score-rank/:examId', + path: 'score-rank/:examId/:classId', component: () => import('./score-rank/index.vue'), meta: { title: '作业成绩', diff --git a/AES-front/src/views/user/score-rank/components/class-score.vue b/AES-front/src/views/user/score-rank/components/class-score.vue index 5f29802..03894f1 100644 --- a/AES-front/src/views/user/score-rank/components/class-score.vue +++ b/AES-front/src/views/user/score-rank/components/class-score.vue @@ -1,11 +1,106 @@ - \ No newline at end of file diff --git a/AES-front/src/views/user/score-rank/components/personal-rank.vue b/AES-front/src/views/user/score-rank/components/personal-rank.vue index 476347f..3019195 100644 --- a/AES-front/src/views/user/score-rank/components/personal-rank.vue +++ b/AES-front/src/views/user/score-rank/components/personal-rank.vue @@ -6,7 +6,7 @@

个人成绩:

成绩:{{ score }}

-

排名:{{ rank }}

+

排名:{{ rank }}/{{ totalStudents }}

@@ -17,9 +17,11 @@ import api from '@/api/user'; import {useRoute} from 'vue-router'; const route = useRoute() const examId = route.params.examId; +const classId = route.params.classId; const title = ref(""); // 从API获取的作业名称 const score = ref(0); // 个人得分 const rank = ref(0); // 个人排名 +const totalStudents = ref(0); // 班级总人数 const paginationReactive = reactive({ page: 1, @@ -45,18 +47,25 @@ const columns = [ // ... 列配置 ]; -// 查询个人成绩的函数 +// 左侧查询个人成绩的函数 const queryExamScores = async () => { + //查询个人排名 const res = await api.getStudentRank({ params: { examId } }); + //查询班级总人数 + const res1 = await api.getClassStudents({ + params: { classId } + }); + title.value = res.data.title; // 更新作业名称 score.value = res.data.score; // 更新个人得分 rank.value = res.data.rank; // 更新个人排名 - - + console.log(res1); + totalStudents.value = res1.data;// 更新班级总人数 }; + // 行键函数 const rowKey = (rowData) => { return rowData.id; diff --git a/AES-front/src/views/user/score-rank/index.vue b/AES-front/src/views/user/score-rank/index.vue index 129082e..b51109d 100644 --- a/AES-front/src/views/user/score-rank/index.vue +++ b/AES-front/src/views/user/score-rank/index.vue @@ -19,12 +19,12 @@ import ClassScore from '@/views/user/score-rank/components/class-score.vue' } .personal-rank { - flex: 0 0 40%; /* UserPersonalRank 占据 40% 的空间 */ + flex: 0 0 20%; /* UserPersonalRank 占据 40% 的空间 */ /* 其他样式,例如 padding, margin 等 */ } .class-score { - flex: 0 0 60%; /* ClassScore 占据 60% 的空间 */ + flex: 0 0 80%; /* ClassScore 占据 60% 的空间 */ /* 其他样式,例如 padding, margin 等 */ } \ No newline at end of file diff --git a/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java b/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java index 4fc9e69..dd55b24 100644 --- a/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java +++ b/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java @@ -270,4 +270,31 @@ public RespBean findStudentSubmit(@RequestBody PMStudentSubmit pmStudentSubmit){ return RespBean.error("查询成绩排名失败!"); } } + + //获取当前作业班级排名信息 + @GetMapping("/getClassRanks") + public RespBean getClassRanks(Integer pageNum,Integer pageSize,Integer classId,Integer examId){ + if (pageNum < 1 || pageSize < 1) + return RespBean.error("参数错误!"); + UReportSubmitted uReportSubmitted=new UReportSubmitted(); + uReportSubmitted.setPageNum(pageNum); + uReportSubmitted.setPageSize(pageSize); + + List uReportsSubmitted=problemServiceI.findClassRankByIds(examId,classId); + + + +// //分页处理 +// DataGrid dataGrid = problemServiceI.dataGrid(pMproblems,pMproblem); +// + if (uReportsSubmitted != null) { + return RespBean.ok("获取班级排名列表成功!",uReportsSubmitted); + } else { + return RespBean.error("获取班级排名列表失败!"); + } + + + + } + } diff --git a/AES/src/main/java/com/example/aes/problem/dao/ProblemDaoI.java b/AES/src/main/java/com/example/aes/problem/dao/ProblemDaoI.java index 28b2fe3..cf99860 100644 --- a/AES/src/main/java/com/example/aes/problem/dao/ProblemDaoI.java +++ b/AES/src/main/java/com/example/aes/problem/dao/ProblemDaoI.java @@ -17,7 +17,7 @@ public interface ProblemDaoI extends BaseDaoI { List findPMProblemStatusesByStudentIdAndProblemsIds(List problemIds, Integer studentId); UReportSubmitted getScoreAndRankByIds(int problemId, int userId); - + List getClassRankByIds(int problemId, int classId); public String findProblemByTitle(String title); public String findProblemByTitle(String title,Integer id); diff --git a/AES/src/main/java/com/example/aes/problem/dao/impl/ProblemDaoImpl.java b/AES/src/main/java/com/example/aes/problem/dao/impl/ProblemDaoImpl.java index 2b53082..aad0e9a 100644 --- a/AES/src/main/java/com/example/aes/problem/dao/impl/ProblemDaoImpl.java +++ b/AES/src/main/java/com/example/aes/problem/dao/impl/ProblemDaoImpl.java @@ -6,7 +6,10 @@ import com.example.aes.problem.model.Problem; import com.example.aes.problem.model.*; import com.example.aes.problem.model.ReportSubmitted; import com.example.aes.user.dao.BaseDaoI; +import com.example.aes.user.dao.ClassesDaoI; +import com.example.aes.user.dao.ClassstudentsDaoI; import com.example.aes.user.dao.impl.BaseDaoImpl; +import com.example.aes.user.model.Classstudents; import org.hibernate.Query; import org.hibernate.Session; import com.ibm.jvm.trace.format.api.TraceContext; @@ -26,10 +29,16 @@ import java.util.Objects; @Repository("ProblemDao") public class ProblemDaoImpl extends BaseDaoImpl implements ProblemDaoI{ + private ClassesDaoI classesDao; @Autowired private JdbcTemplate jdbcTemplate; + @Autowired + public void setClassesDao(ClassesDaoI classesDao) { + this.classesDao = classesDao; + } + @Override public List findProblemsByClassIds(List classIds) { // 检查classIds是否为空或没有元素 @@ -37,7 +46,7 @@ public class ProblemDaoImpl extends BaseDaoImpl implements ProblemDaoI{ return Collections.emptyList(); } - String sql = "SELECT pr.id AS Id, pp.startTime AS startTime, pp.endTime AS endTime, " + + String sql = "SELECT pr.id AS Id, pp.startTime AS startTime, pp.endTime AS endTime, pp.classId AS classId," + "pr.title AS title, pr.description AS description " + "FROM postproblem pp " + "JOIN problem pr ON pp.problemId = pr.id " + @@ -96,9 +105,9 @@ public class ProblemDaoImpl extends BaseDaoImpl implements ProblemDaoI{ } - @Override //根据作业id和学生id获取学生当前报告成绩排名 + @Override //根据作业id和学生id获取学生当前报告成绩与排名等信息 public UReportSubmitted getScoreAndRankByIds(int problemId, int userId) { - + //此部分获得该学生确定的个人报告成绩和报告名称信息 String sql = "SELECT sr.*, p.title " + "FROM submitreport sr " + "JOIN problem p ON sr.problemId = p.id " + @@ -110,8 +119,119 @@ public class ProblemDaoImpl extends BaseDaoImpl implements ProblemDaoI{ new BeanPropertyRowMapper<>(UReportSubmitted.class) ); - // 查询假定只有唯一一条数据,返回第一条记录 - return queryResults.isEmpty() ? null : queryResults.get(0); + //以下部分负责计算统计该报告在同班内排名信息 + + // 获取与当前用户同班级的所有同学信息 + List classmates = classesDao.findClassStudentsByClassId(userId); + + // 获取同班同学以及当前用户的报告成绩 + List classReports = new ArrayList<>(); + for (Classstudents classmate : classmates) { + String classmateSql = "SELECT sr.score,sr.studentId,sr.problemId " + + "FROM submitreport sr " + + "WHERE sr.studentId = ? AND sr.problemId = ?"; + List classmateReports = jdbcTemplate.query( + classmateSql, + new Object[]{classmate.getUserId(), problemId}, + new BeanPropertyRowMapper<>(UReportSubmitted.class) + ); + classReports.addAll(classmateReports); + } + + float temp = 0; + // 处理默认分数为空的情况,将它们视为0分 + classReports.forEach(report -> { + if (report.getScore() == null) { + report.setScore(temp); + } + }); + + // 根据成绩进行排序 + classReports.sort((r1, r2) -> r2.getScore().compareTo(r1.getScore())); + + // 计算排名,处理同分同排名的情况 + int rank = 1; + Float lastScore = null; // 用于记录上一个分数 + for (UReportSubmitted report : classReports) { + // 如果当前分数与上一个分数不同,则更新排名 + if (lastScore == null || !lastScore.equals(report.getScore())) { + rank = classReports.indexOf(report) + 1; + } + // 如果找到了当前用户的报告,则设置排名并退出循环 + if (report.getStudentId() == userId) { + report.setRank(rank); + break; + } + lastScore = report.getScore(); // 更新上一个分数 + } + + // 查询假定只有唯一一条数据,返回第一条记录,并设置排名 + UReportSubmitted userReport = queryResults.isEmpty() ? null : queryResults.get(0); + if (userReport != null) { + // 设置计算出的排名 + userReport.setRank(rank); + } + + return userReport; + } + + @Override //根据作业id和班级id获取当前班级作业排名信息列表 + public List getClassRankByIds(int problemId, int classId) { + + // 获取与当前用户同班级的所有同学信息 + List classmates = classesDao.findClassStudentsByClassId(classId); + // 从 classmates 列表中提取出所有的 userId + List studentIds = classmates.stream() + .map(Classstudents::getUserId) + .collect(Collectors.toList()); + // 获取所有学生的报告成绩 + List classReports = new ArrayList<>(); + for (Integer studentId : studentIds) { + String sql = "SELECT sr.score, sr.studentId, sr.problemId " + + "FROM submitreport sr " + + "WHERE sr.studentId = ? AND sr.problemId = ?"; + List reports = jdbcTemplate.query( + sql, + new Object[]{studentId, problemId}, + new BeanPropertyRowMapper<>(UReportSubmitted.class) + ); + classReports.addAll(reports); + } + + // 处理默认分数为空的情况,将它们视为0分 + classReports.forEach(report -> { + if (report.getScore() == null) { + report.setScore(0f); + } + }); + + // 根据成绩进行排序 + classReports.sort((r1, r2) -> r2.getScore().compareTo(r1.getScore())); + + // 计算排名,处理同分同排名的情况 + int rank = 1; + Float lastScore = null; + for (UReportSubmitted report : classReports) { + if (lastScore == null || !lastScore.equals(report.getScore())) { + rank = classReports.indexOf(report) + 1; + } + report.setRank(rank); + lastScore = report.getScore(); + } + + // 查询学号 + for (UReportSubmitted report : classReports) { + String studentNoSql = "SELECT u.studentNo FROM users u WHERE u.id = ?"; + String studentNo = jdbcTemplate.queryForObject( + studentNoSql, + new Object[]{report.getStudentId()}, + String.class + ); + report.setStudentNo(studentNo); + } + + // 返回包含所有信息的列表 + return classReports; } diff --git a/AES/src/main/java/com/example/aes/problem/model/UReportSubmitted.java b/AES/src/main/java/com/example/aes/problem/model/UReportSubmitted.java index cd5bba7..9667811 100644 --- a/AES/src/main/java/com/example/aes/problem/model/UReportSubmitted.java +++ b/AES/src/main/java/com/example/aes/problem/model/UReportSubmitted.java @@ -10,4 +10,8 @@ public class UReportSubmitted extends ReportSubmitted implements java.io.Seriali String StudentNo;//学号 int rank;//排名 + + // 排名列表分页 + private int pageNum; + private int pageSize; } diff --git a/AES/src/main/java/com/example/aes/problem/service/Impl/ProblemServiceImpl.java b/AES/src/main/java/com/example/aes/problem/service/Impl/ProblemServiceImpl.java index 681f1e1..110a4b1 100644 --- a/AES/src/main/java/com/example/aes/problem/service/Impl/ProblemServiceImpl.java +++ b/AES/src/main/java/com/example/aes/problem/service/Impl/ProblemServiceImpl.java @@ -2,15 +2,10 @@ package com.example.aes.problem.service.Impl; import com.example.aes.problem.dao.*; import com.example.aes.problem.model.*; -import com.example.aes.problem.model.*; import com.example.aes.problem.service.ProblemServiceI; import com.example.aes.user.dao.AdminusersDaoI; import com.example.aes.user.dao.ClassesDaoI; import com.example.aes.user.model.DataGrid; -import com.example.aes.user.model.Classstudents; -import com.example.aes.user.model.Course; -import com.example.aes.user.model.PMCourse; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -181,6 +176,12 @@ public class ProblemServiceImpl implements ProblemServiceI { return uReportSubmitted; } + @Override //根据作业id和班级id获取学生当前报告成绩排名 + public List findClassRankByIds(int problemId, int classId) { + List uReportSubmitted = problemDao.getClassRankByIds(problemId, classId); + return uReportSubmitted; + } + @Override public List findStandardIdNoProblemId(){ return scoringStandardDao.getStandardIdNoProblemIdDesc(); @@ -519,7 +520,7 @@ public class ProblemServiceImpl implements ProblemServiceI { pmStudentSubmit.setStudentNo((String) p[1]); pmStudentSubmit.setReadTime((LocalDateTime) p[2]); pmStudentSubmit.setSubmissionStatus((String) p[3]); - pmStudentSubmitList.add(pmStudentSubmit); + pmStudentSubmitList.add(pmStudentSubmit); } } @@ -537,14 +538,6 @@ public class ProblemServiceImpl implements ProblemServiceI { pmStudentSubmit.setFinalScore((float) p[4]); pmStudentSubmitList.add(pmStudentSubmit); - PMProblem pmProblem=new PMProblem(); - pmProblem.setId(problem.getId()); - pmProblem.setCourseId(problem.getCourseId()); - pmProblem.setAdminuserId(problem.getAdminuserId()); - pmProblem.setTeacherName(adminusersDao.findTeacherNameByTeacherId(problem.getAdminuserId())); - pmProblem.setTitle(problem.getTitle()); - pmProblem.setDescription(problem.getDescription()); - pmp.add(pmProblem); } } } diff --git a/AES/src/main/java/com/example/aes/problem/service/ProblemServiceI.java b/AES/src/main/java/com/example/aes/problem/service/ProblemServiceI.java index f0ca182..4e4b343 100644 --- a/AES/src/main/java/com/example/aes/problem/service/ProblemServiceI.java +++ b/AES/src/main/java/com/example/aes/problem/service/ProblemServiceI.java @@ -41,8 +41,9 @@ public interface ProblemServiceI { public void findStatusByStudentIdAndProblems(Integer studentId, List pMproblems); - UReportSubmitted findScoreAndRankByIds(int ProblemId, int userId); - public List findPostProblem(int problemId,int classId); + public UReportSubmitted findScoreAndRankByIds(int ProblemId, int userId); + public List findClassRankByIds(int problemId, int classId); + public List findPostProblem(int problemId,int classId); public int editPostProblem( int classId, int problemId, LocalDateTime startTime,LocalDateTime endTime,boolean allow); diff --git a/AES/src/main/java/com/example/aes/user/controller/ClassesController.java b/AES/src/main/java/com/example/aes/user/controller/ClassesController.java index dfd0b99..391c244 100644 --- a/AES/src/main/java/com/example/aes/user/controller/ClassesController.java +++ b/AES/src/main/java/com/example/aes/user/controller/ClassesController.java @@ -9,10 +9,7 @@ import com.example.aes.user.model.*; import com.example.aes.user.service.ClassesServiceI; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -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 org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.List; @@ -221,4 +218,15 @@ public class ClassesController{ else return RespBean.ok("查找班级成功", classstudentsList); } + @GetMapping("/getClassStudents")// 根据班级id查找所在班级人数 + public RespBean getClassStudents(@RequestParam("classId") int classId) + { + List classstudentsList = classesServiceI.getClassStudentsByClassId(classId); + int counts = classstudentsList.size(); + if (classstudentsList == null || classstudentsList.isEmpty()) { // 如果列表为空,返回错误信息 + return RespBean.error("没有找到相关班级及人数"); + } + else return RespBean.ok("查找成功", counts); + } + } diff --git a/AES/src/main/java/com/example/aes/user/dao/ClassesDaoI.java b/AES/src/main/java/com/example/aes/user/dao/ClassesDaoI.java index 56d842c..92ea1f9 100644 --- a/AES/src/main/java/com/example/aes/user/dao/ClassesDaoI.java +++ b/AES/src/main/java/com/example/aes/user/dao/ClassesDaoI.java @@ -47,4 +47,7 @@ public interface ClassesDaoI extends BaseDaoI { public ListfindClassIdByStudentId(int studentId);//根据班级id查找学生id public List findClassByCourseId(int courseId); public List findClassById(int classId); + + public List findClassStudentsByClassId(int classId); + } diff --git a/AES/src/main/java/com/example/aes/user/dao/impl/ClassesDaoImpl.java b/AES/src/main/java/com/example/aes/user/dao/impl/ClassesDaoImpl.java index 9a024a3..a440211 100644 --- a/AES/src/main/java/com/example/aes/user/dao/impl/ClassesDaoImpl.java +++ b/AES/src/main/java/com/example/aes/user/dao/impl/ClassesDaoImpl.java @@ -575,5 +575,14 @@ public class ClassesDaoImpl extends BaseDaoImpl implements ClassesDaoI return this.find(hql); } + @Override + public List findClassStudentsByClassId(int classId) { + // 直接根据classId查询出该班级的所有学生信息 + String hqlForClassStudents = "from Classstudents c where c.classId = :classId"; + Query qForClassStudents = this.getCurrentSession().createQuery(hqlForClassStudents); + qForClassStudents.setParameter("classId", classId); + return qForClassStudents.list(); + } + } diff --git a/AES/src/main/java/com/example/aes/user/model/DataGrid.java b/AES/src/main/java/com/example/aes/user/model/DataGrid.java index 44f352b..50d1da8 100644 --- a/AES/src/main/java/com/example/aes/user/model/DataGrid.java +++ b/AES/src/main/java/com/example/aes/user/model/DataGrid.java @@ -7,7 +7,7 @@ import java.util.ArrayList; import java.util.List; @Data -public class DataGrid implements java.io.Serializable { +public class DataGrid extends com.example.aes.problem.model.DataGrid implements java.io.Serializable { private static final long serialVersionUID = 1538274527426L; diff --git a/AES/src/main/java/com/example/aes/user/service/ClassesServiceI.java b/AES/src/main/java/com/example/aes/user/service/ClassesServiceI.java index c64a46c..440b707 100644 --- a/AES/src/main/java/com/example/aes/user/service/ClassesServiceI.java +++ b/AES/src/main/java/com/example/aes/user/service/ClassesServiceI.java @@ -29,4 +29,6 @@ public interface ClassesServiceI { public List findClassIdByStudentId(int studentId); // 根据学生id查找班级id public List findClassByCourseId(int courseId); + + List getClassStudentsByClassId(int classId);// 根据学生id查找所在班级人数 } diff --git a/AES/src/main/java/com/example/aes/user/service/impl/ClassesServiceImpl.java b/AES/src/main/java/com/example/aes/user/service/impl/ClassesServiceImpl.java index 55978dd..35bf3db 100644 --- a/AES/src/main/java/com/example/aes/user/service/impl/ClassesServiceImpl.java +++ b/AES/src/main/java/com/example/aes/user/service/impl/ClassesServiceImpl.java @@ -253,4 +253,9 @@ public void setclassstudentsDao(ClassstudentsDaoI classstudentsDao) { return classesDao.findClassByCourseId(courseId); } + @Override + public List getClassStudentsByClassId(int classId) { + return classesDao.findClassStudentsByClassId(classId); + } + } diff --git a/AES/src/main/resources/application.properties b/AES/src/main/resources/application.properties index 488fc4f..e82f2c8 100644 --- a/AES/src/main/resources/application.properties +++ b/AES/src/main/resources/application.properties @@ -5,7 +5,7 @@ server.port=8082 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource jdbc_url=jdbc:mysql://localhost:3306/aes?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=True jdbc_username=root -jdbc_password=123456 +jdbc_password=13661744518xh #spring.datasource.url=jdbc:mysql://localhost:3306/aes?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=True #spring.datasource.username=root #spring.datasource.password=123456