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

28 KiB
Raw Permalink Blame History

投票系统 API 接口文档

概述

本文档描述了投票系统的所有API接口包括用户管理、投票操作、投票主题管理、管理员功能和文件上传等功能。该API支持GET和POST两种请求方式并支持JSON格式的请求体。

基础信息

  • 基础URL: https://poe.vogov.cn/toupiao/
  • 请求方式: GET / POST
  • 数据格式: JSON
  • 字符编码: UTF-8
  • 跨域支持: 已启用CORS

通用响应格式

所有接口返回统一的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"
}

响应示例 (成功):

{
  "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"
}

响应示例 (成功):

{
  "code": 0,
  "msg": "注册成功",
  "data": {}
}

错误码说明:

错误码 说明
1 账号和密码不能为空
1 请输入正确的手机号、邮箱或微信号
1 密码长度不能少于6位
1 该账号已被注册
1 注册失败,请稍后重试

1.3 获取用户信息

接口描述: 获取当前登录用户的详细信息

请求方式: GET / POST

请求参数:

参数名 类型 必填 说明
act string 操作类型固定值getUserInfo

请求示例:

GET /tapi.php?act=getUserInfo

响应示例 (成功):

{
  "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

响应示例 (成功):

{
  "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"
}

响应示例 (成功):

{
  "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

响应示例 (成功):

{
  "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

响应示例 (成功):

{
  "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]
}

响应示例 (成功):

{
  "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

响应示例 (成功):

{
  "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

响应示例 (成功):

{
  "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

响应示例:

{
  "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不传则返回所有投票统计

响应示例 (指定投票):

{
  "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宽度

响应示例 (成功):

{
  "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)

// 登录示例
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)

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