851 lines
32 KiB
Markdown
851 lines
32 KiB
Markdown
|
|
# 社区服务中心综合管理平台 — 系统规划书
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 一、项目概述
|
|||
|
|
|
|||
|
|
### 1.1 项目背景
|
|||
|
|
|
|||
|
|
社区服务中心是基层社会治理的核心枢纽,承担着代理代办、代发代收、代销代购、代开证明、公益服务、民意反映与政策咨询等七大类数十项便民服务。当前业务多依赖纸质台账与人工流转,存在以下痛点:
|
|||
|
|
|
|||
|
|
- **流程不透明**:居民无法实时查询办理进度,需多次跑腿
|
|||
|
|
- **数据孤岛**:各业务线台账独立,无法形成居民画像与数据联动
|
|||
|
|
- **统计困难**:缺乏数字化手段,月度/年度统计依赖人工汇总
|
|||
|
|
- **服务可及性差**:居民需到现场办理,缺少线上渠道
|
|||
|
|
|
|||
|
|
### 1.2 项目目标
|
|||
|
|
|
|||
|
|
建设一套基于 Django 的社区服务中心综合管理平台,实现:
|
|||
|
|
|
|||
|
|
1. **全业务线上化**:七大类服务全部纳入系统管理
|
|||
|
|
2. **流程可追溯**:每笔业务从申请到办结全程留痕
|
|||
|
|
3. **数据一体化**:居民信息统一管理,业务数据互通
|
|||
|
|
4. **统计可视化**:提供多维度数据看板,辅助决策
|
|||
|
|
5. **服务便捷化**:居民可通过微信小程序/网页提交申请、查询进度
|
|||
|
|
|
|||
|
|
### 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 数据模型
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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 数据模型
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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 数据模型
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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 数据模型
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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 数据模型
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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 数据模型
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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 数据模型
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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 数据模型
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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 数据模型
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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 数据模型
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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 风格
|
|||
|
|
- 统一响应格式:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"message": "success",
|
|||
|
|
"data": { }
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- 分页响应格式:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"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)
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
# 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日*
|