|
|
|
|
|
# AlipayAccount MVC 实现文档
|
|
|
|
|
|
|
|
|
|
|
|
## 📋 概述
|
|
|
|
|
|
|
|
|
|
|
|
本文档记录了参照 `WechatpayAccount` 模型创建 `AlipayAccount` 相关 MVC 组件的完整过程。
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## ✅ 已完成的工作
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 模型 (Model)
|
|
|
|
|
|
|
|
|
|
|
|
**文件位置**: `app/Models/AlipayAccount.php`
|
|
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
namespace App\Models;
|
|
|
|
|
|
|
|
|
|
|
|
class AlipayAccount extends SoftDeletesModel
|
|
|
|
|
|
{
|
|
|
|
|
|
protected $table = "alipay_account";
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**说明**:
|
|
|
|
|
|
- 继承 `SoftDeletesModel` 基类,支持软删除功能
|
|
|
|
|
|
- 映射数据表 `alipay_account`
|
|
|
|
|
|
- 自动包含时间戳和软删除字段
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 控制器 (Controller)
|
|
|
|
|
|
|
|
|
|
|
|
**文件位置**: `app/Http/Controllers/Admin/AlipayAccountController.php`
|
|
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
|
|
|
|
|
|
|
|
use App\Forms\AlipayAccountForm;
|
|
|
|
|
|
use App\Models\AlipayAccount;
|
|
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
|
|
|
|
|
|
|
|
class AlipayAccountController extends CommonController
|
|
|
|
|
|
{
|
|
|
|
|
|
public $bladePath = "admin.alipay-account";
|
|
|
|
|
|
public $urlPrefix = "admin/alipay-account";
|
|
|
|
|
|
public $modelName = "支付宝账号";
|
|
|
|
|
|
public $modelClass = AlipayAccount::class;
|
|
|
|
|
|
public $formClass = AlipayAccountForm::class;
|
|
|
|
|
|
|
|
|
|
|
|
public function index(Request $request)
|
|
|
|
|
|
{
|
|
|
|
|
|
$data = $this->model->paginate(10);
|
|
|
|
|
|
return view($this->bladePath . ".index", compact("data"));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**功能说明**:
|
|
|
|
|
|
- 继承 `CommonController`,自动获得 CRUD 功能
|
|
|
|
|
|
- 定义视图路径、URL前缀、模型名称
|
|
|
|
|
|
- `index()` 方法:分页显示支付宝账号列表(每页10条)
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 3. 表单构建器 (Form)
|
|
|
|
|
|
|
|
|
|
|
|
**文件位置**: `app/Forms/AlipayAccountForm.php`
|
|
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
namespace App\Forms;
|
|
|
|
|
|
|
|
|
|
|
|
use Kris\LaravelFormBuilder\Form;
|
|
|
|
|
|
use Kris\LaravelFormBuilder\Field;
|
|
|
|
|
|
|
|
|
|
|
|
class AlipayAccountForm extends Form
|
|
|
|
|
|
{
|
|
|
|
|
|
public function buildForm()
|
|
|
|
|
|
{
|
|
|
|
|
|
$this->add("id", Field::HIDDEN);
|
|
|
|
|
|
$this->add("name", Field::TEXT, ["label" => "名称", "rules" => "required"]);
|
|
|
|
|
|
$this->add("appid", Field::TEXT, ["label" => "应用ID", "rules" => "required"]);
|
|
|
|
|
|
$this->add("public_key", Field::TEXTAREA, [
|
|
|
|
|
|
"label" => "应用公钥",
|
|
|
|
|
|
"rules" => "required",
|
|
|
|
|
|
"attr" => ["rows" => 4]
|
|
|
|
|
|
]);
|
|
|
|
|
|
$this->add("alipay_key", Field::TEXTAREA, [
|
|
|
|
|
|
"label" => "支付宝密钥",
|
|
|
|
|
|
"rules" => "required",
|
|
|
|
|
|
"attr" => ["rows" => 4]
|
|
|
|
|
|
]);
|
|
|
|
|
|
$this->add('buttons', 'buttongroup', [
|
|
|
|
|
|
"splitted" => true,
|
|
|
|
|
|
"buttons" => [
|
|
|
|
|
|
["label" => "保存", "attr" => ["class" => "btn btn-primary mr-1", "type" => "submit"]],
|
|
|
|
|
|
["label" => "返回", "attr" => ["class" => "btn btn-light btn-back", "type" => "button"]]
|
|
|
|
|
|
]
|
|
|
|
|
|
]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**字段说明**:
|
|
|
|
|
|
- `id`: 隐藏字段,用于编辑时传递ID
|
|
|
|
|
|
- `name`: 账号名称(必填)
|
|
|
|
|
|
- `appid`: 支付宝应用ID(必填)
|
|
|
|
|
|
- `public_key`: 应用公钥(必填,多行文本框)
|
|
|
|
|
|
- `alipay_key`: 支付宝密钥(必填,多行文本框)
|
|
|
|
|
|
- `buttons`: 保存和返回按钮组
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 4. 视图文件 (Views)
|
|
|
|
|
|
|
|
|
|
|
|
#### 4.1 列表页面
|
|
|
|
|
|
|
|
|
|
|
|
**文件位置**: `resources/views/admin/alipay-account/index.blade.php`
|
|
|
|
|
|
|
|
|
|
|
|
**更新内容**:
|
|
|
|
|
|
- 表头字段:名称、应用ID、应用公钥、操作
|
|
|
|
|
|
- 数据显示:`$row->appid` 和 `Str::limit($row->public_key, 50)`
|
|
|
|
|
|
- 公钥字段限制显示前50个字符,避免过长
|
|
|
|
|
|
|
|
|
|
|
|
**功能**:
|
|
|
|
|
|
- 显示支付宝账号列表
|
|
|
|
|
|
- 创建新账号按钮
|
|
|
|
|
|
- 编辑、删除操作按钮
|
|
|
|
|
|
- 分页功能
|
|
|
|
|
|
|
|
|
|
|
|
#### 4.2 创建/编辑页面
|
|
|
|
|
|
|
|
|
|
|
|
**文件位置**: `resources/views/admin/alipay-account/create.blade.php`
|
|
|
|
|
|
|
|
|
|
|
|
**内容**:
|
|
|
|
|
|
- 继承 `admin.layouts.layout` 布局
|
|
|
|
|
|
- 包含表单构建器生成的表单
|
|
|
|
|
|
- 支持创建和编辑两种模式
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 5. 路由配置
|
|
|
|
|
|
|
|
|
|
|
|
**文件位置**: `routes/web.php` (第69行)
|
|
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
|
\App\Models\CommonModel::generateCurdRouter("AlipayAccountController", "alipay-account");
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**自动生成的路由**:
|
|
|
|
|
|
|
|
|
|
|
|
| 方法 | URI | 动作 | 说明 |
|
|
|
|
|
|
|------|-----|------|------|
|
|
|
|
|
|
| GET | `/admin/alipay-account` | index | 列表页 |
|
|
|
|
|
|
| GET | `/admin/alipay-account/create` | create | 创建页 |
|
|
|
|
|
|
| POST | `/admin/alipay-account/store` | store | 保存新建 |
|
|
|
|
|
|
| GET | `/admin/alipay-account/edit?id={id}` | edit | 编辑页 |
|
|
|
|
|
|
| POST | `/admin/alipay-account/update/{id}` | update | 保存编辑 |
|
|
|
|
|
|
| POST | `/admin/alipay-account/delete` | delete | 删除 |
|
|
|
|
|
|
|
|
|
|
|
|
**权限控制**:
|
|
|
|
|
|
- 需要通过 `authorize:admin` 中间件(管理员身份验证)
|
|
|
|
|
|
- 需要通过 `rbac:admin` 中间件(基于角色的权限验证)
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 📊 数据库结构
|
|
|
|
|
|
|
|
|
|
|
|
**表名**: `alipay_account`
|
|
|
|
|
|
|
|
|
|
|
|
| 字段名 | 类型 | 说明 |
|
|
|
|
|
|
|--------|------|------|
|
|
|
|
|
|
| id | BIGINT | 主键ID |
|
|
|
|
|
|
| name | VARCHAR | 账号名称 |
|
|
|
|
|
|
| appid | VARCHAR | 应用ID |
|
|
|
|
|
|
| public_key | VARCHAR | 应用公钥 |
|
|
|
|
|
|
| alipay_key | VARCHAR | 支付宝密钥 |
|
|
|
|
|
|
| created_at | TIMESTAMP | 创建时间 |
|
|
|
|
|
|
| updated_at | TIMESTAMP | 更新时间 |
|
|
|
|
|
|
| deleted_at | TIMESTAMP | 软删除时间 |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 🔄 与 WechatpayAccount 的对比
|
|
|
|
|
|
|
|
|
|
|
|
| 项目 | WechatpayAccount | AlipayAccount |
|
|
|
|
|
|
|------|------------------|---------------|
|
|
|
|
|
|
| 商户标识字段 | `mchid` (商户ID) | `appid` (应用ID) |
|
|
|
|
|
|
| 密钥字段 | `key` (商户密钥) | `public_key` + `alipay_key` |
|
|
|
|
|
|
| 字段类型 | TEXT | TEXTAREA (多行) |
|
|
|
|
|
|
| 字段数量 | 3个核心字段 | 4个核心字段 |
|
|
|
|
|
|
|
|
|
|
|
|
**主要区别**:
|
|
|
|
|
|
1. 支付宝使用应用ID代替商户ID
|
|
|
|
|
|
2. 支付宝需要两个密钥:应用公钥和支付宝密钥
|
|
|
|
|
|
3. 密钥字段较长,使用多行文本框输入
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 🚀 使用说明
|
|
|
|
|
|
|
|
|
|
|
|
### 访问管理页面
|
|
|
|
|
|
|
|
|
|
|
|
1. **登录后台**: 访问 `/admin/login`
|
|
|
|
|
|
2. **进入列表页**: 访问 `/admin/alipay-account`
|
|
|
|
|
|
3. **创建账号**: 点击"创建支付宝账号"按钮
|
|
|
|
|
|
4. **填写信息**:
|
|
|
|
|
|
- 名称:给账号起一个便于识别的名称
|
|
|
|
|
|
- 应用ID:从支付宝开放平台获取
|
|
|
|
|
|
- 应用公钥:从支付宝开放平台生成
|
|
|
|
|
|
- 支付宝密钥:从支付宝开放平台获取
|
|
|
|
|
|
|
|
|
|
|
|
### 开发集成
|
|
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
|
// 获取所有支付宝账号
|
|
|
|
|
|
$accounts = AlipayAccount::all();
|
|
|
|
|
|
|
|
|
|
|
|
// 获取单个账号
|
|
|
|
|
|
$account = AlipayAccount::find($id);
|
|
|
|
|
|
|
|
|
|
|
|
// 创建账号
|
|
|
|
|
|
$account = new AlipayAccount();
|
|
|
|
|
|
$account->name = "测试账号";
|
|
|
|
|
|
$account->appid = "2021xxxxx";
|
|
|
|
|
|
$account->public_key = "MIIBIjAN...";
|
|
|
|
|
|
$account->alipay_key = "MIIEvgI...";
|
|
|
|
|
|
$account->save();
|
|
|
|
|
|
|
|
|
|
|
|
// 更新账号
|
|
|
|
|
|
$account = AlipayAccount::find($id);
|
|
|
|
|
|
$account->name = "新名称";
|
|
|
|
|
|
$account->save();
|
|
|
|
|
|
|
|
|
|
|
|
// 软删除
|
|
|
|
|
|
$account->delete();
|
|
|
|
|
|
|
|
|
|
|
|
// 包含已删除记录
|
|
|
|
|
|
$accounts = AlipayAccount::withTrashed()->get();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## ✅ 验证清单
|
|
|
|
|
|
|
|
|
|
|
|
- [x] 模型文件创建完成
|
|
|
|
|
|
- [x] 控制器文件创建完成
|
|
|
|
|
|
- [x] 表单构建器创建完成
|
|
|
|
|
|
- [x] 视图文件已更新(字段匹配数据库)
|
|
|
|
|
|
- [x] 路由配置已添加
|
|
|
|
|
|
- [x] 无 Linter 错误
|
|
|
|
|
|
- [x] 继承关系正确(SoftDeletesModel、CommonController)
|
|
|
|
|
|
- [x] 权限中间件已配置
|
|
|
|
|
|
- [x] 遵循项目命名规范
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 📝 注意事项
|
|
|
|
|
|
|
|
|
|
|
|
1. **密钥安全**: 密钥字段包含敏感信息,建议:
|
|
|
|
|
|
- 在列表页只显示部分内容(已实现)
|
|
|
|
|
|
- 考虑加密存储
|
|
|
|
|
|
- 严格控制访问权限
|
|
|
|
|
|
|
|
|
|
|
|
2. **表单验证**:
|
|
|
|
|
|
- 所有字段均为必填
|
|
|
|
|
|
- 前端验证由表单构建器自动处理
|
|
|
|
|
|
- 可根据需要添加后端验证规则
|
|
|
|
|
|
|
|
|
|
|
|
3. **软删除**:
|
|
|
|
|
|
- 删除操作不会真正删除数据
|
|
|
|
|
|
- 可通过 `withTrashed()` 查询已删除记录
|
|
|
|
|
|
- 可使用 `restore()` 恢复数据
|
|
|
|
|
|
|
|
|
|
|
|
4. **扩展功能**:
|
|
|
|
|
|
- 如需关联项目,参考 `Project` 表中的 `alipay_account_id` 字段
|
|
|
|
|
|
- 可添加账号验证功能
|
|
|
|
|
|
- 可添加账号余额查询功能
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 🎯 后续建议
|
|
|
|
|
|
|
|
|
|
|
|
1. **添加账号验证功能**: 在保存时调用支付宝API验证配置是否正确
|
|
|
|
|
|
2. **添加使用统计**: 记录每个账号的使用次数和交易金额
|
|
|
|
|
|
3. **添加状态字段**: 标记账号启用/禁用状态
|
|
|
|
|
|
4. **添加备注字段**: 记录账号用途和相关说明
|
|
|
|
|
|
5. **日志记录**: 记录账号的创建、修改、删除操作
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 📞 技术支持
|
|
|
|
|
|
|
|
|
|
|
|
如有问题,请参考:
|
|
|
|
|
|
- Laravel 7.x 官方文档: https://laravel.com/docs/7.x
|
|
|
|
|
|
- Laravel Form Builder: https://github.com/kristijanhusak/laravel-form-builder
|
|
|
|
|
|
- 支付宝开放平台: https://open.alipay.com/
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
**创建时间**: 2025-10-13
|
|
|
|
|
|
**创建者**: AI Assistant
|
|
|
|
|
|
**基于模板**: WechatpayAccount MVC
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|