自助发卡商城

自助发卡商城

XiunoX(Xiuno BBS 4.x 定制版)自助发卡商城插件,支持商品管理、卡密自动发放、站内

插件 v1.0.0 哆哆 交易 积分兑换 20 金币

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-* 类)

安装

  1. 将插件目录放到站点 plugin/duoduo_cardshop/

  2. 后台访问 管理 → 插件,安装并启用 duoduo_cardshop

  3. 后台访问 插件设置 → 发卡商城

    • 设置货币名称(默认「金币」)

    • 选择扣费类型(credits/golds/rmbs)

    • 是否在导航栏显示入口

    • 商城公告(每行一条,显示在商城首页公告区)

  4. 在「商品管理」添加商品并上传图片

  5. 在「卡密管理」给商品批量添加卡密

后台入口

  • 后台设置页: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 核心做了两处最小改动:

文件

改动

说明

route/my.php

notify_dropdown action 加 cardshop 分支

让下拉通知用 content 替换 typeLabel

view/htm/my_notify.htm

通知卡片系统类分支追加 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 后台有双重登录验证

  1. 普通会员登录(user-login)

  2. 后台访问时再次输密码(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)

  • 后台商品管理页(无致命错误,缩略图显示)

  • 后台编辑商品保留原图

  • 后台删除商品清理图片文件

  • 导航入口仅图标(无圆点)


截图 2
v1.0.0 2026-08-19
作者信息
哆哆
哆哆 哆哆
专注于xiunox插件的开发,以及学习xiunox开发相关知识
开发者主页
3
应用
16
安装
2026-08
加入
应用详情
应用分类 插件
版本 v1.0.0
适用版本 1.1
开发者 哆哆
下载量 8
浏览 135
更新时间 2026-09-06
发布时间 2026-08-19
最新回复 5
查看全部
  • 灰去灰来 二级用户组
    好功能,支持
    11天前
  • leo 三级用户组
    不错,正在体验
    13天前
  • 扣扣小妖 三级用户组
    个人感觉暂时可以考虑的拓展优化1、商品内容富文本编辑(简单化几个常用就行,不一定要调用编辑器)2、商品图片可以考虑动态添加,而不是限制为单独一张主图。其3、更多扩展 这个可能工程有点大,就是是否考虑实现虚拟商品类商城  。  只是个人想法,仅供参考哈,不喜勿喷哈😄
    14天前
    哆哆 一级用户组 作者 回复@扣扣小妖
    好的,后面有时间在更新了
    13天前
  • leo 三级用户组
    这个插件好,我喜欢
    14天前
  • 段先生 二级用户组
    这个插件好,我喜欢
    15天前
查看全部评论 / 发表评论
完整评论功能在讨论帖中,点击前往