版本:1.0.0 | 作者:FlintHub |
功能:把闲置的核心积分存入社区银行,按分段日息计息、随时存取; 利息只记在银行余额里,取款时才动核心积分(减少跨库写)。
定位:社区银行只负责积分 —— 进出全部是核心积分,银行余额只是「积分的一种存储形态」, 与支付、充值、提现无关。
一、功能简介
1.1 前台
| 页面 | 路径 | 说明 |
|---|---|---|
| 社区银行 | /bank |
未开户显示开户卡片;已开户显示余额、当前日息、存取款表单、利率表、最近流水 |
| 我的流水 | /bank/log |
分页列表(每页 LOG_PER_PAGE = 30 条),含时间/类型/金额/余额/备注 |
| 存款排行 | /bank/rank |
公开页,取余额 > 0 的前 RANK_LIMIT = 20 名,前三名有奖牌样式,本人行高亮 |
存取款为同步表单提交(PRG 模式):POST 处理完 → redirect('/bank'),
避免刷新重复提交。所有写操作走核心 Csrf::verifyOrDie()。
1.2 后台(/admin/community-bank)
单页五分区,靠页内 .admin-tabs 互跳(?tab=overview|rates|accounts|log|settings):
| 分区 | 参数 | 说明 |
|---|---|---|
| 总览 | ?tab=overview |
统计卡(账户数 / 存款总额 / 累计存入 / 累计利息 / 冻结数)+ 对账表 |
| 利率 | ?tab=rates |
分段利率档位增删改(min / max / 日利率 %),全量替换保存 |
| 账户 | ?tab=accounts |
账户列表 + 冻结/解冻 + <details> 内嵌手工调账(±余额,只动银行余额) |
| 流水 | ?tab=log |
全站流水(每页 ADMIN_PER_PAGE = 50 条) |
| 设置 | ?tab=settings |
总开关 / 开户费 / 单次最少存入 / 单户余额上限 |
⚠️ 后台所有 markup 必须留在
<main class="admin-content">内 —— 核心表单/按钮/alert 样式 全是.admin-content作用域(admin.css:237-306),放到</main>之后就是「弹出页没有 UI」且零日志。
二、目录结构
plugins/community_bank/
├── plugin.json # 插件清单(5 个钩子 + admin_url=/admin/community-bank)
├── Plugin.php # 主类:建表/迁移、设置、利率、账户、存取、惰性计息、对账、排行
├── FrontController.php # 前台:/bank 首页 / 开户 / 存取 / 流水 / 排行
├── AdminController.php # 后台:五分区 + 4 个写操作(继承 Admin\BaseController)
├── hook/
│ ├── init_after.php # 幂等建表兜底(版本化 marker 门控)
│ ├── route_register.php # 前台路由(6 条)
│ ├── admin_route_register.php # 后台路由(5 条,不写 /admin 前缀)
│ ├── nav_plugin_links.php # 「应用」入口(左栏 + 顶栏,双触发)
│ └── route_after_dispatch.php # ★ 惰性计息(每请求触发 → 零查询短路节流)
├── views/ # 4 个视图:index.php / log.php / rank.php / admin.php
├── assets/ # style.css(前台)/ admin.css(后台)/ script.js(分区切换 + 利率增删行)
├── lang/ # zh / en / zh_tw(各 140 键,键集合与键序零差异)
└── data/ # 独立库 + 建表 marker(自动生成 .htaccess / web.config 防 Web 访问)
三、数据表(插件独立库)
库文件:plugins/community_bank/data/community_bank.sqlite
| 表 | 用途 | 关键字段 |
|---|---|---|
cb_accounts |
账户主表(也是余额台账) | user_id(PK) / balance / total_deposited / last_accrual_at / opened_at / status |
cb_transactions |
银行余额变动流水 | user_id / type / amount(±) / balance_after / memo / created_at |
cb_rates |
分段利率档位 | min_amount / max_amount(-1=上不封顶) / daily_bp(万分之一) / sort_order |
cb_settings |
插件设置 KV | k(PK) / v |
索引(activate() 内、CREATE TABLE 之后建):
idx_cbt_user (user_id, id DESC) / idx_cbt_all (id DESC) / idx_cba_balance (balance DESC)
账户状态:1 正常 | 0 冻结(status <> 1 一律拒绝存取与计息)
流水类型(type 列 → i18n txn_*):
| type | 含义 | amount 符号 |
|---|---|---|
deposit |
存入 | + |
withdraw |
取出 | − |
withdraw_rollback |
取出回滚(补偿) | + |
interest |
利息 | + |
adjust |
管理员调账 | ± |
⚠️ 金额一律以整数积分存储,杜绝浮点误差。 ⚠️ 开户费不写这张表 —— 理由见 §5.4。
默认利率档位(站长拍板口径,seedDefaults() 仅在 cb_rates 空表时写入):
| 存款区间 | 日利率 | bp |
|---|---|---|
0 ~ 999 |
0.08% | 8 |
1000 ~ 4999 |
0.03% | 3 |
≥ 5000 |
0.01% | 1 |
默认设置(Plugin::defaults()):enabled=1 / open_fee=0 / min_deposit=1 / max_balance=0(不限)
四、路由清单
4.1 前台(hook/route_register.php)
| 方法 | 路径 | 鉴权 |
|---|---|---|
| GET | /bank |
登录 |
| POST | /bank/open |
登录 → CSRF |
| POST | /bank/deposit |
登录 → CSRF |
| POST | /bank/withdraw |
登录 → CSRF |
| GET | /bank/log |
登录 |
| GET | /bank/rank |
公开(无需登录) |
4.2 后台(hook/admin_route_register.php,不写 /admin 前缀)
⚠️ 核心已在 admin 分组内注册,插件再写
/admin会 404(规范 §11.22)。plugin.json的admin_url = /admin/community-bank(含前缀),两边拼起来才是最终 URL。
| 方法 | 路径(不含前缀) | 动作 |
|---|---|---|
| GET | /community-bank |
五分区首页(?tab= 切换) |
| POST | /community-bank/rates/save |
利率档位全量保存 |
| POST | /community-bank/settings/save |
设置保存 |
| POST | /community-bank/account/status |
冻结 / 解冻 |
| POST | /community-bank/account/adjust |
手工调账(±) |