- Java工程師的進(jìn)階之路
- 資料地址
一、項(xiàng)目展示
1、登錄及角色控制
2、業(yè)務(wù)模塊展示
二、智慧校園系統(tǒng)簡(jiǎn)介
2.1、項(xiàng)目簡(jiǎn)介
智慧校園管理系統(tǒng):主要是以年級(jí)、班級(jí)為單位,進(jìn)行老師和學(xué)生信息記錄和統(tǒng)計(jì)功能。項(xiàng)目采用前后端分離架構(gòu)思想,前端采用HTML+CSS+VUE來(lái)實(shí)現(xiàn)頁(yè)面效果展示,后端采用SpringBoot+MybatisPlus框架實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)等服務(wù)。存儲(chǔ)層使用高性能的MySQL,服務(wù)器使用SpringBoot內(nèi)置的Tomcat9.x,項(xiàng)目構(gòu)建工具使用Maven來(lái)管理jar包和項(xiàng)目構(gòu)建。
2.2、項(xiàng)目模塊
2.3、技術(shù)棧
VUE
是一套用于構(gòu)建用戶界面的漸進(jìn)式框架。與其它大型框架不同的是,Vue 被設(shè)計(jì)為可以自底向上逐層應(yīng)用。Vue 的核心庫(kù)只關(guān)注視圖層,不僅易于上手,還便于與第三方庫(kù)或既有項(xiàng)目整合。另一方面,當(dāng)與現(xiàn)代化的工具鏈以及各種支持類庫(kù)結(jié)合使用時(shí),Vue 也完全能夠?yàn)閺?fù)雜的單頁(yè)應(yīng)用提供驅(qū)動(dòng)。 前后端分離是目前一種非常流行的開發(fā)模式,它使項(xiàng)目的分工更加明確:后端:負(fù)責(zé)處理、存儲(chǔ)數(shù)據(jù). 前端:負(fù)責(zé)顯示數(shù)據(jù) 前端和后端開發(fā)人員通過(guò) 接口 進(jìn)行數(shù)據(jù)的交換。
Spring
Spring就像是整個(gè)項(xiàng)目中裝配bean的大工廠,在配置文件中可以指定使用特定的參數(shù)去調(diào)用實(shí)體類的構(gòu)造方法來(lái)實(shí)例化對(duì)象。也可以稱之為項(xiàng)目中的粘合劑。
Spring的核心思想是IoC(控制反轉(zhuǎn)),即不再需要程序員去顯式地new
一個(gè)對(duì)象,而是讓Spring框架幫你來(lái)完成這一切。
SpringMVC
SpringMVC在項(xiàng)目中攔截用戶請(qǐng)求,它的核心Servlet即DispatcherServlet承擔(dān)中介或是前臺(tái)這樣的職責(zé),將用戶請(qǐng)求通過(guò)HandlerMapping去匹配Controller,Controller就是具體對(duì)應(yīng)請(qǐng)求所執(zhí)行的操作。SpringMVC相當(dāng)于SSH框架中struts。
mybatis-plus
mybatis是對(duì)jdbc的封裝,它讓數(shù)據(jù)庫(kù)底層操作變的透明。mybatis的操作都是圍繞一個(gè)sqlSessionFactory實(shí)例展開的。mybatis通過(guò)配置文件關(guān)聯(lián)到各實(shí)體類的Mapper文件,Mapper文件中配置了每個(gè)類對(duì)數(shù)據(jù)庫(kù)所需進(jìn)行的sql語(yǔ)句映射。在每次與數(shù)據(jù)庫(kù)交互時(shí),通過(guò)sqlSessionFactory拿到一個(gè)sqlSession,再執(zhí)行sql命令。MyBatis-plus
就是在MyBatis的基礎(chǔ)上,為Mapper接口,Service層提供一些比較全面的CURD的業(yè)務(wù)邏輯功能,使程序員可以減少在Mapper和Service層的代碼編寫
MVC項(xiàng)目架構(gòu)
頁(yè)面發(fā)送請(qǐng)求給控制器,控制器調(diào)用業(yè)務(wù)層處理邏輯,邏輯層向持久層發(fā)送請(qǐng)求,持久層與數(shù)據(jù)庫(kù)交互,后將結(jié)果返回給業(yè)務(wù)層,業(yè)務(wù)層將處理邏輯發(fā)送給控制器,控制器再調(diào)用視圖展現(xiàn)數(shù)據(jù)。
2.4、環(huán)境準(zhǔn)備
三、項(xiàng)目搭建
3.1、搭建工程
1、新建工程 - zhxy
- 包名:com.laptoy.zhxy
- Group:com.laptoy
2、安裝插件
MybatisX、Lombok
3、開啟注解功能
4、指定Maven配置
5、指定字符編碼
6、POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.laptoy</groupId>
<artifactId>zhxy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zhxy</name>
<description>zhxy</description>
<properties>
<java.version>1.8</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>
<!--單元測(cè)試啟動(dòng)器-->
<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>
<!-- 簡(jiǎn)化POJO實(shí)體類開發(fā) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</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 增強(qiáng)版接口文檔-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
<!--開發(fā)者工具-->
<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>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.2、項(xiàng)目結(jié)構(gòu)
1、目錄結(jié)構(gòu)
java目錄:
- config : 項(xiàng)目的配置類
- controller: 控制層
- mapper : 持久層接口
- pojo : 實(shí)體類
- service: 服務(wù)層
- util: 工具類包
- ZhxyApplication : 啟動(dòng)類
resources目錄:創(chuàng)建多級(jí)目錄以 /
連接而不是 .
- mapper :持久層映射文件
- public/upload:文件上傳目錄
- static: 靜態(tài)資源目錄
- application.yml :SpringBoot核心配置文件
效果展示:
2、新建數(shù)據(jù)庫(kù) - 執(zhí)行資料的SQL文件(資料在最上面)
3、application.yml
server:
port: 9001
spring:
# 解決SpringBoot2.6.0與swagger沖突問(wèn)題【原因是在springboot2.6.0中將SpringMVC 默認(rèn)路徑匹配策略從AntPathMatcher 更改為PathPatternParser,導(dǎo)致出錯(cuò),解決辦法是切換回原先的AntPathMatcher】
mvc:
pathmatch:
matching-strategy: ant_path_matcher
datasource:
# 配置數(shù)據(jù)源類型
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/zhxy_db?characterEncoding=utf-8&serverTimezone=GMT%2B8&userSSL=false
username: root
password: root
# Mybatis-plus內(nèi)置連接池
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
# 開發(fā)配置為false,避免修改模板還要重啟服務(wù)器
cache: false
# 配置模板路徑,默認(rèn)是templates,可以不用配置
prefix: classpath:/static/
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
servlet:
# 設(shè)置文件上傳上限
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
4、前端頁(yè)面放入static目錄(資料在最上面)
5、測(cè)試
運(yùn)行主啟動(dòng)類訪問(wèn) localhost:9001
3.3、配置類
1、分頁(yè)插件的配置類
package com.laptoy.zhxy.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.laptoy.zhxy.mapper")
public class MpConfig {
/**
* 分頁(yè)插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// paginationInterceptor.setLimit(你的最大單頁(yè)限制數(shù)量,默認(rèn) 500 條,小于 0 如 -1 不受限制);
return paginationInterceptor;
}
}
2、Swagger2的配置類
package com.laptoy.zhxy.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
/**
* Swagger2配置信息
*/
@Configuration
@EnableSwagger2
public class Swagger2Config {
@Bean
public Docket webApiConfig() {
//添加head參數(shù)start
List<Parameter> pars = new ArrayList<>();
ParameterBuilder tokenPar = new ParameterBuilder();
tokenPar.name("userId")
.description("用戶ID")
.defaultValue("1")
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false)
.build();
pars.add(tokenPar.build());
ParameterBuilder tmpPar = new ParameterBuilder();
tmpPar.name("userTempId")
.description("臨時(shí)用戶ID")
.defaultValue("1")
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false)
.build();
pars.add(tmpPar.build());
//添加head參數(shù)end
return new Docket(DocumentationType.SWAGGER_2)
.groupName("webApi")
.apiInfo(webApiInfo())
.select()
//可以測(cè)試請(qǐng)求頭中:輸入token
.apis(RequestHandlerSelectors.basePackage("com.laptoy.zhxy.controller"))
//過(guò)濾掉admin路徑下的所有頁(yè)面
//.paths(Predicates.and(PathSelectors.regex("/sms/.*")))
//過(guò)濾掉所有error或error.*頁(yè)面
//.paths(Predicates.not(PathSelectors.regex("/error.*")))
.build()
.globalOperationParameters(pars);
}
private ApiInfo webApiInfo() {
return new ApiInfoBuilder()
.title("網(wǎng)站-API文檔")
.description("本文檔描述了網(wǎng)站微服務(wù)接口定義")
.version("1.0")
.contact(new Contact("Laptoy", "https://blog.csdn.net/apple_53947466", "laptoy458@163.com"))
.build();
}
private ApiInfo adminApiInfo() {
return new ApiInfoBuilder()
.title("后臺(tái)管理系統(tǒng)-API文檔")
.description("本文檔描述了后臺(tái)管理系統(tǒng)微服務(wù)接口定義")
.version("1.0")
.contact(new Contact("Laptoy", "https://blog.csdn.net/apple_53947466", "laptoy458@163.com"))
.build();
}
}
3.4、工具類
從資源直接粘貼到 util包
1、驗(yàn)證碼圖片工具類 - CreateVerifiCodeImage
2、token口令生成工具 - JwtHelper
3、解析request請(qǐng)求中的 token口令的工具 - AuthContextHolder
4、MD5加密工具類 - MD5
5、響應(yīng)結(jié)果類型碼枚舉 - ResultCodeEnum
6、JSON響應(yīng)結(jié)果格式封裝類 - Result
7、文件上傳工具類 - UploadFile
3.5、業(yè)務(wù)層
使用MybatisX插件進(jìn)行逆向生成
1、選中所有表
2、配置實(shí)體類
3、配置
4、每個(gè)impl添加 - @Transactional
開啟事務(wù)
5、最終效果
6、額外 - 實(shí)體類 LoginForm 封裝登錄表單信息
@Data
public class LoginForm {
private String username;
private String password;
private String verifiCode;
private Integer userType;
}
7、控制層 - 按照前端接口 /sms/xxxController
進(jìn)行編寫
@RestController
@RequestMapping("/sms/adminController")
public class AdminController {
}
@RestController
@RequestMapping("/sms/clazzController")
public class ClazzController {
}
@RestController
@RequestMapping("/sms/gradeController")
public class GradeController {
}
@RestController
@RequestMapping("/sms/teacherController")
public class TeacherController {
}
@RestController
@RequestMapping("/sms/studentController")
public class StudentController {
}
8、系統(tǒng)控制層(如驗(yàn)證碼)
@RestController
@RequestMapping("/sms/system")
public class SystemController {
}
四、登錄功能后臺(tái)實(shí)現(xiàn)
4.1、獲取驗(yàn)證碼
刷新頁(yè)面 - 驗(yàn)證碼API - /sms/system/getVerifiCodeImage
獲取驗(yàn)證碼圖片及向session中存儲(chǔ)驗(yàn)證碼功能實(shí)現(xiàn)
1、控制層 - SystemController
@Api(tags = "系統(tǒng)控制器")
@RestController
@RequestMapping("/sms/system")
public class SystemController {
/**
* 獲取驗(yàn)證碼及展示驗(yàn)證碼
*/
@ApiOperation("獲取驗(yàn)證碼圖片")
@GetMapping("/getVerifiCodeImage")
public void getVerifiCodeImage(HttpServletRequest request, HttpServletResponse response) {
// 獲取圖片及圖片上的驗(yàn)證碼
BufferedImage verifiCodeImage = CreateVerifiCodeImage.getVerifiCodeImage();
String verifiCode = String.valueOf(CreateVerifiCodeImage.getVerifiCode());
// 將驗(yàn)證碼放入session,為驗(yàn)證做準(zhǔn)備
HttpSession session = request.getSession();
session.setAttribute("verifiCode", verifiCode);
// 將驗(yàn)證碼圖片響應(yīng)給瀏覽器
try {
ImageIO.write(verifiCodeImage, "JPEG", response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、效果
4.2、登錄校驗(yàn)功能
點(diǎn)擊登錄按鈕 - 登錄API - /sms/system/login
代碼實(shí)現(xiàn)
@Api(tags = "系統(tǒng)控制器")
@RestController
@RequestMapping("/sms/system")
public class SystemController {
@Autowired
private AdminService adminService;
@Autowired
private StudentService studentService;
@Autowired
private TeacherService teacherService;
/**
* 登錄驗(yàn)證
*/
@ApiOperation("登錄請(qǐng)求驗(yàn)證")
@PostMapping("/login")
public Result login(@RequestBody LoginForm loginForm, HttpServletRequest request) {
// 獲取用戶提交的驗(yàn)證碼和session域中的驗(yàn)證碼
HttpSession session = request.getSession();
String systemVerifiCode = (String) session.getAttribute("verifiCode");
String loginVerifiCode = loginForm.getVerifiCode();
// session過(guò)期,驗(yàn)證碼超時(shí)
if ("".equals(systemVerifiCode)) {
return Result.fail().message("驗(yàn)證碼失效,請(qǐng)刷新后重試");
}
// 驗(yàn)證碼錯(cuò)誤
if (!loginVerifiCode.equalsIgnoreCase(systemVerifiCode)) {
return Result.fail().message("驗(yàn)證碼有誤,請(qǐng)刷新后重新輸入");
}
// 驗(yàn)證碼使用完畢,移除當(dāng)前請(qǐng)求域中的驗(yàn)證碼
session.removeAttribute("verifiCode");
// 準(zhǔn)備一個(gè)Map集合,用戶存放響應(yīng)的信息
Map<String, Object> map = new HashMap<>();
// 根據(jù)用戶身份,驗(yàn)證登錄的用戶信息
switch (loginForm.getUserType()) {
case 1: // 管理員身份
try {
// 調(diào)用服務(wù)層登錄方法,根據(jù)用戶提交的LoginInfo信息,查詢對(duì)應(yīng)的Admin對(duì)象,找不到返回Null
Admin login = adminService.login(loginForm);
if (null != login) {
// 登錄成功,將用戶id和用戶類型轉(zhuǎn)換為token口令,作為信息響應(yīng)給前端
map.put("token", JwtHelper.createToken(login.getId().longValue(), 1));
} else {
throw new RuntimeException("用戶名或者密碼有誤!");
}
return Result.ok(map);
} catch (RuntimeException e) {
e.printStackTrace();
// 捕獲異常,向用戶響應(yīng)錯(cuò)誤信息
return Result.fail().message(e.getMessage());
}
case 2: // 學(xué)生身份
try {
// 調(diào)用服務(wù)層登錄方法,根據(jù)用戶提交的LoginInfo信息,查詢對(duì)應(yīng)的Student對(duì)象,找不到返回Null
Student login = studentService.login(loginForm);
if (null != login) {
// 登錄成功,將用戶id和用戶類型轉(zhuǎn)換為token口令,作為信息響應(yīng)給前端
map.put("token", JwtHelper.createToken(login.getId().longValue(), 2));
} else {
throw new RuntimeException("用戶名或者密碼有誤!");
}
return Result.ok(map);
} catch (RuntimeException e) {
e.printStackTrace();
// 捕獲異常,向用戶響應(yīng)錯(cuò)誤信息
return Result.fail().message(e.getMessage());
}
case 3: // 教師身份
try {
// 調(diào)用服務(wù)層登錄方法,根據(jù)用戶提交的LoginInfo信息,查詢對(duì)應(yīng)的Student對(duì)象,找不到返回Null
Teacher login = teacherService.login(loginForm);
if (null != login) {
// 登錄成功,將用戶id和用戶類型轉(zhuǎn)換為token口令,作為信息響應(yīng)給前端
map.put("token", JwtHelper.createToken(login.getId().longValue(), 3));
} else {
throw new RuntimeException("用戶名或者密碼有誤!");
}
return Result.ok(map);
} catch (RuntimeException e) {
e.printStackTrace();
// 捕獲異常,向用戶響應(yīng)錯(cuò)誤信息
return Result.fail().message(e.getMessage());
}
}
// 查無(wú)此用戶,響應(yīng)失敗
return Result.fail().message("查無(wú)此用戶");
}
}
AdminService中的login方法
@Service
@Transactional
public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin>
implements AdminService {
/**
* 超級(jí)管理員登錄
*/
@Override
public Admin login(LoginForm loginForm) {
QueryWrapper<Admin> wrapper = new QueryWrapper<>();
wrapper.eq("name", loginForm.getUsername());
// 轉(zhuǎn)換為密文進(jìn)行查詢
wrapper.eq("password", MD5.encrypt(loginForm.getPassword()));
Admin admin = baseMapper.selectOne(wrapper);
return admin;
}
}
StudentService中的login方法
@Service
@Transactional
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student>
implements StudentService {
/**
* 學(xué)生登錄方法
*/
@Override
public Student login(LoginForm loginForm) {
QueryWrapper<Student> wrapper = new QueryWrapper<>();
wrapper.eq("name", loginForm.getUsername());
wrapper.eq("password", MD5.encrypt(loginForm.getPassword()));
return baseMapper.selectOne(wrapper);
}
}
TeacherService中的login方法
@Service
@Transactional
public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher>
implements TeacherService {
/**
* Teacher登錄方法
*/
@Override
public Teacher login(LoginForm loginForm) {
QueryWrapper<Teacher> wrapper = new QueryWrapper<>();
wrapper.eq("name", loginForm.getUsername());
wrapper.eq("password", MD5.encrypt(loginForm.getPassword()));
return baseMapper.selectOne(wrapper);
}
}
2、登錄測(cè)試
4.3、跳轉(zhuǎn)至首頁(yè)功能實(shí)現(xiàn)
當(dāng)驗(yàn)證通過(guò)后,前端會(huì)產(chǎn)生第二個(gè)請(qǐng)求,用以獲取用戶的類型,然后根據(jù)用戶的類型來(lái)展現(xiàn)不同的頁(yè)面,所以后端要有一個(gè)根據(jù)token解析用戶類型并做出結(jié)果響應(yīng)的控制層
獲取信息API - /sms/system/getInfo
代碼實(shí)現(xiàn)
@Api(tags = "系統(tǒng)控制器")
@RestController
@RequestMapping("/sms/system")
public class SystemController {
@Autowired
private AdminService adminService;
@Autowired
private StudentService studentService;
@Autowired
private TeacherService teacherService;
/**
* 跳轉(zhuǎn)至首頁(yè)
*/
@ApiOperation("通過(guò)token獲取用戶信息")
@GetMapping("/getInfo")
public Result getUserInfoByToken(HttpServletRequest request, @RequestHeader("token") String token) {
// 檢查token 是否過(guò)期
if (JwtHelper.isExpiration(token)) {
return Result.build(null, ResultCodeEnum.TOKEN_ERROR);
}
// 解析token,獲取用戶id和用戶類型
Long userId =JwtHelper.getUserId(token);
Integer userType =JwtHelper.getUserType(token);
// 準(zhǔn)備一個(gè)Map集合用于存響應(yīng)的數(shù)據(jù)
Map<String,Object> map=new HashMap<>();
switch (userType){
case 1:
Admin admin = adminService.getAdminById(userId.intValue());
map.put("user",admin);
map.put("userType",1);
break;
case 2:
Student student = studentService.getStudentById(userId.intValue());
map.put("user",student);
map.put("userType",2);
break;
case 3:
Teacher teacher = teacherService.getTeacherById(userId.intValue());
map.put("user",teacher);
map.put("userType",3);
break;
}
return Result.ok(map);
}
}
AdminService中的getAdminById方法
@Override
public Admin getAdminById(int intValue) {
QueryWrapper<Admin> wrapper = new QueryWrapper<>();
wrapper.eq("id",intValue);
Admin admin = baseMapper.selectOne(wrapper);
return admin;
}
StudentService中的getAdminById方法
@Override
public Student getStudentById(int intValue) {
QueryWrapper<Student> wrapper = new QueryWrapper<>();
wrapper.eq("id",intValue);
Student student = baseMapper.selectOne(wrapper);
return student;
}
TeacherService中的getAdminById方法
@Override
public Teacher getTeacherById(int intValue) {
QueryWrapper<Teacher> wrapper = new QueryWrapper<>();
wrapper.eq("id",intValue);
Teacher teacher = baseMapper.selectOne(wrapper);
return teacher;
}
效果
4.4、API文檔展示
五、年級(jí)管理功能實(shí)現(xiàn)
5.1、查詢年級(jí)信息【分頁(yè)帶條件】
點(diǎn)擊年級(jí)管理模塊API - /sms/gradeController/getGrades/1/3
GradeController 控制層代碼
@Api(tags = "年級(jí)控制器")
@RestController
@RequestMapping("/sms/gradeController")
public class GradeController {
@Autowired
private GradeService gradeService;
/**
* 分頁(yè)展示數(shù)據(jù)
*/
@ApiOperation("查詢年級(jí)信息,分頁(yè)帶條件")
@GetMapping("/getGrades/{pageNo}/{pageSize}")
public Result getGradeByOpr(
@ApiParam("分頁(yè)查詢頁(yè)碼數(shù)") @PathVariable(value = "pageNo") Integer pageNo, // 頁(yè)碼數(shù)
@ApiParam("分頁(yè)查詢頁(yè)大小") @PathVariable(value = "pageSize") Integer pageSize, // 頁(yè)大小
@ApiParam("分頁(yè)查詢模糊匹配班級(jí)名") String gradeName) {
// 設(shè)置分頁(yè)信息
Page<Grade> page = new Page<>(pageNo, pageSize);
// 調(diào)用服務(wù)層方法,傳入分頁(yè)信息,和查詢的條件
IPage<Grade> pageRs = gradeService.getGradeByOpr(page, gradeName);
return Result.ok(pageRs);
}
}
GradeServiceImpl 業(yè)務(wù)層代碼
@Service
@Transactional
public class GradeServiceImpl extends ServiceImpl<GradeMapper, Grade> implements GradeService {
@Override
public IPage<Grade> getGradeByOpr(Page<Grade> page, String gradeName) {
QueryWrapper<Grade> wrapper = new QueryWrapper<>();
if (!StringUtils.isEmpty(gradeName)) {
wrapper.like("name", gradeName);
}
wrapper.orderByAsc("id");
Page<Grade> gradePage = baseMapper.selectPage(page, wrapper);
return gradePage;
}
}
5.2、添加和修改年級(jí)信息
點(diǎn)擊添加年級(jí)按鈕輸入數(shù)據(jù)執(zhí)行添加API - /sms/gradeController/saveOrUpdateGrade
Controller層代碼
@Api(tags = "年級(jí)控制器")
@RestController
@RequestMapping("/sms/gradeController")
public class GradeController {
@Autowired
private GradeService gradeService;
/**
* 保存或更新信息
*/
@ApiOperation("添加或者修改年級(jí)信息")
@PostMapping("/saveOrUpdateGrade")
public Result saveOrUpdateGrade(@ApiParam("JSON的grade對(duì)象轉(zhuǎn)換后臺(tái)數(shù)據(jù)模型") @RequestBody Grade grade) {
// 調(diào)用服務(wù)層方法,實(shí)現(xiàn)添加或者修改年級(jí)信息
gradeService.saveOrUpdate(grade);
return Result.ok();
}
}
5.3、刪除和批量刪除年級(jí)信息
點(diǎn)擊刪除按鈕API - sms/gradeController/deleteGrade
(這張截圖后面補(bǔ)截的)
Controller層代碼
@Api(tags = "年級(jí)控制器")
@RestController
@RequestMapping("/sms/gradeController")
public class GradeController {
@Autowired
private GradeService gradeService;
/**
* 刪除或批量刪除
*/
@ApiOperation("刪除一個(gè)或者多個(gè)grade信息")
@DeleteMapping("/deleteGrade")
public Result deleteGradeById(@ApiParam("JSON的年級(jí)id集合,映射為后臺(tái)List<Integer>") @RequestBody List<Integer> ids) {
gradeService.removeByIds(ids);
return Result.ok();
}
}
5.4、API文檔展示
六、班級(jí)管理功能實(shí)現(xiàn)
6.1、回顯搜索條件中的年級(jí)選項(xiàng)
點(diǎn)擊班級(jí)管理模塊 - 年級(jí)名稱API - /sms/gradeController/getGrades
控制層
@Api(tags = "年級(jí)控制器")
@RestController
@RequestMapping("/sms/gradeController")
public class GradeController {
@Autowired
private GradeService gradeService;
/**
* 回顯搜索條件中的年級(jí)選項(xiàng)
*/
@ApiOperation("獲取所有Grade信息")
@GetMapping("/getGrades")
public Result getGrades(){
List<Grade> grades = gradeService.getGrades();
return Result.ok(grades);
}
}
業(yè)務(wù)層
@Service
@Transactional
public class GradeServiceImpl extends ServiceImpl<GradeMapper, Grade> implements GradeService {
@Override
public List<Grade> getGrades() {
return baseMapper.selectList(null);
}
}
6.2、查詢班級(jí)信息【分頁(yè)帶條件】
點(diǎn)擊年級(jí)管理模塊API - /sms/clazzController/getClazzsByOpr/1/3
控制層
@Api(tags = "班級(jí)控制器")
@RestController
@RequestMapping("/sms/clazzController")
public class ClazzController {
@Autowired
private ClazzService clazzService;
@ApiOperation("查詢班級(jí)信息,分頁(yè)帶條件")
@GetMapping("/getClazzsByOpr/{pageNo}/{pageSize}")
public Result getClazzsByOpr(@ApiParam("頁(yè)碼數(shù)") @PathVariable("pageNo") Integer pageNo,
@ApiParam("頁(yè)大小") @PathVariable("pageSize") Integer pageSize,
@ApiParam("查詢條件") Clazz clazz) {
//設(shè)置分頁(yè)信息
Page<Clazz> page = new Page<>(pageNo, pageSize);
IPage<Clazz> iPage = clazzService.getClazzsByOpr(page, clazz);
return Result.ok(iPage);
}
}
業(yè)務(wù)層
@Service
@Transactional
public class ClazzServiceImpl extends ServiceImpl<ClazzMapper, Clazz> implements ClazzService {
/**
* 分頁(yè)查詢所有班級(jí)信息【帶條件】
*
* @param clazz
* @return
*/
@Override
public IPage<Clazz> getClazzsByOpr(Page<Clazz> pageParam, Clazz clazz) {
QueryWrapper<Clazz> queryWrapper = new QueryWrapper<>();
if (clazz != null) {
//年級(jí)名稱條件
String gradeName = clazz.getGradeName();
if (!StringUtils.isEmpty(gradeName)) {
queryWrapper.eq("grade_name", gradeName);
}
//班級(jí)名稱條件
String clazzName = clazz.getName();
if (!StringUtils.isEmpty(clazzName)) {
queryWrapper.like("name", clazzName);
}
queryWrapper.orderByAsc("id");
}
Page<Clazz> clazzPage = baseMapper.selectPage(pageParam, queryWrapper);
return clazzPage;
}
}
6.3、添加和修改學(xué)生信息
添加功能API - sms/clazzController/saveOrUpdateClazz
控制層
@Api(tags = "班級(jí)控制器")
@RestController
@RequestMapping("/sms/clazzController")
public class ClazzController {
@Autowired
private ClazzService clazzService;
@ApiOperation("保存或者修改班級(jí)信息")
@PostMapping("/saveOrUpdateClazz")
public Result saveOrUpdateClazz(@ApiParam("JSON轉(zhuǎn)換后端Clazz數(shù)據(jù)模型") @RequestBody Clazz clazz) {
clazzService.saveOrUpdate(clazz);
return Result.ok();
}
}
6.4、刪除和批量刪除班級(jí)信息
刪除功能API - sms/clazzController/deleteClazz
控制層
@Api(tags = "班級(jí)控制器")
@RestController
@RequestMapping("/sms/clazzController")
public class ClazzController {
@Autowired
private ClazzService clazzService;
@ApiOperation("刪除一個(gè)或者多個(gè)班級(jí)信息")
@DeleteMapping("/deleteClazz")
public Result deleteClazzByIds(@ApiParam("多個(gè)班級(jí)id的JSON") @RequestBody List<Integer> ids) {
clazzService.removeByIds(ids);
return Result.ok();
}
}
6.5、API文檔展示
七、學(xué)生管理功能實(shí)現(xiàn)
7.1、回顯搜索條件的班級(jí)選項(xiàng)
點(diǎn)擊教師管理API - sms/clazzController/getClazzs
控制層
@Api(tags = "班級(jí)控制器")
@RestController
@RequestMapping("/sms/clazzController")
public class ClazzController {
@Autowired
private ClazzService clazzService;
@ApiOperation("獲取所有Clazz信息")
@GetMapping("/getClazzs")
public Result getClazzs() {
List<Clazz> list = clazzService.getClazzs();
return Result.ok(list);
}
}
業(yè)務(wù)層
@Service
@Transactional
public class ClazzServiceImpl extends ServiceImpl<ClazzMapper, Clazz> implements ClazzService {
@Override
public List<Clazz> getClazzs() {
return baseMapper.selectList(null);
}
}
7.2、查詢學(xué)生信息【分頁(yè)帶條件】
控制層
@Api(tags = "學(xué)生控制器")
@RestController
@RequestMapping("/sms/studentController")
public class StudentController {
@Autowired
private StudentService studentService;
@ApiOperation("查詢學(xué)生信息,分頁(yè)帶條件")
@GetMapping("/getStudentByOpr/{pageNo}/{pageSize}")
public Result getStudentsByOpr(@ApiParam("頁(yè)碼數(shù)") @PathVariable("pageNo") Integer pageNo,
@ApiParam("頁(yè)大小") @PathVariable("pageSize") Integer pageSize,
@ApiParam("查詢條件轉(zhuǎn)換后端數(shù)據(jù)模型") Student student) {
// 準(zhǔn)備分頁(yè)信息封裝的page對(duì)象
Page<Student> page = new Page<>(pageNo, pageSize);
// 獲取分頁(yè)的學(xué)生信息
IPage<Student> iPage = studentService.getStudentByOpr(page, student);
// 返回學(xué)生信息
return Result.ok(iPage);
}
}
業(yè)務(wù)層
@Service
@Transactional
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {
/**
* 按條件查詢學(xué)生信息【帶分頁(yè)】
*/
public IPage<Student> getStudentByOpr(Page<Student> pageParam, Student student) {
QueryWrapper<Student> queryWrapper = null;
if (student != null) {
queryWrapper = new QueryWrapper<>();
if (student.getClazzName() != null) {
queryWrapper.eq("clazz_name", student.getClazzName());
}
if (student.getName() != null) {
queryWrapper.like("name", student.getName());
}
queryWrapper.orderByAsc("id");
}
//創(chuàng)建分頁(yè)對(duì)象
IPage<Student> pages = baseMapper.selectPage(pageParam, queryWrapper);
return pages;
}
}
7.3、異步圖片上傳處理頭像
Controller層代碼
@Api(tags = "系統(tǒng)控制器")
@RestController
@RequestMapping("/sms/system")
public class SystemController {
@ApiOperation("頭像上傳統(tǒng)一入口")
@PostMapping("/headerImgUpload")
public Result headerImgUpload(@ApiParam("文件二進(jìn)制數(shù)據(jù)") @RequestPart("multipartFile") MultipartFile multipartFile) {
//使用UUID隨機(jī)生成文件名
String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase();
//生成新的文件名字
String filename = uuid.concat(multipartFile.getOriginalFilename());
//生成文件的保存路徑(實(shí)際生產(chǎn)環(huán)境這里會(huì)使用真正的文件存儲(chǔ)服務(wù)器)
String portraitPath = "D:/MyCode/IdeaCode/zhxy/target/classes/public/upload/".concat(filename);
//保存文件
try {
multipartFile.transferTo(new File(portraitPath));
} catch (IOException e) {
e.printStackTrace();
}
String headerImg = "upload/" + filename;
return Result.ok(headerImg);
}
}
7.4、添加和修改和刪除學(xué)生信息
@Api(tags = "學(xué)生控制器")
@RestController
@RequestMapping("/sms/studentController")
public class StudentController {
@ApiOperation("增加學(xué)生信息")
@PostMapping("/addOrUpdateStudent")
public Result addOrUpdateStudent(@RequestBody Student student) {
//對(duì)學(xué)生的密碼進(jìn)行加密
if (!Strings.isEmpty(student.getPassword())) {
student.setPassword(MD5.encrypt(student.getPassword()));
}
//保存學(xué)生信息進(jìn)入數(shù)據(jù)庫(kù)
studentService.saveOrUpdate(student);
return Result.ok();
}
@ApiOperation("刪除一個(gè)或者多個(gè)學(xué)生信息")
@DeleteMapping("/delStudentById")
public Result delStudentById(@ApiParam("多個(gè)學(xué)生id的JSON") @RequestBody List<Integer> ids) {
studentService.removeByIds(ids);
return Result.ok();
}
}
八、教師管理功能實(shí)現(xiàn)
8.1、查詢教師信息【分頁(yè)帶條件】
點(diǎn)擊教師管理API - sms/teacherController/getTeachers/1/3
控制層
@Api(tags = "教師控制器")
@RestController
@RequestMapping("/sms/teacherController")
public class TeacherController {
@Autowired
private TeacherService teacherService;
@ApiOperation("獲取教師信息,分頁(yè)帶條件")
@GetMapping("/getTeachers/{pageNo}/{pageSize}")
public Result getTeachers(@PathVariable Integer pageNo, @PathVariable Integer pageSize, Teacher teacher) {
Page<Teacher> pageParam = new Page<>(pageNo, pageSize);
IPage<Teacher> page = teacherService.getTeachersByOpr(pageParam, teacher);
return Result.ok(page);
}
}
業(yè)務(wù)層
@Service
@Transactional
public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, Teacher> implements TeacherService {
@Override
public IPage<Teacher> getTeachersByOpr(Page<Teacher> pageParam, Teacher teacher) {
QueryWrapper<Teacher> wrapper = new QueryWrapper<>();
if (teacher != null) {
//班級(jí)名稱條件
String clazzName = teacher.getClazzName();
if (!StringUtils.isEmpty(clazzName)) {
wrapper.eq("clazz_name", clazzName);
}
//教師名稱條件
String teacherName = teacher.getName();
if (!StringUtils.isEmpty(teacherName)) {
wrapper.like("name", teacherName);
}
wrapper.orderByAsc("id");
}
Page<Teacher> page = baseMapper.selectPage(pageParam, wrapper);
return page;
}
}
8.2、添加和修改和刪除教師信息
@ApiOperation("添加和修改教師信息")
@PostMapping("/saveOrUpdateTeacher")
public Result saveOrUpdateTeacher(@RequestBody Teacher teacher) {
teacherService.saveOrUpdate(teacher);
return Result.ok();
}
@ApiOperation("刪除一個(gè)或者多個(gè)教師信息")
@DeleteMapping("/deleteTeacher")
public Result deleteTeacher(@RequestBody List<Integer> ids) {
teacherService.removeByIds(ids);
return Result.ok();
}
九、管理員管理功能實(shí)現(xiàn)
9.1、查詢管理員信息【分頁(yè)帶條件】
控制層
@Api(tags = "系統(tǒng)管理員控制器")
@RestController
@RequestMapping("/sms/adminController")
public class AdminController {
@Autowired
private AdminService adService;
@ApiOperation("分頁(yè)獲取所有Admin信息【帶條件】")
@GetMapping("/getAllAdmin/{pageNo}/{pageSize}")
public Result getAllAdmin(@PathVariable Integer pageNo,
@PathVariable Integer pageSize,
String adminName){
Page<Admin> pageParam = new Page<>(pageNo,pageSize);
IPage<Admin> page = adService.getAdmins(pageParam, adminName);
return Result.ok(page);
}
}
業(yè)務(wù)層
@Service
@Transactional
public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements AdminService {
@Override
public IPage<Admin> getAdmins(Page<Admin> pageParam, String adminName) {
QueryWrapper<Admin> queryWrapper = new QueryWrapper<>();
if (!StringUtils.isEmpty(adminName)) {
queryWrapper.like("name", adminName);
}
queryWrapper.orderByAsc("id");
Page page = baseMapper.selectPage(pageParam, queryWrapper);
return page;
}
}
9.2、添加和修改和刪除管理員信息
@ApiOperation("添加或修改Admin信息")
@PostMapping("/saveOrUpdateAdmin")
public Result saveOrUpdateAdmin(@RequestBody Admin admin){
if (!Strings.isEmpty(admin.getPassword())) {
admin.setPassword(MD5.encrypt(admin.getPassword()));
}
adService.saveOrUpdate(admin);
return Result.ok();
}
@ApiOperation("刪除Admin信息")
@DeleteMapping("/deleteAdmin")
public Result deleteAdmin(@RequestBody List<Integer> ids){
adService.removeByIds(ids);
return Result.ok();
}
9.3、管理員修改自己的密碼
@Api(tags = "系統(tǒng)控制器")
@RestController
@RequestMapping("/sms/system")
public class SystemController {
@Autowired
private AdminService adminService;
@Autowired
private StudentService studentService;
@Autowired
private TeacherService teacherService;
@ApiOperation("修改密碼")
@PostMapping("/updatePwd/{oldPwd}/{newPwd}")
public Result updatePwd(@RequestHeader("token") String token,
@PathVariable("oldPwd") String oldPwd,
@PathVariable("newPwd") String newPwd) {
if (JwtHelper.isExpiration(token)) {
// token過(guò)期
return Result.fail().message("token失效");
}
// 通過(guò)token獲取當(dāng)前登錄的用戶id
Long userId = JwtHelper.getUserId(token);
// 通過(guò)token獲取當(dāng)前登錄的用戶類型
Integer userType = JwtHelper.getUserType(token);
// 將明文密碼轉(zhuǎn)換為暗文
oldPwd = MD5.encrypt(oldPwd);
newPwd = MD5.encrypt(newPwd);
if (userType == 1) {
QueryWrapper<Admin> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", userId.intValue()).eq("password", oldPwd);
Admin admin = adminService.getOne(queryWrapper);
if (null != admin) {
admin.setPassword(newPwd);
adminService.saveOrUpdate(admin);
} else {
return Result.fail().message("原密碼輸入有誤!");
}
} else if (userType == 2) {
QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", userId.intValue()).eq("password", oldPwd);
Student student = studentService.getOne(queryWrapper);
if (null != student) {
student.setPassword(newPwd);
studentService.saveOrUpdate(student);
} else {
return Result.fail().message("原密碼輸入有誤!");
}
} else if (userType == 3) {
QueryWrapper<Teacher> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", userId.intValue()).eq("password", oldPwd);
Teacher teacher = teacherService.getOne(queryWrapper);
if (null != teacher) {
teacher.setPassword(newPwd);
teacherService.saveOrUpdate(teacher);
} else {
return Result.fail().message("原密碼輸入有誤!");
}
}
return Result.ok();
}
}
十、畢業(yè)設(shè)計(jì)相關(guān)指導(dǎo)
10.1、開題報(bào)告
1、課題的名稱
- 智慧校園管理系統(tǒng)
- 智能校園管理系統(tǒng)
- 智慧校園云臺(tái)系統(tǒng)
2、設(shè)計(jì)課題的目標(biāo)和意義
- 對(duì)使用者的意義 提高使用者工作效率,遠(yuǎn)程辦公
- 對(duì)企業(yè)或者學(xué)校的意義 精簡(jiǎn)學(xué)校的管理人員,節(jié)約成本,提高效率
- 對(duì)社會(huì)的意義 為教育行業(yè)提供一個(gè)優(yōu)秀的管理解決方案
- 技術(shù)層次的意義 更新項(xiàng)目的使用技術(shù),功能拓展和性能提升更加方便容易
3、預(yù)期目標(biāo)及成果形式
4、 成果的展現(xiàn)形式
項(xiàng)目成果展示+畢業(yè)論文
5、開發(fā)工具和技術(shù)棧
-
操作系統(tǒng)的選擇:開發(fā)者使用Windows10 /11 ,項(xiàng)目運(yùn)行環(huán)境為L(zhǎng)inux.服務(wù)容器使用Tomcat
-
開發(fā)使用的工具
- 前端開發(fā)工具為HbuilderX,配合NodeJS運(yùn)行時(shí)
- 后端開發(fā)工具為Idea,使用maven作為項(xiàng)目構(gòu)建工具
-
數(shù)據(jù)庫(kù)管理系統(tǒng):mysql8作為數(shù)據(jù)庫(kù)服務(wù),同時(shí)配合Navicat/Sqlyog可視化數(shù)據(jù)庫(kù)前端工具
-
相關(guān)框架
- VUE 獨(dú)立開發(fā)前端代碼
- SpringBoot快速搭建后端服務(wù)
- MyBatisPlus快速實(shí)現(xiàn)數(shù)據(jù)操作,同時(shí)優(yōu)化業(yè)務(wù)層代碼
- swagger2快速生成接口文檔,同時(shí)可以幫助接口測(cè)試
- fastjson快速實(shí)現(xiàn)前后端數(shù)據(jù)轉(zhuǎn)換
- commons-fileupload快速實(shí)現(xiàn)文件上傳
6、項(xiàng)目的架構(gòu)模式和開發(fā)模式
- 架構(gòu)模式: MVC三層技術(shù)模型
- 開發(fā)模式:前后端分離的開發(fā)模式
7、進(jìn)度和計(jì)劃
- 需求分析 在導(dǎo)師的指導(dǎo)下,同時(shí)閱讀相關(guān)文獻(xiàn),了解學(xué)校的實(shí)際的管理工作內(nèi)容,同時(shí)接受一些新的管理理念,完成需求調(diào)研
- 數(shù)據(jù)庫(kù)設(shè)計(jì) 在明確需求的情況下,對(duì)數(shù)據(jù)庫(kù)進(jìn)行設(shè)計(jì)
- 資料收集 根據(jù)要應(yīng)用的技術(shù),大量閱讀資料,收集相關(guān)文獻(xiàn),問(wèn)后續(xù)的編碼做準(zhǔn)備
- 接口設(shè)計(jì) 根據(jù)具體的業(yè)務(wù)項(xiàng),開始逐一設(shè)計(jì)接口
- 模塊實(shí)現(xiàn) 具體功能的實(shí)現(xiàn)
- 測(cè)試程序,整理資料,撰寫文檔
8、參考的相關(guān)資料
中國(guó)知網(wǎng): 搜索關(guān)鍵字 校園管理 VUE SpringBoot MyBatisPlus swagger2
10.2、畢設(shè)編寫
目錄
1 論文名稱
2 摘要
3 緒論
4 相關(guān)技術(shù)介紹
5 系統(tǒng)需求分析
6 系統(tǒng)概要設(shè)計(jì)
7 系統(tǒng)各功能模塊的詳細(xì)設(shè)計(jì)
8 系統(tǒng)實(shí)現(xiàn)中關(guān)鍵的問(wèn)題和解決方案
9 系統(tǒng)測(cè)試及實(shí)現(xiàn)效果
10 總結(jié)與展望
11 參考文獻(xiàn)
12 致謝
1、論文名稱
- 名稱不要太短
- 工程類項(xiàng)目且有成果展示可以叫 ***設(shè)計(jì)與實(shí)現(xiàn)
- 如果在理論上有一些建樹,可以叫***理論研究
如:智慧校園云端管理系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)
2、 摘要
- 項(xiàng)目的背景介紹:可以參考開題報(bào)告中,課題的目標(biāo)和意義
- 畢業(yè)設(shè)計(jì)過(guò)程
- 管理類知識(shí)和理論的學(xué)習(xí),引入了互聯(lián)網(wǎng)的管理思維
- 結(jié)合實(shí)際校園工作內(nèi)容,設(shè)計(jì)了那些業(yè)務(wù)
- 具體功能模塊有那些,實(shí)現(xiàn)了那些業(yè)務(wù)
- 本項(xiàng)目的開發(fā)和測(cè)試中遇見的難點(diǎn),遇見的問(wèn)題,以及解決方案
- cookie session問(wèn)題,登錄的失效問(wèn)題,用戶權(quán)限問(wèn)題,數(shù)據(jù)安全問(wèn)題… …
- 成果說(shuō)明:目前項(xiàng)目取得那些成果,完成了那些功能的開發(fā),實(shí)際使用的體驗(yàn)感等
- 關(guān)鍵詞:校園管理 SpringBoot+VUE SpringBoot+MyBatisPlus Swagger2 前后端分離
3、緒論(第一章)
- 論文設(shè)計(jì)的背景和意義 (管理相關(guān)的,互聯(lián)網(wǎng)技術(shù)對(duì)于管理方式的革命性影響)
- 國(guó)內(nèi)外現(xiàn)狀和社會(huì)現(xiàn)狀 (互聯(lián)網(wǎng)技術(shù)在管理方面的應(yīng)用已經(jīng)滲入到各行各業(yè),帶來(lái)了效率的提高,教育行業(yè)也應(yīng)該使用)
- 論文的主要內(nèi)容介紹
本文主要進(jìn)行了互聯(lián)網(wǎng)時(shí)代校園管理的設(shè)計(jì)和實(shí)現(xiàn). 由于… 因此… 本文在深入分析Vue+SpringBoot+MyBatisPlus的技術(shù)前提下,提出了一套校園管理的軟件系統(tǒng)并詳細(xì)闡述了技術(shù)選型和實(shí)現(xiàn)過(guò)程. 需求如何分析的,數(shù)據(jù)庫(kù)如何設(shè)計(jì)的,技術(shù)如何選型的,項(xiàng)目如何搭建的. 過(guò)程是如何開發(fā)的
-
論文的組織結(jié)構(gòu)
- 第一章 緒論 ?
- 第二章 技術(shù)選型 +配合內(nèi)容介紹
- 第三章 系統(tǒng)需求分析
- 第四章 … …
4、核心組件技術(shù)介紹(第二章)
- VUE技術(shù)介紹 歷史 背景 特點(diǎn) 優(yōu)點(diǎn) 原理
- SSM技術(shù)介紹與分析
- SpringBoot技術(shù)介紹
- MyBatisPlus技術(shù)介紹
- Swagger2技術(shù)介紹
- MVC架構(gòu)
- 前后端分離開發(fā)和部署模式
5、系統(tǒng)需求分析(第三章)
-
功能需求分析
- 數(shù)據(jù)庫(kù)的設(shè)計(jì)
- 登錄的控制
- 年級(jí)模塊
- 班級(jí)模塊
- 教師模塊
- 學(xué)生模塊
- 管理員模塊
- 個(gè)人信息管理模塊
- 權(quán)限的控制
-
非功能需求
- 可靠性
- 可擴(kuò)展性
- 易用性
- 其他約束
6、軟件安裝和項(xiàng)目環(huán)境搭建(第四章)
- 系統(tǒng)環(huán)境的準(zhǔn)備
- 軟件的安裝
- 項(xiàng)目的搭建
- 運(yùn)行檢測(cè)
7、系統(tǒng)各功能模塊的實(shí)現(xiàn)(第五章)
例如:驗(yàn)證碼功能的實(shí)現(xiàn)
1、效果截圖
業(yè)務(wù)分析 當(dāng)加載登錄頁(yè)時(shí),前端項(xiàng)目自動(dòng)向后端請(qǐng)求一個(gè)驗(yàn)證碼圖片并展示在頁(yè)面上,后端生成驗(yàn)證碼后響應(yīng)給前端,并將 驗(yàn)證碼圖片上的文本存儲(chǔ)在session中,可以采用時(shí)序圖,流程圖等
2、接口介紹
- 請(qǐng)求方式 GET
- 請(qǐng)求的URI /sms/system/getVerifiCodeImage
- 請(qǐng)求的數(shù)據(jù): none
- 響應(yīng)的數(shù)據(jù): image/jpeg
3、核心代碼實(shí)現(xiàn)
8、系統(tǒng)實(shí)現(xiàn)中關(guān)鍵的問(wèn)題和解決方案(第六章)
- 問(wèn)題1 前后端分離開發(fā),接口文檔和接口測(cè)試問(wèn)題:解決方案是: swagger2
- 問(wèn)題2 cookie和Session控制登錄校驗(yàn)的有效期問(wèn)題:解決方案是:token
- 問(wèn)題3 管理員,教師,學(xué)生三個(gè)身份登錄后權(quán)限不同:解決方案是:根據(jù)用戶類型查詢不同的表格,根據(jù)不同的類型展示不同的頁(yè)面
- 問(wèn)題4 數(shù)據(jù)安全問(wèn)題:解決方案是:MD5加密,密碼的校驗(yàn)在密文狀態(tài)下
- …
9、系統(tǒng)測(cè)試及實(shí)現(xiàn)效果(第七章)
每個(gè)業(yè)務(wù)如何使用swagger2測(cè)試,在這里進(jìn)行介紹
刪除學(xué)生信息測(cè)試
- 請(qǐng)求的URI
- 請(qǐng)求的方式
- 請(qǐng)求要提交的數(shù)據(jù)
- 響應(yīng)的數(shù)據(jù)
swagger2測(cè)試的結(jié)果效果截圖
10、總結(jié)與展望(第八章)
- 夸夸自己和導(dǎo)師 業(yè)務(wù)完整實(shí)現(xiàn),技術(shù)選型新,開發(fā)過(guò)程流暢. 系統(tǒng)的可靠性,擴(kuò)展性,易用性
- 展望未來(lái) 目前項(xiàng)目的設(shè)計(jì)還缺少具體的針對(duì)性,針對(duì)某個(gè)學(xué)校的業(yè)務(wù)工作流程繼續(xù)細(xì)化,繼續(xù)添加功能 打卡,考勤統(tǒng)計(jì),成績(jī)統(tǒng)計(jì)分析… …
11、參考文獻(xiàn)
12、致謝
10.3、答辯PPT編寫
主要包含的內(nèi)容
首頁(yè) 課題+答辯人+指導(dǎo)教師
第二頁(yè) 后面的內(nèi)容
第三頁(yè) 目的和意義
第四頁(yè) 系統(tǒng)的需求
第五頁(yè) 項(xiàng)目的架構(gòu)和技術(shù)棧
第六頁(yè) 系統(tǒng)測(cè)試及實(shí)現(xiàn)效果
第七頁(yè) 總結(jié)和展望文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-404060.html
第八頁(yè) 致謝文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-404060.html
到了這里,關(guān)于Java畢設(shè)項(xiàng)目:智慧校園管理系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!