这个基于SpringBoot+Vue的作家信息管理系统,本质上是一个典型的Java Web全栈项目。它之所以适合作为毕业设计选题,是因为完美覆盖了计算机专业学生需要掌握的几项核心能力:后端业务逻辑开发、前端框架应用、数据库设计以及前后端分离架构的实现。
我在指导本科生毕业设计时发现,这类"信息管理系统"类项目之所以经久不衰,是因为它具备几个独特优势:需求明确但可扩展性强(基础CRUD之外可以加入各种特色功能)、技术栈主流且完整(涵盖当下企业开发的主流框架)、文档资料丰富(遇到问题容易找到解决方案)。而加入"获奖作家"这个具体领域,又使得项目脱离了纯Demo性质,有了实际应用场景。
SpringBoot 2.7.x + MyBatis-Plus的组合是经过深思熟虑的:
数据库选用MySQL 8.0而非5.7版本,原因包括:
Vue 3.x + Element Plus的组合体现了技术前瞻性:
特别值得强调的是axios的二次封装处理:
javascript复制// 典型请求拦截器配置
service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['Authorization'] = 'Bearer ' + getToken()
}
return config
},
error => {
return Promise.reject(error)
}
)
数据库设计特别注意了扩展性:
sql复制CREATE TABLE `author` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '作家姓名',
`gender` char(1) DEFAULT NULL COMMENT '性别',
`birth_date` date DEFAULT NULL COMMENT '出生日期',
`native_place` varchar(100) DEFAULT NULL COMMENT '籍贯',
`awards` json DEFAULT NULL COMMENT '获奖情况',
`biography` text COMMENT '人物简介',
`photo_url` varchar(255) DEFAULT NULL COMMENT '照片URL',
PRIMARY KEY (`id`),
KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键点:使用JSON类型存储获奖信息,既保持结构化又避免过度范式化
采用主子表设计实现作家-作品关系:
java复制// 作家DTO包含作品列表
public class AuthorDTO {
private Long id;
private String name;
private List<LiteraryWork> works;
// 其他字段...
}
// MyBatis-Plus关联查询
@Select("SELECT * FROM literary_work WHERE author_id = #{authorId}")
List<LiteraryWork> selectWorksByAuthorId(Long authorId);
ECharts的集成示例:
vue复制<template>
<div ref="chart" style="width: 600px; height:400px;"></div>
</template>
<script setup>
import * as echarts from 'echarts'
import { onMounted, ref } from 'vue'
const chart = ref(null)
onMounted(() => {
const myChart = echarts.init(chart.value)
myChart.setOption({
// 配置项...
})
})
</script>
Swagger与Knife4j的配合使用:
java复制@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.controller"))
.paths(PathSelectors.any())
.build();
}
}
基于Spring Security的RBAC模型:
java复制@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.antMatchers("/api/author/**").hasAnyRole("ADMIN", "EDITOR")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()));
}
vite.config.js的典型配置:
javascript复制export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
return id.toString().split('node_modules/')[1].split('/')[0]
}
}
}
}
}
})
application.yml关键配置:
yaml复制server:
tomcat:
max-threads: 200
min-spare-threads: 10
spring:
datasource:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
建议突出以下几个方向:
准备这些问题的答案:
我在指导学生答辩时发现,评委最关注的是:你理解自己写的每一行代码吗?遇到问题是怎么解决的?系统有哪些可以继续优化的地方?提前准备这些问题的答案能显著提升答辩表现。