用户转账 (oulin_transfer)
v2.0.0 · 安全 · 快速 · 实时 · 兼容 XIUNOX 1.1+
用户之间互转积分/金币/RMB 的轻量转账系统——输入用户名或 UID,一键完成,支持手续费率、实时换算、限额控制、每日次数上限、转账记录、转入通知,入口可灵活配置在发现页和个人中心侧边栏。
核心功能
即时转账
输入对方用户名或 UID 数字,填写金额和可选留言,点击确认即可完成转账。系统通过 CreditsService 原子扣款/加款,失败自动回滚退还。
支持三种积分类型(后台可切换):
类型 | 字段 | 说明 |
|---|---|---|
积分 |
| 站点通用积分 |
金币 |
| 金币系统 |
RMB |
| 人民币余额 |
手续费系统
后台设置费率(0%–100%),付款方额外承担手续费,收款方收到全额。
费率 = 0%:页面顶部显示绿色「✓ 当前免收转账手续费」
费率 > 0%:页面顶部显示蓝色「 转账手续费 7%,从付款方额外扣除,对方收到全额」
输入金额后,金额下方实时换算三行数据:
┌──────────────────────────────────┐
│ 手续费 7 积分 │
│ 实际扣除 107 积分 │
│ 对方收到 100 积分 │
└──────────────────────────────────┘
快捷金额
金额输入框下方提供 5 个胶囊按钮,一键填充:
10 · 50 · 100 · 500 · 1000
️ 限额控制
配置项 | 说明 | 默认 |
|---|---|---|
最低转账金额 | 低于此金额拒绝转账 | 1 |
最高转账金额 | 0 表示不限制 | 0 |
每日转账次数 | 0 表示不限制,按自然日统计 | 0 |
转账记录
右侧面板展示当前用户的全部转账流水,支持三栏筛选:
全部:转出 + 转入
转出:我付款的记录(红色
-100)转入:我收款的记录(绿色
+100)
每条记录显示:对方用户名首字母彩色头像 · 留言摘要 · 时间 · 手续费(仅转出)。分页浏览,每页 20 条。
转入通知
转账成功后,系统通过 notify_create() 向收款方发送站内通知:
张三 向您转账 100 金币:红包
收款方在通知中心点击即可跳转到转账页面。
页面美化(v2.0.0)
组件 | 效果 |
|---|---|
余额卡片 | 蓝紫渐变背景 + 装饰图标 + 大号数字 |
表单输入 | 聚焦光晕 + 悬停上浮 |
提交按钮 | hover 上浮 + 提交时 loading 旋转动画 |
手续费计算框 | 圆角卡片 + 虚线分隔 + 滑入动画 |
记录列表 | 首字母彩色头像(8 色哈希) |
移动端 | 自适应单列布局 |
页面预览
┌─ 用户转账 ──────────────────────────────────────────────┐
│ 安全 · 快速 · 实时 │
│ 转账手续费 7%,从付款方额外扣除,对方收到全额 │
├─────────────────────────────────────────────────────────┤
│ ┌─ 当前余额 ──────────────────────────── 🪙 ─┐ │
│ │ 500 积分 │ 渐变│
│ └───────────────────────────────────────────────┘ │
│ │
│ 收款用户 [输入用户名或UID] │
│ │
│ 转账金额 (积分) │
│ [ 100 ] ← 大号输入 + 聚焦光晕 │
│ [10] [50] [100] [500] [1000] ← 快捷金额按钮 │
│ ┌──────────────────────────────────────┐ │
│ │ 手续费 7 积分 │ ← 实时换算 │
│ │ 实际扣除 107 积分 │ │
│ │ 对方收到 100 积分 │ │
│ └──────────────────────────────────────┘ │
│ │
│ 转账留言 [选填,对方可见,最多100字] │
│ │
│ [ 确认转账 ] ← hover 上浮 + loading │
│ │
│ ── 转账记录 ── │
│ [全部] [转出] [转入] │
│ [张] ↑ 张三 -100 积分 │
│ 红包 · 08-06 01:35 · 手续费 7 │
│ [李] ↓ 李四 +50 积分 │
│ 谢谢 · 08-06 10:20 │
└─────────────────────────────────────────────────────────┘
后台设置
路径:管理后台 → 插件管理 → 用户转账 → 设置
配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
启用转账功能 | 开关 | 开 | 总开关,关闭后前台不可用 |
转账积分类型 | 下拉 | 金币 | 积分 / 金币 / RMB |
最低转账金额 | 数字 | 1 | 防刷分门槛 |
最高转账金额 | 数字 | 0 | 0 表示不限制 |
手续费率(%) | 数字 | 0 | 0–100,付款方承担 |
每日转账次数上限 | 数字 | 0 | 0 表示不限制 |
在发现页显示入口 | 开关 | 开 | 独立控制 |
在个人中心侧边栏显示入口 | 开关 | 开 | 独立控制 |
入口位置
入口 | 位置 | 条件 |
|---|---|---|
发现页 | 首页 → 发现 → 功能网格 | 后台开启「发现页入口」 |
侧边栏 | 个人中心 → 资产 → 转账 | 后台开启「侧边栏入口」 |
移动端 | 个人中心移动端 tab | 同侧边栏开关 |
直接访问 |
| 需登录 |
技术架构
文件结构
plugin/oulin_transfer/
├── conf.json # 插件元信息 v2.0.0
├── icon.png # 插件图标 (128×128 PNG)
├── install.php # 建表 + 默认设置
├── setting.php # 后台路由入口
├── uninstall.php # 卸载清理
├── discover_register.php # 发现页注册
├── readme.md # 本文档
├── model/
│ └── TransferService.php # 核心服务(设置/转账/记录/通知)
├── route/
│ └── transfer.php # 前台路由(GET 渲染 / POST 转账)
├── admin/route/
│ └── oulin_transfer.php # 后台设置保存
├── view/htm/
│ ├── transfer.htm # 前台转账页面
│ └── setting.htm # 后台设置页面
├── static/
│ ├── transfer.css # 样式(渐变卡片/快捷金额/动画/移动端)
│ └── transfer.js # 交互(快捷金额/手续费计算/提交loading)
└── hook/
├── index_route_case_end.php # 前台路由注册
├── admin_index_route_case_end.php # 后台路由注册
├── model_inc_file.php # Service 自动加载
├── my_sidebar_nav_credits_before.htm # 侧边栏入口(PC)
├── my_sidebar_nav_credits_before_mobile.htm # 侧边栏入口(移动端)
├── lang_zh_cn_bbs.php # 简体中文
├── lang_zh_tw_bbs.php # 繁体中文
└── lang_en_us_bbs.php # English
数据库
表名 | 说明 |
|---|---|
| 转账记录表 |
CREATE TABLE oulin_transfer_log (
id int unsigned AUTO_INCREMENT,
from_uid int unsigned, -- 付款方 UID
to_uid int unsigned, -- 收款方 UID
credits_type varchar(20), -- 积分类型
amount int, -- 转账金额(不含手续费)
fee int, -- 手续费
message varchar(255), -- 留言
create_time int unsigned, -- 时间戳
PRIMARY KEY (id),
KEY from_uid (from_uid),
KEY to_uid (to_uid),
KEY create_time (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
转账流程
用户提交表单
↓
CSRF 校验
↓
收款方用户存在? → 否 → 错误提示
↓ 是
是否自转? → 是 → 错误提示
↓ 否
金额有效? → 否 → 错误提示
↓ 是
每日次数超限? → 是 → 错误提示
↓ 否
金额在限额范围内? → 否 → 错误提示
↓ 是
计算手续费
↓
CreditsService::sub(付款方) → 失败 → 余额不足提示
↓ 成功
CreditsService::add(收款方) → 失败 → 回滚付款方扣款
↓ 成功
写入转账记录
↓
notify_create() 通知收款方
↓
返回成功
安全机制
机制 | 说明 |
|---|---|
CSRF 防护 | 所有 POST 请求校验 |
原子事务 | 扣款 + 加款通过 |
输入校验 | 金额 |
XSS 防护 | 模板统一使用 |
自转拦截 | 不允许给自己转账 |
每日限额 | 按自然日 |
变量隔离 | 使用 |
核心依赖
依赖 | 用途 |
|---|---|
| 积分扣减/增加 + 事务回滚 |
| 表单提交 CSRF 防护 |
| 转账成功通知收款方 |
| 发现页入口注册 |
| 插件配置存取 |
多语言支持
语言 | 文件 |
|---|---|
简体中文 |
|
繁体中文 |
|
English |
|
语言包覆盖 63 个键,包括前端 UI、错误提示、后台设置、通知消息等所有文本。
常见问题
Q: 手续费怎么计算? A: 手续费 = ⌈金额 × 费率%⌉(向上取整),由付款方额外承担,收款方收到全额。
Q: 转账失败了钱会丢吗? A: 不会。doTransfer() 使用原子操作,扣款成功但加款失败时自动回滚退还。
Q: 可以同时支持积分和金币转账吗? A: 同一时间只能选一种类型(后台设置),但可以随时切换。
Q: 每日次数上限怎么算的? A: 按自然日(strtotime('today'))统计用户的转出次数。
Q: 管理员转账有次数限制吗? A: 每日限额对所有用户一视同仁。如需豁免可设为 0(不限制)。
更新日志
v2.0.0 (2026-08-06) — 大版本升级
公告优化:费率=0 绿色「免收手续费」,费率>0 蓝色费率公告,始终可见
页面美化:渐变余额卡片、快捷金额按钮、表单聚焦增强、提交 loading 动画、记录首字母彩色头像
新增功能:每日转账次数上限(后台可配,按自然日统计)
静态资源:新增
transfer.css+transfer.js,独立文件化管理兼容性修复:
url()三参数 bug 全部清除、$settings变量名冲突修复(改用$transferSettings)
v1.2.0
公告位置移至标题下方
移除手动公告,改为自动生成费率提示
v1.1.0
修复后台按钮文字、tab 链接、分页链接 bug
新增转账费率公告、转入提醒通知、插件图标(PNG)
v1.0.0
初始版本

版本:vv2.0.0
适用版本:1.1
开发者:oulin
