# 矿桥东街社区服务器
**Repository Path**: zhao-leo/KQDJ_Server
## Basic Information
- **Project Name**: 矿桥东街社区服务器
- **Description**: #
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2025-03-07
- **Last Updated**: 2026-02-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 矿桥东街社区服务器开发指南(v1.0.0)\[重制版\]
## 工作之前,你需要知道. . .
### 基础条件
1. Linux环境
2. 安装好了Python并且建好了环境 (`python`和`pip`能够正常使用)
3. 安装了make工具方便快速调试 (`sudo apt-get install make`)
4. 安装`Reqable`作为调试工具 (可选) ([官网链接](https://reqable.com/))
5. 阅读了`.env.example`,创建了属于自己的`.env`文件并设置好了环境变量(不要写任何注释)
6. for me : source ../Django/bin/activate
### `make`命令详解
1. 安装相应依赖并设置环境变量
```bash
make setup
```
2. 初始化用户
```bash
USER="USERNAME" PASSWORD="PWD" make init # 支持在.env中设置
```
3. 运行服务
```bash
make # make run 也可以
```
4. 数据库迁移
```bash
make migrate
```
5. 删除缓存
```bash
make clean # 如果你想删库,使用 make cleanall
```
6. 设置环境变量
```bash
make env
```
> `Attention!` 要在根目录下即../KQDJ_Server下运行以上命令
7. `暂时`
```cmd
sudo apt install redis-server
sudo service redis-server start
```
在根目录下先执行celery -A KQTX_backend worker -l info
启用缓存区
### 调试方法
### 创建环境变量
- 如图,首先创建一个名为`Django`(或者你喜欢的其他名字)的集合
- 然后创建名为`BASE_URL`的环境变量,并将`localhost:8000`放入

#### 自动获取token脚本
- 首先在如图位置设置python脚本

- `注意`前期测试采用test接口,test接口脚本如下
```python
from reqable import *
def onRequest(context, request):
return request
def onResponse(context, response):
response.body.jsonify()
# print(response.body['data']['token'])
context.env['TOKEN'] = response.body['data']['token']
return response
```
- 另外在所有需要token校验的位置设置如下脚本
```python
from reqable import *
def onRequest(context, request):
request.headers.add('Authorization', context.env['TOKEN'])
return request
def onResponse(context, response):
return response
```
即可丝滑启动
## When You Woring——开发接口调用规范
### Response接口调用规范
以如下代码为例
```python
class LoginTest(APIView):
def post(self, request):
return CustomResponse(self._login_or_register,request)
```
- `class`后为类名,继承APIView
- `def` 定义api方法,正常逻辑函数写为私有函数,如_login_or_register ,前面加一个`_`
- `CustomResponse`为自定义错误处理和返回相应函数,接受的私有函数要求返回为dict(字典)格式,`CustomResponse`第二个参数为私有函数所需要的参数
- 如果有异常情况让报错终止函数,不需要在主函数中额外返回
### 修饰器调用规范(即token校验函数)
```python
@method_decorator(auth.token_required)
def get(self, request):
openid = request.openid
return CustomResponse(self._get_user_info, openid)
```
- 首先在需要被校验的函数上添加`@method_decorator`
- 在主函数中使用`request.openid`读取到解码之后的openid
- 使用`@method_decorator(auth.token_required(required_permission=[ADMIN_USER, SUPER_USER]))`进行权限控制
### 分页器调用规范
注意:所有列表只要是`多个`请进行分页操作!
- 接口`Url`示例:
`http://localhost:8000/api/user/Adminlist?page=3&page_size=20`
主要是后面的查询参数
- 以下代码为`user/view`的调用示例:
即在查询集后面加上`.paginate(request)`
```python
admin_data = admin_queryset.order_by('-created_at').paginate(request)
```
- 如果是**单个用户**进行查询请使用查询集后加`.serialize()`
如以下示例
```python
user_data = Users.query_manager.self_fliter(openid).serialize()
```
### 每个表单update函数开发和调用规范
#### 开发规范
请注意!我们都将update函数卸载模型类之下的函数
- 如果修改集合为空,请采用`raise`抛出错误,这样才能在`CustomResponse`中正常返回
- 返回最好是`Dict`类型,而且在一切正常情况下不必加上`message`字段,这样可以让代码更**简洁**
- **注意** 图片类型最好单独处理
- 每个模型的`utils.request_proceesor`要单独开发,每个模型不太一样
#### 调用规范
- 传入的data 需要经过`utils.request_proceesor`处理进行,将data进行规范化
- 直接传入处理后的data,调用示例如下
```python
def _adjust_admin_list(self, request, openid):
# 获取表单数据和文件
data = request_proceesor(request)
reply = Users.objects.get(openid=openid).update_user(data=data)
return reply
```
### 传入pk值调用规范
**有一些需要修改和删除需要附上图片的pk主键值**
- 在`DELETE`轮播图时候规范如下:
`http://<>/api/community/banners?pk=9`
- 在**Phone**部分的`DELETE`和`PUT`请求下都需要加入`Url`传参部分,示例如下:
`http://<>/api/community/phone_number?pk=2`
### 更新信息规范
有以下三次更新过程,**源代码**如下
```python
update_types = [
bool(kwargs.get("handle_info")),
bool(kwargs.get("feedback_info")),
bool(kwargs.get("evaluation_info")),
]
```
1. handle_info
这个为管理员第一次处理的信息
2. feedback_info
这个是管理员第二次回访的信息(如果用户勾选需要回访)
3. evaluation_info
用户评价信息通过此来更新
#### `evaluation_info` 评价更新
IMPORTANT!
评价更新接口发送规范:
```json
{
"evaluation_info": "需要评价的数字"
}
```
- "evaluation": "需要评价的数字",为`int`类型
### 获取个人表单规范
执行`GET`获取表单时,我们通过`url`传入参数不同设置不同的获取函数
#### 获取个人对应的所有表单
- 使用`GET`方法
- 请求`http://<>/api/proceed/user_form?page=3&page_size=20`
#### 获取某一表单
- 使用`GET`方法
- 请求`http://<>/api/proceed/user_form?pk=1`*
- `pk`值是该表单的主键值,会在获取总表时候全部返回,相应请求即可
### 获取excel表
#### 请求接口
- 使用`POST`接口,请求接口类似如下:*http://<>/api/proceed/excel_get*
- 请求数据如下:
```json
{
"start_time": "2025-3-12",
"end_time": "2025-5-11"
}
```
- 必须严格按照如上`YYYY-MM-DD`格式,并且要求请求日期符合规范,不可为当天之后的日期
#### 前端解析
- 代码中逻辑如下:
```python
output = BytesIO()
# 创建 HTTP 响应
response = HttpResponse(
output,
content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
)
response["Content-Disposition"] = 'attachment; filename="MainForm_Data.xlsx"'
```
请根据response中相应修改的`type`进行解析
### 微信扫码登录
#### 接口调用原理
参考[微信开放平台](https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html)的文档进行开发
流程图如下:

1. 调用以及重定向接口均在前端完成
2. 前端只需要返回申请成功的`code`即可
3. 获得code后,按照正常wx登录逻辑即可
4. 最后返回前端一个token用于校验
#### 接口调用规范
- 使用`POST`方法,请求api:**http://0.0.0.0:8000/api/user/web_login**
- 请求体格式如下
```json
{
"code": "······"
}
```
### 获取表单状态统计
#### 接口说明
此接口用于获取系统中各种表单的状态数量和类别统计。数据通过后台信号机制自动更新,确保统计数据实时准确。
#### 数据统计内容
- 表单状态统计:未处理、处理中、已处理、待回访的表单数量
- 表单类别统计:物业纠纷类、公共设施维护类、环境卫生与秩序类、邻里矛盾类的表单数量
- 可选择只获取状态统计或只获取类别统计
#### 接口调用规范
- 使用`GET`方法,请求api:**http://<>/api/analysis/status**
- 可选查询参数:
- `status_only=true` 仅返回状态统计
- `category_only=true` 仅返回类别统计
- 不传参数则返回全部统计信息
#### 返回数据格式
```json
{
"message": "获取成功",
"status": {
"unhandled": 10,
"handling": 5,
"handled": 20,
"waiting_callback": 3
},
"categories": {
"物业纠纷类": 12,
"公共设施维护类": 8,
"环境卫生与秩序类": 15,
"邻里矛盾类": 3
}
}
```
### 获取访问量和注册量统计
#### 接口说明
此接口用于获取系统近七天的访问量和用户注册量统计数据。数据每10分钟自动更新一次,确保数据实时性。
#### 数据存储特性
- 存储近七天的访问量和注册量数据,循环覆写
- 前七天数据固定存储,当天数据动态更新
- 当天访问量基于PageView模型字段更新
- 当天注册量使用user/manager下的get_enrollment()函数获取
#### 接口调用规范
- 使用`GET`方法,请求api:**http://<>/api/analysis/view-stats**
- 需要管理员权限,必须在header中包含有效的token
- 无需传入任何参数
#### 返回数据格式
```json
{
"message": "获取成功",
"data": [
{
"date": "05-14",
"view_count": 100,
"enrollment_count": 10,
"is_today": true
},
{
"date": "05-13",
"view_count": 80,
"enrollment_count": 5,
"is_today": false
},
// ... 更多数据
]
}
```