去年在给计算机系学生做课外辅导时,发现很多同学在课后遇到问题却找不到即时讨论渠道。传统论坛响应慢,微信群聊又容易信息过载。于是萌生了开发一个轻量级课程互助系统的想法,目标是用最精简的技术栈实现实时问答、资料共享和进度追踪三大核心功能。
这个系统前端采用Vue3的组合式API开发,后端基于ThinkPHP8的API模式构建。选择这套技术组合主要考虑三点:首先学生群体对Vue的接受度高,其次ThinkPHP的中文文档完善,最重要的是两者在轻量级应用场景下的性能表现都足够出色。实测在2核4G的服务器上,系统能稳定支撑300人同时在线协作。
采用Vue3+TypeScript+Pinia的技术组合:
<script setup>语法糖简化组件开发typescript复制// 典型API请求封装示例
export const useQuestionStore = defineStore('question', {
actions: {
async fetchHotQuestions() {
const { data } = await axios.get('/api/question/hot')
this.hotList = data.map(item => ({
...item,
// 处理时间显示
createdAt: dayjs(item.created_at).fromNow()
}))
}
}
})
ThinkPHP8采用多应用模式分离业务模块:
code复制app
├── admin // 管理后台
├── api // 主业务接口
└── common // 公共模型
关键设计要点:
php复制// 典型控制器代码
class Question extends BaseController
{
public function hot()
{
$cacheKey = 'hot_questions';
if (!$data = Redis::get($cacheKey)) {
$data = Model::where('status', 1)
->order('view_count desc')
->limit(10)
->select();
Redis::setex($cacheKey, 3600, json_encode($data));
}
return json($data);
}
}
前端使用WebSocket实现消息推送:
typescript复制const socket = new WebSocket(`wss://yourdomain.com/ws?token=${userToken}`)
socket.onmessage = (event) => {
const data = JSON.parse(event.data)
if (data.type === 'new_answer') {
// 更新问题详情页的回答列表
}
}
后端对应使用Workerman处理WS连接:
php复制$worker = new Worker('websocket://0.0.0.0:2346');
$worker->onMessage = function($connection, $data) {
$msg = json_decode($data, true);
if ($msg['type'] === 'heartbeat') {
$connection->send(json_encode(['type' => 'pong']));
}
};
采用分片上传方案解决大文件传输:
重要提示:务必在nginx配置中调整client_max_body_size参数,默认1MB限制会导致大文件上传失败
javascript复制const QuestionDetail = () => import('@/views/QuestionDetail.vue')
html复制<img v-lazy="imageUrl" alt="示例图片">
采用多级缓存方案:
php复制// 中间件示例
class CacheMiddleware
{
public function handle($request, Closure $next)
{
$etag = md5($request->url() . json_encode($request->input()));
if ($request->header('If-None-Match') === $etag) {
return response('', 304);
}
$response = $next($request);
return $response->header('ETag', $etag);
}
}
Docker-compose编排示例:
yaml复制version: '3'
services:
app:
build: .
ports:
- "8000:8000"
depends_on:
- redis
redis:
image: redis:alpine
使用Prometheus监控关键指标:
对应的Grafana监控面板需要关注:
typescript复制const { title } = toRefs(props)
php复制// 错误写法
Model::limit(10)->with('user')->select();
// 正确写法
Model::with('user')->limit(10)->select();
typescript复制function connect() {
const socket = new WebSocket(url)
socket.onclose = () => {
setTimeout(connect, 5000) // 5秒后重连
}
}
这个项目在实际教学中运行了一个学期,峰值时承载了8门课程共计427名学生的使用。最意外的是学生们自发用这个系统组织起了线上自习室,这让我意识到技术工具只要能真正解决痛点,就会自然产生超出设计预期的使用场景。后续计划加入代码片段实时协作功能,这对编程类课程会特别有用。