1. 项目概述
读书笔记共享平台是一个基于SpringBoot+Vue+MySQL技术栈构建的在线学习工具,旨在解决学生群体在知识管理过程中遇到的三大痛点:笔记分散难整理、优质资源难共享、学习交流缺平台。我在开发过程中发现,传统笔记方式(如纸质笔记本或本地文档)存在检索困难、无法多端同步等问题,而现有云笔记工具又缺乏针对学生群体的社交化学习功能。
这个平台最核心的价值在于实现了"记录-整理-分享-互动"的完整闭环。学生可以:
- 使用Markdown或富文本编辑器高效记录笔记
- 通过分类标签和全文检索快速定位内容
- 将优质笔记公开分享给同专业/同课程的同学
- 在笔记下方开展学术讨论和知识点补充
2. 技术架构解析
2.1 前后端分离设计
采用前后端分离架构是经过多方验证的合理选择:
-
前端:Vue 2.x + ElementUI
- 选择Vue而非React/Angular的原因:更平缓的学习曲线适合学生开发者,配套的ElementUI组件库能快速搭建管理后台
- 实测发现:使用Vue CLI 4.x脚手架初始化项目,配合axios处理HTTP请求,开发效率比传统jQuery方式提升40%以上
-
后端:SpringBoot 2.7 + MyBatis-Plus
- 技术选型考量:SpringBoot的自动配置特性大幅简化了SSM框架的整合过程
- 关键配置示例:
yaml复制# application.yml片段 spring: datasource: url: jdbc:mysql://localhost:3306/note_platform?useSSL=false username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath:mapper/*.xml
2.2 数据库设计优化
用户表(user)的密码安全方案
sql复制CREATE TABLE `user` (
`user_id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
`password_hash` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
`salt` varchar(100) COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
安全提示:采用BCryptPasswordEncoder进行密码加密,避免使用MD5等已被破解的算法
笔记表(note)的索引优化
sql复制ALTER TABLE `note` ADD FULLTEXT INDEX `ft_idx_content` (`title`,`content`);
-- 全文检索查询示例
SELECT * FROM note WHERE MATCH(title,content) AGAINST('SpringBoot 原理' IN NATURAL LANGUAGE MODE);
3. 核心功能实现
3.1 多格式笔记编辑
前端采用TinyMCE富文本编辑器与Markdown编辑器双方案:
javascript复制// Vue组件动态切换逻辑
<template>
<el-radio-group v-model="editorType">
<el-radio-button label="richText">富文本</el-radio-button>
<el-radio-button label="markdown">Markdown</el-radio-button>
</el-radio-group>
<tinymce-editor v-if="editorType==='richText'" />
<mavon-editor v-else />
</template>
3.2 智能全文检索
基于Elasticsearch的二次开发方案:
- 安装ES 7.x并配置IK中文分词器
- SpringBoot集成JEST客户端
java复制// 笔记搜索服务实现
public List<NoteVO> searchNotes(String keyword) {
SearchSourceBuilder builder = new SearchSourceBuilder()
.query(QueryBuilders.multiMatchQuery(keyword, "title", "content"));
Search search = new Search.Builder(builder.toString())
.addIndex("note_index")
.build();
return jestClient.execute(search)
.getSourceAsObjectList(NoteVO.class);
}
4. 部署实践指南
4.1 开发环境搭建
- 前端依赖安装:
bash复制npm install --registry=https://registry.npm.taobao.org
- 后端Maven依赖:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
4.2 生产环境部署
Nginx关键配置:
nginx复制server {
listen 80;
server_name note.example.com;
location /api {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
location / {
root /var/www/note-platform/dist;
index index.html;
}
}
5. 踩坑经验分享
5.1 跨域问题解决方案
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST")
.maxAge(3600);
}
}
5.2 大文件上传优化
前端分片上传实现:
javascript复制const chunkSize = 2 * 1024 * 1024; // 2MB
const uploadChunk = (file, chunkIndex) => {
const formData = new FormData();
formData.append('chunk', file.slice(chunkIndex*chunkSize, (chunkIndex+1)*chunkSize));
return axios.post('/api/upload', formData);
}
6. 项目扩展方向
- 移动端适配:基于Uniapp开发跨平台APP
- 知识图谱构建:使用Neo4j建立笔记间的语义关联
- 自动化测试:引入Jest+Mockito实现接口测试覆盖
我在实际部署中发现,当用户量超过500时需要考虑Redis缓存笔记列表,使用Spring Cache注解可以快速实现:
java复制@Cacheable(value = "notes", key = "#category")
public List<Note> getNotesByCategory(String category) {
return noteMapper.selectByCategory(category);
}