作为一名长期从事校园信息化建设的开发者,我最近完成了某高校信息学科部的门户网站重构项目。这个项目采用SpringBoot+Vue的前后端分离架构,旨在解决旧系统存在的三个核心痛点:首先是前后端代码高度耦合导致的维护困难;其次是传统JSP页面渲染模式在移动端适配上的不足;最后是缺乏统一的API管理规范导致接口混乱。
这个3249q版本(内部代号)的网站系统,主要服务于信息学科部的师生群体,包含新闻公告、课程管理、资源下载等核心模块。相比传统校园网站,我们特别强化了移动端适配和权限精细化控制能力。举个例子,教授角色可以发布课程资料,而学生只能下载;管理员能审核新闻,普通用户仅可浏览。
在技术选型阶段,我们对比了三种主流方案:
最终选择方案3基于以下考量:
code复制[前端层] Vue.js + Axios
↑↓ HTTP/HTTPS
[网关层] Nginx反向代理
↑↓ RESTful API
[应用层] SpringBoot + Security
↑↓ JDBC
[数据层] MySQL + Redis缓存
特别说明架构中的三个关键设计点:
采用Maven多模块设计,核心模块包括:
code复制info-college
├── college-common // 公共工具包
├── college-system // 系统管理
├── college-teaching // 教学模块
└── college-gateway // API网关
每个子模块都包含标准的四层结构:
认证流程采用改良版的JWT方案:
权限控制采用RBAC模型,在Spring Security中通过注解实现:
java复制@PreAuthorize("hasRole('TEACHER') or hasRole('ADMIN')")
@PostMapping("/courses")
public Result addCourse(@Valid @RequestBody CourseDTO dto) {
// 课程新增逻辑
}
通过Vue CLI创建项目时推荐配置:
bash复制vue create college-web --preset default
# 手动选择特性:
√ Babel
√ Router
√ Vuex
√ CSS Pre-processors
√ Linter
项目结构优化建议:
code复制src/
├── api/ # 接口封装
├── assets/ # 静态资源
├── components/ # 公共组件
├── router/ # 路由配置
├── store/ # Vuex模块
└── views/ # 页面组件
javascript复制const NewsList = () => import(/* webpackChunkName: "news" */ './views/NewsList.vue')
javascript复制const service = axios.create({
timeout: 10000,
baseURL: process.env.VUE_APP_BASE_API
})
// 请求拦截器
service.interceptors.request.use(config => {
if (store.getters.token) {
config.headers['Authorization'] = 'Bearer ' + getToken()
}
return config
})
// 响应拦截器
service.interceptors.response.use(
response => {
const res = response.data
if (res.code !== 200) {
showError(res.message)
return Promise.reject(new Error(res.message || 'Error'))
}
return res
}
)
用户表采用垂直分表设计:
sql复制-- 基础信息表
CREATE TABLE `sys_user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL COMMENT '学工号',
`password` VARCHAR(100) NOT NULL COMMENT 'BCrypt加密',
`salt` VARCHAR(20) DEFAULT NULL,
`role` ENUM('student','teacher','admin') NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 用户详情表
CREATE TABLE `sys_user_profile` (
`user_id` BIGINT NOT NULL,
`real_name` VARCHAR(50) NOT NULL,
`department` VARCHAR(100) DEFAULT NULL,
`avatar` VARCHAR(255) DEFAULT NULL,
FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
针对新闻列表的高频查询,我们采用以下优化措施:
sql复制ALTER TABLE `cms_news`
ADD INDEX `idx_category_status` (`category_id`, `status`);
sql复制SELECT n.* FROM cms_news n
INNER JOIN (
SELECT id FROM cms_news
WHERE category_id = 1 AND status = 1
ORDER BY publish_time DESC
LIMIT 10000, 10
) AS tmp USING(id);
后端开发环境配置要点:
xml复制<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
采用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
redis:
image: redis:6-alpine
command: redis-server --requirepass ${REDIS_PASSWORD}
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
frontend:
build: ./frontend
ports:
- "80:80"
部署时注意三个关键点:
开发阶段遇到CORS问题时,不要简单使用@CrossOrigin注解,推荐方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST")
.allowCredentials(true)
.maxAge(3600);
}
}
生产环境应该通过Nginx统一处理:
nginx复制location /api/ {
proxy_pass http://backend:8080;
add_header 'Access-Control-Allow-Origin' '$http_origin';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type';
}
当遇到Token失效问题时,建议采用以下处理流程:
对应的Spring Security配置:
java复制@Override
protected void configure(HttpSecurity http) throws Exception {
http.exceptionHandling()
.authenticationEntryPoint((request, response, authException) -> {
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(JSON.toJSONString(
Result.fail(401, "请重新登录")));
});
}
当前系统已经稳定运行三个月,接下来计划从三个维度进行优化:
性能提升:
功能扩展:
监控体系:
这个项目给我的深刻体会是:校园系统的开发不仅要考虑技术实现,更要理解教育场景的特殊性。比如课程模块需要兼容不同学年学期的数据隔离,新闻发布要支持审核工作流,这些业务细节往往比技术难点更值得投入精力。