1. 项目概述
作为一名经历过毕业设计洗礼的开发者,我深知一个完整的SpringBoot项目对计算机专业学生的重要性。这个中药科普知识平台的设计与实现,不仅涵盖了SpringBoot的核心技术栈,还结合了中医药领域的专业知识,是一个典型的"技术+垂直领域"应用案例。
这个平台主要解决三个核心问题:
- 为普通用户提供权威、系统的中药知识科普
- 为中医药爱好者构建交流社区
- 为开发者提供完整的SpringBoot项目实践参考
从技术角度看,项目采用了经典的SpringBoot+MyBatis+MySQL技术栈,并实现了源码开放、文档齐全、远程调试支持等开发者友好特性。特别值得一提的是,项目还提供了"全bao定制"服务(注:应为"全包定制"的谐音表达),这意味着开发者可以根据需求进行深度二次开发。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心需求解析
2.1 功能需求分解
这个中药科普知识平台需要实现以下核心功能模块:
-
用户系统
- 注册/登录(手机号+验证码、账号密码)
- 个人中心(收藏、浏览历史、个人信息管理)
- 权限管理(普通用户、管理员、专家用户)
-
中药知识库
- 中药百科(按功效、科属、性味归经分类)
- 方剂查询(经典方剂组成与功效)
- 药材鉴别(真伪辨别图文指南)
-
互动社区
- 问答系统(用户提问+专家解答)
- 经验分享(用药心得交流)
- 养生资讯(节气养生指南)
-
后台管理
- 内容审核与管理
- 用户行为分析
- 系统监控与日志
2.2 非功能需求考量
-
性能要求
- 首页加载时间<1s
- 支持1000+并发用户
- 数据库查询响应<200ms
-
安全需求
- 防SQL注入
- XSS防护
- 敏感数据加密
-
可维护性
- 清晰的代码注释
- 完善的API文档
- 模块化设计
3. 技术架构设计
3.1 系统架构图
code复制客户端层(Web/App) → 接入层(Nginx) → 应用层(SpringBoot) → 服务层(Redis/MQ) → 数据层(MySQL)
3.2 技术选型解析
-
核心框架
- SpringBoot 2.7.x(平衡新特性与稳定性)
- Spring Security(认证与授权)
- MyBatis-Plus(简化数据库操作)
-
数据库
- MySQL 8.0(关系型数据存储)
- Redis 6.x(缓存与会话管理)
-
前端技术
- Thymeleaf(服务端渲染)
- Bootstrap 5(响应式布局)
- ECharts(数据可视化)
-
辅助工具
- Lombok(简化POJO)
- Swagger(API文档)
- Logback(日志管理)
提示:技术选型时特别考虑了毕业设计的特性——既要有足够的技术深度展示能力,又要控制学习成本,避免过于复杂的新技术。
3.3 项目结构规范
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── tcm/
│ │ ├── config/ # 配置类
│ │ ├── controller/ # 控制器
│ │ ├── service/ # 服务层
│ │ ├── dao/ # 数据访问
│ │ ├── entity/ # 实体类
│ │ ├── util/ # 工具类
│ │ └── TcmApplication.java # 启动类
│ └── resources/
│ ├── static/ # 静态资源
│ ├── templates/ # 模板文件
│ ├── application.yml # 主配置
│ └── mybatis/ # MyBatis映射
└── test/ # 测试代码
4. 核心功能实现
4.1 中药知识模块实现
4.1.1 数据库设计
sql复制CREATE TABLE `herb` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '中药名称',
`alias` varchar(100) DEFAULT NULL COMMENT '别名',
`category` varchar(20) DEFAULT NULL COMMENT '分类',
`flavor` varchar(20) DEFAULT NULL COMMENT '性味',
`meridian` varchar(50) DEFAULT NULL COMMENT '归经',
`efficacy` text COMMENT '功效',
`usage_dosage` text COMMENT '用法用量',
`contraindication` text COMMENT '禁忌',
`picture_url` varchar(255) DEFAULT NULL COMMENT '图片URL',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
FULLTEXT KEY `ft_idx` (`name`,`alias`,`efficacy`) COMMENT '全文索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
4.1.2 核心业务逻辑
java复制@Service
public class HerbServiceImpl implements HerbService {
@Autowired
private HerbMapper herbMapper;
@Override
public Page<HerbVO> searchHerbs(String keyword, Integer pageNum, Integer pageSize) {
Page<Herb> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<Herb> wrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(keyword)) {
// 使用MySQL全文索引搜索
wrapper.apply("MATCH(name,alias,efficacy) AGAINST({0} IN NATURAL LANGUAGE MODE)", keyword);
}
Page<Herb> herbPage = herbMapper.selectPage(page, wrapper);
return herbPage.convert(this::convertToVO);
}
private HerbVO convertToVO(Herb herb) {
HerbVO vo = new HerbVO();
BeanUtils.copyProperties(herb, vo);
// 处理图片URL
if (StringUtils.isNotBlank(herb.getPictureUrl())) {
vo.setPictureUrl(imageService.getFullUrl(herb.getPictureUrl()));
}
return vo;
}
}
4.2 用户认证模块
4.2.1 安全配置
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.antMatchers("/api/expert/**").hasAnyRole("EXPERT", "ADMIN")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()))
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.csrf().disable();
}
}
4.2.2 JWT工具类
java复制public class JwtTokenUtil {
private static final String SECRET = "tcm-platform-secret-key";
private static final long EXPIRATION = 86400000L; // 24小时
public static String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
claims.put("roles", userDetails.getAuthorities().stream()
.map(GrantedAuthority::getAuthority)
.collect(Collectors.toList()));
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
public static boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
return true;
} catch (Exception e) {
log.error("JWT验证失败: {}", e.getMessage());
return false;
}
}
}
5. 特色功能实现
5.1 中药相似性推荐
java复制@Service
public class HerbRecommendServiceImpl implements HerbRecommendService {
@Autowired
private HerbMapper herbMapper;
@Override
public List<HerbVO> recommendSimilarHerbs(Long herbId) {
Herb targetHerb = herbMapper.selectById(herbId);
if (targetHerb == null) {
return Collections.emptyList();
}
// 1. 基于功效文本相似度
List<Herb> allHerbs = herbMapper.selectList(null);
Map<Herb, Double> similarityScores = new HashMap<>();
for (Herb herb : allHerbs) {
if (herb.getId().equals(herbId)) continue;
double score = calculateSimilarity(
targetHerb.getEfficacy(),
herb.getEfficacy());
similarityScores.put(herb, score);
}
// 取相似度最高的5个
return similarityScores.entrySet().stream()
.sorted(Map.Entry.<Herb, Double>comparingByValue().reversed())
.limit(5)
.map(entry -> convertToVO(entry.getKey()))
.collect(Collectors.toList());
}
private double calculateSimilarity(String text1, String text2) {
// 使用余弦相似度算法计算文本相似度
// 实现细节省略...
return 0.8; // 示例值
}
}
5.2 方剂组成分析
java复制public class PrescriptionAnalysisUtil {
public static AnalysisResult analyzeComposition(List<Herb> herbs) {
AnalysisResult result = new AnalysisResult();
// 计算四气五味分布
Map<String, Integer> flavorDist = new HashMap<>();
Map<String, Integer> meridianDist = new HashMap<>();
for (Herb herb : herbs) {
// 分析性味
if (herb.getFlavor() != null) {
String[] flavors = herb.getFlavor().split(",");
for (String f : flavors) {
flavorDist.put(f.trim(), flavorDist.getOrDefault(f.trim(), 0) + 1);
}
}
// 分析归经
if (herb.getMeridian() != null) {
String[] meridians = herb.getMeridian().split(",");
for (String m : meridians) {
meridianDist.put(m.trim(), meridianDist.getOrDefault(m.trim(), 0) + 1);
}
}
}
result.setFlavorDistribution(flavorDist);
result.setMeridianDistribution(meridianDist);
return result;
}
@Data
public static class AnalysisResult {
private Map<String, Integer> flavorDistribution;
private Map<String, Integer> meridianDistribution;
}
}
6. 项目部署与调试
6.1 本地开发环境搭建
-
环境准备
- JDK 1.8+
- Maven 3.6+
- MySQL 8.0
- Redis 6.x
-
数据库初始化
sql复制CREATE DATABASE tcm_platform CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON tcm_platform.* TO 'tcm_user'@'%' IDENTIFIED BY 'Tcm@1234'; FLUSH PRIVILEGES; -
配置文件修改
yaml复制# application-dev.yml spring: datasource: url: jdbc:mysql://localhost:3306/tcm_platform?useSSL=false&serverTimezone=Asia/Shanghai username: tcm_user password: Tcm@1234 redis: host: localhost port: 6379
6.2 远程调试配置
-
IDEA远程调试配置
code复制-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -
SpringBoot启动参数
bash复制nohup java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 \ -jar tcm-platform.jar --spring.profiles.active=prod > app.log 2>&1 & -
调试技巧
- 使用条件断点排查特定用户的问题
- 日志级别动态调整:通过Actuator端点实时修改
bash复制curl -X POST http://localhost:8080/actuator/loggers/com.tcm \ -H "Content-Type: application/json" \ -d '{"configuredLevel":"DEBUG"}'
7. 毕业设计特别注意事项
7.1 论文写作要点
-
技术章节组织建议
- 系统需求分析(功能需求+非功能需求)
- 系统设计(架构设计+数据库设计)
- 关键技术实现(选3-5个核心功能详细说明)
- 系统测试(功能测试+性能测试)
-
图表规范
- 系统架构图(建议使用分层架构图)
- E-R图(标明主要实体关系)
- 核心功能流程图(如用户登录流程)
- 界面效果图(主要页面截图)
7.2 答辩准备建议
-
演示重点
- 用户注册→知识查询→互动交流完整流程
- 后台管理功能展示
- 特色功能演示(如相似药材推荐)
-
常见问题准备
- 为什么选择SpringBoot?
- 系统安全性如何保障?
- 如何保证中药数据的准确性?
- 系统的创新点在哪里?
-
代码展示技巧
- 准备3-5个核心代码片段
- 重点展示:
- 复杂业务逻辑处理
- 性能优化代码
- 安全相关实现
8. 项目扩展方向
-
技术深化
- 接入微信小程序端
- 引入Elasticsearch实现更强大的搜索
- 使用Spring Cloud实现微服务化
-
业务扩展
- 增加中药电商模块
- 开发智能问诊功能
- 添加AR药材识别功能
-
AI结合
- 基于NLP的智能问答
- 药材图像识别
- 个性化养生方案推荐
这个中药科普知识平台项目从技术实现到领域知识应用都颇具价值,特别适合作为计算机相关专业的毕业设计选题。我在实际开发过程中最大的体会是:技术是为业务服务的,在掌握SpringBoot等开发框架的同时,深入了解垂直领域的专业知识同样重要。对于准备做类似项目的同学,建议尽早开始数据收集和整理工作,因为专业领域的数据质量往往决定了项目的最终效果。
