【XIUNOX插件】竞拍系统 v1.1.0

一级用户组

navgcn_auction 竞拍系统

插件介绍

竞拍系统 是 Xiuno BBS X 的全功能竞拍交易插件,支持发布拍品、积分出价竞拍、一口价购买、保证金机制、虚拟发货和完整的订单交易管理。

核心功能

  • 拍品发布:支持图片上传(最多9张)、分类选择、起拍价/一口价/加价幅度设置、拍卖时间配置、虚拟物品标记

  • 竞拍出价:实时出价、代理出价、自动延长(最后几分钟有出价则延长截止时间)、出价间隔限制

  • 一口价购买:买家可直接以一口价购买,系统即时完成交易扣款、卖家打款、保证金退还,无需额外付款步骤

  • 保证金机制:卖家保证金(按起拍价百分比冻结)、买家参拍保证金(按当前价百分比冻结),拍卖结束/流拍/下架时自动解冻退还

  • 订单管理:完整的订单状态流转(待付款→待发货→待收货→已完成),支持虚拟发货和物流发货,超时未付款自动取消

  • 后台管理:拍品审核、置顶、强制下架,订单管理,保证金记录查看,全局参数配置

  • 发现页集成:自动注册到站点发现页

  • 用户中心:个人中心竞拍入口,我发布的/我参与的/我的订单三个标签页

  • 多语言:简体中文、繁体中文、英文三语支持

  • 定时任务:5分钟自动检查到期拍品、发送结束提醒、处理超时订单

技术架构

维度

说明

插件目录名

navgcn_auction(作者_功能标识 两段格式)

版本

1.1.0

适配系统

Xiuno BBS X 1.1.x

数据表

5张(拍品/出价/订单/保证金/分类),均使用 utf8mb4

前端框架

Bootstrap 5.3 + Tabler Icons

交互方式

前台 htmx 4 + XN.* API;后台原生 JS + Bootstrap

Service 类

NavgcnAuctionService(静态方法模式,通过 model_inc_file.php 注册)

路由注册

前台 index_route_case_end.php + model_route_table_end.php;后台 admin_index_route_case_end.php

发现页注册

discover_register.php(自注册,带 class_exists 守卫)

定时任务

model_cron_5_minutes_end.php

入口 URL

页面

URL

竞拍列表

?auction-list.htm

拍品详情

?auction-detail-{id}.htm

发布拍品

?auction-post.htm

我的竞拍

?auction-my.htm

后台管理

admin/?navgcn_auction-setting.htm

后台拍品管理

admin/?navgcn_auction-items.htm

后台订单管理

admin/?navgcn_auction-orders.htm

后台保证金管理

admin/?navgcn_auction-deposits.htm

文件结构

navgcn_auction/
├── conf.json              # 插件配置(hooks_rank 等)
├── install.php            # 建表 + 默认分类 + 默认配置
├── uninstall.php          # 删表 + 清配置
├── upgrade.php            # 幂等迁移(SHOW COLUMNS + ALTER TABLE)
├── setting.php            # 后台入口重定向
├── discover_register.php  # 发现页自注册
├── icon.png               # 插件图标
├── model/
│   └── NavgcnAuctionService.php  # 核心业务逻辑(静态方法)
├── route/
│   ├── auction.php              # 前台路由
│   └── admin/auction.php        # 后台路由
├── hook/
│   ├── model_inc_file.php           # Service 注册
│   ├── model_route_table_end.php    # 路由表注册
│   ├── index_route_case_end.php     # 前台路由分发
│   ├── admin_index_route_case_end.php # 后台路由分发
│   ├── model_cron_5_minutes_end.php # 定时任务
│   ├── header_link_after.htm        # CSS 注入
│   ├── my_sidebar_nav_credits_before.htm # 个人中心导航
│   ├── lang_zh_cn_bbs.php           # 简体中文
│   ├── lang_zh_tw_bbs.php           # 繁体中文
│   └── lang_en_us_bbs.php           # 英文
├── view/htm/
│   ├── auction_list.htm         # 竞拍列表页
│   ├── auction_detail.htm       # 拍品详情页
│   ├── auction_post.htm         # 发布/编辑拍品页
│   ├── auction_my.htm           # 我的竞拍页
│   ├── admin_setting.htm        # 后台设置页
│   ├── admin_items.htm          # 后台拍品管理页
│   ├── admin_orders.htm         # 后台订单管理页
│   ├── admin_deposits.htm       # 后台保证金记录页
│   └── admin_nav_tabs.inc.htm   # 后台 Tab 导航组件
├── static/
│   ├── js/auction.js            # 倒计时等前端逻辑
│   └── css/auction.css          # 插件样式
└── README.md                    # 本文件

一、conf.json 配置

检查项

结果

