官方不提供现金交易,线下交易风险自担,请仔细鉴别!
duoduo_cardshop 自助发卡商城
XiunoX(Xiuno BBS 4.x 定制版)自助发卡商城插件,支持商品管理、卡密自动发放、站内通知 + 邮件通知、积分扣费(credits/golds/rmbs)。
功能
商品管理:商品名称、描述、价格、库存、排序、上架/下架、商品图片(本地上传或外链 URL)
卡密管理:批量添加卡密(每行一张)、查看、删除
自动发卡:购买后自动分配卡密、扣费、生成订单
站内通知:购买成功后通过
notify_create发送站内通知,通知中心显示具体购买摘要邮件通知:可选,配置 SMTP 后给买家邮箱发购买详情邮件
积分扣费:支持新版积分体系 credits/golds/rmbs 三种货币类型
商城首页:
Hero Banner(渐变 + 装饰图标)
商城公告(后台可配,每行一条)
推荐商品网格(16:9 图片卡片 + 入场动画 + hover 上浮 + 红色价格)
服务保障横条(极速发货/安全支付/卡密保障/客服支持/售后无忧)
导航入口:顶部导航栏图标按钮(仅图标,hover 显示 title)
文件结构
duoduo_cardshop/
├── conf.json # 插件元信息
├── icon.png # 插件图标(256x256)
├── install.php # 安装:建表 + image 字段兼容 ALTER
├── uninstall.php # 卸载
├── setting.php # 后台设置 + 商品/卡密保存逻辑
├── route/
│ └── duoduo_cardshop.php # 前台路由(list/detail/buy/my/orders)
├── model/
│ └── DuoduoCardShopService.php # 业务层(商品/卡密/订单/通知/邮件/图片)
├── hook/
│ ├── notify_types_register.php # 注册 cardshop 通知类型 + message_callback
│ ├── header_nav_user_menu_before.htm # 顶部导航图标入口
│ └── lang_zh_cn_bbs.php # 前台语言包
├── lang/zh-cn/
│ └── bbs_admin.php # 后台语言包
├── view/htm/
│ ├── shop_list.htm # 商城首页(Hero+公告+商品+服务保障)
│ ├── shop_detail.htm # 商品详情
│ ├── my_cards.htm # 我的卡密
│ ├── my_orders.htm # 我的订单
│ └── setting.htm # 后台设置页
└── static/css/
└── style.css # 商城样式(dcl-* 类)
安装
将插件目录放到站点
plugin/duoduo_cardshop/后台访问
管理 → 插件,安装并启用 duoduo_cardshop后台访问
插件设置 → 发卡商城:设置货币名称(默认「金币」)
选择扣费类型(credits/golds/rmbs)
是否在导航栏显示入口
商城公告(每行一条,显示在商城首页公告区)
在「商品管理」添加商品并上传图片
在「卡密管理」给商品批量添加卡密
后台入口
后台设置页:
http://xxx.xx/admin/?plugin-setting-duoduo_cardshop.htm需要管理员二次密码验证(XiunoX 后台安全机制,普通登录后还要再输一次密码)
通过 tab 切换:基本设置 / 商品管理 / 卡密管理
前台入口
商城首页:
/duoduo_cardshop.htm商品详情:
/duoduo_cardshop-detail-{goods_id}.htm我的订单:
/duoduo_cardshop-orders.htm我的卡密:
/duoduo_cardshop-my.htm
商品图片
存储:本地上传保存到
upload/duoduo_cardshop/,文件名YmdHis_md5(uniqid).ext数据库:存相对路径(
upload/duoduo_cardshop/xxx.jpeg),去 base_path/upload_url 前缀展示:
DuoduoCardShopService::imageUrl()返回根绝对路径/upload/duoduo_cardshop/xxx.jpeg外链:支持 http(s) 和 data: URI 原样保留
编辑:未提供新图时默认保留原图,勾选「清除」才清空
校验:扩展名 jpg/jpeg/png/gif/webp +
getimagesize真图校验删除商品时自动清理图片文件
通知系统
站内通知
类型:
cardshop(在notify_types_register.php注册)tab:
system,icon:shopping-cart通过
notify_create($uid, 0, 'cardshop', 0, 0, $content, ['message'=>$message, 'url'=>$url])创建$content:购买摘要「您已成功购买商品「X」(N 件),共消费 Y 金币」$message:购买摘要 + 换行 + 卡密列表(完整详情)注册了
message_callback让通知中心显示购买摘要而非类型名
邮件通知
条件:
xn_smtp_get()返回非空(已配 SMTP)且用户有有效邮箱主题:
您已成功购买 {goods_name}正文:订单号、商品名、数量、总价、卡密列表
核心文件改动(站点升级会覆盖,需重新应用)
为了让 cardshop 类型通知显示购买摘要(而非固定显示类型名「发卡商城」),对 XiunoX 核心做了两处最小改动:
文件 | 改动 | 说明 |
|---|---|---|
|
| 让下拉通知用 content 替换 typeLabel |
| 通知卡片系统类分支追加 cardshop | 让通知中心走「直接显示 message」分支 |
数据表
bbs_duoduo_cardshop_goods 商品表
字段 | 类型 | 说明 |
|---|---|---|
goods_id | int PK | 商品 ID |
name | varchar(100) | 商品名称 |
description | text | 商品描述 |
image | varchar(500) | 商品图片相对路径 |
price | int | 价格(单位对应所选货币) |
stock | int | 库存 |
sold | int | 已售 |
status | tinyint | 1=上架 0=下架 |
sort | int | 排序(小→前) |
bbs_duoduo_cardshop_cards 卡密表
字段 | 类型 | 说明 |
|---|---|---|
card_id | int PK | 卡密 ID |
goods_id | int | 所属商品 |
content | text | 卡密内容 |
status | tinyint | 0=未售 1=已售 |
order_id | int | 售出后关联订单 |
bbs_duoduo_cardshop_orders 订单表
字段 | 类型 | 说明 |
|---|---|---|
order_id | int PK | 订单 ID |
order_sn | varchar(32) | 订单号 |
uid | int | 购买者 |
goods_id | int | 商品 |
quantity | int | 数量 |
total_price | int | 总价 |
credit_type | varchar(20) | 扣费类型 |
create_date | int | 下单时间 |
运维注意事项
开发者模式(DEBUG)
当前站点
index.php:37已改为define('DEBUG', 2)(插件开发模式)效果:显示所有 PHP 错误、hook 强制重编译、记录 debug_error 日志
改动后需清 OPCache:
curl http://bbs.1url.shop/opcache_clear.php原版备份:
/workspace/backup/xiunox_bak/index.php.ori.DEBUG0调试完成后建议改回
DEBUG = 0
插件静态资源路径
XiunoX 插件静态资源(css/js/img)引用必须用根绝对路径:
<!-- 正确 -->
<link rel="stylesheet" href="/plugin/duoduo_cardshop/static/css/style.css">
<!-- 错误:拼 $conf['view_url'] 会变成 /view/plugin/... → 404 -->
<link rel="stylesheet" href="<?php echo $conf['view_url'];?>plugin/duoduo_cardshop/static/css/style.css">
参考其他插件写法:/plugin/duoduo_theme/view/css/theme.css。
后台管理员登录
XiunoX 后台有双重登录验证:
普通会员登录(user-login)
后台访问时再次输密码(index-login,二次验证)
仅完成第一步访问 admin/ 会返回 debug 错误转储而非设置表单。
配置确认
站点关键配置值:
$conf['base_path'] = ''; // 空
$conf['upload_url'] = '/upload/';
$conf['upload_path'] = '/www/wwwroot/mnbt.4556dc5/./upload/';
base_path 为空,所有路径拼接必须显式加根斜杠。
积分体系
使用 XiunoX 新版积分服务 lib/CreditsService.php:
credits— 积分golds— 金币rmbs— 人民币
购买调用 CreditsService::sub($uid, $type, $amount, $reason) 扣费,失败会自动退款。
测试验证
完成开发后建议验证清单:
商城首页
/duoduo_cardshop.htm渲染(Hero + 公告 + 商品卡片 + 服务保障)商品详情页图片大图
购买流程(扣费 → 分配卡密 → 生成订单)
站内通知下拉显示购买摘要(不是「发卡商城」)
通知中心完整页显示购买详情(含卡密)
邮件通知(需先配 SMTP)
后台商品管理页(无致命错误,缩略图显示)
后台编辑商品保留原图
后台删除商品清理图片文件
导航入口仅图标(无圆点)