better-staridc-MNBT
1---
2title: hosting_shop 主机售卖插件
3description: 虚拟主机售卖系统插件:管理员配置套餐与价格,用户购买主机、查看资产与订单,购买时自动开通
4---
5
6# hosting_shop 主机售卖插件
7
8虚拟主机售卖系统,管理员配置套餐与价格,用户可购买主机、查看资产与订单。购买时调用宝塔 API 自动开通。
9
10## 功能
11
12- 管理员端:套餐管理(增删改查)、订单管理、资产管理
13- 用户端:套餐浏览、下单购买、我的主机、订单记录
14- 购买流程:创建订单 → 余额支付 → 自动开通(调用宝塔 API)
15- 支持月付/年付周期
16
17## 依赖
18
19- **user_info**(认证)
20- **balance**(支付:用户余额扣款)
21
22安装时 `plugin.json` 的 `requires_plugins` 字段会强制检查依赖。
23
24## 安装
25
261. 先安装并启用 `user_info` 和 `balance` 插件
272. 安装并启用 `hosting_shop` 插件
283. 自动创建 `MN_plugin_hosting_plan` 和 `MN_plugin_hosting_order` 表
29
30## 数据表
31
32### MN_plugin_hosting_plan
33
34套餐配置表。
35
36| 字段 | 类型 | 说明 |
37|------|------|------|
38| id | INT AUTO_INCREMENT | 主键 |
39| name | VARCHAR(100) | 套餐名称 |
40| description | TEXT | 套餐描述 |
41| price_monthly_cents | INT | 月付价格(分) |
42| price_yearly_cents | INT | 年付价格(分) |
43| node | VARCHAR(100) | 开通节点(宝塔面板标识) |
44| specs | TEXT | 规格 JSON(磁盘/流量/数据库等) |
45| status | TINYINT | 1=上架 0=下架 |
46| sort | INT | 排序 |
47| created_at | DATETIME | 创建时间 |
48| updated_at | DATETIME | 更新时间 |
49
50### MN_plugin_hosting_order
51
52订单表。
53
54| 字段 | 类型 | 说明 |
55|------|------|------|
56| id | INT AUTO_INCREMENT | 主键 |
57| order_no | VARCHAR(64) | 订单号(唯一) |
58| user_id | INT | 用户 ID |
59| plan_id | INT | 套餐 ID |
60| plan_name | VARCHAR(100) | 套餐名称(冗余) |
61| period | VARCHAR(10) | 周期:month/year |
62| amount_cents | INT | 金额(分) |
63| node | VARCHAR(100) | 开通节点 |
64| host_id | INT | 开通后的主机 ID(关联 MN_zj) |
65| status | VARCHAR(20) | pending/paid/opened/failed/cancelled |
66| created_at | DATETIME | 下单时间 |
67| opened_at | DATETIME | 开通时间 |
68| remark | VARCHAR(255) | 备注 |
69
70## 访问路径
71
72| 页面 | URL |
73|------|-----|
74| 套餐列表 | `index.php?_r=/shop` |
75| 下单页 | `index.php?_r=/shop/order/{plan_id}` |
76| 我的主机 | `index.php?_r=/shop/assets` |
77| 我的订单 | `index.php?_r=/shop/orders` |
78
79## API 路由
80
81| 方法 | 路径 | 说明 |
82|------|------|------|
83| POST | `/shop/api/create_order` | 创建订单(余额扣款 + 触发开通) |
84
85## 管理员端
86
87| 页面 | 入口 |
88|------|------|
89| 套餐管理 | `plugin.php?p=hosting_shop&page=plans` |
90| 套餐编辑 | `plugin.php?p=hosting_shop&page=plan_edit&id={id}` |
91| 订单管理 | `plugin.php?p=hosting_shop&page=orders` |
92| 资产管理 | `plugin.php?p=hosting_shop&page=assets` |
93
94## 钩子
95
96| 钩子 | 优先级 | 说明 |
97|------|--------|------|
98| `order.paid` | 20 | 订单支付成功后触发 `hosting_open_host()` 调用宝塔 API 开通主机 |
99
100## 核心流程
101
102```
103用户选择套餐 → 创建订单(MN_plugin_hosting_order, status=pending)
104 → 余额扣款(balance_deduct, status=paid)
105 → 触发 order.paid 钩子
106 → hosting_open_host() 调用宝塔 API 创建站点
107 → 写入 MN_zj 表,更新订单 status=opened, host_id=xxx
108```
109
110## 核心 API
111
112| 函数 | 说明 |
113|------|------|
114| `hosting_require_user()` | 要求登录,返回用户数组 |
115| `hosting_format_cents($cents)` | 分→元格式化 |
116| `hosting_url($path)` | 生成插件页面 URL |
117| `hosting_admin_url($page, $extra)` | 生成管理员页面 URL |
118| `hosting_order_list_all($page, $per_page, $filters)` | 管理员-订单列表 |
119| `hosting_open_host($order)` | 调用宝塔 API 开通主机 |
120
121## 文件结构
122
123```
124hosting_shop/
125├── plugin.json
126├── bootstrap.php # 主入口(路由 + API + 钩子 + 管理员页面注册)
127├── install.sql
128├── uninstall.sql
129├── lib/
130│ └── hosting.php # URL/金额辅助函数 + 用户认证
131├── assets/
132│ └── style.css
133└── views/
134 ├── layout.php # 公共布局
135 ├── shop.php # 套餐列表
136 ├── order.php # 下单页
137 ├── assets.php # 我的主机
138 ├── orders.php # 我的订单
139 └── admin/
140 ├── plans.php # 管理员-套餐管理
141 ├── plan_edit.php # 管理员-套餐编辑
142 ├── orders.php # 管理员-订单管理
143 └── assets.php # 管理员-资产管理
144```
145
146## 相关文档
147
148- [user_info](./user-info.md) — 认证依赖插件
149- [balance](./balance.md) — 支付依赖插件
150- [插件开发手册](../guide.md) — 插件开发手册