Files
wushu/ht/API_投票.md
2026-03-30 02:35:31 +08:00

1316 lines
28 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 投票系统 API 接口文档
## 概述
本文档描述了投票系统的所有API接口包括用户管理、投票操作、投票主题管理、管理员功能和文件上传等功能。该API支持GET和POST两种请求方式并支持JSON格式的请求体。
## 基础信息
- **基础URL**: `https://poe.vogov.cn/toupiao/`
- **请求方式**: GET / POST
- **数据格式**: JSON
- **字符编码**: UTF-8
- **跨域支持**: 已启用CORS
## 通用响应格式
所有接口返回统一的JSON格式
```json
{
"code": 0,
"msg": "操作成功",
"data": {}
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| code | int | 状态码0表示成功非0表示失败 |
| msg | string | 提示信息 |
| data | object/array | 返回数据,具体内容根据接口而定 |
---
# 数据库结构
## 1. 用户表 (tp_users)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | int(11) | 用户ID主键自增 |
| username | varchar(255) | 用户账号(手机号/邮箱/微信号) |
| password | varchar(255) | 密码(加密存储) |
| irole | tinyint(1) | 角色0:普通用户, 1:管理员) |
| status | tinyint(1) | 状态0:禁用, 1:正常) |
| regtime | datetime | 注册时间 |
| logtime | datetime | 最后登录时间 |
| user_identifier | varchar(100) | 用户标识(可选) |
## 2. 投票主题表 (tp_vote)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | int(11) | 主题ID主键自增 |
| title | varchar(255) | 投票标题 |
| idesc | text | 投票描述 |
| statime | datetime | 开始时间 |
| endtime | datetime | 结束时间 |
| status | tinyint(1) | 状态0:禁用, 1:正常) |
| itype | tinyint(1) | 类型0:单选, 1:多选) |
| maxtime | int(11) | 多选时最多可选几项 |
| addtime | datetime | 创建时间 |
| adduser | int(11) | 创建用户ID |
| iview | int(11) | 查看次数 |
## 3. 投票选项表 (tp_xuan)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | int(11) | 选项ID主键自增 |
| topic_id | int(11) | 所属投票主题ID |
| name | varchar(255) | 选项名称 |
| idesc | text | 选项描述 |
| imgs | varchar(255) | 选项图片 |
| sort | int(11) | 排序值 |
| addtime | datetime | 创建时间 |
| adduser | int(11) | 创建用户ID |
## 4. 投票记录表 (tp_recs)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | int(11) | 记录ID主键自增 |
| topic_id | int(11) | 投票主题ID |
| user_id | int(11) | 用户ID |
| option_id | int(11) | 选项ID |
| vote_time | datetime | 投票时间 |
| ip | varchar(50) | 投票IP |
## 5. 系统日志表 (tp_logs)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | int(11) | 日志ID主键自增 |
| user_id | int(11) | 用户ID |
| action | varchar(50) | 操作类型 |
| idesc | text | 操作描述 |
| ip | varchar(50) | 操作IP |
| logtime | datetime | 操作时间 |
---
# 一、用户API (tapi.php)
**接口地址**: `/tapi.php`
## 1.1 用户登录
**接口描述**: 用户使用账号(手机号/邮箱/微信号)和密码登录系统
**请求方式**: GET / POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值login |
| username | string | 是 | 用户账号,支持手机号、邮箱或微信号 |
| password | string | 是 | 用户密码 |
**请求示例**:
```
POST /tapi.php
Content-Type: application/json
{
"act": "login",
"username": "13800138000",
"password": "123456"
}
```
**响应示例** (成功):
```json
{
"code": 0,
"msg": "登录成功",
"data": {
"id": 1,
"username": "13800138000",
"irole": 0,
"status": 1,
"regtime": "2026-03-27 10:00:00",
"logtime": "2026-03-27 14:30:00",
"user_identifier": "user123"
}
}
```
**错误码说明**:
| 错误码 | 说明 |
|--------|------|
| 1 | 账号和密码不能为空 |
| 1 | 账号或密码错误 |
| 1 | 账号已被禁用,请联系管理员 |
---
## 1.2 用户注册
**接口描述**: 新用户注册账号,支持手机号、邮箱或微信号作为账号
**请求方式**: GET / POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值register |
| username | string | 是 | 用户账号,支持手机号、邮箱或微信号 |
| password | string | 是 | 用户密码长度不少于6位 |
| user_identifier | string | 否 | 用户标识(可选) |
**账号格式要求**:
- **手机号**: 以1开头第二位为3-9共11位数字
- **邮箱**: 标准邮箱格式,如 user@example.com
- **微信号**: 6-20位字母、数字、下划线或连字符
**请求示例**:
```
POST /tapi.php
Content-Type: application/json
{
"act": "register",
"username": "13800138000",
"password": "123456",
"user_identifier": "user123"
}
```
**响应示例** (成功):
```json
{
"code": 0,
"msg": "注册成功",
"data": {}
}
```
**错误码说明**:
| 错误码 | 说明 |
|--------|------|
| 1 | 账号和密码不能为空 |
| 1 | 请输入正确的手机号、邮箱或微信号 |
| 1 | 密码长度不能少于6位 |
| 1 | 该账号已被注册 |
| 1 | 注册失败,请稍后重试 |
---
## 1.3 获取用户信息
**接口描述**: 获取当前登录用户的详细信息
**请求方式**: GET / POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值getUserInfo |
**请求示例**:
```
GET /tapi.php?act=getUserInfo
```
**响应示例** (成功):
```json
{
"code": 0,
"msg": "获取成功",
"data": {
"id": 1,
"username": "13800138000",
"irole": 0,
"status": 1,
"regtime": "2026-03-27 10:00:00",
"logtime": "2026-03-27 14:30:00",
"user_identifier": "user123"
}
}
```
**注意**: 此接口需要用户已登录,否则会返回错误。
---
## 1.4 用户登出
**接口描述**: 用户退出登录清除session
**请求方式**: GET / POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值logout |
**请求示例**:
```
GET /tapi.php?act=logout
```
**响应示例** (成功):
```json
{
"code": 0,
"msg": "登出成功",
"data": {}
}
```
---
## 1.5 更新用户标识
**接口描述**: 更新当前登录用户的标识信息
**请求方式**: GET / POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值updateUserIdentifier |
| user_identifier | string | 否 | 用户标识可选长度不超过100个字符 |
**请求示例**:
```
POST /tapi.php
Content-Type: application/json
{
"act": "updateUserIdentifier",
"user_identifier": "new_identifier"
}
```
**响应示例** (成功):
```json
{
"code": 0,
"msg": "更新成功",
"data": {
"id": 1,
"username": "13800138000",
"irole": 0,
"status": 1,
"regtime": "2026-03-27 10:00:00",
"logtime": "2026-03-27 14:30:00",
"user_identifier": "new_identifier"
}
}
```
**注意**: 此接口需要用户已登录,否则会返回错误。
---
# 二、投票API (vote_api.php)
**接口地址**: `/vote_api.php`
## 2.1 获取投票列表
**接口描述**: 获取投票列表,支持分页和筛选
**请求方式**: GET / POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值getVoteList |
| page | int | 否 | 当前页码默认1 |
| pageSize | int | 否 | 每页记录数默认10 |
| status | int | 否 | 状态筛选,-1表示全部0表示禁用1表示正常 |
| type | int | 否 | 类型筛选,-1表示全部0表示单选1表示多选 |
**请求示例**:
```
GET /vote_api.php?act=getVoteList&page=1&pageSize=10
```
**响应示例** (成功):
```json
{
"code": 0,
"msg": "获取成功",
"data": {
"list": [
{
"id": 1,
"title": "最喜欢的水果",
"idesc": "请选择您最喜欢的水果",
"itype": 0,
"maxtime": 1,
"status": 1,
"iview": 14,
"addtime": "2026-03-25 22:25:46",
"statime": "2026-03-24 22:25:46",
"endtime": "2026-04-01 22:25:46",
"status_text": "进行中",
"status_class": "vote-status-active"
}
],
"pagination": {
"total": 1,
"page": 1,
"pageSize": 10,
"totalPage": 1,
"offset": 0
}
}
}
```
### 投票项字段说明 (VoteItem)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | int | 投票ID |
| title | string | 投票标题 |
| idesc | string | 投票描述 |
| itype | int | 类型0:单选, 1:多选) |
| maxtime | int | 多选时最多可选几项 |
| status | int | 状态0:禁用, 1:正常) |
| iview | int | 查看次数 |
| addtime | string | 创建时间 |
| statime | string | 开始时间 |
| endtime | string | 结束时间 |
| status_text | string | 状态文本(进行中/已结束/未开始/已禁用) |
| status_class | string | 状态样式类 |
### 状态说明
| status_text | status_class | 说明 |
|-------------|--------------|------|
| 进行中 | vote-status-active | 投票正在进行中 |
| 已结束 | vote-status-ended | 投票已结束 |
| 未开始 | vote-status-pending | 投票尚未开始 |
| 已禁用 | vote-status-disabled | 投票已被禁用 |
---
## 2.2 获取投票详情
**接口描述**: 获取投票详情和选项信息
**请求方式**: GET / POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值getVoteDetail |
| id | int | 是 | 投票ID |
**请求示例**:
```
GET /vote_api.php?act=getVoteDetail&id=1
```
**响应示例** (成功):
```json
{
"code": 0,
"msg": "获取成功",
"data": {
"vote": {
"id": 1,
"title": "最喜欢的水果",
"idesc": "请选择您最喜欢的水果",
"itype": 0,
"maxtime": 1,
"status": 1,
"iview": 15,
"addtime": "2026-03-25 22:25:46",
"statime": "2026-03-24 22:25:46",
"endtime": "2026-04-01 22:25:46",
"status_text": "进行中",
"status_class": "vote-status-active"
},
"options": [
{
"id": 1,
"topic_id": 1,
"name": "苹果",
"idesc": "红富士苹果",
"imgs": "",
"sort": 0
},
{
"id": 2,
"topic_id": 1,
"name": "香蕉",
"idesc": "进口香蕉",
"imgs": "",
"sort": 1
}
],
"hasVoted": false,
"userVotes": [],
"canVote": true
}
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| vote | object | 投票详情 |
| options | array | 选项列表 |
| hasVoted | bool | 当前用户是否已投票 |
| userVotes | array | 当前用户已投的选项ID列表 |
| canVote | bool | 是否可以投票 |
### 选项字段说明 (VoteOption)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | int | 选项ID |
| topic_id | int | 所属投票主题ID |
| name | string | 选项名称 |
| idesc | string | 选项描述 |
| imgs | string | 选项图片URL |
| sort | int | 排序值 |
**错误码说明**:
| 错误码 | 说明 |
|--------|------|
| 1 | 参数错误 |
| 1 | 投票不存在 |
---
## 2.3 提交投票
**接口描述**: 提交用户的投票选择
**请求方式**: GET / POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值submitVote |
| topic_id | int | 是 | 投票ID |
| options | array/string | 是 | 选项ID数组或逗号分隔的字符串 |
**请求示例**:
```
POST /vote_api.php
Content-Type: application/json
{
"act": "submitVote",
"topic_id": 1,
"options": [1, 2]
}
```
**响应示例** (成功):
```json
{
"code": 0,
"msg": "投票成功",
"data": {}
}
```
**错误码说明**:
| 错误码 | 说明 |
|--------|------|
| 1 | 请先登录 |
| 1 | 参数错误 |
| 1 | 请至少选择一个选项 |
| 1 | 投票不存在 |
| 1 | 该投票已被禁用 |
| 1 | 该投票尚未开始 |
| 1 | 该投票已经结束 |
| 1 | 您已经参与过该投票 |
| 1 | 最多只能选择 X 项 |
| 1 | 选项不存在 |
| 1 | 提交投票失败 |
**注意**: 此接口需要用户已登录,否则会返回错误。
---
## 2.4 获取投票结果
**接口描述**: 获取投票结果和统计数据
**请求方式**: GET / POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值getVoteResult |
| id | int | 是 | 投票ID |
**请求示例**:
```
GET /vote_api.php?act=getVoteResult&id=1
```
**响应示例** (成功):
```json
{
"code": 0,
"msg": "获取成功",
"data": {
"vote": {
"id": 1,
"title": "最喜欢的水果",
"idesc": "请选择您最喜欢的水果",
"itype": 0,
"maxtime": 1,
"status": 1,
"iview": 15,
"addtime": "2026-03-25 22:25:46",
"statime": "2026-03-24 22:25:46",
"endtime": "2026-04-01 22:25:46"
},
"options": [
{
"id": 1,
"name": "苹果",
"idesc": "红富士苹果",
"imgs": "",
"count": 50,
"percentage": 50
},
{
"id": 2,
"name": "香蕉",
"idesc": "进口香蕉",
"imgs": "",
"count": 30,
"percentage": 30
},
{
"id": 3,
"name": "橙子",
"idesc": "新鲜橙子",
"imgs": "",
"count": 20,
"percentage": 20
}
],
"totalVotes": 100,
"hasVoted": true,
"userVotes": [1]
}
}
```
### 结果选项字段说明 (VoteResultOption)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | int | 选项ID |
| name | string | 选项名称 |
| idesc | string | 选项描述 |
| imgs | string | 选项图片URL |
| count | int | 投票数量 |
| percentage | float | 投票百分比 |
**错误码说明**:
| 错误码 | 说明 |
|--------|------|
| 1 | 参数错误 |
| 1 | 投票不存在 |
| 1 | 暂无投票选项 |
---
## 2.5 获取用户投票记录
**接口描述**: 获取用户参与过的投票记录
**请求方式**: GET / POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值getUserVotes |
| page | int | 否 | 当前页码默认1 |
| pageSize | int | 否 | 每页记录数默认10 |
**请求示例**:
```
GET /vote_api.php?act=getUserVotes&page=1&pageSize=10
```
**响应示例** (成功):
```json
{
"code": 0,
"msg": "获取成功",
"data": {
"list": [
{
"id": 1,
"title": "最喜欢的水果",
"idesc": "请选择您最喜欢的水果",
"itype": 0,
"maxtime": 1,
"status": 1,
"iview": 15,
"addtime": "2026-03-25 22:25:46",
"statime": "2026-03-24 22:25:46",
"endtime": "2026-04-01 22:25:46",
"status_text": "进行中",
"status_class": "vote-status-active"
}
],
"pagination": {
"total": 1,
"page": 1,
"pageSize": 10,
"totalPage": 1,
"offset": 0
}
}
}
```
**注意**: 此接口需要用户已登录,否则会返回错误。
---
# 三、用户API (api/user.php)
**接口地址**: `/api/user.php`
## 3.1 用户登录
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值login |
| username | string | 是 | 用户账号 |
| password | string | 是 | 用户密码 |
---
## 3.2 用户注册
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值register |
| username | string | 是 | 用户账号 |
| password | string | 是 | 用户密码 |
| user_identifier | string | 否 | 用户标识 |
---
## 3.3 用户登出
**请求方式**: GET/POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值logout |
**注意**: 登出后会重定向到首页。
---
## 3.4 获取用户信息
**请求方式**: GET/POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值getUserInfo |
---
## 3.5 更新用户信息(修改密码)
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值updateUserInfo |
| new_password | string | 是 | 新密码 |
| confirm_password | string | 是 | 确认密码 |
---
## 3.6 更新用户标识
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值updateUserIdentifier |
| user_identifier | string | 否 | 用户标识 |
---
# 四、投票操作API (api/vote.php)
**接口地址**: `/api/vote.php`
## 4.1 提交投票
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值submit |
| topic_id | int | 是 | 投票ID |
| options | string | 是 | 选项ID多个用逗号分隔 |
---
## 4.2 检查是否已投票
**请求方式**: GET/POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值checkVoted |
| topic_id | int | 是 | 投票ID |
**响应示例**:
```json
{
"code": 0,
"msg": "查询成功",
"data": {
"hasVoted": true
}
}
```
---
## 4.3 获取投票结果
**请求方式**: GET/POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值getResult |
| topic_id | int | 是 | 投票ID |
---
# 五、投票主题管理API (api/topic.php)
**接口地址**: `/api/topic.php`
**注意**: 大部分接口需要管理员权限
## 5.1 获取投票主题列表
**请求方式**: GET/POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值getList |
| page | int | 否 | 当前页码默认1 |
| page_size | int | 否 | 每页记录数默认10 |
| status | int | 否 | 状态筛选 |
| type | int | 否 | 类型筛选 |
| keyword | string | 否 | 关键词搜索 |
**权限要求**: 管理员
---
## 5.2 获取投票主题详情
**请求方式**: GET/POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值getDetail |
| id | int | 是 | 投票ID |
---
## 5.3 添加投票主题
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值add |
| title | string | 是 | 投票标题 |
| desc | string | 否 | 投票描述 |
| statime | string | 是 | 开始时间 |
| endtime | string | 是 | 结束时间 |
| type | int | 否 | 类型0:单选, 1:多选默认0 |
| maxtime | int | 否 | 多选时最多可选几项默认1 |
| status | int | 否 | 状态默认1 |
**权限要求**: 管理员
---
## 5.4 更新投票主题
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值update |
| id | int | 是 | 投票ID |
| title | string | 是 | 投票标题 |
| desc | string | 否 | 投票描述 |
| statime | string | 是 | 开始时间 |
| endtime | string | 是 | 结束时间 |
| type | int | 否 | 类型 |
| maxtime | int | 否 | 多选时最多可选几项 |
| status | int | 否 | 状态 |
**权限要求**: 管理员
---
## 5.5 删除投票主题
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值delete |
| id | int | 是 | 投票ID |
**权限要求**: 管理员
**注意**: 删除投票主题会同时删除相关的选项和投票记录。
---
## 5.6 获取投票选项
**请求方式**: GET/POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值getOptions |
| topic_id | int | 是 | 投票ID |
---
## 5.7 添加投票选项
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值addOption |
| topic_id | int | 是 | 投票ID |
| name | string | 是 | 选项名称 |
| imgs | string | 否 | 选项图片URL |
| desc | string | 否 | 选项描述 |
| sort | int | 否 | 排序值默认0 |
**权限要求**: 管理员
---
## 5.8 更新投票选项
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值updateOption |
| id | int | 是 | 选项ID |
| name | string | 是 | 选项名称 |
| imgs | string | 否 | 选项图片URL |
| desc | string | 否 | 选项描述 |
| sort | int | 否 | 排序值 |
**权限要求**: 管理员
---
## 5.9 删除投票选项
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值deleteOption |
| id | int | 是 | 选项ID |
**权限要求**: 管理员
**注意**: 删除选项会同时删除相关的投票记录。
---
# 六、管理员API (api/admin.php)
**接口地址**: `/api/admin.php`
**权限要求**: 所有接口都需要管理员权限
## 6.1 添加用户
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值addUser |
| username | string | 是 | 用户名(手机号) |
| password | string | 是 | 密码 |
| role | int | 否 | 角色0:普通用户, 1:管理员默认0 |
---
## 6.2 更新用户信息
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值updateUser |
| id | int | 是 | 用户ID |
| role | int | 否 | 角色 |
| status | int | 否 | 状态 |
---
## 6.3 重置用户密码
**请求方式**: POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值resetPassword |
| id | int | 是 | 用户ID |
| password | string | 是 | 新密码 |
---
## 6.4 获取投票统计数据
**请求方式**: GET/POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值getVoteStats |
| topic_id | int | 否 | 投票ID不传则返回所有投票统计 |
**响应示例** (指定投票):
```json
{
"code": 0,
"msg": "获取成功",
"data": {
"vote": { ... },
"options": [
{
"id": 1,
"name": "苹果",
"count": 50,
"percentage": 50
}
],
"totalVotes": 100,
"participants": [
{
"username": "13800138000",
"vote_time": "2026-03-27 10:00:00",
"ip": "127.0.0.1"
}
]
}
}
```
---
## 6.5 获取系统日志
**请求方式**: GET/POST
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| act | string | 是 | 操作类型固定值getLogs |
| page | int | 否 | 当前页码默认1 |
| page_size | int | 否 | 每页记录数默认20 |
| user_id | int | 否 | 用户ID筛选 |
| action | string | 否 | 操作类型筛选 |
| start_date | string | 否 | 开始日期 |
| end_date | string | 否 | 结束日期 |
---
# 七、文件上传API (api/upload.php)
**接口地址**: `/api/upload.php`
**权限要求**: 需要用户登录
## 7.1 上传图片
**请求方式**: POST (multipart/form-data)
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| image | file | 是 | 图片文件 |
**支持的图片格式**: JPG, PNG, GIF, WEBP
**文件大小限制**: 最大10MB
**图片处理**: 宽度大于1280px的图片会自动调整为1024px宽度
**响应示例** (成功):
```json
{
"code": 0,
"msg": "上传成功",
"data": {
"url": "uploads/img_123456789_20260329.jpg",
"width": 1024,
"height": 768
}
}
```
**错误码说明**:
| 错误码 | 说明 |
|--------|------|
| 1001 | 请先登录 |
| 1002 | 请求方法错误 |
| 1003 | 上传失败 |
| 1004 | 只允许上传JPG、PNG、GIF和WEBP格式的图片 |
| 1005 | 文件大小超过限制最大允许10MB |
| 1006 | 无效的图片文件 |
| 1007 | 不支持的图片格式 |
| 1008 | 文件保存失败 |
---
# 八、跨域支持
本API已启用CORS支持跨域请求。相关响应头
```
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
```
对于OPTIONS预检请求API会直接返回200状态码。
---
# 九、注意事项
1. **Session管理**: 登录成功后服务器会创建session后续请求需要携带session cookie
2. **密码安全**: 密码使用PHP的password_hash()函数加密存储
3. **参数验证**: 所有输入参数都经过安全过滤防止SQL注入和XSS攻击
4. **错误处理**: 所有接口都有完善的错误处理机制,返回明确的错误信息
5. **日志记录**: 重要操作(登录、注册、登出、投票)都会记录到系统日志中
6. **投票限制**: 每个用户对每个投票只能投一次
7. **权限控制**: 管理员接口需要验证用户角色irole=1
---
# 十、使用示例
## JavaScript (Fetch API)
```javascript
// 登录示例
fetch('https://poe.vogov.cn/toupiao/tapi.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
act: 'login',
username: '13800138000',
password: '123456'
}),
credentials: 'include' // 携带cookie
})
.then(response => response.json())
.then(data => {
if (data.code === 0) {
console.log('登录成功', data.data);
} else {
console.error('登录失败', data.msg);
}
});
// 获取投票列表
fetch('https://poe.vogov.cn/toupiao/vote_api.php?act=getVoteList&page=1&pageSize=10', {
credentials: 'include'
})
.then(response => response.json())
.then(data => {
if (data.code === 0) {
console.log('投票列表', data.data.list);
}
});
// 提交投票
fetch('https://poe.vogov.cn/toupiao/vote_api.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
act: 'submitVote',
topic_id: 1,
options: [1, 2]
}),
credentials: 'include'
})
.then(response => response.json())
.then(data => {
if (data.code === 0) {
console.log('投票成功');
}
});
```
## Flutter (Dio)
```dart
import 'package:dio/dio.dart';
final dio = Dio(BaseOptions(
baseUrl: 'https://poe.vogov.cn/toupiao/',
headers: {
'Content-Type': 'application/json',
},
));
// 登录
final response = await dio.post('tapi.php', data: {
'act': 'login',
'username': '13800138000',
'password': '123456',
});
if (response.data['code'] == 0) {
print('登录成功: ${response.data['data']}');
}
// 获取投票列表
final voteResponse = await dio.get('vote_api.php', queryParameters: {
'act': 'getVoteList',
'page': 1,
'pageSize': 10,
});
if (voteResponse.data['code'] == 0) {
final list = voteResponse.data['data']['list'];
print('投票列表: $list');
}
```
---
# 十一、版本历史
- **V1.3** (2026-03-29): 完善API文档添加数据库结构说明添加所有API接口详细文档
- **V1.2** (2026-03-27): 添加了更新用户标识接口,允许用户在登录后更新自己的用户标识
- **V1.1** (2026-03-27): 添加了用户标识字段(user_identifier),允许用户在注册时提供可选的用户标识
- **V1.0** (2026-03-27): 初始版本,提供用户登录、注册、获取用户信息和登出功能
---
*最后更新时间: 2026-03-29*