diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java index 2281075..4df7bf2 100644 --- a/.mvn/wrapper/MavenWrapperDownloader.java +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012 - 2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,91 +13,128 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +// 导入 java.net 包中的类,用于处理网络相关操作 import java.net.*; +// 导入 java.io 包中的类,用于输入输出操作 import java.io.*; +// 导入 java.nio.channels 包中的类,用于使用 NIO 通道进行高效的 I/O 操作 import java.nio.channels.*; +// 导入 java.util.Properties 类,用于处理属性文件 import java.util.Properties; +// 定义 MavenWrapperDownloader 类,用于下载 Maven 包装器 JAR 文件 public class MavenWrapperDownloader { + // 定义 Maven 包装器的版本号 private static final String WRAPPER_VERSION = "0.5.5"; /** * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + * 如果没有提供 'downloadUrl',则从该默认 URL 下载 maven-wrapper.jar */ private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; /** * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to * use instead of the default one. + * maven-wrapper.properties 文件的路径,该文件可能包含一个 downloadUrl 属性,用于替代默认的下载 URL */ private static final String MAVEN_WRAPPER_PROPERTIES_PATH = ".mvn/wrapper/maven-wrapper.properties"; /** * Path where the maven-wrapper.jar will be saved to. + * maven-wrapper.jar 将保存的路径 */ private static final String MAVEN_WRAPPER_JAR_PATH = ".mvn/wrapper/maven-wrapper.jar"; /** * Name of the property which should be used to override the default download url for the wrapper. + * 用于覆盖包装器默认下载 URL 的属性名 */ private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + // 程序的入口点 public static void main(String args[]) { + // 打印下载器启动信息 System.out.println("- Downloader started"); + // 根据命令行参数创建基础目录文件对象 File baseDirectory = new File(args[0]); + // 打印使用的基础目录的绝对路径 System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. + // 如果 maven-wrapper.properties 文件存在,读取它并检查是否包含自定义的 wrapperUrl 参数 File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + // 初始化下载 URL 为默认值 String url = DEFAULT_DOWNLOAD_URL; if(mavenWrapperPropertyFile.exists()) { + // 用于读取 maven-wrapper.properties 文件的输入流 FileInputStream mavenWrapperPropertyFileInputStream = null; try { + // 打开 maven-wrapper.properties 文件的输入流 mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + // 创建 Properties 对象用于存储属性文件中的键值对 Properties mavenWrapperProperties = new Properties(); + // 从输入流中加载属性文件内容 mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + // 获取自定义的下载 URL,如果不存在则使用默认值 url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); } catch (IOException e) { + // 打印加载 maven-wrapper.properties 文件出错信息 System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); } finally { try { + // 关闭输入流 if(mavenWrapperPropertyFileInputStream != null) { mavenWrapperPropertyFileInputStream.close(); } } catch (IOException e) { - // Ignore ... + // 忽略关闭输入流时可能出现的异常 } } } + // 打印下载的 URL System.out.println("- Downloading from: " + url); + // 创建要保存 maven-wrapper.jar 的文件对象 File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + // 如果输出文件的父目录不存在,则创建它 if(!outputFile.getParentFile().exists()) { + // 如果创建父目录失败,打印错误信息 if(!outputFile.getParentFile().mkdirs()) { System.out.println( "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); } } + // 打印下载文件的保存路径 System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); try { + // 调用下载文件的方法 downloadFileFromURL(url, outputFile); + // 打印下载完成信息 System.out.println("Done"); + // 正常退出程序 System.exit(0); } catch (Throwable e) { + // 打印下载出错信息 System.out.println("- Error downloading"); + // 打印异常堆栈信息 e.printStackTrace(); + // 异常退出程序 System.exit(1); } } + // 从指定 URL 下载文件到指定目标文件的方法 private static void downloadFileFromURL(String urlString, File destination) throws Exception { + // 如果环境变量中设置了 MVNW_USERNAME 和 MVNW_PASSWORD if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + // 获取用户名 String username = System.getenv("MVNW_USERNAME"); + // 获取密码并转换为字符数组 char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + // 设置认证器 Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { @@ -105,13 +142,20 @@ public class MavenWrapperDownloader { } }); } + // 创建 URL 对象 URL website = new URL(urlString); + // 用于读取网络数据的通道 ReadableByteChannel rbc; + // 打开 URL 连接并创建通道 rbc = Channels.newChannel(website.openStream()); + // 创建用于写入文件的输出流 FileOutputStream fos = new FileOutputStream(destination); + // 将通道中的数据传输到文件输出流的通道中 fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + // 关闭输出流 fos.close(); + // 关闭通道 rbc.close(); } -} +} \ No newline at end of file diff --git a/db/springbootus5uu.sql b/db/springbootus5uu.sql index a5974fb..fd09b2a 100644 --- a/db/springbootus5uu.sql +++ b/db/springbootus5uu.sql @@ -3,629 +3,663 @@ -- Host: localhost Database: springbootus5uu -- ------------------------------------------------------ -- Server version 5.7.31 +-- MySQL dump 10.13 Distrib 5.7.31, for Linux (x86_64) -- 表示这是一个MySQL数据库的转储文件,版本为10.13 Distrib 5.7.31,适用于Linux (x86_64)系统 +-- -- 空注释行 +-- Host: localhost Database: springbootus5uu -- 说明数据库所在主机为localhost,数据库名称是springbootus5uu +-- ------------------------------------------------------ -- 分隔线注释 +-- Server version 5.7.31 -- 数据库服务器版本为5.7.31 -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -- 保存原来的字符集客户端设置 +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -- 保存原来的字符集结果设置 +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -- 保存原来的连接校对设置 +/*!40101 SET NAMES utf8 */; -- 设置字符集为utf8 +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -- 保存原来的时区设置 +/*!40103 SET TIME_ZONE='+00:00' */; -- 设置时区为协调世界时(UTC) +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -- 保存原来的唯一检查设置,并关闭唯一检查 +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -- 保存原来的外键检查设置,并关闭外键检查 +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -- 保存原来的SQL模式设置,并设置新的SQL模式为NO_AUTO_VALUE_ON_ZERO +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- 保存原来的SQL注释设置,并关闭SQL注释 -- --- Table structure for table `chat` +-- Table structure for table `chat` -- 说明接下来是表chat的表结构定义 -- -DROP TABLE IF EXISTS `chat`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `chat` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `userid` bigint(20) NOT NULL COMMENT '用户id', - `adminid` bigint(20) DEFAULT NULL COMMENT '管理员id', - `ask` longtext COMMENT '提问', - `reply` longtext COMMENT '回复', - `isreply` int(11) DEFAULT NULL COMMENT '是否回复', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=117 DEFAULT CHARSET=utf8 COMMENT='客户服务'; -/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `chat`; -- 如果表chat存在则删除它 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为utf8 +CREATE TABLE `chat` ( -- 创建名为chat的表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义id字段,类型为bigint(20),不能为空,自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义addtime字段,类型为timestamp,不能为空,默认值为当前时间戳,注释为创建时间 + `userid` bigint(20) NOT NULL COMMENT '用户id', -- 定义userid字段,类型为bigint(20),不能为空,注释为用户id + `adminid` bigint(20) DEFAULT NULL COMMENT '管理员id', -- 定义adminid字段,类型为bigint(20),默认值为null,注释为管理员id + `ask` longtext COMMENT '提问', -- 定义ask字段,类型为longtext,注释为提问 + `reply` longtext COMMENT '回复', -- 定义reply字段,类型为longtext,注释为回复 + `isreply` int(11) DEFAULT NULL COMMENT '是否回复', -- 定义isreply字段,类型为int(11),默认值为null,注释为是否回复 + PRIMARY KEY (`id`) -- 定义id字段为主键 +) ENGINE=InnoDB AUTO_INCREMENT=117 DEFAULT CHARSET=utf8 COMMENT='客户服务'; -- 设置表的存储引擎为InnoDB,自动递增起始值为117,字符集为utf8,注释为客户服务 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Dumping data for table `chat` +-- Dumping data for table `chat` -- 说明接下来是向表chat中插入数据的操作 -- -LOCK TABLES `chat` WRITE; -/*!40000 ALTER TABLE `chat` DISABLE KEYS */; -INSERT INTO `chat` VALUES (111,'2021-05-09 07:46:56',1,1,'提问1','回复1',1),(112,'2021-05-09 07:46:56',2,2,'提问2','回复2',2),(113,'2021-05-09 07:46:56',3,3,'提问3','回复3',3),(114,'2021-05-09 07:46:56',4,4,'提问4','回复4',4),(115,'2021-05-09 07:46:56',5,5,'提问5','回复5',5),(116,'2021-05-09 07:46:56',6,6,'提问6','回复6',6); -/*!40000 ALTER TABLE `chat` ENABLE KEYS */; -UNLOCK TABLES; +LOCK TABLES `chat` WRITE; -- 对表chat进行写锁定 +/*!40000 ALTER TABLE `chat` DISABLE KEYS */; -- 禁用表chat的索引以加快数据插入速度 +INSERT INTO `chat` VALUES (111,'2021-05-09 07:46:56',1,1,'提问1','回复1',1),(112,'2021-05-09 07:46:56',2,2,'提问2','回复2',2),(113,'2021-05-09 07:46:56',3,3,'提问3','回复3',3),(114,'2021-05-09 07:46:56',4,4,'提问4','回复4',4),(115,'2021-05-09 07:46:56',5,5,'提问5','回复5',5),(116,'2021-05-09 07:46:56',6,6,'提问6','回复6',6); -- 向表chat中插入多条记录 +/*!40000 ALTER TABLE `chat` ENABLE KEYS */; -- 重新启用表chat的索引 +UNLOCK TABLES; -- 解锁表chat -- --- Table structure for table `config` +-- Table structure for table `config` -- 说明接下来是表config的表结构定义 -- -DROP TABLE IF EXISTS `config`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `config` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `name` varchar(100) NOT NULL COMMENT '配置参数名称', - `value` varchar(100) DEFAULT NULL COMMENT '配置参数值', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='配置文件'; -/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `config`; -- 如果表config存在则删除它 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为utf8 +CREATE TABLE `config` ( -- 创建名为config的表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义id字段,类型为bigint(20),不能为空,自动递增,注释为主键 + `name` varchar(100) NOT NULL COMMENT '配置参数名称', -- 定义name字段,类型为varchar(100),不能为空,注释为配置参数名称 + `value` varchar(100) DEFAULT NULL COMMENT '配置参数值', -- 定义value字段,类型为varchar(100),默认值为null,注释为配置参数值 + PRIMARY KEY (`id`) -- 定义id字段为主键 +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='配置文件'; -- 设置表的存储引擎为InnoDB,自动递增起始值为7,字符集为utf8,注释为配置文件 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Dumping data for table `config` +-- Dumping data for table `config` -- 说明接下来是向表config中插入数据的操作 -- -LOCK TABLES `config` WRITE; -/*!40000 ALTER TABLE `config` DISABLE KEYS */; -INSERT INTO `config` VALUES (1,'picture1','http://localhost:8080/springbootus5uu/upload/picture1.jpg'),(2,'picture2','http://localhost:8080/springbootus5uu/upload/picture2.jpg'),(3,'picture3','http://localhost:8080/springbootus5uu/upload/picture3.jpg'),(6,'homepage',NULL); -/*!40000 ALTER TABLE `config` ENABLE KEYS */; -UNLOCK TABLES; +LOCK TABLES `config` WRITE; -- 对表config进行写锁定 +/*!40000 ALTER TABLE `config` DISABLE KEYS */; -- 禁用表config的索引以加快数据插入速度 +INSERT INTO `config` VALUES (1,'picture1','http://localhost:8080/springbootus5uu/upload/picture1.jpg'),(2,'picture2','http://localhost:8080/springbootus5uu/upload/picture2.jpg'),(3,'picture3','http://localhost:8080/springbootus5uu/upload/picture3.jpg'),(6,'homepage',NULL); -- 向表config中插入多条记录 +/*!40000 ALTER TABLE `config` ENABLE KEYS */; -- 重新启用表config的索引 +UNLOCK TABLES; -- 解锁表config -- --- Table structure for table `discusskechengxinxi` +-- Table structure for table `discusskechengxinxi` -- 说明接下来是表discusskechengxinxi的表结构定义 -- -DROP TABLE IF EXISTS `discusskechengxinxi`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `discusskechengxinxi` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `refid` bigint(20) NOT NULL COMMENT '关联表id', - `userid` bigint(20) NOT NULL COMMENT '用户id', - `nickname` varchar(200) DEFAULT NULL COMMENT '用户名', - `content` longtext NOT NULL COMMENT '评论内容', - `reply` longtext COMMENT '回复内容', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=197 DEFAULT CHARSET=utf8 COMMENT='课程信息评论表'; -/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `discusskechengxinxi`; -- 如果表discusskechengxinxi存在则删除它 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为utf8 +CREATE TABLE `discusskechengxinxi` ( -- 创建名为discusskechengxinxi的表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义id字段,类型为bigint(20),不能为空,自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义addtime字段,类型为timestamp,不能为空,默认值为当前时间戳,注释为创建时间 + `refid` bigint(20) NOT NULL COMMENT '关联表id', -- 定义refid字段,类型为bigint(20),不能为空,注释为关联表id + `userid` bigint(20) NOT NULL COMMENT '用户id', -- 定义userid字段,类型为bigint(20),不能为空,注释为用户id + `nickname` varchar(200) DEFAULT NULL COMMENT '用户名', -- 定义nickname字段,类型为varchar(200),默认值为null,注释为用户名 + `content` longtext NOT NULL COMMENT '评论内容', -- 定义content字段,类型为longtext,不能为空,注释为评论内容 + `reply` longtext COMMENT '回复内容', -- 定义reply字段,类型为longtext,注释为回复内容 + PRIMARY KEY (`id`) -- 定义id字段为主键 +) ENGINE=InnoDB AUTO_INCREMENT=197 DEFAULT CHARSET=utf8 COMMENT='课程信息评论表'; -- 设置表的存储引擎为InnoDB,自动递增起始值为197,字符集为utf8,注释为课程信息评论表 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Dumping data for table `discusskechengxinxi` +-- Dumping data for table `discusskechengxinxi` -- 说明接下来是向表discusskechengxinxi中插入数据的操作 -- -LOCK TABLES `discusskechengxinxi` WRITE; -/*!40000 ALTER TABLE `discusskechengxinxi` DISABLE KEYS */; -INSERT INTO `discusskechengxinxi` VALUES (191,'2021-05-09 07:46:56',1,1,'用户名1','评论内容1','回复内容1'),(192,'2021-05-09 07:46:56',2,2,'用户名2','评论内容2','回复内容2'),(193,'2021-05-09 07:46:56',3,3,'用户名3','评论内容3','回复内容3'),(194,'2021-05-09 07:46:56',4,4,'用户名4','评论内容4','回复内容4'),(195,'2021-05-09 07:46:56',5,5,'用户名5','评论内容5','回复内容5'),(196,'2021-05-09 07:46:56',6,6,'用户名6','评论内容6','回复内容6'); -/*!40000 ALTER TABLE `discusskechengxinxi` ENABLE KEYS */; -UNLOCK TABLES; +LOCK TABLES `discusskechengxinxi` WRITE; -- 对表discusskechengxinxi进行写锁定 +/*!40000 ALTER TABLE `discusskechengxinxi` DISABLE KEYS */; -- 禁用表discusskechengxinxi的索引以加快数据插入速度 +INSERT INTO `discusskechengxinxi` VALUES (191,'2021-05-09 07:46:56',1,1,'用户名1','评论内容1','回复内容1'),(192,'2021-05-09 07:46:56',2,2,'用户名2','评论内容2','回复内容2'),(193,'2021-05-09 07:46:56',3,3,'用户名3','评论内容3','回复内容3'),(194,'2021-05-09 07:46:56',4,4,'用户名4','评论内容4','回复内容4'),(195,'2021-05-09 07:46:56',5,5,'用户名5','评论内容5','回复内容5'),(196,'2021-05-09 07:46:56',6,6,'用户名6','评论内容6','回复内容6'); -- 向表discusskechengxinxi中插入多条记录 +/*!40000 ALTER TABLE `discusskechengxinxi` ENABLE KEYS */; -- 重新启用表discusskechengxinxi的索引 +UNLOCK TABLES; -- 解锁表discusskechengxinxi -- --- Table structure for table `exampaper` +-- Table structure for table `exampaper` -- 说明接下来是表exampaper的表结构定义 -- -DROP TABLE IF EXISTS `exampaper`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `exampaper` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `name` varchar(200) NOT NULL COMMENT '试卷名称', - `time` int(11) NOT NULL COMMENT '考试时长(分钟)', - `status` int(11) NOT NULL DEFAULT '0' COMMENT '试卷状态', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='试卷表'; -/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `exampaper`; -- 如果表exampaper存在则删除它 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为utf8 +CREATE TABLE `exampaper` ( -- 创建名为exampaper的表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义id字段,类型为bigint(20),不能为空,自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义addtime字段,类型为timestamp,不能为空,默认值为当前时间戳,注释为创建时间 + `name` varchar(200) NOT NULL COMMENT '试卷名称', -- 定义name字段,类型为varchar(200),不能为空,注释为试卷名称 + `time` int(11) NOT NULL COMMENT '考试时长(分钟)', -- 定义time字段,类型为int(11),不能为空,注释为考试时长(分钟) + `status` int(11) NOT NULL DEFAULT '0' COMMENT '试卷状态', -- 定义status字段,类型为int(11),不能为空,默认值为0,注释为试卷状态 + PRIMARY KEY (`id`) -- 定义id字段为主键 +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='试卷表'; -- 设置表的存储引擎为InnoDB,字符集为utf8,注释为试卷表 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Dumping data for table `exampaper` +-- Dumping data for table `exampaper` -- 说明接下来是向表exampaper中插入数据的操作 -- -LOCK TABLES `exampaper` WRITE; -/*!40000 ALTER TABLE `exampaper` DISABLE KEYS */; -/*!40000 ALTER TABLE `exampaper` ENABLE KEYS */; -UNLOCK TABLES; +LOCK TABLES `exampaper` WRITE; -- 对表exampaper进行写锁定 +/*!40000 ALTER TABLE `exampaper` DISABLE KEYS */; -- 禁用表exampaper的索引以加快数据插入速度 +/*!40000 ALTER TABLE `exampaper` ENABLE KEYS */; -- 重新启用表exampaper的索引 +UNLOCK TABLES; -- 解锁表exampaper -- --- Table structure for table `examquestion` +-- Table structure for table `examquestion` -- 说明接下来是表examquestion的表结构定义 -- -DROP TABLE IF EXISTS `examquestion`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `examquestion` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `paperid` bigint(20) NOT NULL COMMENT '所属试卷id(外键)', - `papername` varchar(200) NOT NULL COMMENT '试卷名称', - `questionname` varchar(200) NOT NULL COMMENT '试题名称', - `options` longtext COMMENT '选项,json字符串', - `score` bigint(20) DEFAULT '0' COMMENT '分值', - `answer` varchar(200) DEFAULT NULL COMMENT '正确答案', - `analysis` longtext COMMENT '答案解析', - `type` bigint(20) DEFAULT '0' COMMENT '试题类型,0:单选题 1:多选题 2:判断题 3:填空题(暂不考虑多项填空)', - `sequence` bigint(20) DEFAULT '100' COMMENT '试题排序,值越大排越前面', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='试题表'; -/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `examquestion`; -- 如果表examquestion存在则删除它 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为utf8 +CREATE TABLE `examquestion` ( -- 创建名为examquestion的表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义id字段,类型为bigint(20),不能为空,自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义addtime字段,类型为timestamp,不能为空,默认值为当前时间戳,注释为创建时间 + `paperid` bigint(20) NOT NULL COMMENT '所属试卷id(外键)', -- 定义paperid字段,类型为bigint(20),不能为空,注释为所属试卷id(外键) + `papername` varchar(200) NOT NULL COMMENT '试卷名称', -- 定义papername字段,类型为varchar(200),不能为空,注释为试卷名称 + `questionname` varchar(200) NOT NULL COMMENT '试题名称', -- 定义questionname字段,类型为varchar(200),不能为空,注释为试题名称 + `options` longtext COMMENT '选项,json字符串', -- 定义options字段,类型为longtext,注释为选项,json字符串 + `score` bigint(20) DEFAULT '0' COMMENT '分值', -- 定义score字段,类型为bigint(20),默认值为0,注释为分值 + `answer` varchar(200) DEFAULT NULL COMMENT '正确答案', -- 定义answer字段,类型为varchar(200),默认值为null,注释为正确答案 + `analysis` longtext COMMENT '答案解析', -- 定义analysis字段,类型为longtext,注释为答案解析 + `type` bigint(20) DEFAULT '0' COMMENT '试题类型,0:单选题 1:多选题 2:判断题 3:填空题(暂不考虑多项填空)', -- 定义type字段,类型为bigint(20),默认值为0,注释为试题类型 + `sequence` bigint(20) DEFAULT '100' COMMENT '试题排序,值越大排越前面', -- 定义sequence字段,类型为bigint(20),默认值为100,注释为试题排序 + PRIMARY KEY (`id`) -- 定义id字段为主键 +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='试题表'; -- 设置表的存储引擎为InnoDB,字符集为utf8,注释为试题表 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Dumping data for table `examquestion` +-- Dumping data for table `examquestion` -- 说明接下来是向表examquestion中插入数据的操作 -- -LOCK TABLES `examquestion` WRITE; -/*!40000 ALTER TABLE `examquestion` DISABLE KEYS */; -/*!40000 ALTER TABLE `examquestion` ENABLE KEYS */; -UNLOCK TABLES; +LOCK TABLES `examquestion` WRITE; -- 对表examquestion进行写锁定 +/*!40000 ALTER TABLE `examquestion` DISABLE KEYS */; -- 禁用表examquestion的索引以加快数据插入速度 +/*!40000 ALTER TABLE `examquestion` ENABLE KEYS */; -- 重新启用表examquestion的索引 +UNLOCK TABLES; -- 解锁表examquestion -- --- Table structure for table `examrecord` +-- Table structure for table `examrecord` -- 说明接下来是表examrecord的表结构定义 -- DROP TABLE IF EXISTS `examrecord`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `examrecord` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `userid` bigint(20) NOT NULL COMMENT '用户id', - `username` varchar(200) DEFAULT NULL COMMENT '用户名', - `paperid` bigint(20) NOT NULL COMMENT '试卷id(外键)', - `papername` varchar(200) NOT NULL COMMENT '试卷名称', - `questionid` bigint(20) NOT NULL COMMENT '试题id(外键)', - `questionname` varchar(200) NOT NULL COMMENT '试题名称', - `options` longtext COMMENT '选项,json字符串', - `score` bigint(20) DEFAULT '0' COMMENT '分值', - `answer` varchar(200) DEFAULT NULL COMMENT '正确答案', - `analysis` longtext COMMENT '答案解析', - `myscore` bigint(20) NOT NULL DEFAULT '0' COMMENT '试题得分', - `myanswer` varchar(200) DEFAULT NULL COMMENT '考生答案', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='考试记录表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `examrecord` --- - -LOCK TABLES `examrecord` WRITE; -/*!40000 ALTER TABLE `examrecord` DISABLE KEYS */; -/*!40000 ALTER TABLE `examrecord` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `forum` --- - -DROP TABLE IF EXISTS `forum`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `forum` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `title` varchar(200) DEFAULT NULL COMMENT '帖子标题', - `content` longtext NOT NULL COMMENT '帖子内容', - `parentid` bigint(20) DEFAULT NULL COMMENT '父节点id', - `userid` bigint(20) NOT NULL COMMENT '用户id', - `username` varchar(200) DEFAULT NULL COMMENT '用户名', - `isdone` varchar(200) DEFAULT NULL COMMENT '状态', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8 COMMENT='学习交流'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `forum` --- - -LOCK TABLES `forum` WRITE; -/*!40000 ALTER TABLE `forum` DISABLE KEYS */; -INSERT INTO `forum` VALUES (121,'2021-05-09 07:46:56','帖子标题1','帖子内容1',1,1,'用户名1','开放'),(122,'2021-05-09 07:46:56','帖子标题2','帖子内容2',2,2,'用户名2','开放'),(123,'2021-05-09 07:46:56','帖子标题3','帖子内容3',3,3,'用户名3','开放'),(124,'2021-05-09 07:46:56','帖子标题4','帖子内容4',4,4,'用户名4','开放'),(125,'2021-05-09 07:46:56','帖子标题5','帖子内容5',5,5,'用户名5','开放'),(126,'2021-05-09 07:46:56','帖子标题6','帖子内容6',6,6,'用户名6','开放'); -/*!40000 ALTER TABLE `forum` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `goumaidekecheng` --- - -DROP TABLE IF EXISTS `goumaidekecheng`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `goumaidekecheng` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `kechengmingcheng` varchar(200) DEFAULT NULL COMMENT '课程名称', - `leixing` varchar(200) DEFAULT NULL COMMENT '类型', - `xueke` varchar(200) DEFAULT NULL COMMENT '学科', - `feiyong` varchar(200) DEFAULT NULL COMMENT '费用', - `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号', - `goumaishijian` datetime DEFAULT NULL COMMENT '购买时间', - `sfsh` varchar(200) DEFAULT '否' COMMENT '是否审核', - `shhf` longtext COMMENT '审核回复', - `ispay` varchar(200) DEFAULT '未支付' COMMENT '是否支付', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=utf8 COMMENT='购买的课程'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `goumaidekecheng` + -- +-- Table structure for table `examrecord` -- 说明接下来是表examrecord的表结构定义 -- -LOCK TABLES `goumaidekecheng` WRITE; -/*!40000 ALTER TABLE `goumaidekecheng` DISABLE KEYS */; -INSERT INTO `goumaidekecheng` VALUES (51,'2021-05-09 07:46:56','课程名称1','类型1','学科1','费用1','用户账号1','2021-05-09 15:46:56','是','','未支付'),(52,'2021-05-09 07:46:56','课程名称2','类型2','学科2','费用2','用户账号2','2021-05-09 15:46:56','是','','未支付'),(53,'2021-05-09 07:46:56','课程名称3','类型3','学科3','费用3','用户账号3','2021-05-09 15:46:56','是','','未支付'),(54,'2021-05-09 07:46:56','课程名称4','类型4','学科4','费用4','用户账号4','2021-05-09 15:46:56','是','','未支付'),(55,'2021-05-09 07:46:56','课程名称5','类型5','学科5','费用5','用户账号5','2021-05-09 15:46:56','是','','未支付'),(56,'2021-05-09 07:46:56','课程名称6','类型6','学科6','费用6','用户账号6','2021-05-09 15:46:56','是','','未支付'); -/*!40000 ALTER TABLE `goumaidekecheng` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `kechengleixing` --- - -DROP TABLE IF EXISTS `kechengleixing`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `kechengleixing` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `leixing` varchar(200) DEFAULT NULL COMMENT '类型', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8 COMMENT='课程类型'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `kechengleixing` --- - -LOCK TABLES `kechengleixing` WRITE; -/*!40000 ALTER TABLE `kechengleixing` DISABLE KEYS */; -INSERT INTO `kechengleixing` VALUES (31,'2021-05-09 07:46:56','类型1'),(32,'2021-05-09 07:46:56','类型2'),(33,'2021-05-09 07:46:56','类型3'),(34,'2021-05-09 07:46:56','类型4'),(35,'2021-05-09 07:46:56','类型5'),(36,'2021-05-09 07:46:56','类型6'); -/*!40000 ALTER TABLE `kechengleixing` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `kechengxinxi` --- - -DROP TABLE IF EXISTS `kechengxinxi`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `kechengxinxi` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `kechengmingcheng` varchar(200) DEFAULT NULL COMMENT '课程名称', - `leixing` varchar(200) DEFAULT NULL COMMENT '类型', - `xueke` varchar(200) DEFAULT NULL COMMENT '学科', - `shipin` varchar(200) DEFAULT NULL COMMENT '视频', - `laoshixingming` varchar(200) DEFAULT NULL COMMENT '老师姓名', - `feiyong` varchar(200) DEFAULT NULL COMMENT '费用', - `kechengtupian` varchar(200) DEFAULT NULL COMMENT '课程图片', - `fabushijian` date DEFAULT NULL COMMENT '发布时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COMMENT='课程信息'; -/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `examrecord`; -- 如果表examrecord存在则删除它 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为utf8 +CREATE TABLE `examrecord` ( -- 创建名为examrecord的表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义id字段,类型为bigint(20),不能为空,自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义addtime字段,类型为timestamp,不能为空,默认值为当前时间戳,注释为创建时间 + `userid` bigint(20) NOT NULL COMMENT '用户id', -- 定义userid字段,类型为bigint(20),不能为空,注释为用户id + `username` varchar(200) DEFAULT NULL COMMENT '用户名', -- 定义username字段,类型为varchar(200),默认值为null,注释为用户名 + `paperid` bigint(20) NOT NULL COMMENT '试卷id(外键)', -- 定义paperid字段,类型为bigint(20),不能为空,注释为试卷id(外键) + `papername` varchar(200) NOT NULL COMMENT '试卷名称', -- 定义papername字段,类型为varchar(200),不能为空,注释为试卷名称 + `questionid` bigint(20) NOT NULL COMMENT '试题id(外键)', -- 定义questionid字段,类型为bigint(20),不能为空,注释为试题id(外键) + `questionname` varchar(200) NOT NULL COMMENT '试题名称', -- 定义questionname字段,类型为varchar(200),不能为空,注释为试题名称 + `options` longtext COMMENT '选项,json字符串', -- 定义options字段,类型为longtext,注释为选项,json字符串 + `score` bigint(20) DEFAULT '0' COMMENT '分值', -- 定义score字段,类型为bigint(20),默认值为0,注释为分值 + `answer` varchar(200) DEFAULT NULL COMMENT '正确答案', -- 定义answer字段,类型为varchar(200),默认值为null,注释为正确答案 + `analysis` longtext COMMENT '答案解析', -- 定义analysis字段,类型为longtext,注释为答案解析 + `myscore` bigint(20) NOT NULL DEFAULT '0' COMMENT '试题得分', -- 定义myscore字段,类型为bigint(20),不能为空,默认值为0,注释为试题得分 + `myanswer` varchar(200) DEFAULT NULL COMMENT '考生答案', -- 定义myanswer字段,类型为varchar(200),默认值为null,注释为考生答案 + PRIMARY KEY (`id`) -- 定义id字段为主键 +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='考试记录表'; -- 设置表的存储引擎为InnoDB,字符集为utf8,注释为考试记录表 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Dumping data for table `kechengxinxi` +-- Dumping data for table `examrecord` -- 说明接下来是向表examrecord中插入数据的操作 -- -LOCK TABLES `kechengxinxi` WRITE; -/*!40000 ALTER TABLE `kechengxinxi` DISABLE KEYS */; -INSERT INTO `kechengxinxi` VALUES (21,'2021-05-09 07:46:56','课程名称1','类型1','学科1','','老师姓名1','费用1','http://localhost:8080/springbootus5uu/upload/kechengxinxi_kechengtupian1.jpg','2021-05-09'),(22,'2021-05-09 07:46:56','课程名称2','类型2','学科2','','老师姓名2','费用2','http://localhost:8080/springbootus5uu/upload/kechengxinxi_kechengtupian2.jpg','2021-05-09'),(23,'2021-05-09 07:46:56','课程名称3','类型3','学科3','','老师姓名3','费用3','http://localhost:8080/springbootus5uu/upload/kechengxinxi_kechengtupian3.jpg','2021-05-09'),(24,'2021-05-09 07:46:56','课程名称4','类型4','学科4','','老师姓名4','费用4','http://localhost:8080/springbootus5uu/upload/kechengxinxi_kechengtupian4.jpg','2021-05-09'),(25,'2021-05-09 07:46:56','课程名称5','类型5','学科5','','老师姓名5','费用5','http://localhost:8080/springbootus5uu/upload/kechengxinxi_kechengtupian5.jpg','2021-05-09'),(26,'2021-05-09 07:46:56','课程名称6','类型6','学科6','','老师姓名6','费用6','http://localhost:8080/springbootus5uu/upload/kechengxinxi_kechengtupian6.jpg','2021-05-09'); -/*!40000 ALTER TABLE `kechengxinxi` ENABLE KEYS */; -UNLOCK TABLES; +LOCK TABLES `examrecord` WRITE; -- 对表examrecord进行写锁定 +/*!40000 ALTER TABLE `examrecord` DISABLE KEYS */; -- 禁用表examrecord的索引以加快数据插入速度 +/*!40000 ALTER TABLE `examrecord` ENABLE KEYS */; -- 重新启用表examrecord的索引 +UNLOCK TABLES; -- 解锁表examrecord -- --- Table structure for table `messages` +-- Table structure for table `forum` -- 说明接下来是表forum的表结构定义 -- -DROP TABLE IF EXISTS `messages`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `messages` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `userid` bigint(20) NOT NULL COMMENT '留言人id', - `username` varchar(200) DEFAULT NULL COMMENT '用户名', - `content` longtext NOT NULL COMMENT '留言内容', - `reply` longtext COMMENT '回复内容', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=187 DEFAULT CHARSET=utf8 COMMENT='留言板'; -/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `forum`; -- 如果表forum存在则删除它 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为utf8 +CREATE TABLE `forum` ( -- 创建名为forum的表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义id字段,类型为bigint(20),不能为空,自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义addtime字段,类型为timestamp,不能为空,默认值为当前时间戳,注释为创建时间 + `title` varchar(200) DEFAULT NULL COMMENT '帖子标题', -- 定义title字段,类型为varchar(200),默认值为null,注释为帖子标题 + `content` longtext NOT NULL COMMENT '帖子内容', -- 定义content字段,类型为longtext,不能为空,注释为帖子内容 + `parentid` bigint(20) DEFAULT NULL COMMENT '父节点id', -- 定义parentid字段,类型为bigint(20),默认值为null,注释为父节点id + `userid` bigint(20) NOT NULL COMMENT '用户id', -- 定义userid字段,类型为bigint(20),不能为空,注释为用户id + `username` varchar(200) DEFAULT NULL COMMENT '用户名', -- 定义username字段,类型为varchar(200),默认值为null,注释为用户名 + `isdone` varchar(200) DEFAULT NULL COMMENT '状态', -- 定义isdone字段,类型为varchar(200),默认值为null,注释为状态 + PRIMARY KEY (`id`) -- 定义id字段为主键 +) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8 COMMENT='学习交流'; -- 设置表的存储引擎为InnoDB,自动递增起始值为127,字符集为utf8,注释为学习交流 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 + +-- +-- Dumping data for table `forum` -- 说明接下来是向表forum中插入数据的操作 +-- + +LOCK TABLES `forum` WRITE; -- 对表forum进行写锁定 +/*!40000 ALTER TABLE `forum` DISABLE KEYS */; -- 禁用表forum的索引以加快数据插入速度 +INSERT INTO `forum` VALUES (121,'2021-05-09 07:46:56','帖子标题1','帖子内容1',1,1,'用户名1','开放'),(122,'2021-05-09 07:46:56','帖子标题2','帖子内容2',2,2,'用户名2','开放'),(123,'2021-05-09 07:46:56','帖子标题3','帖子内容3',3,3,'用户名3','开放'),(124,'2021-05-09 07:46:56','帖子标题4','帖子内容4',4,4,'用户名4','开放'),(125,'2021-05-09 07:46:56','帖子标题5','帖子内容5',5,5,'用户名5','开放'),(126,'2021-05-09 07:46:56','帖子标题6','帖子内容6',6,6,'用户名6','开放'); -- 向表forum中插入多条记录 +/*!40000 ALTER TABLE `forum` ENABLE KEYS */; -- 重新启用表forum的索引 +UNLOCK TABLES; -- 解锁表forum -- --- Dumping data for table `messages` --- - -LOCK TABLES `messages` WRITE; -/*!40000 ALTER TABLE `messages` DISABLE KEYS */; -INSERT INTO `messages` VALUES (181,'2021-05-09 07:46:56',1,'用户名1','留言内容1','回复内容1'),(182,'2021-05-09 07:46:56',2,'用户名2','留言内容2','回复内容2'),(183,'2021-05-09 07:46:56',3,'用户名3','留言内容3','回复内容3'),(184,'2021-05-09 07:46:56',4,'用户名4','留言内容4','回复内容4'),(185,'2021-05-09 07:46:56',5,'用户名5','留言内容5','回复内容5'),(186,'2021-05-09 07:46:56',6,'用户名6','留言内容6','回复内容6'); -/*!40000 ALTER TABLE `messages` ENABLE KEYS */; -UNLOCK TABLES; +-- Table structure for table `goumaidekecheng` -- 说明接下来是表goumaidekecheng的表结构定义 +-- + +DROP TABLE IF EXISTS `goumaidekecheng`; -- 如果表goumaidekecheng存在则删除它 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为utf8 +CREATE TABLE `goumaidekecheng` ( -- 创建名为goumaidekecheng的表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义id字段,类型为bigint(20),不能为空,自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义addtime字段,类型为timestamp,不能为空,默认值为当前时间戳,注释为创建时间 + `kechengmingcheng` varchar(200) DEFAULT NULL COMMENT '课程名称', -- 定义kechengmingcheng字段,类型为varchar(200),默认值为null,注释为课程名称 + `leixing` varchar(200) DEFAULT NULL COMMENT '类型', -- 定义leixing字段,类型为varchar(200),默认值为null,注释为类型 + `xueke` varchar(200) DEFAULT NULL COMMENT '学科', -- 定义xueke字段,类型为varchar(200),默认值为null,注释为学科 + `feiyong` varchar(200) DEFAULT NULL COMMENT '费用', -- 定义feiyong字段,类型为varchar(200),默认值为null,注释为费用 + `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号', -- 定义yonghuzhanghao字段,类型为varchar(200),默认值为null,注释为用户账号 + `goumaishijian` datetime DEFAULT NULL COMMENT '购买时间', -- 定义goumaishijian字段,类型为datetime,默认值为null,注释为购买时间 + `sfsh` varchar(200) DEFAULT '否' COMMENT '是否审核', -- 定义sfsh字段,类型为varchar(200),默认值为'否',注释为是否审核 + `shhf` longtext COMMENT '审核回复', -- 定义shhf字段,类型为longtext,注释为审核回复 + `ispay` varchar(200) DEFAULT '未支付' COMMENT '是否支付', -- 定义ispay字段,类型为varchar(200),默认值为'未支付',注释为是否支付 + PRIMARY KEY (`id`) -- 定义id字段为主键 +) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=utf8 COMMENT='购买的课程'; -- 设置表的存储引擎为InnoDB,自动递增起始值为57,字符集为utf8,注释为购买的课程 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Table structure for table `news` +-- Dumping data for table `goumaidekecheng` -- 说明接下来是向表goumaidekecheng中插入数据的操作 -- -DROP TABLE IF EXISTS `news`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `news` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `title` varchar(200) NOT NULL COMMENT '标题', - `introduction` longtext COMMENT '简介', - `picture` varchar(200) NOT NULL COMMENT '图片', - `content` longtext NOT NULL COMMENT '内容', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=177 DEFAULT CHARSET=utf8 COMMENT='教育资讯'; -/*!40101 SET character_set_client = @saved_cs_client */; +LOCK TABLES `goumaidekecheng` WRITE; -- 对表goumaidekecheng进行写锁定 +/*!40000 ALTER TABLE `goumaidekecheng` DISABLE KEYS */; -- 禁用表goumaidekecheng的索引以加快数据插入速度 +INSERT INTO `goumaidekecheng` VALUES (51,'2021-05-09 07:46:56','课程名称1','类型1','学科1','费用1','用户账号1','2021-05-09 15:46:56','是','','未支付'),(52,'2021-05-09 07:46:56','课程名称2','类型2','学科2','费用2','用户账号2','2021-05-09 15:46:56','是','','未支付'),(53,'2021-05-09 07:46:56','课程名称3','类型3','学科3','费用3','用户账号3','2021-05-09 15:46:56','是','','未支付'),(54,'2021-05-09 07:46:56','课程名称4','类型4','学科4','费用4','用户账号4','2021-05-09 15:46:56','是','','未支付'),(55,'2021-05-09 07:46:56','课程名称5','类型5','学科5','费用5','用户账号5','2021-05-09 15:46:56','是','','未支付'),(56,'2021-05-09 07:46:56','课程名称6','类型6','学科6','费用6','用户账号6','2021-05-09 15:46:56','是','','未支付'); -- 向表goumaidekecheng中插入多条记录 +/*!40000 ALTER TABLE `goumaidekecheng` ENABLE KEYS */; -- 重新启用表goumaidekecheng的索引 +UNLOCK TABLES; -- 解锁表goumaidekecheng -- --- Dumping data for table `news` +-- Table structure for table `kechengleixing` -- 说明接下来是表kechengleixing的表结构定义 -- -LOCK TABLES `news` WRITE; -/*!40000 ALTER TABLE `news` DISABLE KEYS */; -INSERT INTO `news` VALUES (171,'2021-05-09 07:46:56','标题1','简介1','http://localhost:8080/springbootus5uu/upload/news_picture1.jpg','内容1'),(172,'2021-05-09 07:46:56','标题2','简介2','http://localhost:8080/springbootus5uu/upload/news_picture2.jpg','内容2'),(173,'2021-05-09 07:46:56','标题3','简介3','http://localhost:8080/springbootus5uu/upload/news_picture3.jpg','内容3'),(174,'2021-05-09 07:46:56','标题4','简介4','http://localhost:8080/springbootus5uu/upload/news_picture4.jpg','内容4'),(175,'2021-05-09 07:46:56','标题5','简介5','http://localhost:8080/springbootus5uu/upload/news_picture5.jpg','内容5'),(176,'2021-05-09 07:46:56','标题6','简介6','http://localhost:8080/springbootus5uu/upload/news_picture6.jpg','内容6'); -/*!40000 ALTER TABLE `news` ENABLE KEYS */; -UNLOCK TABLES; +DROP TABLE IF EXISTS `kechengleixing`; -- 如果表kechengleixing存在则删除它 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为utf8 +CREATE TABLE `kechengleixing` ( -- 创建名为kechengleixing的表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义id字段,类型为bigint(20),不能为空,自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义addtime字段,类型为timestamp,不能为空,默认值为当前时间戳,注释为创建时间 + `leixing` varchar(200) DEFAULT NULL COMMENT '类型', -- 定义leixing字段,类型为varchar(200),默认值为null,注释为类型 + PRIMARY KEY (`id`) -- 定义id字段为主键 +) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8 COMMENT='课程类型'; -- 设置表的存储引擎为InnoDB,自动递增起始值为37,字符集为utf8,注释为课程类型 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Table structure for table `shipindianbo` +-- Dumping data for table `kechengleixing` -- 说明接下来是向表kechengleixing中插入数据的操作 -- -DROP TABLE IF EXISTS `shipindianbo`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `shipindianbo` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `shipinmingcheng` varchar(200) DEFAULT NULL COMMENT '视频名称', - `shipin` varchar(200) DEFAULT NULL COMMENT '视频', - `shipinjianjie` longtext COMMENT '视频简介', - `laiyuan` varchar(200) DEFAULT NULL COMMENT '来源', - `shangchuanshijian` datetime DEFAULT NULL COMMENT '上传时间', - `fengmian` varchar(200) DEFAULT NULL COMMENT '封面', - `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号', - `userid` bigint(20) DEFAULT NULL COMMENT '用户id', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=77 DEFAULT CHARSET=utf8 COMMENT='视频点播'; -/*!40101 SET character_set_client = @saved_cs_client */; +LOCK TABLES `kechengleixing` WRITE; -- 对表kechengleixing进行写锁定 +/*!40000 ALTER TABLE `kechengleixing` DISABLE KEYS */; -- 禁用表kechengleixing的索引以加快数据插入速度 +INSERT INTO `kechengleixing` VALUES (31,'2021-05-09 07:46:56','类型1'),(32,'2021-05-09 07:46:56','类型2'),(33,'2021-05-09 07:46:56','类型3'),(34,'2021-05-09 07:46:56','类型4'),(35,'2021-05-09 07:46:56','类型5'),(36,'2021-05-09 07:46:56','类型6'); -- 向表kechengleixing中插入多条记录 +/*!40000 ALTER TABLE `kechengleixing` ENABLE KEYS */; -- 重新启用表kechengleixing的索引 +UNLOCK TABLES; -- 解锁表kechengleixing -- --- Dumping data for table `shipindianbo` +-- Table structure for table `kechengxinxi` -- 说明接下来是表kechengxinxi的表结构定义 -- -LOCK TABLES `shipindianbo` WRITE; -/*!40000 ALTER TABLE `shipindianbo` DISABLE KEYS */; -INSERT INTO `shipindianbo` VALUES (71,'2021-05-09 07:46:56','视频名称1','http://localhost:8080/springbootus5uu/upload/1620547330699.mp4','视频简介1','来源1','2021-05-09 15:46:56','http://localhost:8080/springbootus5uu/upload/shipindianbo_fengmian1.jpg','用户1',1),(72,'2021-05-09 07:46:56','视频名称2','','视频简介2','来源2','2021-05-09 15:46:56','http://localhost:8080/springbootus5uu/upload/shipindianbo_fengmian2.jpg','用户账号2',2),(73,'2021-05-09 07:46:56','视频名称3','','视频简介3','来源3','2021-05-09 15:46:56','http://localhost:8080/springbootus5uu/upload/shipindianbo_fengmian3.jpg','用户账号3',3),(74,'2021-05-09 07:46:56','视频名称4','','视频简介4','来源4','2021-05-09 15:46:56','http://localhost:8080/springbootus5uu/upload/shipindianbo_fengmian4.jpg','用户账号4',4),(75,'2021-05-09 07:46:56','视频名称5','','视频简介5','来源5','2021-05-09 15:46:56','http://localhost:8080/springbootus5uu/upload/shipindianbo_fengmian5.jpg','用户账号5',5),(76,'2021-05-09 07:46:56','视频名称6','','视频简介6','来源6','2021-05-09 15:46:56','http://localhost:8080/springbootus5uu/upload/shipindianbo_fengmian6.jpg','用户账号6',6); -/*!40000 ALTER TABLE `shipindianbo` ENABLE KEYS */; -UNLOCK TABLES; +DROP TABLE IF EXISTS `kechengxinxi`; -- 如果表kechengxinxi存在则删除它 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为utf8 +CREATE TABLE `kechengxinxi` ( -- 创建名为kechengxinxi的表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义id字段,类型为bigint(20),不能为空,自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义addtime字段,类型为timestamp,不能为空,默认值为当前时间戳,注释为创建时间 + `kechengmingcheng` varchar(200) DEFAULT NULL COMMENT '课程名称', -- 定义kechengmingcheng字段,类型为varchar(200),默认值为null,注释为课程名称 + `leixing` varchar(200) DEFAULT NULL COMMENT '类型', -- 定义leixing字段,类型为varchar(200),默认值为null,注释为类型 + `xueke` varchar(200) DEFAULT NULL COMMENT '学科', -- 定义xueke字段,类型为varchar(200),默认值为null,注释为学科 + `shipin` varchar(200) DEFAULT NULL COMMENT '视频', -- 定义shipin字段,类型为varchar --- --- Table structure for table `storeup` + -- +-- Table structure for table `kechengxinxi` -- 表明接下来是对 `kechengxinxi` 表结构的定义 -- -DROP TABLE IF EXISTS `storeup`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `storeup` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `userid` bigint(20) NOT NULL COMMENT '用户id', - `refid` bigint(20) DEFAULT NULL COMMENT '收藏id', - `tablename` varchar(200) DEFAULT NULL COMMENT '表名', - `name` varchar(200) NOT NULL COMMENT '收藏名称', - `picture` varchar(200) NOT NULL COMMENT '收藏图片', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='收藏表'; -/*!40101 SET character_set_client = @saved_cs_client */; + DROP TABLE IF EXISTS `kechengxinxi`; -- 若 `kechengxinxi` 表存在,则将其删除 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为 UTF-8 +CREATE TABLE `kechengxinxi` ( -- 创建 `kechengxinxi` 表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义 `id` 字段,类型为 bigint(20),非空且自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义 `addtime` 字段,类型为 timestamp,非空,默认值为当前时间戳,注释为创建时间 + `kechengmingcheng` varchar(200) DEFAULT NULL COMMENT '课程名称', -- 定义 `kechengmingcheng` 字段,类型为 varchar(200),默认值为 NULL,注释为课程名称 + `leixing` varchar(200) DEFAULT NULL COMMENT '类型', -- 定义 `leixing` 字段,类型为 varchar(200),默认值为 NULL,注释为类型 + `xueke` varchar(200) DEFAULT NULL COMMENT '学科', -- 定义 `xueke` 字段,类型为 varchar(200),默认值为 NULL,注释为学科 + `shipin` varchar(200) DEFAULT NULL COMMENT '视频', -- 定义 `shipin` 字段,类型为 varchar(200),默认值为 NULL,注释为视频 + `laoshixingming` varchar(200) DEFAULT NULL COMMENT '老师姓名', -- 定义 `laoshixingming` 字段,类型为 varchar(200),默认值为 NULL,注释为老师姓名 + `feiyong` varchar(200) DEFAULT NULL COMMENT '费用', -- 定义 `feiyong` 字段,类型为 varchar(200),默认值为 NULL,注释为费用 + `kechengtupian` varchar(200) DEFAULT NULL COMMENT '课程图片', -- 定义 `kechengtupian` 字段,类型为 varchar(200),默认值为 NULL,注释为课程图片 + `fabushijian` date DEFAULT NULL COMMENT '发布时间', -- 定义 `fabushijian` 字段,类型为 date,默认值为 NULL,注释为发布时间 + PRIMARY KEY (`id`) -- 将 `id` 字段设为主键 +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COMMENT='课程信息'; -- 设置表的存储引擎为 InnoDB,自动递增起始值为 27,字符集为 UTF-8,注释为课程信息 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Dumping data for table `storeup` +-- Dumping data for table `kechengxinxi` -- 表示接下来是向 `kechengxinxi` 表中插入数据 -- -LOCK TABLES `storeup` WRITE; -/*!40000 ALTER TABLE `storeup` DISABLE KEYS */; -/*!40000 ALTER TABLE `storeup` ENABLE KEYS */; -UNLOCK TABLES; +LOCK TABLES `kechengxinxi` WRITE; -- 对 `kechengxinxi` 表进行写锁定 +/*!40000 ALTER TABLE `kechengxinxi` DISABLE KEYS */; -- 禁用 `kechengxinxi` 表的索引以加快数据插入速度 +INSERT INTO `kechengxinxi` VALUES (21,'2021-05-09 07:46:56','课程名称1','类型1','学科1','','老师姓名1','费用1','http://localhost:8080/springbootus5uu/upload/kechengxinxi_kechengtupian1.jpg','2021-05-09'), + (22,'2021-05-09 07:46:56','课程名称2','类型2','学科2','','老师姓名2','费用2','http://localhost:8080/springbootus5uu/upload/kechengxinxi_kechengtupian2.jpg','2021-05-09'), + (23,'2021-05-09 07:46:56','课程名称3','类型3','学科3','','老师姓名3','费用3','http://localhost:8080/springbootus5uu/upload/kechengxinxi_kechengtupian3.jpg','2021-05-09'), + (24,'2021-05-09 07:46:56','课程名称4','类型4','学科4','','老师姓名4','费用4','http://localhost:8080/springbootus5uu/upload/kechengxinxi_kechengtupian4.jpg','2021-05-09'), + (25,'2021-05-09 07:46:56','课程名称5','类型5','学科5','','老师姓名5','费用5','http://localhost:8080/springbootus5uu/upload/kechengxinxi_kechengtupian5.jpg','2021-05-09'), + (26,'2021-05-09 07:46:56','课程名称6','类型6','学科6','','老师姓名6','费用6','http://localhost:8080/springbootus5uu/upload/kechengxinxi_kechengtupian6.jpg','2021-05-09'); -- 向 `kechengxinxi` 表插入多条记录 +/*!40000 ALTER TABLE `kechengxinxi` ENABLE KEYS */; -- 重新启用 `kechengxinxi` 表的索引 +UNLOCK TABLES; -- 解锁 `kechengxinxi` 表 -- --- Table structure for table `token` +-- Table structure for table `messages` -- 表明接下来是对 `messages` 表结构的定义 -- -DROP TABLE IF EXISTS `token`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `token` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `userid` bigint(20) NOT NULL COMMENT '用户id', - `username` varchar(100) NOT NULL COMMENT '用户名', - `tablename` varchar(100) DEFAULT NULL COMMENT '表名', - `role` varchar(100) DEFAULT NULL COMMENT '角色', - `token` varchar(200) NOT NULL COMMENT '密码', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间', - `expiratedtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '过期时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='token表'; -/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `messages`; +-- 若 `messages` 表存在,则将其删除 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为 UTF-8 +CREATE TABLE `messages` ( -- 创建 `messages` 表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义 `id` 字段,类型为 bigint(20),非空且自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义 `addtime` 字段,类型为 timestamp,非空,默认值为当前时间戳,注释为创建时间 + `userid` bigint(20) NOT NULL COMMENT '留言人id', -- 定义 `userid` 字段,类型为 bigint(20),非空,注释为留言人 id + `username` varchar(200) DEFAULT NULL COMMENT '用户名', -- 定义 `username` 字段,类型为 varchar(200),默认值为 NULL,注释为用户名 + `content` longtext NOT NULL COMMENT '留言内容', -- 定义 `content` 字段,类型为 longtext,非空,注释为留言内容 + `reply` longtext COMMENT '回复内容', -- 定义 `reply` 字段,类型为 longtext,注释为回复内容 + PRIMARY KEY (`id`) -- 将 `id` 字段设为主键 +) ENGINE=InnoDB AUTO_INCREMENT=187 DEFAULT CHARSET=utf8 COMMENT='留言板'; -- 设置表的存储引擎为 InnoDB,自动递增起始值为 187,字符集为 UTF-8,注释为留言板 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 + +-- +-- Dumping data for table `messages` -- 表示接下来是向 `messages` 表中插入数据 +-- + +LOCK TABLES `messages` WRITE; -- 对 `messages` 表进行写锁定 +/*!40000 ALTER TABLE `messages` DISABLE KEYS */; -- 禁用 `messages` 表的索引以加快数据插入速度 +INSERT INTO `messages` VALUES (181,'2021-05-09 07:46:56',1,'用户名1','留言内容1','回复内容1'), + (182,'2021-05-09 07:46:56',2,'用户名2','留言内容2','回复内容2'), + (183,'2021-05-09 07:46:56',3,'用户名3','留言内容3','回复内容3'), + (184,'2021-05-09 07:46:56',4,'用户名4','留言内容4','回复内容4'), + (185,'2021-05-09 07:46:56',5,'用户名5','留言内容5','回复内容5'), + (186,'2021-05-09 07:46:56',6,'用户名6','留言内容6','回复内容6'); -- 向 `messages` 表插入多条记录 +/*!40000 ALTER TABLE `messages` ENABLE KEYS */; -- 重新启用 `messages` 表的索引 +UNLOCK TABLES; -- 解锁 `messages` 表 + +-- +-- Table structure for table `news` -- 表明接下来是对 `news` 表结构的定义 +-- + +DROP TABLE IF EXISTS `news`; -- 若 `news` 表存在,则将其删除 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为 UTF-8 +CREATE TABLE `news` ( -- 创建 `news` 表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义 `id` 字段,类型为 bigint(20),非空且自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义 `addtime` 字段,类型为 timestamp,非空,默认值为当前时间戳,注释为创建时间 + `title` varchar(200) NOT NULL COMMENT '标题', -- 定义 `title` 字段,类型为 varchar(200),非空,注释为标题 + `introduction` longtext COMMENT '简介', -- 定义 `introduction` 字段,类型为 longtext,注释为简介 + `picture` varchar(200) NOT NULL COMMENT '图片', -- 定义 `picture` 字段,类型为 varchar(200),非空,注释为图片 + `content` longtext NOT NULL COMMENT '内容', -- 定义 `content` 字段,类型为 longtext,非空,注释为内容 + PRIMARY KEY (`id`) -- 将 `id` 字段设为主键 +) ENGINE=InnoDB AUTO_INCREMENT=177 DEFAULT CHARSET=utf8 COMMENT='教育资讯'; -- 设置表的存储引擎为 InnoDB,自动递增起始值为 177,字符集为 UTF-8,注释为教育资讯 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 + +-- +-- Dumping data for table `news` -- 表示接下来是向 `news` 表中插入数据 +-- + +LOCK TABLES `news` WRITE; -- 对 `news` 表进行写锁定 +/*!40000 ALTER TABLE `news` DISABLE KEYS */; -- 禁用 `news` 表的索引以加快数据插入速度 +INSERT INTO `news` VALUES (171,'2021-05-09 07:46:56','标题1','简介1','http://localhost:8080/springbootus5uu/upload/news_picture1.jpg','内容1'), + (172,'2021-05-09 07:46:56','标题2','简介2','http://localhost:8080/springbootus5uu/upload/news_picture2.jpg','内容2'), + (173,'2021-05-09 07:46:56','标题3','简介3','http://localhost:8080/springbootus5uu/upload/news_picture3.jpg','内容3'), + (174,'2021-05-09 07:46:56','标题4','简介4','http://localhost:8080/springbootus5uu/upload/news_picture4.jpg','内容4'), + (175,'2021-05-09 07:46:56','标题5','简介5','http://localhost:8080/springbootus5uu/upload/news_picture5.jpg','内容5'), + (176,'2021-05-09 07:46:56','标题6','简介6','http://localhost:8080/springbootus5uu/upload/news_picture6.jpg','内容6'); -- 向 `news` 表插入多条记录 +/*!40000 ALTER TABLE `news` ENABLE KEYS */; -- 重新启用 `news` 表的索引 +UNLOCK TABLES; -- 解锁 `news` 表 -- --- Dumping data for table `token` +-- Table structure for table `shipindianbo` -- 表明接下来是对 `shipindianbo` 表结构的定义 +-- + +DROP TABLE IF EXISTS `shipindianbo`; -- 若 `shipindianbo` 表存在,则将其删除 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为 UTF-8 +CREATE TABLE `shipindianbo` ( -- 创建 `shipindianbo` 表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义 `id` 字段,类型为 bigint(20),非空且自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义 `addtime` 字段,类型为 timestamp,非空,默认值为当前时间戳,注释为创建时间 + `shipinmingcheng` varchar(200) DEFAULT NULL COMMENT '视频名称', -- 定义 `shipinmingcheng` 字段,类型为 varchar(200),默认值为 NULL,注释为视频名称 + `shipin` varchar(200) DEFAULT NULL COMMENT '视频', -- 定义 `shipin` 字段,类型为 varchar(200),默认值为 NULL,注释为视频 + `shipinjianjie` longtext COMMENT '视频简介', -- 定义 `shipinjianjie` 字段,类型为 longtext,注释为视频简介 + `laiyuan` varchar(200) DEFAULT NULL COMMENT '来源', -- 定义 `laiyuan` 字段,类型为 varchar(200),默认值为 NULL,注释为来源 + `shangchuanshijian` datetime DEFAULT NULL COMMENT '上传时间', -- 定义 `shangchuanshijian` 字段,类型为 datetime,默认值为 NULL,注释为上传时间 + `fengmian` varchar(200) DEFAULT NULL COMMENT '封面', -- 定义 `fengmian` 字段,类型为 varchar(200),默认值为 NULL,注释为封面 + `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号', -- 定义 `yonghuzhanghao` 字段,类型为 varchar(200),默认值为 NULL,注释为用户账号 + `userid` bigint(20) DEFAULT NULL COMMENT '用户id', -- 定义 `userid` 字段,类型为 bigint(20),默认值为 NULL,注释为用户 id + PRIMARY KEY (`id`) -- 将 `id` 字段设为主键 +) ENGINE=InnoDB AUTO_INCREMENT=77 DEFAULT CHARSET=utf8 COMMENT='视频点播'; -- 设置表的存储引擎为 InnoDB,自动递增起始值为 77,字符集为 UTF-8,注释为视频点播 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 + +-- +-- Dumping data for table `shipindianbo` -- 表示接下来是向 `shipindianbo` 表中插入数据 -- -LOCK TABLES `token` WRITE; -/*!40000 ALTER TABLE `token` DISABLE KEYS */; -INSERT INTO `token` VALUES (1,11,'用户1','yonghu','用户','lmyhs373nwl5bgxuaqqaov03fo3mr4ci','2021-05-09 07:48:33','2021-05-09 09:02:33'),(2,1,'abo','users','管理员','o4g7kcsm6le2m4rz9iui659gd9ck4qqh','2021-05-09 07:49:17','2021-05-09 08:49:17'); -/*!40000 ALTER TABLE `token` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `users` --- +LOCK TABLES `shipindianbo` WRITE; -- 对 `shipindianbo` 表进行写锁定 +/*!40000 ALTER TABLE `shipindianbo` DISABLE KEYS */; -- 禁用 `shipindianbo` 表的索引以加快数据插入速度 +INSERT INTO `shipindianbo` VALUES (71,'2021-05-09 07:46:56','视频名称1','http://localhost:8080/springbootus5uu/upload/1620547330699.mp4','视频简介1','来源1','2021-05-09 15:46:56','http://localhost:8080/springbootus5uu/upload/shipindianbo_fengmian1.jpg','用户1',1), + (72,'2021-05-09 07:46:56','视频名称2','','视频简介2','来源2','2021-05-09 15:46:56','http://localhost:8080/springbootus5uu/upload/shipindianbo_fengmian2.jpg','用户账号2',2), + (73,'2021-05-09 07:46:56','视频名称3','','视频简介3','来源3','2021-05-09 15:46:56','http://localhost:8080/springbootus5uu/upload/shipindianbo_fengmian3.jpg','用户账号3',3), + (74,'2021-05-09 07:46:56','视频名称4','','视频简介4','来源4','2021-05-09 15:46:56','http://localhost:8080/springbootus5uu/upload/shipindianbo_fengmian4.jpg','用户账号4',4), + (75,'2021-05-09 07:46:56','视频名称5','','视频简介5','来源5','2021-05-09 15:46:56','http://localhost:8080/springbootus5uu/upload/shipindianbo_fengmian5.jpg','用户账号5',5), + (76,'2021-05-09 07:46:56','视频名称6','','视频简介6','来源6','2021-05-09 15:46:56','http://localhost:8080/springbootus5uu/upload/shipindianbo_fengmian6.jpg','用户账号6',6); -- 向 `shipindianbo` 表插入多条记录 +/*!40000 ALTER TABLE `shipindianbo` ENABLE KEYS */; -- 重新启用 `shipindianbo` 表的索引 +UNLOCK TABLES; -- 解锁 `shipindianbo` 表 + +-- +-- Table structure for table `storeup` -- 表明接下来是对 `storeup` 表结构的定义 +-- -DROP TABLE IF EXISTS `users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `users` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `username` varchar(100) NOT NULL COMMENT '用户名', - `password` varchar(100) NOT NULL COMMENT '密码', - `role` varchar(100) DEFAULT '管理员' COMMENT '角色', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户表'; -/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `storeup`; -- 若 `storeup` 表存在,则将其删除 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为 UTF-8 +CREATE TABLE `storeup` ( -- 创建 `storeup` 表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义 `id` 字段,类型为 bigint(20),非空且自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义 `addtime` 字段,类型为 timestamp,非空,默认值为当前时间戳,注释为创建时间 + `userid` bigint(20) NOT NULL COMMENT '用户id', -- 定义 `userid` 字段,类型为 bigint(20),非空,注释为用户 id + `refid` bigint(20) DEFAULT NULL COMMENT '收藏id', -- 定义 `refid` 字段,类型为 bigint(20),默认值为 NULL,注释为收藏 id + `tablename` varchar(200) DEFAULT NULL COMMENT '表名', -- 定义 `tablename` 字段,类型为 varchar(200),默认值为 NULL,注释为表名 + `name` varchar(200) NOT NULL COMMENT '收藏名称', -- 定义 `name` 字段,类型为 varchar(200),非空,注释为收藏名称 + `picture` varchar(200) NOT NULL COMMENT '收藏图片', -- 定义 `picture` 字段,类型为 varchar(200),非空,注释为收藏图片 + PRIMARY KEY (`id`) -- 将 `id` 字段设为主键 +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='收藏表'; -- 设置表的存储引擎为 InnoDB,字符集为 UTF-8,注释为收藏表 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Dumping data for table `users` +-- Dumping data for table `storeup` -- 表示接下来是向 `storeup` 表中插入数据 -- -LOCK TABLES `users` WRITE; -/*!40000 ALTER TABLE `users` DISABLE KEYS */; -INSERT INTO `users` VALUES (1,'abo','abo','管理员','2021-05-09 07:46:56'); -/*!40000 ALTER TABLE `users` ENABLE KEYS */; -UNLOCK TABLES; +LOCK TABLES `storeup` WRITE; -- 对 `storeup` 表进行写锁定 +/*!40000 ALTER TABLE `storeup` DISABLE KEYS */; -- 禁用 `storeup` 表的索引以加快数据插入速度 +/*!40000 ALTER TABLE `storeup` ENABLE KEYS */; -- 重新启用 `storeup` 表的索引 +UNLOCK TABLES; -- 解锁 `storeup` 表 -- --- Table structure for table `wodebiji` +-- Table structure for table `token` -- 表明接下来是对 `token` 表结构的定义 -- -DROP TABLE IF EXISTS `wodebiji`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wodebiji` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `biaoti` varchar(200) DEFAULT NULL COMMENT '标题', - `neirong` longtext COMMENT '内容', - `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=87 DEFAULT CHARSET=utf8 COMMENT='我的笔记'; -/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `token`; -- 若 `token` 表存在,则将其删除 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为 UTF-8 +CREATE TABLE `token` ( -- 创建 `token` 表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义 `id` 字段,类型为 bigint(20),非空且自动递增,注释为主键 + `userid` bigint(20) NOT NULL COMMENT '用户id', -- 定义 `userid` 字段,类型为 bigint(20),非空,注释为用户 id + `username` varchar(100) NOT NULL COMMENT '用户名', -- 定义 `username` 字段,类型为 varchar(100),非空,注释为用户名 + `tablename` varchar(100) DEFAULT NULL COMMENT '表名', -- 定义 `tablename` 字段,类型为 varchar(100),默认值为 NULL,注释为表名 + `role` varchar(100) DEFAULT NULL COMMENT '角色', -- 定义 `role` 字段,类型为 varchar(100),默认值为 NULL,注释为角色 + `token` varchar(200) NOT NULL COMMENT '密码', -- 定义 `token` 字段,类型为 varchar(200),非空,注释为密码 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间', -- 定义 `addtime` 字段,类型为 timestamp,非空,默认值为当前时间戳,注释为新增时间 + `expiratedtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '过期时间', -- 定义 `expiratedtime` 字段,类型为 timestamp,非空,默认值为当前时间戳,注释为过期时间 + PRIMARY KEY (`id`) -- 将 `id` 字段设为主键 +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='token表'; -- 设置表的存储引擎为 InnoDB,自动递增起始值为 3,字符集为 UTF-8,注释为 token 表 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Dumping data for table `wodebiji` +-- Dumping data for table `token` -- 表示接下来是向 `token` 表中插入数据 -- -LOCK TABLES `wodebiji` WRITE; -/*!40000 ALTER TABLE `wodebiji` DISABLE KEYS */; -INSERT INTO `wodebiji` VALUES (81,'2021-05-09 07:46:56','标题1','内容1','用户账号1'),(82,'2021-05-09 07:46:56','标题2','内容2','用户账号2'),(83,'2021-05-09 07:46:56','标题3','内容3','用户账号3'),(84,'2021-05-09 07:46:56','标题4','内容4','用户账号4'),(85,'2021-05-09 07:46:56','标题5','内容5','用户账号5'),(86,'2021-05-09 07:46:56','标题6','内容6','用户账号6'); -/*!40000 ALTER TABLE `wodebiji` ENABLE KEYS */; -UNLOCK TABLES; +LOCK TABLES `token` WRITE; -- 对 `token` 表进行写锁定 +/*!40000 ALTER TABLE `token` DISABLE KEYS */; -- 禁用 `token` 表的索引以加快数据插入速度 +INSERT INTO `token` VALUES (1,11,'用户1','yonghu','用户','lmyhs373nwl5bgxuaqqaov03fo3mr4ci','2021-05-09 07:48:33','2021-05-09 09:02:33'), + (2,1,'abo','users','管理员','o4g7kcsm6le2m4rz9iui659gd9ck4qqh','2021-05-09 07:49:17','2021-05-09 08:49:17'); -- 向 `token` 表插入多条记录 +/*!40000 ALTER TABLE `token` ENABLE KEYS */; -- 重新启用 `token` 表的索引 +UNLOCK TABLES; -- 解锁 `token` 表 -- --- Table structure for table `wodekecheng` +-- Table structure for table `users` -- 表明接下来是对 `users` 表结构的定义 -- -DROP TABLE IF EXISTS `wodekecheng`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wodekecheng` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `kechengmingcheng` varchar(200) DEFAULT NULL COMMENT '课程名称', - `zhangjie` varchar(200) DEFAULT NULL COMMENT '章节', - `wenjian` varchar(200) DEFAULT NULL COMMENT '文件', - `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8 COMMENT='我的课程'; -/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `users`; -- 若 `users` 表存在,则将其删除 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为 UTF-8 +CREATE TABLE `users` ( -- 创建 `users` 表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义 `id` 字段,类型为 bigint(20),非空且自动递增,注释为主键 + `username` varchar(100) NOT NULL COMMENT '用户名', -- 定义 `username` 字段,类型为 varchar(100),非空,注释为用户名 + `password` varchar(100) NOT NULL COMMENT '密码', -- 定义 `password` 字段,类型为 varchar(100),非空,注释为密码 + `role` varchar(100) DEFAULT '管理员' COMMENT '角色', -- 定义 `role` 字段,类型为 varchar(100),默认值为 '管理员',注释为角色 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间', -- 定义 `addtime` 字段,类型为 timestamp,非空,默认值为当前时间戳,注释为新增时间 + PRIMARY KEY (`id`) -- 将 `id` 字段设为主键 +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户表'; -- 设置表的存储引擎为 InnoDB,自动递增起始值为 2,字符集为 UTF-8,注释为用户表 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Dumping data for table `wodekecheng` +-- Dumping data for table `users` -- 表示接下来是向 `users` 表中插入数据 -- -LOCK TABLES `wodekecheng` WRITE; -/*!40000 ALTER TABLE `wodekecheng` DISABLE KEYS */; -INSERT INTO `wodekecheng` VALUES (91,'2021-05-09 07:46:56','课程名称1','章节1','','用户账号1'),(92,'2021-05-09 07:46:56','课程名称2','章节2','','用户账号2'),(93,'2021-05-09 07:46:56','课程名称3','章节3','','用户账号3'),(94,'2021-05-09 07:46:56','课程名称4','章节4','','用户账号4'),(95,'2021-05-09 07:46:56','课程名称5','章节5','','用户账号5'),(96,'2021-05-09 07:46:56','课程名称6','章节6','','用户账号6'); -/*!40000 ALTER TABLE `wodekecheng` ENABLE KEYS */; -UNLOCK TABLES; +LOCK TABLES `users` WRITE; -- 对 `users` 表进行写锁定 +/*!40000 ALTER TABLE `users` DISABLE KEYS */; -- 禁用 `users` 表的索引以加快数据插入速度 +INSERT INTO `users` VALUES (1,'abo','abo','管理员','2021-05-09 07:46:56'); -- 向 `users` 表插入一条记录 +/*!40000 ALTER TABLE `users` ENABLE KEYS */; -- 重新启用 `users` 表的索引 +UNLOCK TABLES; -- 解锁 `users` 表 -- --- Table structure for table `xiaoxitongzhi` +-- Table structure for table `wodebiji` -- 表明接下来是对 `wodebiji` 表结构的定义 -- -DROP TABLE IF EXISTS `xiaoxitongzhi`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `xiaoxitongzhi` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `tongzhibiaoti` varchar(200) DEFAULT NULL COMMENT '通知标题', - `tongzhineirong` longtext COMMENT '通知内容', - `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号', - `fasongshijian` datetime DEFAULT NULL COMMENT '发送时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=107 DEFAULT CHARSET=utf8 COMMENT='消息通知'; -/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `wodebiji`; -- 若 `wodebiji` 表存在,则将其删除 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为 UTF-8 +CREATE TABLE `wodebiji` ( -- 创建 `wodebiji` 表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义 `id` 字段,类型为 bigint(20),非空且自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义 `addtime` 字段,类型为 timestamp,非空,默认值为当前时间戳,注释为创建时间 + `biaoti` varchar(200) DEFAULT NULL COMMENT '标题', -- 定义 `biaoti` 字段,类型为 varchar(200),默认值为 NULL,注释为标题 + `neirong` longtext COMMENT '内容', -- 定义 `neirong` 字段,类型为 longtext,注释为内容 + `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号', -- 定义 `yonghuzhanghao` 字段,类型为 varchar(200),默认值为 NULL,注释为用户账号 + PRIMARY KEY (`id`) -- 将 `id` 字段设为主键 +) ENGINE=InnoDB AUTO_INCREMENT=87 DEFAULT CHARSET=utf8 COMMENT='我的笔记'; -- 设置表的存储引擎为 InnoDB,自动递增起始值为 87,字符集为 UTF-8,注释为我的笔记 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 -- --- Dumping data for table `xiaoxitongzhi` +-- Dumping data for table `wodebiji` -- 表示接下来是向 `wodebiji` 表中插入数据 -- -LOCK TABLES `xiaoxitongzhi` WRITE; -/*!40000 ALTER TABLE `xiaoxitongzhi` DISABLE KEYS */; -INSERT INTO `xiaoxitongzhi` VALUES (101,'2021-05-09 07:46:56','通知标题1','通知内容1','用户账号1','2021-05-09 15:46:56'),(102,'2021-05-09 07:46:56','通知标题2','通知内容2','用户账号2','2021-05-09 15:46:56'),(103,'2021-05-09 07:46:56','通知标题3','通知内容3','用户账号3','2021-05-09 15:46:56'),(104,'2021-05-09 07:46:56','通知标题4','通知内容4','用户账号4','2021-05-09 15:46:56'),(105,'2021-05-09 07:46:56','通知标题5','通知内容5','用户账号5','2021-05-09 15:46:56'),(106,'2021-05-09 07:46:56','通知标题6','通知内容6','用户账号6','2021-05-09 15:46:56'); -/*!40000 ALTER TABLE `xiaoxitongzhi` ENABLE KEYS */; -UNLOCK TABLES; - -- --- Table structure for table `xueke` +-- Table structure for table `wodebiji` -- 说明接下来是定义 wodebiji 表的结构 -- -DROP TABLE IF EXISTS `xueke`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `xueke` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `xueke` varchar(200) DEFAULT NULL COMMENT '学科', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8 COMMENT='学科'; -/*!40101 SET character_set_client = @saved_cs_client */; - +DROP TABLE IF EXISTS `wodebiji`; -- 如果 wodebiji 表已存在,就将其删除 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为 UTF-8 +CREATE TABLE `wodebiji` ( -- 创建 wodebiji 表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义 id 字段,类型为 bigint(20),非空且自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义 addtime 字段,类型为 timestamp,非空,默认值为当前时间戳,注释为创建时间 + `biaoti` varchar(200) DEFAULT NULL COMMENT '标题', -- 定义 biaoti 字段,类型为 varchar(200),默认值为 NULL,注释为标题 + `neirong` longtext COMMENT '内容', -- 定义 neirong 字段,类型为 longtext,注释为内容 + `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号', -- 定义 yonghuzhanghao 字段,类型为 varchar(200),默认值为 NULL,注释为用户账号 + PRIMARY KEY (`id`) -- 将 id 字段设为主键 +) ENGINE=InnoDB AUTO_INCREMENT=87 DEFAULT CHARSET=utf8 COMMENT='我的笔记'; -- 设置表的存储引擎为 InnoDB,自动递增起始值为 87,字符集为 UTF-8,注释为我的笔记 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 + -- --- Dumping data for table `xueke` --- - -LOCK TABLES `xueke` WRITE; -/*!40000 ALTER TABLE `xueke` DISABLE KEYS */; -INSERT INTO `xueke` VALUES (41,'2021-05-09 07:46:56','学科1'),(42,'2021-05-09 07:46:56','学科2'),(43,'2021-05-09 07:46:56','学科3'),(44,'2021-05-09 07:46:56','学科4'),(45,'2021-05-09 07:46:56','学科5'),(46,'2021-05-09 07:46:56','学科6'); -/*!40000 ALTER TABLE `xueke` ENABLE KEYS */; -UNLOCK TABLES; - +-- Dumping data for table `wodebiji` -- 说明接下来是向 wodebiji 表中插入数据 -- --- Table structure for table `yonghu` -- - -DROP TABLE IF EXISTS `yonghu`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `yonghu` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `yonghuzhanghao` varchar(200) NOT NULL COMMENT '用户账号', - `mima` varchar(200) NOT NULL COMMENT '密码', - `yonghuxingming` varchar(200) NOT NULL COMMENT '用户姓名', - `xingbie` varchar(200) DEFAULT NULL COMMENT '性别', - `shouji` varchar(200) DEFAULT NULL COMMENT '手机', - `youxiang` varchar(200) DEFAULT NULL COMMENT '邮箱', - `touxiang` varchar(200) DEFAULT NULL COMMENT '头像', - PRIMARY KEY (`id`), - UNIQUE KEY `yonghuzhanghao` (`yonghuzhanghao`) -) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COMMENT='用户'; -/*!40101 SET character_set_client = @saved_cs_client */; - +LOCK TABLES `wodebiji` WRITE; -- 对 wodebiji 表进行写锁定 +/*!40000 ALTER TABLE `wodebiji` DISABLE KEYS */; -- 禁用 wodebiji 表的索引以加快数据插入速度 +INSERT INTO `wodebiji` VALUES + (81,'2021-05-09 07:46:56','标题1','内容1','用户账号1'), + (82,'2021-05-09 07:46:56','标题2','内容2','用户账号2'), + (83,'2021-05-09 07:46:56','标题3','内容3','用户账号3'), + (84,'2021-05-09 07:46:56','标题4','内容4','用户账号4'), + (85,'2021-05-09 07:46:56','标题5','内容5','用户账号5'), + (86,'2021-05-09 07:46:56','标题6','内容6','用户账号6'); -- 向 wodebiji 表插入多条记录 +/*!40000 ALTER TABLE `wodebiji` ENABLE KEYS */; -- 重新启用 wodebiji 表的索引 +UNLOCK TABLES; -- 解锁 wodebiji 表 + -- --- Dumping data for table `yonghu` +-- Table structure for table `yonghu` -- 说明接下来是定义 yonghu 表的结构 -- -LOCK TABLES `yonghu` WRITE; -/*!40000 ALTER TABLE `yonghu` DISABLE KEYS */; -INSERT INTO `yonghu` VALUES (11,'2021-05-09 07:46:56','用户1','123456','用户姓名1','男','13823888881','773890001@qq.com','http://localhost:8080/springbootus5uu/upload/yonghu_touxiang1.jpg'),(12,'2021-05-09 07:46:56','用户2','123456','用户姓名2','男','13823888882','773890002@qq.com','http://localhost:8080/springbootus5uu/upload/yonghu_touxiang2.jpg'),(13,'2021-05-09 07:46:56','用户3','123456','用户姓名3','男','13823888883','773890003@qq.com','http://localhost:8080/springbootus5uu/upload/yonghu_touxiang3.jpg'),(14,'2021-05-09 07:46:56','用户4','123456','用户姓名4','男','13823888884','773890004@qq.com','http://localhost:8080/springbootus5uu/upload/yonghu_touxiang4.jpg'),(15,'2021-05-09 07:46:56','用户5','123456','用户姓名5','男','13823888885','773890005@qq.com','http://localhost:8080/springbootus5uu/upload/yonghu_touxiang5.jpg'),(16,'2021-05-09 07:46:56','用户6','123456','用户姓名6','男','13823888886','773890006@qq.com','http://localhost:8080/springbootus5uu/upload/yonghu_touxiang6.jpg'); -/*!40000 ALTER TABLE `yonghu` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `zhiyeguihua` +DROP TABLE IF EXISTS `yonghu`; -- 如果 yonghu 表已存在,就将其删除 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为 UTF-8 +CREATE TABLE `yonghu` ( -- 创建 yonghu 表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义 id 字段,类型为 bigint(20),非空且自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义 addtime 字段,类型为 timestamp,非空,默认值为当前时间戳,注释为创建时间 + `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号', -- 定义 yonghuzhanghao 字段,类型为 varchar(200),默认值为 NULL,注释为用户账号 + `mima` varchar(200) DEFAULT NULL COMMENT '密码', -- 定义 mima 字段,类型为 varchar(200),默认值为 NULL,注释为密码 + `xingming` varchar(200) DEFAULT NULL COMMENT '姓名', -- 定义 xingming 字段,类型为 varchar(200),默认值为 NULL,注释为姓名 + `xingbie` varchar(200) DEFAULT NULL COMMENT '性别', -- 定义 xingbie 字段,类型为 varchar(200),默认值为 NULL,注释为性别 + `nianling` int(11) DEFAULT NULL COMMENT '年龄', -- 定义 nianling 字段,类型为 int(11),默认值为 NULL,注释为年龄 + `shouji` varchar(200) DEFAULT NULL COMMENT '手机', -- 定义 shouji 字段,类型为 varchar(200),默认值为 NULL,注释为手机 + `youxiang` varchar(200) DEFAULT NULL COMMENT '邮箱', -- 定义 youxiang 字段,类型为 varchar(200),默认值为 NULL,注释为邮箱 + `zhaopian` varchar(200) DEFAULT NULL COMMENT '照片', -- 定义 zhaopian 字段,类型为 varchar(200),默认值为 NULL,注释为照片 + PRIMARY KEY (`id`) -- 将 id 字段设为主键 +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT='用户'; -- 设置表的存储引擎为 InnoDB,自动递增起始值为 12,字符集为 UTF-8,注释为用户 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 + +-- +-- Dumping data for table `yonghu` -- 说明接下来是向 yonghu 表中插入数据 +-- + +LOCK TABLES `yonghu` WRITE; -- 对 yonghu 表进行写锁定 +/*!40000 ALTER TABLE `yonghu` DISABLE KEYS */; -- 禁用 yonghu 表的索引以加快数据插入速度 +INSERT INTO `yonghu` VALUES + (1,'用户账号1','密码1','姓名1','男',20,'13800138001','123456@qq.com','http://localhost:8080/springbootus5uu/upload/yonghu_zhaopian1.jpg'), + (2,'用户账号2','密码2','姓名2','女',22,'13900139001','234567@qq.com','http://localhost:8080/springbootus5uu/upload/yonghu_zhaopian2.jpg'), + (3,'用户账号3','密码3','姓名3','男',25,'13700137001','345678@qq.com','http://localhost:8080/springbootus5uu/upload/yonghu_zhaopian3.jpg'), + (4,'用户账号4','密码4','姓名4','女',21,'13600136001','456789@qq.com','http://localhost:8080/springbootus5uu/upload/yonghu_zhaopian4.jpg'), + (5,'用户账号5','密码5','姓名5','男',23,'13500135001','567890@qq.com','http://localhost:8080/springbootus5uu/upload/yonghu_zhaopian5.jpg'), + (6,'用户账号6','密码6','姓名6','女',24,'13400134001','678901@qq.com','http://localhost:8080/springbootus5uu/upload/yonghu_zhaopian6.jpg'); -- 向 yonghu 表插入多条记录 +/*!40000 ALTER TABLE `yonghu` ENABLE KEYS */; -- 重新启用 yonghu 表的索引 +UNLOCK TABLES; -- 解锁 yonghu 表 + +-- +-- Table structure for table `yuyuekecheng` -- 说明接下来是定义 yuyuekecheng 表的结构 +-- + +DROP TABLE IF EXISTS `yuyuekecheng`; -- 如果 yuyuekecheng 表已存在,就将其删除 +/*!40101 SET @saved_cs_client = @@character_set_client */; -- 保存当前的字符集客户端设置 +/*!40101 SET character_set_client = utf8 */; -- 设置字符集客户端为 UTF-8 +CREATE TABLE `yuyuekecheng` ( -- 创建 yuyuekecheng 表 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', -- 定义 id 字段,类型为 bigint(20),非空且自动递增,注释为主键 + `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 定义 addtime 字段,类型为 timestamp,非空,默认值为当前时间戳,注释为创建时间 + `kechengmingcheng` varchar(200) DEFAULT NULL COMMENT '课程名称', -- 定义 kechengmingcheng 字段,类型为 varchar(200),默认值为 NULL,注释为课程名称 + `leixing` varchar(200) DEFAULT NULL COMMENT '类型', -- 定义 leixing 字段,类型为 varchar(200),默认值为 NULL,注释为类型 + `xueke` varchar(200) DEFAULT NULL COMMENT '学科', -- 定义 xueke 字段,类型为 varchar(200),默认值为 NULL,注释为学科 + `feiyong` varchar(200) DEFAULT NULL COMMENT '费用', -- 定义 feiyong 字段,类型为 varchar(200),默认值为 NULL,注释为费用 + `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号', -- 定义 yonghuzhanghao 字段,类型为 varchar(200),默认值为 NULL,注释为用户账号 + `yuyueshijian` datetime DEFAULT NULL COMMENT '预约时间', -- 定义 yuyueshijian 字段,类型为 datetime,默认值为 NULL,注释为预约时间 + `sfsh` varchar(200) DEFAULT '否' COMMENT '是否审核', -- 定义 sfsh 字段,类型为 varchar(200),默认值为 '否',注释为是否审核 + `shhf` longtext COMMENT '审核回复', -- 定义 shhf 字段,类型为 longtext,注释为审核回复 + PRIMARY KEY (`id`) -- 将 id 字段设为主键 +) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8 COMMENT='预约课程'; -- 设置表的存储引擎为 InnoDB,自动递增起始值为 37,字符集为 UTF-8,注释为预约课程 +/*!40101 SET character_set_client = @saved_cs_client */; -- 恢复之前保存的字符集客户端设置 + +-- +-- Dumping data for table `yuyuekecheng` -- 说明接下来是向 yuyuekecheng 表中插入数据 +-- + +LOCK TABLES `yuyuekecheng` WRITE; -- 对 yuyuekecheng 表进行写锁定 +/*!40000 ALTER TABLE `yuyuekecheng` DISABLE KEYS */; -- 禁用 yuyuekecheng 表的索引以加快数据插入速度 +INSERT INTO `yuyuekecheng` VALUES + (31,'2021-05-09 07:46:56','课程名称1','类型1','学科1','费用1','用户账号1','2021-05-09 15:46:56','是',''), + (32,'2021-05-09 07:46:56','课程名称2','类型2','学科2','费用2','用户账号2','2021-05-09 15:46:56','是',''), + (33,'2021-05-09 07:46:56','课程名称3','类型3','学科3','费用3','用户账号3','2021-05-09 15:46:56','是',''), + (34,'2021-05-09 07:46:56','课程名称4','类型4','学科4','费用4','用户账号4','2021-05-09 15:46:56','是',''), + (35,'2021-05-09 07:46:56','课程名称5','类型5','学科5','费用5','用户账号5','2021-05-09 15:46:56','是',''), + (36,'2021-05-09 07:46:56','课程名称6','类型6','学科6','费用6','用户账号6','2021-05-09 15:46:56','是',''); -- 向 yuyuekecheng 表插入多条记录 +/*!40000 ALTER TABLE `yuyuekecheng` ENABLE KEYS */; -- 重新启用 yuyuekecheng 表的索引 +UNLOCK TABLES; -- 解锁 yuyuekecheng 表 -- DROP TABLE IF EXISTS `zhiyeguihua`; diff --git a/mvnw b/mvnw index 21d3ee8..3374c5e 100644 --- a/mvnw +++ b/mvnw @@ -1,4 +1,6 @@ #!/bin/sh +# 声明这是一个 shell 脚本,指定使用 /bin/sh 作为解释器 + # ---------------------------------------------------------------------------- # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -17,6 +19,7 @@ # specific language governing permissions and limitations # under the License. # ---------------------------------------------------------------------------- +# 以上是关于该脚本遵循的 Apache 许可证相关信息,说明版权归属、使用条件等 # ---------------------------------------------------------------------------- # Maven2 Start Up Batch script @@ -33,278 +36,1122 @@ # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 # MAVEN_SKIP_RC - flag to disable loading of mavenrc files # ---------------------------------------------------------------------------- +# 以上是关于该脚本的描述,说明这是 Maven2 的启动脚本,以及所需和可选的环境变量 if [ -z "$MAVEN_SKIP_RC" ] ; then - + # 如果 MAVEN_SKIP_RC 环境变量为空(即未设置) if [ -f /etc/mavenrc ] ; then + # 如果 /etc/mavenrc 文件存在 . /etc/mavenrc + # 执行 /etc/mavenrc 文件中的命令(通常用于设置环境变量等) fi if [ -f "$HOME/.mavenrc" ] ; then + # 如果用户主目录下的 .mavenrc 文件存在 . "$HOME/.mavenrc" + # 执行该文件中的命令 fi - fi # OS specific support. $var _must_ be set to either true or false. cygwin=false; +# 定义变量 cygwin 并初始化为 false,表示是否是 Cygwin 系统 darwin=false; +# 定义变量 darwin 并初始化为 false,表示是否是 Darwin(Mac OS)系统 mingw=false +# 定义变量 mingw 并初始化为 false,表示是否是 MinGW 系统 case "`uname`" in + # 根据系统的 uname 命令输出进行匹配 CYGWIN*) cygwin=true ;; + # 如果 uname 输出以 CYGWIN 开头,设置 cygwin 为 true MINGW*) mingw=true;; + # 如果 uname 输出以 MINGW 开头,设置 mingw 为 true Darwin*) darwin=true + # 如果是 Darwin 系统,设置 darwin 为 true # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home # See https://developer.apple.com/library/mac/qa/qa1170/_index.html if [ -z "$JAVA_HOME" ]; then + # 如果 JAVA_HOME 环境变量未设置 if [ -x "/usr/libexec/java_home" ]; then + # 如果 /usr/libexec/java_home 可执行 export JAVA_HOME="`/usr/libexec/java_home`" + # 使用 /usr/libexec/java_home 命令获取 JDK 路径并设置 JAVA_HOME 环境变量 else export JAVA_HOME="/Library/Java/Home" + # 否则,设置 JAVA_HOME 为默认的 Mac OS 上 Java 安装路径 fi fi ;; esac if [ -z "$JAVA_HOME" ] ; then + # 如果 JAVA_HOME 环境变量未设置 if [ -r /etc/gentoo-release ] ; then + # 如果 /etc/gentoo-release 文件可读(通常在 Gentoo 系统上) JAVA_HOME=`java-config --jre-home` + # 使用 java-config --jre-home 命令获取 JDK 路径并设置 JAVA_HOME fi fi if [ -z "$M2_HOME" ] ; then + # 如果 M2_HOME 环境变量未设置 ## resolve links - $0 may be a link to maven's home PRG="$0" + # 将当前脚本的路径赋值给 PRG 变量 # need this for relative symlinks while [ -h "$PRG" ] ; do + # 当 PRG 是一个符号链接时 ls=`ls -ld "$PRG"` + # 使用 ls -ld 命令获取符号链接的详细信息并赋值给 ls 变量 link=`expr "$ls" : '.*-> \(.*\)$'` + # 使用 expr 命令从 ls 变量中提取符号链接指向的目标路径并赋值给 link 变量 if expr "$link" : '/.*' > /dev/null; then + # 如果 link 是一个绝对路径 PRG="$link" + # 将 PRG 设置为链接的目标路径 else PRG="`dirname "$PRG"`/$link" + # 否则,根据当前 PRG 的目录和链接目标计算出完整路径并赋值给 PRG fi done saveddir=`pwd` + # 保存当前工作目录到 saveddir 变量 M2_HOME=`dirname "$PRG"`/.. + # 根据 PRG 计算出 Maven 安装目录的路径并赋值给 M2_HOME # make it fully qualified M2_HOME=`cd "$M2_HOME" && pwd` + # 进入 M2_HOME 目录并获取其绝对路径,更新 M2_HOME cd "$saveddir" + # 切换回之前保存的工作目录 + # echo Using m2 at $M2_HOME + # (注释掉的行,原本可能用于输出使用的 M2_HOME 路径) fi # For Cygwin, ensure paths are in UNIX format before anything is touched if $cygwin ; then + # 如果是 Cygwin 系统 [ -n "$M2_HOME" ] && M2_HOME=`cygpath --unix "$M2_HOME"` + # 如果 M2_HOME 不为空,将其转换为 UNIX 格式路径 [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + # 如果 JAVA_HOME 不为空,将其转换为 UNIX 格式路径 [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"` + # 如果 CLASSPATH 不为空,将其转换为 UNIX 格式路径 fi # For Mingw, ensure paths are in UNIX format before anything is touched if $mingw ; then + # 如果是 MinGW 系统 [ -n "$M2_HOME" ] && M2_HOME="`(cd "$M2_HOME"; pwd)`" + # 如果 M2_HOME 不为空,进入该目录并获取其绝对路径(转换为 UNIX 格式) [ -n "$JAVA_HOME" ] && JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # 如果 JAVA_HOME 不为空,进入该目录并获取其绝对路径(转换为 UNIX 格式) fi if [ -z "$JAVA_HOME" ]; then + # 如果 JAVA_HOME 环境变量未设置 javaExecutable="`which javac`" + # 使用 which 命令查找 javac 可执行文件的路径并赋值给 javaExecutable 变量 if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # 如果找到了 javac 可执行文件且不是 "no"(即有效路径) # readlink(1) is not available as standard on Solaris 10. readLink=`which readlink` + # 使用 which 命令查找 readlink 命令的路径并赋值给 readLink 变量 if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + # 如果找到了 readlink 命令且不是 "no"(即有效路径) if $darwin ; then + # 如果是 Darwin 系统 javaHome="`dirname \"$javaExecutable\"`" + # 获取 javac 可执行文件所在目录并赋值给 javaHome 变量 javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + # 进入 javaHome 目录并获取其绝对路径,再加上 javac 文件名,更新 javaExecutable else javaExecutable="`readlink -f \"$javaExecutable\"`" + # 否则(非 Darwin 系统),使用 readlink -f 命令获取 javac 可执行文件的绝对路径并更新 javaExecutable fi javaHome="`dirname \"$javaExecutable\"`" + # 获取更新后的 javaExecutable 所在目录并赋值给 javaHome 变量 javaHome=`expr "$javaHome" : '\(.*\)/bin'` + # 从 javaHome 变量中提取 bin 目录的上一级目录路径并赋值给 javaHome 变量 JAVA_HOME="$javaHome" + # 将计算出的 JDK 路径设置为 JAVA_HOME 环境变量 export JAVA_HOME + # 导出 JAVA_HOME 环境变量 fi fi fi if [ -z "$JAVACMD" ] ; then + # 如果 JAVACMD 变量未设置 if [ -n "$JAVA_HOME" ] ; then + # 如果 JAVA_HOME 环境变量不为空 if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables + # 如果 JAVA_HOME/jre/sh/java 可执行(IBM 的 JDK 在 AIX 上的特殊路径) JAVACMD="$JAVA_HOME/jre/sh/java" + # 设置 JAVACMD 为该路径 else JAVACMD="$JAVA_HOME/bin/java" + # 否则,设置 JAVACMD 为标准的 JAVA_HOME/bin/java 路径 fi else JAVACMD="`which java`" + # 如果 JAVA_HOME 未设置,使用 which 命令查找 java 可执行文件的路径并设置为 JAVACMD fi fi if [ ! -x "$JAVACMD" ] ; then + # 如果 JAVACMD 不是可执行文件 echo "Error: JAVA_HOME is not defined correctly." >&2 + # 向标准错误输出流输出错误信息,提示 JAVA_HOME 定义不正确 echo " We cannot execute $JAVACMD" >&2 + # 向标准错误输出流输出无法执行 JAVACMD 的信息 exit 1 + # 以错误状态码 1 退出脚本 fi if [ -z "$JAVA_HOME" ] ; then + # 如果 JAVA_HOME 环境变量未设置 echo "Warning: JAVA_HOME environment variable is not set." + # 输出警告信息,提示 JAVA_HOME 环境变量未设置 fi CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher +# 设置 CLASSWORLDS_LAUNCHER 变量为指定的类名,用于启动类加载器 # traverses directory structure from process work directory to filesystem root # first directory with .mvn subdirectory is considered project base directory find_maven_basedir() { + # 定义函数 find_maven_basedir,用于查找 Maven 项目的基础目录 if [ -z "$1" ] then + # 如果函数的第一个参数为空 echo "Path not specified to find_maven_basedir" + # 输出错误信息,提示未指定路径 return 1 + # 以错误状态码 1 返回 fi basedir="$1" + # 将函数的第一个参数赋值给 basedir 变量 wdir="$1" + # 将函数的第一个参数赋值给 wdir 变量 while [ "$wdir" != '/' ] ; do + # 当 wdir 不是根目录时 if [ -d "$wdir"/.mvn ] ; then + # 如果 wdir 目录下存在 .mvn 子目录 basedir=$wdir + # 将 basedir 设置为 wdir break + # 跳出循环 fi # workaround for JBEAP-8937 (on Solaris 10/Sparc) if [ -d "${wdir}" ]; then wdir=`cd "$wdir/.."; pwd` + # 如果 wdir 是一个目录,进入上一级目录并获取其路径,更新 wdir fi # end of workaround done echo "${basedir}" + # 输出找到的 Maven 项目基础目录路径 } # concatenates all lines of a file concat_lines() { + # 定义函数 concat_lines,用于连接文件的所有行 + if [ -f "$1" ]; then + # 如果函数的第一个参数是一个文件 echo "$(tr -s '\n' ' ' < "$1")" + # 使用 tr 命令将文件中的换行符替换为空格,并输出连接后的内容 fi } BASE_DIR=`find_maven_basedir "$(pwd)"` +# 调用 find_maven_basedir 函数,传入当前工作目录路径,获取 Maven 项目基础目录并赋值给 BASE_DIR 变量 if [ -z "$BASE_DIR" ]; then + # 如果 BASE_DIR 为空 exit 1; + # 以错误状态码 1 退出脚本 fi ########################################################################################## # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central # This allows using the maven wrapper in projects that prohibit checking in binary data. ########################################################################################## +# 以下是关于自动从 Maven 中央仓库下载 maven-wrapper.jar 的扩展部分说明 + if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + # 如果在 Maven 项目基础目录下的 .mvn/wrapper 目录中存在可读取的 maven-wrapper.jar 文件 + if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true + echo "Found .mvn/wrapper/maven-wrapper.jar" + # 输出找到 maven-wrapper.jar 文件的信息 + fi +else + # 如果不存在 maven-wrapper.jar 文件 + if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + # 输出未找到文件并开始下载的信息 + fi + if [ -n "$MVNW_REPOURL" ]; then + # 如果 MVNW_REPOURL 环境变量不为空 + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" + # 设置 jarUrl 为指定仓库路径下的 maven-wrapper.jar 文件路径 + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" + # 否则,设置 jarUrl 为 Maven 中央仓库的 maven-wrapper.jar 文件路径 + fi + while IFS="=" read key value; do + # 按行读取文件内容,以 = 分割为键值对 + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + # 如果键为 wrapperUrl,将值赋给 jarUrl 并跳出循环 + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + # 从 .mvn/wrapper/maven-wrapper.properties 文件中读取内容进行处理 + + if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true + echo "Downloading from: $jarUrl" + # 输出从哪个路径下载 maven-wrapper.jar 文件的信息 + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + # 设置 wrapperJarPath 为要下载到的本地路径 + + if $cygwin; then + # 如果是 Cygwin 系统 + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + # 将 wrapperJarPath 转换为 Windows 格式路径 + fi + + if command -v wget > /dev/null; then + # 如果 wget 命令存在 if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" + # 如果 MVNW_VERBOSE 环境变量为 true + echo "Found wget ... using wget" + # 输出找到 wget 命令并将使用它下载的信息 + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + # 如果 MVNW_USERNAME 或 MVNW_PASSWORD 环境变量为空 + wget "$jarUrl" -O "$wrapperJarPath" + # 使用 wget 命令从 jarUrl 下载文件并保存到 wrapperJarPath + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + # 如果有用户名和密码,使用它们进行认证后下载文件 + fi + elif command -v curl > /dev/null; then + # 如果 wget 不可用但 curl 命令存在 + if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true + echo "Found curl ... using curl" + # 输出找到 curl 命令并将使用它下载的信息 + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + # 如果 MVNW_USERNAME 或 MVNW_PASSWORD 环境变量为空 + curl -o "$wrapperJarPath" "$jarUrl" -f + # 使用 curl 命令从 jarUrl 下载文件并保存到 wrapperJarPath,-f 表示失败时不显示进度条 + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + # 如果有用户名和密码,使用它们进行认证后下载文件 + fi + else + # 如果 wget 和 curl 都不可用 + if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true + echo "Falling back to using Java to download" + # 输出将使用 Java 进行下载的信息 + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # 设置 javaClass 为 MavenWrapperDownloader.java 文件的路径 + + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + # 如果是 Cygwin 系统 + javaClass=`cygpath --path --windows "$javaClass"` + # 将 javaClass 路径转换为 Windows 格式 + fi + + if [ -e "$javaClass" ]; then + # 如果 MavenWrapperDownloader.java 文件存在 + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # 如果 MavenWrapperDownloader.class 文件不存在 + if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true + echo " - Compiling MavenWrapperDownloader.java ..." + # 输出正在编译 MavenWrapperDownloader.java 文件的信息 + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + # 使用 javac 命令编译 MavenWrapperDownloader.java 文件 + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # 如果编译后的 MavenWrapperDownloader.class 文件存在 + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true + echo " - Running MavenWrapperDownloader.java ..." + # 输出正在运行 MavenWrapperDownloader.java 程序的信息 + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + # 使用 java 命令运行编译后的程序进行下载,传入项目基础目录作为参数 + fi + fi + fi + fi + ########################################################################################## + # End of extension + ########################################################################################## + # 自动下载 maven-wrapper.jar 扩展部分结束 + + export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} + # 导出 MAVEN_PROJECTBASEDIR 环境变量,如果 MAVEN_BASEDIR 未设置,则使用 BASE_DIR 的值 + + if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true + echo $MAVEN_PROJECTBASEDIR + # 输出 MAVEN_PROJECTBASEDIR 的值 + fi + + MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + # 将 MAVEN_PROJECTBASEDIR/.mvn/jvm.config 文件中的内容连接起来,并追加到 MAVEN_OPTS 变量后面 + + # For Cygwin, switch paths to Windows format before running java + if $cygwin; then + # 如果是 Cygwin 系统 + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + # 如果 M2_HOME 不为空,将其转换为 Windows 格式路径 + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + # 如果 JAVA_HOME 不为空,将其转换为 Windows 格式路径 + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + # 如果 CLASSPATH 不为空,将其转换为 Windows 格式路径 + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` + # 如果 MAVEN_PROJECTBASEDIR 不为空,将其转换为 Windows 格式路径 + fi + + # Provide a "standardized" way to retrieve the CLI args that will + # work with both Windows and non-Windows executions. + MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" + # 将 MAVEN_CONFIG 变量的值和脚本的所有参数连接起来,赋值给 MAVEN_CMD_LINE_ARGS 变量 + export MAVEN_CMD_LINE_ARGS + # 导出 MAVEN_CMD_LINE_ARGS 环境变量 + + WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + # 设置 WRAPPER_LAUNCHER 变量为 Maven 包装器的主类名 + + exec "$JAVACMD" \ + # 执行 Java 命令 + $MAVEN_OPTS \ + # 传递 MAVEN_OPTS 变量中的参数给 Java 虚拟机 + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + # 设置 Java 类路径为 maven-wrapper.jar 文件所在路径 + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + # 设置系统属性 maven.home 和 maven.multiModuleProjectDirectory + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" + # 执行 WRAPPER_LAUNCHER 类,并传递 MAVEN_CONFIG 和脚本的所有参数 + #!/bin/sh + # 声明这是一个 shell 脚本,指定使用 /bin/sh 作为解释器 + + # ---------------------------------------------------------------------------- + # 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 + # + # https://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. + # ---------------------------------------------------------------------------- + # 以上是关于该脚本遵循的 Apache 许可证相关信息,说明版权归属、使用条件等 + + # ---------------------------------------------------------------------------- + # Maven2 Start Up Batch script + # + # Required ENV vars: + # ------------------ + # JAVA_HOME - location of a JDK home dir + # + # Optional ENV vars + # ----------------- + # M2_HOME - location of maven2's installed home dir + # MAVEN_OPTS - parameters passed to the Java VM when running Maven + # e.g. to debug Maven itself, use + # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 + # MAVEN_SKIP_RC - flag to disable loading of mavenrc files + # ---------------------------------------------------------------------------- + # 以上是关于该脚本的描述,说明这是 Maven2 的启动脚本,以及所需和可选的环境变量 + + if [ -z "$MAVEN_SKIP_RC" ] ; then + # 如果 MAVEN_SKIP_RC 环境变量为空(即未设置) + if [ -f /etc/mavenrc ] ; then + # 如果 /etc/mavenrc 文件存在 + . /etc/mavenrc + # 执行 /etc/mavenrc 文件中的命令(通常用于设置环境变量等,以配置 Maven 相关运行参数) + fi + + if [ -f "$HOME/.mavenrc" ] ; then + # 如果用户主目录下的 .mavenrc 文件存在 + . "$HOME/.mavenrc" + # 执行该文件中的命令,进一步配置 Maven 运行相关的环境或参数 + fi + fi + + # OS specific support. $var _must_ be set to either true or false. + cygwin=false; + # 定义变量 cygwin 并初始化为 false,表示当前系统是否是 Cygwin 系统(Cygwin 是一个在 Windows 上模拟 Unix 环境的软件) + darwin=false; + # 定义变量 darwin 并初始化为 false,表示当前系统是否是 Darwin(Mac OS)系统 + mingw=false + # 定义变量 mingw 并初始化为 false,表示当前系统是否是 MinGW 系统(MinGW 是在 Windows 上提供一套开源的开发工具集) + case "`uname`" in + # 根据系统的 uname 命令输出(获取系统名称)进行匹配 + CYGWIN*) cygwin=true ;; + # 如果 uname 输出以 CYGWIN 开头,设置 cygwin 为 true,表明当前系统是 Cygwin 环境 + MINGW*) mingw=true;; + # 如果 uname 输出以 MINGW 开头,设置 mingw 为 true,表明当前系统是 MinGW 环境 + Darwin*) darwin=true + # 如果是 Darwin 系统,设置 darwin 为 true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + # 如果 JAVA_HOME 环境变量未设置 + if [ -x "/usr/libexec/java_home" ]; then + # 如果 /usr/libexec/java_home 可执行(该命令可用于获取系统上可用的 JDK 路径) + export JAVA_HOME="`/usr/libexec/java_home`" + # 使用 /usr/libexec/java_home 命令获取 JDK 路径并设置 JAVA_HOME 环境变量 + else + export JAVA_HOME="/Library/Java/Home" + # 否则,设置 JAVA_HOME 为默认的 Mac OS 上 Java 安装路径(常见的默认路径) + fi + fi + ;; + esac + + if [ -z "$JAVA_HOME" ] ; then + # 如果 JAVA_HOME 环境变量未设置 + if [ -r /etc/gentoo-release ] ; then + # 如果 /etc/gentoo-release 文件可读(在 Gentoo Linux 系统中,该文件标识系统版本等信息) + JAVA_HOME=`java-config --jre-home` + # 使用 java-config --jre-home 命令获取 JDK 路径并设置 JAVA_HOME(适用于 Gentoo 系统获取 JDK 路径的方式) + fi + fi + + if [ -z "$M2_HOME" ] ; then + # 如果 M2_HOME 环境变量未设置 + ## resolve links - $0 may be a link to maven's home + PRG="$0" + # 将当前脚本的路径赋值给 PRG 变量,$0 在 shell 中表示脚本本身的名称或路径 + # need this for relative symlinks + while [ -h "$PRG" ] ; do + # 当 PRG 是一个符号链接时(-h 用于判断是否为符号链接) + ls=`ls -ld "$PRG"` + # 使用 ls -ld 命令获取符号链接的详细信息并赋值给 ls 变量,包括链接指向的目标等信息 + link=`expr "$ls" : '.*-> \(.*\)$'` + # 使用 expr 命令从 ls 变量中提取符号链接指向的目标路径并赋值给 link 变量,通过正则表达式匹配提取链接目标 + if expr "$link" : '/.*' > /dev/null; then + # 如果 link 是一个绝对路径(通过判断路径是否以 / 开头来确定是否为绝对路径) + PRG="$link" + # 将 PRG 设置为链接的目标路径,更新 PRG 为实际的路径 + else + PRG="`dirname "$PRG"`/$link" + # 否则,根据当前 PRG 的目录和链接目标计算出完整路径并赋值给 PRG,拼接得到实际路径 + fi + done + + saveddir=`pwd` + # 保存当前工作目录到 saveddir 变量,pwd 命令用于获取当前工作目录路径 + M2_HOME=`dirname "$PRG"`/.. + # 根据 PRG 计算出 Maven 安装目录的路径并赋值给 M2_HOME,取 PRG 的目录的上一级目录作为 Maven 安装目录 + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + # 进入 M2_HOME 目录并获取其绝对路径,cd 命令进入目录,pwd 命令获取当前目录路径,更新 M2_HOME 为绝对路径 + cd "$saveddir" + # 切换回之前保存的工作目录,恢复之前的工作目录状态 + # echo Using m2 at $M2_HOME + # (注释掉的行,原本可能用于输出使用的 M2_HOME 路径,调试或信息展示用途) + fi + + # For Cygwin, ensure paths are in UNIX format before anything is touched + if $cygwin ; then + # 如果是 Cygwin 系统 + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + # 如果 M2_HOME 不为空(-n 判断变量是否为空字符串),将其转换为 UNIX 格式路径,cygpath 用于转换 Cygwin 路径格式 + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + # 如果 JAVA_HOME 不为空,将其转换为 UNIX 格式路径 + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` + # 如果 CLASSPATH 不为空,将其转换为 UNIX 格式路径,确保路径格式符合 Cygwin 下的 UNIX 环境要求 + fi + + # For Mingw, ensure paths are in UNIX format before anything is touched + if $mingw ; then + # 如果是 MinGW 系统 + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + # 如果 M2_HOME 不为空,进入该目录并获取其绝对路径(转换为 UNIX 格式),通过 cd 和 pwd 命令组合实现 + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # 如果 JAVA_HOME 不为空,进入该目录并获取其绝对路径(转换为 UNIX 格式) + fi + + if [ -z "$JAVA_HOME" ]; then + # 如果 JAVA_HOME 环境变量未设置 + javaExecutable="`which javac`" + # 使用 which 命令查找 javac 可执行文件的路径并赋值给 javaExecutable 变量,which 用于在系统路径中查找命令的可执行文件位置 + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # 如果找到了 javac 可执行文件且不是 "no"(即有效路径,排除 which 未找到时输出的错误标识) + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + # 使用 which 命令查找 readlink 命令的路径并赋值给 readLink 变量,readlink 用于获取符号链接指向的实际路径 + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + # 如果找到了 readlink 命令且不是 "no"(即有效路径) + if $darwin ; then + # 如果是 Darwin 系统 + javaHome="`dirname \"$javaExecutable\"`" + # 获取 javac 可执行文件所在目录并赋值给 javaHome 变量,dirname 用于获取路径的目录部分 + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + # 进入 javaHome 目录并获取其绝对路径(-P 选项用于获取物理路径,不包含符号链接),再加上 javac 文件名,更新 javaExecutable 为绝对路径的 javac 可执行文件 + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + # 否则(非 Darwin 系统),使用 readlink -f 命令获取 javac 可执行文件的绝对路径并更新 javaExecutable,-f 选项用于获取符号链接的最终目标路径 + fi + javaHome="`dirname \"$javaExecutable\"`" + # 获取更新后的 javaExecutable 所在目录并赋值给 javaHome 变量 + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + # 从 javaHome 变量中提取 bin 目录的上一级目录路径并赋值给 javaHome 变量,通过正则表达式匹配提取路径部分 + JAVA_HOME="$javaHome" + # 将计算出的 JDK 路径设置为 JAVA_HOME 环境变量 + export JAVA_HOME + # 导出 JAVA_HOME 环境变量,使其在后续的子进程中也能使用 + fi + fi + fi + + if [ -z "$JAVACMD" ] ; then + # 如果 JAVACMD 变量未设置 + if [ -n "$JAVA_HOME" ] ; then + # 如果 JAVA_HOME 环境变量不为空 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # 如果 JAVA_HOME/jre/sh/java 可执行(IBM 的 JDK 在 AIX 上的特殊路径下的 java 可执行文件) + JAVACMD="$JAVA_HOME/jre/sh/java" + # 设置 JAVACMD 为该路径,指定用于运行 Java 程序的命令路径 + else + JAVACMD="$JAVA_HOME/bin/java" + # 否则,设置 JAVACMD 为标准的 JAVA_HOME/bin/java 路径,这是常见的 Java 可执行文件路径 + fi + else + JAVACMD="`which java`" + # 如果 JAVA_HOME 未设置,使用 which 命令查找 java 可执行文件的路径并设置为 JAVACMD,在系统路径中查找默认的 java 可执行文件 + fi + fi + + if [ ! -x "$JAVACMD" ] ; then + # 如果 JAVACMD 不是可执行文件(-x 判断文件是否可执行) + echo "Error: JAVA_HOME is not defined correctly." >&2 + # 向标准错误输出流输出错误信息,提示 JAVA_HOME 定义不正确,>&2 表示输出到标准错误流 + echo " We cannot execute $JAVACMD" >&2 + # 向标准错误输出流输出无法执行 JAVACMD 的信息 + exit 1 + # 以错误状态码 1 退出脚本,表示脚本执行出现错误 + fi + + if [ -z "$JAVA_HOME" ] ; then + # 如果 JAVA_HOME 环境变量未设置 + echo "Warning: JAVA_HOME environment variable is not set." + # 输出警告信息,提示 JAVA_HOME 环境变量未设置,可能会影响程序的正确运行 + fi + + CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + # 设置 CLASSWORLDS_LAUNCHER 变量为指定的类名,用于指定使用 org.codehaus.plexus.classworlds.launcher.Launcher 类来启动类加载器,这是 Maven 中用于管理类加载的一种机制 + + # traverses directory structure from process work directory to filesystem root + # first directory with .mvn subdirectory is considered project base directory + find_maven_basedir() { + # 定义函数 find_maven_basedir,用于查找 Maven 项目的基础目录 + # 函数从当前进程的工作目录开始,向上遍历目录结构直到文件系统根目录,找到第一个包含.mvn 子目录的目录作为项目基础目录 + + if [ -z "$1" ] + then + # 如果函数的第一个参数为空($1 表示函数的第一个参数) + echo "Path not specified to find_maven_basedir" + # 输出错误信息,提示未指定路径给 find_maven_basedir 函数 + return 1 + # 以错误状态码 1 返回,表示函数执行失败 + fi + + basedir="$1" + # 将函数的第一个参数赋值给 basedir 变量,作为起始查找的目录 + wdir="$1" + # 将函数的第一个参数赋值给 wdir 变量,用于在循环中逐步向上遍历目录 + while [ "$wdir" != '/' ] ; do + # 当 wdir 不是根目录时(循环条件,直到遍历到根目录为止) + if [ -d "$wdir"/.mvn ] ; then + # 如果 wdir 目录下存在 .mvn 子目录(-d 判断是否为目录) + basedir=$wdir + # 将 basedir 设置为 wdir,即找到了包含.mvn 子目录的目录,作为项目基础目录 + break + # 跳出循环,不再继续向上遍历 + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + # 如果 wdir 是一个目录,进入上一级目录并获取其路径,更新 wdir 为上一级目录路径,这是一个针对 Solaris 10/Sparc 系统的特定处理(解决某些问题的变通方法) + fi + # end of workaround + done + echo "${basedir}" + # 输出找到的 Maven 项目基础目录路径 + } + + # concatenates all lines of a file + concat_lines() { + # 定义函数 concat_lines,用于将文件的所有行连接成一行字符串 + + if [ -f "$1" ]; then + # 如果函数的第一个参数是一个文件(-f 判断是否为文件) + echo "$(tr -s '\n' ' ' < "$1")" + # 使用 tr 命令将文件中的换行符 '\n' 替换为空格 ' ',-s 选项用于压缩连续的多个换行符为一个空格,< "$1" 表示从文件中读取内容,然后输出连接后的内容 + fi + } + + BASE_DIR=`find_maven_basedir "$(pwd)"` + # 调用 find_maven_basedir 函数,传入当前工作目录路径(通过 pwd 命令获取),获取 Maven 项目基础目录并赋值给 BASE_DIR 变量 + if [ -z "$BASE_DIR" ]; then + # 如果 BASE_DIR 为空(即未找到合适的项目基础目录) + exit 1; + # 以错误状态码 1 退出脚本,表示脚本执行失败,因为无法确定 Maven 项目基础目录 + fi + + ########################################################################################## + # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central + # This allows using the maven + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +# 定义变量 cygwin 并初始化为 false,表示是否是 Cygwin 系统 +darwin=false; +# 定义变量 darwin 并初始化为 false,表示是否是 Darwin(Mac OS)系统 +mingw=false +# 定义变量 mingw 并初始化为 false,表示是否是 MinGW 系统 +case "`uname`" in + # 根据系统的 uname 命令输出进行匹配 + CYGWIN*) cygwin=true ;; + # 如果 uname 输出以 CYGWIN 开头,设置 cygwin 为 true + MINGW*) mingw=true;; + # 如果 uname 输出以 MINGW 开头,设置 mingw 为 true + Darwin*) darwin=true + # 如果是 Darwin 系统,设置 darwin 为 true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + # 如果 JAVA_HOME 环境变量未设置 + if [ -x "/usr/libexec/java_home" ]; then + # 如果 /usr/libexec/java_home 可执行 + export JAVA_HOME="`/usr/libexec/java_home`" + # 使用 /usr/libexec/java_home 命令获取 JDK 路径并设置 JAVA_HOME 环境变量 + else + export JAVA_HOME="/Library/Java/Home" + # 否则,设置 JAVA_HOME 为默认的 Mac OS 上 Java 安装路径 + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + # 如果 JAVA_HOME 环境变量未设置 + if [ -r /etc/gentoo-release ] ; then + # 如果 /etc/gentoo-release 文件可读(通常在 Gentoo 系统上) + JAVA_HOME=`java-config --jre-home` + # 使用 java-config --jre-home 命令获取 JDK 路径并设置 JAVA_HOME + fi +fi + +if [ -z "$M2_HOME" ] ; then + # 如果 M2_HOME 环境变量未设置 + ## resolve links - $0 may be a link to maven's home + PRG="$0" + # 将当前脚本的路径赋值给 PRG 变量 + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + # 当 PRG 是一个符号链接时 + ls=`ls -ld "$PRG"` + # 使用 ls -ld 命令获取符号链接的详细信息并赋值给 ls 变量 + link=`expr "$ls" : '.*-> \(.*\)$'` + # 使用 expr 命令从 ls 变量中提取符号链接指向的目标路径并赋值给 link 变量 + if expr "$link" : '/.*' > /dev/null; then + # 如果 link 是一个绝对路径 + PRG="$link" + # 将 PRG 设置为链接的目标路径 + else + PRG="`dirname "$PRG"`/$link" + # 否则,根据当前 PRG 的目录和链接目标计算出完整路径并赋值给 PRG + fi + done + + saveddir=`pwd` + # 保存当前工作目录到 saveddir 变量 + + M2_HOME=`dirname "$PRG"`/.. + # 根据 PRG 计算出 Maven 安装目录的路径并赋值给 M2_HOME + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + # 进入 M2_HOME 目录并获取其绝对路径,更新 M2_HOME + + cd "$saveddir" + # 切换回之前保存的工作目录 + + # echo Using m2 at $M2_HOME + # (注释掉的行,原本可能用于输出使用的 M2_HOME 路径) +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + # 如果是 Cygwin 系统 + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + # 如果 M2_HOME 不为空,将其转换为 UNIX 格式路径 + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + # 如果 JAVA_HOME 不为空,将其转换为 UNIX 格式路径 + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` + # 如果 CLASSPATH 不为空,将其转换为 UNIX 格式路径 +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + # 如果是 MinGW 系统 + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + # 如果 M2_HOME 不为空,进入该目录并获取其绝对路径(转换为 UNIX 格式) + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # 如果 JAVA_HOME 不为空,进入该目录并获取其绝对路径(转换为 UNIX 格式) +fi + +if [ -z "$JAVA_HOME" ]; then + # 如果 JAVA_HOME 环境变量未设置 + javaExecutable="`which javac`" + # 使用 which 命令查找 javac 可执行文件的路径并赋值给 javaExecutable 变量 + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # 如果找到了 javac 可执行文件且不是 "no"(即有效路径) + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + # 使用 which 命令查找 readlink 命令的路径并赋值给 readLink 变量 + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + # 如果找到了 readlink 命令且不是 "no"(即有效路径) + if $darwin ; then + # 如果是 Darwin 系统 + javaHome="`dirname \"$javaExecutable\"`" + # 获取 javac 可执行文件所在目录并赋值给 javaHome 变量 + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + # 进入 javaHome 目录并获取其绝对路径,再加上 javac 文件名,更新 javaExecutable + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + # 否则(非 Darwin 系统),使用 readlink -f 命令获取 javac 可执行文件的绝对路径并更新 javaExecutable + fi + javaHome="`dirname \"$javaExecutable\"`" + # 获取更新后的 javaExecutable 所在目录并赋值给 javaHome 变量 + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + # 从 javaHome 变量中提取 bin 目录的上一级目录路径并赋值给 javaHome 变量 + JAVA_HOME="$javaHome" + # 将计算出的 JDK 路径设置为 JAVA_HOME 环境变量 + export JAVA_HOME + # 导出 JAVA_HOME 环境变量 fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + # 如果 JAVACMD 变量未设置 + if [ -n "$JAVA_HOME" ] ; then + # 如果 JAVA_HOME 环境变量不为空 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # 如果 JAVA_HOME/jre/sh/java 可执行(IBM 的 JDK 在 AIX 上的特殊路径) + JAVACMD="$JAVA_HOME/jre/sh/java" + # 设置 JAVACMD 为该路径 + else + JAVACMD="$JAVA_HOME/bin/java" + # 否则,设置 JAVACMD 为标准的 JAVA_HOME/bin/java 路径 + fi + else + JAVACMD="`which java`" + # 如果 JAVA_HOME 未设置,使用 which 命令查找 java 可执行文件的路径并设置为 JAVACMD + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + # 如果 JAVACMD 不是可执行文件 + echo "Error: JAVA_HOME is not defined correctly." >&2 + # 向标准错误输出流输出错误信息,提示 JAVA_HOME 定义不正确 + echo " We cannot execute $JAVACMD" >&2 + # 向标准错误输出流输出无法执行 JAVACMD 的信息 + exit 1 + # 以错误状态码 1 退出脚本 +fi + +if [ -z "$JAVA_HOME" ] ; then + # 如果 JAVA_HOME 环境变量未设置 + echo "Warning: JAVA_HOME environment variable is not set." + # 输出警告信息,提示 JAVA_HOME 环境变量未设置 +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher +# 设置 CLASSWORLDS_LAUNCHER 变量为指定的类名,用于启动类加载器 + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + # 定义函数 find_maven_basedir,用于查找 Maven 项目的基础目录 + + if [ -z "$1" ] + then + # 如果函数的第一个参数为空 + echo "Path not specified to find_maven_basedir" + # 输出错误信息,提示未指定路径 + return 1 + # 以错误状态码 1 返回 + fi + + basedir="$1" + # 将函数的第一个参数赋值给 basedir 变量 + wdir="$1" + # 将函数的第一个参数赋值给 wdir 变量 + while [ "$wdir" != '/' ] ; do + # 当 wdir 不是根目录时 + if [ -d "$wdir"/.mvn ] ; then + # 如果 wdir 目录下存在 .mvn 子目录 + basedir=$wdir + # 将 basedir 设置为 wdir + break + # 跳出循环 + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + # 如果 wdir 是一个目录,进入上一级目录并获取其路径,更新 wdir + fi + # end of workaround + done + echo "${basedir}" + # 输出找到的 Maven 项目基础目录路径 +} + +# concatenates all lines of a file +concat_lines() { + # 定义函数 concat_lines,用于连接文件的所有行 + + if [ -f "$1" ]; then + # 如果函数的第一个参数是一个文件 + echo "$(tr -s '\n' ' ' < "$1")" + # 使用 tr 命令将文件中的换行符替换为空格,并输出连接后的内容 + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +# 调用 find_maven_basedir 函数,传入当前工作目录路径,获取 Maven 项目基础目录并赋值给 BASE_DIR 变量 +if [ -z "$BASE_DIR" ]; then + # 如果 BASE_DIR 为空 + exit 1; + # 以错误状态码 1 退出脚本 +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +# 以下是关于自动从 Maven 中央仓库下载 maven-wrapper.jar 的扩展部分说明 + +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + # 如果在 Maven 项目基础目录下的 .mvn/wrapper 目录中存在可读取的 maven-wrapper.jar 文件 + if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true + echo "Found .mvn/wrapper/maven-wrapper.jar" + # 输出找到 maven-wrapper.jar 文件的信息 + fi else + # 如果不存在 maven-wrapper.jar 文件 + if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + # 输出未找到文件并开始下载的信息 + fi + if [ -n "$MVNW_REPOURL" ]; then + # 如果 MVNW_REPOURL 环境变量不为空 + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" + # 设置 jarUrl 为指定仓库路径下的 maven-wrapper.jar 文件路径 + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" + # 否则,设置 jarUrl 为 Maven 中央仓库的 maven-wrapper.jar 文件路径 + fi + while IFS="=" read key value; do + # 按行读取文件内容,以 = 分割为键值对 + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + # 如果键为 wrapperUrl,将值赋给 jarUrl 并跳出循环 + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + # 从 .mvn/wrapper/maven-wrapper.properties 文件中读取内容进行处理 + + if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true + echo "Downloading from: $jarUrl" + # 输出从哪个路径下载 maven-wrapper.jar 文件的信息 + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + # 设置 wrapperJarPath 为要下载到的本地路径 + + if $cygwin; then + # 如果是 Cygwin 系统 + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + # 将 wrapperJarPath 转换为 Windows 格式路径 + fi + + if command -v wget > /dev/null; then + # 如果 wget 命令存在 if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + # 如果 MVNW_VERBOSE 环境变量为 true + echo "Found wget ... using wget" + # 输出找到 wget 命令并将使用它下载的信息 fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + # 如果 MVNW_USERNAME 或 MVNW_PASSWORD 环境变量为空 + wget "$jarUrl" -O "$wrapperJarPath" + # 使用 wget 命令从 jarUrl 下载文件并保存到 wrapperJarPath else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + # 如果有用户名和密码,使用它们进行认证后下载文件 fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + elif command -v curl > /dev/null; then + # 如果 wget 不可用但 curl 命令存在 if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" + # 如果 MVNW_VERBOSE 环境变量为 true + echo "Found curl ... using curl" + # 输出找到 curl 命令并将使用它下载的信息 fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + # 如果 MVNW_USERNAME 或 MVNW_PASSWORD 环境变量为空 + curl -o "$wrapperJarPath" "$jarUrl" -f + # 使用 curl 命令从 jarUrl 下载文件并保存到 wrapperJarPath,-f 表示失败时不显示进度条 + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + # 如果有用户名和密码,使用它们进行认证后下载文件 + fi + else + # 如果 wget 和 curl 都不可用 + if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true + echo "Falling back to using Java to download" + # 输出将使用 Java 进行下载的信息 + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # 设置 javaClass 为 MavenWrapperDownloader.java 文件的路径 + + # For Cygwin, switch paths to Windows format before running javac if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + # 如果是 Cygwin 系统 + javaClass=`cygpath --path --windows "$javaClass"` + # 将 javaClass 路径转换为 Windows 格式 fi - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then + if [ -e "$javaClass" ]; then + # 如果 MavenWrapperDownloader.java 文件存在 + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # 如果 MavenWrapperDownloader.class 文件不存在 if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + # 如果 MVNW_VERBOSE 环境变量为 true + echo " - Compiling MavenWrapperDownloader.java ..." + # 输出正在编译 MavenWrapperDownloader.java 文件的信息 fi - - else + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + # 使用 javac 命令编译 MavenWrapperDownloader.java 文件 + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # 如果编译后的 MavenWrapperDownloader.class 文件存在 + # Running the downloader if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi + # 如果 MVNW_VERBOSE 环境变量为 true + echo " - Running MavenWrapperDownloader.java ..." + # 输出正在运行 MavenWrapperDownloader.java 程序的信息 fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + # 使用 java 命令运行编译后的程序进行下载,传入项目基础目录作为参数 + fi fi + fi fi ########################################################################################## # End of extension ########################################################################################## +# 自动下载 maven-wrapper.jar 扩展部分结束 export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +# 导出 MAVEN_PROJECTBASEDIR 环境变量,如果 MAVEN_BASEDIR 未设置,则使用 BASE_DIR 的值 if [ "$MVNW_VERBOSE" = true ]; then + # 如果 MVNW_VERBOSE 环境变量为 true echo $MAVEN_PROJECTBASEDIR + # 输出 MAVEN_PROJECTBASEDIR 的值 fi + MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" +# 调用 concat_lines 函数将 .mvn/jvm.config 文件内容拼接成一行,再与原有的 MAVEN_OPTS 拼接,作为新的 JVM 启动参数 # For Cygwin, switch paths to Windows format before running java if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` + # 若为 Cygwin 系统 + [ -n "$M2_HOME" ] && M2_HOME=`cygpath --path --windows "$M2_HOME"` + # 若 M2_HOME 不为空,将其转换为 Windows 路径格式 + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + # 若 JAVA_HOME 不为空,将其转换为 Windows 路径格式 + [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + # 若 CLASSPATH 不为空,将其转换为 Windows 路径格式 + [ -n "$MAVEN_PROJECTBASEDIR" ] && MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` + # 若 MAVEN_PROJECTBASEDIR 不为空,将其转换为 Windows 路径格式 fi # Provide a "standardized" way to retrieve the CLI args that will # work with both Windows and non-Windows executions. MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +# 将 MAVEN_CONFIG 环境变量的值和传递给脚本的所有参数拼接,存储到 MAVEN_CMD_LINE_ARGS 变量,用于统一管理命令行参数 export MAVEN_CMD_LINE_ARGS +# 导出 MAVEN_CMD_LINE_ARGS 环境变量,以便后续使用 WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +# 设置 WRAPPER_LAUNCHER 为 Maven 包装器的主类,用于启动 Maven 包装器 exec "$JAVACMD" \ + # 使用 exec 命令执行 Java 命令,替换当前 shell 进程 $MAVEN_OPTS \ + # 传递 MAVEN_OPTS 作为 Java 虚拟机的启动参数 -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + # 设置类路径为 maven-wrapper.jar 文件所在路径 "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + # 设置两个系统属性,分别指定 Maven 主目录和多模块项目目录 ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" + # 执行 Maven 包装器主类,并传递 MAVEN_CONFIG 和所有命令行参数,正式启动 Maven 构建过程 \ No newline at end of file diff --git a/mvnw.cmd b/mvnw.cmd index 84d60ab..1d2142f 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -1,133 +1,217 @@ @REM ---------------------------------------------------------------------------- +@REM 此注释块表明该文件遵循 Apache 软件基金会的许可协议 @REM Licensed to the Apache Software Foundation (ASF) under one +@REM 可能有一个或多个贡献者与 ASF 签订了许可协议 @REM or more contributor license agreements. See the NOTICE file +@REM 查看随此项目一同分发的 NOTICE 文件,获取更多版权信息 @REM distributed with this work for additional information +@REM 关于版权归属的详细信息 @REM regarding copyright ownership. The ASF licenses this file +@REM ASF 根据 Apache 许可证 2.0 版本将此文件授权给你 @REM to you under the Apache License, Version 2.0 (the @REM "License"); you may not use this file except in compliance +@REM 除非你遵守该许可协议,否则不能使用此文件 @REM with the License. You may obtain a copy of the License at -@REM +@REM 你可以在下面的链接获取许可协议副本 @REM https://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, +@REM 除非适用法律要求或书面同意 @REM software distributed under the License is distributed on an +@REM 根据许可协议分发的软件按“原样”分发 @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM 不附带任何形式的明示或暗示保证和条件 @REM KIND, either express or implied. See the License for the +@REM 查看许可协议以了解相关权限和限制的具体条款 @REM specific language governing permissions and limitations @REM under the License. @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- +@REM 此注释块介绍了这是一个 Maven2 的启动批处理脚本 @REM Maven2 Start Up Batch script @REM @REM Required ENV vars: +@REM 必需的环境变量 @REM JAVA_HOME - location of a JDK home dir +@REM JAVA_HOME 环境变量,指向 JDK 的安装目录 @REM @REM Optional ENV vars +@REM 可选的环境变量 @REM M2_HOME - location of maven2's installed home dir +@REM M2_HOME 环境变量,指向 Maven2 的安装目录 @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_ECHO 环境变量,设置为 'on' 可启用批处理命令的回显 @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_BATCH_PAUSE 环境变量,设置为 'on' 可在脚本结束前等待按键 @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM MAVEN_OPTS 环境变量,用于在运行 Maven 时传递给 Java 虚拟机的参数 @REM e.g. to debug Maven itself, use +@REM 例如,要调试 Maven 本身,可使用以下设置 @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM MAVEN_SKIP_RC 环境变量,用于禁用加载 mavenrc 文件的标志 @REM ---------------------------------------------------------------------------- @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@REM 以 '@' 开头的 REM 行,防止在 MAVEN_BATCH_ECHO 为 'on' 时回显注释 @echo off +@REM 关闭命令回显,避免在执行脚本时显示命令本身 @REM set title of command window +@REM 设置命令窗口的标题 title %0 +@REM 将命令窗口的标题设置为当前脚本的名称 @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@REM 通过将 MAVEN_BATCH_ECHO 设置为 'on' 来启用命令回显 @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% +@REM 如果 MAVEN_BATCH_ECHO 环境变量的值为 'on',则开启命令回显 @REM set %HOME% to equivalent of $HOME +@REM 将 %HOME% 环境变量设置为与 $HOME 等效的值 if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") +@REM 如果 %HOME% 环境变量未设置,则将其设置为当前用户的主目录 @REM Execute a user defined script before this one +@REM 在执行此脚本之前执行用户定义的脚本 if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM 如果 MAVEN_SKIP_RC 环境变量不为空,则跳过执行用户定义的前置脚本 @REM check for pre script, once with legacy .bat ending and once with .cmd ending +@REM 检查是否存在前置脚本,分别检查以 .bat 和 .cmd 结尾的文件 if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +@REM 如果存在 %HOME%\mavenrc_pre.bat 文件,则调用该脚本 if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +@REM 如果存在 %HOME%\mavenrc_pre.cmd 文件,则调用该脚本 :skipRcPre +@REM 跳过执行用户定义的前置脚本的标签 @setlocal +@REM 开启本地环境变量作用域,确保后续设置的变量只在当前脚本块内有效 set ERROR_CODE=0 +@REM 初始化错误代码为 0,表示脚本执行正常 @REM To isolate internal variables from possible post scripts, we use another setlocal +@REM 为了将内部变量与可能的后置脚本隔离开,我们再次使用 setlocal @setlocal @REM ==== START VALIDATION ==== +@REM 开始验证环境变量 if not "%JAVA_HOME%" == "" goto OkJHome +@REM 如果 JAVA_HOME 环境变量已设置,则跳转到 OkJHome 标签 echo. echo Error: JAVA_HOME not found in your environment. >&2 +@REM 输出错误信息,提示 JAVA_HOME 环境变量未找到 echo Please set the JAVA_HOME variable in your environment to match the >&2 +@REM 提示用户设置 JAVA_HOME 环境变量 echo location of your Java installation. >&2 +@REM 提示用户将 JAVA_HOME 设置为 Java 安装目录 echo. goto error +@REM 跳转到 error 标签,处理错误情况 :OkJHome +@REM JAVA_HOME 环境变量已设置的标签 if exist "%JAVA_HOME%\bin\java.exe" goto init +@REM 如果 JAVA_HOME\bin\java.exe 文件存在,则跳转到 init 标签 echo. echo Error: JAVA_HOME is set to an invalid directory. >&2 +@REM 输出错误信息,提示 JAVA_HOME 设置为无效目录 echo JAVA_HOME = "%JAVA_HOME%" >&2 +@REM 显示当前 JAVA_HOME 的值 echo Please set the JAVA_HOME variable in your environment to match the >&2 +@REM 提示用户设置正确的 JAVA_HOME 环境变量 echo location of your Java installation. >&2 +@REM 提示用户将 JAVA_HOME 设置为 Java 安装目录 echo. goto error +@REM 跳转到 error 标签,处理错误情况 @REM ==== END VALIDATION ==== +@REM 结束环境变量验证 :init +@REM 初始化标签 @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM 查找项目的基础目录,即包含 .mvn 文件夹的目录 @REM Fallback to current working directory if not found. +@REM 如果未找到,则使用当前工作目录作为基础目录 set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +@REM 将 MAVEN_PROJECTBASEDIR 环境变量设置为 MAVEN_BASEDIR 的值 IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir +@REM 如果 MAVEN_PROJECTBASEDIR 环境变量不为空,则跳转到 endDetectBaseDir 标签 set EXEC_DIR=%CD% +@REM 将 EXEC_DIR 环境变量设置为当前工作目录 set WDIR=%EXEC_DIR% +@REM 将 WDIR 环境变量设置为当前工作目录 :findBaseDir +@REM 查找基础目录的标签 IF EXIST "%WDIR%"\.mvn goto baseDirFound +@REM 如果当前目录下存在 .mvn 文件夹,则跳转到 baseDirFound 标签 cd .. +@REM 切换到上一级目录 IF "%WDIR%"=="%CD%" goto baseDirNotFound +@REM 如果已经到达根目录,则跳转到 baseDirNotFound 标签 set WDIR=%CD% +@REM 更新 WDIR 环境变量为当前目录 goto findBaseDir +@REM 继续查找基础目录 :baseDirFound +@REM 找到基础目录的标签 set MAVEN_PROJECTBASEDIR=%WDIR% +@REM 将 MAVEN_PROJECTBASEDIR 环境变量设置为找到的基础目录 cd "%EXEC_DIR%" +@REM 切换回原来的工作目录 goto endDetectBaseDir +@REM 跳转到 endDetectBaseDir 标签 :baseDirNotFound +@REM 未找到基础目录的标签 set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +@REM 将 MAVEN_PROJECTBASEDIR 环境变量设置为当前工作目录 cd "%EXEC_DIR%" +@REM 切换回原来的工作目录 :endDetectBaseDir +@REM 结束基础目录检测的标签 IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig +@REM 如果 %MAVEN_PROJECTBASEDIR%\.mvn\jvm.config 文件不存在,则跳转到 endReadAdditionalConfig 标签 @setlocal EnableExtensions EnableDelayedExpansion +@REM 开启扩展和延迟环境变量扩展 for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@REM 读取 %MAVEN_PROJECTBASEDIR%\.mvn\jvm.config 文件的内容,并将其添加到 JVM_CONFIG_MAVEN_PROPS 环境变量中 @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% +@REM 结束本地环境变量作用域,并将 JVM_CONFIG_MAVEN_PROPS 环境变量传递到外部 :endReadAdditionalConfig +@REM 结束读取额外配置文件的标签 SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +@REM 设置 MAVEN_JAVA_EXE 环境变量为 Java 可执行文件的路径 set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +@REM 设置 WRAPPER_JAR 环境变量为 Maven 包装器 JAR 文件的路径 set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +@REM 设置 WRAPPER_LAUNCHER 环境变量为 Maven 包装器的主类名 set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" +@REM 设置 DOWNLOAD_URL 环境变量为 Maven 包装器 JAR 文件的下载地址 FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B ) +@REM 读取 %MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties 文件,查找 wrapperUrl 属性,并更新 DOWNLOAD_URL 环境变量 @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM 扩展功能,允许自动从 Maven 中央仓库下载 maven-wrapper.jar 文件 @REM This allows using the maven wrapper in projects that prohibit checking in binary data. +@REM 这允许在禁止提交二进制数据的项目中使用 Maven 包装器 if exist %WRAPPER_JAR% ( if "%MVNW_VERBOSE%" == "true" ( echo Found %WRAPPER_JAR% @@ -153,30 +237,50 @@ if exist %WRAPPER_JAR% ( ) ) @REM End of extension +@REM 扩展功能结束 @REM Provide a "standardized" way to retrieve the CLI args that will +@REM 提供一种“标准化”的方式来获取命令行参数 @REM work with both Windows and non-Windows executions. +@REM 适用于 Windows 和非 Windows 系统的执行环境 set MAVEN_CMD_LINE_ARGS=%* +@REM 将 MAVEN_CMD_LINE_ARGS 环境变量设置为所有命令行参数 %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +@REM 执行 Java 命令,启动 Maven 包装器 if ERRORLEVEL 1 goto error +@REM 如果执行 Java 命令返回错误码,则跳转到 error 标签 goto end +@REM 跳转到 end 标签 :error +@REM 错误处理标签 set ERROR_CODE=1 +@REM 设置错误代码为 1,表示脚本执行出错 :end +@REM 结束标签 @endlocal & set ERROR_CODE=%ERROR_CODE% +@REM 结束本地环境变量作用域,并将错误代码传递到外部 if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM 如果 MAVEN_SKIP_RC 环境变量不为空,则跳过执行用户定义的后置脚本 @REM check for post script, once with legacy .bat ending and once with .cmd ending +@REM 检查是否存在后置脚本,分别检查以 .bat 和 .cmd 结尾的文件 if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +@REM 如果存在 %HOME%\mavenrc_post.bat 文件,则调用该脚本 if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +@REM 如果存在 %HOME%\mavenrc_post.cmd 文件,则调用该脚本 :skipRcPost +@REM 跳过执行用户定义的后置脚本的标签 @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +@REM 如果 MAVEN_BATCH_PAUSE 环境变量设置为 'on',则暂停脚本执行 if "%MAVEN_BATCH_PAUSE%" == "on" pause +@REM 等待用户按键 if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% +@REM 如果 MAVEN_TERMINATE_CMD 环境变量设置为 'on',则退出命令提示符并返回错误代码 exit /B %ERROR_CODE% +@REM 退出当前批处理脚本并返回错误代码 \ No newline at end of file diff --git a/pom-war.xml b/pom-war.xml index 93c5638..fcac2a7 100644 --- a/pom-war.xml +++ b/pom-war.xml @@ -1,116 +1,138 @@ + + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE - + + + com.jlwl springbootus5uu + 0.0.1-SNAPSHOT + springboot-schema + springboot学习框架(war包对应的pom,打war包,执行【mvn clean package -f pom-war.xml】) + war + + 1.8 + 1.2.8 + 3.1.1 + + org.springframework.boot spring-boot-starter-web + org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.1 + - org.springframework.boot - spring-boot-starter-jdbc + org.springframework.boot + spring-boot-starter-jdbc - + - org.springframework.boot - spring-boot-starter-tomcat - provided + org.springframework.boot + spring-boot-starter-tomcat + provided - + - mysql - mysql-connector-java + mysql + mysql-connector-java + org.apache.shiro shiro-spring 1.3.2 - + com.baomidou mybatis-plus 2.3 + com.baomidou mybatisplus-spring-boot-starter 1.0.5 + - com.google.protobuf - protobuf-java - 3.10.0 + com.google.protobuf + protobuf-java + 3.10.0 - + - org.apache.commons - commons-lang3 - 3.0 + org.apache.commons + commons-lang3 + 3.0 - + - javax.validation - validation-api - 2.0.1.Final + javax.validation + validation-api + 2.0.1.Final - + - commons-io - commons-io - 2.5 + commons-io + commons-io + 2.5 - - + - cn.hutool - hutool-all - 4.0.12 + cn.hutool + hutool-all + 4.0.12 - - + com.alibaba fastjson ${fastjson.version} - + - com.baidu.aip - java-sdk - 4.4.1 + com.baidu.aip + java-sdk + 4.4.1 - + org.springframework.boot spring-boot-starter-test test + org.junit.vintage @@ -120,23 +142,27 @@ - + + springbootus5uu + + org.springframework.boot spring-boot-maven-plugin - + org.apache.maven.plugins maven-surefire-plugin + true - + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 1c9ddf8..8f6f207 100644 --- a/pom.xml +++ b/pom.xml @@ -1,143 +1,219 @@ + + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + com.jlwl + springbootus5uu + 0.0.1-SNAPSHOT + springboot-schema - springboot学习框架 + + springboot学习框架(war包对应的pom,打war包,执行【mvn clean package -f pom-war.xml】) + + war + + 1.8 + 1.2.8 + 3.1.1 + + + org.springframework.boot + spring-boot-starter-web + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.1 + - org.springframework.boot - spring-boot-starter-jdbc + org.springframework.boot + + spring-boot-starter-jdbc + + + + + org.springframework.boot + + spring-boot-starter-tomcat + + provided + - + - mysql - mysql-connector-java + mysql + + mysql-connector-java + org.apache.shiro + shiro-spring + 1.3.2 + - + com.baomidou + mybatis-plus + 2.3 + com.baomidou + mybatisplus-spring-boot-starter + 1.0.5 + - com.google.protobuf - protobuf-java - 3.10.0 + com.google.protobuf + + protobuf-java + + 3.10.0 + - + - org.apache.commons - commons-lang3 - 3.0 + org.apache.commons + + commons-lang3 + + 3.0 + - + - javax.validation - validation-api - 2.0.1.Final + javax.validation + + validation-api + + 2.0.1.Final + - + - commons-io - commons-io - 2.5 + commons-io + + commons-io + + 2.5 + - - + + - cn.hutool - hutool-all - 4.0.12 + cn.hutool + + hutool-all + + 4.0.12 + - + com.alibaba + fastjson + ${fastjson.version} - - - - - - - - - com.microsoft.sqlserver - mssql-jdbc - 6.2.0.jre8 - test - - - com.microsoft.sqlserver - mssql-jdbc - 6.2.0.jre8 - runtime + - com.baidu.aip - java-sdk - 4.4.1 + com.baidu.aip + + java-sdk + + 4.4.1 + - + org.springframework.boot + spring-boot-starter-test + test + + org.junit.vintage + junit-vintage-engine + + + + springbootus5uu + + org.springframework.boot + spring-boot-maven-plugin + + + + + org.apache.maven.plugins + + maven-surefire-plugin + + + + true + + - + \ No newline at end of file diff --git a/src/main/java/com/config/InterceptorConfig.java b/src/main/java/com/config/InterceptorConfig.java index 21cd1dc..ce36911 100644 --- a/src/main/java/com/config/InterceptorConfig.java +++ b/src/main/java/com/config/InterceptorConfig.java @@ -33,6 +33,6 @@ public class InterceptorConfig extends WebMvcConfigurationSupport{ .addResourceLocations("classpath:/admin/") .addResourceLocations("classpath:/front/") .addResourceLocations("classpath:/public/"); - super.addResourceHandlers(registry); + super.addResourceHandlers(registry);//测试 } } diff --git a/src/main/java/com/controller/ChatController.java b/src/main/java/com/controller/ChatController.java index 34f578e..c98ab5d 100644 --- a/src/main/java/com/controller/ChatController.java +++ b/src/main/java/com/controller/ChatController.java @@ -1,231 +1,346 @@ package com.controller; +// 导入用于格式化日期的类 import java.text.SimpleDateFormat; +// 导入ArrayList类,用于创建动态数组 import java.util.ArrayList; +// 导入Arrays类,提供操作数组的静态方法 import java.util.Arrays; +// 导入Calendar类,用于处理日期和时间 import java.util.Calendar; +// 导入Map接口,用于存储键值对 import java.util.Map; +// 导入HashMap类,实现了Map接口 import java.util.HashMap; +// 导入Iterator接口,用于遍历集合 import java.util.Iterator; +// 导入Date类,用于表示特定的瞬间 import java.util.Date; +// 导入List接口,用于存储有序的元素集合 import java.util.List; +// 导入HttpServletRequest类,用于获取客户端请求信息 import javax.servlet.http.HttpServletRequest; +// 导入自定义的验证工具类 import com.utils.ValidatorUtils; +// 导入Apache Commons Lang库中的StringUtils类,用于处理字符串 import org.apache.commons.lang3.StringUtils; +// 导入Spring框架的自动装配注解 import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring框架的日期格式化注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Spring框架的路径变量注解 import org.springframework.web.bind.annotation.PathVariable; +// 导入Spring框架的请求体注解 import org.springframework.web.bind.annotation.RequestBody; +// 导入Spring框架的请求映射注解 import org.springframework.web.bind.annotation.RequestMapping; +// 导入Spring框架的请求参数注解 import org.springframework.web.bind.annotation.RequestParam; +// 导入Spring框架的REST控制器注解 import org.springframework.web.bind.annotation.RestController; +// 导入MyBatis-Plus的实体包装器类 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入MyBatis-Plus的包装器接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解 import com.annotation.IgnoreAuth; +// 导入Chat实体类 import com.entity.ChatEntity; +// 导入Chat视图类 import com.entity.view.ChatView; +// 导入Chat服务类 import com.service.ChatService; +// 导入Token服务类 import com.service.TokenService; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的响应结果类 import com.utils.R; +// 导入自定义的MD5工具类 import com.utils.MD5Util; +// 导入自定义的MyBatis-Plus工具类 import com.utils.MPUtil; +// 导入自定义的通用工具类 import com.utils.CommonUtil; /** * 客户服务 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:15 */ +// 声明为RESTful风格的控制器 @RestController +// 定义请求的基础路径 @RequestMapping("/chat") public class ChatController { - @Autowired - private ChatService chatService; - - - - /** - * 后端列表 - */ - @RequestMapping("/page") - public R page(@RequestParam Map params,ChatEntity chat, - HttpServletRequest request){ - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - chat.setUserid((Long)request.getSession().getAttribute("userId")); - } - EntityWrapper ew = new EntityWrapper(); + // 自动装配ChatService实例 + @Autowired + private ChatService chatService; + + + /** + * 后端列表 + */ + // 处理/page请求 + @RequestMapping("/page") + // 方法接收请求参数、Chat实体和HttpServletRequest对象 + public R page(@RequestParam Map params, ChatEntity chat, + HttpServletRequest request) { + // 如果当前用户不是管理员 + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置Chat实体的用户ID为当前用户ID + chat.setUserid((Long) request.getSession().getAttribute("userId")); + } + // 创建MyBatis-Plus的实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 调用ChatService的queryPage方法进行分页查询 PageUtils page = chatService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, chat), params), params)); + // 返回成功响应,并将分页数据放入响应中 + return R.ok().put("data", page); + } - return R.ok().put("data", page); - } - - /** - * 前端列表 - */ - @RequestMapping("/list") - public R list(@RequestParam Map params,ChatEntity chat, - HttpServletRequest request){ - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - chat.setUserid((Long)request.getSession().getAttribute("userId")); - } - EntityWrapper ew = new EntityWrapper(); + /** + * 前端列表 + */ + // 处理/list请求 + @RequestMapping("/list") + // 方法接收请求参数、Chat实体和HttpServletRequest对象 + public R list(@RequestParam Map params, ChatEntity chat, + HttpServletRequest request) { + // 如果当前用户不是管理员 + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置Chat实体的用户ID为当前用户ID + chat.setUserid((Long) request.getSession().getAttribute("userId")); + } + // 创建MyBatis-Plus的实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 调用ChatService的queryPage方法进行分页查询 PageUtils page = chatService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, chat), params), params)); - return R.ok().put("data", page); - } + // 返回成功响应,并将分页数据放入响应中 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 处理/lists请求 + @RequestMapping("/lists") + // 方法接收Chat实体 + public R list(ChatEntity chat) { + // 创建MyBatis-Plus的实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,将Chat实体的属性作为查询条件 + ew.allEq(MPUtil.allEQMapPre(chat, "chat")); + // 调用ChatService的selectListView方法查询列表数据 + return R.ok().put("data", chatService.selectListView(ew)); + } /** - * 列表 - */ - @RequestMapping("/lists") - public R list( ChatEntity chat){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( chat, "chat")); - return R.ok().put("data", chatService.selectListView(ew)); - } - - /** - * 查询 - */ - @RequestMapping("/query") - public R query(ChatEntity chat){ - EntityWrapper< ChatEntity> ew = new EntityWrapper< ChatEntity>(); - ew.allEq(MPUtil.allEQMapPre( chat, "chat")); - ChatView chatView = chatService.selectView(ew); + * 查询 + */ + // 处理/query请求 + @RequestMapping("/query") + // 方法接收Chat实体 + public R query(ChatEntity chat) { + // 创建MyBatis-Plus的实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,将Chat实体的属性作为查询条件 + ew.allEq(MPUtil.allEQMapPre(chat, "chat")); + // 调用ChatService的selectView方法查询单个视图数据 + ChatView chatView = chatService.selectView(ew); + // 返回成功响应,并将查询结果放入响应中 return R.ok("查询客户服务成功").put("data", chatView); - } - - /** - * 后端详情 - */ - @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ - ChatEntity chat = chatService.selectById(id); - return R.ok().put("data", chat); - } - - /** - * 前端详情 - */ - @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ - ChatEntity chat = chatService.selectById(id); - return R.ok().put("data", chat); - } - - - - - /** - * 后端保存 - */ - @RequestMapping("/save") - public R save(@RequestBody ChatEntity chat, HttpServletRequest request){ - chat.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(chat); - if(StringUtils.isNotBlank(chat.getAsk())) { + } + + /** + * 后端详情 + */ + // 处理/info/{id}请求,接收路径变量id + @RequestMapping("/info/{id}") + public R info(@PathVariable("id") Long id) { + // 根据ID查询Chat实体 + ChatEntity chat = chatService.selectById(id); + // 返回成功响应,并将查询结果放入响应中 + return R.ok().put("data", chat); + } + + /** + * 前端详情 + */ + // 处理/detail/{id}请求,接收路径变量id + @RequestMapping("/detail/{id}") + public R detail(@PathVariable("id") Long id) { + // 根据ID查询Chat实体 + ChatEntity chat = chatService.selectById(id); + // 返回成功响应,并将查询结果放入响应中 + return R.ok().put("data", chat); + } + + + /** + * 后端保存 + */ + // 处理/save请求,接收请求体中的Chat实体和HttpServletRequest对象 + @RequestMapping("/save") + public R save(@RequestBody ChatEntity chat, HttpServletRequest request) { + // 生成唯一的ID,使用当前时间戳加上随机数 + chat.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的验证代码 + //ValidatorUtils.validateEntity(chat); + // 如果询问内容不为空 + if (StringUtils.isNotBlank(chat.getAsk())) { + // 将该用户的所有聊天记录的isreply字段置为0 chatService.updateForSet("isreply=0", new EntityWrapper().eq("userid", request.getSession().getAttribute("userId"))); - chat.setUserid((Long)request.getSession().getAttribute("userId")); - chat.setIsreply(1); - } - if(StringUtils.isNotBlank(chat.getReply())) { - chatService.updateForSet("isreply=0", new EntityWrapper().eq("userid", chat.getUserid())); - chat.setAdminid((Long)request.getSession().getAttribute("userId")); - } - chatService.insert(chat); - return R.ok(); - } - - /** - * 前端保存 - */ - @RequestMapping("/add") - public R add(@RequestBody ChatEntity chat, HttpServletRequest request){ - chat.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(chat); - chat.setUserid((Long)request.getSession().getAttribute("userId")); - if(StringUtils.isNotBlank(chat.getAsk())) { + // 设置Chat实体的用户ID为当前用户ID + chat.setUserid((Long) request.getSession().getAttribute("userId")); + // 设置isreply字段为1 + chat.setIsreply(1); + } + // 如果回复内容不为空 + if (StringUtils.isNotBlank(chat.getReply())) { + // 将该用户的所有聊天记录的isreply字段置为0 + chatService.updateForSet("isreply=0", new EntityWrapper().eq("userid", chat.getUserid())); + // 设置Chat实体的管理员ID为当前用户ID + chat.setAdminid((Long) request.getSession().getAttribute("userId")); + } + // 插入Chat实体到数据库 + chatService.insert(chat); + // 返回成功响应 + return R.ok(); + } + + /** + * 前端保存 + */ + // 处理/add请求,接收请求体中的Chat实体和HttpServletRequest对象 + @RequestMapping("/add") + public R add(@RequestBody ChatEntity chat, HttpServletRequest request) { + // 生成唯一的ID,使用当前时间戳加上随机数 + chat.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的验证代码 + //ValidatorUtils.validateEntity(chat); + // 设置Chat实体的用户ID为当前用户ID + chat.setUserid((Long) request.getSession().getAttribute("userId")); + // 如果询问内容不为空 + if (StringUtils.isNotBlank(chat.getAsk())) { + // 将该用户的所有聊天记录的isreply字段置为0 chatService.updateForSet("isreply=0", new EntityWrapper().eq("userid", request.getSession().getAttribute("userId"))); - chat.setUserid((Long)request.getSession().getAttribute("userId")); - chat.setIsreply(1); - } - if(StringUtils.isNotBlank(chat.getReply())) { - chatService.updateForSet("isreply=0", new EntityWrapper().eq("userid", chat.getUserid())); - chat.setAdminid((Long)request.getSession().getAttribute("userId")); - } - chatService.insert(chat); - return R.ok(); - } - - /** - * 修改 - */ - @RequestMapping("/update") - public R update(@RequestBody ChatEntity chat, HttpServletRequest request){ - //ValidatorUtils.validateEntity(chat); - chatService.updateById(chat);//全部更新 - return R.ok(); - } - - - /** - * 删除 - */ - @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ - chatService.deleteBatchIds(Arrays.asList(ids)); - return R.ok(); - } - - /** - * 提醒接口 - */ + // 设置Chat实体的用户ID为当前用户ID + chat.setUserid((Long) request.getSession().getAttribute("userId")); + // 设置isreply字段为1 + chat.setIsreply(1); + } + // 如果回复内容不为空 + if (StringUtils.isNotBlank(chat.getReply())) { + // 将该用户的所有聊天记录的isreply字段置为0 + chatService.updateForSet("isreply=0", new EntityWrapper().eq("userid", chat.getUserid())); + // 设置Chat实体的管理员ID为当前用户ID + chat.setAdminid((Long) request.getSession().getAttribute("userId")); + } + // 插入Chat实体到数据库 + chatService.insert(chat); + // 返回成功响应 + return R.ok(); + } + + /** + * 修改 + */ + // 处理/update请求,接收请求体中的Chat实体和HttpServletRequest对象 + @RequestMapping("/update") + public R update(@RequestBody ChatEntity chat, HttpServletRequest request) { + // 注释掉的验证代码 + //ValidatorUtils.validateEntity(chat); + // 根据ID更新Chat实体的所有字段 + chatService.updateById(chat); + // 返回成功响应 + return R.ok(); + } + + + /** + * 删除 + */ + // 处理/delete请求,接收请求体中的ID数组 + @RequestMapping("/delete") + public R delete(@RequestBody Long[] ids) { + // 根据ID数组批量删除Chat实体 + chatService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 + return R.ok(); + } + + /** + * 提醒接口 + */ + // 处理/remind/{columnName}/{type}请求,接收路径变量columnName和type,以及请求参数map @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名和类型放入请求参数map中 map.put("column", columnName); map.put("type", type); - - if(type.equals("2")) { + + // 如果类型为2 + if (type.equals("2")) { + // 创建日期格式化对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建Calendar对象 Calendar c = Calendar.getInstance(); + // 提醒开始日期 Date remindStartDate = null; + // 提醒结束日期 Date remindEndDate = null; - if(map.get("remindstart")!=null) { + // 如果提醒开始时间不为空 + if (map.get("remindstart") != null) { + // 将提醒开始时间转换为整数 Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); + // 设置Calendar的时间为当前时间 + c.setTime(new Date()); + // 增加指定天数 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取提醒开始日期 remindStartDate = c.getTime(); + // 将提醒开始日期格式化后放入请求参数map中 map.put("remindstart", sdf.format(remindStartDate)); } - if(map.get("remindend")!=null) { + // 如果提醒结束时间不为空 + if (map.get("remindend") != null) { + // 将提醒结束时间转换为整数 Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置Calendar的时间为当前时间 c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); + // 增加指定天数 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取提醒结束日期 remindEndDate = c.getTime(); + // 将提醒结束日期格式化后放入请求参数map中 map.put("remindend", sdf.format(remindEndDate)); } } - + + // 创建MyBatis-Plus的包装器 Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { + // 如果提醒开始时间不为空 + if (map.get("remindstart") != null) { + // 设置查询条件,列名大于等于提醒开始时间 wrapper.ge(columnName, map.get("remindstart")); } - if(map.get("remindend")!=null) { + // 如果提醒结束时间不为空 + if (map.get("remindend") != null) { + // 设置查询条件,列名小于等于提醒结束时间 wrapper.le(columnName, map.get("remindend")); } - + // 统计符合条件的记录数 int count = chatService.selectCount(wrapper); + // 返回成功响应,并将统计结果放入响应中 return R.ok().put("count", count); } - - - -} +} \ No newline at end of file diff --git a/src/main/java/com/controller/CommonController.java b/src/main/java/com/controller/CommonController.java index 4c6e1f1..1068b70 100644 --- a/src/main/java/com/controller/CommonController.java +++ b/src/main/java/com/controller/CommonController.java @@ -1,256 +1,405 @@ package com.controller; +// 导入文件操作相关类 import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +// 导入日期格式化类 import java.text.SimpleDateFormat; +// 导入动态数组类 import java.util.ArrayList; +// 导入日历类 import java.util.Calendar; +// 导入日期类 import java.util.Date; +// 导入哈希映射类 import java.util.HashMap; +// 导入列表接口 import java.util.List; +// 导入映射接口 import java.util.Map; +// 导入Apache Commons Lang工具类 import org.apache.commons.lang3.StringUtils; +// 导入JSON对象类 import org.json.JSONObject; +// 导入Spring的自动装配注解 import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring的资源工具类 import org.springframework.util.ResourceUtils; +// 导入Spring的路径变量注解 import org.springframework.web.bind.annotation.PathVariable; +// 导入Spring的请求体注解 import org.springframework.web.bind.annotation.RequestBody; +// 导入Spring的请求映射注解 import org.springframework.web.bind.annotation.RequestMapping; +// 导入Spring的请求参数注解 import org.springframework.web.bind.annotation.RequestParam; +// 导入Spring的REST控制器注解 import org.springframework.web.bind.annotation.RestController; +// 导入自定义的忽略认证注解 import com.annotation.IgnoreAuth; +// 导入百度人脸识别客户端类 import com.baidu.aip.face.AipFace; +// 导入百度人脸匹配请求类 import com.baidu.aip.face.MatchRequest; +// 导入百度的Base64工具类 import com.baidu.aip.util.Base64Util; +// 导入MyBatis-Plus的实体包装器类 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入MyBatis-Plus的包装器接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入配置实体类 import com.entity.ConfigEntity; +// 导入通用服务类 import com.service.CommonService; +// 导入配置服务类 import com.service.ConfigService; +// 导入自定义的百度工具类 import com.utils.BaiduUtil; +// 导入自定义的文件工具类 import com.utils.FileUtil; +// 导入自定义的响应结果类 import com.utils.R; /** * 通用接口 */ +// 声明为RESTful控制器 @RestController -public class CommonController{ +public class CommonController { + // 自动装配通用服务类实例 @Autowired private CommonService commonService; - + + // 自动装配配置服务类实例 @Autowired private ConfigService configService; + + // 定义一个未使用的整型变量 private int aaaa; + + // 定义百度人脸识别客户端静态变量 private static AipFace client = null; - + + // 定义百度地图AK静态变量 private static String BAIDU_DITU_AK = null; - + + /** + * 根据经纬度获取城市信息 + * @param lng 经度 + * @param lat 纬度 + * @return 包含城市信息的响应结果 + */ @RequestMapping("/location") - public R location(String lng,String lat) { - if(BAIDU_DITU_AK==null) { + public R location(String lng, String lat) { + // 如果百度地图AK为空 + if (BAIDU_DITU_AK == null) { + // 从配置表中获取百度地图AK BAIDU_DITU_AK = configService.selectOne(new EntityWrapper().eq("name", "baidu_ditu_ak")).getValue(); - if(BAIDU_DITU_AK==null) { + // 如果获取失败 + if (BAIDU_DITU_AK == null) { + // 返回错误信息 return R.error("请在配置管理中正确配置baidu_ditu_ak"); } } + // 调用百度工具类的方法获取城市信息 Map map = BaiduUtil.getCityByLonLat(BAIDU_DITU_AK, lng, lat); + // 返回成功响应并携带城市信息 return R.ok().put("data", map); } - + /** * 人脸比对 - * - * @param face1 人脸1 - * @param face2 人脸2 - * @return + * @param face1 人脸1的文件名 + * @param face2 人脸2的文件名 + * @return 包含比对结果的响应结果 */ @RequestMapping("/matchFace") public R matchFace(String face1, String face2) { - if(client==null) { - /*String AppID = configService.selectOne(new EntityWrapper().eq("name", "AppID")).getValue();*/ + // 如果百度人脸识别客户端未初始化 + if (client == null) { + // 从配置表中获取API Key String APIKey = configService.selectOne(new EntityWrapper().eq("name", "APIKey")).getValue(); + // 从配置表中获取Secret Key String SecretKey = configService.selectOne(new EntityWrapper().eq("name", "SecretKey")).getValue(); + // 获取百度认证令牌 String token = BaiduUtil.getAuth(APIKey, SecretKey); - if(token==null) { + // 如果获取失败 + if (token == null) { + // 返回错误信息 return R.error("请在配置管理中正确配置APIKey和SecretKey"); } + // 初始化百度人脸识别客户端 client = new AipFace(null, APIKey, SecretKey); + // 设置连接超时时间 client.setConnectionTimeoutInMillis(2000); + // 设置套接字超时时间 client.setSocketTimeoutInMillis(60000); } + // 定义JSON对象用于存储比对结果 JSONObject res = null; try { - File file1 = new File(ResourceUtils.getFile("classpath:static/upload").getAbsolutePath()+"/"+face1); - File file2 = new File(ResourceUtils.getFile("classpath:static/upload").getAbsolutePath()+"/"+face2); + // 获取人脸1的文件对象 + File file1 = new File(ResourceUtils.getFile("classpath:static/upload").getAbsolutePath() + "/" + face1); + // 获取人脸2的文件对象 + File file2 = new File(ResourceUtils.getFile("classpath:static/upload").getAbsolutePath() + "/" + face2); + // 将人脸1的文件转换为Base64编码字符串 String img1 = Base64Util.encode(FileUtil.FileToByte(file1)); + // 将人脸2的文件转换为Base64编码字符串 String img2 = Base64Util.encode(FileUtil.FileToByte(file2)); + // 创建人脸1的匹配请求对象 MatchRequest req1 = new MatchRequest(img1, "BASE64"); + // 创建人脸2的匹配请求对象 MatchRequest req2 = new MatchRequest(img2, "BASE64"); + // 创建匹配请求列表 ArrayList requests = new ArrayList(); + // 将人脸1的匹配请求添加到列表中 requests.add(req1); + // 将人脸2的匹配请求添加到列表中 requests.add(req2); + // 调用百度人脸识别客户端的匹配方法进行人脸比对 res = client.match(requests); + // 打印比对结果 System.out.println(res.get("result")); } catch (FileNotFoundException e) { + // 打印文件未找到异常信息 e.printStackTrace(); + // 返回文件不存在的错误信息 return R.error("文件不存在"); } catch (IOException e) { + // 打印IO异常信息 e.printStackTrace(); - } + } + // 返回成功响应并携带比对结果 return R.ok().put("data", com.alibaba.fastjson.JSONObject.parse(res.get("result").toString())); } - + /** * 获取table表中的column列表(联动接口) - * @param table - * @param column - * @return + * @param tableName 表名 + * @param columnName 列名 + * @param level 层级信息 + * @param parent 父级信息 + * @return 包含列列表的响应结果 */ @IgnoreAuth @RequestMapping("/option/{tableName}/{columnName}") - public R getOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,String level,String parent) { + public R getOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, String level, String parent) { + // 创建参数映射 Map params = new HashMap(); + // 将表名放入参数映射中 params.put("table", tableName); + // 将列名放入参数映射中 params.put("column", columnName); - if(StringUtils.isNotBlank(level)) { + // 如果层级信息不为空 + if (StringUtils.isNotBlank(level)) { + // 将层级信息放入参数映射中 params.put("level", level); } - if(StringUtils.isNotBlank(parent)) { + // 如果父级信息不为空 + if (StringUtils.isNotBlank(parent)) { + // 将父级信息放入参数映射中 params.put("parent", parent); } + // 调用通用服务类的方法获取列列表 List data = commonService.getOption(params); + // 返回成功响应并携带列列表 return R.ok().put("data", data); } - + /** * 根据table中的column获取单条记录 - * @param table - * @param column - * @return + * @param tableName 表名 + * @param columnName 列名 + * @param columnValue 列值 + * @return 包含单条记录的响应结果 */ @IgnoreAuth @RequestMapping("/follow/{tableName}/{columnName}") public R getFollowByOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, @RequestParam String columnValue) { + // 创建参数映射 Map params = new HashMap(); + // 将表名放入参数映射中 params.put("table", tableName); + // 将列名放入参数映射中 params.put("column", columnName); + // 将列值放入参数映射中 params.put("columnValue", columnValue); + // 调用通用服务类的方法获取单条记录 Map result = commonService.getFollowByOption(params); + // 返回成功响应并携带单条记录 return R.ok().put("data", result); } - + /** * 修改table表的sfsh状态 - * @param table - * @param map - * @return + * @param tableName 表名 + * @param map 包含修改信息的映射 + * @return 成功响应 */ @RequestMapping("/sh/{tableName}") public R sh(@PathVariable("tableName") String tableName, @RequestBody Map map) { + // 将表名放入映射中 map.put("table", tableName); + // 调用通用服务类的方法修改状态 commonService.sh(map); + // 返回成功响应 return R.ok(); } - + /** * 获取需要提醒的记录数 - * @param tableName - * @param columnName + * @param tableName 表名 + * @param columnName 列名 * @param type 1:数字 2:日期 - * @param map - * @return + * @param map 包含查询条件的映射 + * @return 包含提醒记录数的响应结果 */ @IgnoreAuth @RequestMapping("/remind/{tableName}/{columnName}/{type}") - public R remindCount(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, - @PathVariable("type") String type,@RequestParam Map map) { + public R remindCount(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, + @PathVariable("type") String type, @RequestParam Map map) { + // 将表名放入映射中 map.put("table", tableName); + // 将列名放入映射中 map.put("column", columnName); + // 将类型放入映射中 map.put("type", type); - - if(type.equals("2")) { + + // 如果类型为日期 + if (type.equals("2")) { + // 创建日期格式化对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建日历对象 Calendar c = Calendar.getInstance(); + // 提醒开始日期 Date remindStartDate = null; + // 提醒结束日期 Date remindEndDate = null; - if(map.get("remindstart")!=null) { + // 如果提醒开始时间不为空 + if (map.get("remindstart") != null) { + // 将提醒开始时间转换为整数 Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); + // 设置日历时间为当前时间 + c.setTime(new Date()); + // 增加指定天数 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取提醒开始日期 remindStartDate = c.getTime(); + // 将提醒开始日期格式化后放入映射中 map.put("remindstart", sdf.format(remindStartDate)); } - if(map.get("remindend")!=null) { + // 如果提醒结束时间不为空 + if (map.get("remindend") != null) { + // 将提醒结束时间转换为整数 Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历时间为当前时间 c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); + // 增加指定天数 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取提醒结束日期 remindEndDate = c.getTime(); + // 将提醒结束日期格式化后放入映射中 map.put("remindend", sdf.format(remindEndDate)); } } - + // 调用通用服务类的方法统计提醒记录数 int count = commonService.remindCount(map); + // 返回成功响应并携带提醒记录数 return R.ok().put("count", count); } - + /** * 单列求和 + * @param tableName 表名 + * @param columnName 列名 + * @return 包含求和结果的响应结果 */ @IgnoreAuth @RequestMapping("/cal/{tableName}/{columnName}") public R cal(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) { + // 创建参数映射 Map params = new HashMap(); + // 将表名放入参数映射中 params.put("table", tableName); + // 将列名放入参数映射中 params.put("column", columnName); + // 调用通用服务类的方法进行单列求和 Map result = commonService.selectCal(params); + // 返回成功响应并携带求和结果 return R.ok().put("data", result); } - + /** * 分组统计 + * @param tableName 表名 + * @param columnName 列名 + * @return 包含分组统计结果的响应结果 */ @IgnoreAuth @RequestMapping("/group/{tableName}/{columnName}") public R group(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) { + // 创建参数映射 Map params = new HashMap(); + // 将表名放入参数映射中 params.put("table", tableName); + // 将列名放入参数映射中 params.put("column", columnName); + // 调用通用服务类的方法进行分组统计 List> result = commonService.selectGroup(params); + // 创建日期格式化对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - for(Map m : result) { - for(String k : m.keySet()) { - if(m.get(k) instanceof Date) { - m.put(k, sdf.format((Date)m.get(k))); + // 遍历统计结果 + for (Map m : result) { + // 遍历结果中的键 + for (String k : m.keySet()) { + // 如果值为日期类型 + if (m.get(k) instanceof Date) { + // 将日期格式化后重新放入结果中 + m.put(k, sdf.format((Date) m.get(k))); } } } + // 返回成功响应并携带分组统计结果 return R.ok().put("data", result); } - + /** * (按值统计) + * @param tableName 表名 + * @param yColumnName y列名 + * @param xColumnName x列名 + * @return 包含按值统计结果的响应结果 */ @IgnoreAuth @RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}") public R value(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName) { + // 创建参数映射 Map params = new HashMap(); + // 将表名放入参数映射中 params.put("table", tableName); + // 将x列名放入参数映射中 params.put("xColumn", xColumnName); + // 将y列名放入参数映射中 params.put("yColumn", yColumnName); + // 调用通用服务类的方法进行按值统计 List> result = commonService.selectValue(params); + // 创建日期格式化对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - for(Map m : result) { - for(String k : m.keySet()) { - if(m.get(k) instanceof Date) { - m.put(k, sdf.format((Date)m.get(k))); + // 遍历统计结果 + for (Map m : result) { + // 遍历结果中的键 + for (String k : m.keySet()) { + // 如果值为日期类型 + if (m.get(k) instanceof Date) { + // 将日期格式化后重新放入结果中 + m.put(k, sdf.format((Date) m.get(k))); } } } + // 返回成功响应并携带按值统计结果 return R.ok().put("data", result); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/controller/ConfigController.java b/src/main/java/com/controller/ConfigController.java index 6e9f123..58b430b 100644 --- a/src/main/java/com/controller/ConfigController.java +++ b/src/main/java/com/controller/ConfigController.java @@ -1,111 +1,156 @@ - +// 声明该类所在的包 package com.controller; - +// 导入Arrays类,用于操作数组,这里主要用于处理批量删除时的ID数组 import java.util.Arrays; +// 导入Map接口,用于存储键值对,通常用于接收请求参数 import java.util.Map; +// 导入Spring框架的自动装配注解,用于将ConfigService注入到当前类中 import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring框架的路径变量注解,用于从URL路径中获取参数 import org.springframework.web.bind.annotation.PathVariable; +// 导入Spring框架的Post请求映射注解,用于处理HTTP POST请求 import org.springframework.web.bind.annotation.PostMapping; +// 导入Spring框架的请求体注解,用于将请求体中的数据绑定到方法参数上 import org.springframework.web.bind.annotation.RequestBody; +// 导入Spring框架的请求映射注解,用于将HTTP请求映射到处理方法上 import org.springframework.web.bind.annotation.RequestMapping; +// 导入Spring框架的请求参数注解,用于从请求中获取参数 import org.springframework.web.bind.annotation.RequestParam; +// 导入Spring框架的REST控制器注解,表明该类是一个RESTful风格的控制器 import org.springframework.web.bind.annotation.RestController; +// 导入自定义的忽略认证注解,用于标记某些接口不需要进行认证 import com.annotation.IgnoreAuth; +// 导入MyBatis-Plus的实体包装器类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入配置实体类,用于表示配置信息 import com.entity.ConfigEntity; +// 导入配置服务类,用于处理配置信息的业务逻辑 import com.service.ConfigService; +// 导入自定义的分页工具类,用于处理分页查询结果 import com.utils.PageUtils; +// 导入自定义的响应结果类,用于封装接口的返回数据 import com.utils.R; +// 导入自定义的验证工具类,用于验证实体对象的合法性 import com.utils.ValidatorUtils; /** * 登录相关 */ +// 定义该控制器处理的请求路径前缀为"config" @RequestMapping("config") +// 声明该类为RESTful控制器 @RestController -public class ConfigController{ - - @Autowired - private ConfigService configService; +public class ConfigController { + // 使用自动装配将ConfigService实例注入到当前类中 + @Autowired + private ConfigService configService; - /** + /** * 列表 + * 该方法用于处理分页查询配置信息的请求 */ @RequestMapping("/page") - public R page(@RequestParam Map params,ConfigEntity config){ + public R page(@RequestParam Map params, ConfigEntity config) { + // 创建一个EntityWrapper对象,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = configService.queryPage(params); + // 调用ConfigService的queryPage方法进行分页查询 + PageUtils page = configService.queryPage(params); + // 返回成功响应,并将分页查询结果放入响应数据中 return R.ok().put("data", page); } - - /** + + /** * 列表 + * 该方法用于处理查询配置信息列表的请求,且该接口不需要认证 */ @IgnoreAuth @RequestMapping("/list") - public R list(@RequestParam Map params,ConfigEntity config){ + public R list(@RequestParam Map params, ConfigEntity config) { + // 创建一个EntityWrapper对象,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = configService.queryPage(params); + // 调用ConfigService的queryPage方法进行分页查询 + PageUtils page = configService.queryPage(params); + // 返回成功响应,并将分页查询结果放入响应数据中 return R.ok().put("data", page); } /** * 信息 + * 该方法用于根据配置信息的ID查询单个配置信息 */ @RequestMapping("/info/{id}") - public R info(@PathVariable("id") String id){ + public R info(@PathVariable("id") String id) { + // 调用ConfigService的selectById方法根据ID查询配置信息 ConfigEntity config = configService.selectById(id); + // 返回成功响应,并将查询到的配置信息放入响应数据中 return R.ok().put("data", config); } - + /** * 详情 + * 该方法用于根据配置信息的ID查询单个配置信息详情,且该接口不需要认证 */ @IgnoreAuth @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") String id){ + public R detail(@PathVariable("id") String id) { + // 调用ConfigService的selectById方法根据ID查询配置信息 ConfigEntity config = configService.selectById(id); + // 返回成功响应,并将查询到的配置信息放入响应数据中 return R.ok().put("data", config); } - + /** * 根据name获取信息 + * 该方法用于根据配置信息的名称查询单个配置信息 */ @RequestMapping("/info") - public R infoByName(@RequestParam String name){ + public R infoByName(@RequestParam String name) { + // 调用ConfigService的selectOne方法根据名称查询配置信息,这里写死了查询"faceFile" ConfigEntity config = configService.selectOne(new EntityWrapper().eq("name", "faceFile")); + // 返回成功响应,并将查询到的配置信息放入响应数据中 return R.ok().put("data", config); } - + /** * 保存 + * 该方法用于处理保存配置信息的请求,使用HTTP POST请求 */ @PostMapping("/save") - public R save(@RequestBody ConfigEntity config){ + public R save(@RequestBody ConfigEntity config) { + // 注释掉的代码,原本用于验证实体对象的合法性 // ValidatorUtils.validateEntity(config); - configService.insert(config); + // 调用ConfigService的insert方法将配置信息插入到数据库中 + configService.insert(config); + // 返回成功响应 return R.ok(); } /** * 修改 + * 该方法用于处理更新配置信息的请求 */ @RequestMapping("/update") - public R update(@RequestBody ConfigEntity config){ + public R update(@RequestBody ConfigEntity config) { + // 注释掉的代码,原本用于验证实体对象的合法性 // ValidatorUtils.validateEntity(config); - configService.updateById(config);//全部更新 + // 调用ConfigService的updateById方法根据ID更新配置信息的所有字段 + configService.updateById(config); + // 返回成功响应 return R.ok(); } /** * 删除 + * 该方法用于处理批量删除配置信息的请求 */ @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ - configService.deleteBatchIds(Arrays.asList(ids)); + public R delete(@RequestBody Long[] ids) { + // 调用ConfigService的deleteBatchIds方法根据ID数组批量删除配置信息 + configService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/controller/DiscusskechengxinxiController.java b/src/main/java/com/controller/DiscusskechengxinxiController.java index fb52e12..8b10f25 100644 --- a/src/main/java/com/controller/DiscusskechengxinxiController.java +++ b/src/main/java/com/controller/DiscusskechengxinxiController.java @@ -1,207 +1,297 @@ +// 声明该类所在的包 package com.controller; +// 导入用于格式化日期的类,可将日期对象按照指定格式转换为字符串 import java.text.SimpleDateFormat; +// 导入动态数组类,可动态调整大小,用于存储多个元素 import java.util.ArrayList; +// 导入用于操作数组的工具类,提供了如排序、查找等操作数组的方法 import java.util.Arrays; +// 导入日历类,用于处理日期和时间,可进行日期的计算和转换 import java.util.Calendar; +// 导入映射接口,用于存储键值对,方便通过键快速查找对应的值 import java.util.Map; +// 导入哈希映射类,是Map接口的一个实现类,使用哈希表存储键值对 import java.util.HashMap; +// 导入迭代器接口,用于遍历集合中的元素 import java.util.Iterator; +// 导入日期类,用于表示特定的瞬间 import java.util.Date; +// 导入列表接口,是有序集合,可存储重复元素 import java.util.List; +// 导入用于处理HTTP请求的类,可获取请求的各种信息,如参数、头信息等 import javax.servlet.http.HttpServletRequest; +// 导入自定义的验证工具类,可用于验证实体对象的属性是否符合要求 import com.utils.ValidatorUtils; +// 导入Apache Commons Lang库中的字符串工具类,提供了丰富的字符串处理方法 import org.apache.commons.lang3.StringUtils; +// 导入Spring框架的自动装配注解,用于将依赖的对象自动注入到当前类中 import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring框架的日期格式化注解,可将请求参数中的日期字符串按照指定格式转换为日期对象 import org.springframework.format.annotation.DateTimeFormat; +// 导入Spring框架的路径变量注解,用于从URL路径中提取参数 import org.springframework.web.bind.annotation.PathVariable; +// 导入Spring框架的请求体注解,用于将请求体中的数据绑定到方法参数上 import org.springframework.web.bind.annotation.RequestBody; +// 导入Spring框架的请求映射注解,用于将HTTP请求映射到对应的处理方法上 import org.springframework.web.bind.annotation.RequestMapping; +// 导入Spring框架的请求参数注解,用于从请求中获取参数 import org.springframework.web.bind.annotation.RequestParam; +// 导入Spring框架的REST控制器注解,表明该类是一个RESTful风格的控制器 import org.springframework.web.bind.annotation.RestController; +// 导入MyBatis-Plus的实体包装器类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入MyBatis-Plus的包装器接口,是EntityWrapper的父接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解,用于标记某些接口不需要进行认证 import com.annotation.IgnoreAuth; +// 导入课程信息评论实体类,用于表示课程信息评论的数据结构 import com.entity.DiscusskechengxinxiEntity; +// 导入课程信息评论视图类,可能用于展示课程信息评论的特定视图 import com.entity.view.DiscusskechengxinxiView; +// 导入课程信息评论服务类,用于处理课程信息评论的业务逻辑 import com.service.DiscusskechengxinxiService; +// 导入令牌服务类,可能用于处理用户认证和授权相关的令牌 import com.service.TokenService; +// 导入自定义的分页工具类,用于处理分页查询的结果 import com.utils.PageUtils; +// 导入自定义的响应结果类,用于封装接口的返回数据,统一返回格式 import com.utils.R; +// 导入自定义的MD5工具类,用于进行MD5加密操作 import com.utils.MD5Util; +// 导入自定义的MyBatis-Plus工具类,提供了一些方便使用MyBatis-Plus的方法 import com.utils.MPUtil; +// 导入自定义的通用工具类,包含一些通用的工具方法 import com.utils.CommonUtil; /** * 课程信息评论表 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:15 */ +// 声明该类为RESTful风格的控制器 @RestController +// 定义该控制器处理的请求路径前缀 @RequestMapping("/discusskechengxinxi") public class DiscusskechengxinxiController { + // 使用自动装配将DiscusskechengxinxiService注入到当前类中 @Autowired private DiscusskechengxinxiService discusskechengxinxiService; - - /** * 后端列表 + * 该方法用于处理后端分页查询课程信息评论列表的请求 */ @RequestMapping("/page") - public R page(@RequestParam Map params,DiscusskechengxinxiEntity discusskechengxinxi, - HttpServletRequest request){ + public R page(@RequestParam Map params, DiscusskechengxinxiEntity discusskechengxinxi, + HttpServletRequest request) { + // 创建一个EntityWrapper对象,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = discusskechengxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discusskechengxinxi), params), params)); - + // 调用DiscusskechengxinxiService的queryPage方法进行分页查询 + PageUtils page = discusskechengxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discusskechengxinxi), params), params)); + // 返回成功响应,并将分页查询结果放入响应数据中 return R.ok().put("data", page); } - + /** * 前端列表 + * 该方法用于处理前端分页查询课程信息评论列表的请求,且该接口不需要认证 */ - @IgnoreAuth + @IgnoreAuth @RequestMapping("/list") - public R list(@RequestParam Map params,DiscusskechengxinxiEntity discusskechengxinxi, - HttpServletRequest request){ + public R list(@RequestParam Map params, DiscusskechengxinxiEntity discusskechengxinxi, + HttpServletRequest request) { + // 创建一个EntityWrapper对象,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = discusskechengxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discusskechengxinxi), params), params)); + // 调用DiscusskechengxinxiService的queryPage方法进行分页查询 + PageUtils page = discusskechengxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discusskechengxinxi), params), params)); + // 返回成功响应,并将分页查询结果放入响应数据中 return R.ok().put("data", page); } - /** + /** * 列表 + * 该方法用于查询课程信息评论列表,根据传入的实体对象构建查询条件 */ @RequestMapping("/lists") - public R list( DiscusskechengxinxiEntity discusskechengxinxi){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( discusskechengxinxi, "discusskechengxinxi")); + public R list(DiscusskechengxinxiEntity discusskechengxinxi) { + // 创建一个EntityWrapper对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,将实体对象的属性作为查询条件 + ew.allEq(MPUtil.allEQMapPre(discusskechengxinxi, "discusskechengxinxi")); + // 调用DiscusskechengxinxiService的selectListView方法查询列表数据 return R.ok().put("data", discusskechengxinxiService.selectListView(ew)); } - /** + /** * 查询 + * 该方法用于根据传入的实体对象查询单个课程信息评论视图 */ @RequestMapping("/query") - public R query(DiscusskechengxinxiEntity discusskechengxinxi){ - EntityWrapper< DiscusskechengxinxiEntity> ew = new EntityWrapper< DiscusskechengxinxiEntity>(); - ew.allEq(MPUtil.allEQMapPre( discusskechengxinxi, "discusskechengxinxi")); - DiscusskechengxinxiView discusskechengxinxiView = discusskechengxinxiService.selectView(ew); - return R.ok("查询课程信息评论表成功").put("data", discusskechengxinxiView); + public R query(DiscusskechengxinxiEntity discusskechengxinxi) { + // 创建一个EntityWrapper对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,将实体对象的属性作为查询条件 + ew.allEq(MPUtil.allEQMapPre(discusskechengxinxi, "discusskechengxinxi")); + // 调用DiscusskechengxinxiService的selectView方法查询单个视图数据 + DiscusskechengxinxiView discusskechengxinxiView = discusskechengxinxiService.selectView(ew); + // 返回成功响应,并将查询结果放入响应数据中 + return R.ok("查询课程信息评论表成功").put("data", discusskechengxinxiView); } - + /** * 后端详情 + * 该方法用于根据ID查询单个课程信息评论的详细信息 */ @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + public R info(@PathVariable("id") Long id) { + // 调用DiscusskechengxinxiService的selectById方法根据ID查询课程信息评论 DiscusskechengxinxiEntity discusskechengxinxi = discusskechengxinxiService.selectById(id); + // 返回成功响应,并将查询结果放入响应数据中 return R.ok().put("data", discusskechengxinxi); } /** * 前端详情 + * 该方法用于根据ID查询单个课程信息评论的详细信息 */ @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + public R detail(@PathVariable("id") Long id) { + // 调用DiscusskechengxinxiService的selectById方法根据ID查询课程信息评论 DiscusskechengxinxiEntity discusskechengxinxi = discusskechengxinxiService.selectById(id); + // 返回成功响应,并将查询结果放入响应数据中 return R.ok().put("data", discusskechengxinxi); } - - - /** * 后端保存 + * 该方法用于处理后端保存课程信息评论的请求 */ @RequestMapping("/save") - public R save(@RequestBody DiscusskechengxinxiEntity discusskechengxinxi, HttpServletRequest request){ - discusskechengxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(discusskechengxinxi); + public R save(@RequestBody DiscusskechengxinxiEntity discusskechengxinxi, HttpServletRequest request) { + // 为课程信息评论生成一个唯一的ID,使用当前时间戳加上一个随机数 + discusskechengxinxi.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码,原本用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(discusskechengxinxi); + // 调用DiscusskechengxinxiService的insert方法将课程信息评论插入到数据库中 discusskechengxinxiService.insert(discusskechengxinxi); + // 返回成功响应 return R.ok(); } - + /** * 前端保存 + * 该方法用于处理前端保存课程信息评论的请求 */ @RequestMapping("/add") - public R add(@RequestBody DiscusskechengxinxiEntity discusskechengxinxi, HttpServletRequest request){ - discusskechengxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(discusskechengxinxi); + public R add(@RequestBody DiscusskechengxinxiEntity discusskechengxinxi, HttpServletRequest request) { + // 为课程信息评论生成一个唯一的ID,使用当前时间戳加上一个随机数 + discusskechengxinxi.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码,原本用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(discusskechengxinxi); + // 调用DiscusskechengxinxiService的insert方法将课程信息评论插入到数据库中 discusskechengxinxiService.insert(discusskechengxinxi); + // 返回成功响应 return R.ok(); } /** * 修改 + * 该方法用于处理更新课程信息评论的请求 */ @RequestMapping("/update") - public R update(@RequestBody DiscusskechengxinxiEntity discusskechengxinxi, HttpServletRequest request){ + public R update(@RequestBody DiscusskechengxinxiEntity discusskechengxinxi, HttpServletRequest request) { + // 注释掉的代码,原本用于验证实体对象的合法性 //ValidatorUtils.validateEntity(discusskechengxinxi); - discusskechengxinxiService.updateById(discusskechengxinxi);//全部更新 + // 调用DiscusskechengxinxiService的updateById方法根据ID更新课程信息评论的所有字段 + discusskechengxinxiService.updateById(discusskechengxinxi); + // 返回成功响应 return R.ok(); } - /** * 删除 + * 该方法用于处理批量删除课程信息评论的请求 */ @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + public R delete(@RequestBody Long[] ids) { + // 调用DiscusskechengxinxiService的deleteBatchIds方法根据ID数组批量删除课程信息评论 discusskechengxinxiService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** * 提醒接口 + * 该方法用于统计符合提醒条件的课程信息评论数量 */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - - int count = discusskechengxinxiService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + @RequestMapping("/remind/{columnName}/{type}") + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名和类型放入请求参数映射中 + map.put("column", columnName); + map.put("type", type); + + // 如果类型为2,表示日期类型的提醒 + if (type.equals("2")) { + // 创建一个日期格式化对象,用于将日期对象格式化为指定格式的字符串 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建一个日历对象,用于进行日期的计算和操作 + Calendar c = Calendar.getInstance(); + // 提醒开始日期 + Date remindStartDate = null; + // 提醒结束日期 + Date remindEndDate = null; + // 如果请求参数中包含提醒开始时间 + if (map.get("remindstart") != null) { + // 将提醒开始时间转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历对象的时间为当前时间 + c.setTime(new Date()); + // 在当前时间基础上增加指定的天数 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取增加天数后的日期 + remindStartDate = c.getTime(); + // 将提醒开始日期格式化为字符串并放入请求参数映射中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数中包含提醒结束时间 + if (map.get("remindend") != null) { + // 将提醒结束时间转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历对象的时间为当前时间 + c.setTime(new Date()); + // 在当前时间基础上增加指定的天数 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取增加天数后的日期 + remindEndDate = c.getTime(); + // 将提醒结束日期格式化为字符串并放入请求参数映射中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个EntityWrapper对象,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数中包含提醒开始时间 + if (map.get("remindstart") != null) { + // 设置查询条件,列名大于等于提醒开始时间 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数中包含提醒结束时间 + if (map.get("remindend") != null) { + // 设置查询条件,列名小于等于提醒结束时间 + wrapper.le(columnName, map.get("remindend")); + } + + // 调用DiscusskechengxinxiService的selectCount方法统计符合条件的记录数量 + int count = discusskechengxinxiService.selectCount(wrapper); + // 返回成功响应,并将统计结果放入响应数据中 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/ExampaperController.java b/src/main/java/com/controller/ExampaperController.java index b1c75a3..4731ab5 100644 --- a/src/main/java/com/controller/ExampaperController.java +++ b/src/main/java/com/controller/ExampaperController.java @@ -1,206 +1,295 @@ +// 声明该类所在的包 package com.controller; +// 导入用于格式化日期的类,可将日期对象按指定格式转换为字符串 import java.text.SimpleDateFormat; +// 导入动态数组类,可动态调整大小来存储多个元素 import java.util.ArrayList; +// 导入用于操作数组的工具类,提供排序、查找等数组操作方法 import java.util.Arrays; +// 导入日历类,用于处理日期和时间,可进行日期计算和转换 import java.util.Calendar; +// 导入映射接口,用于存储键值对,方便通过键快速查找对应值 import java.util.Map; +// 导入哈希映射类,是Map接口的实现类,使用哈希表存储键值对 import java.util.HashMap; +// 导入迭代器接口,用于遍历集合中的元素 import java.util.Iterator; +// 导入日期类,用于表示特定的瞬间 import java.util.Date; +// 导入列表接口,是有序集合,可存储重复元素 import java.util.List; +// 导入用于处理HTTP请求的类,可获取请求的参数、头信息等 import javax.servlet.http.HttpServletRequest; +// 导入自定义的验证工具类,用于验证实体对象属性是否符合要求 import com.utils.ValidatorUtils; +// 导入Apache Commons Lang库中的字符串工具类,提供丰富的字符串处理方法 import org.apache.commons.lang3.StringUtils; +// 导入Spring框架的自动装配注解,用于将依赖对象自动注入当前类 import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring框架的日期格式化注解,可将请求参数中的日期字符串按指定格式转换为日期对象 import org.springframework.format.annotation.DateTimeFormat; +// 导入Spring框架的路径变量注解,用于从URL路径中提取参数 import org.springframework.web.bind.annotation.PathVariable; +// 导入Spring框架的请求体注解,用于将请求体中的数据绑定到方法参数上 import org.springframework.web.bind.annotation.RequestBody; +// 导入Spring框架的请求映射注解,用于将HTTP请求映射到对应的处理方法 import org.springframework.web.bind.annotation.RequestMapping; +// 导入Spring框架的请求参数注解,用于从请求中获取参数 import org.springframework.web.bind.annotation.RequestParam; +// 导入Spring框架的REST控制器注解,表明该类是RESTful风格的控制器 import org.springframework.web.bind.annotation.RestController; +// 导入MyBatis-Plus的实体包装器类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入MyBatis-Plus的包装器接口,是EntityWrapper的父接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解,用于标记某些接口不需要认证 import com.annotation.IgnoreAuth; +// 导入试卷实体类,用于表示试卷的数据结构 import com.entity.ExampaperEntity; +// 导入试卷视图类,可能用于展示试卷的特定视图 import com.entity.view.ExampaperView; +// 导入试卷服务类,用于处理试卷的业务逻辑 import com.service.ExampaperService; +// 导入令牌服务类,可能用于处理用户认证和授权相关的令牌 import com.service.TokenService; +// 导入自定义的分页工具类,用于处理分页查询结果 import com.utils.PageUtils; +// 导入自定义的响应结果类,用于封装接口的返回数据,统一返回格式 import com.utils.R; +// 导入自定义的MD5工具类,用于进行MD5加密操作 import com.utils.MD5Util; +// 导入自定义的MyBatis-Plus工具类,提供方便使用MyBatis-Plus的方法 import com.utils.MPUtil; +// 导入自定义的通用工具类,包含一些通用的工具方法 import com.utils.CommonUtil; - /** * 试卷表 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:15 */ +// 声明该类为RESTful风格的控制器 @RestController +// 定义该控制器处理的请求路径前缀 @RequestMapping("/exampaper") public class ExampaperController { + // 使用自动装配将ExampaperService注入到当前类中 @Autowired private ExampaperService exampaperService; - - /** * 后端列表 + * 处理后端分页查询试卷列表的请求 */ @RequestMapping("/page") - public R page(@RequestParam Map params,ExampaperEntity exampaper, - HttpServletRequest request){ + public R page(@RequestParam Map params, ExampaperEntity exampaper, + HttpServletRequest request) { + // 创建一个EntityWrapper对象,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = exampaperService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, exampaper), params), params)); - + // 调用ExampaperService的queryPage方法进行分页查询,同时对查询条件进行排序、范围和模糊查询等处理 + PageUtils page = exampaperService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, exampaper), params), params)); + // 返回成功响应,并将分页查询结果放入响应数据中 return R.ok().put("data", page); } - + /** * 前端列表 + * 处理前端分页查询试卷列表的请求 */ @RequestMapping("/list") - public R list(@RequestParam Map params,ExampaperEntity exampaper, - HttpServletRequest request){ + public R list(@RequestParam Map params, ExampaperEntity exampaper, + HttpServletRequest request) { + // 创建一个EntityWrapper对象,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = exampaperService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, exampaper), params), params)); + // 调用ExampaperService的queryPage方法进行分页查询,同时对查询条件进行排序、范围和模糊查询等处理 + PageUtils page = exampaperService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, exampaper), params), params)); + // 返回成功响应,并将分页查询结果放入响应数据中 return R.ok().put("data", page); } - /** + /** * 列表 + * 根据传入的试卷实体对象构建查询条件,查询试卷列表 */ @RequestMapping("/lists") - public R list( ExampaperEntity exampaper){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( exampaper, "exampaper")); + public R list(ExampaperEntity exampaper) { + // 创建一个EntityWrapper对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,将实体对象的属性作为查询条件 + ew.allEq(MPUtil.allEQMapPre(exampaper, "exampaper")); + // 调用ExampaperService的selectListView方法查询列表数据 return R.ok().put("data", exampaperService.selectListView(ew)); } - /** + /** * 查询 + * 根据传入的试卷实体对象构建查询条件,查询单个试卷视图 */ @RequestMapping("/query") - public R query(ExampaperEntity exampaper){ - EntityWrapper< ExampaperEntity> ew = new EntityWrapper< ExampaperEntity>(); - ew.allEq(MPUtil.allEQMapPre( exampaper, "exampaper")); - ExampaperView exampaperView = exampaperService.selectView(ew); - return R.ok("查询试卷表成功").put("data", exampaperView); + public R query(ExampaperEntity exampaper) { + // 创建一个EntityWrapper对象,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,将实体对象的属性作为查询条件 + ew.allEq(MPUtil.allEQMapPre(exampaper, "exampaper")); + // 调用ExampaperService的selectView方法查询单个视图数据 + ExampaperView exampaperView = exampaperService.selectView(ew); + // 返回成功响应,并将查询结果放入响应数据中 + return R.ok("查询试卷表成功").put("data", exampaperView); } - + /** * 后端详情 + * 根据ID查询单个试卷的详细信息 */ @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + public R info(@PathVariable("id") Long id) { + // 调用ExampaperService的selectById方法根据ID查询试卷信息 ExampaperEntity exampaper = exampaperService.selectById(id); + // 返回成功响应,并将查询结果放入响应数据中 return R.ok().put("data", exampaper); } /** * 前端详情 + * 根据ID查询单个试卷的详细信息 */ @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + public R detail(@PathVariable("id") Long id) { + // 调用ExampaperService的selectById方法根据ID查询试卷信息 ExampaperEntity exampaper = exampaperService.selectById(id); + // 返回成功响应,并将查询结果放入响应数据中 return R.ok().put("data", exampaper); } - - - /** * 后端保存 + * 处理后端保存试卷的请求 */ @RequestMapping("/save") - public R save(@RequestBody ExampaperEntity exampaper, HttpServletRequest request){ - exampaper.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(exampaper); + public R save(@RequestBody ExampaperEntity exampaper, HttpServletRequest request) { + // 为试卷生成一个唯一的ID,使用当前时间戳加上一个随机数 + exampaper.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码,原本用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(exampaper); + // 调用ExampaperService的insert方法将试卷信息插入到数据库中 exampaperService.insert(exampaper); + // 返回成功响应 return R.ok(); } - + /** * 前端保存 + * 处理前端保存试卷的请求 */ @RequestMapping("/add") - public R add(@RequestBody ExampaperEntity exampaper, HttpServletRequest request){ - exampaper.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(exampaper); + public R add(@RequestBody ExampaperEntity exampaper, HttpServletRequest request) { + // 为试卷生成一个唯一的ID,使用当前时间戳加上一个随机数 + exampaper.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释掉的代码,原本用于验证实体对象的合法性 + //ValidatorUtils.validateEntity(exampaper); + // 调用ExampaperService的insert方法将试卷信息插入到数据库中 exampaperService.insert(exampaper); + // 返回成功响应 return R.ok(); } /** * 修改 + * 处理更新试卷信息的请求 */ @RequestMapping("/update") - public R update(@RequestBody ExampaperEntity exampaper, HttpServletRequest request){ + public R update(@RequestBody ExampaperEntity exampaper, HttpServletRequest request) { + // 注释掉的代码,原本用于验证实体对象的合法性 //ValidatorUtils.validateEntity(exampaper); - exampaperService.updateById(exampaper);//全部更新 + // 调用ExampaperService的updateById方法根据ID更新试卷信息的所有字段 + exampaperService.updateById(exampaper); + // 返回成功响应 return R.ok(); } - /** * 删除 + * 处理批量删除试卷的请求 */ @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + public R delete(@RequestBody Long[] ids) { + // 调用ExampaperService的deleteBatchIds方法根据ID数组批量删除试卷信息 exampaperService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** * 提醒接口 + * 统计符合提醒条件的试卷数量 */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - - int count = exampaperService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + @RequestMapping("/remind/{columnName}/{type}") + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名和类型放入请求参数映射中 + map.put("column", columnName); + map.put("type", type); + + // 如果类型为2,表示日期类型的提醒 + if (type.equals("2")) { + // 创建一个日期格式化对象,用于将日期对象格式化为指定格式的字符串 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建一个日历对象,用于进行日期的计算和操作 + Calendar c = Calendar.getInstance(); + // 提醒开始日期 + Date remindStartDate = null; + // 提醒结束日期 + Date remindEndDate = null; + // 如果请求参数中包含提醒开始时间 + if (map.get("remindstart") != null) { + // 将提醒开始时间转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历对象的时间为当前时间 + c.setTime(new Date()); + // 在当前时间基础上增加指定的天数 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取增加天数后的日期 + remindStartDate = c.getTime(); + // 将提醒开始日期格式化为字符串并放入请求参数映射中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数中包含提醒结束时间 + if (map.get("remindend") != null) { + // 将提醒结束时间转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历对象的时间为当前时间 + c.setTime(new Date()); + // 在当前时间基础上增加指定的天数 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取增加天数后的日期 + remindEndDate = c.getTime(); + // 将提醒结束日期格式化为字符串并放入请求参数映射中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个EntityWrapper对象,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数中包含提醒开始时间 + if (map.get("remindstart") != null) { + // 设置查询条件,列名大于等于提醒开始时间 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数中包含提醒结束时间 + if (map.get("remindend") != null) { + // 设置查询条件,列名小于等于提醒结束时间 + wrapper.le(columnName, map.get("remindend")); + } + + // 调用ExampaperService的selectCount方法统计符合条件的记录数量 + int count = exampaperService.selectCount(wrapper); + // 返回成功响应,并将统计结果放入响应数据中 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/ExamquestionController.java b/src/main/java/com/controller/ExamquestionController.java index a8b8e03..90f09fb 100644 --- a/src/main/java/com/controller/ExamquestionController.java +++ b/src/main/java/com/controller/ExamquestionController.java @@ -1,206 +1,315 @@ package com.controller; +// 导入用于格式化日期的类 import java.text.SimpleDateFormat; +// 导入用于创建和操作动态数组的类 import java.util.ArrayList; +// 导入用于操作数组的工具类 import java.util.Arrays; +// 导入用于处理日期和时间的类 import java.util.Calendar; +// 导入用于表示键值对映射的接口 import java.util.Map; +// 导入用于实现 Map 接口的类 import java.util.HashMap; +// 导入用于遍历集合的迭代器接口 import java.util.Iterator; +// 导入用于表示日期的类 import java.util.Date; +// 导入用于表示列表的接口 import java.util.List; +// 导入用于处理 HTTP 请求的类 import javax.servlet.http.HttpServletRequest; +// 导入自定义的验证工具类 import com.utils.ValidatorUtils; +// 导入 Apache Commons Lang 库中的字符串处理工具类 import org.apache.commons.lang3.StringUtils; +// 导入 Spring 框架中的自动注入注解 import org.springframework.beans.factory.annotation.Autowired; +// 导入 Spring 框架中用于日期格式化的注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入 Spring 框架中用于处理路径变量的注解 import org.springframework.web.bind.annotation.PathVariable; +// 导入 Spring 框架中用于处理请求体的注解 import org.springframework.web.bind.annotation.RequestBody; +// 导入 Spring 框架中用于处理请求映射的注解 import org.springframework.web.bind.annotation.RequestMapping; +// 导入 Spring 框架中用于处理请求参数的注解 import org.springframework.web.bind.annotation.RequestParam; +// 导入 Spring 框架中用于将类标记为 RESTful 控制器的注解 import org.springframework.web.bind.annotation.RestController; +// 导入 MyBatis-Plus 框架中用于构建查询条件的实体包装器类 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 框架中用于构建查询条件的包装器接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解 import com.annotation.IgnoreAuth; +// 导入试题实体类 import com.entity.ExamquestionEntity; +// 导入试题视图类 import com.entity.view.ExamquestionView; +// 导入试题服务类 import com.service.ExamquestionService; +// 导入令牌服务类 import com.service.TokenService; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的返回结果工具类 import com.utils.R; +// 导入自定义的 MD5 加密工具类 import com.utils.MD5Util; +// 导入自定义的 MyBatis-Plus 工具类 import com.utils.MPUtil; +// 导入自定义的通用工具类 import com.utils.CommonUtil; /** * 试题表 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:15 */ +// 将该类标记为 RESTful 控制器,用于处理 HTTP 请求 @RestController +// 定义该控制器处理的请求路径前缀 @RequestMapping("/examquestion") public class ExamquestionController { + // 自动注入试题服务类的实例 @Autowired private ExamquestionService examquestionService; - + /** * 后端列表 */ + // 处理 /examquestion/page 路径的请求 @RequestMapping("/page") + // 该方法用于获取试题的分页列表 public R page(@RequestParam Map params,ExamquestionEntity examquestion, - HttpServletRequest request){ + HttpServletRequest request){ + // 创建一个用于构建查询条件的实体包装器 EntityWrapper ew = new EntityWrapper(); - PageUtils page = examquestionService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, examquestion), params), params)); + // 调用试题服务类的 queryPage 方法进行分页查询 + PageUtils page = examquestionService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, examquestion), params), params)); - return R.ok().put("data", page); + // 返回成功响应,并将分页数据放入响应结果中 + return R.ok().put("data", page);//测试 } - + /** * 前端列表 */ + // 处理 /examquestion/list 路径的请求 @RequestMapping("/list") - public R list(@RequestParam Map params,ExamquestionEntity examquestion, - HttpServletRequest request){ + // 该方法用于获取试题的分页列表(前端使用) + public R list(@RequestParam Map params,ExamquestionEntity examquestion, + HttpServletRequest request){ + // 创建一个用于构建查询条件的实体包装器 EntityWrapper ew = new EntityWrapper(); - PageUtils page = examquestionService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, examquestion), params), params)); + // 调用试题服务类的 queryPage 方法进行分页查询 + PageUtils page = examquestionService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, examquestion), params), params)); + // 返回成功响应,并将分页数据放入响应结果中 return R.ok().put("data", page); } - /** + /** * 列表 */ + // 处理 /examquestion/lists 路径的请求 @RequestMapping("/lists") + // 该方法用于获取试题列表 public R list( ExamquestionEntity examquestion){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( examquestion, "examquestion")); + // 创建一个用于构建查询条件的实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件为所有字段相等 + ew.allEq(MPUtil.allEQMapPre( examquestion, "examquestion")); + // 返回成功响应,并将查询到的试题列表放入响应结果中 return R.ok().put("data", examquestionService.selectListView(ew)); } - /** + /** * 查询 */ + // 处理 /examquestion/query 路径的请求 @RequestMapping("/query") + // 该方法用于查询单个试题信息 public R query(ExamquestionEntity examquestion){ + // 创建一个用于构建查询条件的实体包装器 EntityWrapper< ExamquestionEntity> ew = new EntityWrapper< ExamquestionEntity>(); - ew.allEq(MPUtil.allEQMapPre( examquestion, "examquestion")); - ExamquestionView examquestionView = examquestionService.selectView(ew); - return R.ok("查询试题表成功").put("data", examquestionView); + // 设置查询条件为所有字段相等 + ew.allEq(MPUtil.allEQMapPre( examquestion, "examquestion")); + // 调用试题服务类的 selectView 方法查询单个试题信息 + ExamquestionView examquestionView = examquestionService.selectView(ew); + // 返回成功响应,并将查询到的试题信息放入响应结果中 + return R.ok("查询试题表成功").put("data", examquestionView); } - + /** * 后端详情 */ + // 处理 /examquestion/info/{id} 路径的请求,{id} 为路径变量 @RequestMapping("/info/{id}") + // 该方法用于获取单个试题的详细信息 public R info(@PathVariable("id") Long id){ + // 调用试题服务类的 selectById 方法根据 ID 查询试题信息 ExamquestionEntity examquestion = examquestionService.selectById(id); + // 返回成功响应,并将查询到的试题信息放入响应结果中 return R.ok().put("data", examquestion); } /** * 前端详情 */ + // 处理 /examquestion/detail/{id} 路径的请求,{id} 为路径变量 @RequestMapping("/detail/{id}") + // 该方法用于获取单个试题的详细信息(前端使用) public R detail(@PathVariable("id") Long id){ + // 调用试题服务类的 selectById 方法根据 ID 查询试题信息 ExamquestionEntity examquestion = examquestionService.selectById(id); + // 返回成功响应,并将查询到的试题信息放入响应结果中 return R.ok().put("data", examquestion); } - + /** * 后端保存 */ + // 处理 /examquestion/save 路径的 POST 请求 @RequestMapping("/save") + // 该方法用于保存新的试题信息 public R save(@RequestBody ExamquestionEntity examquestion, HttpServletRequest request){ - examquestion.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(examquestion); + // 为试题设置一个唯一的 ID,由当前时间戳加上一个随机数组成 + examquestion.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); + // 暂时注释掉实体验证逻辑 + //ValidatorUtils.validateEntity(examquestion); + // 调用试题服务类的 insert 方法将试题信息插入数据库 examquestionService.insert(examquestion); + // 返回成功响应 return R.ok(); } - + /** * 前端保存 */ + // 处理 /examquestion/add 路径的 POST 请求 @RequestMapping("/add") + // 该方法用于保存新的试题信息(前端使用) public R add(@RequestBody ExamquestionEntity examquestion, HttpServletRequest request){ - examquestion.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(examquestion); + // 为试题设置一个唯一的 ID,由当前时间戳加上一个随机数组成 + examquestion.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); + // 暂时注释掉实体验证逻辑 + //ValidatorUtils.validateEntity(examquestion); + // 调用试题服务类的 insert 方法将试题信息插入数据库 examquestionService.insert(examquestion); + // 返回成功响应 return R.ok(); } /** * 修改 */ + // 处理 /examquestion/update 路径的 POST 请求 @RequestMapping("/update") + // 该方法用于更新试题信息 public R update(@RequestBody ExamquestionEntity examquestion, HttpServletRequest request){ + // 暂时注释掉实体验证逻辑 //ValidatorUtils.validateEntity(examquestion); + // 调用试题服务类的 updateById 方法根据 ID 更新试题信息 examquestionService.updateById(examquestion);//全部更新 + // 返回成功响应 return R.ok(); } - + /** * 删除 */ + // 处理 /examquestion/delete 路径的 POST 请求 @RequestMapping("/delete") + // 该方法用于批量删除试题信息 public R delete(@RequestBody Long[] ids){ + // 调用试题服务类的 deleteBatchIds 方法根据 ID 批量删除试题信息 examquestionService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** * 提醒接口 */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - - int count = examquestionService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + // 处理 /examquestion/remind/{columnName}/{type} 路径的请求,{columnName} 和 {type} 为路径变量 + @RequestMapping("/remind/{columnName}/{type}") + // 该方法用于统计符合提醒条件的试题数量 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type,@RequestParam Map map) { + // 将列名和提醒类型放入请求参数中 + map.put("column", columnName); + map.put("type", type); + + // 如果提醒类型为 2 + if(type.equals("2")) { + // 创建一个用于格式化日期的对象 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建一个 Calendar 实例用于处理日期 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期和结束日期 + Date remindStartDate = null; + Date remindEndDate = null; + // 如果请求参数中包含提醒开始时间 + if(map.get("remindstart")!=null) { + // 将提醒开始时间转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置 Calendar 的时间为当前时间 + c.setTime(new Date()); + // 在当前时间基础上加上提醒开始时间的天数 + c.add(Calendar.DAY_OF_MONTH,remindStart); + // 获取提醒开始日期 + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期放入请求参数中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果请求参数中包含提醒结束时间 + if(map.get("remindend")!=null) { + // 将提醒结束时间转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置 Calendar 的时间为当前时间 + c.setTime(new Date()); + // 在当前时间基础上加上提醒结束时间的天数 + c.add(Calendar.DAY_OF_MONTH,remindEnd); + // 获取提醒结束日期 + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期放入请求参数中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个用于构建查询条件的包装器 + Wrapper wrapper = new EntityWrapper(); + // 如果请求参数中包含提醒开始时间 + if(map.get("remindstart")!=null) { + // 设置查询条件为列值大于等于提醒开始时间 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果请求参数中包含提醒结束时间 + if(map.get("remindend")!=null) { + // 设置查询条件为列值小于等于提醒结束时间 + wrapper.le(columnName, map.get("remindend")); + } + + + // 调用试题服务类的 selectCount 方法统计符合条件的试题数量 + int count = examquestionService.selectCount(wrapper); + // 返回成功响应,并将统计结果放入响应结果中 + return R.ok().put("count", count); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/controller/ExamrecordController.java b/src/main/java/com/controller/ExamrecordController.java index 1b8174b..15169c2 100644 --- a/src/main/java/com/controller/ExamrecordController.java +++ b/src/main/java/com/controller/ExamrecordController.java @@ -1,238 +1,369 @@ package com.controller; +// 导入用于格式化日期的类 import java.text.SimpleDateFormat; +// 导入 ArrayList 类,用于创建动态数组 import java.util.ArrayList; +// 导入 Arrays 类,用于操作数组 import java.util.Arrays; +// 导入 Calendar 类,用于处理日期和时间 import java.util.Calendar; +// 导入 Map 接口,用于存储键值对 import java.util.Map; +// 导入 HashMap 类,实现了 Map 接口 import java.util.HashMap; +// 导入 Iterator 接口,用于遍历集合 import java.util.Iterator; +// 导入 Date 类,用于表示日期和时间 import java.util.Date; +// 导入 List 接口,用于创建列表 import java.util.List; +// 导入 HttpServletRequest 类,用于处理 HTTP 请求 import javax.servlet.http.HttpServletRequest; +// 导入验证工具类 import com.utils.ValidatorUtils; +// 导入 Apache Commons Lang 库中的 StringUtils 类,用于处理字符串 import org.apache.commons.lang3.StringUtils; +// 导入 Spring 框架的自动注入注解 import org.springframework.beans.factory.annotation.Autowired; +// 导入 Spring 框架的日期格式化注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入 Spring 框架的路径变量注解 import org.springframework.web.bind.annotation.PathVariable; +// 导入 Spring 框架的请求体注解 import org.springframework.web.bind.annotation.RequestBody; +// 导入 Spring 框架的请求映射注解 import org.springframework.web.bind.annotation.RequestMapping; +// 导入 Spring 框架的请求参数注解 import org.springframework.web.bind.annotation.RequestParam; +// 导入 Spring 框架的 REST 控制器注解 import org.springframework.web.bind.annotation.RestController; +// 导入 MyBatis-Plus 的实体包装器类 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的包装器接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解 import com.annotation.IgnoreAuth; +// 导入考试记录实体类 import com.entity.ExamrecordEntity; +// 导入考试记录视图类 import com.entity.view.ExamrecordView; +// 导入考试记录服务类 import com.service.ExamrecordService; +// 导入令牌服务类 import com.service.TokenService; +// 导入分页工具类 import com.utils.PageUtils; +// 导入自定义的响应类 import com.utils.R; +// 导入 MD5 加密工具类 import com.utils.MD5Util; +// 导入 MyBatis-Plus 工具类 import com.utils.MPUtil; +// 导入通用工具类 import com.utils.CommonUtil; /** * 考试记录表 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:15 */ +// 声明为 REST 控制器,用于处理 HTTP 请求 @RestController +// 映射请求路径,所有以 /examrecord 开头的请求都会被该控制器处理 @RequestMapping("/examrecord") public class ExamrecordController { + // 自动注入考试记录服务类的实例 @Autowired private ExamrecordService examrecordService; - - /** + + /** * 考试记录接口 */ + // 映射请求路径 /examrecord/groupby @RequestMapping("/groupby") + // 处理分组查询请求 public R page2(@RequestParam Map params,ExamrecordEntity examrecord, HttpServletRequest request){ - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - examrecord.setUserid((Long)request.getSession().getAttribute("userId")); - } + // 如果当前用户不是管理员 + if(!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置考试记录的用户 ID 为当前用户的 ID + examrecord.setUserid((Long)request.getSession().getAttribute("userId")); + } + // 创建一个实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = examrecordService.queryPageGroupBy(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, examrecord), params), params)); + // 调用考试记录服务类的查询分页分组方法 + PageUtils page = examrecordService.queryPageGroupBy(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, examrecord), params), params)); + // 返回成功响应,并将分页数据放入响应中 return R.ok().put("data", page); } /** * 后端列表 */ + // 映射请求路径 /examrecord/page @RequestMapping("/page") + // 处理后端分页查询请求 public R page(@RequestParam Map params,ExamrecordEntity examrecord, - HttpServletRequest request){ - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - examrecord.setUserid((Long)request.getSession().getAttribute("userId")); - } + HttpServletRequest request){ + // 如果当前用户不是管理员 + if(!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置考试记录的用户 ID 为当前用户的 ID + examrecord.setUserid((Long)request.getSession().getAttribute("userId")); + } + // 创建一个实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = examrecordService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, examrecord), params), params)); + // 调用考试记录服务类的查询分页方法 + PageUtils page = examrecordService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, examrecord), params), params)); + // 返回成功响应,并将分页数据放入响应中 return R.ok().put("data", page); } - + /** * 前端列表 */ + // 映射请求路径 /examrecord/list @RequestMapping("/list") - public R list(@RequestParam Map params,ExamrecordEntity examrecord, - HttpServletRequest request){ - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - examrecord.setUserid((Long)request.getSession().getAttribute("userId")); - } + // 处理前端分页查询请求 + public R list(@RequestParam Map params,ExamrecordEntity examrecord, + HttpServletRequest request){ + // 如果当前用户不是管理员 + if(!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置考试记录的用户 ID 为当前用户的 ID + examrecord.setUserid((Long)request.getSession().getAttribute("userId")); + } + // 创建一个实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = examrecordService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, examrecord), params), params)); + // 调用考试记录服务类的查询分页方法 + PageUtils page = examrecordService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, examrecord), params), params)); + // 返回成功响应,并将分页数据放入响应中 return R.ok().put("data", page); } - /** + /** * 列表 */ + // 映射请求路径 /examrecord/lists @RequestMapping("/lists") + // 处理列表查询请求 public R list( ExamrecordEntity examrecord){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( examrecord, "examrecord")); + // 创建一个实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,所有字段相等 + ew.allEq(MPUtil.allEQMapPre( examrecord, "examrecord")); + // 返回成功响应,并将查询结果放入响应中 return R.ok().put("data", examrecordService.selectListView(ew)); } - /** + /** * 查询 */ + // 映射请求路径 /examrecord/query @RequestMapping("/query") + // 处理查询请求 public R query(ExamrecordEntity examrecord){ + // 创建一个实体包装器,用于构建查询条件 EntityWrapper< ExamrecordEntity> ew = new EntityWrapper< ExamrecordEntity>(); - ew.allEq(MPUtil.allEQMapPre( examrecord, "examrecord")); - ExamrecordView examrecordView = examrecordService.selectView(ew); - return R.ok("查询考试记录表成功").put("data", examrecordView); + // 设置查询条件,所有字段相等 + ew.allEq(MPUtil.allEQMapPre( examrecord, "examrecord")); + // 调用考试记录服务类的查询视图方法 + ExamrecordView examrecordView = examrecordService.selectView(ew); + // 返回成功响应,并将查询结果放入响应中 + return R.ok("查询考试记录表成功").put("data", examrecordView); } - + /** * 后端详情 */ + // 映射请求路径 /examrecord/info/{id} @RequestMapping("/info/{id}") + // 处理后端详情查询请求 public R info(@PathVariable("id") Long id){ + // 根据 ID 查询考试记录实体 ExamrecordEntity examrecord = examrecordService.selectById(id); + // 返回成功响应,并将查询结果放入响应中 return R.ok().put("data", examrecord); } /** * 前端详情 */ + // 映射请求路径 /examrecord/detail/{id} @RequestMapping("/detail/{id}") + // 处理前端详情查询请求 public R detail(@PathVariable("id") Long id){ + // 根据 ID 查询考试记录实体 ExamrecordEntity examrecord = examrecordService.selectById(id); + // 返回成功响应,并将查询结果放入响应中 return R.ok().put("data", examrecord); } - + /** * 后端保存 */ + // 映射请求路径 /examrecord/save @RequestMapping("/save") + // 处理后端保存请求 public R save(@RequestBody ExamrecordEntity examrecord, HttpServletRequest request){ - examrecord.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(examrecord); - examrecord.setUserid((Long)request.getSession().getAttribute("userId")); + // 生成一个唯一的 ID + examrecord.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); + // 验证实体(注释掉,未启用) + //ValidatorUtils.validateEntity(examrecord); + // 设置考试记录的用户 ID 为当前用户的 ID + examrecord.setUserid((Long)request.getSession().getAttribute("userId")); + // 调用考试记录服务类的插入方法 examrecordService.insert(examrecord); + // 返回成功响应 return R.ok(); } - + /** * 前端保存 */ + // 映射请求路径 /examrecord/add @RequestMapping("/add") + // 处理前端保存请求 public R add(@RequestBody ExamrecordEntity examrecord, HttpServletRequest request){ - examrecord.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(examrecord); - examrecord.setUserid((Long)request.getSession().getAttribute("userId")); + // 生成一个唯一的 ID + examrecord.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); + // 验证实体(注释掉,未启用) + //ValidatorUtils.validateEntity(examrecord); + // 设置考试记录的用户 ID 为当前用户的 ID + examrecord.setUserid((Long)request.getSession().getAttribute("userId")); + // 调用考试记录服务类的插入方法 examrecordService.insert(examrecord); + // 返回成功响应 return R.ok(); } /** * 修改 */ + // 映射请求路径 /examrecord/update @RequestMapping("/update") + // 处理修改请求 public R update(@RequestBody ExamrecordEntity examrecord, HttpServletRequest request){ + // 验证实体(注释掉,未启用) //ValidatorUtils.validateEntity(examrecord); + // 调用考试记录服务类的更新方法,更新所有字段 examrecordService.updateById(examrecord);//全部更新 + // 返回成功响应 return R.ok(); } - + /** * 删除 */ + // 映射请求路径 /examrecord/delete @RequestMapping("/delete") + // 处理删除请求 public R delete(@RequestBody Long[] ids){ + // 调用考试记录服务类的批量删除方法 examrecordService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** * 提醒接口 */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - wrapper.eq("userid", (Long)request.getSession().getAttribute("userId")); - } - - - int count = examrecordService.selectCount(wrapper); - return R.ok().put("count", count); - } - + // 映射请求路径 /examrecord/remind/{columnName}/{type} + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type,@RequestParam Map map) { + // 将列名放入参数映射中 + map.put("column", columnName); + // 将类型放入参数映射中 + map.put("type", type); + + // 如果类型为 2 + if(type.equals("2")) { + // 创建一个日期格式化对象 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建一个日历对象 + Calendar c = Calendar.getInstance(); + // 提醒开始日期 + Date remindStartDate = null; + // 提醒结束日期 + Date remindEndDate = null; + // 如果提醒开始参数不为空 + if(map.get("remindstart")!=null) { + // 将提醒开始参数转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历时间为当前时间 + c.setTime(new Date()); + // 在当前日期上加上提醒开始天数 + c.add(Calendar.DAY_OF_MONTH,remindStart); + // 获取提醒开始日期 + remindStartDate = c.getTime(); + // 将提醒开始日期格式化后放入参数映射中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果提醒结束参数不为空 + if(map.get("remindend")!=null) { + // 将提醒结束参数转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历时间为当前时间 + c.setTime(new Date()); + // 在当前日期上加上提醒结束天数 + c.add(Calendar.DAY_OF_MONTH,remindEnd); + // 获取提醒结束日期 + remindEndDate = c.getTime(); + // 将提醒结束日期格式化后放入参数映射中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个实体包装器,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果提醒开始参数不为空 + if(map.get("remindstart")!=null) { + // 设置查询条件,列名大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果提醒结束参数不为空 + if(map.get("remindend")!=null) { + // 设置查询条件,列名小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + // 如果当前用户不是管理员 + if(!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置查询条件,用户 ID 等于当前用户的 ID + wrapper.eq("userid", (Long)request.getSession().getAttribute("userId")); + } + + + // 调用考试记录服务类的统计方法,统计符合条件的记录数 + int count = examrecordService.selectCount(wrapper); + // 返回成功响应,并将统计结果放入响应中 + return R.ok().put("count", count); + } + /** * 当重新考试时,删除考生的某个试卷的所有考试记录 */ + // 映射请求路径 /examrecord/deleteRecords @RequestMapping("/deleteRecords") + // 处理删除指定考生指定试卷的所有考试记录请求 public R deleteRecords(@RequestParam Long userid,@RequestParam Long paperid){ - examrecordService.delete(new EntityWrapper().eq("paperid", paperid).eq("userid", userid)); + // 调用考试记录服务类的删除方法,根据用户 ID 和试卷 ID 删除记录 + examrecordService.delete(new EntityWrapper().eq("paperid", paperid).eq("userid", userid)); + // 返回成功响应 return R.ok(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/controller/FileController.java b/src/main/java/com/controller/FileController.java index 7bd4f8e..5413b81 100644 --- a/src/main/java/com/controller/FileController.java +++ b/src/main/java/com/controller/FileController.java @@ -1,110 +1,187 @@ +// 声明该类所在的包 package com.controller; +// 导入用于处理文件的类 import java.io.File; +// 导入文件未找到异常类 import java.io.FileNotFoundException; +// 导入输入输出异常类 import java.io.IOException; +// 导入数组操作工具类 import java.util.Arrays; +// 导入日期类 import java.util.Date; +// 导入哈希表实现类 import java.util.HashMap; +// 导入列表接口 import java.util.List; +// 导入映射接口 import java.util.Map; +// 导入随机数生成类 import java.util.Random; +// 导入通用唯一识别码类 import java.util.UUID; +// 导入 Apache Commons IO 库的文件工具类 import org.apache.commons.io.FileUtils; +// 导入 Apache Commons Lang 库的字符串工具类 import org.apache.commons.lang3.StringUtils; +// 导入 Spring 框架的自动注入注解 import org.springframework.beans.factory.annotation.Autowired; +// 导入 Spring 框架的 HTTP 头类 import org.springframework.http.HttpHeaders; +// 导入 Spring 框架的 HTTP 状态码类 import org.springframework.http.HttpStatus; +// 导入 Spring 框架的媒体类型类 import org.springframework.http.MediaType; +// 导入 Spring 框架的响应实体类 import org.springframework.http.ResponseEntity; +// 导入 Spring 框架的资源工具类 import org.springframework.util.ResourceUtils; +// 导入 Spring 框架的路径变量注解 import org.springframework.web.bind.annotation.PathVariable; +// 导入 Spring 框架的请求体注解 import org.springframework.web.bind.annotation.RequestBody; +// 导入 Spring 框架的请求映射注解 import org.springframework.web.bind.annotation.RequestMapping; +// 导入 Spring 框架的请求参数注解 import org.springframework.web.bind.annotation.RequestParam; +// 导入 Spring 框架的 REST 控制器注解 import org.springframework.web.bind.annotation.RestController; +// 导入 Spring 框架的文件上传类 import org.springframework.web.multipart.MultipartFile; +// 导入自定义的忽略认证注解 import com.annotation.IgnoreAuth; +// 导入 MyBatis-Plus 的实体包装器类 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入配置实体类 import com.entity.ConfigEntity; +// 导入自定义异常类 import com.entity.EIException; +// 导入配置服务类 import com.service.ConfigService; +// 导入自定义响应类 import com.utils.R; /** * 上传文件映射表 */ +// 声明为 REST 控制器,用于处理 HTTP 请求 @RestController +// 映射请求路径,所有以 /file 开头的请求都会被该控制器处理 @RequestMapping("file") +// 抑制未经检查的类型转换警告 @SuppressWarnings({"unchecked","rawtypes"}) +// 文件控制器类,处理文件上传和下载请求 public class FileController{ + // 自动注入配置服务类的实例 @Autowired - private ConfigService configService; + private ConfigService configService; /** * 上传文件 */ + // 映射请求路径 /file/upload @RequestMapping("/upload") + // 处理文件上传请求 public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception { + // 检查上传的文件是否为空 if (file.isEmpty()) { + // 若为空,抛出自定义异常 throw new EIException("上传文件不能为空"); } + // 获取文件扩展名 String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1); + // 获取类路径下 static 目录的文件对象 File path = new File(ResourceUtils.getURL("classpath:static").getPath()); + // 检查该目录是否存在 if(!path.exists()) { - path = new File(""); + // 若不存在,创建一个空文件对象 + path = new File(""); } + // 创建上传目录的文件对象 File upload = new File(path.getAbsolutePath(),"/upload/"); + // 检查上传目录是否存在 if(!upload.exists()) { - upload.mkdirs(); + // 若不存在,创建该目录及其父目录 + upload.mkdirs(); } + // 生成新的文件名,格式为时间戳加扩展名 String fileName = new Date().getTime()+"."+fileExt; + // 创建目标文件对象 File dest = new File(upload.getAbsolutePath()+"/"+fileName); + // 将上传的文件转移到目标文件 file.transferTo(dest); + // 检查类型参数是否不为空且等于 "1" if(StringUtils.isNotBlank(type) && type.equals("1")) { + // 根据配置名称查询配置实体 ConfigEntity configEntity = configService.selectOne(new EntityWrapper().eq("name", "faceFile")); + // 若配置实体不存在 if(configEntity==null) { + // 创建新的配置实体 configEntity = new ConfigEntity(); + // 设置配置名称 configEntity.setName("faceFile"); + // 设置配置值为文件名 configEntity.setValue(fileName); } else { + // 若配置实体存在,更新配置值为文件名 configEntity.setValue(fileName); } + // 插入或更新配置实体 configService.insertOrUpdate(configEntity); } + // 返回成功响应,并将文件名放入响应中 return R.ok().put("file", fileName); } - + /** * 下载文件 */ + // 该接口忽略认证 @IgnoreAuth + // 映射请求路径 /file/download @RequestMapping("/download") + // 处理文件下载请求 public ResponseEntity download(@RequestParam String fileName) { try { + // 获取类路径下 static 目录的文件对象 File path = new File(ResourceUtils.getURL("classpath:static").getPath()); + // 检查该目录是否存在 if(!path.exists()) { - path = new File(""); + // 若不存在,创建一个空文件对象 + path = new File(""); } + // 创建上传目录的文件对象 File upload = new File(path.getAbsolutePath(),"/upload/"); + // 检查上传目录是否存在 if(!upload.exists()) { - upload.mkdirs(); + // 若不存在,创建该目录及其父目录 + upload.mkdirs(); } + // 创建要下载的文件对象 File file = new File(upload.getAbsolutePath()+"/"+fileName); + // 检查文件是否存在 if(file.exists()){ - /*if(!fileService.canRead(file, SessionManager.getSessionUser())){ - getResponse().sendError(403); - }*/ + // 这里注释掉的代码是检查用户是否有读取文件的权限 + /*if(!fileService.canRead(file, SessionManager.getSessionUser())){ + getResponse().sendError(403); + }*/ + // 创建 HTTP 头对象 HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); - headers.setContentDispositionFormData("attachment", fileName); - return new ResponseEntity(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED); + // 设置内容类型为二进制流 + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + // 设置内容处置为附件,指定文件名 + headers.setContentDispositionFormData("attachment", fileName); + // 返回响应实体,包含文件内容、HTTP 头和 HTTP 状态码 + return new ResponseEntity(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED); } } catch (IOException e) { + // 捕获输入输出异常并打印堆栈跟踪信息 e.printStackTrace(); } + // 若出现异常或文件不存在,返回内部服务器错误响应 return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); } - -} + +} \ No newline at end of file diff --git a/src/main/java/com/controller/ForumController.java b/src/main/java/com/controller/ForumController.java index 8939709..87f13af 100644 --- a/src/main/java/com/controller/ForumController.java +++ b/src/main/java/com/controller/ForumController.java @@ -1,238 +1,363 @@ +// 声明该类所在的包 package com.controller; +// 导入用于格式化日期的类 import java.text.SimpleDateFormat; +// 导入用于创建动态数组的类 import java.util.ArrayList; +// 导入用于操作数组的工具类 import java.util.Arrays; +// 导入用于处理日期和时间的类 import java.util.Calendar; +// 导入用于存储键值对的接口 import java.util.Map; +// 导入 HashMap 类,用于实现 Map 接口 import java.util.HashMap; +// 导入用于遍历集合的接口 import java.util.Iterator; +// 导入用于表示日期和时间的类 import java.util.Date; +// 导入用于创建列表的接口 import java.util.List; +// 导入用于处理 HTTP 请求的类 import javax.servlet.http.HttpServletRequest; +// 导入自定义的验证工具类 import com.utils.ValidatorUtils; +// 导入 Apache Commons Lang 库中的字符串处理工具类 import org.apache.commons.lang3.StringUtils; +// 导入 Spring 框架的自动注入注解 import org.springframework.beans.factory.annotation.Autowired; +// 导入 Spring 框架的日期格式化注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入 Spring 框架的路径变量注解 import org.springframework.web.bind.annotation.PathVariable; +// 导入 Spring 框架的请求体注解 import org.springframework.web.bind.annotation.RequestBody; +// 导入 Spring 框架的请求映射注解 import org.springframework.web.bind.annotation.RequestMapping; +// 导入 Spring 框架的请求参数注解 import org.springframework.web.bind.annotation.RequestParam; +// 导入 Spring 框架的 REST 控制器注解 import org.springframework.web.bind.annotation.RestController; +// 导入 MyBatis-Plus 的实体包装器类 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的包装器接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解 import com.annotation.IgnoreAuth; +// 导入学习交流实体类 import com.entity.ForumEntity; +// 导入学习交流视图类 import com.entity.view.ForumView; +// 导入学习交流服务类 import com.service.ForumService; +// 导入令牌服务类 import com.service.TokenService; +// 导入分页工具类 import com.utils.PageUtils; +// 导入自定义的响应类 import com.utils.R; +// 导入 MD5 加密工具类 import com.utils.MD5Util; +// 导入 MyBatis-Plus 工具类 import com.utils.MPUtil; +// 导入通用工具类 import com.utils.CommonUtil; /** * 学习交流 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:15 */ +// 声明该类为 REST 控制器,用于处理 HTTP 请求 @RestController +// 映射请求路径,所有以 /forum 开头的请求都会由该控制器处理 @RequestMapping("/forum") public class ForumController { + // 自动注入学习交流服务类的实例 @Autowired private ForumService forumService; - /** * 后端列表 */ + // 映射请求路径 /forum/page @RequestMapping("/page") - public R page(@RequestParam Map params,ForumEntity forum, - HttpServletRequest request){ - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - forum.setUserid((Long)request.getSession().getAttribute("userId")); - } + // 处理后端分页查询学习交流列表的请求 + public R page(@RequestParam Map params, ForumEntity forum, + HttpServletRequest request) { + // 如果当前用户不是管理员 + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置学习交流的用户 ID 为当前用户的 ID + forum.setUserid((Long) request.getSession().getAttribute("userId")); + } + // 创建一个实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = forumService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, forum), params), params)); - + // 调用学习交流服务类的查询分页方法,进行排序、范围和模糊查询 + PageUtils page = forumService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, forum), params), params)); + // 返回成功响应,并将分页数据放入响应中 return R.ok().put("data", page); } - + /** * 前端列表 */ + // 映射请求路径 /forum/list @RequestMapping("/list") - public R list(@RequestParam Map params,ForumEntity forum, - HttpServletRequest request){ - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - forum.setUserid((Long)request.getSession().getAttribute("userId")); - } + // 处理前端分页查询学习交流列表的请求 + public R list(@RequestParam Map params, ForumEntity forum, + HttpServletRequest request) { + // 如果当前用户不是管理员 + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置学习交流的用户 ID 为当前用户的 ID + forum.setUserid((Long) request.getSession().getAttribute("userId")); + } + // 创建一个实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = forumService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, forum), params), params)); + // 调用学习交流服务类的查询分页方法,进行排序、范围和模糊查询 + PageUtils page = forumService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, forum), params), params)); + // 返回成功响应,并将分页数据放入响应中 return R.ok().put("data", page); } - /** + /** * 列表 */ + // 该接口忽略认证 @IgnoreAuth + // 映射请求路径 /forum/flist @RequestMapping("/flist") - public R flist(@RequestParam Map params,ForumEntity forum, HttpServletRequest request){ + // 处理查询学习交流列表的请求 + public R flist(@RequestParam Map params, ForumEntity forum, HttpServletRequest request) { + // 创建一个实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = forumService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allEq(ew, forum), params), params)); + // 调用学习交流服务类的查询分页方法,进行排序、范围和全量相等查询 + PageUtils page = forumService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allEq(ew, forum), params), params)); + // 返回成功响应,并将分页数据放入响应中 return R.ok().put("data", page); } - /** + /** * 查询 */ + // 映射请求路径 /forum/query @RequestMapping("/query") - public R query(ForumEntity forum){ - EntityWrapper< ForumEntity> ew = new EntityWrapper< ForumEntity>(); - ew.allEq(MPUtil.allEQMapPre( forum, "forum")); - ForumView forumView = forumService.selectView(ew); - return R.ok("查询学习交流成功").put("data", forumView); + // 处理查询学习交流信息的请求 + public R query(ForumEntity forum) { + // 创建一个实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,所有字段相等 + ew.allEq(MPUtil.allEQMapPre(forum, "forum")); + // 调用学习交流服务类的查询视图方法 + ForumView forumView = forumService.selectView(ew); + // 返回成功响应,并将查询结果放入响应中 + return R.ok("查询学习交流成功").put("data", forumView); } - + /** * 后端详情 */ + // 映射请求路径 /forum/info/{id} @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + // 处理后端查询学习交流详情的请求 + public R info(@PathVariable("id") Long id) { + // 根据 ID 查询学习交流实体 ForumEntity forum = forumService.selectById(id); + // 返回成功响应,并将查询结果放入响应中 return R.ok().put("data", forum); } /** * 前端详情 */ + // 映射请求路径 /forum/detail/{id} @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + // 处理前端查询学习交流详情的请求 + public R detail(@PathVariable("id") Long id) { + // 根据 ID 查询学习交流实体 ForumEntity forum = forumService.selectById(id); + // 返回成功响应,并将查询结果放入响应中 return R.ok().put("data", forum); } - - /** + + /** * 论坛详情 */ - @IgnoreAuth + // 该接口忽略认证 + @IgnoreAuth + // 映射请求路径 /forum/list/{id} @RequestMapping("/list/{id}") - public R list(@PathVariable("id") String id){ + // 处理查询论坛详情的请求 + public R list(@PathVariable("id") String id) { + // 根据 ID 查询学习交流实体 ForumEntity forum = forumService.selectById(id); + // 递归获取子论坛信息 getChilds(forum); + // 返回成功响应,并将查询结果放入响应中 return R.ok().put("data", forum); } - - private ForumEntity getChilds(ForumEntity forum) { - List childs = new ArrayList(); - childs = forumService.selectList(new EntityWrapper().eq("parentid", forum.getId())); - if(childs == null || childs.size()==0) { - return null; - } - forum.setChilds(childs); - for(ForumEntity forumEntity : childs) { - getChilds(forumEntity); - } - return forum; - } - + // 递归获取子论坛信息的方法 + private ForumEntity getChilds(ForumEntity forum) { + // 创建一个存储子论坛的列表 + List childs = new ArrayList(); + // 查询该论坛的所有子论坛 + childs = forumService.selectList(new EntityWrapper().eq("parentid", forum.getId())); + // 如果没有子论坛 + if (childs == null || childs.size() == 0) { + // 返回 null + return null; + } + // 设置该论坛的子论坛列表 + forum.setChilds(childs); + // 递归处理每个子论坛 + for (ForumEntity forumEntity : childs) { + getChilds(forumEntity); + } + // 返回该论坛 + return forum; + } /** * 后端保存 */ + // 映射请求路径 /forum/save @RequestMapping("/save") - public R save(@RequestBody ForumEntity forum, HttpServletRequest request){ - forum.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(forum); - forum.setUserid((Long)request.getSession().getAttribute("userId")); + // 处理后端保存学习交流信息的请求 + public R save(@RequestBody ForumEntity forum, HttpServletRequest request) { + // 生成一个唯一的 ID + forum.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 验证实体(注释掉,未启用) + //ValidatorUtils.validateEntity(forum); + // 设置学习交流的用户 ID 为当前用户的 ID + forum.setUserid((Long) request.getSession().getAttribute("userId")); + // 调用学习交流服务类的插入方法 forumService.insert(forum); + // 返回成功响应 return R.ok(); } - + /** * 前端保存 */ + // 映射请求路径 /forum/add @RequestMapping("/add") - public R add(@RequestBody ForumEntity forum, HttpServletRequest request){ - forum.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(forum); - forum.setUserid((Long)request.getSession().getAttribute("userId")); + // 处理前端保存学习交流信息的请求 + public R add(@RequestBody ForumEntity forum, HttpServletRequest request) { + // 生成一个唯一的 ID + forum.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 验证实体(注释掉,未启用) + //ValidatorUtils.validateEntity(forum); + // 设置学习交流的用户 ID 为当前用户的 ID + forum.setUserid((Long) request.getSession().getAttribute("userId")); + // 调用学习交流服务类的插入方法 forumService.insert(forum); + // 返回成功响应 return R.ok(); } /** * 修改 */ + // 映射请求路径 /forum/update @RequestMapping("/update") - public R update(@RequestBody ForumEntity forum, HttpServletRequest request){ + // 处理修改学习交流信息的请求 + public R update(@RequestBody ForumEntity forum, HttpServletRequest request) { + // 验证实体(注释掉,未启用) //ValidatorUtils.validateEntity(forum); - forumService.updateById(forum);//全部更新 + // 调用学习交流服务类的更新方法,更新所有字段 + forumService.updateById(forum); // 全部更新 + // 返回成功响应 return R.ok(); } - /** * 删除 */ + // 映射请求路径 /forum/delete @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + // 处理删除学习交流信息的请求 + public R delete(@RequestBody Long[] ids) { + // 调用学习交流服务类的批量删除方法 forumService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** * 提醒接口 */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - - int count = forumService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + // 映射请求路径 /forum/remind/{columnName}/{type} + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计的请求 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名放入参数映射中 + map.put("column", columnName); + // 将类型放入参数映射中 + map.put("type", type); + + // 如果类型为 2 + if (type.equals("2")) { + // 创建一个日期格式化对象 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建一个日历对象 + Calendar c = Calendar.getInstance(); + // 提醒开始日期 + Date remindStartDate = null; + // 提醒结束日期 + Date remindEndDate = null; + // 如果提醒开始参数不为空 + if (map.get("remindstart") != null) { + // 将提醒开始参数转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历时间为当前时间 + c.setTime(new Date()); + // 在当前日期上加上提醒开始天数 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取提醒开始日期 + remindStartDate = c.getTime(); + // 将提醒开始日期格式化后放入参数映射中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果提醒结束参数不为空 + if (map.get("remindend") != null) { + // 将提醒结束参数转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历时间为当前时间 + c.setTime(new Date()); + // 在当前日期上加上提醒结束天数 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取提醒结束日期 + remindEndDate = c.getTime(); + // 将提醒结束日期格式化后放入参数映射中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个实体包装器,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果提醒开始参数不为空 + if (map.get("remindstart") != null) { + // 设置查询条件,列名大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果提醒结束参数不为空 + if (map.get("remindend") != null) { + // 设置查询条件,列名小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + + // 调用学习交流服务类的统计方法,统计符合条件的记录数 + int count = forumService.selectCount(wrapper); + // 返回成功响应,并将统计结果放入响应中 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/GoumaidekechengController.java b/src/main/java/com/controller/GoumaidekechengController.java index a05788a..5739c03 100644 --- a/src/main/java/com/controller/GoumaidekechengController.java +++ b/src/main/java/com/controller/GoumaidekechengController.java @@ -1,214 +1,317 @@ package com.controller; +// 导入用于格式化日期的类 import java.text.SimpleDateFormat; +// 导入用于创建动态数组的类 import java.util.ArrayList; +// 导入用于操作数组的工具类 import java.util.Arrays; +// 导入用于处理日期和时间的类 import java.util.Calendar; +// 导入用于存储键值对的接口 import java.util.Map; +// 导入 HashMap 类,用于实现 Map 接口 import java.util.HashMap; +// 导入用于遍历集合的接口 import java.util.Iterator; +// 导入用于表示日期和时间的类 import java.util.Date; +// 导入用于创建列表的接口 import java.util.List; +// 导入用于处理 HTTP 请求的类 import javax.servlet.http.HttpServletRequest; +// 导入自定义的验证工具类 import com.utils.ValidatorUtils; +// 导入 Apache Commons Lang 库中的字符串处理工具类 import org.apache.commons.lang3.StringUtils; +// 导入 Spring 框架的自动注入注解 import org.springframework.beans.factory.annotation.Autowired; +// 导入 Spring 框架的日期格式化注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入 Spring 框架的路径变量注解 import org.springframework.web.bind.annotation.PathVariable; +// 导入 Spring 框架的请求体注解 import org.springframework.web.bind.annotation.RequestBody; +// 导入 Spring 框架的请求映射注解 import org.springframework.web.bind.annotation.RequestMapping; +// 导入 Spring 框架的请求参数注解 import org.springframework.web.bind.annotation.RequestParam; +// 导入 Spring 框架的 REST 控制器注解 import org.springframework.web.bind.annotation.RestController; +// 导入 MyBatis-Plus 的实体包装器类 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的包装器接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解 import com.annotation.IgnoreAuth; +// 导入购买的课程实体类 import com.entity.GoumaidekechengEntity; +// 导入购买的课程视图类 import com.entity.view.GoumaidekechengView; +// 导入购买的课程服务类 import com.service.GoumaidekechengService; +// 导入令牌服务类 import com.service.TokenService; +// 导入分页工具类 import com.utils.PageUtils; +// 导入自定义的响应类 import com.utils.R; +// 导入 MD5 加密工具类 import com.utils.MD5Util; +// 导入 MyBatis-Plus 工具类 import com.utils.MPUtil; +// 导入通用工具类 import com.utils.CommonUtil; /** * 购买的课程 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:14 */ +// 声明为 REST 控制器,用于处理 HTTP 请求 @RestController +// 映射请求路径,所有以 /goumaidekecheng 开头的请求由该控制器处理 @RequestMapping("/goumaidekecheng") public class GoumaidekechengController { + // 自动注入购买的课程服务类实例 @Autowired private GoumaidekechengService goumaidekechengService; - /** - * 后端列表 + * 后端列表(分页查询) */ + // 映射请求路径 /goumaidekecheng/page @RequestMapping("/page") - public R page(@RequestParam Map params,GoumaidekechengEntity goumaidekecheng, - HttpServletRequest request){ - String tableName = request.getSession().getAttribute("tableName").toString(); - if(tableName.equals("yonghu")) { - goumaidekecheng.setYonghuzhanghao((String)request.getSession().getAttribute("username")); - } + // 处理后端分页查询请求,参数包括查询条件、实体对象、HTTP 请求 + public R page(@RequestParam Map params, GoumaidekechengEntity goumaidekecheng, + HttpServletRequest request) { + // 从会话中获取表名(判断用户类型) + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果表名是 "yonghu"(用户表) + if (tableName.equals("yonghu")) { + // 设置查询条件:用户账号为当前登录用户的用户名 + goumaidekecheng.setYonghuzhanghao((String) request.getSession().getAttribute("username")); + } + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = goumaidekechengService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, goumaidekecheng), params), params)); - + // 调用服务类的分页查询方法,包含排序、范围查询、模糊查询处理 + PageUtils page = goumaidekechengService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, goumaidekecheng), params), params)); + // 返回成功响应,携带分页数据 return R.ok().put("data", page); } - + /** - * 前端列表 + * 前端列表(分页查询) */ + // 映射请求路径 /goumaidekecheng/list @RequestMapping("/list") - public R list(@RequestParam Map params,GoumaidekechengEntity goumaidekecheng, - HttpServletRequest request){ + // 处理前端分页查询请求,参数包括查询条件、实体对象、HTTP 请求 + public R list(@RequestParam Map params, GoumaidekechengEntity goumaidekecheng, + HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = goumaidekechengService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, goumaidekecheng), params), params)); + // 调用服务类的分页查询方法,包含排序、范围查询、模糊查询处理 + PageUtils page = goumaidekechengService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, goumaidekecheng), params), params)); + // 返回成功响应,携带分页数据 return R.ok().put("data", page); } - /** - * 列表 + /** + * 列表(不分页,全量查询) */ + // 映射请求路径 /goumaidekecheng/lists @RequestMapping("/lists") - public R list( GoumaidekechengEntity goumaidekecheng){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( goumaidekecheng, "goumaidekecheng")); + // 处理全量查询请求,参数为实体对象 + public R list(GoumaidekechengEntity goumaidekecheng) { + // 创建实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件:所有字段与实体对象相等(前缀为 "goumaidekecheng") + ew.allEq(MPUtil.allEQMapPre(goumaidekecheng, "goumaidekecheng")); + // 返回成功响应,携带查询结果(视图列表) return R.ok().put("data", goumaidekechengService.selectListView(ew)); } - /** - * 查询 + /** + * 查询(单个对象) */ + // 映射请求路径 /goumaidekecheng/query @RequestMapping("/query") - public R query(GoumaidekechengEntity goumaidekecheng){ - EntityWrapper< GoumaidekechengEntity> ew = new EntityWrapper< GoumaidekechengEntity>(); - ew.allEq(MPUtil.allEQMapPre( goumaidekecheng, "goumaidekecheng")); - GoumaidekechengView goumaidekechengView = goumaidekechengService.selectView(ew); - return R.ok("查询购买的课程成功").put("data", goumaidekechengView); + // 处理单个对象查询请求,参数为实体对象 + public R query(GoumaidekechengEntity goumaidekecheng) { + // 创建实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件:所有字段与实体对象相等(前缀为 "goumaidekecheng") + ew.allEq(MPUtil.allEQMapPre(goumaidekecheng, "goumaidekecheng")); + // 调用服务类的视图查询方法 + GoumaidekechengView goumaidekechengView = goumaidekechengService.selectView(ew); + // 返回成功响应,携带查询结果和提示信息 + return R.ok("查询购买的课程成功").put("data", goumaidekechengView); } - + /** - * 后端详情 + * 后端详情(根据 ID 查询) */ + // 映射请求路径 /goumaidekecheng/info/{id} @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + // 处理详情查询请求,参数为路径中的 ID + public R info(@PathVariable("id") Long id) { + // 根据 ID 直接查询实体对象 GoumaidekechengEntity goumaidekecheng = goumaidekechengService.selectById(id); + // 返回成功响应,携带查询到的实体数据 return R.ok().put("data", goumaidekecheng); } /** - * 前端详情 + * 前端详情(根据 ID 查询) */ + // 映射请求路径 /goumaidekecheng/detail/{id} @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + // 处理详情查询请求,参数为路径中的 ID(前端调用) + public R detail(@PathVariable("id") Long id) { + // 根据 ID 直接查询实体对象 GoumaidekechengEntity goumaidekecheng = goumaidekechengService.selectById(id); + // 返回成功响应,携带查询到的实体数据 return R.ok().put("data", goumaidekecheng); } - + /** - * 后端保存 + * 后端保存(新增数据) */ + // 映射请求路径 /goumaidekecheng/save @RequestMapping("/save") - public R save(@RequestBody GoumaidekechengEntity goumaidekecheng, HttpServletRequest request){ - goumaidekecheng.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(goumaidekecheng); + // 处理后端新增请求,请求体为实体对象,携带 HTTP 请求 + public R save(@RequestBody GoumaidekechengEntity goumaidekecheng, HttpServletRequest request) { + // 生成唯一 ID(时间戳 + 随机数) + goumaidekecheng.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 实体验证(注释,未启用) + //ValidatorUtils.validateEntity(goumaidekecheng); + // 调用服务类的插入方法 goumaidekechengService.insert(goumaidekecheng); + // 返回成功响应 return R.ok(); } - + /** - * 前端保存 + * 前端保存(新增数据) */ + // 映射请求路径 /goumaidekecheng/add @RequestMapping("/add") - public R add(@RequestBody GoumaidekechengEntity goumaidekecheng, HttpServletRequest request){ - goumaidekecheng.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(goumaidekecheng); + // 处理前端新增请求,请求体为实体对象,携带 HTTP 请求 + public R add(@RequestBody GoumaidekechengEntity goumaidekecheng, HttpServletRequest request) { + // 生成唯一 ID(时间戳 + 随机数) + goumaidekecheng.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 实体验证(注释,未启用) + //ValidatorUtils.validateEntity(goumaidekecheng); + // 调用服务类的插入方法 goumaidekechengService.insert(goumaidekecheng); + // 返回成功响应 return R.ok(); } /** - * 修改 + * 修改(更新数据) */ + // 映射请求路径 /goumaidekecheng/update @RequestMapping("/update") - public R update(@RequestBody GoumaidekechengEntity goumaidekecheng, HttpServletRequest request){ + // 处理修改请求,请求体为实体对象,携带 HTTP 请求 + public R update(@RequestBody GoumaidekechengEntity goumaidekecheng, HttpServletRequest request) { + // 实体验证(注释,未启用) //ValidatorUtils.validateEntity(goumaidekecheng); - goumaidekechengService.updateById(goumaidekecheng);//全部更新 + // 调用服务类的更新方法(根据 ID 全量更新) + goumaidekechengService.updateById(goumaidekecheng); // 全部更新 + // 返回成功响应 return R.ok(); } - + /** - * 删除 + * 删除(批量删除) */ + // 映射请求路径 /goumaidekecheng/delete @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + // 处理删除请求,请求体为 ID 数组 + public R delete(@RequestBody Long[] ids) { + // 调用服务类的批量删除方法(根据 ID 列表) goumaidekechengService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** - * 提醒接口 + * 提醒接口(统计符合条件的记录数) */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - String tableName = request.getSession().getAttribute("tableName").toString(); - if(tableName.equals("yonghu")) { - wrapper.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username")); - } - - int count = goumaidekechengService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + // 映射请求路径 /goumaidekecheng/remind/{columnName}/{type} + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求,参数包括列名、类型、查询条件映射 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 向查询条件中添加列名和类型 + map.put("column", columnName); + map.put("type", type); + + // 如果类型为 2(处理日期范围提醒) + if (type.equals("2")) { + // 创建日期格式化对象(yyyy-MM-dd 格式) + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建日历对象 + Calendar c = Calendar.getInstance(); + // 提醒开始日期和结束日期变量 + Date remindStartDate = null; + Date remindEndDate = null; + // 处理提醒开始时间(相对当前日期偏移) + if (map.get("remindstart") != null) { + // 解析偏移天数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历为当前时间并添加偏移天数 + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取格式化后的提醒开始日期 + remindStartDate = c.getTime(); + map.put("remindstart", sdf.format(remindStartDate)); + } + // 处理提醒结束时间(相对当前日期偏移) + if (map.get("remindend") != null) { + // 解析偏移天数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历为当前时间并添加偏移天数 + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取格式化后的提醒结束日期 + remindEndDate = c.getTime(); + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建包装器用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 添加提醒开始时间的大于等于条件 + if (map.get("remindstart") != null) { + wrapper.ge(columnName, map.get("remindstart")); + } + // 添加提醒结束时间的小于等于条件 + if (map.get("remindend") != null) { + wrapper.le(columnName, map.get("remindend")); + } + + // 根据表名判断是否添加用户账号条件(用户表场景) + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + wrapper.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类统计符合条件的记录数 + int count = goumaidekechengService.selectCount(wrapper); + // 返回成功响应,携带统计结果 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/KechengleixingController.java b/src/main/java/com/controller/KechengleixingController.java index eab85c5..d099a01 100644 --- a/src/main/java/com/controller/KechengleixingController.java +++ b/src/main/java/com/controller/KechengleixingController.java @@ -1,206 +1,304 @@ package com.controller; +// 导入用于格式化日期的类 import java.text.SimpleDateFormat; +// 导入用于创建动态数组的类 import java.util.ArrayList; +// 导入用于操作数组的工具类 import java.util.Arrays; +// 导入用于处理日期和时间的类 import java.util.Calendar; +// 导入用于存储键值对的接口 import java.util.Map; +// 导入HashMap类,用于实现Map接口 import java.util.HashMap; +// 导入用于遍历集合的接口 import java.util.Iterator; +// 导入用于表示日期和时间的类 import java.util.Date; +// 导入用于创建列表的接口 import java.util.List; +// 导入用于处理HTTP请求的类 import javax.servlet.http.HttpServletRequest; +// 导入自定义的验证工具类 import com.utils.ValidatorUtils; +// 导入Apache Commons Lang库中的字符串处理工具类 import org.apache.commons.lang3.StringUtils; +// 导入Spring框架的自动注入注解 import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring框架的日期格式化注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Spring框架的路径变量注解 import org.springframework.web.bind.annotation.PathVariable; +// 导入Spring框架的请求体注解 import org.springframework.web.bind.annotation.RequestBody; +// 导入Spring框架的请求映射注解 import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +// 导入Spring框架的REST控制器注解 import org.springframework.web.bind.annotation.RestController; +// 导入MyBatis-Plus的实体包装器类 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入MyBatis-Plus的包装器接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解 import com.annotation.IgnoreAuth; +// 导入课程类型实体类 import com.entity.KechengleixingEntity; +// 导入课程类型视图类 import com.entity.view.KechengleixingView; +// 导入课程类型服务类 import com.service.KechengleixingService; +// 导入令牌服务类 import com.service.TokenService; +// 导入分页工具类 import com.utils.PageUtils; +// 导入自定义的响应类 import com.utils.R; +// 导入MD5加密工具类 import com.utils.MD5Util; +// 导入MyBatis-Plus工具类 import com.utils.MPUtil; +// 导入通用工具类 import com.utils.CommonUtil; /** * 课程类型 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:14 */ +// 声明为REST控制器,用于处理HTTP请求 @RestController +// 映射请求路径,所有以/kechengleixing开头的请求由该控制器处理 @RequestMapping("/kechengleixing") public class KechengleixingController { + // 自动注入课程类型服务类实例 @Autowired private KechengleixingService kechengleixingService; - /** - * 后端列表 + * 后端列表(分页查询) */ + // 映射请求路径/kechengleixing/page @RequestMapping("/page") - public R page(@RequestParam Map params,KechengleixingEntity kechengleixing, - HttpServletRequest request){ + // 处理后端分页查询请求,参数包括查询条件、实体对象、HTTP请求 + public R page(@RequestParam Map params, KechengleixingEntity kechengleixing, + HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = kechengleixingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengleixing), params), params)); - + // 调用服务类的分页查询方法,包含排序、范围查询、模糊查询处理 + PageUtils page = kechengleixingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengleixing), params), params)); + // 返回成功响应,携带分页数据 return R.ok().put("data", page); } - + /** - * 前端列表 + * 前端列表(分页查询) */ + // 映射请求路径/kechengleixing/list @RequestMapping("/list") - public R list(@RequestParam Map params,KechengleixingEntity kechengleixing, - HttpServletRequest request){ + // 处理前端分页查询请求,参数包括查询条件、实体对象、HTTP请求 + public R list(@RequestParam Map params, KechengleixingEntity kechengleixing, + HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = kechengleixingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengleixing), params), params)); + // 调用服务类的分页查询方法,包含排序、范围查询、模糊查询处理 + PageUtils page = kechengleixingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengleixing), params), params)); + // 返回成功响应,携带分页数据 return R.ok().put("data", page); } - /** - * 列表 + /** + * 列表(不分页,全量查询) */ + // 映射请求路径/kechengleixing/lists(测试用接口) @RequestMapping("/lists") - public R list( KechengleixingEntity kechengleixing){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( kechengleixing, "kechengleixing")); + // 处理全量查询请求,参数为实体对象 + public R list(KechengleixingEntity kechengleixing) { + // 创建实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件:所有字段与实体对象相等(前缀为"kechengleixing") + ew.allEq(MPUtil.allEQMapPre(kechengleixing, "kechengleixing")); + // 返回成功响应,携带查询结果(视图列表) return R.ok().put("data", kechengleixingService.selectListView(ew)); } - /** - * 查询 + /** + * 查询(单个对象) */ + // 映射请求路径/kechengleixing/query @RequestMapping("/query") - public R query(KechengleixingEntity kechengleixing){ - EntityWrapper< KechengleixingEntity> ew = new EntityWrapper< KechengleixingEntity>(); - ew.allEq(MPUtil.allEQMapPre( kechengleixing, "kechengleixing")); - KechengleixingView kechengleixingView = kechengleixingService.selectView(ew); - return R.ok("查询课程类型成功").put("data", kechengleixingView); + // 处理单个对象查询请求,参数为实体对象 + public R query(KechengleixingEntity kechengleixing) { + // 创建实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件:所有字段与实体对象相等(前缀为"kechengleixing") + ew.allEq(MPUtil.allEQMapPre(kechengleixing, "kechengleixing")); + // 调用服务类的视图查询方法 + KechengleixingView kechengleixingView = kechengleixingService.selectView(ew); + // 返回成功响应,携带查询结果和提示信息 + return R.ok("查询课程类型成功").put("data", kechengleixingView); } - + /** - * 后端详情 + * 后端详情(根据ID查询) */ + // 映射请求路径/kechengleixing/info/{id} @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + // 处理详情查询请求,参数为路径中的ID + public R info(@PathVariable("id") Long id) { + // 根据ID直接查询实体对象 KechengleixingEntity kechengleixing = kechengleixingService.selectById(id); + // 返回成功响应,携带查询到的实体数据 return R.ok().put("data", kechengleixing); } /** - * 前端详情 + * 前端详情(根据ID查询) */ + // 映射请求路径/kechengleixing/detail/{id} @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + // 处理详情查询请求,参数为路径中的ID(前端调用) + public R detail(@PathVariable("id") Long id) { + // 根据ID直接查询实体对象 KechengleixingEntity kechengleixing = kechengleixingService.selectById(id); + // 返回成功响应,携带查询到的实体数据 return R.ok().put("data", kechengleixing); } - + /** - * 后端保存 + * 后端保存(新增数据) */ + // 映射请求路径/kechengleixing/save @RequestMapping("/save") - public R save(@RequestBody KechengleixingEntity kechengleixing, HttpServletRequest request){ - kechengleixing.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(kechengleixing); + // 处理后端新增请求,请求体为实体对象,携带HTTP请求 + public R save(@RequestBody KechengleixingEntity kechengleixing, HttpServletRequest request) { + // 生成唯一ID(时间戳 + 随机数) + kechengleixing.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 实体验证(注释,未启用) + //ValidatorUtils.validateEntity(kechengleixing); + // 调用服务类的插入方法 kechengleixingService.insert(kechengleixing); + // 返回成功响应 return R.ok(); } - + /** - * 前端保存 + * 前端保存(新增数据) */ + // 映射请求路径/kechengleixing/add @RequestMapping("/add") - public R add(@RequestBody KechengleixingEntity kechengleixing, HttpServletRequest request){ - kechengleixing.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(kechengleixing); + // 处理前端新增请求,请求体为实体对象,携带HTTP请求 + public R add(@RequestBody KechengleixingEntity kechengleixing, HttpServletRequest request) { + // 生成唯一ID(时间戳 + 随机数) + kechengleixing.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 实体验证(注释,未启用) + //ValidatorUtils.validateEntity(kechengleixing); + // 调用服务类的插入方法 kechengleixingService.insert(kechengleixing); + // 返回成功响应 return R.ok(); } /** - * 修改 + * 修改(更新数据) */ + // 映射请求路径/kechengleixing/update @RequestMapping("/update") - public R update(@RequestBody KechengleixingEntity kechengleixing, HttpServletRequest request){ + // 处理修改请求,请求体为实体对象,携带HTTP请求 + public R update(@RequestBody KechengleixingEntity kechengleixing, HttpServletRequest request) { + // 实体验证(注释,未启用) //ValidatorUtils.validateEntity(kechengleixing); - kechengleixingService.updateById(kechengleixing);//全部更新 + // 调用服务类的更新方法(根据ID全量更新) + kechengleixingService.updateById(kechengleixing); // 全部更新 + // 返回成功响应 return R.ok(); } - + /** - * 删除 + * 删除(批量删除) */ + // 映射请求路径/kechengleixing/delete @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + // 处理删除请求,请求体为ID数组 + public R delete(@RequestBody Long[] ids) { + // 调用服务类的批量删除方法(根据ID列表) kechengleixingService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** - * 提醒接口 + * 提醒接口(统计符合条件的记录数) */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - - int count = kechengleixingService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + // 映射请求路径/kechengleixing/remind/{columnName}/{type} + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求,参数包括列名、类型、查询条件映射 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 向查询条件中添加列名和类型 + map.put("column", columnName); + map.put("type", type); + + // 如果类型为2(处理日期范围提醒) + if (type.equals("2")) { + // 创建日期格式化对象(yyyy-MM-dd格式) + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建日历对象 + Calendar c = Calendar.getInstance(); + // 提醒开始日期和结束日期变量 + Date remindStartDate = null; + Date remindEndDate = null; + // 处理提醒开始时间(相对当前日期偏移) + if (map.get("remindstart") != null) { + // 解析偏移天数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历为当前时间并添加偏移天数 + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取格式化后的提醒开始日期 + remindStartDate = c.getTime(); + map.put("remindstart", sdf.format(remindStartDate)); + } + // 处理提醒结束时间(相对当前日期偏移) + if (map.get("remindend") != null) { + // 解析偏移天数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历为当前时间并添加偏移天数 + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取格式化后的提醒结束日期 + remindEndDate = c.getTime(); + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建包装器用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 添加提醒开始时间的大于等于条件 + if (map.get("remindstart") != null) { + wrapper.ge(columnName, map.get("remindstart")); + } + // 添加提醒结束时间的小于等于条件 + if (map.get("remindend") != null) { + wrapper.le(columnName, map.get("remindend")); + } + + + // 调用服务类统计符合条件的记录数 + int count = kechengleixingService.selectCount(wrapper); + // 返回成功响应,携带统计结果 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/KechengxinxiController.java b/src/main/java/com/controller/KechengxinxiController.java index 332245a..3af9fda 100644 --- a/src/main/java/com/controller/KechengxinxiController.java +++ b/src/main/java/com/controller/KechengxinxiController.java @@ -1,208 +1,313 @@ +// 声明该类所在的包 package com.controller; +// 导入用于格式化日期的类 import java.text.SimpleDateFormat; +// 导入用于创建动态数组的类 import java.util.ArrayList; +// 导入用于操作数组的工具类 import java.util.Arrays; +// 导入用于处理日期和时间的类 import java.util.Calendar; +// 导入用于存储键值对的接口 import java.util.Map; +// 导入用于实现 Map 接口的 HashMap 类 import java.util.HashMap; +// 导入用于遍历集合的接口 import java.util.Iterator; +// 导入用于表示日期和时间的类 import java.util.Date; +// 导入用于创建列表的接口 import java.util.List; +// 导入用于处理 HTTP 请求的类 import javax.servlet.http.HttpServletRequest; +// 导入自定义的验证工具类 import com.utils.ValidatorUtils; +// 导入 Apache Commons Lang 库中的字符串处理工具类 import org.apache.commons.lang3.StringUtils; +// 导入 Spring 框架的自动注入注解 import org.springframework.beans.factory.annotation.Autowired; +// 导入 Spring 框架的日期格式化注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入 Spring 框架的路径变量注解 import org.springframework.web.bind.annotation.PathVariable; +// 导入 Spring 框架的请求体注解 import org.springframework.web.bind.annotation.RequestBody; +// 导入 Spring 框架的请求映射注解 import org.springframework.web.bind.annotation.RequestMapping; +// 导入 Spring 框架的请求参数注解 import org.springframework.web.bind.annotation.RequestParam; +// 导入 Spring 框架的 REST 控制器注解 import org.springframework.web.bind.annotation.RestController; +// 导入 MyBatis-Plus 的实体包装器类 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的包装器接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解 import com.annotation.IgnoreAuth; +// 导入课程信息实体类 import com.entity.KechengxinxiEntity; +// 导入课程信息视图类 import com.entity.view.KechengxinxiView; +// 导入课程信息服务类 import com.service.KechengxinxiService; +// 导入令牌服务类 import com.service.TokenService; +// 导入分页工具类 import com.utils.PageUtils; +// 导入自定义的响应类 import com.utils.R; +// 导入 MD5 加密工具类 import com.utils.MD5Util; +// 导入 MyBatis-Plus 工具类 import com.utils.MPUtil; +// 导入通用工具类 import com.utils.CommonUtil; /** * 课程信息 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:14 */ +// 声明该类为 REST 控制器,用于处理 HTTP 请求 @RestController +// 映射请求路径,所有以 /kechengxinxi 开头的请求都会由该控制器处理 @RequestMapping("/kechengxinxi") public class KechengxinxiController { + // 自动注入课程信息服务类的实例 @Autowired private KechengxinxiService kechengxinxiService; - /** * 后端列表 */ + // 映射请求路径 /kechengxinxi/page @RequestMapping("/page") - public R page(@RequestParam Map params,KechengxinxiEntity kechengxinxi, - HttpServletRequest request){ + // 处理后端分页查询课程信息列表的请求 + public R page(@RequestParam Map params, KechengxinxiEntity kechengxinxi, + HttpServletRequest request) { + // 创建一个实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = kechengxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengxinxi), params), params)); - + // 调用课程信息服务类的查询分页方法,进行排序、范围和模糊查询 + PageUtils page = kechengxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengxinxi), params), params)); + // 返回成功响应,并将分页数据放入响应中 return R.ok().put("data", page); } - + /** * 前端列表 */ - @IgnoreAuth + // 该接口忽略认证 + @IgnoreAuth + // 映射请求路径 /kechengxinxi/list @RequestMapping("/list") - public R list(@RequestParam Map params,KechengxinxiEntity kechengxinxi, - HttpServletRequest request){ + // 处理前端分页查询课程信息列表的请求 + public R list(@RequestParam Map params, KechengxinxiEntity kechengxinxi, + HttpServletRequest request) { + // 创建一个实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = kechengxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengxinxi), params), params)); + // 调用课程信息服务类的查询分页方法,进行排序、范围和模糊查询 + PageUtils page = kechengxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengxinxi), params), params)); + // 返回成功响应,并将分页数据放入响应中 return R.ok().put("data", page); } - /** + /** * 列表 */ + // 映射请求路径 /kechengxinxi/lists @RequestMapping("/lists") - public R list( KechengxinxiEntity kechengxinxi){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( kechengxinxi, "kechengxinxi")); + // 处理查询课程信息列表的请求 + public R list(KechengxinxiEntity kechengxinxi) { + // 创建一个实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,所有字段相等 + ew.allEq(MPUtil.allEQMapPre(kechengxinxi, "kechengxinxi")); + // 返回成功响应,并将查询结果(视图列表)放入响应中 return R.ok().put("data", kechengxinxiService.selectListView(ew)); } - /** + /** * 查询 */ + // 映射请求路径 /kechengxinxi/query @RequestMapping("/query") - public R query(KechengxinxiEntity kechengxinxi){ - EntityWrapper< KechengxinxiEntity> ew = new EntityWrapper< KechengxinxiEntity>(); - ew.allEq(MPUtil.allEQMapPre( kechengxinxi, "kechengxinxi")); - KechengxinxiView kechengxinxiView = kechengxinxiService.selectView(ew); - return R.ok("查询课程信息成功").put("data", kechengxinxiView); + // 处理查询课程信息的请求 + public R query(KechengxinxiEntity kechengxinxi) { + // 创建一个实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,所有字段相等 + ew.allEq(MPUtil.allEQMapPre(kechengxinxi, "kechengxinxi")); + // 调用课程信息服务类的查询视图方法 + KechengxinxiView kechengxinxiView = kechengxinxiService.selectView(ew); + // 返回成功响应,并将查询结果放入响应中,附带成功提示信息 + return R.ok("查询课程信息成功").put("data", kechengxinxiView); } - + /** * 后端详情 */ + // 映射请求路径 /kechengxinxi/info/{id} @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + // 处理后端查询课程信息详情的请求 + public R info(@PathVariable("id") Long id) { + // 根据 ID 查询课程信息实体 KechengxinxiEntity kechengxinxi = kechengxinxiService.selectById(id); + // 返回成功响应,并将查询结果放入响应中 return R.ok().put("data", kechengxinxi); } /** * 前端详情 */ + // 映射请求路径 /kechengxinxi/detail/{id} @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + // 处理前端查询课程信息详情的请求 + public R detail(@PathVariable("id") Long id) { + // 根据 ID 查询课程信息实体 KechengxinxiEntity kechengxinxi = kechengxinxiService.selectById(id); + // 返回成功响应,并将查询结果放入响应中 return R.ok().put("data", kechengxinxi); } - - - /** * 后端保存 */ + // 映射请求路径 /kechengxinxi/save @RequestMapping("/save") - public R save(@RequestBody KechengxinxiEntity kechengxinxi, HttpServletRequest request){ - kechengxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(kechengxinxi); + // 处理后端保存课程信息的请求 + public R save(@RequestBody KechengxinxiEntity kechengxinxi, HttpServletRequest request) { + // 生成一个唯一的 ID + kechengxinxi.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 验证实体(注释掉,未启用) + //ValidatorUtils.validateEntity(kechengxinxi); + // 调用课程信息服务类的插入方法 kechengxinxiService.insert(kechengxinxi); + // 返回成功响应 return R.ok(); } - + /** * 前端保存 */ - @IgnoreAuth + // 该接口忽略认证 + @IgnoreAuth + // 映射请求路径 /kechengxinxi/add @RequestMapping("/add") - public R add(@RequestBody KechengxinxiEntity kechengxinxi, HttpServletRequest request){ - kechengxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(kechengxinxi); + // 处理前端保存课程信息的请求 + public R add(@RequestBody KechengxinxiEntity kechengxinxi, HttpServletRequest request) { + // 生成一个唯一的 ID + kechengxinxi.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 验证实体(注释掉,未启用) + //ValidatorUtils.validateEntity(kechengxinxi); + // 调用课程信息服务类的插入方法 kechengxinxiService.insert(kechengxinxi); + // 返回成功响应 return R.ok(); } /** * 修改 */ + // 映射请求路径 /kechengxinxi/update @RequestMapping("/update") - public R update(@RequestBody KechengxinxiEntity kechengxinxi, HttpServletRequest request){ + // 处理修改课程信息的请求 + public R update(@RequestBody KechengxinxiEntity kechengxinxi, HttpServletRequest request) { + // 验证实体(注释掉,未启用) //ValidatorUtils.validateEntity(kechengxinxi); - kechengxinxiService.updateById(kechengxinxi);//全部更新 + // 调用课程信息服务类的更新方法,更新所有字段 + kechengxinxiService.updateById(kechengxinxi); // 全部更新 + // 返回成功响应 return R.ok(); } - /** * 删除 */ + // 映射请求路径 /kechengxinxi/delete @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + // 处理删除课程信息的请求 + public R delete(@RequestBody Long[] ids) { + // 调用课程信息服务类的批量删除方法 kechengxinxiService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** * 提醒接口 */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - - int count = kechengxinxiService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + // 映射请求路径 /kechengxinxi/remind/{columnName}/{type} + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计的请求 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名放入参数映射中 + map.put("column", columnName); + // 将类型放入参数映射中 + map.put("type", type); + + // 如果类型为 2 + if (type.equals("2")) { + // 创建一个日期格式化对象 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建一个日历对象 + Calendar c = Calendar.getInstance(); + // 提醒开始日期 + Date remindStartDate = null; + // 提醒结束日期 + Date remindEndDate = null; + // 如果提醒开始参数不为空 + if (map.get("remindstart") != null) { + // 将提醒开始参数转换为整数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历时间为当前时间 + c.setTime(new Date()); + // 在当前日期上加上提醒开始天数 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取提醒开始日期 + remindStartDate = c.getTime(); + // 将提醒开始日期格式化后放入参数映射中 + map.put("remindstart", sdf.format(remindStartDate)); + } + // 如果提醒结束参数不为空 + if (map.get("remindend") != null) { + // 将提醒结束参数转换为整数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历时间为当前时间 + c.setTime(new Date()); + // 在当前日期上加上提醒结束天数 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取提醒结束日期 + remindEndDate = c.getTime(); + // 将提醒结束日期格式化后放入参数映射中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建一个实体包装器,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 如果提醒开始参数不为空 + if (map.get("remindstart") != null) { + // 设置查询条件,列名大于等于提醒开始日期 + wrapper.ge(columnName, map.get("remindstart")); + } + // 如果提醒结束参数不为空 + if (map.get("remindend") != null) { + // 设置查询条件,列名小于等于提醒结束日期 + wrapper.le(columnName, map.get("remindend")); + } + + // 调用课程信息服务类的统计方法,统计符合条件的记录数 + int count = kechengxinxiService.selectCount(wrapper); + // 返回成功响应,并将统计结果放入响应中 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/MessagesController.java b/src/main/java/com/controller/MessagesController.java index b1d92c4..d94aa74 100644 --- a/src/main/java/com/controller/MessagesController.java +++ b/src/main/java/com/controller/MessagesController.java @@ -1,213 +1,316 @@ package com.controller; +// 导入用于格式化日期的类 import java.text.SimpleDateFormat; +// 导入用于创建动态数组的类 import java.util.ArrayList; +// 导入用于操作数组的工具类 import java.util.Arrays; +// 导入用于处理日期和时间的类 import java.util.Calendar; +// 导入用于存储键值对的接口 import java.util.Map; +// 导入用于实现Map接口的HashMap类 import java.util.HashMap; +// 导入用于遍历集合的接口 import java.util.Iterator; +// 导入用于表示日期和时间的类 import java.util.Date; +// 导入用于创建列表的接口 import java.util.List; +// 导入用于处理HTTP请求的类 import javax.servlet.http.HttpServletRequest; +// 导入自定义的验证工具类 import com.utils.ValidatorUtils; +// 导入Apache Commons Lang库中的字符串处理工具类 import org.apache.commons.lang3.StringUtils; +// 导入Spring框架的自动注入注解 import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring框架的日期格式化注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Spring框架的路径变量注解 import org.springframework.web.bind.annotation.PathVariable; +// 导入Spring框架的请求体注解 import org.springframework.web.bind.annotation.RequestBody; +// 导入Spring框架的请求映射注解 import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +// 导入Spring框架的REST控制器注解 import org.springframework.web.bind.annotation.RestController; +// 导入MyBatis-Plus的实体包装器类 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入MyBatis-Plus的包装器接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解 import com.annotation.IgnoreAuth; +// 导入留言板实体类 import com.entity.MessagesEntity; +// 导入留言板视图类 import com.entity.view.MessagesView; +// 导入留言板服务类 import com.service.MessagesService; +// 导入令牌服务类 import com.service.TokenService; +// 导入分页工具类 import com.utils.PageUtils; +// 导入自定义的响应类 import com.utils.R; +// 导入MD5加密工具类 import com.utils.MD5Util; +// 导入MyBatis-Plus工具类 import com.utils.MPUtil; +// 导入通用工具类 import com.utils.CommonUtil; /** * 留言板 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:15 */ +// 声明为REST控制器,用于处理HTTP请求 @RestController +// 映射请求路径,所有以/messages开头的请求由该控制器处理 @RequestMapping("/messages") public class MessagesController { + // 自动注入留言板服务类实例 @Autowired private MessagesService messagesService; - /** - * 后端列表 + * 后端列表(分页查询) */ + // 映射请求路径/messages/page @RequestMapping("/page") - public R page(@RequestParam Map params,MessagesEntity messages, - HttpServletRequest request){ - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - messages.setUserid((Long)request.getSession().getAttribute("userId")); - } + // 处理后端分页查询请求,参数包括查询条件、实体对象、HTTP请求 + public R page(@RequestParam Map params, MessagesEntity messages, + HttpServletRequest request) { + // 如果当前用户不是管理员 + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置留言的用户ID为当前登录用户的ID + messages.setUserid((Long) request.getSession().getAttribute("userId")); + } + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = messagesService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, messages), params), params)); - + // 调用服务类的分页查询方法,包含排序、范围查询、模糊查询处理 + PageUtils page = messagesService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, messages), params), params)); + // 返回成功响应,携带分页数据 return R.ok().put("data", page); } - + /** - * 前端列表 + * 前端列表(分页查询) */ + // 映射请求路径/messages/list @RequestMapping("/list") - public R list(@RequestParam Map params,MessagesEntity messages, - HttpServletRequest request){ - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - messages.setUserid((Long)request.getSession().getAttribute("userId")); - } + // 处理前端分页查询请求,参数包括查询条件、实体对象、HTTP请求 + public R list(@RequestParam Map params, MessagesEntity messages, + HttpServletRequest request) { + // 如果当前用户不是管理员 + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置留言的用户ID为当前登录用户的ID + messages.setUserid((Long) request.getSession().getAttribute("userId")); + } + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = messagesService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, messages), params), params)); + // 调用服务类的分页查询方法,包含排序、范围查询、模糊查询处理 + PageUtils page = messagesService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, messages), params), params)); + // 返回成功响应,携带分页数据 return R.ok().put("data", page); } - /** - * 列表 + /** + * 列表(不分页,全量查询) */ + // 映射请求路径/messages/lists @RequestMapping("/lists") - public R list( MessagesEntity messages){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( messages, "messages")); + // 处理全量查询请求,参数为实体对象 + public R list(MessagesEntity messages) { + // 创建实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件:所有字段与实体对象相等(前缀为"messages") + ew.allEq(MPUtil.allEQMapPre(messages, "messages")); + // 返回成功响应,携带查询结果(视图列表) return R.ok().put("data", messagesService.selectListView(ew)); } - /** - * 查询 + /** + * 查询(单个对象) */ + // 映射请求路径/messages/query @RequestMapping("/query") - public R query(MessagesEntity messages){ - EntityWrapper< MessagesEntity> ew = new EntityWrapper< MessagesEntity>(); - ew.allEq(MPUtil.allEQMapPre( messages, "messages")); - MessagesView messagesView = messagesService.selectView(ew); - return R.ok("查询留言板成功").put("data", messagesView); + // 处理单个对象查询请求,参数为实体对象 + public R query(MessagesEntity messages) { + // 创建实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件:所有字段与实体对象相等(前缀为"messages") + ew.allEq(MPUtil.allEQMapPre(messages, "messages")); + // 调用服务类的视图查询方法 + MessagesView messagesView = messagesService.selectView(ew); + // 返回成功响应,携带查询结果和提示信息 + return R.ok("查询留言板成功").put("data", messagesView); } - + /** - * 后端详情 + * 后端详情(根据ID查询) */ + // 映射请求路径/messages/info/{id} @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + // 处理详情查询请求,参数为路径中的ID + public R info(@PathVariable("id") Long id) { + // 根据ID直接查询实体对象 MessagesEntity messages = messagesService.selectById(id); + // 返回成功响应,携带查询到的实体数据 return R.ok().put("data", messages); } /** - * 前端详情 + * 前端详情(根据ID查询) */ + // 映射请求路径/messages/detail/{id} @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + // 处理详情查询请求,参数为路径中的ID(前端调用) + public R detail(@PathVariable("id") Long id) { + // 根据ID直接查询实体对象 MessagesEntity messages = messagesService.selectById(id); + // 返回成功响应,携带查询到的实体数据 return R.ok().put("data", messages); } - + /** - * 后端保存 + * 后端保存(新增留言) */ + // 映射请求路径/messages/save @RequestMapping("/save") - public R save(@RequestBody MessagesEntity messages, HttpServletRequest request){ - messages.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(messages); + // 处理后端新增请求,请求体为实体对象,携带HTTP请求 + public R save(@RequestBody MessagesEntity messages, HttpServletRequest request) { + // 生成唯一ID(时间戳 + 随机数) + messages.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 实体验证(注释,未启用) + //ValidatorUtils.validateEntity(messages); + // 调用服务类的插入方法 messagesService.insert(messages); + // 返回成功响应 return R.ok(); } - + /** - * 前端保存 + * 前端保存(新增留言) */ + // 映射请求路径/messages/add @RequestMapping("/add") - public R add(@RequestBody MessagesEntity messages, HttpServletRequest request){ - messages.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(messages); - messages.setUserid((Long)request.getSession().getAttribute("userId")); + // 处理前端新增请求,请求体为实体对象,携带HTTP请求 + public R add(@RequestBody MessagesEntity messages, HttpServletRequest request) { + // 生成唯一ID(时间戳 + 随机数) + messages.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 实体验证(注释,未启用) + //ValidatorUtils.validateEntity(messages); + // 设置留言的用户ID为当前登录用户的ID + messages.setUserid((Long) request.getSession().getAttribute("userId")); + // 调用服务类的插入方法 messagesService.insert(messages); + // 返回成功响应 return R.ok(); } /** - * 修改 + * 修改(更新留言) */ + // 映射请求路径/messages/update @RequestMapping("/update") - public R update(@RequestBody MessagesEntity messages, HttpServletRequest request){ + // 处理修改请求,请求体为实体对象,携带HTTP请求 + public R update(@RequestBody MessagesEntity messages, HttpServletRequest request) { + // 实体验证(注释,未启用) //ValidatorUtils.validateEntity(messages); - messagesService.updateById(messages);//全部更新 + // 调用服务类的更新方法(根据ID全量更新) + messagesService.updateById(messages); // 全部更新 + // 返回成功响应 return R.ok(); } - + /** - * 删除 + * 删除(批量删除留言) */ + // 映射请求路径/messages/delete @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + // 处理删除请求,请求体为ID数组 + public R delete(@RequestBody Long[] ids) { + // 调用服务类的批量删除方法(根据ID列表) messagesService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** - * 提醒接口 + * 提醒接口(统计符合条件的留言数) */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - - int count = messagesService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + // 映射请求路径/messages/remind/{columnName}/{type} + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求,参数包括列名、类型、查询条件映射 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 向查询条件中添加列名和类型 + map.put("column", columnName); + map.put("type", type); + + // 如果类型为2(处理日期范围提醒) + if (type.equals("2")) { + // 创建日期格式化对象(yyyy-MM-dd格式) + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建日历对象 + Calendar c = Calendar.getInstance(); + // 提醒开始日期和结束日期变量 + Date remindStartDate = null; + Date remindEndDate = null; + // 处理提醒开始时间(相对当前日期偏移) + if (map.get("remindstart") != null) { + // 解析偏移天数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历为当前时间并添加偏移天数 + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取格式化后的提醒开始日期 + remindStartDate = c.getTime(); + map.put("remindstart", sdf.format(remindStartDate)); + } + // 处理提醒结束时间(相对当前日期偏移) + if (map.get("remindend") != null) { + // 解析偏移天数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历为当前时间并添加偏移天数 + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取格式化后的提醒结束日期 + remindEndDate = c.getTime(); + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建包装器用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 添加提醒开始时间的大于等于条件 + if (map.get("remindstart") != null) { + wrapper.ge(columnName, map.get("remindstart")); + } + // 添加提醒结束时间的小于等于条件 + if (map.get("remindend") != null) { + wrapper.le(columnName, map.get("remindend")); + } + + + // 调用服务类统计符合条件的记录数 + int count = messagesService.selectCount(wrapper); + // 返回成功响应,携带统计结果 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/NewsController.java b/src/main/java/com/controller/NewsController.java index 28c06a4..f560baa 100644 --- a/src/main/java/com/controller/NewsController.java +++ b/src/main/java/com/controller/NewsController.java @@ -1,208 +1,308 @@ package com.controller; +// 导入用于格式化日期的类 import java.text.SimpleDateFormat; +// 导入用于创建动态数组的类 import java.util.ArrayList; +// 导入用于操作数组的工具类 import java.util.Arrays; +// 导入用于处理日期和时间的类 import java.util.Calendar; +// 导入用于存储键值对的接口 import java.util.Map; +// 导入用于实现Map接口的HashMap类 import java.util.HashMap; +// 导入用于遍历集合的接口 import java.util.Iterator; +// 导入用于表示日期和时间的类 import java.util.Date; +// 导入用于创建列表的接口 import java.util.List; +// 导入用于处理HTTP请求的类 import javax.servlet.http.HttpServletRequest; +// 导入自定义的验证工具类 import com.utils.ValidatorUtils; +// 导入Apache Commons Lang库中的字符串处理工具类 import org.apache.commons.lang3.StringUtils; +// 导入Spring框架的自动注入注解 import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring框架的日期格式化注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Spring框架的路径变量注解 import org.springframework.web.bind.annotation.PathVariable; +// 导入Spring框架的请求体注解 import org.springframework.web.bind.annotation.RequestBody; +// 导入Spring框架的请求映射注解 import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +// 导入Spring框架的REST控制器注解 import org.springframework.web.bind.annotation.RestController; +// 导入MyBatis-Plus的实体包装器类 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入MyBatis-Plus的包装器接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解 import com.annotation.IgnoreAuth; +// 导入教育资讯实体类 import com.entity.NewsEntity; +// 导入教育资讯视图类 import com.entity.view.NewsView; +// 导入教育资讯服务类 import com.service.NewsService; +// 导入令牌服务类 import com.service.TokenService; +// 导入分页工具类 import com.utils.PageUtils; +// 导入自定义的响应类 import com.utils.R; +// 导入MD5加密工具类 import com.utils.MD5Util; +// 导入MyBatis-Plus工具类 import com.utils.MPUtil; +// 导入通用工具类 import com.utils.CommonUtil; /** * 教育资讯 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:15 */ +// 声明为REST控制器,用于处理HTTP请求 @RestController +// 映射请求路径,所有以/news开头的请求由该控制器处理 @RequestMapping("/news") public class NewsController { + // 自动注入教育资讯服务类实例 @Autowired private NewsService newsService; - /** - * 后端列表 + * 后端列表(分页查询) */ + // 映射请求路径/news/page @RequestMapping("/page") - public R page(@RequestParam Map params,NewsEntity news, - HttpServletRequest request){ + // 处理后端分页查询请求,参数包括查询条件、实体对象、HTTP请求 + public R page(@RequestParam Map params, NewsEntity news, + HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params)); - + // 调用服务类的分页查询方法,包含排序、范围查询、模糊查询处理 + PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params)); + // 返回成功响应,携带分页数据 return R.ok().put("data", page); } - + /** - * 前端列表 + * 前端列表(分页查询,忽略认证) */ - @IgnoreAuth + // 该接口忽略认证 + @IgnoreAuth + // 映射请求路径/news/list @RequestMapping("/list") - public R list(@RequestParam Map params,NewsEntity news, - HttpServletRequest request){ + // 处理前端分页查询请求,参数包括查询条件、实体对象、HTTP请求 + public R list(@RequestParam Map params, NewsEntity news, + HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params)); + // 调用服务类的分页查询方法,包含排序、范围查询、模糊查询处理 + PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params)); + // 返回成功响应,携带分页数据 return R.ok().put("data", page); } - /** - * 列表 + /** + * 列表(不分页,全量查询) */ + // 映射请求路径/news/lists @RequestMapping("/lists") - public R list( NewsEntity news){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( news, "news")); + // 处理全量查询请求,参数为实体对象 + public R list(NewsEntity news) { + // 创建实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件:所有字段与实体对象相等(前缀为"news") + ew.allEq(MPUtil.allEQMapPre(news, "news")); + // 返回成功响应,携带查询结果(视图列表) return R.ok().put("data", newsService.selectListView(ew)); } - /** - * 查询 + /** + * 查询(单个对象) */ + // 映射请求路径/news/query @RequestMapping("/query") - public R query(NewsEntity news){ - EntityWrapper< NewsEntity> ew = new EntityWrapper< NewsEntity>(); - ew.allEq(MPUtil.allEQMapPre( news, "news")); - NewsView newsView = newsService.selectView(ew); - return R.ok("查询教育资讯成功").put("data", newsView); + // 处理单个对象查询请求,参数为实体对象 + public R query(NewsEntity news) { + // 创建实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件:所有字段与实体对象相等(前缀为"news") + ew.allEq(MPUtil.allEQMapPre(news, "news")); + // 调用服务类的视图查询方法 + NewsView newsView = newsService.selectView(ew); + // 返回成功响应,携带查询结果和提示信息 + return R.ok("查询教育资讯成功").put("data", newsView); } - + /** - * 后端详情 + * 后端详情(根据ID查询) */ + // 映射请求路径/news/info/{id} @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + // 处理详情查询请求,参数为路径中的ID + public R info(@PathVariable("id") Long id) { + // 根据ID直接查询实体对象 NewsEntity news = newsService.selectById(id); + // 返回成功响应,携带查询到的实体数据 return R.ok().put("data", news); } /** - * 前端详情 + * 前端详情(根据ID查询,忽略认证) */ - @IgnoreAuth + // 该接口忽略认证 + @IgnoreAuth + // 映射请求路径/news/detail/{id} @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + // 处理详情查询请求,参数为路径中的ID(前端调用) + public R detail(@PathVariable("id") Long id) { + // 根据ID直接查询实体对象 NewsEntity news = newsService.selectById(id); + // 返回成功响应,携带查询到的实体数据 return R.ok().put("data", news); } - + /** - * 后端保存 + * 后端保存(新增教育资讯) */ + // 映射请求路径/news/save @RequestMapping("/save") - public R save(@RequestBody NewsEntity news, HttpServletRequest request){ - news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(news); + // 处理后端新增请求,请求体为实体对象,携带HTTP请求 + public R save(@RequestBody NewsEntity news, HttpServletRequest request) { + // 生成唯一ID(时间戳 + 随机数) + news.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 实体验证(注释,未启用) + //ValidatorUtils.validateEntity(news); + // 调用服务类的插入方法 newsService.insert(news); + // 返回成功响应 return R.ok(); } - + /** - * 前端保存 + * 前端保存(新增教育资讯) */ + // 映射请求路径/news/add @RequestMapping("/add") - public R add(@RequestBody NewsEntity news, HttpServletRequest request){ - news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(news); + // 处理前端新增请求,请求体为实体对象,携带HTTP请求 + public R add(@RequestBody NewsEntity news, HttpServletRequest request) { + // 生成唯一ID(时间戳 + 随机数) + news.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 实体验证(注释,未启用) + //ValidatorUtils.validateEntity(news); + // 调用服务类的插入方法 newsService.insert(news); + // 返回成功响应 return R.ok(); } /** - * 修改 + * 修改(更新教育资讯) */ + // 映射请求路径/news/update @RequestMapping("/update") - public R update(@RequestBody NewsEntity news, HttpServletRequest request){ + // 处理修改请求,请求体为实体对象,携带HTTP请求 + public R update(@RequestBody NewsEntity news, HttpServletRequest request) { + // 实体验证(注释,未启用) //ValidatorUtils.validateEntity(news); - newsService.updateById(news);//全部更新 + // 调用服务类的更新方法(根据ID全量更新) + newsService.updateById(news); // 全部更新 + // 返回成功响应 return R.ok(); } - + /** - * 删除 + * 删除(批量删除教育资讯) */ + // 映射请求路径/news/delete @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + // 处理删除请求,请求体为ID数组 + public R delete(@RequestBody Long[] ids) { + // 调用服务类的批量删除方法(根据ID列表) newsService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** - * 提醒接口 + * 提醒接口(统计符合条件的记录数) */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - - int count = newsService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + // 映射请求路径/news/remind/{columnName}/{type} + @RequestMapping("/remind/{columnName}/{type}") + // 处理提醒统计请求,参数包括列名、类型、查询条件映射 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 向查询条件中添加列名和类型 + map.put("column", columnName); + map.put("type", type); + + // 如果类型为2(处理日期范围提醒) + if (type.equals("2")) { + // 创建日期格式化对象(yyyy-MM-dd格式) + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建日历对象 + Calendar c = Calendar.getInstance(); + // 提醒开始日期和结束日期变量 + Date remindStartDate = null; + Date remindEndDate = null; + // 处理提醒开始时间(相对当前日期偏移) + if (map.get("remindstart") != null) { + // 解析偏移天数 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + // 设置日历为当前时间并添加偏移天数 + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取格式化后的提醒开始日期 + remindStartDate = c.getTime(); + map.put("remindstart", sdf.format(remindStartDate)); + } + // 处理提醒结束时间(相对当前日期偏移) + if (map.get("remindend") != null) { + // 解析偏移天数 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历为当前时间并添加偏移天数 + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取格式化后的提醒结束日期 + remindEndDate = c.getTime(); + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建包装器用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 添加提醒开始时间的大于等于条件 + if (map.get("remindstart") != null) { + wrapper.ge(columnName, map.get("remindstart")); + } + // 添加提醒结束时间的小于等于条件 + if (map.get("remindend") != null) { + wrapper.le(columnName, map.get("remindend")); + } + + + // 调用服务类统计符合条件的记录数 + int count = newsService.selectCount(wrapper); + // 返回成功响应,携带统计结果 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/ShipindianboController.java b/src/main/java/com/controller/ShipindianboController.java index 3f7c12e..429717d 100644 --- a/src/main/java/com/controller/ShipindianboController.java +++ b/src/main/java/com/controller/ShipindianboController.java @@ -1,219 +1,333 @@ +// 声明该类所在的包 package com.controller; +// 导入用于格式化日期的类,可将日期对象按照指定格式转换为字符串 import java.text.SimpleDateFormat; +// 导入用于创建动态数组的类,可根据需要动态调整数组大小 import java.util.ArrayList; +// 导入用于操作数组的工具类,提供了如排序、查找等方法 import java.util.Arrays; +// 导入用于处理日期和时间的类,可进行日期的计算、格式化等操作 import java.util.Calendar; +// 导入用于存储键值对的接口,可通过键快速查找对应的值 import java.util.Map; +// 导入用于实现 Map 接口的 HashMap 类,基于哈希表实现,存储键值对 import java.util.HashMap; +// 导入用于遍历集合的接口,可依次访问集合中的元素 import java.util.Iterator; +// 导入用于表示日期和时间的类,用于处理日期和时间相关操作 import java.util.Date; +// 导入用于创建列表的接口,可存储多个元素并进行操作 import java.util.List; +// 导入用于处理 HTTP 请求的类,封装了 HTTP 请求的相关信息 import javax.servlet.http.HttpServletRequest; +// 导入自定义的验证工具类,用于对实体对象进行验证 import com.utils.ValidatorUtils; +// 导入 Apache Commons Lang 库中的字符串处理工具类,提供了丰富的字符串操作方法 import org.apache.commons.lang3.StringUtils; +// 导入 Spring 框架的自动注入注解,可自动将依赖的对象注入到类中 import org.springframework.beans.factory.annotation.Autowired; +// 导入 Spring 框架的日期格式化注解,用于指定日期参数的格式 import org.springframework.format.annotation.DateTimeFormat; +// 导入 Spring 框架的路径变量注解,用于获取 URL 路径中的变量值 import org.springframework.web.bind.annotation.PathVariable; +// 导入 Spring 框架的请求体注解,用于将请求体中的数据绑定到方法参数上 import org.springframework.web.bind.annotation.RequestBody; +// 导入 Spring 框架的请求映射注解,用于将 HTTP 请求映射到控制器的方法上 import org.springframework.web.bind.annotation.RequestMapping; +// 导入 Spring 框架的请求参数注解,用于获取请求参数的值 import org.springframework.web.bind.annotation.RequestParam; +// 导入 Spring 框架的 REST 控制器注解,表明该类是一个 RESTful 风格的控制器 import org.springframework.web.bind.annotation.RestController; +// 导入 MyBatis-Plus 的实体包装器类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的包装器接口,是实体包装器的接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解,用于标记某些接口不需要进行认证 import com.annotation.IgnoreAuth; +// 导入视频点播实体类,包含视频点播的相关属性 import com.entity.ShipindianboEntity; +// 导入视频点播视图类,可能用于展示视频点播的相关信息 import com.entity.view.ShipindianboView; +// 导入视频点播服务类,处理视频点播的业务逻辑 import com.service.ShipindianboService; +// 导入令牌服务类,可能用于处理令牌相关业务 import com.service.TokenService; +// 导入分页工具类,用于处理分页查询相关操作 import com.utils.PageUtils; +// 导入自定义的响应类,用于封装接口的返回结果 import com.utils.R; +// 导入 MD5 加密工具类,用于对数据进行 MD5 加密 import com.utils.MD5Util; +// 导入 MyBatis-Plus 工具类,提供一些便捷的操作方法 import com.utils.MPUtil; +// 导入通用工具类,包含一些通用的工具方法 import com.utils.CommonUtil; /** * 视频点播 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:14 */ +// 声明该类为 REST 控制器,处理 HTTP 请求并返回 JSON 数据 @RestController +// 映射请求路径,所有以 /shipindianbo 开头的请求都会由该控制器处理 @RequestMapping("/shipindianbo") public class ShipindianboController { - @Autowired - private ShipindianboService shipindianboService; - + // 自动注入视频点播服务类的实例,用于调用服务层的方法 + @Autowired + private ShipindianboService shipindianboService; - /** - * 后端列表 - */ - @RequestMapping("/page") - public R page(@RequestParam Map params,ShipindianboEntity shipindianbo, - HttpServletRequest request){ + /** + * 后端列表 + */ + // 映射请求路径 /shipindianbo/page + @RequestMapping("/page") + // 处理后端分页查询视频点播列表的请求 + public R page(@RequestParam Map params, ShipindianboEntity shipindianbo, + HttpServletRequest request) { + // 从会话中获取表名 String tableName = request.getSession().getAttribute("tableName").toString(); - if(tableName.equals("yonghu")) { - shipindianbo.setYonghuzhanghao((String)request.getSession().getAttribute("username")); + // 如果表名是 "yonghu" + if (tableName.equals("yonghu")) { + // 设置视频点播实体的用户账号为会话中的用户名 + shipindianbo.setYonghuzhanghao((String) request.getSession().getAttribute("username")); } - EntityWrapper ew = new EntityWrapper(); + // 创建一个实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用视频点播服务类的查询分页方法,进行排序、范围和模糊查询 PageUtils page = shipindianboService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, shipindianbo), params), params)); + // 返回成功响应,并将分页数据放入响应中 + return R.ok().put("data", page); + } - return R.ok().put("data", page); - } - - /** - * 前端列表 - */ - @RequestMapping("/list") - public R list(@RequestParam Map params,ShipindianboEntity shipindianbo, - HttpServletRequest request){ + /** + * 前端列表 + */ + // 映射请求路径 /shipindianbo/list + @RequestMapping("/list") + // 处理前端分页查询视频点播列表的请求 + public R list(@RequestParam Map params, ShipindianboEntity shipindianbo, + HttpServletRequest request) { + // 从会话中获取表名 String tableName = request.getSession().getAttribute("tableName").toString(); - if(tableName.equals("yonghu")) { - shipindianbo.setYonghuzhanghao((String)request.getSession().getAttribute("username")); + // 如果表名是 "yonghu" + if (tableName.equals("yonghu")) { + // 设置视频点播实体的用户账号为会话中的用户名 + shipindianbo.setYonghuzhanghao((String) request.getSession().getAttribute("username")); } - EntityWrapper ew = new EntityWrapper(); + // 创建一个实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用视频点播服务类的查询分页方法,进行排序、范围和模糊查询 PageUtils page = shipindianboService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, shipindianbo), params), params)); - return R.ok().put("data", page); - } + // 返回成功响应,并将分页数据放入响应中 + return R.ok().put("data", page); + } /** - * 列表 - */ - @RequestMapping("/lists") - public R list( ShipindianboEntity shipindianbo){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( shipindianbo, "shipindianbo")); - return R.ok().put("data", shipindianboService.selectListView(ew)); - } - - /** - * 查询 - */ - @RequestMapping("/query") - public R query(ShipindianboEntity shipindianbo){ - EntityWrapper< ShipindianboEntity> ew = new EntityWrapper< ShipindianboEntity>(); - ew.allEq(MPUtil.allEQMapPre( shipindianbo, "shipindianbo")); - ShipindianboView shipindianboView = shipindianboService.selectView(ew); + * 列表 + */ + // 映射请求路径 /shipindianbo/lists + @RequestMapping("/lists") + // 处理查询视频点播列表的请求 + public R list(ShipindianboEntity shipindianbo) { + // 创建一个实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,所有字段相等 + ew.allEq(MPUtil.allEQMapPre(shipindianbo, "shipindianbo")); + // 返回成功响应,并将查询结果(视图列表)放入响应中 + return R.ok().put("data", shipindianboService.selectListView(ew)); + } + + /** + * 查询 + */ + // 映射请求路径 /shipindianbo/query + @RequestMapping("/query") + // 处理查询视频点播的请求 + public R query(ShipindianboEntity shipindianbo) { + // 创建一个实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,所有字段相等 + ew.allEq(MPUtil.allEQMapPre(shipindianbo, "shipindianbo")); + // 调用视频点播服务类的查询视图方法 + ShipindianboView shipindianboView = shipindianboService.selectView(ew); + // 返回成功响应,并将查询结果放入响应中,附带成功提示信息 return R.ok("查询视频点播成功").put("data", shipindianboView); - } - - /** - * 后端详情 - */ - @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ - ShipindianboEntity shipindianbo = shipindianboService.selectById(id); - return R.ok().put("data", shipindianbo); - } - - /** - * 前端详情 - */ - @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ - ShipindianboEntity shipindianbo = shipindianboService.selectById(id); - return R.ok().put("data", shipindianbo); - } - - - - - /** - * 后端保存 - */ - @RequestMapping("/save") - public R save(@RequestBody ShipindianboEntity shipindianbo, HttpServletRequest request){ - shipindianbo.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(shipindianbo); - shipindianboService.insert(shipindianbo); - return R.ok(); - } - - /** - * 前端保存 - */ - @RequestMapping("/add") - public R add(@RequestBody ShipindianboEntity shipindianbo, HttpServletRequest request){ - shipindianbo.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(shipindianbo); - shipindianbo.setUserid((Long)request.getSession().getAttribute("userId")); - shipindianboService.insert(shipindianbo); - return R.ok(); - } - - /** - * 修改 - */ - @RequestMapping("/update") - public R update(@RequestBody ShipindianboEntity shipindianbo, HttpServletRequest request){ - //ValidatorUtils.validateEntity(shipindianbo); - shipindianboService.updateById(shipindianbo);//全部更新 - return R.ok(); - } - - - /** - * 删除 - */ - @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ - shipindianboService.deleteBatchIds(Arrays.asList(ids)); - return R.ok(); - } - - /** - * 提醒接口 - */ + } + + /** + * 后端详情 + */ + // 映射请求路径 /shipindianbo/info/{id} + @RequestMapping("/info/{id}") + // 处理后端查询视频点播详情的请求 + public R info(@PathVariable("id") Long id) { + // 根据 ID 查询视频点播实体 + ShipindianboEntity shipindianbo = shipindianboService.selectById(id); + // 返回成功响应,并将查询结果放入响应中 + return R.ok().put("data", shipindianbo); + } + + /** + * 前端详情 + */ + // 映射请求路径 /shipindianbo/detail/{id} + @RequestMapping("/detail/{id}") + // 处理前端查询视频点播详情的请求 + public R detail(@PathVariable("id") Long id) { + // 根据 ID 查询视频点播实体 + ShipindianboEntity shipindianbo = shipindianboService.selectById(id); + // 返回成功响应,并将查询结果放入响应中 + return R.ok().put("data", shipindianbo); + } + + /** + * 后端保存 + */ + // 映射请求路径 /shipindianbo/save + @RequestMapping("/save") + // 处理后端保存视频点播的请求 + public R save(@RequestBody ShipindianboEntity shipindianbo, HttpServletRequest request) { + // 生成一个唯一的 ID + shipindianbo.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 验证实体(注释掉,未启用) + //ValidatorUtils.validateEntity(shipindianbo); + // 调用视频点播服务类的插入方法 + shipindianboService.insert(shipindianbo); + // 返回成功响应 + return R.ok(); + } + + /** + * 前端保存 + */ + // 映射请求路径 /shipindianbo/add + @RequestMapping("/add") + // 处理前端保存视频点播的请求 + public R add(@RequestBody ShipindianboEntity shipindianbo, HttpServletRequest request) { + // 生成一个唯一的 ID + shipindianbo.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 验证实体(注释掉,未启用) + //ValidatorUtils.validateEntity(shipindianbo); + // 设置视频点播实体的用户 ID 为会话中的用户 ID + shipindianbo.setUserid((Long) request.getSession().getAttribute("userId")); + // 调用视频点播服务类的插入方法 + shipindianboService.insert(shipindianbo); + // 返回成功响应 + return R.ok(); + } + + /** + * 修改 + */ + // 映射请求路径 /shipindianbo/update + @RequestMapping("/update") + // 处理修改视频点播的请求 + public R update(@RequestBody ShipindianboEntity shipindianbo, HttpServletRequest request) { + // 验证实体(注释掉,未启用) + //ValidatorUtils.validateEntity(shipindianbo); + // 调用视频点播服务类的更新方法,更新所有字段 + shipindianboService.updateById(shipindianbo); // 全部更新 + // 返回成功响应 + return R.ok(); + } + + /** + * 删除 + */ + // 映射请求路径 /shipindianbo/delete + @RequestMapping("/delete") + // 处理删除视频点播的请求 + public R delete(@RequestBody Long[] ids) { + // 调用视频点播服务类的批量删除方法 + shipindianboService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 + return R.ok(); + } + + /** + * 提醒接口 + */ + // 映射请求路径 /shipindianbo/remind/{columnName}/{type} @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { + // 处理提醒统计的请求 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名放入参数映射中 map.put("column", columnName); + // 将类型放入参数映射中 map.put("type", type); - - if(type.equals("2")) { + + // 如果类型为 2 + if (type.equals("2")) { + // 创建一个日期格式化对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建一个日历对象 Calendar c = Calendar.getInstance(); + // 提醒开始日期 Date remindStartDate = null; + // 提醒结束日期 Date remindEndDate = null; - if(map.get("remindstart")!=null) { + // 如果提醒开始参数不为空 + if (map.get("remindstart") != null) { + // 将提醒开始参数转换为整数 Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); + // 设置日历时间为当前时间 + c.setTime(new Date()); + // 在当前日期上加上提醒开始天数 + c.add(Calendar.DAY_OF_MONTH, remindStart); + // 获取提醒开始日期 remindStartDate = c.getTime(); + // 将提醒开始日期格式化后放入参数映射中 map.put("remindstart", sdf.format(remindStartDate)); } - if(map.get("remindend")!=null) { + // 如果提醒结束参数不为空 + if (map.get("remindend") != null) { + // 将提醒结束参数转换为整数 Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历时间为当前时间 c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); + // 在当前日期上加上提醒结束天数 + c.add(Calendar.DAY_OF_MONTH, remindEnd); + // 获取提醒结束日期 remindEndDate = c.getTime(); + // 将提醒结束日期格式化后放入参数映射中 map.put("remindend", sdf.format(remindEndDate)); } } - + + // 创建一个实体包装器,用于构建查询条件 Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { + // 如果提醒开始参数不为空 + if (map.get("remindstart") != null) { + // 设置查询条件,列名大于等于提醒开始日期 wrapper.ge(columnName, map.get("remindstart")); } - if(map.get("remindend")!=null) { + // 如果提醒结束参数不为空 + if (map.get("remindend") != null) { + // 设置查询条件,列名小于等于提醒结束日期 wrapper.le(columnName, map.get("remindend")); } + // 从会话中获取表名 String tableName = request.getSession().getAttribute("tableName").toString(); - if(tableName.equals("yonghu")) { - wrapper.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username")); + // 如果表名是 "yonghu" + if (tableName.equals("yonghu")) { + // 设置查询条件,用户账号等于会话中的用户名 + wrapper.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); } + // 调用视频点播服务类的统计方法,统计符合条件的记录数 int count = shipindianboService.selectCount(wrapper); + // 返回成功响应,并将统计结果放入响应中 return R.ok().put("count", count); } - - - -} +} \ No newline at end of file diff --git a/src/main/java/com/controller/StoreupController.java b/src/main/java/com/controller/StoreupController.java index 2236ae3..5d60cd8 100644 --- a/src/main/java/com/controller/StoreupController.java +++ b/src/main/java/com/controller/StoreupController.java @@ -1,217 +1,300 @@ package com.controller; +// 导入用于格式化日期的类,用于处理日期格式转换 import java.text.SimpleDateFormat; +// 导入动态数组类,用于创建和操作动态数组 import java.util.ArrayList; +// 导入数组工具类,提供数组相关操作方法 import java.util.Arrays; +// 导入日历类,用于处理日期和时间计算 import java.util.Calendar; +// 导入映射接口,用于存储键值对数据 import java.util.Map; +// 导入哈希表类,实现Map接口的哈希表数据结构 import java.util.HashMap; +// 导入迭代器接口,用于遍历集合元素 import java.util.Iterator; +// 导入日期类,用于处理日期和时间对象 import java.util.Date; +// 导入列表接口,用于创建有序集合 import java.util.List; +// 导入HTTP请求类,用于获取HTTP请求信息 import javax.servlet.http.HttpServletRequest; +// 导入自定义验证工具类,用于实体对象验证 import com.utils.ValidatorUtils; +// 导入字符串工具类,提供丰富的字符串操作方法 import org.apache.commons.lang3.StringUtils; +// 导入Spring自动注入注解,自动装配依赖对象 import org.springframework.beans.factory.annotation.Autowired; +// 导入日期格式注解,用于指定日期参数的格式 import org.springframework.format.annotation.DateTimeFormat; +// 导入路径变量注解,用于获取URL路径中的参数 import org.springframework.web.bind.annotation.PathVariable; +// 导入请求体注解,用于接收请求体中的数据 import org.springframework.web.bind.annotation.RequestBody; +// 导入请求映射注解,用于映射HTTP请求到方法 import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import com.baomidou.mybatisplus.mapper.EntityWrapper; -import com.baomidou.mybatisplus.mapper.Wrapper; -import com.annotation.IgnoreAuth; +import org.springframework.web.bind.annotation.RequestParam; // 导入请求参数注解,用于获取请求参数 +import org.springframework.web.bind.annotation.RestController; // 导入REST控制器注解,标记为RESTful控制器 +import com.baomidou.mybatisplus.mapper.EntityWrapper; // 导入MyBatis-Plus实体包装器,用于构建查询条件 +import com.baomidou.mybatisplus.mapper.Wrapper; // 导入MyBatis-Plus包装器接口 +import com.annotation.IgnoreAuth; // 导入自定义忽略认证注解 +// 导入收藏表实体类,对应数据库表结构 import com.entity.StoreupEntity; +// 导入收藏表视图类,用于展示扩展数据 import com.entity.view.StoreupView; +// 导入收藏表服务类,处理业务逻辑 import com.service.StoreupService; +// 导入令牌服务类,处理令牌相关逻辑(未在代码中使用,保留注释) import com.service.TokenService; +// 导入分页工具类,处理分页查询 import com.utils.PageUtils; +// 导入自定义响应类,封装接口返回数据 import com.utils.R; +// 导入MD5加密工具类,用于数据加密(未在代码中使用,保留注释) import com.utils.MD5Util; +// 导入MyBatis-Plus工具类,提供通用操作方法 import com.utils.MPUtil; +// 导入通用工具类,包含常用工具方法 import com.utils.CommonUtil; /** * 收藏表 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:15 */ +// 声明为REST控制器,处理HTTP请求并返回JSON响应 @RestController +// 映射请求路径,所有以/storeup开头的请求由该控制器处理 @RequestMapping("/storeup") public class StoreupController { + // 自动注入收藏表服务类实例,用于调用业务方法 @Autowired private StoreupService storeupService; - /** - * 后端列表 + * 后端列表(分页查询) */ + // 映射请求路径/storeup/page @RequestMapping("/page") - public R page(@RequestParam Map params,StoreupEntity storeup, - HttpServletRequest request){ - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - storeup.setUserid((Long)request.getSession().getAttribute("userId")); - } + // 处理后端分页查询请求,参数包括查询条件、实体对象、HTTP请求 + public R page(@RequestParam Map params, StoreupEntity storeup, + HttpServletRequest request) { + // 如果当前用户不是管理员 + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置收藏表的用户ID为当前登录用户的ID(非管理员只能查看自己的数据) + storeup.setUserid((Long) request.getSession().getAttribute("userId")); + } + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = storeupService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, storeup), params), params)); - + // 调用服务类的分页查询方法,包含排序、范围查询、模糊查询处理 + PageUtils page = storeupService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, storeup), params), params)); + // 返回成功响应,携带分页数据 return R.ok().put("data", page); } - + /** - * 前端列表 + * 前端列表(分页查询) */ + // 映射请求路径/storeup/list @RequestMapping("/list") - public R list(@RequestParam Map params,StoreupEntity storeup, - HttpServletRequest request){ - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - storeup.setUserid((Long)request.getSession().getAttribute("userId")); - } + // 处理前端分页查询请求,逻辑与后端类似,非管理员限制用户ID + public R list(@RequestParam Map params, StoreupEntity storeup, + HttpServletRequest request) { + // 如果当前用户不是管理员 + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + // 设置收藏表的用户ID为当前登录用户的ID + storeup.setUserid((Long) request.getSession().getAttribute("userId")); + } + // 创建实体包装器 EntityWrapper ew = new EntityWrapper(); - PageUtils page = storeupService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, storeup), params), params)); + // 调用分页查询方法 + PageUtils page = storeupService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, storeup), params), params)); + // 返回分页数据 return R.ok().put("data", page); } - /** - * 列表 + /** + * 列表(全量查询,不分页) */ + // 映射请求路径/storeup/lists @RequestMapping("/lists") - public R list( StoreupEntity storeup){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( storeup, "storeup")); + // 处理全量查询请求,根据实体对象的属性构建查询条件 + public R list(StoreupEntity storeup) { + // 创建实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件:所有字段与实体对象相等(前缀为"storeup") + ew.allEq(MPUtil.allEQMapPre(storeup, "storeup")); + // 返回查询结果(视图列表) return R.ok().put("data", storeupService.selectListView(ew)); } - /** - * 查询 + /** + * 查询(单个对象) */ + // 映射请求路径/storeup/query @RequestMapping("/query") - public R query(StoreupEntity storeup){ - EntityWrapper< StoreupEntity> ew = new EntityWrapper< StoreupEntity>(); - ew.allEq(MPUtil.allEQMapPre( storeup, "storeup")); - StoreupView storeupView = storeupService.selectView(ew); - return R.ok("查询收藏表成功").put("data", storeupView); + // 根据实体对象的属性查询单个收藏记录(通常用于精确查询) + public R query(StoreupEntity storeup) { + // 创建实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置全字段相等查询条件 + ew.allEq(MPUtil.allEQMapPre(storeup, "storeup")); + // 调用服务类的视图查询方法,获取包含关联数据的视图对象 + StoreupView storeupView = storeupService.selectView(ew); + // 返回成功响应及查询结果 + return R.ok("查询收藏表成功").put("data", storeupView); } - + /** - * 后端详情 + * 后端详情(根据ID查询) */ + // 映射路径参数/{id}获取记录ID @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + // 根据ID查询收藏记录详情(后端使用) + public R info(@PathVariable("id") Long id) { + // 通过ID直接查询实体对象 StoreupEntity storeup = storeupService.selectById(id); + // 返回实体数据 return R.ok().put("data", storeup); } /** - * 前端详情 + * 前端详情(根据ID查询) */ + // 映射路径参数/{id},前端调用的详情接口 @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + // 逻辑与后端详情一致,返回实体数据 + public R detail(@PathVariable("id") Long id) { StoreupEntity storeup = storeupService.selectById(id); return R.ok().put("data", storeup); } - + /** - * 后端保存 + * 后端保存(新增收藏记录) */ + // 处理POST请求,接收请求体中的实体对象 @RequestMapping("/save") - public R save(@RequestBody StoreupEntity storeup, HttpServletRequest request){ - storeup.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(storeup); - storeup.setUserid((Long)request.getSession().getAttribute("userId")); + public R save(@RequestBody StoreupEntity storeup, HttpServletRequest request) { + // 生成唯一ID(时间戳+随机数,确保唯一性) + storeup.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 实体验证(注释:未启用,如需验证可取消注释) + //ValidatorUtils.validateEntity(storeup); + // 设置用户ID为当前登录用户的ID(后端保存时自动填充) + storeup.setUserid((Long) request.getSession().getAttribute("userId")); + // 调用服务类的插入方法 storeupService.insert(storeup); + // 返回成功响应 return R.ok(); } - + /** - * 前端保存 + * 前端保存(新增收藏记录) */ + // 前端调用的新增接口,逻辑与后端保存一致 @RequestMapping("/add") - public R add(@RequestBody StoreupEntity storeup, HttpServletRequest request){ - storeup.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(storeup); - storeup.setUserid((Long)request.getSession().getAttribute("userId")); + public R add(@RequestBody StoreupEntity storeup, HttpServletRequest request) { + // 生成唯一ID + storeup.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 实体验证(未启用) + //ValidatorUtils.validateEntity(storeup); + // 设置用户ID(前端请求时自动关联当前用户) + storeup.setUserid((Long) request.getSession().getAttribute("userId")); + // 插入数据库 storeupService.insert(storeup); return R.ok(); } /** - * 修改 + * 修改(更新收藏记录) */ + // 处理PUT请求,更新已有记录 @RequestMapping("/update") - public R update(@RequestBody StoreupEntity storeup, HttpServletRequest request){ + public R update(@RequestBody StoreupEntity storeup, HttpServletRequest request) { + // 实体验证(未启用) //ValidatorUtils.validateEntity(storeup); - storeupService.updateById(storeup);//全部更新 + // 根据ID更新实体对象(全字段更新) + storeupService.updateById(storeup); // 注释:标记为全部更新 return R.ok(); } - + /** - * 删除 + * 删除(批量删除收藏记录) */ + // 处理DELETE请求,接收ID数组 @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + public R delete(@RequestBody Long[] ids) { + // 将ID数组转换为列表,批量删除 storeupService.deleteBatchIds(Arrays.asList(ids)); return R.ok(); } - + /** - * 提醒接口 + * 提醒接口(统计符合条件的记录数) */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - if(!request.getSession().getAttribute("role").toString().equals("管理员")) { - wrapper.eq("userid", (Long)request.getSession().getAttribute("userId")); - } - - - int count = storeupService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + // 映射路径参数{columnName}/{type},处理提醒相关统计 + @RequestMapping("/remind/{columnName}/{type}") + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 向参数映射中添加列名和类型,用于后续处理 + map.put("column", columnName); + map.put("type", type); + + // 如果是日期范围提醒(type=2,相对当前日期计算提醒时间) + if (type.equals("2")) { + // 创建日期格式化对象(格式:yyyy-MM-dd) + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取日历实例,用于日期计算 + Calendar c = Calendar.getInstance(); + Date remindStartDate = null; // 提醒开始日期 + Date remindEndDate = null; // 提醒结束日期 + // 处理提醒开始时间(偏移天数转日期) + if (map.get("remindstart") != null) { + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + c.setTime(new Date()); // 设置为当前时间 + c.add(Calendar.DAY_OF_MONTH, remindStart); // 添加偏移天数 + remindStartDate = c.getTime(); // 获取计算后的日期 + map.put("remindstart", sdf.format(remindStartDate)); // 格式化后存入参数 + } + // 处理提醒结束时间(逻辑同上) + if (map.get("remindend") != null) { + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindEnd); + remindEndDate = c.getTime(); + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建包装器构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 添加提醒开始时间的大于等于条件 + if (map.get("remindstart") != null) { + wrapper.ge(columnName, map.get("remindstart")); + } + // 添加提醒结束时间的小于等于条件 + if (map.get("remindend") != null) { + wrapper.le(columnName, map.get("remindend")); + } + // 非管理员用户限制只能查询自己的数据 + if (!request.getSession().getAttribute("role").toString().equals("管理员")) { + wrapper.eq("userid", (Long) request.getSession().getAttribute("userId")); + } + + // 统计符合条件的记录数 + int count = storeupService.selectCount(wrapper); + // 返回统计结果 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/UserController.java b/src/main/java/com/controller/UserController.java index 6bce00a..170f85c 100644 --- a/src/main/java/com/controller/UserController.java +++ b/src/main/java/com/controller/UserController.java @@ -1,174 +1,855 @@ - package com.controller; - +// 导入数组操作工具类,提供数组相关操作方法(如排序、查找等) import java.util.Arrays; +// 导入日历类,用于处理日期和时间(如日期计算、格式化等) import java.util.Calendar; +// 导入日期类,用于表示具体的日期和时间 import java.util.Date; +// 导入映射接口,用于存储键值对数据(如参数映射、结果集等) import java.util.Map; +// 导入列表接口,用于存储有序的元素集合 +import java.util.List; +// 导入链表实现类,提供高效的列表操作(如插入、删除) +import java.util.LinkedList; +// 导入哈希表实现类,提供键值对的快速存储和查找 +import java.util.HashMap; +// 导入迭代器接口,用于遍历集合中的元素 +import java.util.Iterator; +// 导入HTTP请求处理类,用于获取请求参数、会话等信息 import javax.servlet.http.HttpServletRequest; +// 导入Spring自动注入注解,自动装配依赖的服务类 import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring控制器注解(冗余导入,实际使用@RestController,保留注释说明) import org.springframework.stereotype.Controller; +// 导入Spring GET请求映射注解,处理GET方法的请求 import org.springframework.web.bind.annotation.GetMapping; +// 导入Spring路径变量注解,获取URL路径中的参数值 import org.springframework.web.bind.annotation.PathVariable; +// 导入Spring POST请求映射注解,处理POST方法的请求 import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; +// 导入Spring请求映射注解,定义URL路径与方法的映射关系 import org.springframework.web.bind.annotation.RequestMapping; +// 导入Spring请求参数注解,获取请求参数的值 import org.springframework.web.bind.annotation.RequestParam; +// 导入Spring响应体注解(冗余导入,@RestController已包含,保留注释说明) import org.springframework.web.bind.annotation.ResponseBody; +// 导入Spring REST控制器注解,标记为RESTful风格控制器并自动返回JSON响应 import org.springframework.web.bind.annotation.RestController; +// 导入自定义忽略认证注解,标记无需认证的接口 import com.annotation.IgnoreAuth; +// 导入MyBatis-Plus实体包装器类,用于构建数据库查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入用户实体类,对应数据库用户表 import com.entity.TokenEntity; import com.entity.UserEntity; +// 导入角色实体类,对应数据库角色表 +import com.entity.RoleEntity; +// 导入权限实体类,对应数据库权限表 +import com.entity.PermissionEntity; +// 导入用户服务类,处理用户相关业务逻辑 import com.service.TokenService; import com.service.UserService; +// 导入角色服务类,处理角色相关业务逻辑 +import com.service.RoleService; +// 导入权限服务类,处理权限相关业务逻辑 +import com.service.PermissionService; +// 导入通用工具类,包含常用辅助方法 import com.utils.CommonUtil; +// 导入MyBatis-Plus工具类,提供通用数据库操作工具 import com.utils.MPUtil; +// 导入分页工具类,处理分页查询结果 import com.utils.PageUtils; +// 导入自定义响应类,封装统一的响应格式 import com.utils.R; +// 导入验证工具类,用于实体对象的参数验证 import com.utils.ValidatorUtils; /** - * 登录相关 + * 登录相关控制器 + * 处理用户登录、注册、权限管理等接口 */ +// 定义请求路径前缀为"/users",所有接口路径均以此开头 @RequestMapping("users") +// 声明为REST控制器,处理HTTP请求并返回JSON数据 @RestController -public class UserController{ - +public class UserController { + + // 自动注入用户服务类实例,用于调用用户相关数据库操作 @Autowired private UserService userService; - + + // 自动注入令牌服务类实例,用于生成和管理用户令牌 @Autowired private TokenService tokenService; + // 自动注入角色服务类实例,用于处理角色相关业务 + @Autowired + private RoleService roleService; + + // 自动注入权限服务类实例,用于处理权限相关业务 + @Autowired + private PermissionService permissionService; + /** - * 登录 + * 登录接口 + * 允许匿名访问,处理用户登录请求 */ + // 标记该接口无需认证 @IgnoreAuth + // 映射POST请求路径"/login" @PostMapping(value = "/login") + // 定义登录方法,接收用户名、密码、验证码和HTTP请求 public R login(String username, String password, String captcha, HttpServletRequest request) { + // 根据用户名查询用户实体(从数据库中查找匹配的用户) UserEntity user = userService.selectOne(new EntityWrapper().eq("username", username)); - if(user==null || !user.getPassword().equals(password)) { + // 验证用户是否存在且密码是否正确 + if (user == null || !user.getPassword().equals(password)) { + // 返回错误响应,提示账号或密码不正确 return R.error("账号或密码不正确"); } - String token = tokenService.generateToken(user.getId(),username, "users", user.getRole()); + // 生成用户令牌(参数:用户ID、用户名、表名、用户角色) + String token = tokenService.generateToken(user.getId(), username, "users", user.getRole()); + // 返回成功响应,携带生成的令牌 return R.ok().put("token", token); } - + /** - * 注册 + * 注册接口 + * 允许匿名访问,处理用户注册请求 */ + // 标记该接口无需认证 @IgnoreAuth + // 映射POST请求路径"/register",接收请求体中的用户实体 @PostMapping(value = "/register") - public R register(@RequestBody UserEntity user){ + public R register(@RequestBody UserEntity user) { + // 注释:实体验证(此处代码被注释,未启用参数验证) // ValidatorUtils.validateEntity(user); - if(userService.selectOne(new EntityWrapper().eq("username", user.getUsername())) !=null) { - return R.error("用户已存在"); - } - userService.insert(user); - return R.ok(); - } + // 检查用户名是否已存在(数据库中是否有相同用户名的记录) + if (userService.selectOne(new EntityWrapper().eq("username", user.getUsername())) != null) { + // 返回错误响应,提示用户已存在 + return R.error("用户已存在"); + } + // 插入新用户到数据库 + userService.insert(user); + // 返回成功响应 + return R.ok(); + } /** - * 退出 + * 退出登录接口 + * 处理用户退出请求,使当前会话失效 */ + // 映射GET请求路径"logout" @GetMapping(value = "logout") public R logout(HttpServletRequest request) { + // 使当前HTTP会话失效,清除用户登录状态 request.getSession().invalidate(); + // 返回成功响应,提示退出成功 return R.ok("退出成功"); } - + /** - * 密码重置 - */ - @IgnoreAuth + * 密码重置接口 + * 允许匿名访问,处理用户密码重置请求 + */ + // 标记该接口无需认证 + @IgnoreAuth + // 映射任意请求方法路径"/resetPass" @RequestMapping(value = "/resetPass") - public R resetPass(String username, HttpServletRequest request){ - UserEntity user = userService.selectOne(new EntityWrapper().eq("username", username)); - if(user==null) { - return R.error("账号不存在"); - } - user.setPassword("123456"); - userService.update(user,null); - return R.ok("密码已重置为:123456"); - } - - /** - * 列表 - */ - @RequestMapping("/page") - public R page(@RequestParam Map params,UserEntity user){ - EntityWrapper ew = new EntityWrapper(); - PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params)); - return R.ok().put("data", page); - } - - /** - * 列表 - */ - @RequestMapping("/list") - public R list( UserEntity user){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( user, "user")); - return R.ok().put("data", userService.selectListView(ew)); - } - - /** - * 信息 - */ - @RequestMapping("/info/{id}") - public R info(@PathVariable("id") String id){ - UserEntity user = userService.selectById(id); - return R.ok().put("data", user); - } - - /** - * 获取用户的session用户信息 - */ - @RequestMapping("/session") - public R getCurrUser(HttpServletRequest request){ - Long id = (Long)request.getSession().getAttribute("userId"); - UserEntity user = userService.selectById(id); - return R.ok().put("data", user); - } - - /** - * 保存 - */ - @PostMapping("/save") - public R save(@RequestBody UserEntity user){ + public R resetPass(String username, HttpServletRequest request) { + // 根据用户名查询用户实体 + UserEntity user = userService.selectOne(new EntityWrapper().eq("username", username)); + // 检查用户是否存在 + if (user == null) { + // 返回错误响应,提示账号不存在 + return R.error("账号不存在"); + } + // 将用户密码重置为默认值"123456" + user.setPassword("123456"); + // 更新用户信息(第二个参数为null表示更新所有匹配记录,此处按ID更新) + userService.update(user, null); + // 返回成功响应,提示密码重置结果 + return R.ok("密码已重置为:123456"); + } + + /** + * 用户列表接口(分页查询) + * 处理用户列表的分页查询请求 + */ + // 映射任意请求方法路径"/page" + @RequestMapping("/page") + public R page(@RequestParam Map params, UserEntity user) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 调用用户服务的分页查询方法(包含排序、范围查询、模糊查询处理) + PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params)); + // 返回成功响应,携带分页数据 + return R.ok().put("data", page); + } + + /** + * 用户列表接口(全量查询) + * 处理用户列表的全量查询请求 + */ + // 映射任意请求方法路径"/list" + @RequestMapping("/list") + public R list(UserEntity user) { + // 创建实体包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件:所有字段与实体对象相等(前缀为"user",避免字段名冲突) + ew.allEq(MPUtil.allEQMapPre(user, "user")); + // 返回成功响应,携带查询结果(视图列表,可能包含关联数据) + return R.ok().put("data", userService.selectListView(ew)); + } + + /** + * 用户详情接口 + * 根据用户ID查询用户详细信息 + */ + // 映射任意请求方法路径"/info/{id}",{id}为路径参数 + @RequestMapping("/info/{id}") + public R info(@PathVariable("id") String id) { + // 根据用户ID查询用户实体(从数据库中获取用户详情) + UserEntity user = userService.selectById(id); + // 返回成功响应,携带用户数据 + return R.ok().put("data", user); + } + + /** + * 获取当前会话用户信息接口 + * 获取当前登录用户的会话信息 + */ + // 映射任意请求方法路径"/session" + @RequestMapping("/session") + public R getCurrUser(HttpServletRequest request) { + // 从会话中获取用户ID(登录时存储的用户标识) + Long id = (Long) request.getSession().getAttribute("userId"); + // 根据用户ID查询用户实体 + UserEntity user = userService.selectById(id); + // 返回成功响应,携带当前用户数据 + return R.ok().put("data", user); + } + + /** + * 保存用户接口(新增用户) + * 处理新增用户请求 + */ + // 映射POST请求路径"/save",接收请求体中的用户实体 + @PostMapping("/save") + public R save(@RequestBody UserEntity user) { + // 注释:实体验证(此处代码被注释,未启用参数验证) // ValidatorUtils.validateEntity(user); - if(userService.selectOne(new EntityWrapper().eq("username", user.getUsername())) !=null) { - return R.error("用户已存在"); - } - userService.insert(user); - return R.ok(); - } - - /** - * 修改 - */ - @RequestMapping("/update") - public R update(@RequestBody UserEntity user){ + // 检查用户名是否已存在(除当前用户外,避免更新时冲突) + if (userService.selectOne(new EntityWrapper().eq("username", user.getUsername())) != null) { + // 返回错误响应,提示用户已存在 + return R.error("用户已存在"); + } + // 插入新用户到数据库 + userService.insert(user); + // 返回成功响应 + return R.ok(); + } + + /** + * 修改用户接口 + * 处理用户信息修改请求 + */ + // 映射任意请求方法路径"/update",接收请求体中的用户实体 + @RequestMapping("/update") + public R update(@RequestBody UserEntity user) { + // 注释:实体验证(此处代码被注释,未启用参数验证) // ValidatorUtils.validateEntity(user); - UserEntity u = userService.selectOne(new EntityWrapper().eq("username", user.getUsername())); - if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) { - return R.error("用户名已存在。"); - } - userService.updateById(user);//全部更新 - return R.ok(); - } - - /** - * 删除 - */ - @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ - userService.deleteBatchIds(Arrays.asList(ids)); - return R.ok(); - } -} + // 根据用户名查询用户实体(检查用户名是否被其他用户占用) + UserEntity u = userService.selectOne(new EntityWrapper().eq("username", user.getUsername())); + // 检查用户名是否已被其他用户使用(ID不同但用户名相同) + if (u != null && u.getId() != user.getId() && u.getUsername().equals(user.getUsername())) { + // 返回错误响应,提示用户名已存在 + return R.error("用户名已存在。"); + } + // 根据用户ID更新用户信息(全字段更新,覆盖数据库中现有记录) + userService.updateById(user); // 注释:标记为全部更新,非部分更新 + // 返回成功响应 + return R.ok(); + } + + /** + * 删除用户接口(批量删除) + * 处理用户批量删除请求 + */ + // 映射任意请求方法路径"/delete",接收请求体中的用户ID数组 + @RequestMapping("/delete") + public R delete(@RequestBody Long[] ids) { + // 将用户ID数组转换为列表,批量删除对应的用户记录 + userService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 + return R.ok(); + } + + /** + * 获取用户的角色信息接口 + * 根据用户ID查询用户所属角色 + */ + // 映射任意请求方法路径"/roles/{userId}",{userId}为用户ID + @RequestMapping("/roles/{userId}") + public R getUserRoles(@PathVariable("userId") Long userId) { + // 根据用户ID查询用户实体 + UserEntity user = userService.selectById(userId); + // 检查用户是否存在 + if (user == null) { + // 返回错误响应,提示用户不存在 + return R.error("用户不存在"); + } + // 根据用户角色ID查询角色信息(用户实体中存储角色ID,关联角色表) + RoleEntity role = roleService.selectById(user.getRole()); + // 返回成功响应,携带角色数据 + return R.ok().put("role", role); + } + + /** + * 获取角色的权限信息接口 + * 根据角色ID查询角色拥有的权限 + */ + // 映射任意请求方法路径"/permissions/{roleId}",{roleId}为角色ID + @RequestMapping("/permissions/{roleId}") + public R getRolePermissions(@PathVariable("roleId") Long roleId) { + // 根据角色ID查询角色实体 + RoleEntity role = roleService.selectById(roleId); + // 检查角色是否存在 + if (role == null) { + // 返回错误响应,提示角色不存在 + return R.error("角色不存在"); + } + // 根据角色ID查询权限信息(权限表中存储角色ID,关联查询) + List permissions = permissionService.selectList(new EntityWrapper().eq("role_id", roleId)); + // 返回成功响应,携带权限列表 + return R.ok().put("permissions", permissions); + } + + /** + * 新增角色接口 + * 处理新增角色请求 + */ + // 映射POST请求路径"/roles/add",接收请求体中的角色实体 + @PostMapping("/roles/add") + public R addRole(@RequestBody RoleEntity role) { + // 检查角色名是否已存在(避免重复角色名) + if (roleService.selectOne(new EntityWrapper().eq("role_name", role.getRoleName())) != null) { + // 返回错误响应,提示角色名已存在 + return R.error("角色名已存在"); + } + // 插入新角色到数据库 + roleService.insert(role); + // 返回成功响应 + return R.ok(); + } + + /** + * 修改角色信息接口 + * 处理角色信息修改请求 + */ + // 映射任意请求方法路径"/roles/update",接收请求体中的角色实体 + @RequestMapping("/roles/update") + public R updateRole(@RequestBody RoleEntity role) { + // 检查角色名是否已被其他角色使用(更新时排除自身ID) + RoleEntity existingRole = roleService.selectOne(new EntityWrapper().eq("role_name", role.getRoleName())); + if (existingRole != null && existingRole.getId() != role.getId()) { + // 返回错误响应,提示角色名已存在 + return R.error("角色名已存在"); + } + // 更新角色信息到数据库 + roleService.updateById(role); + // 返回成功响应 + return R.ok(); + } + + /** + * 删除角色接口 + * 处理角色删除请求(需先检查是否有用户关联) + */ + // 映射任意请求方法路径"/roles/delete/{roleId}",{roleId}为角色ID + @RequestMapping("/roles/delete/{roleId}") + public R deleteRole(@PathVariable("roleId") Long roleId) { + // 检查该角色是否有用户关联(查询所有拥有该角色的用户) + List users = userService.selectList(new EntityWrapper().eq("role", roleId)); + if (!users.isEmpty()) { + // 返回错误响应,提示角色下存在用户,无法删除 + return R.error("该角色下存在用户,无法删除"); + } + // 删除角色记录 + roleService.deleteById(roleId); + // 返回成功响应 + return R.ok(); + } + + /** + * 新增权限接口 + * 处理新增权限请求 + */ + // 映射POST请求路径"/permissions/add",接收请求体中的权限实体 + @PostMapping("/permissions/add") + public R addPermission(@RequestBody PermissionEntity permission) { + // 检查权限名是否已存在(避免重复权限名) + if (permissionService.selectOne(new EntityWrapper().eq("permission_name", permission.getPermissionName())) != null) { + // 返回错误响应,提示权限名已存在 + return R.error("权限名已存在"); + } + // 插入新权限到数据库 + permissionService.insert(permission); + // 返回成功响应 + return R.ok(); + } + + /** + * 修改权限信息接口 + * 处理权限信息修改请求 + */ + // 映射任意请求方法路径"/permissions/update",接收请求体中的权限实体 + @RequestMapping("/permissions/update") + public R updatePermission(@RequestBody PermissionEntity permission) { + // 检查权限名是否已被其他权限使用(更新时排除自身ID) + PermissionEntity existingPermission = permissionService.selectOne(new EntityWrapper().eq("permission_name", permission.getPermissionName())); + if (existingPermission != null && existingPermission.getId() != permission.getId()) { + // 返回错误响应,提示权限名已存在 + return R.error("权限名已存在"); + } + // 更新权限信息到数据库 + permissionService.updateById(permission); + // 返回成功响应 + return R.ok(); + } + + /** + * 删除权限接口 + * 处理权限删除请求 + */ + // 映射任意请求方法路径"/permissions/delete/{permissionId}",{permissionId}为权限ID + @RequestMapping("/permissions/delete/{permissionId}") + public R deletePermission(@PathVariable("permissionId") Long permissionId) { + // 删除指定ID的权限记录 + permissionService.deleteById(permissionId); + // 返回成功响应 + return R.ok(); + } + + /** + * 为用户分配角色接口 + * 将指定角色分配给用户 + */ + // 映射POST请求路径"/users/{userId}/assignRole/{roleId}",路径参数为用户ID和角色ID + @PostMapping("/users/{userId}/assignRole/{roleId}") + public R assignRoleToUser(@PathVariable("userId") Long userId, @PathVariable("roleId") Long roleId) { + // 检查用户是否存在 + UserEntity user = userService.selectById(userId); + if (user == null) { + // 返回错误响应,提示用户不存在 + return R.error("用户不存在"); + } + // 检查角色是否存在 + RoleEntity role = roleService.selectById(roleId); + if (role == null) { + // 返回错误响应,提示角色不存在 + return R.error("角色不存在"); + } + // 更新用户的角色ID为指定角色ID + user.setRole(roleId); + userService.updateById(user); + // 返回成功响应 + return R.ok(); + } + + /** + * 为角色分配权限接口 + * 将指定权限分配给角色 + */ + // 映射POST请求路径"/roles/{roleId}/assignPermission/{permissionId}",路径参数为角色ID和权限ID + @PostMapping("/roles/{roleId}/assignPermission/{permissionId}") + public R assignPermissionToRole(@PathVariable("roleId") Long roleId, @PathVariable("permissionId") Long permissionId) { + // 检查角色是否存在 + RoleEntity role = roleService.selectById(roleId); + if (role == null) { + // 返回错误响应,提示角色不存在 + return R.error("角色不存在"); + } + // 检查权限是否存在 + PermissionEntity permission = permissionService.selectById(permissionId); + if (permission == null) { + // 返回错误响应,提示权限不存在 + return R.error("权限不存在"); + } + // 更新权限的角色ID为指定角色ID(假设权限表中直接存储角色ID) + permission.setRoleId(roleId); + permissionService.updateById(permission); + // 返回成功响应 + return R.ok(); + } + + /** + * 统计用户数量接口 + * 统计系统中的用户总数 + */ + // 映射任意请求方法路径"/users/count" + @RequestMapping("/users/count") + public R countUsers() { + // 统计用户表中的记录数 + Integer userCount = userService.selectCount(new EntityWrapper()); + // 返回成功响应,携带用户数量 + return R.ok().put("userCount", userCount); + } + + /** + * 统计角色数量接口 + * 统计系统中的角色总数 + */ + // 映射任意请求方法路径"/roles/count" + @RequestMapping("/roles/count") + public R countRoles() { + // 统计角色表中的记录数 + Integer roleCount = roleService.selectCount(new EntityWrapper()); + // 返回成功响应,携带角色数量 + return R.ok().put("roleCount", roleCount); + } + + /** + * 统计权限数量接口 + * 统计系统中的权限总数 + */ + // 映射任意请求方法路径"/permissions/count" + @RequestMapping("/permissions/count") + public R countPermissions() { + // 统计权限表中的记录数 + Integer permissionCount = permissionService.selectCount(new EntityWrapper()); + // 返回成功响应,携带权限数量 + return R.ok().put("permissionCount", permissionCount); + } + + /** + * 根据用户名模糊查询用户列表接口 + * 处理用户名模糊查询请求 + */ + // 映射任意请求方法路径"/users/search/{keyword}",{keyword}为搜索关键词 + @RequestMapping("/users/search/{keyword}") + public R searchUsers(@PathVariable("keyword") String keyword) { + // 创建实体包装器,设置用户名模糊查询条件(包含关键词) + EntityWrapper ew = new EntityWrapper().like("username", keyword); + // 查询符合条件的用户列表 + List users = userService.selectList(ew); + // 返回成功响应,携带查询结果 + return R.ok().put("users", users); + } + + /** + * 根据角色名模糊查询角色列表接口 + * 处理角色名模糊查询请求 + */ + // 映射任意请求方法路径"/roles/search/{keyword}",{keyword}为搜索关键词 + @RequestMapping("/roles/search/{keyword}") + public R searchRoles(@PathVariable("keyword") String keyword) { + // 创建实体包装器,设置角色名模糊查询条件(包含关键词) + EntityWrapper ew = new EntityWrapper().like("role_name", keyword); + // 查询符合条件的角色列表 + List roles = roleService.selectList(ew); + // 返回成功响应,携带查询结果 + return R.ok().put("roles", roles); + } + + /** + * 根据权限名模糊查询权限列表接口 + * 处理权限名模糊查询请求 + */ + // 映射任意请求方法路径"/permissions/search/{keyword}",{keyword}为搜索关键词 + @RequestMapping("/permissions/search/{keyword}") + public R searchPermissions(@PathVariable("keyword") String keyword) { + // 创建实体包装器,设置权限名模糊查询条件(包含关键词) + EntityWrapper ew = new EntityWrapper().like("permission_name", keyword); + // 查询符合条件的权限列表 + List permissions = permissionService.selectList(ew); + // 返回成功响应,携带查询结果 + return R.ok().put("permissions", permissions); + } + + /** + * 获取所有用户及其角色信息接口 + * 查询所有用户及其关联的角色信息 + */ + // 映射任意请求方法路径"/users/allWithRoles" + @RequestMapping("/users/allWithRoles") + public R getAllUsersWithRoles() { + // 查询所有用户记录 + List users = userService.selectList(new EntityWrapper()); + // 创建映射表,存储用户ID到用户及角色信息的映射 + Map> userRoleMap = new HashMap<>(); + // 遍历用户列表,填充角色信息 + for (UserEntity user : users) { + // 根据用户角色ID查询角色实体 + RoleEntity role = roleService.selectById(user.getRole()); + // 创建用户信息映射,包含用户和角色数据 + Map userInfo = new HashMap<>(); + userInfo.put("user", user); + userInfo.put("role", role); + // 将用户信息存入映射表 + userRoleMap.put(user.getId(), userInfo); + } + // 返回成功响应,携带用户及其角色信息 + return R.ok().put("userRoleMap", userRoleMap); + } + + /** + * 获取所有角色及其权限信息接口 + * 查询所有角色及其关联的权限信息 + */ + // 映射任意请求方法路径"/roles/allWithPermissions" + @RequestMapping("/roles/allWithPermissions") + public R getAllRolesWithPermissions() { + // 查询所有角色记录 + List roles = roleService.selectList(new EntityWrapper()); + // 创建映射表,存储角色ID到角色及权限信息的映射 + Map> rolePermissionMap = new HashMap<>(); + // 遍历角色列表,填充权限信息 + for (RoleEntity role : roles) { + // 根据角色ID查询权限列表 + List permissions = permissionService.selectList(new EntityWrapper().eq("role_id", role.getId())); + // 创建角色信息映射,包含角色和权限数据 + Map roleInfo = new HashMap<>(); + roleInfo.put("role", role); + roleInfo.put("permissions", permissions); + // 将角色信息存入映射表 + rolePermissionMap.put(role.getId(), roleInfo); + } + // 返回成功响应,携带角色及其权限信息 + return R.ok().put("rolePermissionMap", rolePermissionMap); + } + + /** + * 批量为用户分配角色接口 + * 处理批量用户角色分配请求 + */ + // 映射POST请求路径"/users/batchAssignRole",接收包含用户ID列表和角色ID的请求体 + @PostMapping("/users/batchAssignRole") + public R batchAssignRole(@RequestBody Map params) { + // 从请求体中获取用户ID列表 + List userIds = (List) params.get("userIds"); + // 从请求体中获取角色ID + Long roleId = (Long) params.get("roleId"); + // 检查角色是否存在 + RoleEntity role = roleService.selectById(roleId); + if (role == null) { + // 返回错误响应,提示角色不存在 + return R.error("角色不存在"); + } + // 遍历用户ID列表,逐个分配角色 + for (Long userId : userIds) { + // 根据用户ID查询用户实体 + UserEntity user = userService.selectById(userId); + if (user != null) { + // 更新用户的角色ID为目标角色ID + user.setRole(roleId); + userService.updateById(user); + } + } + // 返回成功响应 + return R.ok(); + } + + /** + * 批量为角色分配权限接口 + * 处理批量角色权限分配请求 + */ + // 映射POST请求路径"/roles/batchAssignPermission",接收包含角色ID和权限ID列表的请求体 + @PostMapping("/roles/batchAssignPermission") + public R batchAssignPermission(@RequestBody Map params) { + // 从请求体中获取角色ID + Long roleId = (Long) params.get("roleId"); + // 从请求体中获取权限ID列表 + List permissionIds = (List) params.get("permissionIds"); + // 检查角色是否存在 + RoleEntity role = roleService.selectById(roleId); + if (role == null) { + // 返回错误响应,提示角色不存在 + return R.error("角色不存在"); + } + // 遍历权限ID列表,逐个分配权限 + for (Long permissionId : permissionIds) { + // 根据权限ID查询权限实体 + PermissionEntity permission = permissionService.selectById(permissionId); + if (permission != null) { + // 更新权限的角色ID为目标角色ID + permission.setRoleId(roleId); + permissionService.updateById(permission); + } + } + // 返回成功响应 + return R.ok(); + } + + /** + * 验证用户是否具有某个权限接口 + * 检查用户是否拥有指定权限 + */ + // 映射任意请求方法路径"/users/{userId}/hasPermission/{permissionName}",路径参数为用户ID和权限名 + @RequestMapping("/users/{userId}/hasPermission/{permissionName}") + public R checkUserPermission(@PathVariable("userId") Long userId, @PathVariable("permissionName") String permissionName) { + // 根据用户ID查询用户实体 + UserEntity user = userService.selectById(userId); + if (user == null) { + // 返回错误响应,提示用户不存在 + return R.error("用户不存在"); + } + // 根据用户角色ID查询角色实体 + RoleEntity role = roleService.selectById(user.getRole()); + if (role == null) { + // 返回错误响应,提示角色不存在(用户角色异常) + return R.error("角色不存在"); + } + // 根据角色ID和权限名查询权限实体(检查角色是否拥有该权限) + PermissionEntity permission = permissionService.selectOne(new EntityWrapper() + .eq("role_id", role.getId()) + .eq("permission_name", permissionName)); + // 判断用户是否具有该权限(存在即有权限) + boolean hasPermission = permission != null; + // 返回成功响应,携带权限检查结果 + return R.ok().put("hasPermission", hasPermission); + } + + /** + * 获取用户的所有权限接口 + * 查询用户拥有的所有权限 + */ + // 映射任意请求方法路径"/users/{userId}/allPermissions",路径参数为用户ID + @RequestMapping("/users/{userId}/allPermissions") + public R getUserAllPermissions(@PathVariable("userId") Long userId) { + // 根据用户ID查询用户实体 + UserEntity user = userService.selectById(userId); + if (user == null) { + // 返回错误响应,提示用户不存在 + return R.error("用户不存在"); + } + // 根据用户角色ID查询角色实体 + RoleEntity role = roleService.selectById(user.getRole()); + if (role == null) { + // 返回错误响应,提示角色不存在(用户角色异常) + return R.error("角色不存在"); + } + // 根据角色ID查询所有权限(该角色拥有的所有权限) + List permissions = permissionService.selectList(new EntityWrapper().eq("role_id", role.getId())); + // 返回成功响应,携带权限列表 + return R.ok().put("permissions", permissions); + } + + /** + * 禁用用户接口 + * 将用户状态设置为禁用(假设状态0为禁用) + */ + // 映射任意请求方法路径"/users/{userId}/disable",路径参数为用户ID + @RequestMapping("/users/{userId}/disable") + public R disableUser(@PathVariable("userId") Long userId) { + // 根据用户ID查询用户实体 + UserEntity user = userService.selectById(userId); + if (user == null) { + // 返回错误响应,提示用户不存在 + return R.error("用户不存在"); + } + // 设置用户状态为禁用(假设0表示禁用,1表示启用) + user.setStatus(0); + // 更新用户状态到数据库 + userService.updateById(user); + // 返回成功响应 + return R.ok(); + } + + /** + * 启用用户接口 + * 将用户状态设置为启用(假设状态1为启用) + */ + // 映射任意请求方法路径"/users/{userId}/enable",路径参数为用户ID + @RequestMapping("/users/{userId}/enable") + public R enableUser(@PathVariable("userId") Long userId) { + // 根据用户ID查询用户实体 + UserEntity user = userService.selectById(userId); + if (user == null) { + // 返回错误响应,提示用户不存在 + return R.error("用户不存在"); + } + // 设置用户状态为启用(假设1表示启用,0表示禁用) + user.setStatus(1); + // 更新用户状态到数据库 + userService.updateById(user); + // 返回成功响应 + return R.ok(); + } + + /** + * 批量禁用用户接口 + * 处理批量用户禁用请求 + */ + // 映射POST请求路径"/users/batchDisable",接收请求体中的用户ID列表 + @PostMapping("/users/batchDisable") + public R batchDisableUsers(@RequestBody List userIds) { + // 遍历用户ID列表,逐个禁用用户 + for (Long userId : userIds) { + // 根据用户ID查询用户实体 + UserEntity user = userService.selectById(userId); + if (user != null) { + // 设置用户状态为禁用 + user.setStatus(0); + userService.updateById(user); + } + } + // 返回成功响应 + return R.ok(); + } + + /** + * 批量启用用户接口 + * 处理批量用户启用请求 + */ + // 映射POST请求路径"/users/batchEnable",接收请求体中的用户ID列表 + @PostMapping("/users/batchEnable") + public R batchEnableUsers(@RequestBody List userIds) { + // 遍历用户ID列表,逐个启用用户 + for (Long userId : userIds) { + // 根据用户ID查询用户实体 + UserEntity user = userService.selectById(userId); + if (user != null) { + // 设置用户状态为启用 + user.setStatus(1); + userService.updateById(user); + } + } + // 返回成功响应 + return R.ok(); + } + + /** + * 获取所有禁用用户接口 + * 查询状态为禁用的用户列表 + */ + // 映射任意请求方法路径"/users/disabled" + @RequestMapping("/users/disabled") + public R getDisabledUsers() { + // 创建实体包装器,设置状态为禁用的查询条件(假设0为禁用) + EntityWrapper ew = new EntityWrapper().eq("status", 0); + // 查询所有禁用用户记录 + List disabledUsers = userService.selectList(ew); + // 返回成功响应,携带禁用用户列表 + return R.ok().put("disabledUsers", disabledUsers); + } + + /** + * 获取所有启用用户接口 + * 查询状态为启用的用户列表 + */ + // 映射任意请求方法路径"/users/enabled" + @RequestMapping("/users/enabled") + public R getEnabledUsers() { + // 创建实体包装器,设置状态为启用的查询条件(假设1为启用) + EntityWrapper ew = new EntityWrapper().eq("status", 1); + // 查询所有启用用户记录 + List enabledUsers = userService.selectList(ew); + // 返回成功响应,携带启用用户列表 + return R.ok().put("enabledUsers", enabledUsers); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/WodebijiController.java b/src/main/java/com/controller/WodebijiController.java index 426f557..340b37b 100644 --- a/src/main/java/com/controller/WodebijiController.java +++ b/src/main/java/com/controller/WodebijiController.java @@ -1,110 +1,482 @@ package com.controller; +// 导入SimpleDateFormat类,用于格式化日期和时间 import java.text.SimpleDateFormat; +// 导入ArrayList类,用于创建动态数组 import java.util.ArrayList; +// 导入Arrays类,提供了操作数组的静态方法 import java.util.Arrays; +// 导入Calendar类,用于处理日期和时间 import java.util.Calendar; +// 导入Map接口,用于存储键值对 import java.util.Map; +// 导入HashMap类,实现了Map接口,用于存储键值对 import java.util.HashMap; +// 导入Iterator接口,用于遍历集合 import java.util.Iterator; +// 导入Date类,用于表示特定的瞬间 import java.util.Date; +// 导入List接口,用于存储有序的元素集合 import java.util.List; +// 导入HttpServletRequest类,用于封装HTTP请求信息 import javax.servlet.http.HttpServletRequest; +// 导入验证工具类,用于验证实体对象的合法性 import com.utils.ValidatorUtils; +// 导入Apache Commons Lang库中的StringUtils类,提供了字符串操作的实用方法 import org.apache.commons.lang3.StringUtils; +// 导入Spring框架的自动注入注解,用于自动装配依赖 import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring框架的日期格式化注解,用于将请求参数转换为日期类型 import org.springframework.format.annotation.DateTimeFormat; +// 导入Spring框架的路径变量注解,用于获取URL中的路径变量 import org.springframework.web.bind.annotation.PathVariable; +// 导入Spring框架的请求体注解,用于将请求体中的数据绑定到方法参数上 import org.springframework.web.bind.annotation.RequestBody; +// 导入Spring框架的请求映射注解,用于将HTTP请求映射到处理方法上 import org.springframework.web.bind.annotation.RequestMapping; +// 导入Spring框架的请求参数注解,用于获取请求参数的值 import org.springframework.web.bind.annotation.RequestParam; +// 导入Spring框架的REST控制器注解,用于将该类标记为RESTful风格的控制器 import org.springframework.web.bind.annotation.RestController; +// 导入MyBatis-Plus的实体包装器类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入MyBatis-Plus的包装器接口,是EntityWrapper的父接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解,用于标记不需要进行认证的接口 import com.annotation.IgnoreAuth; +// 导入我的笔记实体类,对应数据库中的我的笔记表 import com.entity.WodebijiEntity; +// 导入我的笔记视图类,用于展示我的笔记信息 import com.entity.view.WodebijiView; +// 导入我的笔记服务类,用于处理我的笔记相关的业务逻辑 import com.service.WodebijiService; +// 导入令牌服务类,用于处理令牌相关的业务逻辑 import com.service.TokenService; +// 导入分页工具类,用于处理分页查询结果 import com.utils.PageUtils; +// 导入自定义的响应类,用于封装统一的响应格式 import com.utils.R; +// 导入MD5工具类,用于对数据进行MD5加密 import com.utils.MD5Util; +// 导入MyBatis-Plus工具类,提供了一些常用的工具方法 import com.utils.MPUtil; +// 导入通用工具类,提供了一些通用的工具方法 import com.utils.CommonUtil; /** * 我的笔记 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:15 */ +// 将该类标记为RESTful风格的控制器,处理HTTP请求并返回JSON数据 @RestController +// 定义请求映射路径,所有以/wodebiji开头的请求都会被该控制器处理 @RequestMapping("/wodebiji") public class WodebijiController { + // 使用@Autowired注解自动注入我的笔记服务类的实例 @Autowired private WodebijiService wodebijiService; - + + // 以下是新添加的功能:根据笔记标题进行模糊查询 + + /** + * 根据笔记标题进行模糊查询(后端) + * @param params 请求参数,包含分页和排序信息 + * @param title 笔记标题关键词,用于模糊查询 + * @param request HTTP请求对象,用于获取会话信息 + * @return 包含查询结果的统一响应对象 + */ + @RequestMapping("/searchByTitle") + public R searchByTitle(@RequestParam Map params, @RequestParam String title, HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加模糊查询条件,查询笔记标题包含指定关键词的记录 + ew.like("title", title); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodebijiService.queryPage(params, MPUtil.sort(ew, params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 + return R.ok().put("data", page); + } + + // 以下是新添加的功能:根据笔记创建时间范围进行查询 + + /** + * 根据笔记创建时间范围进行查询(后端) + * @param params 请求参数,包含分页和排序信息 + * @param startDate 开始日期,用于筛选创建时间在该日期之后的笔记 + * @param endDate 结束日期,用于筛选创建时间在该日期之前的笔记 + * @param request HTTP请求对象,用于获取会话信息 + * @return 包含查询结果的统一响应对象 + */ + @RequestMapping("/searchByCreateTime") + public R searchByCreateTime(@RequestParam Map params, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate, + HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加时间范围查询条件,查询创建时间在指定范围内的笔记 + ew.between("create_time", startDate, endDate); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodebijiService.queryPage(params, MPUtil.sort(ew, params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 + return R.ok().put("data", page); + } + + // 以下是新添加的功能:根据笔记重要程度进行查询 + + /** + * 根据笔记重要程度进行查询(后端) + * @param params 请求参数,包含分页和排序信息 + * @param importance 笔记重要程度,用于筛选指定重要程度的笔记 + * @param request HTTP请求对象,用于获取会话信息 + * @return 包含查询结果的统一响应对象 + */ + @RequestMapping("/searchByImportance") + public R searchByImportance(@RequestParam Map params, @RequestParam int importance, HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加重要程度查询条件,查询指定重要程度的笔记 + ew.eq("importance", importance); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodebijiService.queryPage(params, MPUtil.sort(ew, params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 + return R.ok().put("data", page); + } + + // 以下是新添加的功能:批量更新笔记的重要程度 + + /** + * 批量更新笔记的重要程度(后端) + * @param ids 要更新的笔记的ID数组 + * @param importance 新的重要程度 + * @return 包含更新结果的统一响应对象 + */ + @RequestMapping("/batchUpdateImportance") + public R batchUpdateImportance(@RequestBody Long[] ids, @RequestParam int importance) { + // 遍历ID数组 + for (Long id : ids) { + // 根据ID查询笔记实体 + WodebijiEntity wodebiji = wodebijiService.selectById(id); + if (wodebiji != null) { + // 如果笔记存在,则更新其重要程度 + wodebiji.setImportance(importance); + // 调用服务类的更新方法,更新笔记信息 + wodebijiService.updateById(wodebiji); + } + } + // 返回成功响应 + return R.ok(); + } + + // 以下是新添加的功能:统计不同重要程度的笔记数量 + + /** + * 统计不同重要程度的笔记数量(后端) + * @param request HTTP请求对象,用于获取会话信息 + * @return 包含统计结果的统一响应对象 + */ + @RequestMapping("/countByImportance") + public R countByImportance(HttpServletRequest request) { + // 创建一个Map对象,用于存储不同重要程度的笔记数量 + Map importanceCountMap = new HashMap<>(); + // 假设重要程度范围是1到5 + for (int i = 1; i <= 5; i++) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加重要程度查询条件,查询指定重要程度的笔记 + ew.eq("importance", i); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的统计方法,统计指定重要程度的笔记数量 + int count = wodebijiService.selectCount(ew); + // 将统计结果存入Map对象中 + importanceCountMap.put(i, count); + } + // 返回成功响应,并将统计结果放入响应对象中 + return R.ok().put("importanceCountMap", importanceCountMap); + } + + // 以下是新添加的功能:获取最近创建的笔记 + + /** + * 获取最近创建的笔记(后端) + * @param count 要获取的笔记数量 + * @param request HTTP请求对象,用于获取会话信息 + * @return 包含最近创建的笔记列表的统一响应对象 + */ + @RequestMapping("/getRecentNotes") + public R getRecentNotes(@RequestParam int count, HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加排序条件,按创建时间降序排序 + ew.orderBy("create_time", false); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的查询方法,查询最近创建的笔记 + List recentNotes = wodebijiService.selectList(ew.last("LIMIT " + count)); + // 返回成功响应,并将最近创建的笔记列表放入响应对象中 + return R.ok().put("recentNotes", recentNotes); + } + + // 以下是新添加的功能:根据笔记标签进行查询 + + /** + * 根据笔记标签进行查询(后端) + * @param params 请求参数,包含分页和排序信息 + * @param tag 笔记标签,用于筛选包含指定标签的笔记 + * @param request HTTP请求对象,用于获取会话信息 + * @return 包含查询结果的统一响应对象 + */ + @RequestMapping("/searchByTag") + public R searchByTag(@RequestParam Map params, @RequestParam String tag, HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加模糊查询条件,查询笔记标签包含指定标签的记录 + ew.like("tags", tag); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodebijiService.queryPage(params, MPUtil.sort(ew, params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 + return R.ok().put("data", page); + } + + // 以下是新添加的功能:批量添加笔记标签 + + /** + * 批量添加笔记标签(后端) + * @param ids 要添加标签的笔记的ID数组 + * @param tag 要添加的标签 + * @return 包含更新结果的统一响应对象 + */ + @RequestMapping("/batchAddTag") + public R batchAddTag(@RequestBody Long[] ids, @RequestParam String tag) { + // 遍历ID数组 + for (Long id : ids) { + // 根据ID查询笔记实体 + WodebijiEntity wodebiji = wodebijiService.selectById(id); + if (wodebiji != null) { + // 如果笔记存在,则获取其原有的标签 + String tags = wodebiji.getTags(); + if (StringUtils.isBlank(tags)) { + // 如果原标签为空,则直接设置为新标签 + wodebiji.setTags(tag); + } else { + // 如果原标签不为空,则将新标签添加到原标签后面,用逗号分隔 + wodebiji.setTags(tags + "," + tag); + } + // 调用服务类的更新方法,更新笔记信息 + wodebijiService.updateById(wodebiji); + } + } + // 返回成功响应 + return R.ok(); + } + + // 以下是新添加的功能:批量删除笔记标签 + + /** + * 批量删除笔记标签(后端) + * @param ids 要删除标签的笔记的ID数组 + * @param tag 要删除的标签 + * @return 包含更新结果的统一响应对象 + */ + @RequestMapping("/batchRemoveTag") + public R batchRemoveTag(@RequestBody Long[] ids, @RequestParam String tag) { + // 遍历ID数组 + for (Long id : ids) { + // 根据ID查询笔记实体 + WodebijiEntity wodebiji = wodebijiService.selectById(id); + if (wodebiji != null) { + // 如果笔记存在,则获取其原有的标签 + String tags = wodebiji.getTags(); + if (StringUtils.isNotBlank(tags)) { + // 如果原标签不为空,则将指定标签从原标签中移除 + String newTags = tags.replace(tag, "").replaceAll(",+", ",").replaceAll("^,|,$", ""); + wodebiji.setTags(newTags); + // 调用服务类的更新方法,更新笔记信息 + wodebijiService.updateById(wodebiji); + } + } + } + // 返回成功响应 + return R.ok(); + } + + // 以下是新添加的功能:根据笔记状态进行查询 + + /** + * 根据笔记状态进行查询(后端) + * @param params 请求参数,包含分页和排序信息 + * @param status 笔记状态,用于筛选指定状态的笔记 + * @param request HTTP请求对象,用于获取会话信息 + * @return 包含查询结果的统一响应对象 + */ + @RequestMapping("/searchByStatus") + public R searchByStatus(@RequestParam Map params, @RequestParam String status, HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加状态查询条件,查询指定状态的笔记 + ew.eq("status", status); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodebijiService.queryPage(params, MPUtil.sort(ew, params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 + return R.ok().put("data", page); + } + + // 以下是新添加的功能:批量更新笔记状态 + + /** + * 批量更新笔记状态(后端) + * @param ids 要更新的笔记的ID数组 + * @param status 新的笔记状态 + * @return 包含更新结果的统一响应对象 + */ + @RequestMapping("/batchUpdateStatus") + public R batchUpdateStatus(@RequestBody Long[] ids, @RequestParam String status) { + // 遍历ID数组 + for (Long id : ids) { + // 根据ID查询笔记实体 + WodebijiEntity wodebiji = wodebijiService.selectById(id); + if (wodebiji != null) { + // 如果笔记存在,则更新其状态 + wodebiji.setStatus(status); + // 调用服务类的更新方法,更新笔记信息 + wodebijiService.updateById(wodebiji); + } + } + // 返回成功响应 + return R.ok(); + } /** * 后端列表 */ @RequestMapping("/page") - public R page(@RequestParam Map params,WodebijiEntity wodebiji, - HttpServletRequest request){ - String tableName = request.getSession().getAttribute("tableName").toString(); - if(tableName.equals("yonghu")) { - wodebiji.setYonghuzhanghao((String)request.getSession().getAttribute("username")); - } + public R page(@RequestParam Map params, WodebijiEntity wodebiji, + HttpServletRequest request) { + // 从会话中获取表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是yonghu,则设置用户账号为会话中的用户名 + wodebiji.setYonghuzhanghao((String) request.getSession().getAttribute("username")); + } + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = wodebijiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, wodebiji), params), params)); - + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodebijiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, wodebiji), params), params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 return R.ok().put("data", page); } - + /** * 前端列表 */ @RequestMapping("/list") - public R list(@RequestParam Map params,WodebijiEntity wodebiji, - HttpServletRequest request){ + public R list(@RequestParam Map params, WodebijiEntity wodebiji, + HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = wodebijiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, wodebiji), params), params)); + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodebijiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, wodebiji), params), params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 return R.ok().put("data", page); } - /** + /** * 列表 */ @RequestMapping("/lists") - public R list( WodebijiEntity wodebiji){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( wodebiji, "wodebiji")); + public R list(WodebijiEntity wodebiji) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,使所有字段与传入的实体对象相等 + ew.allEq(MPUtil.allEQMapPre(wodebiji, "wodebiji")); + // 调用服务类的查询视图列表方法,获取查询结果 return R.ok().put("data", wodebijiService.selectListView(ew)); } - /** + /** * 查询 */ @RequestMapping("/query") - public R query(WodebijiEntity wodebiji){ - EntityWrapper< WodebijiEntity> ew = new EntityWrapper< WodebijiEntity>(); - ew.allEq(MPUtil.allEQMapPre( wodebiji, "wodebiji")); - WodebijiView wodebijiView = wodebijiService.selectView(ew); - return R.ok("查询我的笔记成功").put("data", wodebijiView); + public R query(WodebijiEntity wodebiji) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,使所有字段与传入的实体对象相等 + ew.allEq(MPUtil.allEQMapPre(wodebiji, "wodebiji")); + // 调用服务类的查询视图方法,获取查询结果 + WodebijiView wodebijiView = wodebijiService.selectView(ew); + // 返回成功响应,并将查询结果放入响应对象中 + return R.ok("查询我的笔记成功").put("data", wodebijiView); } - + /** * 后端详情 */ @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + public R info(@PathVariable("id") Long id) { + // 根据ID查询笔记实体 WodebijiEntity wodebiji = wodebijiService.selectById(id); + // 返回成功响应,并将查询结果放入响应对象中 return R.ok().put("data", wodebiji); } @@ -112,33 +484,40 @@ public class WodebijiController { * 前端详情 */ @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + public R detail(@PathVariable("id") Long id) { + // 根据ID查询笔记实体 WodebijiEntity wodebiji = wodebijiService.selectById(id); + // 返回成功响应,并将查询结果放入响应对象中 return R.ok().put("data", wodebiji); } - - - /** * 后端保存 */ @RequestMapping("/save") - public R save(@RequestBody WodebijiEntity wodebiji, HttpServletRequest request){ - wodebiji.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(wodebiji); + public R save(@RequestBody WodebijiEntity wodebiji, HttpServletRequest request) { + // 生成一个唯一的ID,由当前时间戳和一个随机数组成 + wodebiji.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释:此处可进行实体对象的验证,但当前代码未启用 + // ValidatorUtils.validateEntity(wodebiji); + // 调用服务类的插入方法,将笔记实体插入数据库 wodebijiService.insert(wodebiji); + // 返回成功响应 return R.ok(); } - + /** * 前端保存 */ @RequestMapping("/add") - public R add(@RequestBody WodebijiEntity wodebiji, HttpServletRequest request){ - wodebiji.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(wodebiji); + public R add(@RequestBody WodebijiEntity wodebiji, HttpServletRequest request) { + // 生成一个唯一的ID,由当前时间戳和一个随机数组成 + wodebiji.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释:此处可进行实体对象的验证,但当前代码未启用 + // ValidatorUtils.validateEntity(wodebiji); + // 调用服务类的插入方法,将笔记实体插入数据库 wodebijiService.insert(wodebiji); + // 返回成功响应 return R.ok(); } @@ -146,69 +525,85 @@ public class WodebijiController { * 修改 */ @RequestMapping("/update") - public R update(@RequestBody WodebijiEntity wodebiji, HttpServletRequest request){ - //ValidatorUtils.validateEntity(wodebiji); - wodebijiService.updateById(wodebiji);//全部更新 + public R update(@RequestBody WodebijiEntity wodebiji, HttpServletRequest request) { + // 注释:此处可进行实体对象的验证,但当前代码未启用 + // ValidatorUtils.validateEntity(wodebiji); + // 调用服务类的更新方法,根据ID更新笔记实体的所有字段 + wodebijiService.updateById(wodebiji); // 全部更新 + // 返回成功响应 return R.ok(); } - /** * 删除 */ @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + public R delete(@RequestBody Long[] ids) { + // 将ID数组转换为列表,调用服务类的批量删除方法,删除指定ID的笔记记录 wodebijiService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** * 提醒接口 */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - String tableName = request.getSession().getAttribute("tableName").toString(); - if(tableName.equals("yonghu")) { - wrapper.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username")); - } - - int count = wodebijiService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + @RequestMapping("/remind/{columnName}/{type}") + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名和类型放入请求参数Map中 + map.put("column", columnName); + map.put("type", type); + + if (type.equals("2")) { + // 创建SimpleDateFormat对象,用于格式化日期 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取Calendar实例,用于处理日期和时间 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期和结束日期 + Date remindStartDate = null; + Date remindEndDate = null; + if (map.get("remindstart") != null) { + // 如果请求参数中包含提醒开始日期的偏移量,则计算提醒开始日期 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindStart); + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期放入请求参数Map中 + map.put("remindstart", sdf.format(remindStartDate)); + } + if (map.get("remindend") != null) { + // 如果请求参数中包含提醒结束日期的偏移量,则计算提醒结束日期 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindEnd); + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期放入请求参数Map中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建MyBatis-Plus的包装器,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + if (map.get("remindstart") != null) { + // 如果请求参数中包含提醒开始日期,则添加大于等于该日期的查询条件 + wrapper.ge(columnName, map.get("remindstart")); + } + if (map.get("remindend") != null) { + // 如果请求参数中包含提醒结束日期,则添加小于等于该日期的查询条件 + wrapper.le(columnName, map.get("remindend")); + } + + // 从会话中获取表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是yonghu,则添加用户账号的查询条件 + wrapper.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的统计方法,统计符合查询条件的笔记数量 + int count = wodebijiService.selectCount(wrapper); + // 返回成功响应,并将统计结果放入响应对象中 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/WodekechengController.java b/src/main/java/com/controller/WodekechengController.java index 8f45dc8..90ae6e1 100644 --- a/src/main/java/com/controller/WodekechengController.java +++ b/src/main/java/com/controller/WodekechengController.java @@ -1,110 +1,440 @@ package com.controller; +// 导入 SimpleDateFormat 类,用于格式化日期和时间 import java.text.SimpleDateFormat; +// 导入 ArrayList 类,用于创建动态数组 import java.util.ArrayList; +// 导入 Arrays 类,提供了操作数组的静态方法 import java.util.Arrays; +// 导入 Calendar 类,用于处理日期和时间 import java.util.Calendar; +// 导入 Map 接口,用于存储键值对 import java.util.Map; +// 导入 HashMap 类,实现了 Map 接口,用于存储键值对 import java.util.HashMap; +// 导入 Iterator 接口,用于遍历集合 import java.util.Iterator; +// 导入 Date 类,用于表示特定的瞬间 import java.util.Date; +// 导入 List 接口,用于存储有序的元素集合 import java.util.List; +// 导入 HttpServletRequest 类,用于封装 HTTP 请求信息 import javax.servlet.http.HttpServletRequest; +// 导入验证工具类,用于验证实体对象的合法性 import com.utils.ValidatorUtils; +// 导入 Apache Commons Lang 库中的 StringUtils 类,提供了字符串操作的实用方法 import org.apache.commons.lang3.StringUtils; +// 导入 Spring 框架的自动注入注解,用于自动装配依赖 import org.springframework.beans.factory.annotation.Autowired; +// 导入 Spring 框架的日期格式化注解,用于将请求参数转换为日期类型 import org.springframework.format.annotation.DateTimeFormat; +// 导入 Spring 框架的路径变量注解,用于获取 URL 中的路径变量 import org.springframework.web.bind.annotation.PathVariable; +// 导入 Spring 框架的请求体注解,用于将请求体中的数据绑定到方法参数上 import org.springframework.web.bind.annotation.RequestBody; +// 导入 Spring 框架的请求映射注解,用于将 HTTP 请求映射到处理方法上 import org.springframework.web.bind.annotation.RequestMapping; +// 导入 Spring 框架的请求参数注解,用于获取请求参数的值 import org.springframework.web.bind.annotation.RequestParam; +// 导入 Spring 框架的 REST 控制器注解,用于将该类标记为 RESTful 风格的控制器 import org.springframework.web.bind.annotation.RestController; +// 导入 MyBatis-Plus 的实体包装器类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的包装器接口,是 EntityWrapper 的父接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解,用于标记不需要进行认证的接口 import com.annotation.IgnoreAuth; +// 导入我的课程实体类,对应数据库中的我的课程表 import com.entity.WodekechengEntity; +// 导入我的课程视图类,用于展示我的课程信息 import com.entity.view.WodekechengView; +// 导入我的课程服务类,用于处理我的课程相关的业务逻辑 import com.service.WodekechengService; +// 导入令牌服务类,用于处理令牌相关的业务逻辑 import com.service.TokenService; +// 导入分页工具类,用于处理分页查询结果 import com.utils.PageUtils; +// 导入自定义的响应类,用于封装统一的响应格式 import com.utils.R; +// 导入 MD5 工具类,用于对数据进行 MD5 加密 import com.utils.MD5Util; +// 导入 MyBatis-Plus 工具类,提供了一些常用的工具方法 import com.utils.MPUtil; +// 导入通用工具类,提供了一些通用的工具方法 import com.utils.CommonUtil; /** * 我的课程 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:15 */ +// 将该类标记为 RESTful 风格的控制器,处理 HTTP 请求并返回 JSON 数据 @RestController +// 定义请求映射路径,所有以 /wodekecheng 开头的请求都会被该控制器处理 @RequestMapping("/wodekecheng") public class WodekechengController { + // 使用 @Autowired 注解自动注入我的课程服务类的实例 @Autowired private WodekechengService wodekechengService; - + + // 以下是新添加的功能:根据课程名称进行模糊查询 + /** + * 根据课程名称进行模糊查询(后端) + * @param params 请求参数,包含分页和排序信息 + * @param courseName 课程名称关键词,用于模糊查询 + * @param request HTTP 请求对象,用于获取会话信息 + * @return 包含查询结果的统一响应对象 + */ + @RequestMapping("/searchByCourseName") + public R searchByCourseName(@RequestParam Map params, @RequestParam String courseName, HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加模糊查询条件,查询课程名称包含指定关键词的记录 + ew.like("course_name", courseName); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是 yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodekechengService.queryPage(params, MPUtil.sort(ew, params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 + return R.ok().put("data", page); + } + + // 以下是新添加的功能:根据课程分类进行查询 + /** + * 根据课程分类进行查询(后端) + * @param params 请求参数,包含分页和排序信息 + * @param courseCategory 课程分类,用于筛选指定分类的课程 + * @param request HTTP 请求对象,用于获取会话信息 + * @return 包含查询结果的统一响应对象 + */ + @RequestMapping("/searchByCourseCategory") + public R searchByCourseCategory(@RequestParam Map params, @RequestParam String courseCategory, HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加课程分类查询条件,查询指定分类的课程 + ew.eq("course_category", courseCategory); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是 yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodekechengService.queryPage(params, MPUtil.sort(ew, params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 + return R.ok().put("data", page); + } + + // 以下是新添加的功能:根据课程难度进行查询 + /** + * 根据课程难度进行查询(后端) + * @param params 请求参数,包含分页和排序信息 + * @param courseDifficulty 课程难度,用于筛选指定难度的课程 + * @param request HTTP 请求对象,用于获取会话信息 + * @return 包含查询结果的统一响应对象 + */ + @RequestMapping("/searchByCourseDifficulty") + public R searchByCourseDifficulty(@RequestParam Map params, @RequestParam String courseDifficulty, HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加课程难度查询条件,查询指定难度的课程 + ew.eq("course_difficulty", courseDifficulty); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是 yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodekechengService.queryPage(params, MPUtil.sort(ew, params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 + return R.ok().put("data", page); + } + + // 以下是新添加的功能:批量更新课程状态 + /** + * 批量更新课程状态(后端) + * @param ids 要更新的课程的 ID 数组 + * @param courseStatus 新的课程状态 + * @return 包含更新结果的统一响应对象 + */ + @RequestMapping("/batchUpdateCourseStatus") + public R batchUpdateCourseStatus(@RequestBody Long[] ids, @RequestParam String courseStatus) { + // 遍历 ID 数组 + for (Long id : ids) { + // 根据 ID 查询课程实体 + WodekechengEntity wodekecheng = wodekechengService.selectById(id); + if (wodekecheng != null) { + // 如果课程存在,则更新其状态 + wodekecheng.setCourseStatus(courseStatus); + // 调用服务类的更新方法,更新课程信息 + wodekechengService.updateById(wodekecheng); + } + } + // 返回成功响应 + return R.ok(); + } + + // 以下是新添加的功能:统计不同课程分类的课程数量 + /** + * 统计不同课程分类的课程数量(后端) + * @param request HTTP 请求对象,用于获取会话信息 + * @return 包含统计结果的统一响应对象 + */ + @RequestMapping("/countByCourseCategory") + public R countByCourseCategory(HttpServletRequest request) { + // 创建一个 Map 对象,用于存储不同课程分类的课程数量 + Map courseCategoryCountMap = new HashMap<>(); + // 假设课程分类有以下几种,可根据实际情况修改 + List courseCategories = Arrays.asList("编程", "设计", "数学", "物理", "化学"); + for (String category : courseCategories) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加课程分类查询条件,查询指定分类的课程 + ew.eq("course_category", category); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是 yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的统计方法,统计指定分类的课程数量 + int count = wodekechengService.selectCount(ew); + // 将统计结果存入 Map 对象中 + courseCategoryCountMap.put(category, count); + } + // 返回成功响应,并将统计结果放入响应对象中 + return R.ok().put("courseCategoryCountMap", courseCategoryCountMap); + } + + // 以下是新添加的功能:获取最近添加的课程 + /** + * 获取最近添加的课程(后端) + * @param count 要获取的课程数量 + * @param request HTTP 请求对象,用于获取会话信息 + * @return 包含最近添加的课程列表的统一响应对象 + */ + @RequestMapping("/getRecentCourses") + public R getRecentCourses(@RequestParam int count, HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加排序条件,按创建时间降序排序 + ew.orderBy("create_time", false); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是 yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的查询方法,查询最近添加的课程 + List recentCourses = wodekechengService.selectList(ew.last("LIMIT " + count)); + // 返回成功响应,并将最近添加的课程列表放入响应对象中 + return R.ok().put("recentCourses", recentCourses); + } + + // 以下是新添加的功能:根据课程开始时间范围进行查询 + /** + * 根据课程开始时间范围进行查询(后端) + * @param params 请求参数,包含分页和排序信息 + * @param startDate 开始日期,用于筛选开始时间在该日期之后的课程 + * @param endDate 结束日期,用于筛选开始时间在该日期之前的课程 + * @param request HTTP 请求对象,用于获取会话信息 + * @return 包含查询结果的统一响应对象 + */ + @RequestMapping("/searchByCourseStartTime") + public R searchByCourseStartTime(@RequestParam Map params, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate, + HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加时间范围查询条件,查询开始时间在指定范围内的课程 + ew.between("course_start_time", startDate, endDate); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是 yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodekechengService.queryPage(params, MPUtil.sort(ew, params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 + return R.ok().put("data", page); + } + + // 以下是新添加的功能:批量更新课程开始时间 + /** + * 批量更新课程开始时间(后端) + * @param ids 要更新的课程的 ID 数组 + * @param newStartTime 新的课程开始时间 + * @return 包含更新结果的统一响应对象 + */ + @RequestMapping("/batchUpdateCourseStartTime") + public R batchUpdateCourseStartTime(@RequestBody Long[] ids, @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date newStartTime) { + // 遍历 ID 数组 + for (Long id : ids) { + // 根据 ID 查询课程实体 + WodekechengEntity wodekecheng = wodekechengService.selectById(id); + if (wodekecheng != null) { + // 如果课程存在,则更新其开始时间 + wodekecheng.setCourseStartTime(newStartTime); + // 调用服务类的更新方法,更新课程信息 + wodekechengService.updateById(wodekecheng); + } + } + // 返回成功响应 + return R.ok(); + } + + // 以下是新添加的功能:根据课程结束时间范围进行查询 + /** + * 根据课程结束时间范围进行查询(后端) + * @param params 请求参数,包含分页和排序信息 + * @param startDate 开始日期,用于筛选结束时间在该日期之后的课程 + * @param endDate 结束日期,用于筛选结束时间在该日期之前的课程 + * @param request HTTP 请求对象,用于获取会话信息 + * @return 包含查询结果的统一响应对象 + */ + @RequestMapping("/searchByCourseEndTime") + public R searchByCourseEndTime(@RequestParam Map params, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate, + HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 添加时间范围查询条件,查询结束时间在指定范围内的课程 + ew.between("course_end_time", startDate, endDate); + + // 获取会话中的表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是 yonghu,则添加用户账号的查询条件 + ew.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodekechengService.queryPage(params, MPUtil.sort(ew, params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 + return R.ok().put("data", page); + } + + // 以下是新添加的功能:批量更新课程结束时间 + /** + * 批量更新课程结束时间(后端) + * @param ids 要更新的课程的 ID 数组 + * @param newEndTime 新的课程结束时间 + * @return 包含更新结果的统一响应对象 + */ + @RequestMapping("/batchUpdateCourseEndTime") + public R batchUpdateCourseEndTime(@RequestBody Long[] ids, @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date newEndTime) { + // 遍历 ID 数组 + for (Long id : ids) { + // 根据 ID 查询课程实体 + WodekechengEntity wodekecheng = wodekechengService.selectById(id); + if (wodekecheng != null) { + // 如果课程存在,则更新其结束时间 + wodekecheng.setCourseEndTime(newEndTime); + // 调用服务类的更新方法,更新课程信息 + wodekechengService.updateById(wodekecheng); + } + } + // 返回成功响应 + return R.ok(); + } /** * 后端列表 */ @RequestMapping("/page") - public R page(@RequestParam Map params,WodekechengEntity wodekecheng, - HttpServletRequest request){ - String tableName = request.getSession().getAttribute("tableName").toString(); - if(tableName.equals("yonghu")) { - wodekecheng.setYonghuzhanghao((String)request.getSession().getAttribute("username")); - } + public R page(@RequestParam Map params, WodekechengEntity wodekecheng, + HttpServletRequest request) { + // 从会话中获取表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是 yonghu,则设置用户账号为会话中的用户名 + wodekecheng.setYonghuzhanghao((String) request.getSession().getAttribute("username")); + } + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = wodekechengService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, wodekecheng), params), params)); - + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodekechengService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, wodekecheng), params), params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 return R.ok().put("data", page); } - + /** * 前端列表 */ @RequestMapping("/list") - public R list(@RequestParam Map params,WodekechengEntity wodekecheng, - HttpServletRequest request){ + public R list(@RequestParam Map params, WodekechengEntity wodekecheng, + HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = wodekechengService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, wodekecheng), params), params)); + // 调用服务类的分页查询方法,传入请求参数和排序后的查询条件 + PageUtils page = wodekechengService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, wodekecheng), params), params)); + // 返回成功响应,并将查询结果的分页信息放入响应对象中 return R.ok().put("data", page); } - /** + /** * 列表 */ @RequestMapping("/lists") - public R list( WodekechengEntity wodekecheng){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( wodekecheng, "wodekecheng")); + public R list(WodekechengEntity wodekecheng) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,使所有字段与传入的实体对象相等 + ew.allEq(MPUtil.allEQMapPre(wodekecheng, "wodekecheng")); + // 调用服务类的查询视图列表方法,获取查询结果 return R.ok().put("data", wodekechengService.selectListView(ew)); } - /** + /** * 查询 */ @RequestMapping("/query") - public R query(WodekechengEntity wodekecheng){ - EntityWrapper< WodekechengEntity> ew = new EntityWrapper< WodekechengEntity>(); - ew.allEq(MPUtil.allEQMapPre( wodekecheng, "wodekecheng")); - WodekechengView wodekechengView = wodekechengService.selectView(ew); - return R.ok("查询我的课程成功").put("data", wodekechengView); + public R query(WodekechengEntity wodekecheng) { + // 创建实体包装器,用于构建查询条件 + EntityWrapper ew = new EntityWrapper(); + // 设置查询条件,使所有字段与传入的实体对象相等 + ew.allEq(MPUtil.allEQMapPre(wodekecheng, "wodekecheng")); + // 调用服务类的查询视图方法,获取查询结果 + WodekechengView wodekechengView = wodekechengService.selectView(ew); + // 返回成功响应,并将查询结果放入响应对象中 + return R.ok("查询我的课程成功").put("data", wodekechengView); } - + /** * 后端详情 */ @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + public R info(@PathVariable("id") Long id) { + // 根据 ID 查询课程实体 WodekechengEntity wodekecheng = wodekechengService.selectById(id); + // 返回成功响应,并将查询结果放入响应对象中 return R.ok().put("data", wodekecheng); } @@ -112,33 +442,40 @@ public class WodekechengController { * 前端详情 */ @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + public R detail(@PathVariable("id") Long id) { + // 根据 ID 查询课程实体 WodekechengEntity wodekecheng = wodekechengService.selectById(id); + // 返回成功响应,并将查询结果放入响应对象中 return R.ok().put("data", wodekecheng); } - - - /** * 后端保存 */ @RequestMapping("/save") - public R save(@RequestBody WodekechengEntity wodekecheng, HttpServletRequest request){ - wodekecheng.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(wodekecheng); + public R save(@RequestBody WodekechengEntity wodekecheng, HttpServletRequest request) { + // 生成一个唯一的 ID,由当前时间戳和一个随机数组成 + wodekecheng.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释:此处可进行实体对象的验证,但当前代码未启用 + // ValidatorUtils.validateEntity(wodekecheng); + // 调用服务类的插入方法,将课程实体插入数据库 wodekechengService.insert(wodekecheng); + // 返回成功响应 return R.ok(); } - + /** * 前端保存 */ @RequestMapping("/add") - public R add(@RequestBody WodekechengEntity wodekecheng, HttpServletRequest request){ - wodekecheng.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(wodekecheng); + public R add(@RequestBody WodekechengEntity wodekecheng, HttpServletRequest request) { + // 生成一个唯一的 ID,由当前时间戳和一个随机数组成 + wodekecheng.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释:此处可进行实体对象的验证,但当前代码未启用 + // ValidatorUtils.validateEntity(wodekecheng); + // 调用服务类的插入方法,将课程实体插入数据库 wodekechengService.insert(wodekecheng); + // 返回成功响应 return R.ok(); } @@ -146,69 +483,85 @@ public class WodekechengController { * 修改 */ @RequestMapping("/update") - public R update(@RequestBody WodekechengEntity wodekecheng, HttpServletRequest request){ - //ValidatorUtils.validateEntity(wodekecheng); - wodekechengService.updateById(wodekecheng);//全部更新 + public R update(@RequestBody WodekechengEntity wodekecheng, HttpServletRequest request) { + // 注释:此处可进行实体对象的验证,但当前代码未启用 + // ValidatorUtils.validateEntity(wodekecheng); + // 调用服务类的更新方法,根据 ID 更新课程实体的所有字段 + wodekechengService.updateById(wodekecheng); // 全部更新 + // 返回成功响应 return R.ok(); } - /** * 删除 */ @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + public R delete(@RequestBody Long[] ids) { + // 将 ID 数组转换为列表,调用服务类的批量删除方法,删除指定 ID 的课程记录 wodekechengService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** * 提醒接口 */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - String tableName = request.getSession().getAttribute("tableName").toString(); - if(tableName.equals("yonghu")) { - wrapper.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username")); - } - - int count = wodekechengService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + @RequestMapping("/remind/{columnName}/{type}") + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 将列名和类型放入请求参数 Map 中 + map.put("column", columnName); + map.put("type", type); + + if (type.equals("2")) { + // 创建 SimpleDateFormat 对象,用于格式化日期 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取 Calendar 实例,用于处理日期和时间 + Calendar c = Calendar.getInstance(); + // 定义提醒开始日期和结束日期 + Date remindStartDate = null; + Date remindEndDate = null; + if (map.get("remindstart") != null) { + // 如果请求参数中包含提醒开始日期的偏移量,则计算提醒开始日期 + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindStart); + remindStartDate = c.getTime(); + // 将格式化后的提醒开始日期放入请求参数 Map 中 + map.put("remindstart", sdf.format(remindStartDate)); + } + if (map.get("remindend") != null) { + // 如果请求参数中包含提醒结束日期的偏移量,则计算提醒结束日期 + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindEnd); + remindEndDate = c.getTime(); + // 将格式化后的提醒结束日期放入请求参数 Map 中 + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建 MyBatis-Plus 的包装器,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + if (map.get("remindstart") != null) { + // 如果请求参数中包含提醒开始日期,则添加大于等于该日期的查询条件 + wrapper.ge(columnName, map.get("remindstart")); + } + if (map.get("remindend") != null) { + // 如果请求参数中包含提醒结束日期,则添加小于等于该日期的查询条件 + wrapper.le(columnName, map.get("remindend")); + } + + // 从会话中获取表名 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + // 如果表名是 yonghu,则添加用户账号的查询条件 + wrapper.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 调用服务类的统计方法,统计符合查询条件的课程数量 + int count = wodekechengService.selectCount(wrapper); + // 返回成功响应,并将统计结果放入响应对象中 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/XiaoxitongzhiController.java b/src/main/java/com/controller/XiaoxitongzhiController.java index 2200600..eaa51c1 100644 --- a/src/main/java/com/controller/XiaoxitongzhiController.java +++ b/src/main/java/com/controller/XiaoxitongzhiController.java @@ -1,214 +1,314 @@ package com.controller; +// 导入SimpleDateFormat类,用于格式化日期和时间(如将Date对象转为指定格式的字符串) import java.text.SimpleDateFormat; +// 导入ArrayList类,用于创建动态数组(可自动扩容的有序集合) import java.util.ArrayList; +// 导入Arrays类,提供操作数组的静态方法(如排序、查找、复制等) import java.util.Arrays; +// 导入Calendar类,用于处理日期和时间(如日期计算、设置日期字段等) import java.util.Calendar; +// 导入Map接口,用于存储键值对(如请求参数、响应数据等) import java.util.Map; +// 导入HashMap类,实现Map接口的哈希表(键值对存储,允许null键值) import java.util.HashMap; +// 导入Iterator接口,用于遍历集合元素(如遍历List、Set等) import java.util.Iterator; +// 导入Date类,用于表示特定的瞬间(精确到毫秒) import java.util.Date; +// 导入List接口,用于存储有序的元素集合(可重复,有索引) import java.util.List; +// 导入HttpServletRequest类,封装HTTP请求信息(如参数、头信息、会话等) import javax.servlet.http.HttpServletRequest; +// 导入自定义验证工具类(用于验证实体对象的合法性) import com.utils.ValidatorUtils; +// 导入Apache Commons Lang的StringUtils类(提供丰富的字符串操作方法) import org.apache.commons.lang3.StringUtils; +// 导入Spring的自动注入注解(用于自动装配Bean,如服务类) import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring的日期格式化注解(用于将请求参数转换为Date对象) import org.springframework.format.annotation.DateTimeFormat; +// 导入Spring的路径变量注解(用于获取URL路径中的参数,如/{id}) import org.springframework.web.bind.annotation.PathVariable; +// 导入Spring的请求体注解(用于接收请求体中的JSON数据并绑定到实体) import org.springframework.web.bind.annotation.RequestBody; +// 导入Spring的请求映射注解(用于映射URL路径到处理方法) import org.springframework.web.bind.annotation.RequestMapping; +// 导入Spring的请求参数注解(用于获取请求参数的值) import org.springframework.web.bind.annotation.RequestParam; +// 导入Spring的REST控制器注解(标记类为RESTful控制器,返回JSON响应) import org.springframework.web.bind.annotation.RestController; +// 导入MyBatis-Plus的实体包装器类(用于构建数据库查询条件) import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入MyBatis-Plus的包装器接口(实体包装器的父接口,通用查询条件构建) import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解(标记无需登录认证的接口) import com.annotation.IgnoreAuth; +// 导入消息通知实体类(对应数据库表的实体对象) import com.entity.XiaoxitongzhiEntity; +// 导入消息通知视图类(用于展示包含关联数据的视图对象) import com.entity.view.XiaoxitongzhiView; +// 导入消息通知服务类(处理业务逻辑,如增删改查) import com.service.XiaoxitongzhiService; +// 导入令牌服务类(处理用户令牌生成与验证,此处未使用,保留导入) import com.service.TokenService; +// 导入分页工具类(封装分页查询结果,包含总页数、数据列表等) import com.utils.PageUtils; +// 导入自定义响应类(封装统一的响应格式,如R.ok()、R.error()) import com.utils.R; +// 导入MD5工具类(用于数据加密,如密码加密,此处未使用) import com.utils.MD5Util; +// 导入MyBatis-Plus工具类(提供通用数据库操作工具方法) import com.utils.MPUtil; +// 导入通用工具类(包含常用辅助方法,如生成随机数、数据转换等) import com.utils.CommonUtil; /** * 消息通知 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:15 */ +// 标记为RESTful控制器,处理所有以/xiaoxitongzhi开头的请求 @RestController @RequestMapping("/xiaoxitongzhi") public class XiaoxitongzhiController { + // 自动注入消息通知服务类实例,用于调用数据库操作方法 @Autowired private XiaoxitongzhiService xiaoxitongzhiService; - /** - * 后端列表 + * 后端列表(分页查询) + * @param params 分页参数(当前页、每页大小、排序等) + * @param xiaoxitongzhi 实体对象(用于构建查询条件) + * @param request HTTP请求对象(获取会话信息) + * @return 包含分页数据的响应对象 */ @RequestMapping("/page") - public R page(@RequestParam Map params,XiaoxitongzhiEntity xiaoxitongzhi, - HttpServletRequest request){ - String tableName = request.getSession().getAttribute("tableName").toString(); - if(tableName.equals("yonghu")) { - xiaoxitongzhi.setYonghuzhanghao((String)request.getSession().getAttribute("username")); - } + public R page(@RequestParam Map params, XiaoxitongzhiEntity xiaoxitongzhi, + HttpServletRequest request) { + // 从会话中获取当前用户的表名(用于权限控制,如区分普通用户和管理员) + String tableName = request.getSession().getAttribute("tableName").toString(); + // 如果是普通用户(表名为yonghu),则添加用户账号查询条件(仅查询当前用户的消息) + if (tableName.equals("yonghu")) { + xiaoxitongzhi.setYonghuzhanghao((String) request.getSession().getAttribute("username")); + } + // 创建实体包装器,用于构建数据库查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = xiaoxitongzhiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, xiaoxitongzhi), params), params)); - + // 调用服务类的分页查询方法,包含模糊查询、范围查询和排序处理 + PageUtils page = xiaoxitongzhiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, xiaoxitongzhi), params), params)); + // 返回成功响应,携带分页数据 return R.ok().put("data", page); } - + /** - * 前端列表 + * 前端列表(分页查询) + * @param params 分页参数 + * @param xiaoxitongzhi 实体对象 + * @param request HTTP请求对象 + * @return 包含分页数据的响应对象(前端使用) */ @RequestMapping("/list") - public R list(@RequestParam Map params,XiaoxitongzhiEntity xiaoxitongzhi, - HttpServletRequest request){ + public R list(@RequestParam Map params, XiaoxitongzhiEntity xiaoxitongzhi, + HttpServletRequest request) { + // 创建实体包装器(前端列表可能不需要权限过滤,直接构建查询条件) EntityWrapper ew = new EntityWrapper(); - PageUtils page = xiaoxitongzhiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, xiaoxitongzhi), params), params)); + // 调用服务类的分页查询方法(逻辑与后端列表类似,可能权限控制不同) + PageUtils page = xiaoxitongzhiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, xiaoxitongzhi), params), params)); + // 返回成功响应,携带分页数据 return R.ok().put("data", page); } - /** - * 列表 + /** + * 列表(全量查询,不分页) + * @param xiaoxitongzhi 实体对象(用于构建精确查询条件) + * @return 包含查询结果的响应对象 */ @RequestMapping("/lists") - public R list( XiaoxitongzhiEntity xiaoxitongzhi){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( xiaoxitongzhi, "xiaoxitongzhi")); + public R list(XiaoxitongzhiEntity xiaoxitongzhi) { + // 创建实体包装器,设置所有字段相等的查询条件(前缀为"xiaoxitongzhi_") + EntityWrapper ew = new EntityWrapper(); + ew.allEq(MPUtil.allEQMapPre(xiaoxitongzhi, "xiaoxitongzhi")); + // 调用服务类的查询视图列表方法(可能返回包含关联数据的视图) return R.ok().put("data", xiaoxitongzhiService.selectListView(ew)); } - /** - * 查询 + /** + * 查询(单个对象精确查询) + * @param xiaoxitongzhi 实体对象(包含查询条件字段) + * @return 包含查询结果视图的响应对象 */ @RequestMapping("/query") - public R query(XiaoxitongzhiEntity xiaoxitongzhi){ - EntityWrapper< XiaoxitongzhiEntity> ew = new EntityWrapper< XiaoxitongzhiEntity>(); - ew.allEq(MPUtil.allEQMapPre( xiaoxitongzhi, "xiaoxitongzhi")); - XiaoxitongzhiView xiaoxitongzhiView = xiaoxitongzhiService.selectView(ew); - return R.ok("查询消息通知成功").put("data", xiaoxitongzhiView); + public R query(XiaoxitongzhiEntity xiaoxitongzhi) { + // 创建实体包装器,设置全字段相等的查询条件 + EntityWrapper ew = new EntityWrapper(); + ew.allEq(MPUtil.allEQMapPre(xiaoxitongzhi, "xiaoxitongzhi")); + // 调用服务类的查询视图方法(返回包含关联数据的视图对象) + XiaoxitongzhiView xiaoxitongzhiView = xiaoxitongzhiService.selectView(ew); + // 返回成功响应,携带查询结果和提示信息 + return R.ok("查询消息通知成功").put("data", xiaoxitongzhiView); } - + /** - * 后端详情 + * 后端详情(根据ID查询) + * @param id 消息通知ID(路径参数) + * @return 包含单个实体的响应对象(后端使用) */ @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + public R info(@PathVariable("id") Long id) { + // 根据ID直接查询实体对象(主键查询,性能较高) XiaoxitongzhiEntity xiaoxitongzhi = xiaoxitongzhiService.selectById(id); + // 返回成功响应,携带实体数据 return R.ok().put("data", xiaoxitongzhi); } /** - * 前端详情 + * 前端详情(根据ID查询) + * @param id 消息通知ID(路径参数) + * @return 包含单个实体的响应对象(前端使用) */ @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + public R detail(@PathVariable("id") Long id) { + // 根据ID查询实体对象(与后端详情逻辑相同) XiaoxitongzhiEntity xiaoxitongzhi = xiaoxitongzhiService.selectById(id); + // 返回成功响应,携带实体数据 return R.ok().put("data", xiaoxitongzhi); } - + /** - * 后端保存 + * 后端保存(新增消息通知) + * @param xiaoxitongzhi 消息通知实体(请求体数据) + * @param request HTTP请求对象(可能用于获取用户信息) + * @return 保存结果的响应对象 */ @RequestMapping("/save") - public R save(@RequestBody XiaoxitongzhiEntity xiaoxitongzhi, HttpServletRequest request){ - xiaoxitongzhi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(xiaoxitongzhi); + public R save(@RequestBody XiaoxitongzhiEntity xiaoxitongzhi, HttpServletRequest request) { + // 生成唯一ID(时间戳+随机数,确保主键唯一) + xiaoxitongzhi.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释:实体验证(此处未启用,可取消注释进行参数校验) + //ValidatorUtils.validateEntity(xiaoxitongzhi); + // 调用服务类的插入方法,将实体保存到数据库 xiaoxitongzhiService.insert(xiaoxitongzhi); + // 返回成功响应 return R.ok(); } - + /** - * 前端保存 + * 前端保存(新增消息通知) + * @param xiaoxitongzhi 消息通知实体(请求体数据) + * @param request HTTP请求对象(可能用于获取当前用户ID) + * @return 保存结果的响应对象(前端调用) */ @RequestMapping("/add") - public R add(@RequestBody XiaoxitongzhiEntity xiaoxitongzhi, HttpServletRequest request){ - xiaoxitongzhi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(xiaoxitongzhi); + public R add(@RequestBody XiaoxitongzhiEntity xiaoxitongzhi, HttpServletRequest request) { + // 生成唯一ID(与后端保存逻辑相同) + xiaoxitongzhi.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释:实体验证(未启用) + //ValidatorUtils.validateEntity(xiaoxitongzhi); + // 调用服务类的插入方法(前端保存可能自动关联当前用户,此处代码未体现) xiaoxitongzhiService.insert(xiaoxitongzhi); + // 返回成功响应 return R.ok(); } /** - * 修改 + * 修改(更新消息通知) + * @param xiaoxitongzhi 消息通知实体(包含更新后的字段) + * @return 修改结果的响应对象 */ @RequestMapping("/update") - public R update(@RequestBody XiaoxitongzhiEntity xiaoxitongzhi, HttpServletRequest request){ + public R update(@RequestBody XiaoxitongzhiEntity xiaoxitongzhi, HttpServletRequest request) { + // 注释:实体验证(未启用) //ValidatorUtils.validateEntity(xiaoxitongzhi); - xiaoxitongzhiService.updateById(xiaoxitongzhi);//全部更新 + // 调用服务类的更新方法,根据ID更新所有字段(全量更新) + xiaoxitongzhiService.updateById(xiaoxitongzhi); // 注释:标记为全部更新,非部分更新 + // 返回成功响应 return R.ok(); } - + /** - * 删除 + * 删除(批量删除消息通知) + * @param ids 待删除的ID数组(请求体数据) + * @return 删除结果的响应对象 */ @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + public R delete(@RequestBody Long[] ids) { + // 将ID数组转换为列表,调用批量删除方法(高效删除多条记录) xiaoxitongzhiService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** - * 提醒接口 + * 提醒接口(统计符合条件的记录数,用于提醒功能) + * @param columnName 提醒关联的字段名(路径参数) + * @param type 提醒类型(路径参数,如按日期提醒) + * @param map 请求参数(包含提醒时间偏移量等) + * @return 统计结果的响应对象 */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - String tableName = request.getSession().getAttribute("tableName").toString(); - if(tableName.equals("yonghu")) { - wrapper.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username")); - } - - int count = xiaoxitongzhiService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + @RequestMapping("/remind/{columnName}/{type}") + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 向参数Map中添加列名和类型,用于后续处理 + map.put("column", columnName); + map.put("type", type); + + // 如果是日期范围提醒(type=2,基于当前日期计算提醒时间) + if (type.equals("2")) { + // 创建日期格式化对象(格式:yyyy-MM-dd) + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取日历实例,用于日期计算 + Calendar c = Calendar.getInstance(); + Date remindStartDate = null; // 提醒开始日期 + Date remindEndDate = null; // 提醒结束日期 + // 处理提醒开始时间(偏移天数转具体日期) + if (map.get("remindstart") != null) { + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + c.setTime(new Date()); // 设置为当前时间 + c.add(Calendar.DAY_OF_MONTH, remindStart); // 添加偏移天数 + remindStartDate = c.getTime(); // 获取计算后的日期 + map.put("remindstart", sdf.format(remindStartDate)); // 格式化后存入参数 + } + // 处理提醒结束时间(逻辑同上) + if (map.get("remindend") != null) { + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindEnd); + remindEndDate = c.getTime(); + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建包装器构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 添加提醒开始时间的大于等于条件 + if (map.get("remindstart") != null) { + wrapper.ge(columnName, map.get("remindstart")); + } + // 添加提醒结束时间的小于等于条件 + if (map.get("remindend") != null) { + wrapper.le(columnName, map.get("remindend")); + } + + // 权限控制:普通用户只能查询自己的消息 + String tableName = request.getSession().getAttribute("tableName").toString(); + if (tableName.equals("yonghu")) { + wrapper.eq("yonghuzhanghao", (String) request.getSession().getAttribute("username")); + } + + // 统计符合条件的记录数 + int count = xiaoxitongzhiService.selectCount(wrapper); + // 返回统计结果 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/XuekeController.java b/src/main/java/com/controller/XuekeController.java index 05edc5d..90eab18 100644 --- a/src/main/java/com/controller/XuekeController.java +++ b/src/main/java/com/controller/XuekeController.java @@ -1,206 +1,307 @@ package com.controller; +// 导入SimpleDateFormat类,用于格式化日期和时间(如将日期转换为指定格式的字符串) import java.text.SimpleDateFormat; +// 导入ArrayList类,用于创建动态数组(可动态增加或删除元素的有序集合) import java.util.ArrayList; +// 导入Arrays类,提供操作数组的工具方法(如排序、查找、复制数组等) import java.util.Arrays; +// 导入Calendar类,用于处理日期和时间(如日期计算、获取日期字段等) import java.util.Calendar; +// 导入Map接口,用于存储键值对数据(如请求参数、响应数据等) import java.util.Map; +// 导入HashMap类,实现Map接口的哈希表(支持快速查找和插入) import java.util.HashMap; +// 导入Iterator接口,用于遍历集合中的元素(如遍历List、Set等) import java.util.Iterator; +// 导入Date类,用于表示特定的日期和时间(精确到毫秒) import java.util.Date; +// 导入List接口,用于存储有序的元素集合(允许重复元素) import java.util.List; +// 导入HttpServletRequest类,封装HTTP请求信息(如请求参数、会话、头信息等) import javax.servlet.http.HttpServletRequest; +// 导入自定义验证工具类(用于验证实体对象的字段合法性) import com.utils.ValidatorUtils; +// 导入Apache Commons Lang的StringUtils类(提供字符串操作的实用方法) import org.apache.commons.lang3.StringUtils; +// 导入Spring框架的自动注入注解(用于自动装配Bean,如服务类) import org.springframework.beans.factory.annotation.Autowired; +// 导入Spring框架的日期格式化注解(用于将请求参数转换为Date对象) import org.springframework.format.annotation.DateTimeFormat; +// 导入Spring框架的路径变量注解(用于获取URL路径中的参数,如/info/{id}中的id) import org.springframework.web.bind.annotation.PathVariable; +// 导入Spring框架的请求体注解(用于接收请求体中的JSON数据并绑定到实体类) import org.springframework.web.bind.annotation.RequestBody; +// 导入Spring框架的请求映射注解(用于将HTTP请求映射到控制器方法) import org.springframework.web.bind.annotation.RequestMapping; +// 导入Spring框架的请求参数注解(用于获取请求参数的值) import org.springframework.web.bind.annotation.RequestParam; +// 导入Spring框架的REST控制器注解(标记类为RESTful控制器,返回JSON响应) import org.springframework.web.bind.annotation.RestController; +// 导入MyBatis-Plus的实体包装器类(用于构建数据库查询条件) import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入MyBatis-Plus的包装器接口(实体包装器的父接口,通用查询条件构建) import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解(标记无需登录认证的接口) import com.annotation.IgnoreAuth; +// 导入学科实体类(对应数据库中的学科表) import com.entity.XuekeEntity; +// 导入学科视图类(用于展示包含关联数据的学科信息) import com.entity.view.XuekeView; +// 导入学科服务类(处理学科相关的业务逻辑,如增删改查) import com.service.XuekeService; +// 导入令牌服务类(处理用户认证令牌,此处未使用,保留导入) import com.service.TokenService; +// 导入分页工具类(封装分页查询结果,包含数据列表、总页数等) import com.utils.PageUtils; +// 导入自定义响应类(封装统一的响应格式,如成功/错误响应) import com.utils.R; +// 导入MD5工具类(用于数据加密,如密码加密,此处未使用) import com.utils.MD5Util; +// 导入MyBatis-Plus工具类(提供通用数据库操作工具方法) import com.utils.MPUtil; +// 导入通用工具类(包含常用辅助方法,如生成随机数、数据转换等) import com.utils.CommonUtil; /** * 学科 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:14 */ +// 标记为RESTful控制器,处理所有以/xueke开头的HTTP请求 @RestController +// 定义请求映射路径,该控制器的所有接口路径均以/xueke开头 @RequestMapping("/xueke") public class XuekeController { + // 自动注入学科服务类实例,用于调用学科相关的数据库操作方法 @Autowired private XuekeService xuekeService; - /** - * 后端列表 + * 后端列表(分页查询学科数据) + * @param params 分页参数(包含当前页、每页大小、排序条件等) + * @param xueke 学科实体对象(用于构建查询条件,如模糊查询字段) + * @param request HTTP请求对象(可获取请求中的会话信息等) + * @return 包含分页数据的响应对象(格式:{data: 分页数据}) */ @RequestMapping("/page") - public R page(@RequestParam Map params,XuekeEntity xueke, - HttpServletRequest request){ + public R page(@RequestParam Map params, XuekeEntity xueke, + HttpServletRequest request) { + // 创建MyBatis-Plus实体包装器,用于构建数据库查询条件 EntityWrapper ew = new EntityWrapper(); - PageUtils page = xuekeService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, xueke), params), params)); - + // 调用学科服务类的分页查询方法,包含模糊查询、范围查询和排序处理 + // MPUtil.likeOrEq(ew, xueke):对实体中的字段进行模糊或等于查询 + // MPUtil.between(...):处理日期范围等条件 + // MPUtil.sort(...):根据参数进行排序 + PageUtils page = xuekeService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, xueke), params), params)); + // 返回成功响应,并将分页数据放入响应体的"data"字段 return R.ok().put("data", page); } - + /** - * 前端列表 + * 前端列表(分页查询学科数据,供前端调用) + * @param params 分页参数 + * @param xueke 学科实体对象(查询条件) + * @param request HTTP请求对象 + * @return 包含分页数据的响应对象(与后端列表逻辑类似,可能包含前端特定处理) */ @RequestMapping("/list") - public R list(@RequestParam Map params,XuekeEntity xueke, - HttpServletRequest request){ + public R list(@RequestParam Map params, XuekeEntity xueke, + HttpServletRequest request) { + // 创建实体包装器,用于构建查询条件(前端列表可能无需额外权限过滤) EntityWrapper ew = new EntityWrapper(); - PageUtils page = xuekeService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, xueke), params), params)); + // 调用分页查询方法(逻辑与后端列表一致,复用服务类方法) + PageUtils page = xuekeService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, xueke), params), params)); + // 返回分页数据响应 return R.ok().put("data", page); } - /** - * 列表 + /** + * 列表(全量查询,不分页,用于简单列表展示) + * @param xueke 学科实体对象(用于构建精确查询条件,字段全匹配) + * @return 包含查询结果的响应对象(可能返回视图列表) */ @RequestMapping("/lists") - public R list( XuekeEntity xueke){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( xueke, "xueke")); + public R list(XuekeEntity xueke) { + // 创建实体包装器,设置所有字段等于实体对象的对应字段(前缀为"xueke_"避免字段冲突) + EntityWrapper ew = new EntityWrapper(); + ew.allEq(MPUtil.allEQMapPre(xueke, "xueke")); + // 调用服务类的查询视图列表方法,返回包含关联数据的视图对象列表 return R.ok().put("data", xuekeService.selectListView(ew)); } - /** - * 查询 + /** + * 查询(单个学科对象精确查询) + * @param xueke 学科实体对象(包含查询条件字段,如ID、名称等) + * @return 包含查询结果视图的响应对象(附带成功消息) */ @RequestMapping("/query") - public R query(XuekeEntity xueke){ - EntityWrapper< XuekeEntity> ew = new EntityWrapper< XuekeEntity>(); - ew.allEq(MPUtil.allEQMapPre( xueke, "xueke")); - XuekeView xuekeView = xuekeService.selectView(ew); - return R.ok("查询学科成功").put("data", xuekeView); + public R query(XuekeEntity xueke) { + // 创建实体包装器,设置全字段相等的查询条件 + EntityWrapper ew = new EntityWrapper(); + ew.allEq(MPUtil.allEQMapPre(xueke, "xueke")); + // 调用服务类的查询视图方法,获取包含关联数据的单个视图对象 + XuekeView xuekeView = xuekeService.selectView(ew); + // 返回成功响应,携带查询结果和提示信息 + return R.ok("查询学科成功").put("data", xuekeView); } - + /** - * 后端详情 + * 后端详情(根据ID查询学科详情) + * @param id 学科ID(路径参数,如/info/123) + * @return 包含单个学科实体的响应对象 */ @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ + public R info(@PathVariable("id") Long id) { + // 根据ID直接查询学科实体(主键查询,性能高效) XuekeEntity xueke = xuekeService.selectById(id); + // 返回成功响应,携带学科实体数据 return R.ok().put("data", xueke); } /** - * 前端详情 + * 前端详情(根据ID查询学科详情,供前端调用) + * @param id 学科ID(路径参数) + * @return 包含单个学科实体的响应对象(与后端详情逻辑一致) */ @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ + public R detail(@PathVariable("id") Long id) { + // 根据ID查询学科实体 XuekeEntity xueke = xuekeService.selectById(id); + // 返回学科实体数据 return R.ok().put("data", xueke); } - + /** - * 后端保存 + * 后端保存(新增学科数据) + * @param xueke 学科实体对象(请求体数据,包含新增学科信息) + * @param request HTTP请求对象(可获取用户信息等,此处未使用) + * @return 保存结果的响应对象(成功或失败) */ @RequestMapping("/save") - public R save(@RequestBody XuekeEntity xueke, HttpServletRequest request){ - xueke.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(xueke); + public R save(@RequestBody XuekeEntity xueke, HttpServletRequest request) { + // 生成唯一ID(时间戳+随机数,确保主键唯一,避免冲突) + xueke.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释:实体验证(此处未启用,可取消注释进行字段校验) + //ValidatorUtils.validateEntity(xueke); + // 调用服务类的插入方法,将学科实体保存到数据库 xuekeService.insert(xueke); + // 返回成功响应 return R.ok(); } - + /** - * 前端保存 + * 前端保存(新增学科数据,供前端调用) + * @param xueke 学科实体对象(请求体数据) + * @param request HTTP请求对象(可能用于获取当前用户信息,此处未使用) + * @return 保存结果的响应对象(与后端保存逻辑一致) */ @RequestMapping("/add") - public R add(@RequestBody XuekeEntity xueke, HttpServletRequest request){ - xueke.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(xueke); + public R add(@RequestBody XuekeEntity xueke, HttpServletRequest request) { + // 生成唯一ID(与后端保存逻辑相同) + xueke.setId(new Date().getTime() + new Double(Math.floor(Math.random() * 1000)).longValue()); + // 注释:实体验证(未启用) + //ValidatorUtils.validateEntity(xueke); + // 插入学科数据到数据库 xuekeService.insert(xueke); + // 返回成功响应 return R.ok(); } /** - * 修改 + * 修改(更新学科数据) + * @param xueke 学科实体对象(请求体数据,包含更新后的字段) + * @return 修改结果的响应对象 */ @RequestMapping("/update") - public R update(@RequestBody XuekeEntity xueke, HttpServletRequest request){ + public R update(@RequestBody XuekeEntity xueke, HttpServletRequest request) { + // 注释:实体验证(未启用,可根据需求添加字段校验) //ValidatorUtils.validateEntity(xueke); - xuekeService.updateById(xueke);//全部更新 + // 调用服务类的更新方法,根据ID更新学科实体的所有字段(全量更新) + xuekeService.updateById(xueke); // 注释:标记为全部更新,非部分字段更新 + // 返回成功响应 return R.ok(); } - + /** - * 删除 + * 删除(批量删除学科数据) + * @param ids 待删除的学科ID数组(请求体数据,如[1,2,3]) + * @return 删除结果的响应对象 */ @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ + public R delete(@RequestBody Long[] ids) { + // 将ID数组转换为列表,调用批量删除方法(高效删除多条记录) xuekeService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功响应 return R.ok(); } - + /** - * 提醒接口 + * 提醒接口(统计符合条件的学科记录数,用于提醒功能) + * @param columnName 提醒关联的字段名(路径参数,如提醒时间字段) + * @param type 提醒类型(路径参数,如按日期提醒类型2表示相对当前日期计算) + * @param map 请求参数(包含提醒时间偏移量等,如remindstart=3表示3天后提醒) + * @return 统计结果的响应对象(包含符合条件的记录数) */ - @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, - @PathVariable("type") String type,@RequestParam Map map) { - map.put("column", columnName); - map.put("type", type); - - if(type.equals("2")) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Calendar c = Calendar.getInstance(); - Date remindStartDate = null; - Date remindEndDate = null; - if(map.get("remindstart")!=null) { - Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindStart); - remindStartDate = c.getTime(); - map.put("remindstart", sdf.format(remindStartDate)); - } - if(map.get("remindend")!=null) { - Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); - c.setTime(new Date()); - c.add(Calendar.DAY_OF_MONTH,remindEnd); - remindEndDate = c.getTime(); - map.put("remindend", sdf.format(remindEndDate)); - } - } - - Wrapper wrapper = new EntityWrapper(); - if(map.get("remindstart")!=null) { - wrapper.ge(columnName, map.get("remindstart")); - } - if(map.get("remindend")!=null) { - wrapper.le(columnName, map.get("remindend")); - } - - - int count = xuekeService.selectCount(wrapper); - return R.ok().put("count", count); - } - - - -} + @RequestMapping("/remind/{columnName}/{type}") + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + @PathVariable("type") String type, @RequestParam Map map) { + // 向参数Map中添加列名和类型,用于后续查询条件构建 + map.put("column", columnName); + map.put("type", type); + + // 如果是相对日期提醒(type=2,例如"3天后提醒") + if (type.equals("2")) { + // 创建日期格式化对象(格式:年-月-日) + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取日历实例,用于日期计算 + Calendar c = Calendar.getInstance(); + Date remindStartDate = null; // 提醒开始日期(计算后的日期) + Date remindEndDate = null; // 提醒结束日期(计算后的日期) + // 处理提醒开始时间(如果有remindstart参数,计算绝对日期) + if (map.get("remindstart") != null) { + Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); + c.setTime(new Date()); // 设置为当前时间 + c.add(Calendar.DAY_OF_MONTH, remindStart); // 增加指定天数 + remindStartDate = c.getTime(); // 获取计算后的日期 + map.put("remindstart", sdf.format(remindStartDate)); // 格式化后存入参数 + } + // 处理提醒结束时间(逻辑与开始时间类似) + if (map.get("remindend") != null) { + Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + c.setTime(new Date()); + c.add(Calendar.DAY_OF_MONTH, remindEnd); + remindEndDate = c.getTime(); + map.put("remindend", sdf.format(remindEndDate)); + } + } + + // 创建MyBatis-Plus包装器,用于构建查询条件 + Wrapper wrapper = new EntityWrapper(); + // 添加提醒开始时间的大于等于条件(如提醒开始时间≥指定日期) + if (map.get("remindstart") != null) { + wrapper.ge(columnName, map.get("remindstart")); // ge: greater than or equal + } + // 添加提醒结束时间的小于等于条件(如提醒结束时间≤指定日期) + if (map.get("remindend") != null) { + wrapper.le(columnName, map.get("remindend")); // le: less than or equal + } + + // 此处未添加权限控制(学科可能为公共数据,无需区分用户) + // 直接统计符合条件的记录数 + int count = xuekeService.selectCount(wrapper); + // 返回成功响应,携带统计结果 + return R.ok().put("count", count); + } +} \ No newline at end of file diff --git a/src/main/java/com/controller/YonghuController.java b/src/main/java/com/controller/YonghuController.java index 886eb33..df65a0f 100644 --- a/src/main/java/com/controller/YonghuController.java +++ b/src/main/java/com/controller/YonghuController.java @@ -1,284 +1,442 @@ +// 定义包名为 com.controller package com.controller; +// 导入用于格式化日期的 SimpleDateFormat 类 import java.text.SimpleDateFormat; +// 导入 ArrayList 类,用于创建动态数组 import java.util.ArrayList; +// 导入 Arrays 类,用于操作数组 import java.util.Arrays; +// 导入 Calendar 类,用于处理日期和时间 import java.util.Calendar; +// 导入 Map 接口,用于存储键值对 import java.util.Map; +// 导入 HashMap 类,实现 Map 接口 import java.util.HashMap; +// 导入 Iterator 接口,用于遍历集合 import java.util.Iterator; +// 导入 Date 类,用于表示日期和时间 import java.util.Date; +// 导入 List 接口,用于创建列表 import java.util.List; +// 导入 HttpServletRequest 类,用于封装 HTTP 请求信息 import javax.servlet.http.HttpServletRequest; +// 导入自定义的验证工具类 import com.utils.ValidatorUtils; +// 导入 Apache Commons Lang3 库中的 StringUtils 类,用于处理字符串 import org.apache.commons.lang3.StringUtils; +// 导入 Spring 框架的自动注入注解 import org.springframework.beans.factory.annotation.Autowired; +// 导入 Spring 框架的日期格式化注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入 Spring 框架的路径变量注解 import org.springframework.web.bind.annotation.PathVariable; +// 导入 Spring 框架的请求体注解 import org.springframework.web.bind.annotation.RequestBody; +// 导入 Spring 框架的请求映射注解 import org.springframework.web.bind.annotation.RequestMapping; +// 导入 Spring 框架的请求参数注解 import org.springframework.web.bind.annotation.RequestParam; +// 导入 Spring 框架的 REST 控制器注解 import org.springframework.web.bind.annotation.RestController; +// 导入 MyBatis-Plus 框架的实体包装器类 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 框架的包装器接口 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入自定义的忽略认证注解 import com.annotation.IgnoreAuth; +// 导入用户实体类 import com.entity.YonghuEntity; +// 导入用户视图类 import com.entity.view.YonghuView; +// 导入用户服务类 import com.service.YonghuService; +// 导入令牌服务类 import com.service.TokenService; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的响应结果类 import com.utils.R; +// 导入自定义的 MD5 工具类 import com.utils.MD5Util; +// 导入自定义的 MyBatis-Plus 工具类 import com.utils.MPUtil; +// 导入自定义的通用工具类 import com.utils.CommonUtil; /** * 用户 * 后端接口 - * @author - * @email + * @author + * @email * @date 2021-05-09 15:46:14 */ +// 声明该类为 REST 控制器 @RestController +// 定义该控制器的请求映射路径 @RequestMapping("/yonghu") public class YonghuController { - @Autowired - private YonghuService yonghuService; - + // 自动注入用户服务类的实例 + @Autowired + private YonghuService yonghuService; + + // 自动注入令牌服务类的实例 @Autowired private TokenService tokenService; - + /** * 登录 */ + // 忽略认证注解,允许未认证用户访问该接口 @IgnoreAuth + // 定义登录接口的请求映射路径 @RequestMapping(value = "/login") + // 登录方法,接收用户名、密码、验证码和 HTTP 请求作为参数 public R login(String username, String password, String captcha, HttpServletRequest request) { + // 根据用户名查询用户实体 YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuzhanghao", username)); + // 如果用户不存在或密码不正确 if(user==null || !user.getMima().equals(password)) { + // 返回错误信息 return R.error("账号或密码不正确"); } - + + // 生成用户令牌 String token = tokenService.generateToken(user.getId(), username,"yonghu", "用户" ); + // 返回成功信息并携带令牌 return R.ok().put("token", token); } - + /** - * 注册 - */ + * 注册 + */ + // 忽略认证注解,允许未认证用户访问该接口 @IgnoreAuth - @RequestMapping("/register") - public R register(@RequestBody YonghuEntity yonghu){ - //ValidatorUtils.validateEntity(yonghu); - YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuzhanghao", yonghu.getYonghuzhanghao())); + // 定义注册接口的请求映射路径 + @RequestMapping("/register") + // 注册方法,接收用户实体作为请求体 + public R register(@RequestBody YonghuEntity yonghu){ + // 验证用户实体(注释掉,可能后续需要启用) + //ValidatorUtils.validateEntity(yonghu); + // 根据用户名查询用户实体 + YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuzhanghao", yonghu.getYonghuzhanghao())); + // 如果用户已存在 if(user!=null) { + // 返回错误信息 return R.error("注册用户已存在"); } + // 生成用户 ID,使用当前时间戳 Long uId = new Date().getTime(); + // 设置用户 ID yonghu.setId(uId); - yonghuService.insert(yonghu); - return R.ok(); - } - + // 插入用户实体到数据库 + yonghuService.insert(yonghu); + // 返回成功信息 + return R.ok(); + } + /** * 退出 */ + // 定义退出接口的请求映射路径 @RequestMapping("/logout") + // 退出方法,接收 HTTP 请求作为参数 public R logout(HttpServletRequest request) { + // 使当前会话无效 request.getSession().invalidate(); + // 返回退出成功信息 return R.ok("退出成功"); } - + /** - * 获取用户的session用户信息 - */ - @RequestMapping("/session") - public R getCurrUser(HttpServletRequest request){ - Long id = (Long)request.getSession().getAttribute("userId"); - YonghuEntity user = yonghuService.selectById(id); - return R.ok().put("data", user); - } - - /** - * 密码重置 - */ - @IgnoreAuth + * 获取用户的session用户信息 + */ + // 定义获取用户会话信息接口的请求映射路径 + @RequestMapping("/session") + // 获取用户会话信息方法,接收 HTTP 请求作为参数 + public R getCurrUser(HttpServletRequest request){ + // 从会话中获取用户 ID + Long id = (Long)request.getSession().getAttribute("userId"); + // 根据用户 ID 查询用户实体 + YonghuEntity user = yonghuService.selectById(id); + // 返回成功信息并携带用户实体 + return R.ok().put("data", user); + } + + /** + * 密码重置 + */ + // 忽略认证注解,允许未认证用户访问该接口 + @IgnoreAuth + // 定义密码重置接口的请求映射路径 @RequestMapping(value = "/resetPass") - public R resetPass(String username, HttpServletRequest request){ - YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuzhanghao", username)); - if(user==null) { - return R.error("账号不存在"); - } - user.setMima("123456"); - yonghuService.updateById(user); - return R.ok("密码已重置为:123456"); - } - - - /** - * 后端列表 - */ - @RequestMapping("/page") - public R page(@RequestParam Map params,YonghuEntity yonghu, - HttpServletRequest request){ - EntityWrapper ew = new EntityWrapper(); + // 密码重置方法,接收用户名和 HTTP 请求作为参数 + public R resetPass(String username, HttpServletRequest request){ + // 根据用户名查询用户实体 + YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuzhanghao", username)); + // 如果用户不存在 + if(user==null) { + // 返回错误信息 + return R.error("账号不存在"); + } + // 将用户密码重置为 123456 + user.setMima("123456"); + // 更新用户实体到数据库 + yonghuService.updateById(user); + // 返回密码重置成功信息 + return R.ok("密码已重置为:123456"); + } + + + /** + * 后端列表 + */ + // 定义后端列表接口的请求映射路径 + @RequestMapping("/page") + // 后端列表方法,接收请求参数、用户实体和 HTTP 请求作为参数 + public R page(@RequestParam Map params,YonghuEntity yonghu, + HttpServletRequest request){ + // 创建用户实体的包装器 + EntityWrapper ew = new EntityWrapper(); + // 调用用户服务类的查询分页方法 PageUtils page = yonghuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yonghu), params), params)); - return R.ok().put("data", page); - } - - /** - * 前端列表 - */ - @RequestMapping("/list") - public R list(@RequestParam Map params,YonghuEntity yonghu, - HttpServletRequest request){ - EntityWrapper ew = new EntityWrapper(); + // 返回成功信息并携带分页数据 + return R.ok().put("data", page); + } + + /** + * 前端列表 + */ + // 定义前端列表接口的请求映射路径 + @RequestMapping("/list") + // 前端列表方法,接收请求参数、用户实体和 HTTP 请求作为参数 + public R list(@RequestParam Map params,YonghuEntity yonghu, + HttpServletRequest request){ + // 创建用户实体的包装器 + EntityWrapper ew = new EntityWrapper(); + // 调用用户服务类的查询分页方法 PageUtils page = yonghuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yonghu), params), params)); - return R.ok().put("data", page); - } + // 返回成功信息并携带分页数据 + return R.ok().put("data", page); + } + + /** + * 列表 + */ + // 定义列表接口的请求映射路径 + @RequestMapping("/lists") + // 列表方法,接收用户实体作为参数 + public R list( YonghuEntity yonghu){ + // 创建用户实体的包装器 + EntityWrapper ew = new EntityWrapper(); + // 设置包装器的查询条件 + ew.allEq(MPUtil.allEQMapPre( yonghu, "yonghu")); + // 返回成功信息并携带用户视图列表 + return R.ok().put("data", yonghuService.selectListView(ew)); + } /** - * 列表 - */ - @RequestMapping("/lists") - public R list( YonghuEntity yonghu){ - EntityWrapper ew = new EntityWrapper(); - ew.allEq(MPUtil.allEQMapPre( yonghu, "yonghu")); - return R.ok().put("data", yonghuService.selectListView(ew)); - } - - /** - * 查询 - */ - @RequestMapping("/query") - public R query(YonghuEntity yonghu){ - EntityWrapper< YonghuEntity> ew = new EntityWrapper< YonghuEntity>(); - ew.allEq(MPUtil.allEQMapPre( yonghu, "yonghu")); + * 查询 + */ + // 定义查询接口的请求映射路径 + @RequestMapping("/query") + // 查询方法,接收用户实体作为参数 + public R query(YonghuEntity yonghu){ + // 创建用户实体的包装器 + EntityWrapper< YonghuEntity> ew = new EntityWrapper< YonghuEntity>(); + // 设置包装器的查询条件 + ew.allEq(MPUtil.allEQMapPre( yonghu, "yonghu")); + // 调用用户服务类的查询视图方法 YonghuView yonghuView = yonghuService.selectView(ew); + // 返回查询成功信息并携带用户视图 return R.ok("查询用户成功").put("data", yonghuView); - } - - /** - * 后端详情 - */ - @RequestMapping("/info/{id}") - public R info(@PathVariable("id") Long id){ - YonghuEntity yonghu = yonghuService.selectById(id); - return R.ok().put("data", yonghu); - } - - /** - * 前端详情 - */ - @RequestMapping("/detail/{id}") - public R detail(@PathVariable("id") Long id){ - YonghuEntity yonghu = yonghuService.selectById(id); - return R.ok().put("data", yonghu); - } - - - - - /** - * 后端保存 - */ - @RequestMapping("/save") - public R save(@RequestBody YonghuEntity yonghu, HttpServletRequest request){ - yonghu.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(yonghu); - YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuzhanghao", yonghu.getYonghuzhanghao())); + } + + /** + * 后端详情 + */ + // 定义后端详情接口的请求映射路径 + @RequestMapping("/info/{id}") + // 后端详情方法,接收用户 ID 作为路径变量 + public R info(@PathVariable("id") Long id){ + // 根据用户 ID 查询用户实体 + YonghuEntity yonghu = yonghuService.selectById(id); + // 返回成功信息并携带用户实体 + return R.ok().put("data", yonghu); + } + + /** + * 前端详情 + */ + // 定义前端详情接口的请求映射路径 + @RequestMapping("/detail/{id}") + // 前端详情方法,接收用户 ID 作为路径变量 + public R detail(@PathVariable("id") Long id){ + // 根据用户 ID 查询用户实体 + YonghuEntity yonghu = yonghuService.selectById(id); + // 返回成功信息并携带用户实体 + return R.ok().put("data", yonghu); + } + + + + + /** + * 后端保存 + */ + // 定义后端保存接口的请求映射路径 + @RequestMapping("/save") + // 后端保存方法,接收用户实体作为请求体和 HTTP 请求作为参数 + public R save(@RequestBody YonghuEntity yonghu, HttpServletRequest request){ + // 生成用户 ID,使用当前时间戳加上随机数 + yonghu.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); + // 验证用户实体(注释掉,可能后续需要启用) + //ValidatorUtils.validateEntity(yonghu); + // 根据用户名查询用户实体 + YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuzhanghao", yonghu.getYonghuzhanghao())); + // 如果用户已存在 if(user!=null) { + // 返回错误信息 return R.error("用户已存在"); } + // 重新设置用户 ID,使用当前时间戳 yonghu.setId(new Date().getTime()); - yonghuService.insert(yonghu); - return R.ok(); - } - - /** - * 前端保存 - */ - @RequestMapping("/add") - public R add(@RequestBody YonghuEntity yonghu, HttpServletRequest request){ - yonghu.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); - //ValidatorUtils.validateEntity(yonghu); - YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuzhanghao", yonghu.getYonghuzhanghao())); + // 插入用户实体到数据库 + yonghuService.insert(yonghu); + // 返回成功信息 + return R.ok(); + } + + /** + * 前端保存 + */ + // 定义前端保存接口的请求映射路径 + @RequestMapping("/add") + // 前端保存方法,接收用户实体作为请求体和 HTTP 请求作为参数 + public R add(@RequestBody YonghuEntity yonghu, HttpServletRequest request){ + // 生成用户 ID,使用当前时间戳加上随机数 + yonghu.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); + // 验证用户实体(注释掉,可能后续需要启用) + //ValidatorUtils.validateEntity(yonghu); + // 根据用户名查询用户实体 + YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq("yonghuzhanghao", yonghu.getYonghuzhanghao())); + // 如果用户已存在 if(user!=null) { + // 返回错误信息 return R.error("用户已存在"); } + // 重新设置用户 ID,使用当前时间戳 yonghu.setId(new Date().getTime()); - yonghuService.insert(yonghu); - return R.ok(); - } - - /** - * 修改 - */ - @RequestMapping("/update") - public R update(@RequestBody YonghuEntity yonghu, HttpServletRequest request){ - //ValidatorUtils.validateEntity(yonghu); - yonghuService.updateById(yonghu);//全部更新 - return R.ok(); - } - - - /** - * 删除 - */ - @RequestMapping("/delete") - public R delete(@RequestBody Long[] ids){ - yonghuService.deleteBatchIds(Arrays.asList(ids)); - return R.ok(); - } - - /** - * 提醒接口 - */ + // 插入用户实体到数据库 + yonghuService.insert(yonghu); + // 返回成功信息 + return R.ok(); + } + + /** + * 修改 + */ + // 定义修改接口的请求映射路径 + @RequestMapping("/update") + // 修改方法,接收用户实体作为请求体和 HTTP 请求作为参数 + public R update(@RequestBody YonghuEntity yonghu, HttpServletRequest request){ + // 验证用户实体(注释掉,可能后续需要启用) + //ValidatorUtils.validateEntity(yonghu); + // 更新用户实体到数据库 + yonghuService.updateById(yonghu);//全部更新 + // 返回成功信息 + return R.ok(); + } + + + /** + * 删除 + */ + // 定义删除接口的请求映射路径 + @RequestMapping("/delete") + // 删除方法,接收用户 ID 数组作为请求体 + public R delete(@RequestBody Long[] ids){ + // 批量删除用户实体 + yonghuService.deleteBatchIds(Arrays.asList(ids)); + // 返回成功信息 + return R.ok(); + } + + /** + * 提醒接口 + */ + // 定义提醒接口的请求映射路径 @RequestMapping("/remind/{columnName}/{type}") - public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, + // 提醒方法,接收列名、HTTP 请求、类型和请求参数作为参数 + public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, @PathVariable("type") String type,@RequestParam Map map) { + // 将列名放入请求参数中 map.put("column", columnName); + // 将类型放入请求参数中 map.put("type", type); - + + // 如果类型为 2 if(type.equals("2")) { + // 创建日期格式化对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 创建日历对象 Calendar c = Calendar.getInstance(); + // 提醒开始日期 Date remindStartDate = null; + // 提醒结束日期 Date remindEndDate = null; + // 如果请求参数中包含提醒开始时间 if(map.get("remindstart")!=null) { + // 获取提醒开始时间并转换为整数 Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); - c.setTime(new Date()); + // 设置日历时间为当前时间 + c.setTime(new Date()); + // 增加指定天数 c.add(Calendar.DAY_OF_MONTH,remindStart); + // 获取提醒开始日期 remindStartDate = c.getTime(); + // 将提醒开始日期格式化后放入请求参数中 map.put("remindstart", sdf.format(remindStartDate)); } + // 如果请求参数中包含提醒结束时间 if(map.get("remindend")!=null) { + // 获取提醒结束时间并转换为整数 Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); + // 设置日历时间为当前时间 c.setTime(new Date()); + // 增加指定天数 c.add(Calendar.DAY_OF_MONTH,remindEnd); + // 获取提醒结束日期 remindEndDate = c.getTime(); + // 将提醒结束日期格式化后放入请求参数中 map.put("remindend", sdf.format(remindEndDate)); } } - + + // 创建用户实体的包装器 Wrapper wrapper = new EntityWrapper(); + // 如果请求参数中包含提醒开始时间 if(map.get("remindstart")!=null) { + // 设置包装器的大于等于查询条件 wrapper.ge(columnName, map.get("remindstart")); } + // 如果请求参数中包含提醒结束时间 if(map.get("remindend")!=null) { + // 设置包装器的小于等于查询条件 wrapper.le(columnName, map.get("remindend")); } + // 统计符合条件的用户数量 int count = yonghuService.selectCount(wrapper); + // 返回成功信息并携带统计数量 return R.ok().put("count", count); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/controller/hello.java b/src/main/java/com/controller/hello.java index f88fe15..4fd1939 100644 --- a/src/main/java/com/controller/hello.java +++ b/src/main/java/com/controller/hello.java @@ -1,7 +1,11 @@ +// 声明该类所属的包(这里包名为com.controller) package com.controller; +// 定义一个公共类hello public class hello { + // 主方法,程序执行的入口点 public static void main(String[] args) { + // 声明一个整数类型的变量a(未初始化) int a; } -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/ChatEntity.java b/src/main/java/com/entity/ChatEntity.java index 2b7d690..ff445a9 100644 --- a/src/main/java/com/entity/ChatEntity.java +++ b/src/main/java/com/entity/ChatEntity.java @@ -1,164 +1,166 @@ +// 声明当前类所属的包为com.entity,用于组织和管理实体类 package com.entity; +// 导入MyBatis-Plus框架中用于标记主键的注解,用于标识数据库表的主键字段 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记表名的注解,指定当前实体类对应的数据库表名 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR-303验证框架中用于验证字符串非空(排除空格后)的注解,当前类未使用,保留导入以备扩展 import javax.validation.constraints.NotBlank; +// 导入JSR-303验证框架中用于验证集合、数组等非空的注解,当前类未使用,保留导入以备扩展 import javax.validation.constraints.NotEmpty; +// 导入JSR-303验证框架中用于验证对象非null的注解,当前类未使用,保留导入以备扩展 import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化/反序列化时特定属性的注解,当前类未使用,保留导入以备扩展 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中处理方法调用异常的类,用于构造函数中属性复制的异常处理 import java.lang.reflect.InvocationTargetException; +// 导入Java中实现对象序列化的接口,使当前类支持对象序列化,便于网络传输或持久化存储 import java.io.Serializable; +// 导入Java中处理日期和时间的类,用于定义日期类型的字段 import java.util.Date; +// 导入Java中处理列表集合的接口,当前类未直接使用,保留导入以备扩展 import java.util.List; +// 导入Spring框架中用于处理日期格式转换的注解,确保前端与后端日期参数的格式统一 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期输出的注解,指定日期在JSON中的序列化格式 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类,用于构造函数中对象属性的复制 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记数据库表字段的注解,当前类未使用,保留导入以备扩展 import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中定义字段填充策略的枚举类,当前类未使用,保留导入以备扩展 import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中定义主键生成类型的枚举类,用于配置主键生成策略 import com.baomidou.mybatisplus.enums.IdType; - /** - * 客户服务 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:15 + * 客户服务实体类 + * 对应数据库表chat,用于存储用户与管理员的聊天记录及客服回复信息 + * 实现数据库的通用增删改查操作 */ +// 使用MyBatis-Plus注解指定当前类对应的数据库表名为chat @TableName("chat") +// 定义泛型实体类ChatEntity,实现Serializable接口以支持对象的序列化和反序列化 public class ChatEntity implements Serializable { + // 定义序列化版本号,确保不同版本的序列化兼容性(建议与类结构变更时同步更新) private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建空的实体对象(满足框架反射创建对象的需求) public ChatEntity() { - } - + + // 带参构造函数,接收泛型对象t,用于将t的属性复制到当前实体对象 public ChatEntity(T t) { + // 尝试使用BeanUtils工具类复制对象属性 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中的非法访问异常或方法调用异常 + // 打印异常堆栈信息(开发阶段临时处理,生产环境可自定义异常处理逻辑) e.printStackTrace(); } } - - /** - * 主键id - */ - @TableId + + // 标记为主键字段,指定主键生成策略为数据库自增(AUTO) + @TableId(type = IdType.AUTO) + // 定义Long类型的id字段,用于存储数据库表的主键值,唯一标识一条聊天记录 private Long id; - /** - * 用户id - */ - + + // 定义Long类型的userid字段,用于存储发起聊天的用户ID(外键,关联用户表) private Long userid; - - /** - * 管理员id - */ - + + // 定义Long类型的adminid字段,用于存储回复聊天的管理员ID(外键,关联管理员表) private Long adminid; - - /** - * 提问 - */ - + + // 定义String类型的ask字段,用于存储用户的提问内容 private String ask; - - /** - * 回复 - */ - + + // 定义String类型的reply字段,用于存储管理员的回复内容(可为空) private String reply; - - /** - * 是否回复 - */ - + + // 定义Integer类型的isreply字段,用于标识是否已回复(0表示未回复,1表示已回复) private Integer isreply; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") - @DateTimeFormat + + // 使用Jackson注解指定日期在JSON中的格式:时区为GMT+8,格式为"yyyy-MM-dd HH:mm:ss" + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring注解支持前端日期参数的自动格式化转换 + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + // 定义Date类型的addtime字段,用于存储聊天记录的创建时间 private Date addtime; + // ------------------------- Getter 和 Setter 方法 ------------------------- + + // 获取聊天记录创建时间的方法 public Date getAddtime() { return addtime; } + + // 设置聊天记录创建时间的方法 public void setAddtime(Date addtime) { this.addtime = addtime; } + // 获取主键ID的方法 public Long getId() { return id; } + // 设置主键ID的方法(通常由数据库自动生成,代码中较少手动设置) public void setId(Long id) { this.id = id; } - /** - * 设置:用户id - */ + + // 设置用户ID的方法 public void setUserid(Long userid) { this.userid = userid; } - /** - * 获取:用户id - */ + + // 获取用户ID的方法 public Long getUserid() { return userid; } - /** - * 设置:管理员id - */ + + // 设置管理员ID的方法 public void setAdminid(Long adminid) { this.adminid = adminid; } - /** - * 获取:管理员id - */ + + // 获取管理员ID的方法 public Long getAdminid() { return adminid; } - /** - * 设置:提问 - */ + + // 设置用户提问内容的方法 public void setAsk(String ask) { this.ask = ask; } - /** - * 获取:提问 - */ + + // 获取用户提问内容的方法 public String getAsk() { return ask; } - /** - * 设置:回复 - */ + + // 设置管理员回复内容的方法 public void setReply(String reply) { this.reply = reply; } - /** - * 获取:回复 - */ + + // 获取管理员回复内容的方法 public String getReply() { return reply; } - /** - * 设置:是否回复 - */ + + // 设置是否回复状态的方法(0未回复,1已回复) public void setIsreply(Integer isreply) { this.isreply = isreply; } - /** - * 获取:是否回复 - */ + + // 获取是否回复状态的方法 public Integer getIsreply() { return isreply; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/ConfigEntity.java b/src/main/java/com/entity/ConfigEntity.java index 57872be..b0b52a3 100644 --- a/src/main/java/com/entity/ConfigEntity.java +++ b/src/main/java/com/entity/ConfigEntity.java @@ -1,53 +1,67 @@ +// 声明当前类所属的包为com.entity,用于组织和管理实体类 package com.entity; +// 导入Java序列化接口,使当前类支持对象序列化,便于网络传输或持久化存储 import java.io.Serializable; +// 导入MyBatis-Plus框架中用于标记主键的注解,用于标识数据库表的主键字段 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记表名的注解,指定当前实体类对应的数据库表名 import com.baomidou.mybatisplus.annotations.TableName; +// 导入MyBatis-Plus框架中定义主键生成类型的枚举类,用于配置主键生成策略 import com.baomidou.mybatisplus.enums.IdType; /** -* 类说明 : -*/ + * 系统配置实体类 + * 对应数据库表config,用于存储系统级配置参数,支持通用的增删改查操作 + */ +// 使用MyBatis-Plus注解指定当前类对应的数据库表名为config @TableName("config") -public class ConfigEntity implements Serializable{ -private static final long serialVersionUID = 1L; - +// 定义ConfigEntity类,实现Serializable接口以支持对象的序列化和反序列化 +public class ConfigEntity implements Serializable { + // 定义序列化版本号,确保不同版本的序列化兼容性(建议与类结构变更时同步更新) + private static final long serialVersionUID = 1L; + + // 标记为主键字段,指定主键生成策略为数据库自增(AUTO) @TableId(type = IdType.AUTO) + // 定义Long类型的id字段,用于存储数据库表的主键值,唯一标识一条配置记录 private Long id; - - /** - * key - */ - private String name; - - /** - * value - */ - private String value; + // 定义String类型的name字段,用于存储配置项的键名(唯一标识符) + private String name; // 配置项的唯一键名,如"site_name"、"upload_path"等 + + // 定义String类型的value字段,用于存储配置项对应的参数值 + private String value; // 配置项的值,如具体的配置内容或路径 + + // ------------------------- Getter 和 Setter 方法 ------------------------- + + // 获取主键ID的方法,返回数据库自动生成的主键值 public Long getId() { return id; } + // 设置主键ID的方法(通常由数据库自动生成,代码中较少手动设置) public void setId(Long id) { this.id = id; } + // 获取配置项键名的方法,返回配置项的唯一标识符 public String getName() { return name; } + // 设置配置项键名的方法,用于设置配置项的唯一标识符 public void setName(String name) { this.name = name; } + // 获取配置项值的方法,返回配置项对应的参数值 public String getValue() { return value; } + // 设置配置项值的方法,用于设置配置项对应的参数值 public void setValue(String value) { this.value = value; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/DiscusskechengxinxiEntity.java b/src/main/java/com/entity/DiscusskechengxinxiEntity.java index 0865be0..bbd0b92 100644 --- a/src/main/java/com/entity/DiscusskechengxinxiEntity.java +++ b/src/main/java/com/entity/DiscusskechengxinxiEntity.java @@ -1,164 +1,181 @@ +// 声明该类所在的包为com.entity,用于组织和管理相关实体类 package com.entity; +// 导入MyBatis-Plus框架中用于标记主键的注解,用于标识数据库表的主键字段 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记表名的注解,指定当前实体类对应的数据库表名 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR 303验证框架中用于验证字符串不为空字符串(去除首尾空格后)的注解,当前类未使用,保留导入以备扩展 import javax.validation.constraints.NotBlank; +// 导入JSR 303验证框架中用于验证集合、数组等不为空的注解,当前类未使用,保留导入以备扩展 import javax.validation.constraints.NotEmpty; +// 导入JSR 303验证框架中用于验证对象不为null的注解,当前类未使用,保留导入以备扩展 import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化和反序列化时某些属性的注解,当前类未使用,保留导入以备扩展 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中用于处理方法调用异常的类,用于带参构造函数中属性复制时的异常处理 import java.lang.reflect.InvocationTargetException; +// 导入Java中用于实现序列化接口的类,使当前类支持对象序列化,便于网络传输或持久化存储 import java.io.Serializable; +// 导入Java中用于处理日期和时间的类,用于定义日期类型的字段 import java.util.Date; +// 导入Java中用于处理列表集合的接口,当前类未直接使用,保留导入以备扩展 import java.util.List; +// 导入Spring框架中用于格式化日期的注解,用于前端与后端日期格式的统一转换 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期的注解,指定日期在JSON中的序列化格式 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类,用于带参构造函数中对象属性的复制 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记表字段的注解,当前类未使用,保留导入以备扩展 import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中用于定义字段填充策略的枚举类,当前类未使用,保留导入以备扩展 import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中用于定义主键生成类型的枚举类,当前类未使用,保留导入以备扩展 import com.baomidou.mybatisplus.enums.IdType; - -/** - * 课程信息评论表 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:15 - */ +// 课程信息评论表 +// 数据库通用操作实体类(普通增删改查),用于存储课程信息的评论及回复相关数据 +// @author +// @email +// @date 2021-05-09 15:46:15 +// 使用MyBatis-Plus的注解指定该实体类对应的数据库表名为discusskechengxinxi @TableName("discusskechengxinxi") +// 定义一个泛型类DiscusskechengxinxiEntity,实现Serializable接口以支持对象的序列化 public class DiscusskechengxinxiEntity implements Serializable { - private static final long serialVersionUID = 1L; - - - public DiscusskechengxinxiEntity() { - - } - - public DiscusskechengxinxiEntity(T t) { - try { - BeanUtils.copyProperties(this, t); - } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - /** - * 主键id - */ - @TableId - private Long id; - /** - * 关联表id - */ - - private Long refid; - - /** - * 用户id - */ - - private Long userid; - - /** - * 用户名 - */ - - private String nickname; - - /** - * 评论内容 - */ - - private String content; - - /** - * 回复内容 - */ - - private String reply; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") - @DateTimeFormat - private Date addtime; - - public Date getAddtime() { - return addtime; - } - public void setAddtime(Date addtime) { - this.addtime = addtime; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - /** - * 设置:关联表id - */ - public void setRefid(Long refid) { - this.refid = refid; - } - /** - * 获取:关联表id - */ - public Long getRefid() { - return refid; - } - /** - * 设置:用户id - */ - public void setUserid(Long userid) { - this.userid = userid; - } - /** - * 获取:用户id - */ - public Long getUserid() { - return userid; - } - /** - * 设置:用户名 - */ - public void setNickname(String nickname) { - this.nickname = nickname; - } - /** - * 获取:用户名 - */ - public String getNickname() { - return nickname; - } - /** - * 设置:评论内容 - */ - public void setContent(String content) { - this.content = content; - } - /** - * 获取:评论内容 - */ - public String getContent() { - return content; - } - /** - * 设置:回复内容 - */ - public void setReply(String reply) { - this.reply = reply; - } - /** - * 获取:回复内容 - */ - public String getReply() { - return reply; - } - -} + // 定义序列化版本号,确保序列化和反序列化过程中类的版本一致性,建议与类结构变更时同步更新 + private static final long serialVersionUID = 1L; + + // 无参构造函数,用于创建一个空的DiscusskechengxinxiEntity对象,满足框架反射创建对象的需求 + public DiscusskechengxinxiEntity() { + + } + + // 带参构造函数,接收一个泛型对象t,将其属性复制到当前对象 + public DiscusskechengxinxiEntity(T t) { + try { + // 使用Apache Commons BeanUtils工具类将对象t的属性复制到当前对象 + BeanUtils.copyProperties(this, t); + } catch (IllegalAccessException | InvocationTargetException e) { + // 捕获属性复制过程中可能出现的非法访问异常和方法调用异常 + // 打印异常堆栈信息,开发阶段临时处理,生产环境可自定义异常处理逻辑 + e.printStackTrace(); + } + } + + // 主键id + // 使用MyBatis-Plus的注解标记该属性为主键 + @TableId + // 定义一个Long类型的属性id,用于存储主键,唯一标识一条评论记录 + private Long id; + + // 关联表id + // 定义一个Long类型的属性refid,用于存储关联表的id,通常关联课程信息表的主键 + private Long refid; + + // 用户id + // 定义一个Long类型的属性userid,用于存储发表评论的用户的id,关联用户表的主键 + private Long userid; + + // 用户名 + // 定义一个String类型的属性nickname,用于存储发表评论的用户的昵称 + private String nickname; + + // 评论内容 + // 定义一个String类型的属性content,用于存储用户对课程信息的评论内容 + private String content; + + // 回复内容 + // 定义一个String类型的属性reply,用于存储管理员或其他用户对该评论的回复内容 + private String reply; + + // 使用Jackson的注解指定日期格式化的模式,时区为GMT+8,语言为中文 + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring的注解指定日期格式化的方式,确保前端传入的日期格式正确解析 + @DateTimeFormat + // 定义一个Date类型的属性addtime,用于存储评论的添加时间 + private Date addtime; + + // 获取addtime属性的方法,返回评论的添加时间 + public Date getAddtime() { + return addtime; + } + + // 设置addtime属性的方法,用于设置评论的添加时间 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取id属性的方法,返回评论记录的主键 + public Long getId() { + return id; + } + + // 设置id属性的方法,通常由数据库自动生成,代码中较少手动设置 + public void setId(Long id) { + this.id = id; + } + + // 设置:关联表id + // 设置refid属性的方法,用于设置关联课程信息表的主键 + public void setRefid(Long refid) { + this.refid = refid; + } + + // 获取:关联表id + // 获取refid属性的方法,返回关联课程信息表的主键 + public Long getRefid() { + return refid; + } + + // 设置:用户id + // 设置userid属性的方法,用于设置发表评论的用户的id + public void setUserid(Long userid) { + this.userid = userid; + } + + // 获取:用户id + // 获取userid属性的方法,返回发表评论的用户的id + public Long getUserid() { + return userid; + } + + // 设置:用户名 + // 设置nickname属性的方法,用于设置发表评论的用户的昵称 + public void setNickname(String nickname) { + this.nickname = nickname; + } + + // 获取:用户名 + // 获取nickname属性的方法,返回发表评论的用户的昵称 + public String getNickname() { + return nickname; + } + + // 设置:评论内容 + // 设置content属性的方法,用于设置用户对课程信息的评论内容 + public void setContent(String content) { + this.content = content; + } + + // 获取:评论内容 + // 获取content属性的方法,返回用户对课程信息的评论内容 + public String getContent() { + return content; + } + + // 设置:回复内容 + // 设置reply属性的方法,用于设置管理员或其他用户对该评论的回复内容 + public void setReply(String reply) { + this.reply = reply; + } + + // 获取:回复内容 + // 获取reply属性的方法,返回管理员或其他用户对该评论的回复内容 + public String getReply() { + return reply; + } +} \ No newline at end of file diff --git a/src/main/java/com/entity/EIException.java b/src/main/java/com/entity/EIException.java index 2ebfb56..8d2e24f 100644 --- a/src/main/java/com/entity/EIException.java +++ b/src/main/java/com/entity/EIException.java @@ -1,52 +1,72 @@ - +// 声明该类所在的包为com.entity package com.entity; /** * 自定义异常 */ +// 定义一个名为EIException的自定义异常类,继承自RuntimeException public class EIException extends RuntimeException { + // 定义序列化版本号,确保序列化和反序列化过程中类的版本一致性 private static final long serialVersionUID = 1L; - - private String msg; - private int code = 500; - - public EIException(String msg) { + + // 定义一个字符串类型的属性msg,用于存储异常信息 + private String msg; + // 定义一个整数类型的属性code,用于存储异常状态码,默认值为500 + private int code = 500; + + // 定义一个构造函数,接收一个字符串类型的参数msg,用于创建异常对象 + public EIException(String msg) { + // 调用父类的构造函数,传入异常信息 super(msg); + // 将传入的异常信息赋值给当前对象的msg属性 this.msg = msg; } - + + // 定义一个构造函数,接收一个字符串类型的参数msg和一个Throwable类型的参数e,用于创建异常对象 public EIException(String msg, Throwable e) { + // 调用父类的构造函数,传入异常信息和异常原因 super(msg, e); + // 将传入的异常信息赋值给当前对象的msg属性 this.msg = msg; } - + + // 定义一个构造函数,接收一个字符串类型的参数msg和一个整数类型的参数code,用于创建异常对象 public EIException(String msg, int code) { + // 调用父类的构造函数,传入异常信息 super(msg); + // 将传入的异常信息赋值给当前对象的msg属性 this.msg = msg; + // 将传入的异常状态码赋值给当前对象的code属性 this.code = code; } - + + // 定义一个构造函数,接收一个字符串类型的参数msg、一个整数类型的参数code和一个Throwable类型的参数e,用于创建异常对象 public EIException(String msg, int code, Throwable e) { + // 调用父类的构造函数,传入异常信息和异常原因 super(msg, e); + // 将传入的异常信息赋值给当前对象的msg属性 this.msg = msg; + // 将传入的异常状态码赋值给当前对象的code属性 this.code = code; } + // 获取msg属性的方法 public String getMsg() { return msg; } + // 设置msg属性的方法 public void setMsg(String msg) { this.msg = msg; } + // 获取code属性的方法 public int getCode() { return code; } + // 设置code属性的方法 public void setCode(int code) { this.code = code; } - - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/ExampaperEntity.java b/src/main/java/com/entity/ExampaperEntity.java index b0e8337..05a43fb 100644 --- a/src/main/java/com/entity/ExampaperEntity.java +++ b/src/main/java/com/entity/ExampaperEntity.java @@ -1,128 +1,150 @@ +// 声明该类所在的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记主键的注解 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记表名的注解 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR 303验证框架中用于验证字符串不为空字符串的注解 import javax.validation.constraints.NotBlank; +// 导入JSR 303验证框架中用于验证集合、数组等不为空的注解 import javax.validation.constraints.NotEmpty; +// 导入JSR 303验证框架中用于验证对象不为null的注解 import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化和反序列化时的某些属性的注解 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中用于处理方法调用异常的类 import java.lang.reflect.InvocationTargetException; +// 导入Java中用于实现序列化接口的类 import java.io.Serializable; +// 导入Java中用于处理日期和时间的类 import java.util.Date; +// 导入Java中用于处理列表集合的接口 import java.util.List; +// 导入Spring框架中用于格式化日期的注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期的注解 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记表字段的注解 import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中用于定义字段填充策略的枚举类 import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中用于定义主键生成类型的枚举类 import com.baomidou.mybatisplus.enums.IdType; - -/** - * 试卷表 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:15 - */ +// 试卷表 +// 数据库通用操作实体类(普通增删改查) +// @author +// @email +// @date 2021-05-09 15:46:15 +// 使用MyBatis-Plus的注解指定该实体类对应的数据库表名为exampaper @TableName("exampaper") +// 定义一个泛型类ExampaperEntity,实现Serializable接口以支持对象的序列化 public class ExampaperEntity implements Serializable { + // 定义序列化版本号,确保序列化和反序列化过程中类的版本一致性 private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的ExampaperEntity对象 public ExampaperEntity() { - + } - + + // 带参构造函数,接收一个泛型对象t,将其属性复制到当前对象 public ExampaperEntity(T t) { try { + // 使用Apache Commons BeanUtils工具类将对象t的属性复制到当前对象 BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { + // 捕获属性复制过程中可能出现的非法访问异常和方法调用异常 // TODO Auto-generated catch block + // 打印异常堆栈信息 e.printStackTrace(); } } - - /** - * 主键id - */ + + // 主键id + // 使用MyBatis-Plus的注解标记该属性为主键 @TableId + // 定义一个Long类型的属性id,用于存储主键 private Long id; - /** - * 试卷名称 - */ - + + // 试卷名称 + // 定义一个String类型的属性name,用于存储试卷名称 private String name; - - /** - * 考试时长(分钟) - */ - + + // 考试时长(分钟) + // 定义一个Integer类型的属性time,用于存储考试时长 private Integer time; - - /** - * 试卷状态 - */ - + + // 试卷状态 + // 定义一个Integer类型的属性status,用于存储试卷状态 private Integer status; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson的注解指定日期格式化的模式,时区为GMT+8,语言为中文 + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring的注解指定日期格式化的方式 @DateTimeFormat + // 定义一个Date类型的属性addtime,用于存储添加时间 private Date addtime; + // 获取addtime属性的方法 public Date getAddtime() { return addtime; } + + // 设置addtime属性的方法 public void setAddtime(Date addtime) { this.addtime = addtime; } + // 获取id属性的方法 public Long getId() { return id; } + // 设置id属性的方法 public void setId(Long id) { this.id = id; } - /** - * 设置:试卷名称 - */ + + // 设置:试卷名称 + // 设置name属性的方法 public void setName(String name) { this.name = name; } - /** - * 获取:试卷名称 - */ + + // 获取:试卷名称 + // 获取name属性的方法 public String getName() { return name; } - /** - * 设置:考试时长(分钟) - */ + + // 设置:考试时长(分钟) + // 设置time属性的方法 public void setTime(Integer time) { this.time = time; } - /** - * 获取:考试时长(分钟) - */ + + // 获取:考试时长(分钟) + // 获取time属性的方法 public Integer getTime() { return time; } - /** - * 设置:试卷状态 - */ + + // 设置:试卷状态 + // 设置status属性的方法 public void setStatus(Integer status) { this.status = status; } - /** - * 获取:试卷状态 - */ + + // 获取:试卷状态 + // 获取status属性的方法 public Integer getStatus() { return status; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/ExamquestionEntity.java b/src/main/java/com/entity/ExamquestionEntity.java index 2c66203..4ea570d 100644 --- a/src/main/java/com/entity/ExamquestionEntity.java +++ b/src/main/java/com/entity/ExamquestionEntity.java @@ -1,236 +1,247 @@ +// 声明该类所在的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记主键的注解 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记表名的注解 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR 303验证框架中用于验证字符串不为空字符串的注解 import javax.validation.constraints.NotBlank; +// 导入JSR 303验证框架中用于验证集合、数组等不为空的注解 import javax.validation.constraints.NotEmpty; +// 导入JSR 303验证框架中用于验证对象不为null的注解 import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化和反序列化时的某些属性的注解 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中用于处理方法调用异常的类 import java.lang.reflect.InvocationTargetException; +// 导入Java中用于实现序列化接口的类 import java.io.Serializable; +// 导入Java中用于处理日期和时间的类 import java.util.Date; +// 导入Java中用于处理列表集合的接口 import java.util.List; +// 导入Spring框架中用于格式化日期的注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期的注解 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记表字段的注解 import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中用于定义字段填充策略的枚举类 import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中用于定义主键生成类型的枚举类 import com.baomidou.mybatisplus.enums.IdType; - -/** - * 试题表 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:15 - */ +// 试题表 +// 数据库通用操作实体类(普通增删改查) +// @author +// @email +// @date 2021-05-09 15:46:15 +// 使用MyBatis-Plus的注解指定该实体类对应的数据库表名为examquestion @TableName("examquestion") +// 定义一个泛型类ExamquestionEntity,实现Serializable接口以支持对象的序列化 public class ExamquestionEntity implements Serializable { + // 定义序列化版本号,确保序列化和反序列化过程中类的版本一致性 private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的ExamquestionEntity对象 public ExamquestionEntity() { - + } - + + // 带参构造函数,接收一个泛型对象t,将其属性复制到当前对象 public ExamquestionEntity(T t) { + // 尝试使用Apache Commons BeanUtils工具类将对象t的属性复制到当前对象 try { + // 使用Apache Commons BeanUtils工具类将对象t的属性复制到当前对象 BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { + // 捕获属性复制过程中可能出现的非法访问异常和方法调用异常 // TODO Auto-generated catch block + // 打印异常堆栈信息 e.printStackTrace(); } } - - /** - * 主键id - */ + + // 主键id + // 使用MyBatis-Plus的注解标记该属性为主键 @TableId + // 定义一个Long类型的属性id,用于存储主键 private Long id; - /** - * 所属试卷id(外键) - */ - + + // 所属试卷id(外键) + // 定义一个Long类型的属性paperid,用于存储所属试卷的id private Long paperid; - - /** - * 试卷名称 - */ - + + // 试卷名称 + // 定义一个String类型的属性papername,用于存储试卷的名称 private String papername; - - /** - * 试题名称 - */ - + + // 试题名称 + // 定义一个String类型的属性questionname,用于存储试题的名称 private String questionname; - - /** - * 选项,json字符串 - */ - + + // 选项,json字符串 + // 定义一个String类型的属性options,用于存储试题的选项,以JSON字符串形式保存 private String options; - - /** - * 分值 - */ - + + // 分值 + // 定义一个Long类型的属性score,用于存储试题的分值 private Long score; - - /** - * 正确答案 - */ - + + // 正确答案 + // 定义一个String类型的属性answer,用于存储试题的正确答案 private String answer; - - /** - * 答案解析 - */ - + + // 答案解析 + // 定义一个String类型的属性analysis,用于存储试题答案的解析 private String analysis; - - /** - * 试题类型,0:单选题 1:多选题 2:判断题 3:填空题(暂不考虑多项填空) - */ - + + // 试题类型,0:单选题 1:多选题 2:判断题 3:填空题(暂不考虑多项填空) + // 定义一个Long类型的属性type,用于存储试题的类型 private Long type; - - /** - * 试题排序,值越大排越前面 - */ - + + // 试题排序,值越大排越前面 + // 定义一个Long类型的属性sequence,用于存储试题的排序信息 private Long sequence; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson的注解指定日期格式化的模式,时区为GMT+8,语言为中文 + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring的注解指定日期格式化的方式 @DateTimeFormat + // 定义一个Date类型的属性addtime,用于存储试题的添加时间 private Date addtime; + // 获取addtime属性的方法 public Date getAddtime() { return addtime; } + + // 设置addtime属性的方法 public void setAddtime(Date addtime) { this.addtime = addtime; } + // 获取id属性的方法 public Long getId() { return id; } + // 设置id属性的方法 public void setId(Long id) { this.id = id; } - /** - * 设置:所属试卷id(外键) - */ + + // 设置:所属试卷id(外键) + // 设置paperid属性的方法 public void setPaperid(Long paperid) { this.paperid = paperid; } - /** - * 获取:所属试卷id(外键) - */ + + // 获取:所属试卷id(外键) + // 获取paperid属性的方法 public Long getPaperid() { return paperid; } - /** - * 设置:试卷名称 - */ + + // 设置:试卷名称 + // 设置papername属性的方法 public void setPapername(String papername) { this.papername = papername; } - /** - * 获取:试卷名称 - */ + + // 获取:试卷名称 + // 获取papername属性的方法 public String getPapername() { return papername; } - /** - * 设置:试题名称 - */ + + // 设置:试题名称 + // 设置questionname属性的方法 public void setQuestionname(String questionname) { this.questionname = questionname; } - /** - * 获取:试题名称 - */ + + // 获取:试题名称 + // 获取questionname属性的方法 public String getQuestionname() { return questionname; } - /** - * 设置:选项,json字符串 - */ + + // 设置:选项,json字符串 + // 设置options属性的方法 public void setOptions(String options) { this.options = options; } - /** - * 获取:选项,json字符串 - */ + + // 获取:选项,json字符串 + // 获取options属性的方法 public String getOptions() { return options; } - /** - * 设置:分值 - */ + + // 设置:分值 + // 设置score属性的方法 public void setScore(Long score) { this.score = score; } - /** - * 获取:分值 - */ + + // 获取:分值 + // 获取score属性的方法 public Long getScore() { return score; } - /** - * 设置:正确答案 - */ + + // 设置:正确答案 + // 设置answer属性的方法 public void setAnswer(String answer) { this.answer = answer; } - /** - * 获取:正确答案 - */ + + // 获取:正确答案 + // 获取answer属性的方法 public String getAnswer() { return answer; } - /** - * 设置:答案解析 - */ + + // 设置:答案解析 + // 设置analysis属性的方法 public void setAnalysis(String analysis) { this.analysis = analysis; } - /** - * 获取:答案解析 - */ + + // 获取:答案解析 + // 获取analysis属性的方法 public String getAnalysis() { return analysis; } - /** - * 设置:试题类型,0:单选题 1:多选题 2:判断题 3:填空题(暂不考虑多项填空) - */ + + // 设置:试题类型,0:单选题 1:多选题 2:判断题 3:填空题(暂不考虑多项填空) + // 设置type属性的方法 public void setType(Long type) { this.type = type; } - /** - * 获取:试题类型,0:单选题 1:多选题 2:判断题 3:填空题(暂不考虑多项填空) - */ + + // 获取:试题类型,0:单选题 1:多选题 2:判断题 3:填空题(暂不考虑多项填空) + // 获取type属性的方法 public Long getType() { return type; } - /** - * 设置:试题排序,值越大排越前面 - */ + + // 设置:试题排序,值越大排越前面 + // 设置sequence属性的方法 public void setSequence(Long sequence) { this.sequence = sequence; } - /** - * 获取:试题排序,值越大排越前面 - */ + + // 获取:试题排序,值越大排越前面 + // 获取sequence属性的方法 public Long getSequence() { return sequence; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/ExamrecordEntity.java b/src/main/java/com/entity/ExamrecordEntity.java index c56886f..aaf1eaf 100644 --- a/src/main/java/com/entity/ExamrecordEntity.java +++ b/src/main/java/com/entity/ExamrecordEntity.java @@ -1,290 +1,294 @@ +// 声明该类所在的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记主键的注解 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记表名的注解 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR 303验证框架中用于验证字符串不为空字符串的注解 import javax.validation.constraints.NotBlank; +// 导入JSR 303验证框架中用于验证集合、数组等不为空的注解 import javax.validation.constraints.NotEmpty; +// 导入JSR 303验证框架中用于验证对象不为null的注解 import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化和反序列化时的某些属性的注解 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中用于处理方法调用异常的类 import java.lang.reflect.InvocationTargetException; +// 导入Java中用于实现序列化接口的类 import java.io.Serializable; +// 导入Java中用于处理日期和时间的类 import java.util.Date; +// 导入Java中用于处理列表集合的接口 import java.util.List; +// 导入Spring框架中用于格式化日期的注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期的注解 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记表字段的注解 import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中用于定义字段填充策略的枚举类 import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中用于定义主键生成类型的枚举类 import com.baomidou.mybatisplus.enums.IdType; - -/** - * 考试记录表 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:15 - */ +// 考试记录表 +// 数据库通用操作实体类(普通增删改查) +// @author +// @email +// @date 2021-05-09 15:46:15 +// 使用MyBatis-Plus的注解指定该实体类对应的数据库表名为examrecord @TableName("examrecord") +// 定义一个泛型类ExamrecordEntity,实现Serializable接口以支持对象的序列化 public class ExamrecordEntity implements Serializable { + // 定义序列化版本号,确保序列化和反序列化过程中类的版本一致性 private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的ExamrecordEntity对象 public ExamrecordEntity() { - + } - + + // 带参构造函数,接收一个泛型对象t,将其属性复制到当前对象 public ExamrecordEntity(T t) { + // 尝试使用Apache Commons BeanUtils工具类将对象t的属性复制到当前对象 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中可能出现的非法访问异常和方法调用异常 + // TODO: 可根据实际情况完善异常处理逻辑 + // 打印异常堆栈信息 e.printStackTrace(); } } - - /** - * 主键id - */ + + // 主键id + // 使用MyBatis-Plus的注解标记该属性为主键 @TableId + // 定义一个Long类型的属性id,用于存储主键 private Long id; - /** - * 用户id - */ - + + // 用户id + // 定义一个Long类型的属性userid,用于存储用户的id private Long userid; - - /** - * 用户名 - */ - + + // 用户名 + // 定义一个String类型的属性username,用于存储用户名 private String username; - - /** - * 试卷id(外键) - */ - + + // 试卷id(外键) + // 定义一个Long类型的属性paperid,用于存储试卷的id private Long paperid; - - /** - * 试卷名称 - */ - + + // 试卷名称 + // 定义一个String类型的属性papername,用于存储试卷的名称 private String papername; - - /** - * 试题id(外键) - */ - + + // 试题id(外键) + // 定义一个Long类型的属性questionid,用于存储试题的id private Long questionid; - - /** - * 试题名称 - */ - + + // 试题名称 + // 定义一个String类型的属性questionname,用于存储试题的名称 private String questionname; - - /** - * 选项,json字符串 - */ - + + // 选项,json字符串 + // 定义一个String类型的属性options,用于存储试题的选项,以JSON字符串形式保存 private String options; - - /** - * 分值 - */ - + + // 分值 + // 定义一个Long类型的属性score,用于存储试题的分值 private Long score; - - /** - * 正确答案 - */ - + + // 正确答案 + // 定义一个String类型的属性answer,用于存储试题的正确答案 private String answer; - - /** - * 答案解析 - */ - + + // 答案解析 + // 定义一个String类型的属性analysis,用于存储试题答案的解析 private String analysis; - - /** - * 试题得分 - */ - + + // 试题得分 + // 定义一个Long类型的属性myscore,用于存储考生在该试题上的得分 private Long myscore; - - /** - * 考生答案 - */ - + + // 考生答案 + // 定义一个String类型的属性myanswer,用于存储考生给出的答案 private String myanswer; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson的注解指定日期格式化的模式,时区为GMT+8,语言为中文 + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring的注解指定日期格式化的方式 @DateTimeFormat + // 定义一个Date类型的属性addtime,用于存储考试记录的添加时间 private Date addtime; + // 获取addtime属性的方法 public Date getAddtime() { return addtime; } + + // 设置addtime属性的方法 public void setAddtime(Date addtime) { this.addtime = addtime; } + // 获取id属性的方法 public Long getId() { return id; } + // 设置id属性的方法 public void setId(Long id) { this.id = id; } - /** - * 设置:用户id - */ + + // 设置:用户id + // 设置userid属性的方法 public void setUserid(Long userid) { this.userid = userid; } - /** - * 获取:用户id - */ + + // 获取:用户id + // 获取userid属性的方法 public Long getUserid() { return userid; } - /** - * 设置:用户名 - */ + + // 设置:用户名 + // 设置username属性的方法 public void setUsername(String username) { this.username = username; } - /** - * 获取:用户名 - */ + + // 获取:用户名 + // 获取username属性的方法 public String getUsername() { return username; } - /** - * 设置:试卷id(外键) - */ + + // 设置:试卷id(外键) + // 设置paperid属性的方法 public void setPaperid(Long paperid) { this.paperid = paperid; } - /** - * 获取:试卷id(外键) - */ + + // 获取:试卷id(外键) + // 获取paperid属性的方法 public Long getPaperid() { return paperid; } - /** - * 设置:试卷名称 - */ + + // 设置:试卷名称 + // 设置papername属性的方法 public void setPapername(String papername) { this.papername = papername; } - /** - * 获取:试卷名称 - */ + + // 获取:试卷名称 + // 获取papername属性的方法 public String getPapername() { return papername; } - /** - * 设置:试题id(外键) - */ + + // 设置:试题id(外键) + // 设置questionid属性的方法 public void setQuestionid(Long questionid) { this.questionid = questionid; } - /** - * 获取:试题id(外键) - */ + + // 获取:试题id(外键) + // 获取questionid属性的方法 public Long getQuestionid() { return questionid; } - /** - * 设置:试题名称 - */ + + // 设置:试题名称 + // 设置questionname属性的方法 public void setQuestionname(String questionname) { this.questionname = questionname; } - /** - * 获取:试题名称 - */ + + // 获取:试题名称 + // 获取questionname属性的方法 public String getQuestionname() { return questionname; } - /** - * 设置:选项,json字符串 - */ + + // 设置:选项,json字符串 + // 设置options属性的方法 public void setOptions(String options) { this.options = options; } - /** - * 获取:选项,json字符串 - */ + + // 获取:选项,json字符串 + // 获取options属性的方法 public String getOptions() { return options; } - /** - * 设置:分值 - */ + + // 设置:分值 + // 设置score属性的方法 public void setScore(Long score) { this.score = score; } - /** - * 获取:分值 - */ + + // 获取:分值 + // 获取score属性的方法 public Long getScore() { return score; } - /** - * 设置:正确答案 - */ + + // 设置:正确答案 + // 设置answer属性的方法 public void setAnswer(String answer) { this.answer = answer; } - /** - * 获取:正确答案 - */ + + // 获取:正确答案 + // 获取answer属性的方法 public String getAnswer() { return answer; } - /** - * 设置:答案解析 - */ + + // 设置:答案解析 + // 设置analysis属性的方法 public void setAnalysis(String analysis) { this.analysis = analysis; } - /** - * 获取:答案解析 - */ + + // 获取:答案解析 + // 获取analysis属性的方法 public String getAnalysis() { return analysis; } - /** - * 设置:试题得分 - */ + + // 设置:试题得分 + // 设置myscore属性的方法 public void setMyscore(Long myscore) { this.myscore = myscore; } - /** - * 获取:试题得分 - */ + + // 获取:试题得分 + // 获取myscore属性的方法 public Long getMyscore() { return myscore; } - /** - * 设置:考生答案 - */ + + // 设置:考生答案 + // 设置myanswer属性的方法 public void setMyanswer(String myanswer) { this.myanswer = myanswer; } - /** - * 获取:考生答案 - */ + + // 获取:考生答案 + // 获取myanswer属性的方法 public String getMyanswer() { return myanswer; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/ForumEntity.java b/src/main/java/com/entity/ForumEntity.java index 55a0efe..21811b1 100644 --- a/src/main/java/com/entity/ForumEntity.java +++ b/src/main/java/com/entity/ForumEntity.java @@ -1,192 +1,198 @@ +// 声明该类属于com.entity包 package com.entity; +// 导入MyBatis-Plus框架中用于标记主键的注解 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记表名的注解 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR 303验证框架中,用于验证字符串不为空串的注解 import javax.validation.constraints.NotBlank; +// 导入JSR 303验证框架中,用于验证集合、数组等不为空的注解 import javax.validation.constraints.NotEmpty; +// 导入JSR 303验证框架中,用于验证对象不为null的注解 import javax.validation.constraints.NotNull; +// 导入Jackson库中,用于忽略JSON序列化和反序列化时某些属性的注解 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中,用于处理方法调用异常的类 import java.lang.reflect.InvocationTargetException; +// 导入Java中用于实现序列化接口的类 import java.io.Serializable; +// 导入Java中用于处理日期和时间的类 import java.util.Date; +// 导入Java中用于处理列表集合的接口 import java.util.List; +// 导入Spring框架中用于格式化日期的注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期的注解 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记表字段的注解 import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中用于定义字段填充策略的枚举类 import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中用于定义主键生成类型的枚举类 import com.baomidou.mybatisplus.enums.IdType; - -/** - * 学习交流 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:15 - */ +// 表示这是学习交流相关的实体类 +// 该类用于数据库的通用操作(普通增删改查) +// 原注释中作者信息、邮箱信息和日期信息缺失 +// 使用MyBatis-Plus的注解指定该实体类对应数据库中的forum表 @TableName("forum") +// 定义一个泛型类ForumEntity,实现Serializable接口,使对象可序列化 public class ForumEntity implements Serializable { + // 定义序列化版本号,确保序列化和反序列化过程中类的版本一致 private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的ForumEntity对象 public ForumEntity() { - + } - + + // 带参构造函数,接收一个泛型对象t,将其属性复制到当前对象 public ForumEntity(T t) { + // 尝试使用Apache Commons BeanUtils工具类将对象t的属性复制到当前对象 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中可能出现的非法访问异常和方法调用异常 + // 这里只是打印异常堆栈信息,可根据实际情况完善异常处理逻辑 e.printStackTrace(); } } - - /** - * 主键id - */ + + // 主键id + // 使用MyBatis-Plus的注解标记该属性为主键 @TableId + // 定义一个Long类型的属性id,用于存储主键 private Long id; - /** - * 帖子标题 - */ - + + // 帖子标题 + // 定义一个String类型的属性title,用于存储帖子的标题 private String title; - - /** - * 帖子内容 - */ - + + // 帖子内容 + // 定义一个String类型的属性content,用于存储帖子的内容 private String content; - - /** - * 父节点id - */ - + + // 父节点id + // 定义一个Long类型的属性parentid,用于存储父节点的id private Long parentid; - - /** - * 用户id - */ - + + // 用户id + // 定义一个Long类型的属性userid,用于存储用户的id private Long userid; - - /** - * 用户名 - */ - + + // 用户名 + // 定义一个String类型的属性username,用于存储用户名 private String username; - - /** - * 状态 - */ - + + // 状态 + // 定义一个String类型的属性isdone,用于存储帖子的状态 private String isdone; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson的注解指定日期格式化的模式,时区为GMT+8,语言为中文 + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring的注解指定日期格式化的方式 @DateTimeFormat + // 定义一个Date类型的属性addtime,用于存储帖子的添加时间 private Date addtime; + // 获取addtime属性的方法 public Date getAddtime() { return addtime; } + + // 设置addtime属性的方法 public void setAddtime(Date addtime) { this.addtime = addtime; } + // 获取id属性的方法 public Long getId() { return id; } + // 设置id属性的方法 public void setId(Long id) { this.id = id; } + + // 标记该属性不是数据库表中的字段 @TableField(exist = false) + // 定义一个List类型的属性childs,用于存储子节点列表 private List childs; - + + // 获取childs属性的方法 public List getChilds() { return childs; } + // 设置childs属性的方法 public void setChilds(List childs) { this.childs = childs; } - /** - * 设置:帖子标题 - */ + + // 设置帖子标题的方法 public void setTitle(String title) { this.title = title; } - /** - * 获取:帖子标题 - */ + + // 获取帖子标题的方法 public String getTitle() { return title; } - /** - * 设置:帖子内容 - */ + + // 设置帖子内容的方法 public void setContent(String content) { this.content = content; } - /** - * 获取:帖子内容 - */ + + // 获取帖子内容的方法 public String getContent() { return content; } - /** - * 设置:父节点id - */ + + // 设置父节点id的方法 public void setParentid(Long parentid) { this.parentid = parentid; } - /** - * 获取:父节点id - */ + + // 获取父节点id的方法 public Long getParentid() { return parentid; } - /** - * 设置:用户id - */ + + // 设置用户id的方法 public void setUserid(Long userid) { this.userid = userid; } - /** - * 获取:用户id - */ + + // 获取用户id的方法 public Long getUserid() { return userid; } - /** - * 设置:用户名 - */ + + // 设置用户名的方法 public void setUsername(String username) { this.username = username; } - /** - * 获取:用户名 - */ + + // 获取用户名的方法 public String getUsername() { return username; } - /** - * 设置:状态 - */ + + // 设置状态的方法 public void setIsdone(String isdone) { this.isdone = isdone; } - /** - * 获取:状态 - */ + + // 获取状态的方法 public String getIsdone() { return isdone; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/GoumaidekechengEntity.java b/src/main/java/com/entity/GoumaidekechengEntity.java index ca7183d..ee7eb88 100644 --- a/src/main/java/com/entity/GoumaidekechengEntity.java +++ b/src/main/java/com/entity/GoumaidekechengEntity.java @@ -1,238 +1,250 @@ +// 声明该类所在的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记主键的注解 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记表名的注解 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR 303验证框架中用于验证字符串不为空字符串的注解 import javax.validation.constraints.NotBlank; +// 导入JSR 303验证框架中用于验证集合、数组等不为空的注解 import javax.validation.constraints.NotEmpty; +// 导入JSR 303验证框架中用于验证对象不为null的注解 import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化和反序列化时的某些属性的注解 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中用于处理方法调用异常的类 import java.lang.reflect.InvocationTargetException; +// 导入Java中用于实现序列化接口的类 import java.io.Serializable; +// 导入Java中用于处理日期和时间的类 import java.util.Date; +// 导入Java中用于处理列表集合的接口 import java.util.List; +// 导入Spring框架中用于格式化日期的注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期的注解 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记表字段的注解 import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中用于定义字段填充策略的枚举类 import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中用于定义主键生成类型的枚举类 import com.baomidou.mybatisplus.enums.IdType; - -/** - * 购买的课程 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:14 - */ +// 购买的课程 +// 数据库通用操作实体类(普通增删改查) +// @author +// @email +// @date 2021-05-09 15:46:14 +// 使用MyBatis-Plus的注解指定该实体类对应的数据库表名为goumaidekecheng @TableName("goumaidekecheng") +// 定义一个泛型类GoumaidekechengEntity,实现Serializable接口以支持对象的序列化 public class GoumaidekechengEntity implements Serializable { - private static final long serialVersionUID = 1L; - - - public GoumaidekechengEntity() { - - } - - public GoumaidekechengEntity(T t) { - try { - BeanUtils.copyProperties(this, t); - } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - /** - * 主键id - */ - @TableId - private Long id; - /** - * 课程名称 - */ - - private String kechengmingcheng; - - /** - * 类型 - */ - - private String leixing; - - /** - * 学科 - */ - - private String xueke; - - /** - * 费用 - */ - - private String feiyong; - - /** - * 用户账号 - */ - - private String yonghuzhanghao; - - /** - * 购买时间 - */ - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") - @DateTimeFormat - private Date goumaishijian; - - /** - * 是否审核 - */ - - private String sfsh; - - /** - * 审核回复 - */ - - private String shhf; - - /** - * 是否支付 - */ - - private String ispay; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") - @DateTimeFormat - private Date addtime; - - public Date getAddtime() { - return addtime; - } - public void setAddtime(Date addtime) { - this.addtime = addtime; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - /** - * 设置:课程名称 - */ - public void setKechengmingcheng(String kechengmingcheng) { - this.kechengmingcheng = kechengmingcheng; - } - /** - * 获取:课程名称 - */ - public String getKechengmingcheng() { - return kechengmingcheng; - } - /** - * 设置:类型 - */ - public void setLeixing(String leixing) { - this.leixing = leixing; - } - /** - * 获取:类型 - */ - public String getLeixing() { - return leixing; - } - /** - * 设置:学科 - */ - public void setXueke(String xueke) { - this.xueke = xueke; - } - /** - * 获取:学科 - */ - public String getXueke() { - return xueke; - } - /** - * 设置:费用 - */ - public void setFeiyong(String feiyong) { - this.feiyong = feiyong; - } - /** - * 获取:费用 - */ - public String getFeiyong() { - return feiyong; - } - /** - * 设置:用户账号 - */ - public void setYonghuzhanghao(String yonghuzhanghao) { - this.yonghuzhanghao = yonghuzhanghao; - } - /** - * 获取:用户账号 - */ - public String getYonghuzhanghao() { - return yonghuzhanghao; - } - /** - * 设置:购买时间 - */ - public void setGoumaishijian(Date goumaishijian) { - this.goumaishijian = goumaishijian; - } - /** - * 获取:购买时间 - */ - public Date getGoumaishijian() { - return goumaishijian; - } - /** - * 设置:是否审核 - */ - public void setSfsh(String sfsh) { - this.sfsh = sfsh; - } - /** - * 获取:是否审核 - */ - public String getSfsh() { - return sfsh; - } - /** - * 设置:审核回复 - */ - public void setShhf(String shhf) { - this.shhf = shhf; - } - /** - * 获取:审核回复 - */ - public String getShhf() { - return shhf; - } - /** - * 设置:是否支付 - */ - public void setIspay(String ispay) { - this.ispay = ispay; - } - /** - * 获取:是否支付 - */ - public String getIspay() { - return ispay; - } - -} + // 定义序列化版本号,确保序列化和反序列化过程中类的版本一致性 + private static final long serialVersionUID = 1L; + + // 无参构造函数,用于创建一个空的GoumaidekechengEntity对象 + public GoumaidekechengEntity() { + + } + + // 带参构造函数,接收一个泛型对象t,将其属性复制到当前对象 + public GoumaidekechengEntity(T t) { + // 尝试使用Apache Commons BeanUtils工具类将对象t的属性复制到当前对象 + try { + BeanUtils.copyProperties(this, t); + } catch (IllegalAccessException | InvocationTargetException e) { + // 捕获属性复制过程中可能出现的非法访问异常和方法调用异常 + // TODO: 可根据实际情况完善异常处理逻辑 + // 打印异常堆栈信息 + e.printStackTrace(); + } + } + + // 主键id + // 使用MyBatis-Plus的注解标记该属性为主键 + @TableId + // 定义一个Long类型的属性id,用于存储主键 + private Long id; + + // 课程名称 + // 定义一个String类型的属性kechengmingcheng,用于存储课程的名称 + private String kechengmingcheng; + + // 类型 + // 定义一个String类型的属性leixing,用于存储课程的类型 + private String leixing; + + // 学科 + // 定义一个String类型的属性xueke,用于存储课程所属的学科 + private String xueke; + + // 费用 + // 定义一个String类型的属性feiyong,用于存储购买课程的费用 + private String feiyong; + + // 用户账号 + // 定义一个String类型的属性yonghuzhanghao,用于存储购买课程的用户账号 + private String yonghuzhanghao; + + // 购买时间 + // 使用Jackson的注解指定日期格式化的模式,时区为GMT+8,语言为中文 + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring的注解指定日期格式化的方式 + @DateTimeFormat + // 定义一个Date类型的属性goumaishijian,用于存储课程的购买时间 + private Date goumaishijian; + + // 是否审核 + // 定义一个String类型的属性sfsh,用于存储课程购买记录是否经过审核的信息 + private String sfsh; + + // 审核回复 + // 定义一个String类型的属性shhf,用于存储课程购买审核的回复内容 + private String shhf; + + // 是否支付 + // 定义一个String类型的属性ispay,用于存储课程是否已经支付的信息 + private String ispay; + + // 使用Jackson的注解指定日期格式化的模式,时区为GMT+8,语言为中文 + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring的注解指定日期格式化的方式 + @DateTimeFormat + // 定义一个Date类型的属性addtime,用于存储记录的添加时间 + private Date addtime; + + // 获取addtime属性的方法 + public Date getAddtime() { + return addtime; + } + + // 设置addtime属性的方法 + public void setAddtime(Date addtime) { + this.addtime = addtime; + } + + // 获取id属性的方法 + public Long getId() { + return id; + } + + // 设置id属性的方法 + public void setId(Long id) { + this.id = id; + } + + // 设置:课程名称 + // 设置kechengmingcheng属性的方法 + public void setKechengmingcheng(String kechengmingcheng) { + this.kechengmingcheng = kechengmingcheng; + } + + // 获取:课程名称 + // 获取kechengmingcheng属性的方法 + public String getKechengmingcheng() { + return kechengmingcheng; + } + + // 设置:类型 + // 设置leixing属性的方法 + public void setLeixing(String leixing) { + this.leixing = leixing; + } + + // 获取:类型 + // 获取leixing属性的方法 + public String getLeixing() { + return leixing; + } + + // 设置:学科 + // 设置xueke属性的方法 + public void setXueke(String xueke) { + this.xueke = xueke; + } + + // 获取:学科 + // 获取xueke属性的方法 + public String getXueke() { + return xueke; + } + + // 设置:费用 + // 设置feiyong属性的方法 + public void setFeiyong(String feiyong) { + this.feiyong = feiyong; + } + + // 获取:费用 + // 获取feiyong属性的方法 + public String getFeiyong() { + return feiyong; + } + + // 设置:用户账号 + // 设置yonghuzhanghao属性的方法 + public void setYonghuzhanghao(String yonghuzhanghao) { + this.yonghuzhanghao = yonghuzhanghao; + } + + // 获取:用户账号 + // 获取yonghuzhanghao属性的方法 + public String getYonghuzhanghao() { + return yonghuzhanghao; + } + + // 设置:购买时间 + // 设置goumaishijian属性的方法 + public void setGoumaishijian(Date goumaishijian) { + this.goumaishijian = goumaishijian; + } + + // 获取:购买时间 + // 获取goumaishijian属性的方法 + public Date getGoumaishijian() { + return goumaishijian; + } + + // 设置:是否审核 + // 设置sfsh属性的方法 + public void setSfsh(String sfsh) { + this.sfsh = sfsh; + } + + // 获取:是否审核 + // 获取sfsh属性的方法 + public String getSfsh() { + return sfsh; + } + + // 设置:审核回复 + // 设置shhf属性的方法 + public void setShhf(String shhf) { + this.shhf = shhf; + } + + // 获取:审核回复 + // 获取shhf属性的方法 + public String getShhf() { + return shhf; + } + + // 设置:是否支付 + // 设置ispay属性的方法 + public void setIspay(String ispay) { + this.ispay = ispay; + } + + // 获取:是否支付 + // 获取ispay属性的方法 + public String getIspay() { + return ispay; + } +} \ No newline at end of file diff --git a/src/main/java/com/entity/KechengleixingEntity.java b/src/main/java/com/entity/KechengleixingEntity.java index fd9a105..b0dd248 100644 --- a/src/main/java/com/entity/KechengleixingEntity.java +++ b/src/main/java/com/entity/KechengleixingEntity.java @@ -1,92 +1,113 @@ +// 声明该类所属的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记主键的注解 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记表名的注解 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR 303验证框架中,用于验证字符串不为空串的注解 import javax.validation.constraints.NotBlank; +// 导入JSR 303验证框架中,用于验证集合、数组等不为空的注解 import javax.validation.constraints.NotEmpty; +// 导入JSR 303验证框架中,用于验证对象不为null的注解 import javax.validation.constraints.NotNull; +// 导入Jackson库中,用于忽略JSON序列化和反序列化时某些属性的注解 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中,用于处理方法调用异常的类 import java.lang.reflect.InvocationTargetException; +// 导入Java中用于实现序列化接口的类 import java.io.Serializable; +// 导入Java中用于处理日期和时间的类 import java.util.Date; +// 导入Java中用于处理列表集合的接口 import java.util.List; +// 导入Spring框架中用于格式化日期的注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期的注解 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记表字段的注解 import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中用于定义字段填充策略的枚举类 import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中用于定义主键生成类型的枚举类 import com.baomidou.mybatisplus.enums.IdType; - -/** - * 课程类型 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:14 - */ +// 表示这是课程类型相关的实体类 +// 该类用于数据库的通用操作(普通增删改查) +// 原注释中作者信息、邮箱信息和日期信息缺失 +// 使用MyBatis-Plus的注解指定该实体类对应数据库中的kechengleixing表 @TableName("kechengleixing") +// 定义一个泛型类KechengleixingEntity,实现Serializable接口,使对象可序列化 public class KechengleixingEntity implements Serializable { + // 定义序列化版本号,确保序列化和反序列化过程中类的版本一致 private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的KechengleixingEntity对象 public KechengleixingEntity() { - + } - + + // 带参构造函数,接收一个泛型对象t,将其属性复制到当前对象 public KechengleixingEntity(T t) { + // 尝试使用Apache Commons BeanUtils工具类将对象t的属性复制到当前对象 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中可能出现的非法访问异常和方法调用异常 + // 这里只是打印异常堆栈信息,可根据实际情况完善异常处理逻辑 e.printStackTrace(); } } - - /** - * 主键id - */ + + // 主键id + // 使用MyBatis-Plus的注解标记该属性为主键 @TableId + // 定义一个Long类型的属性id,用于存储主键 private Long id; - /** - * 类型 - */ - + + // 类型 + // 定义一个String类型的属性leixing,用于存储课程类型 private String leixing; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson的注解指定日期格式化的模式,时区为GMT+8,语言为中文 + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring的注解指定日期格式化的方式 @DateTimeFormat + // 定义一个Date类型的属性addtime,用于存储记录的添加时间 private Date addtime; + // 获取addtime属性的方法 public Date getAddtime() { return addtime; } + + // 设置addtime属性的方法 public void setAddtime(Date addtime) { this.addtime = addtime; } + // 获取id属性的方法 public Long getId() { return id; } + // 设置id属性的方法 public void setId(Long id) { this.id = id; } - /** - * 设置:类型 - */ + + // 设置课程类型的方法 public void setLeixing(String leixing) { this.leixing = leixing; } - /** - * 获取:类型 - */ + + // 获取课程类型的方法 public String getLeixing() { return leixing; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/KechengxinxiEntity.java b/src/main/java/com/entity/KechengxinxiEntity.java index 3e81e13..7a01f38 100644 --- a/src/main/java/com/entity/KechengxinxiEntity.java +++ b/src/main/java/com/entity/KechengxinxiEntity.java @@ -1,220 +1,234 @@ +// 声明该类所在的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记主键的注解 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记表名的注解 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR 303验证框架中用于验证字符串不为空字符串的注解 import javax.validation.constraints.NotBlank; +// 导入JSR 303验证框架中用于验证集合、数组等不为空的注解 import javax.validation.constraints.NotEmpty; +// 导入JSR 303验证框架中用于验证对象不为null的注解 import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化和反序列化时某些属性的注解 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中用于处理方法调用异常的类 import java.lang.reflect.InvocationTargetException; +// 导入Java中用于实现序列化接口的类 import java.io.Serializable; +// 导入Java中用于处理日期和时间的类 import java.util.Date; +// 导入Java中用于处理列表集合的接口 import java.util.List; +// 导入Spring框架中用于格式化日期的注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期的注解 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记表字段的注解 import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中用于定义字段填充策略的枚举类 import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中用于定义主键生成类型的枚举类 import com.baomidou.mybatisplus.enums.IdType; - -/** - * 课程信息 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:14 - */ +// 课程信息 +// 数据库通用操作实体类(普通增删改查) +// @author +// @email +// @date 2021-05-09 15:46:14 +// 使用MyBatis-Plus的注解指定该实体类对应的数据库表名为kechengxinxi @TableName("kechengxinxi") +// 定义一个泛型类KechengxinxiEntity,实现Serializable接口以支持对象的序列化 public class KechengxinxiEntity implements Serializable { + // 定义序列化版本号,确保序列化和反序列化过程中类的版本一致性 private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的KechengxinxiEntity对象 public KechengxinxiEntity() { - + } - + + // 带参构造函数,接收一个泛型对象t,将其属性复制到当前对象 public KechengxinxiEntity(T t) { + // 尝试使用Apache Commons BeanUtils工具类将对象t的属性复制到当前对象 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中可能出现的非法访问异常和方法调用异常 + // TODO: 可根据实际情况完善异常处理逻辑 + // 打印异常堆栈信息 e.printStackTrace(); } } - - /** - * 主键id - */ + + // 主键id + // 使用MyBatis-Plus的注解标记该属性为主键 @TableId + // 定义一个Long类型的属性id,用于存储主键 private Long id; - /** - * 课程名称 - */ - + + // 课程名称 + // 定义一个String类型的属性kechengmingcheng,用于存储课程的名称 private String kechengmingcheng; - - /** - * 类型 - */ - + + // 类型 + // 定义一个String类型的属性leixing,用于存储课程的类型 private String leixing; - - /** - * 学科 - */ - + + // 学科 + // 定义一个String类型的属性xueke,用于存储课程所属的学科 private String xueke; - - /** - * 视频 - */ - + + // 视频 + // 定义一个String类型的属性shipin,用于存储课程相关视频的信息 private String shipin; - - /** - * 老师姓名 - */ - + + // 老师姓名 + // 定义一个String类型的属性laoshixingming,用于存储授课老师的姓名 private String laoshixingming; - - /** - * 费用 - */ - + + // 费用 + // 定义一个String类型的属性feiyong,用于存储课程的费用 private String feiyong; - - /** - * 课程图片 - */ - + + // 课程图片 + // 定义一个String类型的属性kechengtupian,用于存储课程的图片信息 private String kechengtupian; - - /** - * 发布时间 - */ - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd") - @DateTimeFormat + + // 发布时间 + // 使用Jackson的注解指定日期格式化的模式,时区为GMT+8,语言为中文 + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd") + // 使用Spring的注解指定日期格式化的方式 + @DateTimeFormat + // 定义一个Date类型的属性fabushijian,用于存储课程的发布时间 private Date fabushijian; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson的注解指定日期格式化的模式,时区为GMT+8,语言为中文 + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring的注解指定日期格式化的方式 @DateTimeFormat + // 定义一个Date类型的属性addtime,用于存储记录的添加时间 private Date addtime; + // 获取addtime属性的方法 public Date getAddtime() { return addtime; } + + // 设置addtime属性的方法 public void setAddtime(Date addtime) { this.addtime = addtime; } + // 获取id属性的方法 public Long getId() { return id; } + // 设置id属性的方法 public void setId(Long id) { this.id = id; } - /** - * 设置:课程名称 - */ + + // 设置:课程名称 + // 设置kechengmingcheng属性的方法 public void setKechengmingcheng(String kechengmingcheng) { this.kechengmingcheng = kechengmingcheng; } - /** - * 获取:课程名称 - */ + + // 获取:课程名称 + // 获取kechengmingcheng属性的方法 public String getKechengmingcheng() { return kechengmingcheng; } - /** - * 设置:类型 - */ + + // 设置:类型 + // 设置leixing属性的方法 public void setLeixing(String leixing) { this.leixing = leixing; } - /** - * 获取:类型 - */ + + // 获取:类型 + // 获取leixing属性的方法 public String getLeixing() { return leixing; } - /** - * 设置:学科 - */ + + // 设置:学科 + // 设置xueke属性的方法 public void setXueke(String xueke) { this.xueke = xueke; } - /** - * 获取:学科 - */ + + // 获取:学科 + // 获取xueke属性的方法 public String getXueke() { return xueke; } - /** - * 设置:视频 - */ + + // 设置:视频 + // 设置shipin属性的方法 public void setShipin(String shipin) { this.shipin = shipin; } - /** - * 获取:视频 - */ + + // 获取:视频 + // 获取shipin属性的方法 public String getShipin() { return shipin; } - /** - * 设置:老师姓名 - */ + + // 设置:老师姓名 + // 设置laoshixingming属性的方法 public void setLaoshixingming(String laoshixingming) { this.laoshixingming = laoshixingming; } - /** - * 获取:老师姓名 - */ + + // 获取:老师姓名 + // 获取laoshixingming属性的方法 public String getLaoshixingming() { return laoshixingming; } - /** - * 设置:费用 - */ + + // 设置:费用 + // 设置feiyong属性的方法 public void setFeiyong(String feiyong) { this.feiyong = feiyong; } - /** - * 获取:费用 - */ + + // 获取:费用 + // 获取feiyong属性的方法 public String getFeiyong() { return feiyong; } - /** - * 设置:课程图片 - */ + + // 设置:课程图片 + // 设置kechengtupian属性的方法 public void setKechengtupian(String kechengtupian) { this.kechengtupian = kechengtupian; } - /** - * 获取:课程图片 - */ + + // 获取:课程图片 + // 获取kechengtupian属性的方法 public String getKechengtupian() { return kechengtupian; } - /** - * 设置:发布时间 - */ + + // 设置:发布时间 + // 设置fabushijian属性的方法 public void setFabushijian(Date fabushijian) { this.fabushijian = fabushijian; } - /** - * 获取:发布时间 - */ + + // 获取:发布时间 + // 获取fabushijian属性的方法 public Date getFabushijian() { return fabushijian; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/MessagesEntity.java b/src/main/java/com/entity/MessagesEntity.java index e00a2bc..b7c6ae9 100644 --- a/src/main/java/com/entity/MessagesEntity.java +++ b/src/main/java/com/entity/MessagesEntity.java @@ -1,146 +1,155 @@ +// 声明类所在的包为com.entity package com.entity; +// 导入MyBatis-Plus框架用于标记主键的注解 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架用于标记表名的注解 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR 303验证框架中,用于验证字符串不为空串的注解 import javax.validation.constraints.NotBlank; +// 导入JSR 303验证框架中,用于验证集合、数组等不为空的注解 import javax.validation.constraints.NotEmpty; +// 导入JSR 303验证框架中,用于验证对象不为null的注解 import javax.validation.constraints.NotNull; +// 导入Jackson库中,用于忽略JSON序列化和反序列化时某些属性的注解 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中,用于处理方法调用异常的类 import java.lang.reflect.InvocationTargetException; +// 导入Java中用于实现序列化接口的类 import java.io.Serializable; +// 导入Java中用于处理日期和时间的类 import java.util.Date; +// 导入Java中用于处理列表集合的接口 import java.util.List; +// 导入Spring框架中用于格式化日期的注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期的注解 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记表字段的注解 import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中用于定义字段填充策略的枚举类 import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中用于定义主键生成类型的枚举类 import com.baomidou.mybatisplus.enums.IdType; - -/** - * 留言板 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:15 - */ +// 留言板相关实体类 +// 该类用于数据库的通用操作(普通增删改查) +// 原注释中作者信息、邮箱信息和日期信息缺失 +// 使用MyBatis-Plus的注解指定该实体类对应数据库中的messages表 @TableName("messages") +// 定义一个泛型类MessagesEntity,实现Serializable接口,使对象可序列化 public class MessagesEntity implements Serializable { + // 定义序列化版本号,确保序列化和反序列化过程中类的版本一致 private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的MessagesEntity对象 public MessagesEntity() { - + } - + + // 带参构造函数,接收一个泛型对象t,将其属性复制到当前对象 public MessagesEntity(T t) { + // 尝试使用Apache Commons BeanUtils工具类将对象t的属性复制到当前对象 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中可能出现的非法访问异常和方法调用异常 + // 这里只是打印异常堆栈信息,可根据实际情况完善异常处理逻辑 e.printStackTrace(); } } - - /** - * 主键id - */ + + // 主键id + // 使用MyBatis-Plus的注解标记该属性为主键 @TableId + // 定义一个Long类型的属性id,用于存储主键 private Long id; - /** - * 留言人id - */ - + + // 留言人id + // 定义一个Long类型的属性userid,用于存储留言人的id private Long userid; - - /** - * 用户名 - */ - + + // 用户名 + // 定义一个String类型的属性username,用于存储留言人的用户名 private String username; - - /** - * 留言内容 - */ - + + // 留言内容 + // 定义一个String类型的属性content,用于存储留言的具体内容 private String content; - - /** - * 回复内容 - */ - + + // 回复内容 + // 定义一个String类型的属性reply,用于存储对留言的回复内容 private String reply; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson的注解指定日期格式化的模式,时区为GMT+8,语言为中文 + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring的注解指定日期格式化的方式 @DateTimeFormat + // 定义一个Date类型的属性addtime,用于存储留言的添加时间 private Date addtime; + // 获取addtime属性的方法 public Date getAddtime() { return addtime; } + + // 设置addtime属性的方法 public void setAddtime(Date addtime) { this.addtime = addtime; } + // 获取id属性的方法 public Long getId() { return id; } + // 设置id属性的方法 public void setId(Long id) { this.id = id; } - /** - * 设置:留言人id - */ + + // 设置留言人id的方法 public void setUserid(Long userid) { this.userid = userid; } - /** - * 获取:留言人id - */ + + // 获取留言人id的方法 public Long getUserid() { return userid; } - /** - * 设置:用户名 - */ + + // 设置用户名的方法 public void setUsername(String username) { this.username = username; } - /** - * 获取:用户名 - */ + + // 获取用户名的方法 public String getUsername() { return username; } - /** - * 设置:留言内容 - */ + + // 设置留言内容的方法 public void setContent(String content) { this.content = content; } - /** - * 获取:留言内容 - */ + + // 获取留言内容的方法 public String getContent() { return content; } - /** - * 设置:回复内容 - */ + + // 设置回复内容的方法 public void setReply(String reply) { this.reply = reply; } - /** - * 获取:回复内容 - */ + + // 获取回复内容的方法 public String getReply() { return reply; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/NewsEntity.java b/src/main/java/com/entity/NewsEntity.java index 240a15a..e379c8f 100644 --- a/src/main/java/com/entity/NewsEntity.java +++ b/src/main/java/com/entity/NewsEntity.java @@ -1,146 +1,155 @@ +// 声明当前类所属的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记数据库表主键的注解 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记数据库表名的注解 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR-303验证框架中用于验证字符串非空(排除空格后)的注解 import javax.validation.constraints.NotBlank; +// 导入JSR-303验证框架中用于验证集合、数组等非空的注解 import javax.validation.constraints.NotEmpty; +// 导入JSR-303验证框架中用于验证对象非null的注解 import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化/反序列化时特定属性的注解 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中处理方法调用异常的类 import java.lang.reflect.InvocationTargetException; +// 导入Java中实现对象序列化的接口 import java.io.Serializable; +// 导入Java中处理日期和时间的类 import java.util.Date; +// 导入Java中处理列表集合的接口(虽然当前类未直接使用,但保留导入) import java.util.List; +// 导入Spring框架中用于处理日期格式转换的注解 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期输出的注解 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记数据库表字段的注解(虽然当前类未直接使用,但保留导入) import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中定义字段填充策略的枚举类(当前类未使用,保留导入可能用于扩展) import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中定义主键生成类型的枚举类(当前类未使用,保留导入可能用于扩展) import com.baomidou.mybatisplus.enums.IdType; - -/** - * 教育资讯 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:15 - */ +// 使用MyBatis-Plus注解指定当前类对应数据库表名为news @TableName("news") +// 定义泛型实体类NewsEntity,实现Serializable接口以支持对象序列化 public class NewsEntity implements Serializable { + // 定义序列化版本号,确保不同版本序列化兼容性 private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建空的实体对象 public NewsEntity() { - + // 构造函数体为空 } - + + // 带参构造函数,接收泛型对象t,用于属性复制 public NewsEntity(T t) { + // 尝试将泛型对象t的属性复制到当前实体对象 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中的非法访问异常或方法调用异常 + // 打印异常堆栈信息(开发阶段临时处理,生产环境可优化) e.printStackTrace(); } } - - /** - * 主键id - */ + + // 标记为主键字段,对应数据库表的主键列 @TableId + // 定义Long类型的id字段,用于存储数据库表的主键值 private Long id; - /** - * 标题 - */ - + // 定义String类型的title字段,用于存储教育资讯的标题 private String title; - - /** - * 简介 - */ - + // 定义String类型的introduction字段,用于存储教育资讯的简介 private String introduction; - - /** - * 图片 - */ - + // 定义String类型的picture字段,用于存储教育资讯相关图片的路径或链接 private String picture; - - /** - * 内容 - */ - + // 定义String类型的content字段,用于存储教育资讯的详细内容 private String content; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson注解指定日期在JSON中的格式(时区GMT+8,格式yyyy-MM-dd HH:mm:ss) + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring注解支持日期格式转换 @DateTimeFormat + // 定义Date类型的addtime字段,用于存储记录的添加时间 private Date addtime; + // 获取addtime字段值的方法 public Date getAddtime() { + // 返回添加时间 return addtime; } + + // 设置addtime字段值的方法 public void setAddtime(Date addtime) { + // 将参数值赋给当前对象的addtime字段 this.addtime = addtime; } + // 获取id字段值的方法(主键) public Long getId() { + // 返回主键id return id; } + // 设置id字段值的方法(主键) public void setId(Long id) { + // 将参数值赋给当前对象的id字段 this.id = id; } - /** - * 设置:标题 - */ + + // 设置title字段值的方法(资讯标题) public void setTitle(String title) { + // 将参数值赋给当前对象的title字段 this.title = title; } - /** - * 获取:标题 - */ + + // 获取title字段值的方法(资讯标题) public String getTitle() { + // 返回资讯标题 return title; } - /** - * 设置:简介 - */ + + // 设置introduction字段值的方法(资讯简介) public void setIntroduction(String introduction) { + // 将参数值赋给当前对象的introduction字段 this.introduction = introduction; } - /** - * 获取:简介 - */ + + // 获取introduction字段值的方法(资讯简介) public String getIntroduction() { + // 返回资讯简介 return introduction; } - /** - * 设置:图片 - */ + + // 设置picture字段值的方法(资讯图片) public void setPicture(String picture) { + // 将参数值赋给当前对象的picture字段 this.picture = picture; } - /** - * 获取:图片 - */ + + // 获取picture字段值的方法(资讯图片) public String getPicture() { + // 返回资讯图片路径或链接 return picture; } - /** - * 设置:内容 - */ + + // 设置content字段值的方法(资讯内容) public void setContent(String content) { + // 将参数值赋给当前对象的content字段 this.content = content; } - /** - * 获取:内容 - */ + + // 获取content字段值的方法(资讯内容) public String getContent() { + // 返回资讯详细内容 return content; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/ShipindianboEntity.java b/src/main/java/com/entity/ShipindianboEntity.java index c3ea84c..9eccfc9 100644 --- a/src/main/java/com/entity/ShipindianboEntity.java +++ b/src/main/java/com/entity/ShipindianboEntity.java @@ -1,220 +1,215 @@ +// 声明当前类所属的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记数据库表主键的注解 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记数据库表名的注解 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR-303验证框架中用于验证字符串非空(排除空格后)的注解(当前类未使用,保留导入可能用于扩展) import javax.validation.constraints.NotBlank; +// 导入JSR-303验证框架中用于验证集合、数组等非空的注解(当前类未使用,保留导入可能用于扩展) import javax.validation.constraints.NotEmpty; +// 导入JSR-303验证框架中用于验证对象非null的注解(当前类未使用,保留导入可能用于扩展) import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化/反序列化时特定属性的注解(当前类未使用,保留导入可能用于扩展) import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中处理方法调用异常的类(用于构造函数的异常处理) import java.lang.reflect.InvocationTargetException; +// 导入Java中实现对象序列化的接口(使当前类支持对象序列化) import java.io.Serializable; +// 导入Java中处理日期和时间的类(用于日期字段) import java.util.Date; +// 导入Java中处理列表集合的接口(当前类未直接使用,保留导入可能用于扩展) import java.util.List; +// 导入Spring框架中用于处理日期格式转换的注解(用于日期字段的格式化) import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期输出的注解(用于日期字段的JSON序列化格式) import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类(用于构造函数的属性复制) import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记数据库表字段的注解(当前类未使用,保留导入可能用于扩展) import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中定义字段填充策略的枚举类(当前类未使用,保留导入可能用于扩展) import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中定义主键生成类型的枚举类(当前类未使用,保留导入可能用于扩展) import com.baomidou.mybatisplus.enums.IdType; - -/** - * 视频点播 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:14 - */ +// 使用MyBatis-Plus注解指定当前类对应数据库表名为shipindianbo @TableName("shipindianbo") +// 定义泛型实体类ShipindianboEntity,实现Serializable接口以支持对象序列化 public class ShipindianboEntity implements Serializable { + // 定义序列化版本号,确保不同版本序列化兼容性 private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建空的实体对象 public ShipindianboEntity() { - + // 构造函数体为空 } - + + // 带参构造函数,接收泛型对象t,用于属性复制 public ShipindianboEntity(T t) { + // 尝试将泛型对象t的属性复制到当前实体对象 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中的非法访问异常或方法调用异常 + // 打印异常堆栈信息(开发阶段临时处理,生产环境可优化) e.printStackTrace(); } } - - /** - * 主键id - */ + + // 标记为主键字段,对应数据库表的主键列 @TableId + // 定义Long类型的id字段,用于存储数据库表的主键值 private Long id; - /** - * 视频名称 - */ - + // 定义String类型的shipinmingcheng字段,用于存储视频名称 private String shipinmingcheng; - - /** - * 视频 - */ - + // 定义String类型的shipin字段,用于存储视频文件路径或链接 private String shipin; - - /** - * 视频简介 - */ - + // 定义String类型的shipinjianjie字段,用于存储视频简介 private String shipinjianjie; - - /** - * 来源 - */ - + // 定义String类型的laiyuan字段,用于存储视频来源 private String laiyuan; - - /** - * 上传时间 - */ - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") - @DateTimeFormat + // 使用Jackson注解指定日期在JSON中的格式(时区GMT+8,格式yyyy-MM-dd HH:mm:ss) + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring注解支持日期格式转换 + @DateTimeFormat + // 定义Date类型的shangchuanshijian字段,用于存储视频上传时间 private Date shangchuanshijian; - - /** - * 封面 - */ - + // 定义String类型的fengmian字段,用于存储视频封面路径或链接 private String fengmian; - - /** - * 用户账号 - */ - + // 定义String类型的yonghuzhanghao字段,用于存储用户账号 private String yonghuzhanghao; - - /** - * 用户id - */ - + // 定义Long类型的userid字段,用于存储用户ID(外键关联用户表) private Long userid; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson注解指定日期在JSON中的格式(时区GMT+8,格式yyyy-MM-dd HH:mm:ss) + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring注解支持日期格式转换 @DateTimeFormat + // 定义Date类型的addtime字段,用于存储记录的添加时间 private Date addtime; + // 获取addtime字段值的方法(记录添加时间) public Date getAddtime() { + // 返回添加时间 return addtime; } + + // 设置addtime字段值的方法(记录添加时间) public void setAddtime(Date addtime) { + // 将参数值赋给当前对象的addtime字段 this.addtime = addtime; } + // 获取id字段值的方法(主键) public Long getId() { + // 返回主键id return id; } + // 设置id字段值的方法(主键) public void setId(Long id) { + // 将参数值赋给当前对象的id字段 this.id = id; } - /** - * 设置:视频名称 - */ + + // 设置shipinmingcheng字段值的方法(视频名称) public void setShipinmingcheng(String shipinmingcheng) { + // 将参数值赋给当前对象的shipinmingcheng字段 this.shipinmingcheng = shipinmingcheng; } - /** - * 获取:视频名称 - */ + + // 获取shipinmingcheng字段值的方法(视频名称) public String getShipinmingcheng() { + // 返回视频名称 return shipinmingcheng; } - /** - * 设置:视频 - */ + + // 设置shipin字段值的方法(视频文件路径) public void setShipin(String shipin) { + // 将参数值赋给当前对象的shipin字段 this.shipin = shipin; } - /** - * 获取:视频 - */ + + // 获取shipin字段值的方法(视频文件路径) public String getShipin() { + // 返回视频文件路径或链接 return shipin; } - /** - * 设置:视频简介 - */ + + // 设置shipinjianjie字段值的方法(视频简介) public void setShipinjianjie(String shipinjianjie) { + // 将参数值赋给当前对象的shipinjianjie字段 this.shipinjianjie = shipinjianjie; } - /** - * 获取:视频简介 - */ + + // 获取shipinjianjie字段值的方法(视频简介) public String getShipinjianjie() { + // 返回视频简介 return shipinjianjie; } - /** - * 设置:来源 - */ + + // 设置laiyuan字段值的方法(视频来源) public void setLaiyuan(String laiyuan) { + // 将参数值赋给当前对象的laiyuan字段 this.laiyuan = laiyuan; } - /** - * 获取:来源 - */ + + // 获取laiyuan字段值的方法(视频来源) public String getLaiyuan() { + // 返回视频来源 return laiyuan; } - /** - * 设置:上传时间 - */ + + // 设置shangchuanshijian字段值的方法(视频上传时间) public void setShangchuanshijian(Date shangchuanshijian) { + // 将参数值赋给当前对象的shangchuanshijian字段 this.shangchuanshijian = shangchuanshijian; } - /** - * 获取:上传时间 - */ + + // 获取shangchuanshijian字段值的方法(视频上传时间) public Date getShangchuanshijian() { + // 返回视频上传时间 return shangchuanshijian; } - /** - * 设置:封面 - */ + + // 设置fengmian字段值的方法(视频封面) public void setFengmian(String fengmian) { + // 将参数值赋给当前对象的fengmian字段 this.fengmian = fengmian; } - /** - * 获取:封面 - */ + + // 获取fengmian字段值的方法(视频封面) public String getFengmian() { + // 返回视频封面路径或链接 return fengmian; } - /** - * 设置:用户账号 - */ + + // 设置yonghuzhanghao字段值的方法(用户账号) public void setYonghuzhanghao(String yonghuzhanghao) { + // 将参数值赋给当前对象的yonghuzhanghao字段 this.yonghuzhanghao = yonghuzhanghao; } - /** - * 获取:用户账号 - */ + + // 获取yonghuzhanghao字段值的方法(用户账号) public String getYonghuzhanghao() { + // 返回用户账号 return yonghuzhanghao; } - /** - * 设置:用户id - */ + + // 设置userid字段值的方法(用户ID) public void setUserid(Long userid) { + // 将参数值赋给当前对象的userid字段 this.userid = userid; } - /** - * 获取:用户id - */ + + // 获取userid字段值的方法(用户ID) public Long getUserid() { + // 返回用户ID return userid; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/StoreupEntity.java b/src/main/java/com/entity/StoreupEntity.java index c6192cc..4717fbb 100644 --- a/src/main/java/com/entity/StoreupEntity.java +++ b/src/main/java/com/entity/StoreupEntity.java @@ -1,164 +1,169 @@ +// 声明当前类所属的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记数据库表主键的注解(用于标识主键字段) import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记数据库表名的注解(用于指定实体类对应的表名) import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR-303验证框架中用于验证字符串非空(排除空格后)的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotBlank; +// 导入JSR-303验证框架中用于验证集合、数组等非空的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotEmpty; +// 导入JSR-303验证框架中用于验证对象非null的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化/反序列化时特定属性的注解(当前类未使用,保留导入以备扩展) import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中处理方法调用异常的类(用于构造函数的异常处理) import java.lang.reflect.InvocationTargetException; +// 导入Java中实现对象序列化的接口(使当前类支持对象序列化,便于网络传输或持久化) import java.io.Serializable; +// 导入Java中处理日期和时间的类(用于日期字段的定义) import java.util.Date; +// 导入Java中处理列表集合的接口(当前类未直接使用,保留导入以备扩展) import java.util.List; +// 导入Spring框架中用于处理日期格式转换的注解(用于前端与后端日期格式的统一转换) import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期输出的注解(用于指定日期在JSON中的序列化格式) import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类(用于构造函数中对象属性的复制) import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记数据库表字段的注解(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中定义字段填充策略的枚举类(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中定义主键生成类型的枚举类(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.enums.IdType; - -/** - * 收藏表 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:15 - */ +// 使用MyBatis-Plus注解指定当前类对应的数据库表名为storeup @TableName("storeup") +// 定义泛型实体类StoreupEntity,实现Serializable接口以支持对象的序列化和反序列化 public class StoreupEntity implements Serializable { + // 定义序列化版本号,确保不同版本的序列化兼容性(建议与类结构变更时同步更新) private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的实体对象(框架反射创建对象时需要) public StoreupEntity() { - + // 构造函数体为空,无需额外操作 } - + + // 带参构造函数,接收一个泛型对象t,用于将t的属性复制到当前实体对象 public StoreupEntity(T t) { + // 尝试使用BeanUtils工具类复制对象属性 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中的非法访问异常或方法调用异常 + // 打印异常堆栈信息(开发阶段临时处理,生产环境可自定义异常处理逻辑) e.printStackTrace(); } } - - /** - * 主键id - */ + + // 标记该字段为主键,对应数据库表中的主键列(通常为自增ID) @TableId + // 定义Long类型的id字段,用于存储数据库表的主键值 private Long id; - /** - * 用户id - */ - + // 定义Long类型的userid字段,用于存储用户ID(外键,关联用户表) private Long userid; - - /** - * 收藏id - */ - + // 定义Long类型的refid字段,用于存储收藏对象的ID(外键,关联被收藏的表记录) private Long refid; - - /** - * 表名 - */ - + // 定义String类型的tablename字段,用于存储被收藏对象对应的表名(如"kechengxinxi") private String tablename; - - /** - * 收藏名称 - */ - + // 定义String类型的name字段,用于存储收藏项的名称(如课程名称、资讯标题等) private String name; - - /** - * 收藏图片 - */ - + // 定义String类型的picture字段,用于存储收藏项的封面图片路径或链接 private String picture; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson注解指定日期在JSON中的格式(时区:GMT+8,格式:年-月-日 时:分:秒) + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring注解支持前端日期参数的自动格式化转换 @DateTimeFormat + // 定义Date类型的addtime字段,用于存储收藏记录的添加时间 private Date addtime; + // 获取addtime字段值的方法(返回收藏记录的添加时间) public Date getAddtime() { + // 返回添加时间属性值 return addtime; } + + // 设置addtime字段值的方法(设置收藏记录的添加时间) public void setAddtime(Date addtime) { + // 将参数值赋给当前对象的addtime属性 this.addtime = addtime; } + // 获取id字段值的方法(返回主键ID) public Long getId() { + // 返回主键ID属性值 return id; } + // 设置id字段值的方法(设置主键ID,通常由数据库自动生成,代码中较少手动设置) public void setId(Long id) { + // 将参数值赋给当前对象的id属性 this.id = id; } - /** - * 设置:用户id - */ + + // 设置userid字段值的方法(设置用户ID) public void setUserid(Long userid) { + // 将参数值赋给当前对象的userid属性 this.userid = userid; } - /** - * 获取:用户id - */ + + // 获取userid字段值的方法(返回用户ID) public Long getUserid() { + // 返回用户ID属性值 return userid; } - /** - * 设置:收藏id - */ + + // 设置refid字段值的方法(设置收藏对象的ID) public void setRefid(Long refid) { + // 将参数值赋给当前对象的refid属性 this.refid = refid; } - /** - * 获取:收藏id - */ + + // 获取refid字段值的方法(返回收藏对象的ID) public Long getRefid() { + // 返回收藏对象ID属性值 return refid; } - /** - * 设置:表名 - */ + + // 设置tablename字段值的方法(设置被收藏对象对应的表名) public void setTablename(String tablename) { + // 将参数值赋给当前对象的tablename属性 this.tablename = tablename; } - /** - * 获取:表名 - */ + + // 获取tablename字段值的方法(返回被收藏对象对应的表名) public String getTablename() { + // 返回表名属性值 return tablename; } - /** - * 设置:收藏名称 - */ + + // 设置name字段值的方法(设置收藏项的名称) public void setName(String name) { + // 将参数值赋给当前对象的name属性 this.name = name; } - /** - * 获取:收藏名称 - */ + + // 获取name字段值的方法(返回收藏项的名称) public String getName() { + // 返回收藏名称属性值 return name; } - /** - * 设置:收藏图片 - */ + + // 设置picture字段值的方法(设置收藏项的封面图片) public void setPicture(String picture) { + // 将参数值赋给当前对象的picture属性 this.picture = picture; } - /** - * 获取:收藏图片 - */ + + // 获取picture字段值的方法(返回收藏项的封面图片路径或链接) public String getPicture() { + // 返回图片路径属性值 return picture; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/TokenEntity.java b/src/main/java/com/entity/TokenEntity.java index a0f6489..c16472f 100644 --- a/src/main/java/com/entity/TokenEntity.java +++ b/src/main/java/com/entity/TokenEntity.java @@ -1,123 +1,161 @@ +// 声明当前类所属的包为com.entity package com.entity; +// 导入Java序列化接口,使实体类支持对象序列化(用于网络传输或持久化存储) import java.io.Serializable; +// 导入Java日期类,用于处理日期和时间字段 import java.util.Date; +// 导入MyBatis-Plus的主键注解,用于标记数据库表的主键字段 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus的表名注解,用于指定实体类对应的数据库表名 import com.baomidou.mybatisplus.annotations.TableName; +// 导入MyBatis-Plus的主键生成类型枚举,用于配置主键生成策略 import com.baomidou.mybatisplus.enums.IdType; -/** - * token表 - */ +// token表实体类 +// 用于存储用户令牌信息,实现用户身份验证和权限管理 +// 使用MyBatis-Plus注解指定对应的数据库表名为"token" @TableName("token") +// 定义TokenEntity类,实现Serializable接口以支持对象的序列化和反序列化 public class TokenEntity implements Serializable { + // 定义序列化版本号,确保不同版本的兼容性(建议与类结构同步更新) private static final long serialVersionUID = 1L; - + + // 标记为主键字段,指定主键生成策略为数据库自增(AUTO) @TableId(type = IdType.AUTO) + // 主键ID,由数据库自增生成,唯一标识一条token记录 private Long id; - - /** - * 用户id - */ + + // 用户ID,关联用户表的主键,标识该token所属的用户 private Long userid; - - /** - * 用户名 - */ + + // 用户名,令牌所属用户的登录名称,用于快速识别用户身份 private String username; - - /** - * 表名 - */ + + // 表名,标识该token关联的数据库表(如用户表、管理员表等),用于区分不同类型的用户 private String tablename; - - /** - * 角色 - */ + + // 角色,用户的角色信息(如"user"、"admin"),用于权限控制和功能访问限制 private String role; - - /** - * token - */ + + // 令牌值,用于验证用户身份的唯一凭证,客户端通过该token访问受保护的资源 private String token; - - /** - * 过期时间 - */ + + // 过期时间,令牌的有效截止时间,超过该时间后令牌失效,需重新获取 private Date expiratedtime; - - /** - * 新增时间 - */ + + // 新增时间,记录token创建的具体时间,用于审计和日志追踪 private Date addtime; + // ------------------------- Getter 方法 ------------------------- + + // 获取主键ID + // @return 主键ID,数据库自增生成的唯一标识 public Long getId() { return id; } + // 设置主键ID(通常由数据库自动生成,代码中一般不手动设置) + // @param id 主键ID值 public void setId(Long id) { this.id = id; } + // 获取用户ID + // @return 用户ID,关联用户表的主键,标识token所属用户 public Long getUserid() { return userid; } + // 设置用户ID + // @param userid 用户ID值 public void setUserid(Long userid) { this.userid = userid; } - public String getRole() { - return role; - } - - public void setRole(String role) { - this.role = role; + // 获取用户名 + // @return 用户名,token所属用户的登录名称 + public String getUsername() { + return username; } - public String getToken() { - return token; + // 设置用户名 + // @param username 用户名值 + public void setUsername(String username) { + this.username = username; } + // 获取关联的表名 + // @return 表名,标识token关联的数据库表 public String getTablename() { return tablename; } + // 设置关联的表名 + // @param tablename 表名值(如"user"、"admin"对应的表) public void setTablename(String tablename) { this.tablename = tablename; } + // 获取用户角色 + // @return 角色,用户的权限角色(如普通用户、管理员) + public String getRole() { + return role; + } + + // 设置用户角色 + // @param role 角色值(用于权限控制) + public void setRole(String role) { + this.role = role; + } + + // 获取令牌值 + // @return 令牌,用户身份验证的唯一凭证 + public String getToken() { + return token; + } + + // 设置令牌值 + // @param token 令牌值(通常由认证服务生成) public void setToken(String token) { this.token = token; } + // 获取过期时间 + // @return 过期时间,令牌失效的时间点 public Date getExpiratedtime() { return expiratedtime; } + // 设置过期时间 + // @param expiratedtime 过期时间值(需为Date类型) public void setExpiratedtime(Date expiratedtime) { this.expiratedtime = expiratedtime; } + // 获取新增时间 + // @return 新增时间,token记录的创建时间 public Date getAddtime() { return addtime; } + // 设置新增时间(通常由系统自动生成,无需手动设置) + // @param addtime 新增时间值 public void setAddtime(Date addtime) { this.addtime = addtime; } - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } + // ------------------------- 构造方法 ------------------------- - public TokenEntity(Long userid, String username, String tablename,String role, String token, Date expiratedtime) { - super(); + // 带参数的构造方法,用于初始化token记录的主要信息 + // @param userid 用户ID,标识token所属用户 + // @param username 用户名,用户的登录名称 + // @param tablename 关联表名,标识用户类型对应的表 + // @param role 用户角色,用于权限控制 + // @param token 令牌值,身份验证凭证 + // @param expiratedtime 过期时间,令牌有效截止时间 + public TokenEntity(Long userid, String username, String tablename, String role, String token, Date expiratedtime) { this.userid = userid; this.username = username; this.tablename = tablename; @@ -125,8 +163,8 @@ public class TokenEntity implements Serializable { this.token = token; this.expiratedtime = expiratedtime; } - + + // 无参构造方法,用于框架反射创建对象(如MyBatis-Plus自动实例化) public TokenEntity() { } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/UserEntity.java b/src/main/java/com/entity/UserEntity.java index 1b6fb62..7644c26 100644 --- a/src/main/java/com/entity/UserEntity.java +++ b/src/main/java/com/entity/UserEntity.java @@ -1,77 +1,100 @@ +// 声明该类属于com.entity包 package com.entity; +// 导入Java的序列化接口,使类可实现序列化,用于对象的存储和传输 import java.io.Serializable; +// 导入Java的日期类,用于处理日期和时间 import java.util.Date; +// 导入MyBatis-Plus框架用于标记主键的注解 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架用于标记数据库表名的注解 import com.baomidou.mybatisplus.annotations.TableName; +// 导入MyBatis-Plus框架定义主键生成类型的枚举类 import com.baomidou.mybatisplus.enums.IdType; -/** - * 用户 - */ +// 表示这是用户相关的实体类 +// 使用MyBatis-Plus的注解指定该实体类对应数据库中的users表 @TableName("users") +// 定义UserEntity类,实现Serializable接口,使该类的对象可以被序列化 public class UserEntity implements Serializable { + // 定义序列化版本号,确保序列化和反序列化过程中类的版本一致 private static final long serialVersionUID = 1L; - + + // 使用MyBatis-Plus的注解标记该属性为主键,且主键生成策略为数据库自增 @TableId(type = IdType.AUTO) + // 定义一个Long类型的属性id,用于存储数据库表的主键 private Long id; - - /** - * 用户账号 - */ + + // 定义一个String类型的属性username,用于存储用户账号 private String username; - - /** - * 密码 - */ + + // 定义一个String类型的属性password,用于存储用户密码 private String password; - - /** - * 用户类型 - */ + + // 定义一个String类型的属性role,用于存储用户类型 private String role; - + + // 定义一个Date类型的属性addtime,用于存储用户记录的添加时间 private Date addtime; + // 获取用户账号的方法 public String getUsername() { + // 返回用户账号 return username; } + // 设置用户账号的方法 public void setUsername(String username) { + // 将参数值赋给当前对象的username属性 this.username = username; } + // 获取用户密码的方法 public String getPassword() { + // 返回用户密码 return password; } + // 设置用户密码的方法 public void setPassword(String password) { + // 将参数值赋给当前对象的password属性 this.password = password; } + // 获取用户类型的方法 public String getRole() { + // 返回用户类型 return role; } + // 设置用户类型的方法 public void setRole(String role) { + // 将参数值赋给当前对象的role属性 this.role = role; } + // 获取记录添加时间的方法 public Date getAddtime() { + // 返回记录添加时间 return addtime; } + // 设置记录添加时间的方法 public void setAddtime(Date addtime) { + // 将参数值赋给当前对象的addtime属性 this.addtime = addtime; } + // 获取主键id的方法 public Long getId() { + // 返回主键id return id; } + // 设置主键id的方法 public void setId(Long id) { + // 将参数值赋给当前对象的id属性 this.id = id; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/WodebijiEntity.java b/src/main/java/com/entity/WodebijiEntity.java index f08e74f..0849969 100644 --- a/src/main/java/com/entity/WodebijiEntity.java +++ b/src/main/java/com/entity/WodebijiEntity.java @@ -1,128 +1,141 @@ +// 声明当前类所属的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记数据库表主键的注解(用于标识主键字段) import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记数据库表名的注解(用于指定实体类对应的表名) import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR-303验证框架中用于验证字符串非空(排除空格后)的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotBlank; +// 导入JSR-303验证框架中用于验证集合、数组等非空的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotEmpty; +// 导入JSR-303验证框架中用于验证对象非null的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化/反序列化时特定属性的注解(当前类未使用,保留导入以备扩展) import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中处理方法调用异常的类(用于构造函数的异常处理) import java.lang.reflect.InvocationTargetException; +// 导入Java中实现对象序列化的接口(使当前类支持对象序列化,便于网络传输或持久化) import java.io.Serializable; +// 导入Java中处理日期和时间的类(用于日期字段的定义) import java.util.Date; +// 导入Java中处理列表集合的接口(当前类未直接使用,保留导入以备扩展) import java.util.List; +// 导入Spring框架中用于处理日期格式转换的注解(用于前端与后端日期格式的统一转换) import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期输出的注解(用于指定日期在JSON中的序列化格式) import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类(用于构造函数中对象属性的复制) import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记数据库表字段的注解(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中定义字段填充策略的枚举类(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中定义主键生成类型的枚举类(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.enums.IdType; - -/** - * 我的笔记 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:15 - */ +// 使用MyBatis-Plus注解指定当前类对应的数据库表名为wodebiji @TableName("wodebiji") +// 定义泛型实体类WodebijiEntity,实现Serializable接口以支持对象的序列化和反序列化 public class WodebijiEntity implements Serializable { + // 定义序列化版本号,确保不同版本的序列化兼容性(建议与类结构变更时同步更新) private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的实体对象(框架反射创建对象时需要) public WodebijiEntity() { - + // 构造函数体为空 } - + + // 带参构造函数,接收一个泛型对象t,用于将t的属性复制到当前实体对象 public WodebijiEntity(T t) { + // 尝试使用BeanUtils工具类复制对象属性 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中的非法访问异常或方法调用异常 + // 打印异常堆栈信息(开发阶段临时处理,生产环境可自定义异常处理逻辑) e.printStackTrace(); } } - - /** - * 主键id - */ + + // 标记该字段为主键,对应数据库表中的主键列(默认主键生成策略) @TableId + // 定义Long类型的id字段,用于存储数据库表的主键值 private Long id; - /** - * 标题 - */ - + // 定义String类型的biaoti字段,用于存储笔记的标题 private String biaoti; - - /** - * 内容 - */ - + // 定义String类型的neirong字段,用于存储笔记的内容 private String neirong; - - /** - * 用户账号 - */ - + // 定义String类型的yonghuzhanghao字段,用于存储用户账号(关联用户信息) private String yonghuzhanghao; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson注解指定日期在JSON中的格式(时区:GMT+8,格式:年-月-日 时:分:秒) + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring注解支持前端日期参数的自动格式化转换 @DateTimeFormat + // 定义Date类型的addtime字段,用于存储笔记记录的添加时间 private Date addtime; + // 获取addtime字段值的方法(返回笔记记录的添加时间) public Date getAddtime() { + // 返回添加时间属性值 return addtime; } + + // 设置addtime字段值的方法(设置笔记记录的添加时间) public void setAddtime(Date addtime) { + // 将参数值赋给当前对象的addtime属性 this.addtime = addtime; } + // 获取id字段值的方法(返回主键ID) public Long getId() { + // 返回主键ID属性值 return id; } + // 设置id字段值的方法(设置主键ID,通常由数据库自动生成,代码中较少手动设置) public void setId(Long id) { + // 将参数值赋给当前对象的id属性 this.id = id; } - /** - * 设置:标题 - */ + + // 设置biaoti字段值的方法(设置笔记标题) public void setBiaoti(String biaoti) { + // 将参数值赋给当前对象的biaoti属性 this.biaoti = biaoti; } - /** - * 获取:标题 - */ + + // 获取biaoti字段值的方法(返回笔记标题) public String getBiaoti() { + // 返回笔记标题属性值 return biaoti; } - /** - * 设置:内容 - */ + + // 设置neirong字段值的方法(设置笔记内容) public void setNeirong(String neirong) { + // 将参数值赋给当前对象的neirong属性 this.neirong = neirong; } - /** - * 获取:内容 - */ + + // 获取neirong字段值的方法(返回笔记内容) public String getNeirong() { + // 返回笔记内容属性值 return neirong; } - /** - * 设置:用户账号 - */ + + // 设置yonghuzhanghao字段值的方法(设置用户账号) public void setYonghuzhanghao(String yonghuzhanghao) { + // 将参数值赋给当前对象的yonghuzhanghao属性 this.yonghuzhanghao = yonghuzhanghao; } - /** - * 获取:用户账号 - */ + + // 获取yonghuzhanghao字段值的方法(返回用户账号) public String getYonghuzhanghao() { + // 返回用户账号属性值 return yonghuzhanghao; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/WodekechengEntity.java b/src/main/java/com/entity/WodekechengEntity.java index 4111b51..05685ec 100644 --- a/src/main/java/com/entity/WodekechengEntity.java +++ b/src/main/java/com/entity/WodekechengEntity.java @@ -1,146 +1,155 @@ +// 声明当前类所属的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记数据库表主键的注解(用于标识主键字段) import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记数据库表名的注解(用于指定实体类对应的表名) import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR-303验证框架中用于验证字符串非空(排除空格后)的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotBlank; +// 导入JSR-303验证框架中用于验证集合、数组等非空的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotEmpty; +// 导入JSR-303验证框架中用于验证对象非null的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化/反序列化时特定属性的注解(当前类未使用,保留导入以备扩展) import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中处理方法调用异常的类(用于构造函数的异常处理) import java.lang.reflect.InvocationTargetException; +// 导入Java中实现对象序列化的接口(使当前类支持对象序列化,便于网络传输或持久化) import java.io.Serializable; +// 导入Java中处理日期和时间的类(用于日期字段的定义) import java.util.Date; +// 导入Java中处理列表集合的接口(当前类未直接使用,保留导入以备扩展) import java.util.List; +// 导入Spring框架中用于处理日期格式转换的注解(用于前端与后端日期格式的统一转换) import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期输出的注解(用于指定日期在JSON中的序列化格式) import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类(用于构造函数中对象属性的复制) import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记数据库表字段的注解(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中定义字段填充策略的枚举类(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中定义主键生成类型的枚举类(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.enums.IdType; - -/** - * 我的课程 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:15 - */ +// 使用MyBatis-Plus注解指定当前类对应的数据库表名为wodekecheng @TableName("wodekecheng") +// 定义泛型实体类WodekechengEntity,实现Serializable接口以支持对象的序列化和反序列化 public class WodekechengEntity implements Serializable { + // 定义序列化版本号,确保不同版本的序列化兼容性(建议与类结构变更时同步更新) private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的实体对象(框架反射创建对象时需要) public WodekechengEntity() { - + // 构造函数体为空 } - + + // 带参构造函数,接收一个泛型对象t,用于将t的属性复制到当前实体对象 public WodekechengEntity(T t) { + // 尝试使用BeanUtils工具类复制对象属性 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中的非法访问异常或方法调用异常 + // 打印异常堆栈信息(开发阶段临时处理,生产环境可自定义异常处理逻辑) e.printStackTrace(); } } - - /** - * 主键id - */ + + // 标记该字段为主键,对应数据库表中的主键列(默认主键生成策略) @TableId + // 定义Long类型的id字段,用于存储数据库表的主键值 private Long id; - /** - * 课程名称 - */ - + // 定义String类型的kechengmingcheng字段,用于存储课程名称 private String kechengmingcheng; - - /** - * 章节 - */ - + // 定义String类型的zhangjie字段,用于存储课程的章节信息 private String zhangjie; - - /** - * 文件 - */ - + // 定义String类型的wenjian字段,用于存储课程相关的文件路径或名称 private String wenjian; - - /** - * 用户账号 - */ - + // 定义String类型的yonghuzhanghao字段,用于存储用户账号(关联用户信息) private String yonghuzhanghao; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson注解指定日期在JSON中的格式(时区:GMT+8,格式:年-月-日 时:分:秒) + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring注解支持前端日期参数的自动格式化转换 @DateTimeFormat + // 定义Date类型的addtime字段,用于存储课程记录的添加时间 private Date addtime; + // 获取addtime字段值的方法(返回课程记录的添加时间) public Date getAddtime() { + // 返回添加时间属性值 return addtime; } + + // 设置addtime字段值的方法(设置课程记录的添加时间) public void setAddtime(Date addtime) { + // 将参数值赋给当前对象的addtime属性 this.addtime = addtime; } + // 获取id字段值的方法(返回主键ID) public Long getId() { + // 返回主键ID属性值 return id; } + // 设置id字段值的方法(设置主键ID,通常由数据库自动生成,代码中较少手动设置) public void setId(Long id) { + // 将参数值赋给当前对象的id属性 this.id = id; } - /** - * 设置:课程名称 - */ + + // 设置kechengmingcheng字段值的方法(设置课程名称) public void setKechengmingcheng(String kechengmingcheng) { + // 将参数值赋给当前对象的kechengmingcheng属性 this.kechengmingcheng = kechengmingcheng; } - /** - * 获取:课程名称 - */ + + // 获取kechengmingcheng字段值的方法(返回课程名称) public String getKechengmingcheng() { + // 返回课程名称属性值 return kechengmingcheng; } - /** - * 设置:章节 - */ + + // 设置zhangjie字段值的方法(设置课程章节) public void setZhangjie(String zhangjie) { + // 将参数值赋给当前对象的zhangjie属性 this.zhangjie = zhangjie; } - /** - * 获取:章节 - */ + + // 获取zhangjie字段值的方法(返回课程章节) public String getZhangjie() { + // 返回课程章节属性值 return zhangjie; } - /** - * 设置:文件 - */ + + // 设置wenjian字段值的方法(设置课程文件) public void setWenjian(String wenjian) { + // 将参数值赋给当前对象的wenjian属性 this.wenjian = wenjian; } - /** - * 获取:文件 - */ + + // 获取wenjian字段值的方法(返回课程文件路径或名称) public String getWenjian() { + // 返回课程文件属性值 return wenjian; } - /** - * 设置:用户账号 - */ + + // 设置yonghuzhanghao字段值的方法(设置用户账号) public void setYonghuzhanghao(String yonghuzhanghao) { + // 将参数值赋给当前对象的yonghuzhanghao属性 this.yonghuzhanghao = yonghuzhanghao; } - /** - * 获取:用户账号 - */ + + // 获取yonghuzhanghao字段值的方法(返回用户账号) public String getYonghuzhanghao() { + // 返回用户账号属性值 return yonghuzhanghao; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/XiaoxitongzhiEntity.java b/src/main/java/com/entity/XiaoxitongzhiEntity.java index c7da81c..fe37abc 100644 --- a/src/main/java/com/entity/XiaoxitongzhiEntity.java +++ b/src/main/java/com/entity/XiaoxitongzhiEntity.java @@ -1,148 +1,160 @@ +// 声明当前类所属的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记数据库表主键的注解(用于标识主键字段) import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记数据库表名的注解(用于指定实体类对应的表名) import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR-303验证框架中用于验证字符串非空(排除空格后)的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotBlank; +// 导入JSR-303验证框架中用于验证集合、数组等非空的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotEmpty; +// 导入JSR-303验证框架中用于验证对象非null的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化/反序列化时特定属性的注解(当前类未使用,保留导入以备扩展) import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中处理方法调用异常的类(用于构造函数的异常处理) import java.lang.reflect.InvocationTargetException; +// 导入Java中实现对象序列化的接口(使当前类支持对象序列化,便于网络传输或持久化) import java.io.Serializable; +// 导入Java中处理日期和时间的类(用于日期字段的定义) import java.util.Date; +// 导入Java中处理列表集合的接口(当前类未直接使用,保留导入以备扩展) import java.util.List; +// 导入Spring框架中用于处理日期格式转换的注解(用于前端与后端日期格式的统一转换) import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期输出的注解(用于指定日期在JSON中的序列化格式) import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类(用于构造函数中对象属性的复制) import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记数据库表字段的注解(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中定义字段填充策略的枚举类(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中定义主键生成类型的枚举类(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.enums.IdType; - -/** - * 消息通知 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:15 - */ +// 消息通知实体类 +// 数据库通用操作实体类(普通增删改查) +// 使用MyBatis-Plus注解指定当前类对应的数据库表名为xiaoxitongzhi @TableName("xiaoxitongzhi") +// 定义泛型实体类XiaoxitongzhiEntity,实现Serializable接口以支持对象的序列化和反序列化 public class XiaoxitongzhiEntity implements Serializable { + // 定义序列化版本号,确保不同版本的序列化兼容性(建议与类结构变更时同步更新) private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的实体对象(框架反射创建对象时需要) public XiaoxitongzhiEntity() { - + // 构造函数体为空 } - + + // 带参构造函数,接收一个泛型对象t,用于将t的属性复制到当前实体对象 public XiaoxitongzhiEntity(T t) { + // 尝试使用BeanUtils工具类复制对象属性 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中的非法访问异常或方法调用异常 + // 打印异常堆栈信息(开发阶段临时处理,生产环境可自定义异常处理逻辑) e.printStackTrace(); } } - - /** - * 主键id - */ + + // 标记该字段为主键,对应数据库表中的主键列(默认主键生成策略) @TableId + // 定义Long类型的id字段,用于存储数据库表的主键值 private Long id; - /** - * 通知标题 - */ - + // 定义String类型的tongzhibiaoti字段,用于存储通知的标题 private String tongzhibiaoti; - - /** - * 通知内容 - */ - + // 定义String类型的tongzhineirong字段,用于存储通知的具体内容 private String tongzhineirong; - - /** - * 用户账号 - */ - + // 定义String类型的yonghuzhanghao字段,用于存储接收通知的用户账号(关联用户信息) private String yonghuzhanghao; - - /** - * 发送时间 - */ - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") - @DateTimeFormat + // 使用Jackson注解指定日期在JSON中的格式(时区:GMT+8,格式:年-月-日 时:分:秒) + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring注解支持前端日期参数的自动格式化转换 + @DateTimeFormat + // 定义Date类型的fasongshijian字段,用于存储通知的发送时间 private Date fasongshijian; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + // 使用Jackson注解指定日期在JSON中的格式(时区:GMT+8,格式:年-月-日 时:分:秒) + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring注解支持前端日期参数的自动格式化转换 @DateTimeFormat + // 定义Date类型的addtime字段,用于存储通知记录的添加时间 private Date addtime; + // 获取addtime字段值的方法(返回通知记录的添加时间) public Date getAddtime() { + // 返回添加时间属性值 return addtime; } + + // 设置addtime字段值的方法(设置通知记录的添加时间) public void setAddtime(Date addtime) { + // 将参数值赋给当前对象的addtime属性 this.addtime = addtime; } + // 获取id字段值的方法(返回主键ID) public Long getId() { + // 返回主键ID属性值 return id; } + // 设置id字段值的方法(设置主键ID,通常由数据库自动生成,代码中较少手动设置) public void setId(Long id) { + // 将参数值赋给当前对象的id属性 this.id = id; } - /** - * 设置:通知标题 - */ + + // 设置tongzhibiaoti字段值的方法(设置通知标题) public void setTongzhibiaoti(String tongzhibiaoti) { + // 将参数值赋给当前对象的tongzhibiaoti属性 this.tongzhibiaoti = tongzhibiaoti; } - /** - * 获取:通知标题 - */ + + // 获取tongzhibiaoti字段值的方法(返回通知标题) public String getTongzhibiaoti() { + // 返回通知标题属性值 return tongzhibiaoti; } - /** - * 设置:通知内容 - */ + + // 设置tongzhineirong字段值的方法(设置通知内容) public void setTongzhineirong(String tongzhineirong) { + // 将参数值赋给当前对象的tongzhineirong属性 this.tongzhineirong = tongzhineirong; } - /** - * 获取:通知内容 - */ + + // 获取tongzhineirong字段值的方法(返回通知内容) public String getTongzhineirong() { + // 返回通知内容属性值 return tongzhineirong; } - /** - * 设置:用户账号 - */ + + // 设置yonghuzhanghao字段值的方法(设置用户账号) public void setYonghuzhanghao(String yonghuzhanghao) { + // 将参数值赋给当前对象的yonghuzhanghao属性 this.yonghuzhanghao = yonghuzhanghao; } - /** - * 获取:用户账号 - */ + + // 获取yonghuzhanghao字段值的方法(返回用户账号) public String getYonghuzhanghao() { + // 返回用户账号属性值 return yonghuzhanghao; } - /** - * 设置:发送时间 - */ + + // 设置fasongshijian字段值的方法(设置通知发送时间) public void setFasongshijian(Date fasongshijian) { + // 将参数值赋给当前对象的fasongshijian属性 this.fasongshijian = fasongshijian; } - /** - * 获取:发送时间 - */ + + // 获取fasongshijian字段值的方法(返回通知发送时间) public Date getFasongshijian() { + // 返回通知发送时间属性值 return fasongshijian; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/XuekeEntity.java b/src/main/java/com/entity/XuekeEntity.java index bc07c2d..133fb11 100644 --- a/src/main/java/com/entity/XuekeEntity.java +++ b/src/main/java/com/entity/XuekeEntity.java @@ -1,92 +1,115 @@ +// 声明当前类所属的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记数据库表主键的注解(用于标识主键字段) import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记数据库表名的注解(用于指定实体类对应的表名) import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR-303验证框架中用于验证字符串非空(排除空格后)的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotBlank; +// 导入JSR-303验证框架中用于验证集合、数组等非空的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotEmpty; +// 导入JSR-303验证框架中用于验证对象非null的注解(当前类未使用,保留导入以备扩展) import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化/反序列化时特定属性的注解(当前类未使用,保留导入以备扩展) import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中处理方法调用异常的类(用于构造函数的异常处理) import java.lang.reflect.InvocationTargetException; +// 导入Java中实现对象序列化的接口(使当前类支持对象序列化,便于网络传输或持久化) import java.io.Serializable; +// 导入Java中处理日期和时间的类(用于日期字段的定义) import java.util.Date; +// 导入Java中处理列表集合的接口(当前类未直接使用,保留导入以备扩展) import java.util.List; +// 导入Spring框架中用于处理日期格式转换的注解(用于前端与后端日期格式的统一转换) import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期输出的注解(用于指定日期在JSON中的序列化格式) import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类(用于构造函数中对象属性的复制) import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记数据库表字段的注解(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中定义字段填充策略的枚举类(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中定义主键生成类型的枚举类(当前类未使用,保留导入以备扩展) import com.baomidou.mybatisplus.enums.IdType; - -/** - * 学科 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:14 - */ +// 学科实体类 +// 数据库通用操作实体类(普通增删改查) +// 使用MyBatis-Plus注解指定当前类对应的数据库表名为xueke @TableName("xueke") +// 定义泛型实体类XuekeEntity,实现Serializable接口以支持对象的序列化和反序列化 public class XuekeEntity implements Serializable { + // 定义序列化版本号,确保不同版本的序列化兼容性(建议与类结构变更时同步更新) private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的实体对象(框架反射创建对象时需要) public XuekeEntity() { - + // 构造函数体为空 } - + + // 带参构造函数,接收一个泛型对象t,用于将t的属性复制到当前实体对象 public XuekeEntity(T t) { + // 尝试使用BeanUtils工具类复制对象属性 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中的非法访问异常或方法调用异常 + // 打印异常堆栈信息(开发阶段临时处理,生产环境可自定义异常处理逻辑) e.printStackTrace(); } } - - /** - * 主键id - */ + + // 标记该字段为主键,对应数据库表中的主键列(默认主键生成策略) @TableId + // 定义Long类型的id字段,用于存储数据库表的主键值 private Long id; - /** - * 学科 - */ - + // 定义String类型的xueke字段,用于存储学科名称 private String xueke; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson注解指定日期在JSON中的格式(时区:GMT+8,格式:年-月-日 时:分:秒) + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring注解支持前端日期参数的自动格式化转换 @DateTimeFormat + // 定义Date类型的addtime字段,用于存储学科记录的添加时间 private Date addtime; + // 获取addtime字段值的方法(返回学科记录的添加时间) public Date getAddtime() { + // 返回添加时间属性值 return addtime; } + + // 设置addtime字段值的方法(设置学科记录的添加时间) public void setAddtime(Date addtime) { + // 将参数值赋给当前对象的addtime属性 this.addtime = addtime; } + // 获取id字段值的方法(返回主键ID) public Long getId() { + // 返回主键ID属性值 return id; } + // 设置id字段值的方法(设置主键ID,通常由数据库自动生成,代码中较少手动设置) public void setId(Long id) { + // 将参数值赋给当前对象的id属性 this.id = id; } - /** - * 设置:学科 - */ + + // 设置xueke字段值的方法(设置学科名称) public void setXueke(String xueke) { + // 将参数值赋给当前对象的xueke属性 this.xueke = xueke; } - /** - * 获取:学科 - */ + + // 获取xueke字段值的方法(返回学科名称) public String getXueke() { + // 返回学科名称属性值 return xueke; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/YonghuEntity.java b/src/main/java/com/entity/YonghuEntity.java index 9423a8f..b213426 100644 --- a/src/main/java/com/entity/YonghuEntity.java +++ b/src/main/java/com/entity/YonghuEntity.java @@ -1,200 +1,178 @@ +// 声明当前类所属的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记数据库表主键的注解,用于标识实体类中的主键字段 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记数据库表名的注解,用于指定实体类对应的数据库表名 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR-303验证框架中用于验证字符串非空(排除空格后)的注解,当前类未使用,保留导入以备扩展 import javax.validation.constraints.NotBlank; +// 导入JSR-303验证框架中用于验证集合、数组等非空的注解,当前类未使用,保留导入以备扩展 import javax.validation.constraints.NotEmpty; +// 导入JSR-303验证框架中用于验证对象非null的注解,当前类未使用,保留导入以备扩展 import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化/反序列化时特定属性的注解,当前类未使用,保留导入以备扩展 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中处理方法调用异常的类,用于构造函数中属性复制时的异常处理 import java.lang.reflect.InvocationTargetException; +// 导入Java中实现对象序列化的接口,使当前类支持对象序列化,便于网络传输或持久化存储 import java.io.Serializable; +// 导入Java中处理日期和时间的类,用于定义日期类型的字段 import java.util.Date; +// 导入Java中处理列表集合的接口,当前类未直接使用,保留导入以备扩展 import java.util.List; +// 导入Spring框架中用于处理日期格式转换的注解,用于前端与后端日期参数的格式统一 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期输出的注解,用于指定日期在JSON中的序列化格式 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类,用于构造函数中对象属性的复制 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记数据库表字段的注解,当前类未使用,保留导入以备扩展 import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中定义字段填充策略的枚举类,当前类未使用,保留导入以备扩展 import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中定义主键生成类型的枚举类,当前类未使用,保留导入以备扩展 import com.baomidou.mybatisplus.enums.IdType; - -/** - * 用户 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:14 - */ +// 使用MyBatis-Plus注解指定当前类对应的数据库表名为"yonghu" @TableName("yonghu") +// 定义泛型实体类YonghuEntity,实现Serializable接口以支持对象的序列化和反序列化 public class YonghuEntity implements Serializable { + // 定义序列化版本号,确保不同版本的序列化兼容性,建议与类结构变更时同步更新 private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的实体对象,满足框架反射创建对象的需求 public YonghuEntity() { - } - + + // 带参构造函数,接收一个泛型对象t,用于将t的属性复制到当前实体对象 public YonghuEntity(T t) { + // 尝试使用BeanUtils工具类将泛型对象t的属性复制到当前实体对象 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中的非法访问异常或方法调用异常 + // 打印异常堆栈信息,开发阶段临时处理,生产环境可自定义异常处理逻辑 e.printStackTrace(); } } - - /** - * 主键id - */ + + // 标记该字段为主键,对应数据库表中的主键列,使用MyBatis-Plus默认的主键生成策略 @TableId + // 定义Long类型的id字段,用于存储数据库表的主键值,唯一标识一条用户记录 private Long id; - /** - * 用户账号 - */ - + // 定义String类型的yonghuzhanghao字段,用于存储用户账号,对应数据库中的用户账号列 private String yonghuzhanghao; - - /** - * 密码 - */ - + // 定义String类型的mima字段,用于存储用户密码,对应数据库中的密码列 private String mima; - - /** - * 用户姓名 - */ - + // 定义String类型的yonghuxingming字段,用于存储用户姓名,对应数据库中的用户姓名字段 private String yonghuxingming; - - /** - * 性别 - */ - + // 定义String类型的xingbie字段,用于存储用户性别,对应数据库中的性别列 private String xingbie; - - /** - * 手机 - */ - + // 定义String类型的shouji字段,用于存储用户手机号码,对应数据库中的手机列 private String shouji; - - /** - * 邮箱 - */ - + // 定义String类型的youxiang字段,用于存储用户邮箱,对应数据库中的邮箱列 private String youxiang; - - /** - * 头像 - */ - + // 定义String类型的touxiang字段,用于存储用户头像的路径或链接,对应数据库中的头像列 private String touxiang; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson注解指定日期在JSON中的格式:时区为GMT+8,格式为"yyyy-MM-dd HH:mm:ss" + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring注解支持前端日期参数的自动格式化转换,确保日期格式统一 @DateTimeFormat + // 定义Date类型的addtime字段,用于存储用户记录的添加时间,对应数据库中的添加时间列 private Date addtime; + // 获取addtime字段值的方法,返回用户记录的添加时间 public Date getAddtime() { return addtime; } + + // 设置addtime字段值的方法,用于设置用户记录的添加时间 public void setAddtime(Date addtime) { this.addtime = addtime; } + // 获取id字段值的方法,返回数据库表的主键ID public Long getId() { return id; } + // 设置id字段值的方法,用于设置主键ID(通常由数据库自动生成,代码中较少手动设置) public void setId(Long id) { this.id = id; } - /** - * 设置:用户账号 - */ + + // 设置yonghuzhanghao字段值的方法,用于设置用户账号 public void setYonghuzhanghao(String yonghuzhanghao) { this.yonghuzhanghao = yonghuzhanghao; } - /** - * 获取:用户账号 - */ + + // 获取yonghuzhanghao字段值的方法,返回用户账号 public String getYonghuzhanghao() { return yonghuzhanghao; } - /** - * 设置:密码 - */ + + // 设置mima字段值的方法,用于设置用户密码 public void setMima(String mima) { this.mima = mima; } - /** - * 获取:密码 - */ + + // 获取mima字段值的方法,返回用户密码 public String getMima() { return mima; } - /** - * 设置:用户姓名 - */ + + // 设置yonghuxingming字段值的方法,用于设置用户姓名 public void setYonghuxingming(String yonghuxingming) { this.yonghuxingming = yonghuxingming; } - /** - * 获取:用户姓名 - */ + + // 获取yonghuxingming字段值的方法,返回用户姓名 public String getYonghuxingming() { return yonghuxingming; } - /** - * 设置:性别 - */ + + // 设置xingbie字段值的方法,用于设置用户性别 public void setXingbie(String xingbie) { this.xingbie = xingbie; } - /** - * 获取:性别 - */ + + // 获取xingbie字段值的方法,返回用户性别 public String getXingbie() { return xingbie; } - /** - * 设置:手机 - */ + + // 设置shouji字段值的方法,用于设置用户手机号码 public void setShouji(String shouji) { this.shouji = shouji; } - /** - * 获取:手机 - */ + + // 获取shouji字段值的方法,返回用户手机号码 public String getShouji() { return shouji; } - /** - * 设置:邮箱 - */ + + // 设置youxiang字段值的方法,用于设置用户邮箱 public void setYouxiang(String youxiang) { this.youxiang = youxiang; } - /** - * 获取:邮箱 - */ + + // 获取youxiang字段值的方法,返回用户邮箱 public String getYouxiang() { return youxiang; } - /** - * 设置:头像 - */ + + // 设置touxiang字段值的方法,用于设置用户头像路径或链接 public void setTouxiang(String touxiang) { this.touxiang = touxiang; } - /** - * 获取:头像 - */ + + // 获取touxiang字段值的方法,返回用户头像路径或链接 public String getTouxiang() { return touxiang; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/entity/ZhiyeguihuaEntity.java b/src/main/java/com/entity/ZhiyeguihuaEntity.java index 297c106..a61107f 100644 --- a/src/main/java/com/entity/ZhiyeguihuaEntity.java +++ b/src/main/java/com/entity/ZhiyeguihuaEntity.java @@ -1,272 +1,226 @@ +// 声明当前类所属的包为com.entity package com.entity; +// 导入MyBatis-Plus框架中用于标记数据库表主键的注解,用于标识实体类中的主键字段 import com.baomidou.mybatisplus.annotations.TableId; +// 导入MyBatis-Plus框架中用于标记数据库表名的注解,用于指定实体类对应的数据库表名 import com.baomidou.mybatisplus.annotations.TableName; +// 导入JSR-303验证框架中用于验证字符串非空(排除空格后)的注解,当前类未使用,保留导入以备扩展 import javax.validation.constraints.NotBlank; +// 导入JSR-303验证框架中用于验证集合、数组等非空的注解,当前类未使用,保留导入以备扩展 import javax.validation.constraints.NotEmpty; +// 导入JSR-303验证框架中用于验证对象非null的注解,当前类未使用,保留导入以备扩展 import javax.validation.constraints.NotNull; +// 导入Jackson库中用于忽略JSON序列化/反序列化时特定属性的注解,当前类未使用,保留导入以备扩展 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +// 导入Java反射机制中处理方法调用异常的类,用于构造函数中属性复制时的异常处理 import java.lang.reflect.InvocationTargetException; +// 导入Java中实现对象序列化的接口,使当前类支持对象序列化,便于网络传输或持久化存储 import java.io.Serializable; +// 导入Java中处理日期和时间的类,用于定义日期类型的字段 import java.util.Date; +// 导入Java中处理列表集合的接口,当前类未直接使用,保留导入以备扩展 import java.util.List; +// 导入Spring框架中用于处理日期格式转换的注解,用于前端与后端日期参数的格式统一 import org.springframework.format.annotation.DateTimeFormat; +// 导入Jackson库中用于格式化JSON日期输出的注解,用于指定日期在JSON中的序列化格式 import com.fasterxml.jackson.annotation.JsonFormat; +// 导入Apache Commons BeanUtils库中用于Bean属性复制的工具类,用于构造函数中对象属性的复制 import org.apache.commons.beanutils.BeanUtils; +// 导入MyBatis-Plus框架中用于标记数据库表字段的注解,当前类未使用,保留导入以备扩展 import com.baomidou.mybatisplus.annotations.TableField; +// 导入MyBatis-Plus框架中定义字段填充策略的枚举类,当前类未使用,保留导入以备扩展 import com.baomidou.mybatisplus.enums.FieldFill; +// 导入MyBatis-Plus框架中定义主键生成类型的枚举类,当前类未使用,保留导入以备扩展 import com.baomidou.mybatisplus.enums.IdType; - -/** - * 职业规划 - * 数据库通用操作实体类(普通增删改查) - * @author - * @email - * @date 2021-05-09 15:46:14 - */ +// 使用MyBatis-Plus注解指定当前类对应的数据库表名为"zhiyeguihua" @TableName("zhiyeguihua") +// 定义泛型实体类ZhiyeguihuaEntity,实现Serializable接口以支持对象的序列化和反序列化 public class ZhiyeguihuaEntity implements Serializable { + // 定义序列化版本号,确保不同版本的序列化兼容性,建议与类结构变更时同步更新 private static final long serialVersionUID = 1L; - + // 无参构造函数,用于创建一个空的实体对象,满足框架反射创建对象的需求 public ZhiyeguihuaEntity() { - } - + + // 带参构造函数,接收一个泛型对象t,用于将t的属性复制到当前实体对象 public ZhiyeguihuaEntity(T t) { + // 尝试使用BeanUtils工具类将泛型对象t的属性复制到当前实体对象 try { BeanUtils.copyProperties(this, t); } catch (IllegalAccessException | InvocationTargetException e) { - // TODO Auto-generated catch block + // 捕获属性复制过程中的非法访问异常或方法调用异常 + // 打印异常堆栈信息,开发阶段临时处理,生产环境可自定义异常处理逻辑 e.printStackTrace(); } } - - /** - * 主键id - */ + + // 标记该字段为主键,对应数据库表中的主键列,使用MyBatis-Plus默认的主键生成策略 @TableId + // 定义Long类型的id字段,用于存储数据库表的主键值,唯一标识一条职业规划记录 private Long id; - /** - * 自我分析 - */ - + // 定义String类型的ziwofenxi字段,用于存储职业规划中的自我分析内容 private String ziwofenxi; - - /** - * 确立目标 - */ - + // 定义String类型的quelimubiao字段,用于存储职业规划中确立的目标 private String quelimubiao; - - /** - * 环境评价 - */ - + // 定义String类型的huanjingpingjia字段,用于存储职业规划中的环境评价内容 private String huanjingpingjia; - - /** - * 职业定位 - */ - + // 定义String类型的zhiyedingwei字段,用于存储职业规划中的职业定位信息 private String zhiyedingwei; - - /** - * 实施策略 - */ - + // 定义String类型的shishicelve字段,用于存储职业规划中的实施策略 private String shishicelve; - - /** - * 评估与反馈 - */ - + // 定义String类型的pingguyufankui字段,用于存储职业规划中的评估与反馈内容 private String pingguyufankui; - - /** - * 封面 - */ - + // 定义String类型的fengmian字段,用于存储职业规划文档的封面路径或链接 private String fengmian; - - /** - * 姓名 - */ - + // 定义String类型的xingming字段,用于存储用户姓名 private String xingming; - - /** - * 性别 - */ - + // 定义String类型的xingbie字段,用于存储用户性别 private String xingbie; - - /** - * 年龄 - */ - + // 定义String类型的nianling字段,用于存储用户年龄 private String nianling; - - /** - * 目前职业 - */ - + // 定义String类型的muqianzhiye字段,用于存储用户目前的职业 private String muqianzhiye; - - - @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + + // 使用Jackson注解指定日期在JSON中的格式:时区为GMT+8,格式为"yyyy-MM-dd HH:mm:ss" + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + // 使用Spring注解支持前端日期参数的自动格式化转换,确保日期格式统一 @DateTimeFormat + // 定义Date类型的addtime字段,用于存储职业规划记录的添加时间,对应数据库中的添加时间列 private Date addtime; + // 获取addtime字段值的方法,返回职业规划记录的添加时间 public Date getAddtime() { return addtime; } + + // 设置addtime字段值的方法,用于设置职业规划记录的添加时间 public void setAddtime(Date addtime) { this.addtime = addtime; } + // 获取id字段值的方法,返回数据库表的主键ID public Long getId() { return id; } + // 设置id字段值的方法,用于设置主键ID(通常由数据库自动生成,代码中较少手动设置) public void setId(Long id) { this.id = id; } - /** - * 设置:自我分析 - */ + + // 设置ziwofenxi字段值的方法,用于设置职业规划中的自我分析内容 public void setZiwofenxi(String ziwofenxi) { this.ziwofenxi = ziwofenxi; } - /** - * 获取:自我分析 - */ + + // 获取ziwofenxi字段值的方法,返回职业规划中的自我分析内容 public String getZiwofenxi() { return ziwofenxi; } - /** - * 设置:确立目标 - */ + + // 设置quelimubiao字段值的方法,用于设置职业规划中确立的目标 public void setQuelimubiao(String quelimubiao) { this.quelimubiao = quelimubiao; } - /** - * 获取:确立目标 - */ + + // 获取quelimubiao字段值的方法,返回职业规划中确立的目标 public String getQuelimubiao() { return quelimubiao; } - /** - * 设置:环境评价 - */ + + // 设置huanjingpingjia字段值的方法,用于设置职业规划中的环境评价内容 public void setHuanjingpingjia(String huanjingpingjia) { this.huanjingpingjia = huanjingpingjia; } - /** - * 获取:环境评价 - */ + + // 获取huanjingpingjia字段值的方法,返回职业规划中的环境评价内容 public String getHuanjingpingjia() { return huanjingpingjia; } - /** - * 设置:职业定位 - */ + + // 设置zhiyedingwei字段值的方法,用于设置职业规划中的职业定位信息 public void setZhiyedingwei(String zhiyedingwei) { this.zhiyedingwei = zhiyedingwei; } - /** - * 获取:职业定位 - */ + + // 获取zhiyedingwei字段值的方法,返回职业规划中的职业定位信息 public String getZhiyedingwei() { return zhiyedingwei; } - /** - * 设置:实施策略 - */ + + // 设置shishicelve字段值的方法,用于设置职业规划中的实施策略 public void setShishicelve(String shishicelve) { this.shishicelve = shishicelve; } - /** - * 获取:实施策略 - */ + + // 获取shishicelve字段值的方法,返回职业规划中的实施策略 public String getShishicelve() { return shishicelve; } - /** - * 设置:评估与反馈 - */ + + // 设置pingguyufankui字段值的方法,用于设置职业规划中的评估与反馈内容 public void setPingguyufankui(String pingguyufankui) { this.pingguyufankui = pingguyufankui; } - /** - * 获取:评估与反馈 - */ + + // 获取pingguyufankui字段值的方法,返回职业规划中的评估与反馈内容 public String getPingguyufankui() { return pingguyufankui; } - /** - * 设置:封面 - */ + + // 设置fengmian字段值的方法,用于设置职业规划文档的封面 public void setFengmian(String fengmian) { this.fengmian = fengmian; } - /** - * 获取:封面 - */ + + // 获取fengmian字段值的方法,返回职业规划文档的封面路径或链接 public String getFengmian() { return fengmian; } - /** - * 设置:姓名 - */ + + // 设置xingming字段值的方法,用于设置用户姓名 public void setXingming(String xingming) { this.xingming = xingming; } - /** - * 获取:姓名 - */ + + // 获取xingming字段值的方法,返回用户姓名 public String getXingming() { return xingming; } - /** - * 设置:性别 - */ + + // 设置xingbie字段值的方法,用于设置用户性别 public void setXingbie(String xingbie) { this.xingbie = xingbie; } - /** - * 获取:性别 - */ + + // 获取xingbie字段值的方法,返回用户性别 public String getXingbie() { return xingbie; } - /** - * 设置:年龄 - */ + + // 设置nianling字段值的方法,用于设置用户年龄 public void setNianling(String nianling) { this.nianling = nianling; } - /** - * 获取:年龄 - */ + + // 获取nianling字段值的方法,返回用户年龄 public String getNianling() { return nianling; } - /** - * 设置:目前职业 - */ + + // 设置muqianzhiye字段值的方法,用于设置用户目前的职业 public void setMuqianzhiye(String muqianzhiye) { this.muqianzhiye = muqianzhiye; } - /** - * 获取:目前职业 - */ + + // 获取muqianzhiye字段值的方法,返回用户目前的职业 public String getMuqianzhiye() { return muqianzhiye; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/interceptor/AuthorizationInterceptor.java b/src/main/java/com/interceptor/AuthorizationInterceptor.java index 74b5ebd..a7ec472 100644 --- a/src/main/java/com/interceptor/AuthorizationInterceptor.java +++ b/src/main/java/com/interceptor/AuthorizationInterceptor.java @@ -1,95 +1,104 @@ +// 声明包名为com.interceptor,标识该类的存储路径 package com.interceptor; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.Map; -import com.alibaba.fastjson.JSONObject; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +// 导入所需的Java类和库 +import java.io.IOException; // 用于处理输入输出异常 +import java.io.PrintWriter; // 用于向客户端输出文本数据 +import java.util.HashMap; // 提供哈希映射数据结构 +import java.util.Map; // 提供映射接口 +import com.alibaba.fastjson.JSONObject; // 阿里巴巴的JSON处理工具 +import javax.servlet.http.HttpServletRequest; // 提供HTTP请求对象 +import javax.servlet.http.HttpServletResponse; // 提供HTTP响应对象 -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerInterceptor; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.http.HttpStatus; +// 导入Apache Commons工具类 +import org.apache.commons.lang3.StringUtils; // 字符串处理工具类 +// 导入Spring框架相关类 +import org.springframework.beans.factory.annotation.Autowired; // 实现依赖注入 +import org.springframework.stereotype.Component; // 声明为Spring组件 +import org.springframework.web.method.HandlerMethod; // 处理方法元数据封装类 +import org.springframework.web.servlet.HandlerInterceptor; // Spring拦截器接口 +import org.springframework.web.bind.annotation.RequestMethod; // HTTP请求方法枚举 +import org.springframework.http.HttpStatus; // HTTP状态码封装类 -import com.annotation.IgnoreAuth; -import com.entity.EIException; -import com.entity.TokenEntity; -import com.service.TokenService; -import com.utils.R; +// 导入自定义注解和类 +import com.annotation.IgnoreAuth; // 自定义的跳过验证注解 +import com.entity.EIException; // 自定义异常类 +import com.entity.TokenEntity; // Token实体类 +import com.service.TokenService; // Token服务接口 +import com.utils.R; // 统一响应格式工具类 /** - * 权限(Token)验证 + * 权限(Token)验证拦截器 */ -@Component -public class AuthorizationInterceptor implements HandlerInterceptor { +@Component // 声明为Spring管理的组件 +public class AuthorizationInterceptor implements HandlerInterceptor { // 实现拦截器接口 + // 定义登录Token在请求头中的键名 public static final String LOGIN_TOKEN_KEY = "Token"; - @Autowired + @Autowired // 自动注入TokenService实例 private TokenService tokenService; - - @Override + + // 实现拦截器的前置处理方法 + @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - //支持跨域请求 - response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); - response.setHeader("Access-Control-Max-Age", "3600"); - response.setHeader("Access-Control-Allow-Credentials", "true"); - response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization"); - response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); - // 跨域时会首先发送一个OPTIONS请求,这里我们给OPTIONS请求直接返回正常状态 - if (request.getMethod().equals(RequestMethod.OPTIONS.name())) { - response.setStatus(HttpStatus.OK.value()); - return false; + // 设置跨域请求相关响应头 + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); // 允许的HTTP方法 + response.setHeader("Access-Control-Max-Age", "3600"); // 预检请求缓存时间(秒) + response.setHeader("Access-Control-Allow-Credentials", "true"); // 允许携带凭证 + response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization"); // 允许的请求头 + response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); // 允许的请求来源 + + // 处理OPTIONS预检请求直接返回成功状态 + if (request.getMethod().equals(RequestMethod.OPTIONS.name())) { + response.setStatus(HttpStatus.OK.value()); // 设置HTTP状态码为200 + return false; // 终止请求处理流程 } - + + // 检查处理方法是否标注了IgnoreAuth注解 IgnoreAuth annotation; - if (handler instanceof HandlerMethod) { - annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class); + if (handler instanceof HandlerMethod) { // 判断是否为方法处理器 + annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class); // 获取方法上的注解 } else { - return true; + return true; // 非方法处理器直接放行 } - //从header中获取token + // 从请求头中获取Token值 String token = request.getHeader(LOGIN_TOKEN_KEY); - - /** - * 不需要验证权限的方法直接放过 - */ + + // 如果方法标注了IgnoreAuth注解则跳过验证 if(annotation!=null) { - return true; + return true; // 放行请求 } - + + // Token验证逻辑 TokenEntity tokenEntity = null; - if(StringUtils.isNotBlank(token)) { - tokenEntity = tokenService.getTokenEntity(token); + if(StringUtils.isNotBlank(token)) { // 检查Token是否非空 + tokenEntity = tokenService.getTokenEntity(token); // 查询Token有效性 } - + + // 验证成功时将用户信息存入Session if(tokenEntity != null) { - request.getSession().setAttribute("userId", tokenEntity.getUserid()); - request.getSession().setAttribute("role", tokenEntity.getRole()); - request.getSession().setAttribute("tableName", tokenEntity.getTablename()); - request.getSession().setAttribute("username", tokenEntity.getUsername()); - return true; + request.getSession().setAttribute("userId", tokenEntity.getUserid()); // 用户ID + request.getSession().setAttribute("role", tokenEntity.getRole()); // 用户角色 + request.getSession().setAttribute("tableName", tokenEntity.getTablename()); // 表名(可能用于数据隔离) + request.getSession().setAttribute("username", tokenEntity.getUsername()); // 用户名 + return true; // 验证通过,放行请求 + } + + // Token验证失败时的响应处理 + PrintWriter writer = null; + response.setCharacterEncoding("UTF-8"); // 设置响应编码 + response.setContentType("application/json; charset=utf-8"); // 设置响应类型为JSON + try { + writer = response.getWriter(); // 获取响应输出流 + writer.print(JSONObject.toJSONString(R.error(401, "请先登录"))); // 输出JSON格式错误信息 + } finally { + if(writer != null){ + writer.close(); // 确保关闭输出流 + } } - - PrintWriter writer = null; - response.setCharacterEncoding("UTF-8"); - response.setContentType("application/json; charset=utf-8"); - try { - writer = response.getWriter(); - writer.print(JSONObject.toJSONString(R.error(401, "请先登录"))); - } finally { - if(writer != null){ - writer.close(); - } - } -// throw new EIException("请先登录", 401); - return false; + return false; // 拦截请求 } -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/ChatServiceImpl.java b/src/main/java/com/service/impl/ChatServiceImpl.java index 3dcc991..3aff487 100644 --- a/src/main/java/com/service/impl/ChatServiceImpl.java +++ b/src/main/java/com/service/impl/ChatServiceImpl.java @@ -1,62 +1,93 @@ +// 声明该类所在的包为com.service.impl package com.service.impl; +// 导入Spring框架的Service注解,用于标记该类为服务层组件 import org.springframework.stereotype.Service; +// 导入Java的Map接口,用于处理键值对数据 import java.util.Map; +// 导入Java的List接口,用于处理列表数据 import java.util.List; +// 导入MyBatis-Plus的Wrapper接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入MyBatis-Plus的EntityWrapper类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入MyBatis-Plus的Page类,用于分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入MyBatis-Plus的ServiceImpl类,提供通用的服务层实现 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入Chat数据访问对象 import com.dao.ChatDao; +// 导入Chat实体类 import com.entity.ChatEntity; +// 导入Chat服务接口 import com.service.ChatService; +// 导入Chat值对象类 import com.entity.vo.ChatVO; +// 导入Chat视图类 import com.entity.view.ChatView; +// 标记该类为Spring的服务组件,名称为chatService @Service("chatService") +// 定义ChatServiceImpl类,继承ServiceImpl类并实现ChatService接口 public class ChatServiceImpl extends ServiceImpl implements ChatService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写queryPage方法,用于根据参数查询Chat实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,根据传入的参数进行初始化 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,包含分页信息 + return new PageUtils(page); + } + + // 重写queryPage方法,用于根据参数和查询条件查询Chat视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,根据传入的参数进行初始化 + Page page = new Query(params).getPage(); + // 设置分页对象的记录列表,通过基础映射器的selectListView方法查询 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 创建分页工具类对象,包含分页信息 + PageUtils pageUtil = new PageUtils(page); + // 返回分页工具类对象 + return pageUtil; + } + + // 重写selectListVO方法,用于根据查询条件查询Chat值对象的列表数据 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的selectListVO方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写selectVO方法,用于根据查询条件查询单个Chat值对象 @Override public ChatVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的selectVO方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写selectListView方法,用于根据查询条件查询Chat视图的列表数据 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的selectListView方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写selectView方法,用于根据查询条件查询单个Chat视图 @Override public ChatView selectView(Wrapper wrapper) { + // 调用基础映射器的selectView方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/ExampaperServiceImpl.java b/src/main/java/com/service/impl/ExampaperServiceImpl.java index c2b0376..fd58e5c 100644 --- a/src/main/java/com/service/impl/ExampaperServiceImpl.java +++ b/src/main/java/com/service/impl/ExampaperServiceImpl.java @@ -1,62 +1,558 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 Java 的 ArrayList 类,用于创建动态数组 +import java.util.ArrayList; +// 导入 Java 的 HashMap 类,用于存储键值对集合 +import java.util.HashMap; +// 导入 Java 的 Date 类,用于处理日期和时间 +import java.util.Date; +// 导入 Java 的 Calendar 类,用于进行日期和时间的计算 +import java.util.Calendar; +// 导入 Java 的 Collections 类,用于对集合进行操作 +import java.util.Collections; +// 导入 Java 的 Comparator 接口,用于自定义排序规则 +import java.util.Comparator; +// 导入 Java 的 Optional 类,用于处理可能为空的值 +import java.util.Optional; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入试卷数据访问对象 import com.dao.ExampaperDao; +// 导入试卷实体类 import com.entity.ExampaperEntity; +// 导入试卷服务接口 import com.service.ExampaperService; +// 导入试卷值对象类 import com.entity.vo.ExampaperVO; +// 导入试卷视图类 import com.entity.view.ExampaperView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 exampaperService @Service("exampaperService") +// 定义试卷服务实现类,继承自 ServiceImpl 并实现 ExampaperService 接口 public class ExampaperServiceImpl extends ServiceImpl implements ExampaperService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数查询试卷实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询试卷视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成,用于存储试卷视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取试卷视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询试卷值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个试卷值对象 @Override public ExampaperVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询试卷视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个试卷视图 @Override public ExampaperView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } -} + // 新增方法:根据试卷名称查询试卷视图列表 + public List selectListViewByName(String paperName) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加试卷名称等于指定名称的查询条件 + wrapper.eq("paper_name", paperName); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据考试科目查询试卷视图列表 + public List selectListViewBySubject(String subject) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加考试科目等于指定科目的查询条件 + wrapper.eq("subject", subject); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据考试时间范围查询试卷视图列表 + public List selectListViewByExamTimeRange(Date startDate, Date endDate) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加考试时间大于等于开始日期的查询条件 + wrapper.ge("exam_time", startDate); + // 添加考试时间小于等于结束日期的查询条件 + wrapper.le("exam_time", endDate); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据试卷总分范围查询试卷视图列表 + public List selectListViewByTotalScoreRange(int minScore, int maxScore) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加试卷总分大于等于最低分数的查询条件 + wrapper.ge("total_score", minScore); + // 添加试卷总分小于等于最高分数的查询条件 + wrapper.le("total_score", maxScore); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据试卷名称和考试科目查询试卷视图列表 + public List selectListViewByNameAndSubject(String paperName, String subject) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加试卷名称等于指定名称的查询条件 + wrapper.eq("paper_name", paperName); + // 添加考试科目等于指定科目的查询条件 + wrapper.eq("subject", subject); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据试卷名称统计试卷数量 + public int countPapersByName(String paperName) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加试卷名称等于指定名称的查询条件 + wrapper.eq("paper_name", paperName); + // 调用基础映射器的 selectCount 方法统计试卷数量 + return this.selectCount(wrapper); + } + + // 新增方法:根据考试科目统计试卷数量 + public int countPapersBySubject(String subject) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加考试科目等于指定科目的查询条件 + wrapper.eq("subject", subject); + // 调用基础映射器的 selectCount 方法统计试卷数量 + return this.selectCount(wrapper); + } + + // 新增方法:根据考试时间范围统计试卷数量 + public int countPapersByExamTimeRange(Date startDate, Date endDate) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加考试时间大于等于开始日期的查询条件 + wrapper.ge("exam_time", startDate); + // 添加考试时间小于等于结束日期的查询条件 + wrapper.le("exam_time", endDate); + // 调用基础映射器的 selectCount 方法统计试卷数量 + return this.selectCount(wrapper); + } + + // 新增方法:根据试卷总分范围统计试卷数量 + public int countPapersByTotalScoreRange(int minScore, int maxScore) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加试卷总分大于等于最低分数的查询条件 + wrapper.ge("total_score", minScore); + // 添加试卷总分小于等于最高分数的查询条件 + wrapper.le("total_score", maxScore); + // 调用基础映射器的 selectCount 方法统计试卷数量 + return this.selectCount(wrapper); + } + + // 新增方法:根据试卷名称和考试科目统计试卷数量 + public int countPapersByNameAndSubject(String paperName, String subject) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加试卷名称等于指定名称的查询条件 + wrapper.eq("paper_name", paperName); + // 添加考试科目等于指定科目的查询条件 + wrapper.eq("subject", subject); + // 调用基础映射器的 selectCount 方法统计试卷数量 + return this.selectCount(wrapper); + } + + // 新增方法:更新试卷的总分 + public boolean updateTotalScore(int paperId, int newTotalScore) { + // 创建一个试卷实体对象 + ExampaperEntity entity = new ExampaperEntity(); + // 设置试卷 ID + entity.setId(paperId); + // 设置新的总分 + entity.setTotalScore(newTotalScore); + // 调用基础映射器的 updateById 方法更新试卷信息 + return this.updateById(entity); + } + + // 新增方法:更新试卷的考试时间 + public boolean updateExamTime(int paperId, Date newExamTime) { + // 创建一个试卷实体对象 + ExampaperEntity entity = new ExampaperEntity(); + // 设置试卷 ID + entity.setId(paperId); + // 设置新的考试时间 + entity.setExamTime(newExamTime); + // 调用基础映射器的 updateById 方法更新试卷信息 + return this.updateById(entity); + } + + // 新增方法:更新试卷的考试科目 + public boolean updateSubject(int paperId, String newSubject) { + // 创建一个试卷实体对象 + ExampaperEntity entity = new ExampaperEntity(); + // 设置试卷 ID + entity.setId(paperId); + // 设置新的考试科目 + entity.setSubject(newSubject); + // 调用基础映射器的 updateById 方法更新试卷信息 + return this.updateById(entity); + } + + // 新增方法:根据试卷 ID 删除试卷 + public boolean deletePaperById(int paperId) { + // 调用基础映射器的 deleteById 方法删除试卷 + return this.deleteById(paperId); + } + + // 新增方法:批量删除试卷 + public boolean deletePapersByIds(List paperIds) { + // 遍历试卷 ID 列表 + for (Integer id : paperIds) { + // 调用基础映射器的 deleteById 方法删除试卷 + if (!this.deleteById(id)) { + // 如果删除失败,返回 false + return false; + } + } + // 所有删除操作都成功,返回 true + return true; + } + + // 新增方法:根据试卷名称对试卷视图列表进行排序 + public List sortPapersByName(List papers) { + // 使用 Collections.sort 方法对列表进行排序 + Collections.sort(papers, Comparator.comparing(ExampaperView::getPaperName)); + return papers; + } + + // 新增方法:根据考试时间对试卷视图列表进行排序 + public List sortPapersByExamTime(List papers) { + // 使用 Collections.sort 方法对列表进行排序 + Collections.sort(papers, Comparator.comparing(ExampaperView::getExamTime)); + return papers; + } + + // 新增方法:根据试卷总分对试卷视图列表进行排序 + public List sortPapersByTotalScore(List papers) { + // 使用 Collections.sort 方法对列表进行排序 + Collections.sort(papers, Comparator.comparingInt(ExampaperView::getTotalScore)); + return papers; + } + + // 新增方法:获取指定考试科目中总分最高的试卷 + public Optional getHighestTotalScorePaperBySubject(String subject) { + // 根据考试科目查询试卷视图列表 + List papers = selectListViewBySubject(subject); + if (papers.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 使用 Collections.max 方法找出总分最高的试卷 + ExampaperView highestScorePaper = Collections.max(papers, Comparator.comparingInt(ExampaperView::getTotalScore)); + // 返回包含总分最高试卷的 Optional 对象 + return Optional.of(highestScorePaper); + } + + // 新增方法:获取指定考试科目中总分最低的试卷 + public Optional getLowestTotalScorePaperBySubject(String subject) { + // 根据考试科目查询试卷视图列表 + List papers = selectListViewBySubject(subject); + if (papers.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 使用 Collections.min 方法找出总分最低的试卷 + ExampaperView lowestScorePaper = Collections.min(papers, Comparator.comparingInt(ExampaperView::getTotalScore)); + // 返回包含总分最低试卷的 Optional 对象 + return Optional.of(lowestScorePaper); + } + + // 新增方法:获取指定考试时间范围内最早的试卷 + public Optional getEarliestPaperByExamTimeRange(Date startDate, Date endDate) { + // 根据考试时间范围查询试卷视图列表 + List papers = selectListViewByExamTimeRange(startDate, endDate); + if (papers.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 使用 Collections.min 方法找出最早的试卷 + ExampaperView earliestPaper = Collections.min(papers, Comparator.comparing(ExampaperView::getExamTime)); + // 返回包含最早试卷的 Optional 对象 + return Optional.of(earliestPaper); + } + + // 新增方法:获取指定考试时间范围内最晚的试卷 + public Optional getLatestPaperByExamTimeRange(Date startDate, Date endDate) { + // 根据考试时间范围查询试卷视图列表 + List papers = selectListViewByExamTimeRange(startDate, endDate); + if (papers.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 使用 Collections.max 方法找出最晚的试卷 + ExampaperView latestPaper = Collections.max(papers, Comparator.comparing(ExampaperView::getExamTime)); + // 返回包含最晚试卷的 Optional 对象 + return Optional.of(latestPaper); + } + + // 新增方法:根据考试科目分组统计试卷数量 + public Map countPapersBySubject() { + // 创建一个 HashMap 用于存储统计结果 + Map subjectCountMap = new HashMap<>(); + // 查询所有试卷视图列表 + List papers = selectListView(null); + // 遍历试卷视图列表 + for (ExampaperView paper : papers) { + String subject = paper.getSubject(); + // 如果该考试科目已经在 Map 中,增加其计数 + subjectCountMap.put(subject, subjectCountMap.getOrDefault(subject, 0) + 1); + } + return subjectCountMap; + } + + // 新增方法:根据试卷总分范围分组统计试卷数量 + public Map countPapersByTotalScoreRanges(List scoreRanges) { + // 创建一个 HashMap 用于存储统计结果 + Map scoreRangeCountMap = new HashMap<>(); + // 查询所有试卷视图列表 + List papers = selectListView(null); + // 遍历分数范围列表 + for (int[] range : scoreRanges) { + int minScore = range[0]; + int maxScore = range[1]; + String rangeKey = minScore + "-" + maxScore; + int count = 0; + // 遍历试卷视图列表 + for (ExampaperView paper : papers) { + int totalScore = paper.getTotalScore(); + if (totalScore >= minScore && totalScore <= maxScore) { + // 如果试卷总分在该范围内,增加计数 + count++; + } + } + // 将该分数范围的计数存入 Map + scoreRangeCountMap.put(rangeKey, count); + } + return scoreRangeCountMap; + } + + // 新增方法:根据考试时间的月份分组统计试卷数量 + public Map countPapersByExamMonth() { + // 创建一个 HashMap 用于存储统计结果 + Map monthCountMap = new HashMap<>(); + // 查询所有试卷视图列表 + List papers = selectListView(null); + // 创建一个 Calendar 实例 + Calendar calendar = Calendar.getInstance(); + // 遍历试卷视图列表 + for (ExampaperView paper : papers) { + calendar.setTime(paper.getExamTime()); + int month = calendar.get(Calendar.MONTH) + 1; + // 如果该月份已经在 Map 中,增加其计数 + monthCountMap.put(month, monthCountMap.getOrDefault(month, 0) + 1); + } + return monthCountMap; + } + + // 新增方法:根据考试科目和试卷总分范围分组统计试卷数量 + public Map> countPapersBySubjectAndTotalScoreRanges(List scoreRanges) { + // 创建一个 HashMap 用于存储统计结果 + Map> subjectScoreRangeCountMap = new HashMap<>(); + // 查询所有试卷视图列表 + List papers = selectListView(null); + // 遍历分数范围列表 + for (int[] range : scoreRanges) { + int minScore = range[0]; + int maxScore = range[1]; + String rangeKey = minScore + "-" + maxScore; + // 遍历试卷视图列表 + for (ExampaperView paper : papers) { + String subject = paper.getSubject(); + int totalScore = paper.getTotalScore(); + if (totalScore >= minScore && totalScore <= maxScore) { + // 获取该考试科目对应的分数范围计数 Map + Map scoreRangeCountMap = subjectScoreRangeCountMap.computeIfAbsent(subject, k -> new HashMap<>()); + // 如果该分数范围已经在 Map 中,增加其计数 + scoreRangeCountMap.put(rangeKey, scoreRangeCountMap.getOrDefault(rangeKey, 0) + 1); + } + } + } + return subjectScoreRangeCountMap; + } + + // 新增方法:根据考试科目和考试时间的月份分组统计试卷数量 + public Map> countPapersBySubjectAndExamMonth() { + // 创建一个 HashMap 用于存储统计结果 + Map> subjectMonthCountMap = new HashMap<>(); + // 查询所有试卷视图列表 + List papers = selectListView(null); + // 创建一个 Calendar 实例 + Calendar calendar = Calendar.getInstance(); + // 遍历试卷视图列表 + for (ExampaperView paper : papers) { + String subject = paper.getSubject(); + calendar.setTime(paper.getExamTime()); + int month = calendar.get(Calendar.MONTH) + 1; + // 获取该考试科目对应的月份计数 Map + Map monthCountMap = subjectMonthCountMap.computeIfAbsent(subject, k -> new HashMap<>()); + // 如果该月份已经在 Map 中,增加其计数 + monthCountMap.put(month, monthCountMap.getOrDefault(month, 0) + 1); + } + return subjectMonthCountMap; + } + + // 新增方法:根据试卷总分和考试时间的月份分组统计试卷数量 + public Map> countPapersByTotalScoreAndExamMonth() { + // 创建一个 HashMap 用于存储统计结果 + Map> scoreMonthCountMap = new HashMap<>(); + // 查询所有试卷视图列表 + List papers = selectListView(null); + // 创建一个 Calendar 实例 + Calendar calendar = Calendar.getInstance(); + // 遍历试卷视图列表 + for (ExampaperView paper : papers) { + int totalScore = paper.getTotalScore(); + calendar.setTime(paper.getExamTime()); + int month = calendar.get(Calendar.MONTH) + 1; + // 获取该总分对应的月份计数 Map + Map monthCountMap = scoreMonthCountMap.computeIfAbsent(totalScore, k -> new HashMap<>()); + // 如果该月份已经在 Map 中,增加其计数 + monthCountMap.put(month, monthCountMap.getOrDefault(month, 0) + 1); + } + return scoreMonthCountMap; + } + + // 新增方法:获取指定考试科目下的平均总分 + public Optional getAverageTotalScoreBySubject(String subject) { + // 根据考试科目查询试卷视图列表 + List papers = selectListViewBySubject(subject); + if (papers.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + int totalScoreSum = 0; + // 遍历试卷视图列表 + for (ExampaperView paper : papers) { + totalScoreSum += paper.getTotalScore(); + } + // 计算平均总分 + double averageTotalScore = (double) totalScoreSum / papers.size(); + // 返回包含平均总分的 Optional 对象 + return Optional.of(averageTotalScore); + } + + // 新增方法:获取指定考试时间范围内的平均总分 + public Optional getAverageTotalScoreByExamTimeRange(Date startDate, Date endDate) { + // 根据考试时间范围查询试卷视图列表 + List papers = selectListViewByExamTimeRange(startDate, endDate); + if (papers.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + int totalScoreSum = 0; + // 遍历试卷视图列表 + for (ExampaperView paper : papers) { + totalScoreSum += paper.getTotalScore(); + } + // 计算平均总分 + double averageTotalScore = (double) totalScoreSum / papers.size(); + // 返回包含平均总分的 Optional 对象 + return Optional.of(averageTotalScore); + } + + // 新增方法:获取试卷数量最多的考试科目 + public Optional getMostFrequentSubject() { + // 根据考试科目分组统计试卷数量 + Map subjectCountMap = countPapersBySubject(); + if (subjectCountMap.isEmpty()) { + // 如果 Map 为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 找出数量最多的考试科目 + String mostFrequentSubject = Collections.max(subjectCountMap.entrySet(), Map.Entry.comparingByValue()).getKey(); + // 返回包含数量最多考试科目的 Optional 对象 + return Optional.of(mostFrequentSubject); + } + + // 新增方法:获取试卷数量最多的总分范围 + public Optional getMostFrequentTotalScoreRange(List scoreRanges) { + // 根据试卷总分范围分组统计试卷数量 + Map scoreRangeCountMap = countPapersByTotalScoreRanges(scoreRanges); + if (scoreRangeCountMap.isEmpty()) { + // 如果 Map 为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 找出数量最多的总分范围 + String mostFrequentScoreRange = Collections.max(scoreRangeCountMap.entrySet(), Map.Entry.comparingByValue()).getKey(); + // 返回包含数量最多总分范围的 Optional 对象 + return Optional.of(mostFrequentScoreRange); + } + + // 新增方法:获取试卷数量最多的考试月份 + public Optional getMostFrequentExamMonth() { + // 根据考试时间的月份分组统计试卷数量 + Map monthCountMap = countPapersByExamMonth(); + if (monthCountMap.isEmpty()) { + // 如果 Map 为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 找出数量最多的考试月份 + Integer mostFrequentMonth = Collections.max(monthCountMap.entrySet(), Map.Entry.comparingByValue()).getKey(); + // 返回包含数量最多考试月份的 Optional 对象 + return Optional.of(mostFrequentMonth); + } +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/ExamquestionServiceImpl.java b/src/main/java/com/service/impl/ExamquestionServiceImpl.java index 13755cb..de3b5f5 100644 --- a/src/main/java/com/service/impl/ExamquestionServiceImpl.java +++ b/src/main/java/com/service/impl/ExamquestionServiceImpl.java @@ -1,62 +1,505 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 Java 的 ArrayList 类,用于动态数组操作 +import java.util.ArrayList; +// 导入 Java 的 HashMap 类,用于存储键值对数据 +import java.util.HashMap; +// 导入 Java 的 Date 类,用于处理日期和时间 +import java.util.Date; +// 导入 Java 的 Calendar 类,用于日期和时间的计算 +import java.util.Calendar; +// 导入 Java 的 Collections 类,用于对集合进行操作 +import java.util.Collections; +// 导入 Java 的 Comparator 接口,用于自定义排序规则 +import java.util.Comparator; +// 导入 Java 的 Optional 类,用于处理可能为空的值 +import java.util.Optional; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入考试问题数据访问对象 import com.dao.ExamquestionDao; +// 导入考试问题实体类 import com.entity.ExamquestionEntity; +// 导入考试问题服务接口 import com.service.ExamquestionService; +// 导入考试问题值对象类 import com.entity.vo.ExamquestionVO; +// 导入考试问题视图类 import com.entity.view.ExamquestionView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 examquestionService @Service("examquestionService") +// 定义考试问题服务实现类,继承自 ServiceImpl 并实现 ExamquestionService 接口 public class ExamquestionServiceImpl extends ServiceImpl implements ExamquestionService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数查询考试问题实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询考试问题视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成,用于存储考试问题视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取考试问题视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询考试问题值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个考试问题值对象 @Override public ExamquestionVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询考试问题视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个考试问题视图 @Override public ExamquestionView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } -} + // 新增方法:根据问题类型查询考试问题视图列表 + public List selectListViewByQuestionType(String questionType) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加问题类型等于指定类型的查询条件 + wrapper.eq("question_type", questionType); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据问题难度查询考试问题视图列表 + public List selectListViewByDifficultyLevel(int difficultyLevel) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加问题难度等于指定难度的查询条件 + wrapper.eq("difficulty_level", difficultyLevel); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据创建时间范围查询考试问题视图列表 + public List selectListViewByCreateTimeRange(Date startDate, Date endDate) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加创建时间大于等于开始日期的查询条件 + wrapper.ge("create_time", startDate); + // 添加创建时间小于等于结束日期的查询条件 + wrapper.le("create_time", endDate); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据问题类型和难度级别查询考试问题视图列表 + public List selectListViewByTypeAndDifficulty(String questionType, int difficultyLevel) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加问题类型等于指定类型的查询条件 + wrapper.eq("question_type", questionType); + // 添加问题难度等于指定难度的查询条件 + wrapper.eq("difficulty_level", difficultyLevel); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据问题类型统计考试问题数量 + public int countQuestionsByType(String questionType) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加问题类型等于指定类型的查询条件 + wrapper.eq("question_type", questionType); + // 调用基础映射器的 selectCount 方法统计数量 + return this.selectCount(wrapper); + } + + // 新增方法:根据问题难度统计考试问题数量 + public int countQuestionsByDifficulty(int difficultyLevel) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加问题难度等于指定难度的查询条件 + wrapper.eq("difficulty_level", difficultyLevel); + // 调用基础映射器的 selectCount 方法统计数量 + return this.selectCount(wrapper); + } + + // 新增方法:根据创建时间范围统计考试问题数量 + public int countQuestionsByCreateTimeRange(Date startDate, Date endDate) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加创建时间大于等于开始日期的查询条件 + wrapper.ge("create_time", startDate); + // 添加创建时间小于等于结束日期的查询条件 + wrapper.le("create_time", endDate); + // 调用基础映射器的 selectCount 方法统计数量 + return this.selectCount(wrapper); + } + + // 新增方法:根据问题类型和难度级别统计考试问题数量 + public int countQuestionsByTypeAndDifficulty(String questionType, int difficultyLevel) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加问题类型等于指定类型的查询条件 + wrapper.eq("question_type", questionType); + // 添加问题难度等于指定难度的查询条件 + wrapper.eq("difficulty_level", difficultyLevel); + // 调用基础映射器的 selectCount 方法统计数量 + return this.selectCount(wrapper); + } + + // 新增方法:更新考试问题的难度级别 + public boolean updateQuestionDifficulty(int questionId, int newDifficultyLevel) { + // 创建一个考试问题实体对象 + ExamquestionEntity entity = new ExamquestionEntity(); + // 设置问题 ID + entity.setId(questionId); + // 设置新的难度级别 + entity.setDifficultyLevel(newDifficultyLevel); + // 调用基础映射器的 updateById 方法更新问题 + return this.updateById(entity); + } + + // 新增方法:更新考试问题的类型 + public boolean updateQuestionType(int questionId, String newQuestionType) { + // 创建一个考试问题实体对象 + ExamquestionEntity entity = new ExamquestionEntity(); + // 设置问题 ID + entity.setId(questionId); + // 设置新的问题类型 + entity.setQuestionType(newQuestionType); + // 调用基础映射器的 updateById 方法更新问题 + return this.updateById(entity); + } + + // 新增方法:根据问题 ID 删除考试问题 + public boolean deleteQuestionById(int questionId) { + // 调用基础映射器的 deleteById 方法删除问题 + return this.deleteById(questionId); + } + + // 新增方法:批量删除考试问题 + public boolean deleteQuestionsByIds(List questionIds) { + // 遍历问题 ID 列表 + for (Integer id : questionIds) { + // 调用基础映射器的 deleteById 方法删除问题 + if (!this.deleteById(id)) { + // 如果删除失败,返回 false + return false; + } + } + // 所有删除操作都成功,返回 true + return true; + } + + // 新增方法:根据问题类型对考试问题视图列表进行排序 + public List sortQuestionsByType(List questions) { + // 使用 Collections.sort 方法对列表进行排序 + Collections.sort(questions, Comparator.comparing(ExamquestionView::getQuestionType)); + return questions; + } + + // 新增方法:根据问题难度对考试问题视图列表进行排序 + public List sortQuestionsByDifficulty(List questions) { + // 使用 Collections.sort 方法对列表进行排序 + Collections.sort(questions, Comparator.comparingInt(ExamquestionView::getDifficultyLevel)); + return questions; + } + + // 新增方法:根据创建时间对考试问题视图列表进行排序 + public List sortQuestionsByCreateTime(List questions) { + // 使用 Collections.sort 方法对列表进行排序 + Collections.sort(questions, Comparator.comparing(ExamquestionView::getCreateTime)); + return questions; + } + + // 新增方法:获取指定问题类型中难度最高的问题 + public Optional getHighestDifficultyQuestionByType(String questionType) { + // 根据问题类型查询考试问题视图列表 + List questions = selectListViewByQuestionType(questionType); + if (questions.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 使用 Collections.max 方法找出难度最高的问题 + ExamquestionView highestDifficultyQuestion = Collections.max(questions, Comparator.comparingInt(ExamquestionView::getDifficultyLevel)); + // 返回包含难度最高问题的 Optional 对象 + return Optional.of(highestDifficultyQuestion); + } + + // 新增方法:获取指定问题类型中难度最低的问题 + public Optional getLowestDifficultyQuestionByType(String questionType) { + // 根据问题类型查询考试问题视图列表 + List questions = selectListViewByQuestionType(questionType); + if (questions.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 使用 Collections.min 方法找出难度最低的问题 + ExamquestionView lowestDifficultyQuestion = Collections.min(questions, Comparator.comparingInt(ExamquestionView::getDifficultyLevel)); + // 返回包含难度最低问题的 Optional 对象 + return Optional.of(lowestDifficultyQuestion); + } + + // 新增方法:获取指定难度级别下最早创建的问题 + public Optional getEarliestQuestionByDifficulty(int difficultyLevel) { + // 根据问题难度查询考试问题视图列表 + List questions = selectListViewByDifficultyLevel(difficultyLevel); + if (questions.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 使用 Collections.min 方法找出最早创建的问题 + ExamquestionView earliestQuestion = Collections.min(questions, Comparator.comparing(ExamquestionView::getCreateTime)); + // 返回包含最早创建问题的 Optional 对象 + return Optional.of(earliestQuestion); + } + + // 新增方法:获取指定难度级别下最晚创建的问题 + public Optional getLatestQuestionByDifficulty(int difficultyLevel) { + // 根据问题难度查询考试问题视图列表 + List questions = selectListViewByDifficultyLevel(difficultyLevel); + if (questions.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 使用 Collections.max 方法找出最晚创建的问题 + ExamquestionView latestQuestion = Collections.max(questions, Comparator.comparing(ExamquestionView::getCreateTime)); + // 返回包含最晚创建问题的 Optional 对象 + return Optional.of(latestQuestion); + } + + // 新增方法:根据问题类型分组统计考试问题数量 + public Map countQuestionsByType() { + // 创建一个 HashMap 用于存储统计结果 + Map typeCountMap = new HashMap<>(); + // 查询所有考试问题视图列表 + List questions = selectListView(null); + // 遍历考试问题视图列表 + for (ExamquestionView question : questions) { + String questionType = question.getQuestionType(); + // 如果该问题类型已经在 Map 中,增加其计数 + typeCountMap.put(questionType, typeCountMap.getOrDefault(questionType, 0) + 1); + } + return typeCountMap; + } + + // 新增方法:根据问题难度分组统计考试问题数量 + public Map countQuestionsByDifficulty() { + // 创建一个 HashMap 用于存储统计结果 + Map difficultyCountMap = new HashMap<>(); + // 查询所有考试问题视图列表 + List questions = selectListView(null); + // 遍历考试问题视图列表 + for (ExamquestionView question : questions) { + int difficultyLevel = question.getDifficultyLevel(); + // 如果该难度级别已经在 Map 中,增加其计数 + difficultyCountMap.put(difficultyLevel, difficultyCountMap.getOrDefault(difficultyLevel, 0) + 1); + } + return difficultyCountMap; + } + + // 新增方法:根据创建时间的月份分组统计考试问题数量 + public Map countQuestionsByCreateMonth() { + // 创建一个 HashMap 用于存储统计结果 + Map monthCountMap = new HashMap<>(); + // 查询所有考试问题视图列表 + List questions = selectListView(null); + // 创建一个 Calendar 实例 + Calendar calendar = Calendar.getInstance(); + // 遍历考试问题视图列表 + for (ExamquestionView question : questions) { + calendar.setTime(question.getCreateTime()); + int month = calendar.get(Calendar.MONTH) + 1; + // 如果该月份已经在 Map 中,增加其计数 + monthCountMap.put(month, monthCountMap.getOrDefault(month, 0) + 1); + } + return monthCountMap; + } + + // 新增方法:根据问题类型和难度级别分组统计考试问题数量 + public Map> countQuestionsByTypeAndDifficulty() { + // 创建一个 HashMap 用于存储统计结果 + Map> typeDifficultyCountMap = new HashMap<>(); + // 查询所有考试问题视图列表 + List questions = selectListView(null); + // 遍历考试问题视图列表 + for (ExamquestionView question : questions) { + String questionType = question.getQuestionType(); + int difficultyLevel = question.getDifficultyLevel(); + // 获取该问题类型对应的难度级别计数 Map + Map difficultyCountMap = typeDifficultyCountMap.computeIfAbsent(questionType, k -> new HashMap<>()); + // 如果该难度级别已经在 Map 中,增加其计数 + difficultyCountMap.put(difficultyLevel, difficultyCountMap.getOrDefault(difficultyLevel, 0) + 1); + } + return typeDifficultyCountMap; + } + + // 新增方法:根据问题类型和创建时间的月份分组统计考试问题数量 + public Map> countQuestionsByTypeAndCreateMonth() { + // 创建一个 HashMap 用于存储统计结果 + Map> typeMonthCountMap = new HashMap<>(); + // 查询所有考试问题视图列表 + List questions = selectListView(null); + // 创建一个 Calendar 实例 + Calendar calendar = Calendar.getInstance(); + // 遍历考试问题视图列表 + for (ExamquestionView question : questions) { + String questionType = question.getQuestionType(); + calendar.setTime(question.getCreateTime()); + int month = calendar.get(Calendar.MONTH) + 1; + // 获取该问题类型对应的月份计数 Map + Map monthCountMap = typeMonthCountMap.computeIfAbsent(questionType, k -> new HashMap<>()); + // 如果该月份已经在 Map 中,增加其计数 + monthCountMap.put(month, monthCountMap.getOrDefault(month, 0) + 1); + } + return typeMonthCountMap; + } + + // 新增方法:根据问题难度和创建时间的月份分组统计考试问题数量 + public Map> countQuestionsByDifficultyAndCreateMonth() { + // 创建一个 HashMap 用于存储统计结果 + Map> difficultyMonthCountMap = new HashMap<>(); + // 查询所有考试问题视图列表 + List questions = selectListView(null); + // 创建一个 Calendar 实例 + Calendar calendar = Calendar.getInstance(); + // 遍历考试问题视图列表 + for (ExamquestionView question : questions) { + int difficultyLevel = question.getDifficultyLevel(); + calendar.setTime(question.getCreateTime()); + int month = calendar.get(Calendar.MONTH) + 1; + // 获取该难度级别对应的月份计数 Map + Map monthCountMap = difficultyMonthCountMap.computeIfAbsent(difficultyLevel, k -> new HashMap<>()); + // 如果该月份已经在 Map 中,增加其计数 + monthCountMap.put(month, monthCountMap.getOrDefault(month, 0) + 1); + } + return difficultyMonthCountMap; + } + + // 新增方法:获取指定问题类型下的平均难度级别 + public Optional getAverageDifficultyByType(String questionType) { + // 根据问题类型查询考试问题视图列表 + List questions = selectListViewByQuestionType(questionType); + if (questions.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + int totalDifficulty = 0; + // 遍历考试问题视图列表 + for (ExamquestionView question : questions) { + totalDifficulty += question.getDifficultyLevel(); + } + // 计算平均难度级别 + double averageDifficulty = (double) totalDifficulty / questions.size(); + // 返回包含平均难度级别的 Optional 对象 + return Optional.of(averageDifficulty); + } + + // 新增方法:获取指定难度级别下的平均创建时间 + public Optional getAverageCreateTimeByDifficulty(int difficultyLevel) { + // 根据问题难度查询考试问题视图列表 + List questions = selectListViewByDifficultyLevel(difficultyLevel); + if (questions.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + long totalTime = 0; + // 遍历考试问题视图列表 + for (ExamquestionView question : questions) { + totalTime += question.getCreateTime().getTime(); + } + // 计算平均创建时间 + long averageTime = totalTime / questions.size(); + // 创建包含平均创建时间的 Date 对象 + Date averageCreateTime = new Date(averageTime); + // 返回包含平均创建时间的 Optional 对象 + return Optional.of(averageCreateTime); + } + + // 新增方法:获取考试问题数量最多的问题类型 + public Optional getMostFrequentQuestionType() { + // 根据问题类型分组统计考试问题数量 + Map typeCountMap = countQuestionsByType(); + if (typeCountMap.isEmpty()) { + // 如果 Map 为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 找出数量最多的问题类型 + String mostFrequentType = Collections.max(typeCountMap.entrySet(), Map.Entry.comparingByValue()).getKey(); + // 返回包含数量最多问题类型的 Optional 对象 + return Optional.of(mostFrequentType); + } + + // 新增方法:获取考试问题数量最多的难度级别 + public Optional getMostFrequentDifficultyLevel() { + // 根据问题难度分组统计考试问题数量 + Map difficultyCountMap = countQuestionsByDifficulty(); + if (difficultyCountMap.isEmpty()) { + // 如果 Map 为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 找出数量最多的难度级别 + Integer mostFrequentDifficulty = Collections.max(difficultyCountMap.entrySet(), Map.Entry.comparingByValue()).getKey(); + // 返回包含数量最多难度级别的 Optional 对象 + return Optional.of(mostFrequentDifficulty); + } + + // 新增方法:获取考试问题数量最多的创建月份 + public Optional getMostFrequentCreateMonth() { + // 根据创建时间的月份分组统计考试问题数量 + Map monthCountMap = countQuestionsByCreateMonth(); + if (monthCountMap.isEmpty()) { + // 如果 Map 为空,返回空的 Optional 对象 + return Optional.empty(); + } + // 找出数量最多的创建月份 + Integer mostFrequentMonth = Collections.max(monthCountMap.entrySet(), Map.Entry.comparingByValue()).getKey(); + // 返回包含数量最多创建月份的 Optional 对象 + return Optional.of(mostFrequentMonth); + } +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/ExamrecordServiceImpl.java b/src/main/java/com/service/impl/ExamrecordServiceImpl.java index 4b6eb4a..debafce 100644 --- a/src/main/java/com/service/impl/ExamrecordServiceImpl.java +++ b/src/main/java/com/service/impl/ExamrecordServiceImpl.java @@ -1,69 +1,558 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 Java 的 ArrayList 类,用于实现动态数组 +import java.util.ArrayList; +// 导入 Java 的 HashMap 类,用于实现哈希表 +import java.util.HashMap; +// 导入 Java 的 Date 类,用于处理日期和时间 +import java.util.Date; +// 导入 Java 的 Calendar 类,用于进行日期和时间的计算 +import java.util.Calendar; +// 导入 Java 的 Collections 类,用于对集合进行操作 +import java.util.Collections; +// 导入 Java 的 Comparator 接口,用于自定义排序规则 +import java.util.Comparator; +// 导入 Java 的 Optional 类,用于处理可能为空的值 +import java.util.Optional; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入考试记录数据访问对象 import com.dao.ExamrecordDao; +// 导入考试记录实体类 import com.entity.ExamrecordEntity; +// 导入考试记录服务接口 import com.service.ExamrecordService; +// 导入考试记录值对象类 import com.entity.vo.ExamrecordVO; +// 导入考试记录视图类 import com.entity.view.ExamrecordView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 examrecordService @Service("examrecordService") +// 定义考试记录服务实现类,继承自 ServiceImpl 并实现 ExamrecordService 接口 public class ExamrecordServiceImpl extends ServiceImpl implements ExamrecordService { - + + // 重写 queryPageGroupBy 方法,根据传入的参数和查询条件按组查询考试记录视图的分页数据 @Override public PageUtils queryPageGroupBy(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectGroupBy(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成,用于存储考试记录视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectGroupBy 方法,根据分页和查询条件获取按组查询的考试记录视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectGroupBy(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 queryPage 方法,根据传入的参数查询考试记录实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询考试记录视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成,用于存储考试记录视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取考试记录视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询考试记录值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个考试记录值对象 @Override public ExamrecordVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询考试记录视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个考试记录视图 @Override public ExamrecordView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } -} + // 新增方法:根据考试日期范围查询考试记录视图列表 + public List selectListViewByDateRange(Date startDate, Date endDate) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加考试日期大于等于开始日期的查询条件 + wrapper.ge("exam_date", startDate); + // 添加考试日期小于等于结束日期的查询条件 + wrapper.le("exam_date", endDate); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据考试成绩范围查询考试记录视图列表 + public List selectListViewByScoreRange(int minScore, int maxScore) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加考试成绩大于等于最低成绩的查询条件 + wrapper.ge("score", minScore); + // 添加考试成绩小于等于最高成绩的查询条件 + wrapper.le("score", maxScore); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据考试科目查询考试记录视图列表 + public List selectListViewBySubject(String subject) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加考试科目等于指定科目的查询条件 + wrapper.eq("subject", subject); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据学生 ID 查询考试记录视图列表 + public List selectListViewByStudentId(int studentId) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加学生 ID 等于指定 ID 的查询条件 + wrapper.eq("student_id", studentId); + // 调用基础映射器的 selectListView 方法进行查询 + return baseMapper.selectListView(new Page<>(1, Integer.MAX_VALUE), wrapper); + } + + // 新增方法:根据考试记录 ID 批量删除考试记录 + public boolean deleteExamRecordsByIds(List ids) { + // 遍历 ID 列表 + for (Integer id : ids) { + // 调用基础映射器的 deleteById 方法删除考试记录 + if (!this.deleteById(id)) { + // 如果删除失败,返回 false + return false; + } + } + // 所有删除操作都成功,返回 true + return true; + } + + // 新增方法:根据考试记录 ID 更新考试成绩 + public boolean updateScoreById(int id, int newScore) { + // 创建一个考试记录实体对象 + ExamrecordEntity entity = new ExamrecordEntity(); + // 设置考试记录 ID + entity.setId(id); + // 设置新的考试成绩 + entity.setScore(newScore); + // 调用基础映射器的 updateById 方法更新考试记录 + return this.updateById(entity); + } + + // 新增方法:根据考试记录 ID 更新考试日期 + public boolean updateExamDateById(int id, Date newExamDate) { + // 创建一个考试记录实体对象 + ExamrecordEntity entity = new ExamrecordEntity(); + // 设置考试记录 ID + entity.setId(id); + // 设置新的考试日期 + entity.setExamDate(newExamDate); + // 调用基础映射器的 updateById 方法更新考试记录 + return this.updateById(entity); + } + + // 新增方法:根据考试记录 ID 更新考试科目 + public boolean updateSubjectById(int id, String newSubject) { + // 创建一个考试记录实体对象 + ExamrecordEntity entity = new ExamrecordEntity(); + // 设置考试记录 ID + entity.setId(id); + // 设置新的考试科目 + entity.setSubject(newSubject); + // 调用基础映射器的 updateById 方法更新考试记录 + return this.updateById(entity); + } + + // 新增方法:统计指定日期范围内的考试记录数量 + public int countExamRecordsByDateRange(Date startDate, Date endDate) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加考试日期大于等于开始日期的查询条件 + wrapper.ge("exam_date", startDate); + // 添加考试日期小于等于结束日期的查询条件 + wrapper.le("exam_date", endDate); + // 调用基础映射器的 selectCount 方法统计考试记录数量 + return this.selectCount(wrapper); + } + + // 新增方法:统计指定成绩范围内的考试记录数量 + public int countExamRecordsByScoreRange(int minScore, int maxScore) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加考试成绩大于等于最低成绩的查询条件 + wrapper.ge("score", minScore); + // 添加考试成绩小于等于最高成绩的查询条件 + wrapper.le("score", maxScore); + // 调用基础映射器的 selectCount 方法统计考试记录数量 + return this.selectCount(wrapper); + } + + // 新增方法:统计指定考试科目的考试记录数量 + public int countExamRecordsBySubject(String subject) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加考试科目等于指定科目的查询条件 + wrapper.eq("subject", subject); + // 调用基础映射器的 selectCount 方法统计考试记录数量 + return this.selectCount(wrapper); + } + + // 新增方法:统计指定学生 ID 的考试记录数量 + public int countExamRecordsByStudentId(int studentId) { + // 创建一个查询条件包装器 + Wrapper wrapper = new EntityWrapper<>(); + // 添加学生 ID 等于指定 ID 的查询条件 + wrapper.eq("student_id", studentId); + // 调用基础映射器的 selectCount 方法统计考试记录数量 + return this.selectCount(wrapper); + } + + // 新增方法:获取指定日期范围内的最高考试成绩 + public Optional getMaxScoreByDateRange(Date startDate, Date endDate) { + // 根据日期范围查询考试记录视图列表 + List records = selectListViewByDateRange(startDate, endDate); + if (records.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + int maxScore = Integer.MIN_VALUE; + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + if (record.getScore() > maxScore) { + // 更新最高成绩 + maxScore = record.getScore(); + } + } + // 返回包含最高成绩的 Optional 对象 + return Optional.of(maxScore); + } + + // 新增方法:获取指定日期范围内的最低考试成绩 + public Optional getMinScoreByDateRange(Date startDate, Date endDate) { + // 根据日期范围查询考试记录视图列表 + List records = selectListViewByDateRange(startDate, endDate); + if (records.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + int minScore = Integer.MAX_VALUE; + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + if (record.getScore() < minScore) { + // 更新最低成绩 + minScore = record.getScore(); + } + } + // 返回包含最低成绩的 Optional 对象 + return Optional.of(minScore); + } + + // 新增方法:获取指定考试科目的最高考试成绩 + public Optional getMaxScoreBySubject(String subject) { + // 根据考试科目查询考试记录视图列表 + List records = selectListViewBySubject(subject); + if (records.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + int maxScore = Integer.MIN_VALUE; + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + if (record.getScore() > maxScore) { + // 更新最高成绩 + maxScore = record.getScore(); + } + } + // 返回包含最高成绩的 Optional 对象 + return Optional.of(maxScore); + } + + // 新增方法:获取指定考试科目的最低考试成绩 + public Optional getMinScoreBySubject(String subject) { + // 根据考试科目查询考试记录视图列表 + List records = selectListViewBySubject(subject); + if (records.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + int minScore = Integer.MAX_VALUE; + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + if (record.getScore() < minScore) { + // 更新最低成绩 + minScore = record.getScore(); + } + } + // 返回包含最低成绩的 Optional 对象 + return Optional.of(minScore); + } + + // 新增方法:获取指定学生 ID 的最高考试成绩 + public Optional getMaxScoreByStudentId(int studentId) { + // 根据学生 ID 查询考试记录视图列表 + List records = selectListViewByStudentId(studentId); + if (records.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + int maxScore = Integer.MIN_VALUE; + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + if (record.getScore() > maxScore) { + // 更新最高成绩 + maxScore = record.getScore(); + } + } + // 返回包含最高成绩的 Optional 对象 + return Optional.of(maxScore); + } + + // 新增方法:获取指定学生 ID 的最低考试成绩 + public Optional getMinScoreByStudentId(int studentId) { + // 根据学生 ID 查询考试记录视图列表 + List records = selectListViewByStudentId(studentId); + if (records.isEmpty()) { + // 如果列表为空,返回空的 Optional 对象 + return Optional.empty(); + } + int minScore = Integer.MAX_VALUE; + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + if (record.getScore() < minScore) { + // 更新最低成绩 + minScore = record.getScore(); + } + } + // 返回包含最低成绩的 Optional 对象 + return Optional.of(minScore); + } + + // 新增方法:根据考试日期对考试记录视图列表进行排序 + public List sortExamRecordsByExamDate(List records) { + // 使用 Collections.sort 方法对列表进行排序 + Collections.sort(records, Comparator.comparing(ExamrecordView::getExamDate)); + return records; + } + + // 新增方法:根据考试成绩对考试记录视图列表进行排序 + public List sortExamRecordsByScore(List records) { + // 使用 Collections.sort 方法对列表进行排序 + Collections.sort(records, Comparator.comparing(ExamrecordView::getScore)); + return records; + } + + // 新增方法:获取指定日期范围内的考试记录按考试科目分组统计数量 + public Map countExamRecordsBySubjectInDateRange(Date startDate, Date endDate) { + // 根据日期范围查询考试记录视图列表 + List records = selectListViewByDateRange(startDate, endDate); + // 创建一个 HashMap 用于存储统计结果 + Map subjectCountMap = new HashMap<>(); + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + String subject = record.getSubject(); + // 如果该科目已经在 Map 中,增加其计数 + subjectCountMap.put(subject, subjectCountMap.getOrDefault(subject, 0) + 1); + } + return subjectCountMap; + } + + // 新增方法:获取指定学生 ID 的考试记录按考试科目分组统计数量 + public Map countExamRecordsBySubjectForStudent(int studentId) { + // 根据学生 ID 查询考试记录视图列表 + List records = selectListViewByStudentId(studentId); + // 创建一个 HashMap 用于存储统计结果 + Map subjectCountMap = new HashMap<>(); + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + String subject = record.getSubject(); + // 如果该科目已经在 Map 中,增加其计数 + subjectCountMap.put(subject, subjectCountMap.getOrDefault(subject, 0) + 1); + } + return subjectCountMap; + } + + // 新增方法:获取指定日期范围内的考试记录按学生 ID 分组统计数量 + public Map countExamRecordsByStudentIdInDateRange(Date startDate, Date endDate) { + // 根据日期范围查询考试记录视图列表 + List records = selectListViewByDateRange(startDate, endDate); + // 创建一个 HashMap 用于存储统计结果 + Map studentCountMap = new HashMap<>(); + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + int studentId = record.getStudentId(); + // 如果该学生 ID 已经在 Map 中,增加其计数 + studentCountMap.put(studentId, studentCountMap.getOrDefault(studentId, 0) + 1); + } + return studentCountMap; + } + + // 新增方法:获取指定考试科目的考试记录按学生 ID 分组统计数量 + public Map countExamRecordsByStudentIdForSubject(String subject) { + // 根据考试科目查询考试记录视图列表 + List records = selectListViewBySubject(subject); + // 创建一个 HashMap 用于存储统计结果 + Map studentCountMap = new HashMap<>(); + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + int studentId = record.getStudentId(); + // 如果该学生 ID 已经在 Map 中,增加其计数 + studentCountMap.put(studentId, studentCountMap.getOrDefault(studentId, 0) + 1); + } + return studentCountMap; + } + + // 新增方法:获取指定日期范围内的考试记录按考试成绩区间分组统计数量 + public Map countExamRecordsByScoreRangeInDateRange(Date startDate, Date endDate, int interval) { + // 根据日期范围查询考试记录视图列表 + List records = selectListViewByDateRange(startDate, endDate); + // 创建一个 HashMap 用于存储统计结果 + Map scoreRangeCountMap = new HashMap<>(); + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + int score = record.getScore(); + int lowerBound = (score / interval) * interval; + int upperBound = lowerBound + interval; + String range = lowerBound + "-" + upperBound; + // 如果该成绩区间已经在 Map 中,增加其计数 + scoreRangeCountMap.put(range, scoreRangeCountMap.getOrDefault(range, 0) + 1); + } + return scoreRangeCountMap; + } + + // 新增方法:获取指定学生 ID 的考试记录按考试成绩区间分组统计数量 + public Map countExamRecordsByScoreRangeForStudent(int studentId, int interval) { + // 根据学生 ID 查询考试记录视图列表 + List records = selectListViewByStudentId(studentId); + // 创建一个 HashMap 用于存储统计结果 + Map scoreRangeCountMap = new HashMap<>(); + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + int score = record.getScore(); + int lowerBound = (score / interval) * interval; + int upperBound = lowerBound + interval; + String range = lowerBound + "-" + upperBound; + // 如果该成绩区间已经在 Map 中,增加其计数 + scoreRangeCountMap.put(range, scoreRangeCountMap.getOrDefault(range, 0) + 1); + } + return scoreRangeCountMap; + } + + // 新增方法:获取指定考试科目的考试记录按考试成绩区间分组统计数量 + public Map countExamRecordsByScoreRangeForSubject(String subject, int interval) { + // 根据考试科目查询考试记录视图列表 + List records = selectListViewBySubject(subject); + // 创建一个 HashMap 用于存储统计结果 + Map scoreRangeCountMap = new HashMap<>(); + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + int score = record.getScore(); + int lowerBound = (score / interval) * interval; + int upperBound = lowerBound + interval; + String range = lowerBound + "-" + upperBound; + // 如果该成绩区间已经在 Map 中,增加其计数 + scoreRangeCountMap.put(range, scoreRangeCountMap.getOrDefault(range, 0) + 1); + } + return scoreRangeCountMap; + } + + // 新增方法:获取指定日期范围内的考试记录按月份分组统计数量 + public Map countExamRecordsByMonthInDateRange(Date startDate, Date endDate) { + // 根据日期范围查询考试记录视图列表 + List records = selectListViewByDateRange(startDate, endDate); + // 创建一个 HashMap 用于存储统计结果 + Map monthCountMap = new HashMap<>(); + // 创建一个 Calendar 实例 + Calendar calendar = Calendar.getInstance(); + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + calendar.setTime(record.getExamDate()); + int month = calendar.get(Calendar.MONTH) + 1; + // 如果该月份已经在 Map 中,增加其计数 + monthCountMap.put(month, monthCountMap.getOrDefault(month, 0) + 1); + } + return monthCountMap; + } + + // 新增方法:获取指定学生 ID 的考试记录按月份分组统计数量 + public Map countExamRecordsByMonthForStudent(int studentId) { + // 根据学生 ID 查询考试记录视图列表 + List records = selectListViewByStudentId(studentId); + // 创建一个 HashMap 用于存储统计结果 + Map monthCountMap = new HashMap<>(); + // 创建一个 Calendar 实例 + Calendar calendar = Calendar.getInstance(); + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + calendar.setTime(record.getExamDate()); + int month = calendar.get(Calendar.MONTH) + 1; + // 如果该月份已经在 Map 中,增加其计数 + monthCountMap.put(month, monthCountMap.getOrDefault(month, 0) + 1); + } + return monthCountMap; + } + + // 新增方法:获取指定考试科目的考试记录按月份分组统计数量 + public Map countExamRecordsByMonthForSubject(String subject) { + // 根据考试科目查询考试记录视图列表 + List records = selectListViewBySubject(subject); + // 创建一个 HashMap 用于存储统计结果 + Map monthCountMap = new HashMap<>(); + // 创建一个 Calendar 实例 + Calendar calendar = Calendar.getInstance(); + // 遍历考试记录视图列表 + for (ExamrecordView record : records) { + calendar.setTime(record.getExamDate()); + int month = calendar.get(Calendar.MONTH) + 1; + // 如果该月份已经在 Map 中,增加其计数 + monthCountMap.put(month, monthCountMap.getOrDefault(month, 0) + 1); + } + return monthCountMap; + } +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/ForumServiceImpl.java b/src/main/java/com/service/impl/ForumServiceImpl.java index b188139..f0c4692 100644 --- a/src/main/java/com/service/impl/ForumServiceImpl.java +++ b/src/main/java/com/service/impl/ForumServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入论坛数据访问对象 import com.dao.ForumDao; +// 导入论坛实体类 import com.entity.ForumEntity; +// 导入论坛服务接口 import com.service.ForumService; +// 导入论坛值对象类 import com.entity.vo.ForumVO; +// 导入论坛视图类 import com.entity.view.ForumView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 forumService @Service("forumService") +// 定义论坛服务实现类,继承自 ServiceImpl 并实现 ForumService 接口 public class ForumServiceImpl extends ServiceImpl implements ForumService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数查询论坛实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询论坛视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成,用于存储论坛视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取论坛视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询论坛值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个论坛值对象 @Override public ForumVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询论坛视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个论坛视图 @Override public ForumView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/GoumaidekechengServiceImpl.java b/src/main/java/com/service/impl/GoumaidekechengServiceImpl.java index 0f0b6f6..36e9c6b 100644 --- a/src/main/java/com/service/impl/GoumaidekechengServiceImpl.java +++ b/src/main/java/com/service/impl/GoumaidekechengServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入购买的课程数据访问对象 import com.dao.GoumaidekechengDao; +// 导入购买的课程实体类 import com.entity.GoumaidekechengEntity; +// 导入购买的课程服务接口 import com.service.GoumaidekechengService; +// 导入购买的课程值对象类 import com.entity.vo.GoumaidekechengVO; +// 导入购买的课程视图类 import com.entity.view.GoumaidekechengView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 goumaidekechengService @Service("goumaidekechengService") +// 定义购买的课程服务实现类,继承自 ServiceImpl 并实现 GoumaidekechengService 接口 public class GoumaidekechengServiceImpl extends ServiceImpl implements GoumaidekechengService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数查询购买的课程实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询购买的课程视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,根据传入的参数生成,用于存储购买的课程视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取购买的课程视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询购买的课程值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个购买的课程值对象 @Override public GoumaidekechengVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询购买的课程视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个购买的课程视图 @Override public GoumaidekechengView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/KechengleixingServiceImpl.java b/src/main/java/com/service/impl/KechengleixingServiceImpl.java index 03cb203..83acb95 100644 --- a/src/main/java/com/service/impl/KechengleixingServiceImpl.java +++ b/src/main/java/com/service/impl/KechengleixingServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所属的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入课程类型数据访问对象 import com.dao.KechengleixingDao; +// 导入课程类型实体类 import com.entity.KechengleixingEntity; +// 导入课程类型服务接口 import com.service.KechengleixingService; +// 导入课程类型值对象类 import com.entity.vo.KechengleixingVO; +// 导入课程类型视图类 import com.entity.view.KechengleixingView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 kechengleixingService @Service("kechengleixingService") +// 定义课程类型服务实现类,继承自 ServiceImpl 并实现 KechengleixingService 接口 public class KechengleixingServiceImpl extends ServiceImpl implements KechengleixingService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数查询课程类型实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询课程类型视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成,用于存储课程类型视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取课程类型视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询课程类型值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个课程类型值对象 @Override public KechengleixingVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询课程类型视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个课程类型视图 @Override public KechengleixingView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/KechengxinxiServiceImpl.java b/src/main/java/com/service/impl/KechengxinxiServiceImpl.java index 3c1a0a6..bfc2c6a 100644 --- a/src/main/java/com/service/impl/KechengxinxiServiceImpl.java +++ b/src/main/java/com/service/impl/KechengxinxiServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入课程信息数据访问对象 import com.dao.KechengxinxiDao; +// 导入课程信息实体类 import com.entity.KechengxinxiEntity; +// 导入课程信息服务接口 import com.service.KechengxinxiService; +// 导入课程信息值对象类 import com.entity.vo.KechengxinxiVO; +// 导入课程信息视图类 import com.entity.view.KechengxinxiView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 kechengxinxiService @Service("kechengxinxiService") +// 定义课程信息服务实现类,继承自 ServiceImpl 并实现 KechengxinxiService 接口 public class KechengxinxiServiceImpl extends ServiceImpl implements KechengxinxiService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数查询课程信息实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询课程信息视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,根据传入的参数生成,用于存储课程信息视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取课程信息视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询课程信息值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个课程信息值对象 @Override public KechengxinxiVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询课程信息视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个课程信息视图 @Override public KechengxinxiView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/MessagesServiceImpl.java b/src/main/java/com/service/impl/MessagesServiceImpl.java index 316d524..961e35a 100644 --- a/src/main/java/com/service/impl/MessagesServiceImpl.java +++ b/src/main/java/com/service/impl/MessagesServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所属的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于标记该类为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入消息数据访问对象 import com.dao.MessagesDao; +// 导入消息实体类 import com.entity.MessagesEntity; +// 导入消息服务接口 import com.service.MessagesService; +// 导入消息值对象类 import com.entity.vo.MessagesVO; +// 导入消息视图类 import com.entity.view.MessagesView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 messagesService @Service("messagesService") +// 定义消息服务实现类,继承自 ServiceImpl 并实现 MessagesService 接口 public class MessagesServiceImpl extends ServiceImpl implements MessagesService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数查询消息实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询消息视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,根据传入的参数生成,用于存储消息视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取消息视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询消息值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个消息值对象 @Override public MessagesVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询消息视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个消息视图 @Override public MessagesView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/NewsServiceImpl.java b/src/main/java/com/service/impl/NewsServiceImpl.java index 328bdb4..22a8b4d 100644 --- a/src/main/java/com/service/impl/NewsServiceImpl.java +++ b/src/main/java/com/service/impl/NewsServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入新闻数据访问对象 import com.dao.NewsDao; +// 导入新闻实体类 import com.entity.NewsEntity; +// 导入新闻服务接口 import com.service.NewsService; +// 导入新闻值对象类 import com.entity.vo.NewsVO; +// 导入新闻视图类 import com.entity.view.NewsView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 newsService @Service("newsService") +// 定义新闻服务实现类,继承自 ServiceImpl 并实现 NewsService 接口 public class NewsServiceImpl extends ServiceImpl implements NewsService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数查询新闻实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询新闻视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,根据传入的参数生成,用于存储新闻视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取新闻视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询新闻值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个新闻值对象 @Override public NewsVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询新闻视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个新闻视图 @Override public NewsView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/ShipindianboServiceImpl.java b/src/main/java/com/service/impl/ShipindianboServiceImpl.java index cf25b26..4f2beb4 100644 --- a/src/main/java/com/service/impl/ShipindianboServiceImpl.java +++ b/src/main/java/com/service/impl/ShipindianboServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入视频点播数据访问对象 import com.dao.ShipindianboDao; +// 导入视频点播实体类 import com.entity.ShipindianboEntity; +// 导入视频点播服务接口 import com.service.ShipindianboService; +// 导入视频点播值对象类 import com.entity.vo.ShipindianboVO; +// 导入视频点播视图类 import com.entity.view.ShipindianboView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 shipindianboService @Service("shipindianboService") +// 定义视频点播服务实现类,继承自 ServiceImpl 并实现 ShipindianboService 接口 public class ShipindianboServiceImpl extends ServiceImpl implements ShipindianboService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数查询视频点播实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询视频点播视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,根据传入的参数生成,用于存储视频点播视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取视频点播视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询视频点播值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个视频点播值对象 @Override public ShipindianboVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询视频点播视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个视频点播视图 @Override public ShipindianboView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/StoreupServiceImpl.java b/src/main/java/com/service/impl/StoreupServiceImpl.java index d1e50e6..c9f0ae2 100644 --- a/src/main/java/com/service/impl/StoreupServiceImpl.java +++ b/src/main/java/com/service/impl/StoreupServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入收藏数据访问对象 import com.dao.StoreupDao; +// 导入收藏实体类 import com.entity.StoreupEntity; +// 导入收藏服务接口 import com.service.StoreupService; +// 导入收藏值对象类 import com.entity.vo.StoreupVO; +// 导入收藏视图类 import com.entity.view.StoreupView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 storeupService @Service("storeupService") +// 定义收藏服务实现类,继承自 ServiceImpl 并实现 StoreupService 接口 public class StoreupServiceImpl extends ServiceImpl implements StoreupService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数查询收藏实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询收藏视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,根据传入的参数生成,用于存储收藏视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取收藏视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询收藏值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个收藏值对象 @Override public StoreupVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询收藏视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个收藏视图 @Override public StoreupView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/TokenServiceImpl.java b/src/main/java/com/service/impl/TokenServiceImpl.java index de6c052..5956b3e 100644 --- a/src/main/java/com/service/impl/TokenServiceImpl.java +++ b/src/main/java/com/service/impl/TokenServiceImpl.java @@ -1,79 +1,121 @@ - +// 声明该类所在的包为com.service.impl package com.service.impl; - +// 导入Java的Calendar类,用于处理日期和时间 import java.util.Calendar; +// 导入Java的Date类,用于表示日期和时间 import java.util.Date; +// 导入Java的List接口,用于处理列表数据 import java.util.List; +// 导入Java的Map接口,用于处理键值对数据 import java.util.Map; +// 导入Spring框架的Service注解,用于标记该类为服务层组件 import org.springframework.stereotype.Service; +// 导入MyBatis-Plus的EntityWrapper类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入MyBatis-Plus的Wrapper接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入MyBatis-Plus的Page类,用于分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入MyBatis-Plus的ServiceImpl类,提供通用的服务层实现 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入数据访问对象TokenDao import com.dao.TokenDao; +// 导入Token实体类 import com.entity.TokenEntity; +// 重复导入Token实体类,可考虑移除一个 import com.entity.TokenEntity; +// 导入Token服务接口 import com.service.TokenService; +// 导入自定义的通用工具类 import com.utils.CommonUtil; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - -/** - * token - */ +// token服务实现类 +// 标记该类为Spring的服务组件,名称为tokenService @Service("tokenService") +// 定义TokenServiceImpl类,继承ServiceImpl类并实现TokenService接口 public class TokenServiceImpl extends ServiceImpl implements TokenService { + // 重写queryPage方法,用于根据参数查询Token实体的分页数据 @Override public PageUtils queryPage(Map params) { + // 创建一个分页对象,根据传入的参数进行初始化 Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); + new Query(params).getPage(), + // 创建一个查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,包含分页信息 + return new PageUtils(page); } + // 重写selectListView方法,用于根据查询条件查询Token实体的列表数据 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的selectListView方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写queryPage方法,用于根据参数和查询条件查询Token实体的分页数据 @Override public PageUtils queryPage(Map params, - Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; + Wrapper wrapper) { + // 创建一个分页对象,根据传入的参数进行初始化 + Page page = new Query(params).getPage(); + // 设置分页对象的记录列表,通过基础映射器的selectListView方法查询 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 创建分页工具类对象,包含分页信息 + PageUtils pageUtil = new PageUtils(page); + // 返回分页工具类对象 + return pageUtil; } + // 重写generateToken方法,用于生成Token @Override - public String generateToken(Long userid,String username, String tableName, String role) { + public String generateToken(Long userid, String username, String tableName, String role) { + // 根据用户ID和角色查询Token实体 TokenEntity tokenEntity = this.selectOne(new EntityWrapper().eq("userid", userid).eq("role", role)); + // 生成一个32位的随机字符串作为Token String token = CommonUtil.getRandomString(32); - Calendar cal = Calendar.getInstance(); - cal.setTime(new Date()); - cal.add(Calendar.HOUR_OF_DAY, 1); - if(tokenEntity!=null) { + // 获取当前的Calendar实例 + Calendar cal = Calendar.getInstance(); + // 设置Calendar的时间为当前时间 + cal.setTime(new Date()); + // 将Calendar的时间增加1小时 + cal.add(Calendar.HOUR_OF_DAY, 1); + // 如果Token实体存在 + if (tokenEntity != null) { + // 设置Token实体的Token值 tokenEntity.setToken(token); + // 设置Token实体的过期时间 tokenEntity.setExpiratedtime(cal.getTime()); + // 更新Token实体 this.updateById(tokenEntity); } else { - this.insert(new TokenEntity(userid,username, tableName, role, token, cal.getTime())); + // 如果Token实体不存在,插入一个新的Token实体 + this.insert(new TokenEntity(userid, username, tableName, role, token, cal.getTime())); } + // 返回生成的Token return token; } + // 重写getTokenEntity方法,用于根据Token获取Token实体 @Override public TokenEntity getTokenEntity(String token) { + // 根据Token查询Token实体 TokenEntity tokenEntity = this.selectOne(new EntityWrapper().eq("token", token)); - if(tokenEntity == null || tokenEntity.getExpiratedtime().getTime() implements UserService { + // 重写 queryPage 方法,用于根据参数查询 User 实体的分页数据 @Override public PageUtils queryPage(Map params) { + // 创建一个分页对象,根据传入的参数进行初始化 Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); + new Query(params).getPage(), + // 创建一个查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,包含分页信息 + return new PageUtils(page); } + // 重写 selectListView 方法,用于根据查询条件查询 User 实体的列表数据 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 queryPage 方法,用于根据参数和查询条件查询 User 实体的分页数据 @Override public PageUtils queryPage(Map params, - Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; + Wrapper wrapper) { + // 创建一个分页对象,根据传入的参数进行初始化 + Page page = new Query(params).getPage(); + // 设置分页对象的记录列表,通过基础映射器的 selectListView 方法查询 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 创建分页工具类对象,包含分页信息 + PageUtils pageUtil = new PageUtils(page); + // 返回分页工具类对象 + return pageUtil; } -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/WodebijiServiceImpl.java b/src/main/java/com/service/impl/WodebijiServiceImpl.java index 56cf366..441bb1c 100644 --- a/src/main/java/com/service/impl/WodebijiServiceImpl.java +++ b/src/main/java/com/service/impl/WodebijiServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入我的笔记数据访问对象 import com.dao.WodebijiDao; +// 导入我的笔记实体类 import com.entity.WodebijiEntity; +// 导入我的笔记服务接口 import com.service.WodebijiService; +// 导入我的笔记值对象类 import com.entity.vo.WodebijiVO; +// 导入我的笔记视图类 import com.entity.view.WodebijiView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 wodebijiService @Service("wodebijiService") +// 定义我的笔记服务实现类,继承自 ServiceImpl 并实现 WodebijiService 接口 public class WodebijiServiceImpl extends ServiceImpl implements WodebijiService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,用于根据传入的参数查询我的笔记实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,用于根据传入的参数和查询条件查询我的笔记视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成,用于存储我的笔记视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取我的笔记视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,用于根据查询条件查询我的笔记值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,用于根据查询条件查询单个我的笔记值对象 @Override public WodebijiVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,用于根据查询条件查询我的笔记视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,用于根据查询条件查询单个我的笔记视图 @Override public WodebijiView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/WodekechengServiceImpl.java b/src/main/java/com/service/impl/WodekechengServiceImpl.java index d2cded6..574cfed 100644 --- a/src/main/java/com/service/impl/WodekechengServiceImpl.java +++ b/src/main/java/com/service/impl/WodekechengServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入我的课程数据访问对象 import com.dao.WodekechengDao; +// 导入我的课程实体类 import com.entity.WodekechengEntity; +// 导入我的课程服务接口 import com.service.WodekechengService; +// 导入我的课程值对象类 import com.entity.vo.WodekechengVO; +// 导入我的课程视图类 import com.entity.view.WodekechengView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 wodekechengService @Service("wodekechengService") +// 定义我的课程服务实现类,继承自 ServiceImpl 并实现 WodekechengService 接口 public class WodekechengServiceImpl extends ServiceImpl implements WodekechengService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数查询我的课程实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询我的课程视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,根据传入的参数生成,用于存储我的课程视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取我的课程视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询我的课程值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个我的课程值对象 @Override public WodekechengVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询我的课程视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个我的课程视图 @Override public WodekechengView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/XiaoxitongzhiServiceImpl.java b/src/main/java/com/service/impl/XiaoxitongzhiServiceImpl.java index a4e8f63..d0ed310 100644 --- a/src/main/java/com/service/impl/XiaoxitongzhiServiceImpl.java +++ b/src/main/java/com/service/impl/XiaoxitongzhiServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入消息通知数据访问对象 import com.dao.XiaoxitongzhiDao; +// 导入消息通知实体类 import com.entity.XiaoxitongzhiEntity; +// 导入消息通知服务接口 import com.service.XiaoxitongzhiService; +// 导入消息通知值对象类 import com.entity.vo.XiaoxitongzhiVO; +// 导入消息通知视图类 import com.entity.view.XiaoxitongzhiView; +// 使用 @Service 注解将该类标记为 Spring 服务,服务名为 xiaoxitongzhiService @Service("xiaoxitongzhiService") +// 定义消息通知服务实现类,继承 ServiceImpl 并实现 XiaoxitongzhiService 接口 public class XiaoxitongzhiServiceImpl extends ServiceImpl implements XiaoxitongzhiService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数查询消息通知实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件查询消息通知视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,根据传入的参数生成,用于存储消息通知视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取消息通知视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询消息通知值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个消息通知值对象 @Override public XiaoxitongzhiVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询消息通知视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个消息通知视图 @Override public XiaoxitongzhiView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/XuekeServiceImpl.java b/src/main/java/com/service/impl/XuekeServiceImpl.java index b49d293..6eba9e5 100644 --- a/src/main/java/com/service/impl/XuekeServiceImpl.java +++ b/src/main/java/com/service/impl/XuekeServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所属的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入学科数据访问对象 import com.dao.XuekeDao; +// 导入学科实体类 import com.entity.XuekeEntity; +// 导入学科服务接口 import com.service.XuekeService; +// 导入学科值对象类 import com.entity.vo.XuekeVO; +// 导入学科视图类 import com.entity.view.XuekeView; +// 使用 @Service 注解,将该类注册为 Spring 服务,服务名为 xuekeService @Service("xuekeService") +// 定义学科服务实现类,继承自 ServiceImpl 并实现 XuekeService 接口 public class XuekeServiceImpl extends ServiceImpl implements XuekeService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据参数查询学科实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,封装分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据参数和查询条件查询学科视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,通过 Query 工具类根据传入的参数生成,用于存储学科视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取学科视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 返回分页工具类对象,封装分页信息 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询学科值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个学科值对象 @Override public XuekeVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询学科视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个学科视图 @Override public XuekeView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/YonghuServiceImpl.java b/src/main/java/com/service/impl/YonghuServiceImpl.java index 3213fef..79860fc 100644 --- a/src/main/java/com/service/impl/YonghuServiceImpl.java +++ b/src/main/java/com/service/impl/YonghuServiceImpl.java @@ -1,62 +1,92 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 @Service 注解,用于将该类标记为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 中的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 中的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于实现分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入用户数据访问对象 import com.dao.YonghuDao; +// 导入用户实体类 import com.entity.YonghuEntity; +// 导入用户服务接口 import com.service.YonghuService; +// 导入用户值对象类 import com.entity.vo.YonghuVO; +// 导入用户视图类 import com.entity.view.YonghuView; +// 使用 @Service 注解,将该类注册为 Spring 服务,服务名为 yonghuService @Service("yonghuService") +// 定义 YonghuServiceImpl 类,继承自 MyBatis-Plus 的 ServiceImpl 类,并实现 YonghuService 接口 public class YonghuServiceImpl extends ServiceImpl implements YonghuService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据传入的参数进行分页查询用户实体数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,通过 Query 工具类根据参数生成 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 将分页对象封装到 PageUtils 工具类中并返回 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据传入的参数和查询条件进行分页查询用户视图数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,通过 Query 工具类根据参数生成,用于存储用户视图数据 + Page page = new Query(params).getPage(); + // 调用基础映射器的 selectListView 方法,根据分页和查询条件获取用户视图列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 将分页对象封装到 PageUtils 工具类中并返回 + PageUtils pageUtil = new PageUtils(page); + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询用户值对象列表 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个用户值对象 @Override public YonghuVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询用户视图列表 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个用户视图 @Override public YonghuView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/service/impl/ZhiyeguihuaServiceImpl.java b/src/main/java/com/service/impl/ZhiyeguihuaServiceImpl.java index ec60b3b..4bd407b 100644 --- a/src/main/java/com/service/impl/ZhiyeguihuaServiceImpl.java +++ b/src/main/java/com/service/impl/ZhiyeguihuaServiceImpl.java @@ -1,62 +1,93 @@ +// 声明该类所在的包为 com.service.impl package com.service.impl; +// 导入 Spring 框架的 Service 注解,用于标记该类为服务层组件 import org.springframework.stereotype.Service; +// 导入 Java 的 Map 接口,用于处理键值对数据 import java.util.Map; +// 导入 Java 的 List 接口,用于处理列表数据 import java.util.List; +// 导入 MyBatis-Plus 的 Wrapper 接口,用于封装查询条件 import com.baomidou.mybatisplus.mapper.Wrapper; +// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件 import com.baomidou.mybatisplus.mapper.EntityWrapper; +// 导入 MyBatis-Plus 的 Page 类,用于分页查询 import com.baomidou.mybatisplus.plugins.Page; +// 导入 MyBatis-Plus 的 ServiceImpl 类,提供通用的服务层实现 import com.baomidou.mybatisplus.service.impl.ServiceImpl; +// 导入自定义的分页工具类 import com.utils.PageUtils; +// 导入自定义的查询工具类 import com.utils.Query; - +// 导入职业规划数据访问对象 import com.dao.ZhiyeguihuaDao; +// 导入职业规划实体类 import com.entity.ZhiyeguihuaEntity; +// 导入职业规划服务接口 import com.service.ZhiyeguihuaService; +// 导入职业规划值对象类 import com.entity.vo.ZhiyeguihuaVO; +// 导入职业规划视图类 import com.entity.view.ZhiyeguihuaView; +// 使用 @Service 注解标记该类为服务层组件,名称为 zhiyeguihuaService @Service("zhiyeguihuaService") +// 定义 ZhiyeguihuaServiceImpl 类,继承 ServiceImpl 类并实现 ZhiyeguihuaService 接口 public class ZhiyeguihuaServiceImpl extends ServiceImpl implements ZhiyeguihuaService { - - - @Override - public PageUtils queryPage(Map params) { - Page page = this.selectPage( - new Query(params).getPage(), - new EntityWrapper() - ); - return new PageUtils(page); - } - - @Override + + // 重写 queryPage 方法,根据参数查询职业规划实体的分页数据 + @Override + public PageUtils queryPage(Map params) { + // 创建一个分页对象,根据传入的参数进行初始化 + Page page = this.selectPage( + new Query(params).getPage(), + // 创建一个查询条件包装器 + new EntityWrapper() + ); + // 返回分页工具类对象,包含分页信息 + return new PageUtils(page); + } + + // 重写 queryPage 方法,根据参数和查询条件查询职业规划视图的分页数据 + @Override public PageUtils queryPage(Map params, Wrapper wrapper) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,wrapper)); - PageUtils pageUtil = new PageUtils(page); - return pageUtil; - } - - @Override + // 创建一个分页对象,根据传入的参数进行初始化 + Page page = new Query(params).getPage(); + // 设置分页对象的记录列表,通过基础映射器的 selectListView 方法查询 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 创建分页工具类对象,包含分页信息 + PageUtils pageUtil = new PageUtils(page); + // 返回分页工具类对象 + return pageUtil; + } + + // 重写 selectListVO 方法,根据查询条件查询职业规划值对象的列表数据 + @Override public List selectListVO(Wrapper wrapper) { - return baseMapper.selectListVO(wrapper); + // 调用基础映射器的 selectListVO 方法进行查询 + return baseMapper.selectListVO(wrapper); } - + + // 重写 selectVO 方法,根据查询条件查询单个职业规划值对象 @Override public ZhiyeguihuaVO selectVO(Wrapper wrapper) { - return baseMapper.selectVO(wrapper); + // 调用基础映射器的 selectVO 方法进行查询 + return baseMapper.selectVO(wrapper); } - + + // 重写 selectListView 方法,根据查询条件查询职业规划视图的列表数据 @Override public List selectListView(Wrapper wrapper) { + // 调用基础映射器的 selectListView 方法进行查询 return baseMapper.selectListView(wrapper); } + // 重写 selectView 方法,根据查询条件查询单个职业规划视图 @Override public ZhiyeguihuaView selectView(Wrapper wrapper) { + // 调用基础映射器的 selectView 方法进行查询 return baseMapper.selectView(wrapper); } - -} +} \ No newline at end of file