必填字段完整(name/brief/version/bbs_version/type

通过

bbs_version1.1(与当前系统 XIUNOX_VERSION=1.1.5 前两位一致)

通过

不含 id/installed/enable 废弃字段

通过

hooks_rank 键名含扩展名且与 hook 文件完全匹配

通过

插件目录名 navgcn_auction 符合两段格式

通过

二、安装/卸载/升级脚本

检查项

结果

install.php 使用 CREATE TABLE IF NOT EXISTS 幂等建表

通过

install.php 所有表使用 DEFAULT CHARSET=utf8mb4

通过

install.php!defined('DEBUG') AND exit('Access Denied'); 开头

通过

install.php 使用 setting_set() 写入默认配置

通过

uninstall.php 使用标准拼写(非 unstall.php

通过

uninstall.php 执行 DROP TABLE IF EXISTS 清理全部5张表

通过

uninstall.php 使用 setting_delete() 清理配置

通过

upgrade.php 使用 SHOW COLUMNS + ALTER TABLE 幂等迁移

通过

upgrade.php!defined('DEBUG') AND exit('Access Denied'); 开头

通过

三、Hook 规范

检查项

结果

所有 PHP hook 以 <?php exit; 开头

通过

所有 .htm hook 以 <?php 开头(非 <?php exit;

通过

hook 目录下无 return; 语句

通过

hook 文件名与源码标记完全匹配

通过

四、安全规范

检查项

结果

所有 POST 表单包含 CsrfService::input()

通过

所有 POST 处理以 CsrfService::check() 开头

通过

setting.php 开头有 $gid != 1 && $gid != 2 AND message(-1, '无权限'); 权限检查

通过

后台路由文件开头有 $gid != 1 && $gid != 2 权限检查

通过

五、输出转义

检查项

结果

esc_textarea() 调用

通过

无裸 htmlspecialchars(全部使用 esc_html/esc_attr/esc_js

通过

六、前端框架

检查项

结果

无 jQuery($().on().ajax()$.fn.*

通过

无 Alpine.js(x-datax-showx-bindx-model

通过

后台无 htmx 属性(hx-post/hx-get/hx-target 等),使用原生 JS + Bootstrap

通过

无 htmx 2.x 旧事件名(htmx:configRequest 等)

通过

static/*.js 中无 <?php 代码

通过

静态资源放 static/js/static/css/ 目录

通过

静态资源引用使用 $conf['view_url'] . '../plugin/...'

通过

七、命名规范

检查项

结果

表名带前缀 navgcn_auction_*

通过

语言键带前缀 navgcn_auction_*

通过

setting 键为 navgcn_auction

通过

hook 内局部变量带前缀($navgcn_auction_*

通过

xn_ / xnx_ 前缀冲突

通过

八、数据库规范

检查项

结果

db_* 函数传表名不含前缀

通过

db_find('user') / db_find_one('user') 绕过核心层

通过

无 SQL 中 SELECT display_name(使用 user_find_by_uids/user_read

通过

九、用户信息

检查项

结果

用户信息使用 user_read()/user_find_by_uids()

通过

模板使用 display_name 而非 username

通过

头像使用原生 <img> 仅限拍品封面图(非用户头像)

通过

十、URL 与路由

检查项

结果

前台 URL 使用 url() / route_url() 生成

通过

后台 URL 使用 route_url() 生成

通过

后台指向前台的链接使用 ../ 前缀

通过

无硬编码 .htm/.html 后缀

通过

十一、Service 与核心类

检查项

结果

Service 通过 hook/model_inc_file.php 注册

通过

Service 调用 CreditsServiceclass_exists 守卫 + include_once

通过

discover_register.php 调用 DiscoverServiceclass_exists 守卫 + include_once

通过

十二、模板规范

检查项

结果

前台模板 include APP_PATH . 'view/htm/header.inc.htm'/footer.inc.htm

通过

后台模板 include ADMIN_PATH . 'view/htm/header.inc.htm'/footer.inc.htm

通过

Card 组件使用 x-card class

通过

无裸 border/border-* 用于卡片装饰(border-primary 用于缩略图选中状态)

通过

十三、其他规则

检查项

结果

global $plugins(前台判断启用使用 plugin_paths_enabled()

通过

kv_delete/kv_set/kv_get 使用(本插件不使用 KV,配置走 setting_get/setting_set

通过

uninstall.php 标准拼写(非 unstall.php

通过

单行注释无 ?> 字符

通过

无覆盖核心路径(conf/xiunophp/lib/admin/ 等)

通过

十四、多语言

检查项

结果

简体中文 lang_zh_cn_bbs.php 完整

通过

繁体中文 lang_zh_tw_bbs.php 同步

通过

英文 lang_en_us_bbs.php 同步

通过


自检结论:全部检查项通过。



竞拍系统 截图

竞拍系统 截图

竞拍系统 截图

竞拍系统 截图

竞拍系统 截图



版本:v1.1.0
适用版本:1.1
开发者:cywxmz

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

请先登录后再回复 登录