【XIUNOX插件】用户转账 vv2.0.0 [复制链接]

一级用户组

用户转账 (oulin_transfer)

v2.0.0 · 安全 · 快速 · 实时 · 兼容 XIUNOX 1.1+

用户之间互转积分/金币/RMB 的轻量转账系统——输入用户名或 UID,一键完成,支持手续费率、实时换算、限额控制、每日次数上限、转账记录、转入通知,入口可灵活配置在发现页和个人中心侧边栏。


核心功能

即时转账

输入对方用户名UID 数字,填写金额和可选留言,点击确认即可完成转账。系统通过 CreditsService 原子扣款/加款,失败自动回滚退还。

支持三种积分类型(后台可切换):

类型

字段

说明

积分

credits

站点通用积分

金币

golds

金币系统

RMB

rmbs

人民币余额

手续费系统

后台设置费率(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

同侧边栏开关

直接访问

/?transfer.htm

需登录


技术架构

文件结构

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

数据库

表名

说明

bbs_oulin_transfer_log

转账记录表

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 请求校验 csrf_token

原子事务

扣款 + 加款通过 CreditsService,加款失败自动回滚

输入校验

金额 intval、用户名 trim、留言限 100 字

XSS 防护

模板统一使用 esc_html() / esc_attr(),JS 使用 textContent

自转拦截

不允许给自己转账

每日限额

按自然日 strtotime('today') 统计次数

变量隔离

使用 $transferSettings 避免与其他插件 $settings 冲突

核心依赖

依赖

用途

CreditsService

积分扣减/增加 + 事务回滚

CsrfService

表单提交 CSRF 防护

notify_create()

转账成功通知收款方

DiscoverService

发现页入口注册

setting_get/set

插件配置存取


多语言支持

语言

文件

简体中文

hook/lang_zh_cn_bbs.php

繁体中文

hook/lang_zh_tw_bbs.php

English

hook/lang_en_us_bbs.php

语言包覆盖 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

请登录后查看此内容
最新回复

请先登录后再回复 登录