1. 项目概述与背景
社区信息管理一直是基层治理中的痛点。传统纸质公告栏更新慢、覆盖范围有限,微信群聊又容易信息混杂。去年我们小区就发生过因为活动通知不到位,导致居民错过重要疫苗接种的情况。为了解决这个问题,我决定开发一个基于Python和Vue的线上社区信息管理平台。
这个平台采用前后端分离架构,前端使用Vue.js构建响应式界面,后端选用Django REST framework提供API服务,数据库采用MySQL 8.0。系统最大的特点是实现了信息的精准推送和双向互动——居民可以订阅自己关心的信息类别,管理员能实时查看信息阅读情况。
2. 技术选型与架构设计
2.1 技术栈决策过程
选择Python+Django+Vue这个技术组合主要基于以下考虑:
-
开发效率:Django自带Admin后台、ORM和认证系统,可以快速搭建管理功能。实测用Django开发一个基础CRUD接口比Spring Boot快3-5倍。
-
社区生态:Vue的组件库丰富(用了Element UI),Python的数据处理库完善(Pandas用于导出报表)。
-
团队适配:成员都有Python基础,Vue学习曲线平缓。
mermaid复制graph TD
A[前端 Vue.js] -->|Axios| B[Nginx]
B -->|反向代理| C[Django REST]
C -->|ORM| D[MySQL]
D -->|主从复制| E[Redis缓存]
2.2 系统架构详解
采用前后端分离的架构设计:
- 前端层:Vue 2.6 + Vue Router + Vuex + Element UI
- 网关层:Nginx做负载均衡和静态资源托管
- 应用层:Django 3.2 + Django REST framework
- 数据层:MySQL 8.0(主从架构)+ Redis缓存
特别在Django中配置了分库路由,将用户数据和业务数据分离存储,避免单表过大。
3. 核心功能实现
3.1 用户认证模块
采用JWT+Refresh Token方案,关键实现点:
python复制# settings.py
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': timedelta(minutes=30),
'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=7),
'JWT_ALLOW_REFRESH': True,
}
# auth.py
def generate_jwt(user):
payload = {
'user_id': user.id,
'exp': datetime.utcnow() + settings.JWT_EXPIRATION_DELTA,
'is_admin': user.is_staff
}
return jwt.encode(payload, settings.SECRET_KEY)
注意:Refresh Token必须HTTPS传输,存储时要做加盐哈希
3.2 活动发布系统
实现富文本编辑和定时发布功能:
- 使用Django-CKEditor集成富文本编辑器
- Celery定时任务处理预约发布
- 活动状态机设计:
python复制class Activity(models.Model):
STATES = (
('draft', '草稿'),
('pending', '待发布'),
('published', '已发布'),
('canceled', '已取消')
)
state = FSMField(default='draft', choices=STATES)
@transition(field=state, source='draft', target='pending')
def submit(self):
pass
@transition(field=state, source='pending', target='published')
def publish(self):
self.pub_date = timezone.now()
4. 性能优化实践
4.1 数据库优化
-
索引策略:
- 用户表的username和phone字段加联合索引
- 活动表的pub_date和community_id加索引
-
查询优化:
python复制# 错误做法:N+1查询 activities = Activity.objects.all() for a in activities: print(a.creator.username) # 正确做法:select_related activities = Activity.objects.select_related('creator').all()
4.2 缓存设计
采用多级缓存策略:
- 热点数据用Redis缓存(如活动列表)
- 使用Django的cache_page装饰器缓存API响应
- 前端用localStorage缓存用户个性化设置
python复制@cache_page(60 * 15)
@api_view(['GET'])
def activity_list(request):
queryset = Activity.objects.filter(
state='published'
).select_related('community')
serializer = ActivitySerializer(queryset, many=True)
return Response(serializer.data)
5. 安全防护措施
5.1 常见漏洞防护
-
XSS防护:
- 前端用vue-sanitize过滤HTML输入
- 后端Django默认开启XSS防护
-
CSRF防护:
- 接口层配置CORS白名单
- 敏感操作要求二次验证
-
SQL注入:
- 坚持使用ORM或参数化查询
- 禁止拼接SQL语句
5.2 数据安全
-
敏感字段加密:
python复制from django.db import models from django_cryptography.fields import encrypt class UserProfile(models.Model): id_card = encrypt(models.CharField(max_length=50)) -
数据库审计:
- 使用Django-Simple-History记录关键模型变更
- 操作日志留存6个月以上
6. 部署方案
6.1 生产环境配置
服务器规格:
- 前端:2核4G ×2(负载均衡)
- 后端:4核8G ×3(Docker集群)
- 数据库:8核16G(主从架构)
使用Docker Compose编排服务:
yaml复制version: '3'
services:
web:
build: .
ports:
- "8000:8000"
depends_on:
- redis
- db
redis:
image: redis:6
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
6.2 监控方案
- Prometheus+Grafana监控系统指标
- Sentry收集前端错误
- Django-Logging-Admin查看操作日志
7. 开发经验总结
-
接口设计规范:
- 遵循RESTful风格
- 响应统一格式:
json复制{ "code": 200, "message": "success", "data": {...}, "timestamp": 1630000000 } -
前后端协作:
- 使用Swagger生成API文档
- 约定枚举值用字符串而非数字
-
性能陷阱:
- Vue的v-for必须加key
- 避免在computed中进行复杂计算
- Django的prefetch_related不宜嵌套过深
这个项目让我深刻体会到,社区系统最重要的是稳定性和易用性。我们通过自动化测试(覆盖率85%+)和灰度发布来保证稳定性,通过用户调研持续优化交互设计。后续计划加入智能推荐算法,根据用户历史行为推荐相关活动。