# 投票系统 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*