32 KiB
32 KiB
社区服务中心综合管理平台 — 系统规划书
一、项目概述
1.1 项目背景
社区服务中心是基层社会治理的核心枢纽,承担着代理代办、代发代收、代销代购、代开证明、公益服务、民意反映与政策咨询等七大类数十项便民服务。当前业务多依赖纸质台账与人工流转,存在以下痛点:
- 流程不透明:居民无法实时查询办理进度,需多次跑腿
- 数据孤岛:各业务线台账独立,无法形成居民画像与数据联动
- 统计困难:缺乏数字化手段,月度/年度统计依赖人工汇总
- 服务可及性差:居民需到现场办理,缺少线上渠道
1.2 项目目标
建设一套基于 Django 的社区服务中心综合管理平台,实现:
- 全业务线上化:七大类服务全部纳入系统管理
- 流程可追溯:每笔业务从申请到办结全程留痕
- 数据一体化:居民信息统一管理,业务数据互通
- 统计可视化:提供多维度数据看板,辅助决策
- 服务便捷化:居民可通过微信小程序/网页提交申请、查询进度
1.3 项目范围
| 维度 | 范围 |
|---|---|
| 用户群体 | 普通居民(前端申请)、社区网格员(移动端核验)、社区管理员(后台管理)、街道审核员(跨社区审批)、系统管理员(系统运维) |
| 业务域 | 代理代办、代发代收、代销代购、代开证明、公益服务、民意反映、社区治理 |
| 技术栈 | Django 5.x + Django REST Framework + PostgreSQL + Redis + Vue 3 / 微信小程序 |
| 部署方式 | 初期单机部署,后期可容器化上云 |
二、系统架构设计
2.1 总体架构
┌─────────────────────────────────────────────────────────┐
│ 前端展示层 │
│ ┌──────────┐ ┌──────────────┐ ┌───────────────────┐ │
│ │ 管理后台 │ │ 居民小程序 │ │ 数据看板大屏 │ │
│ │ (Vue 3) │ │ (WeChat Mini)│ │ (ECharts) │ │
│ └────┬─────┘ └──────┬───────┘ └────────┬──────────┘ │
└───────┼───────────────┼───────────────────┼─────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────┐
│ API 网关层 │
│ Django REST Framework + JWT Auth │
│ CORS / Rate Limit / API Versioning │
└─────────────────────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 业务逻辑层 (Django) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐ │
│ │代理代办 │ │代发代收 │ │代销代购 │ │代开证明 │ │
│ │模块 │ │模块 │ │模块 │ │模块 │ │
│ └──────────┘ └──────────┘ └──────────┘ └───────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │公益服务 │ │民意反映 │ │社区治理 │ │
│ │模块 │ │模块 │ │模块 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │用户权限 │ │通知消息 │ │数据统计 │ │
│ │模块 │ │模块 │ │模块 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 数据持久层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ PostgreSQL │ │ Redis │ │ MinIO/OSS │ │
│ │ (主数据库) │ │ (缓存/会话) │ │ (文件存储) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────┘
2.2 技术选型与决策记录
| 决策项 | 选型 | 备选方案 | 选择理由 |
|---|---|---|---|
| 后端框架 | Django 5.x + DRF | Flask, FastAPI | 自带 Admin、ORM 成熟、生态丰富、社区业务 CRUD 密集型适合 |
| 数据库 | PostgreSQL 15+ | MySQL, SQLite | JSON 字段支持好、扩展性强、社区版免费 |
| 缓存 | Redis 7+ | Memcached | 支持数据结构丰富,可用于会话、队列、缓存 |
| 前端管理后台 | Vue 3 + Element Plus | React, Ant Design | 国内生态好、组件丰富、上手快 |
| 居民端 | 微信小程序 | H5, 支付宝小程序 | 社区居民微信覆盖率高、无需安装 |
| 文件存储 | MinIO / 阿里云 OSS | 本地磁盘 | 初期 MinIO 自建,后期可迁移云存储 |
| 任务队列 | Celery + Redis | Django-Q, Huey | 生态成熟、支持定时任务、社区文档丰富 |
| 部署 | Docker Compose | K8s, 裸机 | 初期规模小,Docker Compose 足够,后期可平滑迁移 K8s |
2.3 Django 项目结构
community_center/
├── manage.py
├── config/
│ ├── settings/
│ │ ├── base.py
│ │ ├── development.py
│ │ └── production.py
│ ├── urls.py
│ ├── wsgi.py
│ └── celery.py
├── apps/
│ ├── accounts/ # 用户与权限
│ ├── residents/ # 居民信息管理
│ ├── agency/ # 代理代办服务
│ ├── distribution/ # 代发代收服务
│ ├── legal_psych/ # 代销代购(法律与心理援助)
│ ├── certification/ # 代开证明
│ ├── public_service/ # 公益服务
│ ├── feedback/ # 民意反映与政策咨询
│ ├── governance/ # 社区治理
│ ├── notification/ # 通知消息
│ └── statistics/ # 数据统计
├── templates/
├── static/
├── media/
├── requirements/
│ ├── base.txt
│ ├── development.txt
│ └── production.txt
├── docker-compose.yml
├── Dockerfile
└── .env.example
三、功能模块详细设计
3.1 用户与权限模块 (accounts)
3.1.1 用户角色
| 角色 | 主要职责 | 典型权限范围 |
|---|---|---|
| 普通居民 | 浏览服务事项、提交申请、查询进度、评价反馈、提意见建议 | 本人信息、本人申请单、公共服务查询 |
| 社区网格员 | 初步审核申请、上门核验、代填代报、通知领取物资/证明 | 辖区居民信息、待办任务、物资发放登记 |
| 社区管理员 | 事项配置、审批流转、统计报表、志愿者管理、活动发布 | 全部居民数据、审批权限、系统配置 |
| 街道审核员 | 对需上级审批的事项(如低保申请、医疗救助)进行终审 | 跨社区申请单、特殊事项审核 |
| 系统管理员 | 用户管理、角色权限、日志审计、数据备份 | 全部系统功能 |
3.1.2 核心功能
- 用户注册/登录(居民支持微信授权登录)
- 基于 Django Guardian 的对象级权限控制
- 角色分配与权限管理
- 操作日志审计
3.1.3 数据模型
ROLE_CHOICES = [
('resident', '普通居民'),
('grid_worker', '社区网格员'),
('community_admin', '社区管理员'),
('street_auditor', '街道审核员'),
('system_admin', '系统管理员'),
]
class User(AbstractBaseUser):
phone = models.CharField(max_length=11, unique=True)
name = models.CharField(max_length=50)
id_card = models.CharField(max_length=18, blank=True)
role = models.CharField(choices=ROLE_CHOICES)
community = models.ForeignKey('Community')
is_staff = models.BooleanField(default=False)
class Community(models.Model):
name = models.CharField(max_length=100)
address = models.CharField(max_length=300)
contact_phone = models.CharField(max_length=11)
director = models.ForeignKey(User)
3.2 居民信息管理模块 (residents)
3.2.1 核心功能
- 居民档案 CRUD(姓名、身份证、住址、联系方式、家庭成员关系)
- 居民标签体系(低保户、残疾人、退役军人、独居老人等)
- 家庭关系图谱
- 居民信息变更记录
3.2.2 数据模型
class Resident(models.Model):
name = models.CharField(max_length=50)
id_card = models.CharField(max_length=18, unique=True)
gender = models.CharField(choices=GENDER_CHOICES)
birth_date = models.DateField()
phone = models.CharField(max_length=11)
address = models.TextField()
community = models.ForeignKey(Community)
tags = models.ManyToManyField('ResidentTag')
family = models.ForeignKey('Family', null=True)
class ResidentTag(models.Model):
name = models.CharField(max_length=30)
category = models.CharField(choices=TAG_CATEGORY_CHOICES)
class Family(models.Model):
head = models.ForeignKey(Resident)
address = models.TextField()
3.3 代理代办服务模块 (agency)
3.3.1 业务分类与流程
居民提交申请 → 经办人受理 → 审核材料 → 办理/代办 → 结果通知 → 归档
3.3.2 业务子类
| 子类编码 | 业务名称 | 所需材料 | 办理时限 |
|---|---|---|---|
| A01 | 生育服务证代办 | 身份证、结婚证、户口本 | 5个工作日 |
| A02 | 独生子女证代办 | 身份证、户口本、出生证明 | 5个工作日 |
| A03 | 老年优待证代办 | 身份证、照片 | 3个工作日 |
| A04 | 暂住证代办 | 身份证、居住证明 | 5个工作日 |
| A05 | 残疾证代办 | 身份证、医院诊断证明 | 7个工作日 |
| A06 | 最低生活保障金申请 | 身份证、收入证明、困难证明 | 15个工作日 |
| A07 | 困难人员临时救助申请 | 身份证、困难说明 | 10个工作日 |
| A08 | 重残生活困难补助申请 | 身份证、残疾证 | 10个工作日 |
| A09 | 特困人员医疗救助申请 | 身份证、医疗费用清单 | 10个工作日 |
| A10 | 低保/优抚对象租房申请 | 身份证、低保证/优抚证明 | 15个工作日 |
| A11 | 失业/求职登记代理 | 身份证、学历证明 | 3个工作日 |
| A12 | 新生儿登记代理 | 出生证明、父母身份证 | 3个工作日 |
| A13 | 丧偶登记代理 | 身份证、配偶死亡证明 | 3个工作日 |
| A14 | 养犬登记代理 | 身份证、犬只免疫证明 | 5个工作日 |
| A15 | 出租房屋登记代理 | 房产证、租赁合同 | 5个工作日 |
| A16 | 流动人口婚育证明验证 | 身份证、原籍婚育证明 | 3个工作日 |
| A17 | 子女入托/借读证明代办 | 身份证、居住证明 | 3个工作日 |
| A18 | 党团组织关系转接代办 | 身份证、组织关系介绍信 | 5个工作日 |
| A19 | 退休人员医保关系转移代办 | 身份证、退休证明 | 7个工作日 |
| A20 | 退休人员医疗费报销代办 | 身份证、医疗费用清单 | 10个工作日 |
3.3.3 数据模型
class AgencyServiceCategory(models.Model):
code = models.CharField(max_length=10, unique=True)
name = models.CharField(max_length=100)
required_docs = models.JSONField(default=list)
processing_days = models.IntegerField()
description = models.TextField(blank=True)
class AgencyApplication(models.Model):
STATUS_CHOICES = [
('draft', '草稿'),
('submitted', '已提交'),
('accepted', '已受理'),
('processing', '办理中'),
('completed', '已办结'),
('rejected', '已退回'),
]
applicant = models.ForeignKey(Resident)
category = models.ForeignKey(AgencyServiceCategory)
status = models.CharField(choices=STATUS_CHOICES, default='draft')
submitted_at = models.DateTimeField()
accepted_at = models.DateTimeField(null=True)
completed_at = models.DateTimeField(null=True)
handler = models.ForeignKey(User, null=True)
remarks = models.TextField(blank=True)
class AgencyDocument(models.Model):
application = models.ForeignKey(AgencyApplication)
doc_type = models.CharField(max_length=50)
file = models.FileField(upload_to='agency_docs/')
uploaded_at = models.DateTimeField(auto_now_add=True)
class AgencyStatusLog(models.Model):
application = models.ForeignKey(AgencyApplication)
from_status = models.CharField(max_length=20)
to_status = models.CharField(max_length=20)
operator = models.ForeignKey(User)
created_at = models.DateTimeField(auto_now_add=True)
note = models.TextField(blank=True)
3.4 代发代收服务模块 (distribution)
3.4.1 业务子类
| 子类编码 | 业务名称 | 类型 |
|---|---|---|
| D01 | 避孕药具发放 | 代发 |
| D02 | 除"四害"药品代售 | 代售 |
| D03 | 爱心捐赠物品代收 | 代收 |
3.4.2 数据模型
class DistributionCategory(models.Model):
code = models.CharField(max_length=10, unique=True)
name = models.CharField(max_length=100)
dist_type = models.CharField(choices=[('issue', '代发'), ('sell', '代售'), ('collect', '代收')])
class DistributionRecord(models.Model):
category = models.ForeignKey(DistributionCategory)
resident = models.ForeignKey(Resident)
operator = models.ForeignKey(User)
quantity = models.IntegerField()
unit = models.CharField(max_length=10)
record_date = models.DateField()
remarks = models.TextField(blank=True)
class DonationItem(models.Model):
donor_name = models.CharField(max_length=50)
donor_phone = models.CharField(max_length=11)
item_name = models.CharField(max_length=100)
item_count = models.IntegerField()
received_at = models.DateTimeField(auto_now_add=True)
receiver = models.ForeignKey(User)
status = models.CharField(choices=[('received', '已接收'), ('distributed', '已发放')])
3.5 代销代购(法律与心理援助)模块 (legal_psych)
3.5.1 业务子类
| 子类编码 | 业务名称 |
|---|---|
| L01 | 法律援助联系 |
| L02 | 民事调解 |
| L03 | 消费者权益维护 |
| L04 | 心理咨询服务 |
3.5.2 数据模型
class LegalPsychService(models.Model):
SERVICE_TYPE_CHOICES = [
('legal_aid', '法律援助'),
('mediation', '民事调解'),
('consumer_rights', '消费者权益'),
('psychology', '心理咨询'),
]
applicant = models.ForeignKey(Resident)
service_type = models.CharField(choices=SERVICE_TYPE_CHOICES)
description = models.TextField()
status = models.CharField(choices=STATUS_CHOICES)
assigned_counselor = models.ForeignKey('Counselor', null=True)
created_at = models.DateTimeField(auto_now_add=True)
closed_at = models.DateTimeField(null=True)
class Counselor(models.Model):
name = models.CharField(max_length=50)
specialty = models.CharField(max_length=100)
phone = models.CharField(max_length=11)
is_active = models.BooleanField(default=True)
3.6 代开证明模块 (certification)
3.6.1 业务子类
| 子类编码 | 证明类型 |
|---|---|
| C01 | 居住证明 |
| C02 | 残疾证明 |
| C03 | 流动人口证明 |
| C04 | 抚恤金申请证明 |
| C05 | 残疾保障金申请证明 |
| C06 | 子女助学金申请证明 |
| C07 | 减免学费证明 |
3.6.2 数据模型
class CertType(models.Model):
code = models.CharField(max_length=10, unique=True)
name = models.CharField(max_length=100)
template = models.FileField(upload_to='cert_templates/')
required_fields = models.JSONField(default=list)
class CertApplication(models.Model):
applicant = models.ForeignKey(Resident)
cert_type = models.ForeignKey(CertType)
purpose = models.TextField()
status = models.CharField(choices=STATUS_CHOICES)
cert_number = models.CharField(max_length=30, unique=True, null=True)
issued_at = models.DateTimeField(null=True)
issuer = models.ForeignKey(User, null=True)
pdf_file = models.FileField(upload_to='certs/', null=True)
3.7 公益服务模块 (public_service)
3.7.1 业务子类
| 子类编码 | 业务名称 |
|---|---|
| P01 | 志愿者登记 |
| P02 | 志愿服务时间储蓄证明 |
| P03 | 志愿者培训及社区服务安排 |
| P04 | 邻里互助组织 |
| P05 | 书画展/合唱队/秧歌队等兴趣小组 |
| P06 | 棋牌/阅览/健身/聚会设施预约 |
| P07 | 轮椅借用 |
| P08 | 市民学校课程 |
| P09 | 医疗保健服务 |
| P10 | 社区单位资源共享 |
3.7.2 数据模型
class Volunteer(models.Model):
resident = models.ForeignKey(Resident)
registered_at = models.DateField()
skills = models.CharField(max_length=200, blank=True)
total_hours = models.FloatField(default=0)
is_active = models.BooleanField(default=True)
class VolunteerServiceRecord(models.Model):
volunteer = models.ForeignKey(Volunteer)
activity = models.ForeignKey('Activity')
hours = models.FloatField()
date = models.DateField()
verified = models.BooleanField(default=False)
verified_by = models.ForeignKey(User, null=True)
class Activity(models.Model):
title = models.CharField(max_length=200)
activity_type = models.CharField(choices=ACTIVITY_TYPE_CHOICES)
description = models.TextField()
start_time = models.DateTimeField()
end_time = models.DateTimeField()
location = models.CharField(max_length=200)
max_participants = models.IntegerField(null=True)
current_participants = models.IntegerField(default=0)
status = models.CharField(choices=ACTIVITY_STATUS_CHOICES)
organizer = models.ForeignKey(User)
class FacilityBooking(models.Model):
facility = models.ForeignKey('Facility')
resident = models.ForeignKey(Resident)
booking_date = models.DateField()
start_time = models.TimeField()
end_time = models.TimeField()
status = models.CharField(choices=[('pending', '待确认'), ('confirmed', '已确认'), ('cancelled', '已取消')])
class Facility(models.Model):
name = models.CharField(max_length=100)
facility_type = models.CharField(choices=FACILITY_TYPE_CHOICES)
description = models.TextField(blank=True)
is_available = models.BooleanField(default=True)
3.8 民意反映与政策咨询模块 (feedback)
3.8.1 业务子类
| 子类编码 | 业务名称 |
|---|---|
| F01 | 向部门/单位提意见、要求、困难、建议 |
| F02 | 向政府部门咨询政策、办事手续 |
3.8.2 数据模型
class Feedback(models.Model):
FEEDBACK_TYPE_CHOICES = [
('opinion', '意见'),
('demand', '要求'),
('difficulty', '困难'),
('suggestion', '建议'),
('policy_inquiry', '政策咨询'),
('procedure_inquiry', '办事手续咨询'),
]
submitter = models.ForeignKey(Resident)
feedback_type = models.CharField(choices=FEEDBACK_TYPE_CHOICES)
title = models.CharField(max_length=200)
content = models.TextField()
target_department = models.CharField(max_length=100, blank=True)
status = models.CharField(choices=[
('submitted', '已提交'),
('forwarded', '已转交'),
('replied', '已回复'),
('closed', '已关闭'),
])
reply = models.TextField(blank=True)
replier = models.ForeignKey(User, null=True)
created_at = models.DateTimeField(auto_now_add=True)
replied_at = models.DateTimeField(null=True)
3.9 社区治理模块 (governance)
3.9.1 核心功能
- 社区治理目标管理(文明向上、健康安全、生活便利、环境整洁、民主自治)
- "一窗式"服务窗口管理
- 公共服务/公益服务/便民服务整合调度
- 居民自治事务管理
3.9.2 数据模型
class GovernanceGoal(models.Model):
title = models.CharField(max_length=200)
category = models.CharField(choices=[
('civilized', '文明向上'),
('healthy', '健康安全'),
('convenient', '生活便利'),
('clean', '环境整洁'),
('democratic', '民主自治'),
])
description = models.TextField()
target_date = models.DateField()
responsible_person = models.ForeignKey(User)
progress = models.IntegerField(default=0)
status = models.CharField(choices=[('in_progress', '进行中'), ('completed', '已完成')])
class OneWindowService(models.Model):
window_number = models.CharField(max_length=10)
staff = models.ForeignKey(User)
service_categories = models.ManyToManyField(AgencyServiceCategory)
is_active = models.BooleanField(default=True)
class ServiceIntegration(models.Model):
service_type = models.CharField(choices=[
('public', '公共服务'),
('welfare', '公益服务'),
('convenience', '便民服务'),
])
name = models.CharField(max_length=200)
provider = models.CharField(max_length=100)
contact = models.CharField(max_length=11)
description = models.TextField()
3.10 通知消息模块 (notification)
3.10.1 核心功能
- 站内消息推送
- 微信模板消息通知
- 短信通知(对接短信网关)
- 公告管理
3.10.2 数据模型
class Notification(models.Model):
recipient = models.ForeignKey(User)
title = models.CharField(max_length=200)
content = models.TextField()
notification_type = models.CharField(choices=[
('system', '系统通知'),
('business', '业务通知'),
('announcement', '公告'),
])
is_read = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
class Announcement(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
is_pinned = models.BooleanField(default=False)
published_at = models.DateTimeField()
publisher = models.ForeignKey(User)
3.11 数据统计模块 (statistics)
3.11.1 核心功能
- 业务量统计(按类型、时间段、经办人)
- 居民画像分析(年龄分布、标签分布、家庭结构)
- 办理时效分析(平均办理时长、超时率)
- 满意度统计
- 数据导出(Excel/PDF)
3.11.2 实现方式
- 使用 Django ORM 聚合查询 + Celery 定时任务预计算
- 前端 ECharts 可视化
- 关键指标缓存至 Redis,定时刷新
四、数据库设计
4.1 ER 关系概览
Community 1──N User
Community 1──N Resident
Resident 1──N AgencyApplication
Resident 1──N DistributionRecord
Resident 1──N LegalPsychService
Resident 1──N CertApplication
Resident 1──N Feedback
Resident 1──1 Volunteer
Resident N──1 Family
AgencyApplication N──1 AgencyServiceCategory
AgencyApplication 1──N AgencyDocument
AgencyApplication 1──N AgencyStatusLog
Volunteer 1──N VolunteerServiceRecord
Activity 1──N VolunteerServiceRecord
Activity 1──N ActivityRegistration
Facility 1──N FacilityBooking
4.2 公共字段约定
所有业务表均包含以下公共字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| created_at | DateTimeField | 创建时间,auto_now_add |
| updated_at | DateTimeField | 更新时间,auto_now |
| created_by | ForeignKey(User) | 创建人 |
| is_deleted | BooleanField | 逻辑删除标记,default=False |
4.3 索引策略
- 所有外键字段自动建索引
id_card字段建唯一索引status+created_at联合索引(用于按状态筛选+排序)resident_id+created_at联合索引(用于查询某居民的业务记录)
五、接口设计
5.1 API 规范
- 遵循 RESTful 风格
- 统一响应格式:
{
"code": 200,
"message": "success",
"data": { }
}
- 分页响应格式:
{
"code": 200,
"message": "success",
"data": {
"count": 100,
"next": "/api/v1/agency/applications/?page=2",
"previous": null,
"results": [ ]
}
}
5.2 核心 API 列表
| 模块 | 方法 | 路径 | 说明 |
|---|---|---|---|
| 认证 | POST | /api/v1/auth/login/ | 登录 |
| 认证 | POST | /api/v1/auth/wechat/ | 微信授权登录 |
| 认证 | POST | /api/v1/auth/refresh/ | 刷新Token |
| 居民 | GET/POST | /api/v1/residents/ | 居民列表/新增 |
| 居民 | GET/PUT | /api/v1/residents/{id}/ | 居民详情/修改 |
| 代理代办 | GET/POST | /api/v1/agency/applications/ | 申请列表/新增 |
| 代理代办 | GET/PATCH | /api/v1/agency/applications/{id}/ | 申请详情/更新状态 |
| 代理代办 | POST | /api/v1/agency/applications/{id}/accept/ | 受理 |
| 代理代办 | POST | /api/v1/agency/applications/{id}/complete/ | 办结 |
| 代发代收 | GET/POST | /api/v1/distribution/records/ | 发放/收取记录 |
| 法律心理 | GET/POST | /api/v1/legal-psych/services/ | 服务申请列表/新增 |
| 代开证明 | GET/POST | /api/v1/cert/applications/ | 证明申请列表/新增 |
| 代开证明 | POST | /api/v1/cert/applications/{id}/issue/ | 开具证明 |
| 公益服务 | GET/POST | /api/v1/public/activities/ | 活动列表/发布 |
| 公益服务 | POST | /api/v1/public/activities/{id}/register/ | 活动报名 |
| 公益服务 | GET/POST | /api/v1/public/facilities/bookings/ | 设施预约 |
| 民意反映 | GET/POST | /api/v1/feedback/ | 意见/咨询列表/提交 |
| 民意反映 | POST | /api/v1/feedback/{id}/reply/ | 回复 |
| 统计 | GET | /api/v1/statistics/overview/ | 总览数据 |
| 统计 | GET | /api/v1/statistics/agency/ | 代理代办统计 |
| 统计 | GET | /api/v1/statistics/resident-profile/ | 居民画像 |
| 通知 | GET | /api/v1/notifications/ | 通知列表 |
| 公告 | GET | /api/v1/announcements/ | 公告列表 |
5.3 认证与权限
- 管理后台:JWT Token 认证(Access Token 2h + Refresh Token 7d)
- 小程序端:微信 OpenID 关联 + JWT Token
- 权限控制:基于 Django Guardian 的对象级权限
- API 限流:DRF Throttling(匿名 100次/h,认证 1000次/h)
六、非功能性需求
6.1 性能要求
| 指标 | 目标值 |
|---|---|
| API 平均响应时间 | < 200ms |
| 并发用户数 | ≥ 200 |
| 数据库查询 | 单次 < 50ms |
| 文件上传 | 支持 ≤ 20MB |
6.2 安全要求
| 项目 | 措施 |
|---|---|
| 传输安全 | 全站 HTTPS |
| 认证安全 | JWT + 黑名单机制 |
| 数据安全 | 敏感字段加密存储(身份证号等) |
| SQL 注入 | ORM 参数化查询 |
| XSS | 模板自动转义 + CSP 头 |
| CSRF | Django 内置 CSRF 中间件 |
| 日志审计 | 关键操作全量记录 |
| 备份策略 | 每日全量备份 + 实时 WAL 归档 |
6.3 可用性要求
| 指标 | 目标值 |
|---|---|
| 系统可用率 | ≥ 99.5% |
| 故障恢复时间 | < 2h |
| 数据恢复点 | < 1h |
七、部署架构
7.1 初期部署方案(单机 Docker Compose)
# docker-compose.yml 概要
services:
web:
build: .
command: gunicorn config.wsgi:application --bind 0.0.0.0:8000
volumes:
- ./media:/app/media
depends_on:
- db
- redis
environment:
- DATABASE_URL=postgres://...
- REDIS_URL=redis://...
celery-worker:
build: .
command: celery -A config worker -l info
depends_on:
- db
- redis
celery-beat:
build: .
command: celery -A config beat -l info
depends_on:
- redis
db:
image: postgres:15
volumes:
- pgdata:/var/lib/postgresql/data
redis:
image: redis:7-alpine
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./static:/app/static
- ./media:/app/media
volumes:
pgdata:
7.2 后期扩展方案
- 应用层:Docker Swarm / K8s 水平扩展
- 数据库:读写分离 + 连接池 (PgBouncer)
- 缓存:Redis Sentinel 高可用
- 文件存储:迁移至阿里云 OSS
- 监控:Prometheus + Grafana
- 日志:ELK Stack
八、开发计划
8.1 阶段划分
| 阶段 | 内容 | 交付物 |
|---|---|---|
| 第一阶段 | 基础框架搭建 + 用户权限 + 居民管理 | 可运行的基础系统 |
| 第二阶段 | 代理代办 + 代开证明(核心业务) | 核心业务可用 |
| 第三阶段 | 代发代收 + 法律心理 + 公益服务 | 业务全覆盖 |
| 第四阶段 | 民意反映 + 社区治理 + 通知消息 | 功能完善 |
| 第五阶段 | 数据统计 + 小程序端 | 全功能交付 |
| 第六阶段 | 测试优化 + 部署上线 | 生产环境运行 |
8.2 技术债务管理
- 每个阶段结束进行代码审查
- 核心模块单元测试覆盖率 ≥ 80%
- API 集成测试覆盖核心流程
- 性能测试在第五阶段完成后执行
九、风险与应对
| 风险 | 影响 | 概率 | 应对措施 |
|---|---|---|---|
| 居民隐私数据泄露 | 高 | 低 | 加密存储、权限最小化、审计日志 |
| 业务流程变更频繁 | 中 | 高 | 状态机可配置化、模板化证明 |
| 并发量超预期 | 中 | 低 | Redis 缓存、数据库连接池、限流 |
| 微信接口变动 | 低 | 中 | 抽象微信服务层、接口版本化 |
| 第三方短信服务不可用 | 低 | 低 | 多供应商备选、消息队列缓冲 |
十、术语表
| 术语 | 说明 |
|---|---|
| 一窗式服务 | 居民到一个窗口即可办理所有业务的服务模式 |
| 居民标签 | 对居民分类标记,如低保户、残疾人、独居老人等 |
| 时间储蓄 | 志愿者服务时长记录,可用于兑换社区服务 |
| WAL | Write-Ahead Logging,PostgreSQL 事务日志 |
| DRF | Django REST Framework |
| ADR | Architecture Decision Record,架构决策记录 |
文档版本:v1.0 编写日期:2026年5月18日