项目简介
TK智慧校园管理系统主要用来管理校内学生、老师、班级、年级的相关信息,进行老师和学生信息记录和统计的功能,而这些信息是校园信息化建设的核心基础业务数据。项目采用前后端分离架构思想,前端采用HTML+CSS+VUE来实现页面效果展示,后端采用SpringBoot+MybatisPlus框架实现数据存储等服务。存储层使用高性能的MySQL,服务器使用SpringBoot内置的Tomcat9.x,项目构建工具使用Maven来管理jar包和项目构建。
智慧校园指的是信息化为基础构建起来的校园信息化教育管理的一种新的模式,智慧校园能够实现校园工作,学习和生活的一体化发展,在各种信息系统应用的基础上,能实现教学,科研管理和校园生活的有效融合。智慧校园建设所包括的内容很丰富,通过云计算,互联网技术将校园运行中的所有数据有效的联系在一起,通过相关软件系统的有效应用,实现学校智能监控和智能识别的综合信息服务平台的有效构建。
智慧校园有三个基本特征,第一,智慧校园能够提供个性化的服务,通过智能化服务平台及智能感知功能,实现教育管理工作的个性化服务。第二,智慧校园是建立在互联网基础上的, 通过互联网实现信息服务与校园各种应用领域的结合。第三,智慧校园在个性化定制服务的基础上,能够为学校与外部世界的联系提供有效的平台和接口,促进学校资源与外部资源的有效融合。智慧校园是校园信息化的一种高级形式,通过智慧校园可以把学校的物理空间和数字空间结合起来,为师生学习生活,提供智能化的学习生活环境,为师生提供个性化的智能服务。
项目技术栈
项目功能
TK智慧校园系统的使用者主要包含三种用户角色,其一是管理员角色,其二是老师角色,其三是学生角色。这三个角色的具体功能如下:
- 管理员角色:管理员登录智慧校园系统后可以进行相应的管理操作,主要包含:学生信息管理、老师信息管理、年级信息管理、班级信息管理、个人信息管理、账户密码重置等操作。
- 老师用户角色:老师用户登录智慧校园系统后可以进行参与相关学生、班级信息管理的相关操作以及个人信息管理等操作。
- 学生用户角色:学生进入系统后,主要查看自己的班级,同学信息以及个人信息管理等操作。
项目开发
项目搭建
使用idea的springboot脚手架搭建一个maven项目
项目创建完成后,更改一下maven的配置,改成自己的本地maven仓库。
修改pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!--继承方式 使用spring--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.13</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.project</groupId> <artifactId>smart_campus</artifactId> <version>0.0.1-SNAPSHOT</version> <name>smart_campus</name> <description>smart_campus</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--单元测试启动器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- thymeleaf支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1</version> </dependency> <!-- 依赖MyBatis核心包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!-- 简化POJO实体类开发 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency> <!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.7.0</version> </dependency> <!--swagger ui--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.7.0</version> </dependency> <!--swagger2 增强版接口文档--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>2.0.4</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <!--开发者工具--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.29</version> </dependency> <!-- JWT生成Token--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.7.0</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> </dependencies> <build> <plugins> <!--spring boot maven插件 , 可以将项目运行依赖的jar包打到我们的项目中--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.0</version> <!-- 插件的依赖 --> <dependencies> <!-- 逆向工程的核心依赖 --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> </dependency> <!-- 数据库连接池 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.2</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> </dependencies> </plugin> </plugins> </build> </project>
项目包结构
- java目录下
- config : 项目的配置类
- controller: 控制层
- mapper : 持久层接口
- pojo : 实体类
- service: 服务层
- util: 工具类包
- SmartCampusApplication : 启动类
- resources目录下
- mapper :持久层映射文件
- public/upload:文件上传目录
- static: 静态资源目录
- application.yml :SpringBoot核心配置文
这里注意一下:public/upload
设置该目录时,如果为public.upload,那么在本地文件夹,并不会创建一个public下的新文件夹upload ,默认为该文件的文件名。
但是如果设置时,按照这种 public/upload 格式,虽然在目录中显示为public.upload (这是因为public目录下目前只有一个文件夹),但是实际上upload是public文件夹下的一个文件。
配置application.yml文件
server: port: 9000 spring: #解决SpringBoot2.6.0与swagger冲突问题【原因是在springboot2.6.0中将SpringMVC 默认路径匹配策略从AntPathMatcher 更改为PathPatternParser,导致出错,解决办法是切换回原先的AntPathMatcher】 mvc: pathmatch: matching-strategy: ant_path_matcher #配置数据源 datasource: #配置数据源类型 type: com.zaxxer.hikari.HikariDataSource #配置数据库连接属性 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/sgg_zhxy_db?characterEncoding=utf-8&serverTimezone=GMT%2B8&userSSL=false username: root password: root #mybatis-plus内置连接池 hikari: connection-test-query: SELECT 1 connection-timeout: 60000 idle-timeout: 500000 max-lifetime: 540000 maximum-pool-size: 12 minimum-idle: 10 pool-name: GuliHikariPool thymeleaf: #模板的模式,支持 HTML, XML TEXT JAVASCRIPT mode: HTML5 #编码 可不用配置 encoding: UTF-8 #开发配置为false,避免修改模板还要重启服务器 cache: false #配置模板路径,默认是templates,可以不用配置 prefix: classpath:/static/ jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 servlet: #设置文件上传上限 multipart: max-file-size: 10MB max-request-size: 100MB mybatis-plus: configuration: #添加日志支持 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath*:/mapper/**/*.xml
Hikari
hikari使用
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.0</version> </dependency>
初始化
HikariDataSource ds = new HikariDataSource(); ds.setJdbcUrl("jdbc:mysql://localhost:3306/test"); ds.setUsername("root"); ds.setPassword("123456");
基于配置文件的初始化
HikariConfig config = new HikariConfig("/../hikari.properties"); HikariDataSource ds = new HikariDataSource(config); // properties file dataSourceClassName=org.postgresql.ds.PGSimpleDataSource dataSource.user=test dataSource.password=test dataSource.databaseName=mydb dataSource.portNumber=5432 dataSource.serverName=localhost
常用参数
hikari: connection-test-query: SELECT 1 connection-timeout: 60000 idle-timeout: 500000 max-lifetime: 540000 maximum-pool-size: 12 minimum-idle: 10 pool-name: GuliHikariPool
根据 less is more 的设计哲学,以 Hikari 开头的配置都是可选的配置,都有默认的值,不配也行的。
name |
描述 |
构造器默认值 |
默认配置validate之后的值 |
validate重置 |
autoCommit |
自动提交从池中返回的连接 |
true |
true |
- |
connectionTimeout |
等待来自池的连接的最大毫秒数 |
SECONDS.toMillis(30) = 30000 |
30000 |
如果小于250毫秒,则被重置回30秒 |
idleTimeout |
连接允许在池中闲置的最长时间 |
MINUTES.toMillis(10) = 600000 |
600000 |
如果idleTimeout+1秒>maxLifetime 且 maxLifetime>0,则会被重置为0(代表永远不会退出);如果idleTimeout!=0且小于10秒,则会被重置为10秒 |
maxLifetime |
池中连接最长生命周期 |
MINUTES.toMillis(30) = 1800000 |
1800000 |
如果不等于0且小于30秒则会被重置回30分钟 |
connectionTestQuery |
如果您的驱动程序支持JDBC4,我们强烈建议您不要设置此属性 |
null |
null |
- |
minimumIdle |
池中维护的最小空闲连接数 |
-1 |
10 |
minIdle<0或者minIdle>maxPoolSize,则被重置为maxPoolSize |
maximumPoolSize |
池中最大连接数,包括闲置和使用中的连接 |
-1 |
10 |
如果maxPoolSize小于1,则会被重置。当minIdle<=0被重置为DEFAULT_POOL_SIZE则为10;如果minIdle>0则重置为minIdle的值 |
metricRegistry |
该属性允许您指定一个 Codahale / DropwizardMetricRegistry的实例,供池使用以记录各种指标 |
null |
null |
- |
healthCheckRegistry |
该属性允许您指定池使用的Codahale / Dropwizard HealthCheckRegistry的实例来报告当前健康信息 |
null |
null |
- |
poolName |
连接池的用户定义名称,主要出现在日志记录和JMX管理控制台中以识别池和池配置 |
null |
HikariPool-1 |
- |
initializationFailTimeout |
如果池无法成功初始化连接,则此属性控制池是否将fail fast |
1 |
1 |
- |
isolateInternalQueries |
是否在其自己的事务中隔离内部池查询,例如连接活动测试 |
false |
false |
- |
allowPoolSuspension |
控制池是否可以通过JMX暂停和恢复 |
false |
false |
- |
readOnly |
从池中获取的连接是否默认处于只读模式 |
false |
false |
- |
registerMbeans |
是否注册JMX管理Bean(MBeans) |
false |
false |
- |
catalog |
为支持catalog概念的数据库设置默认catalog |
driver default |
null |
- |
connectionInitSql |
该属性设置一个SQL语句,在将每个新连接创建后,将其添加到池中之前执行该语句。 |
null |
null |
- |
driverClassName |
HikariCP将尝试通过仅基于jdbcUrl的DriverManager解析驱动程序,但对于一些较旧的驱动程序,还必须指定driverClassName |
null |
null |
- |
transactionIsolation |
控制从池返回的连接的默认事务隔离级别 |
null |
null |
- |
validationTimeout |
连接将被测试活动的最大时间量 |
SECONDS.toMillis(5) = 5000 |
5000 |
如果小于250毫秒,则会被重置回5秒 |
leakDetectionThreshold |
记录消息之前连接可能离开池的时间量,表示可能的连接泄漏 |
0 |
0 |
如果大于0且不是单元测试,则进一步判断:(leakDetectionThreshold < SECONDS.toMillis(2) or (leakDetectionThreshold > maxLifetime && maxLifetime > 0),会被重置为0 . 即如果要生效则必须>0,而且不能小于2秒,而且当maxLifetime > 0时不能大于maxLifetime |
dataSource |
这个属性允许你直接设置数据源的实例被池包装,而不是让HikariCP通过反射来构造它 |
null |
null |
- |
schema |
该属性为支持模式概念的数据库设置默认模式 |
driver default |
null |
- |
threadFactory |
此属性允许您设置将用于创建池使用的所有线程的java.util.concurrent.ThreadFactory的实例。 |
null |
null |
- |
scheduledExecutor |
此属性允许您设置将用于各种内部计划任务的java.util.concurrent.ScheduledExecutorService实例 |
null |
null |
- |
jackson
Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架.
优点:
- Jackson 解析大的 json 文件速度比较快;
- Jackson 运行时占用内存比较低,性能比较好;
- Jackson 有灵活的 API,可以很容易进行扩展和定制。
<!-- springboot-json --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </dependency>
按照这种格式去解析日期和时区
jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8
mybatis-plus
mybatis-plus: configuration: #添加日志支持 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath*:/mapper/**/*.xml
mapper-locations: classpath*:/mapper/**/*.xml
设置映射文件位置: