feat: 集成隐私小号功能保护用户手机号

新增隐私小号服务类,在订单创建时自动绑定隐私手机号,收货时自动解绑
在快递发货和收货流程中使用隐私小号替代真实手机号,保护用户隐私
添加数据库字段存储绑定关系,提供系统配置开关和测试脚本
This commit is contained in:
2026-04-01 00:43:51 +08:00
parent 03a6ba7961
commit 42d98407de
14 changed files with 1722 additions and 6 deletions

384
AGENTS.md Normal file
View File

@@ -0,0 +1,384 @@
# AGENTS.md - CRMEB PRO Development Guide
## Project Overview
CRMEB PRO is an e-commerce system based on ThinkPHP 8.0 + Swoole 4. PHP 8.0+ required. This document provides guidelines for agentic coding assistants working in this codebase.
---
## 1. Build/Lint/Test Commands
### Application Commands
```bash
# Start Swoole server (main application command)
php think swoole
# Clear runtime files
php think clear
# Build route cache
php think optimize:route
# Build database schema cache
php think optimize:schema
```
### Code Generation
```bash
# Generate controller
php think make:controller api@user/User
# Generate model
php think make:model api@user/User
# Generate service (app/services/)
php think make:service api@user/User
# Generate dao (app/dao/)
php think make:dao api@user/User
# Generate validate class
php think make:validate api@user/User
# Generate event
php think make:event UserLogin
# Generate listener
php think make:listener UserLoginListener
# Generate middleware
php think make:middleware Auth
```
### Queue Commands
```bash
# Process queue jobs
php think queue:work
# Listen to queue
php think queue:listen
# Retry failed jobs
php think queue:retry
# List failed jobs
php think queue:failed
```
### Dependency Management
```bash
# Install dependencies
composer install
# Update dependencies
composer update
# Dump autoload
composer dump-autoload
```
---
## 2. Code Style Guidelines
### PSR Standards
- Follows **PSR-2** (Coding Style) and **PSR-4** (Autoloading)
### Naming Conventions
| Element | Convention | Example |
|---------|------------|---------|
| Directory | lowercase + underscore | `app/controller/admin` |
| File (.php) | CamelCase or lowercase_underscore | `UserController.php`, `common.php` |
| Class/Interface/Trait | PascalCase | `BaseServices`, `UserDao` |
| Method | camelCase | `getUserInfo()`, `createToken()` |
| Property | camelCase | `$adminInfo`, `$page` |
| Variable | camelCase | `$userId`, `$orderData` |
| Constant | UPPER_SNAKE_CASE | `PASSWORD_BCRYPT`, `MAX_RETRY` |
| Config param | lowercase + underscore | `url_route_on`, `cache.is_gzde` |
| Table/Column | lowercase + underscore | `eb_user`, `user_name` |
### File Header Template
```php
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\controller\admin;
```
### PHP Syntax Rules
1. **Namespace/use blocks** - Insert blank line after use statements
2. **Braces** - Class/method braces on separate lines
3. **Access modifiers** - Required for all methods and properties (`private`, `protected`, `public`)
4. **Parameters** - Comma after each param, not before
5. **Control structures** - Space after keyword (`if (` not `if(`)
6. **Assignment** - Spaces around `=` (`$arr = []`)
7. **Closing tag** - Omit `?>` for pure PHP files
8. **PHP 8.0+ features** - Use nullsafe operator (`$obj?->method()`), named arguments, union types
---
## 3. Architecture Patterns
### Directory Structure
```
app/
├── controller/ # Controllers (extend BaseController)
│ ├── admin/ # Admin panel controllers
│ ├── api/ # API controllers
│ └── supplier/ # Supplier controllers
├── services/ # Business logic layer
├── dao/ # Data access layer
├── model/ # Database models
├── validate/ # Form validation classes
├── http/
│ └── middleware/ # Middleware classes
└── jobs/ # Queue jobs
crmeb/
├── basic/ # Base classes (BaseController, BaseModel, BaseServices)
├── traits/ # Reusable traits
├── services/ # Core services
├── utils/ # Utility classes
└── exceptions/ # Custom exception classes
```
### Layer Pattern
```
Controller -> Service -> Dao -> Model
```
- **Controller**: Request handling, response formatting, auth checks
- **Service**: Business logic, transaction management
- **Dao**: Data query operations, search conditions
- **Model**: Database operations via ORM
### Class Naming
- Controllers: `{Name}Controller` (e.g., `StoreProductController`)
- Services: `{Name}Services` (e.g., `StoreProductServices`)
- DAOs: `{Name}Dao` (e.g., `StoreProductDao`)
- Models: `{Name}` (e.g., `StoreProduct`)
- Validates: `{Name}Validate` (e.g., `StoreProductValidate`)
---
## 4. Controller Guidelines
### Base Controller
```php
use app\controller\admin\AuthController; // extends BaseController
class ProductController extends AuthController
{
// Access $this->request via dependency injection
public function index(Request $request): Response
{
// Use $this->success() / $this->fail() for JSON responses
return $this->success(['list' => []]);
}
}
```
### Request Data Retrieval
```php
// Single parameter
$id = $this->request->param('id');
// Multiple parameters with defaults
[$page, $limit] = $this->request->more(['page/d', 'limit/d']);
// With default values
[$name, $status] = $this->request->more([
['name', ''],
['status', 0]
], true);
```
---
## 5. Service Guidelines
### BaseServices Pattern
```php
namespace app\services\product;
use app\services\BaseServices;
class StoreProductServices extends BaseServices
{
// Inject dao via constructor or magic method __call
public function getInfo(int $id)
{
return $this->dao->get($id);
}
}
```
### Dao Injection
Services access Dao via `$this->dao` property (injected via `ServicesTrait`).
---
## 6. Dao Guidelines
### BaseDao Pattern
```php
namespace app\dao\product;
use app\dao\BaseDao;
class StoreProductDao extends BaseDao
{
protected string $alias = 'product'; // Table alias
protected string $filterateField = []; // Fields to filter from search
protected function setModel(): string
{
return StoreProduct::class;
}
// Custom search conditions
public function search(array $where = [])
{
return parent::search($where);
}
}
```
---
## 7. Model Guidelines
### BaseModel Pattern
```php
namespace app\model\product;
use crmeb\basic\BaseModel;
use crmeb\traits\ModelTrait;
class StoreProduct extends BaseModel
{
use ModelTrait;
// Define searchers for field-based queries
protected string $name = 'store_product';
protected string $pk = 'id';
}
```
---
## 8. Validation Guidelines
### Validate Class Pattern
```php
namespace app\validate\admin\product;
use think\Validate;
class StoreProductValidate extends Validate
{
protected $rule = [
'name' => 'require|max:200',
'price' => 'require|float|egt:0',
];
protected $message = [
'name.require' => '请填写商品名称',
'price.require' => '请填写价格',
];
}
```
### Validation in Controller
```php
use app\validate\admin\product\StoreProductValidate;
public function save(StoreProductValidate $validate)
{
// Validates automatically, throws ValidateException on failure
}
```
---
## 9. Error Handling
### Custom Exceptions
```php
// In crmeb/exceptions/
throw new AuthException('无权限访问', 400);
throw new ApiException('参数错误', 400);
throw new AdminException('操作失败', 400);
```
### ExceptionHandle
The app extends ThinkPHP's exception handling to return JSON responses:
```php
// Returns: {"status": 400, "msg": "错误信息", "data": {...}}
```
---
## 10. Middleware Guidelines
### Middleware Interface Pattern
```php
namespace app\http\middleware;
use app\http\middleware\BaseMiddleware;
use app\interfaces\MiddlewareInterface;
class AuthMiddleware implements MiddlewareInterface
{
public function handle(Request $request, \Closure $next)
{
// Before logic
$response = $next($request);
// After logic
return $response;
}
}
```
---
## 11. Important Patterns
### Transactions
```php
// In services
$this->transaction(function () use ($data) {
$this->save($data);
$this->dao->incUpdate($id, 'views', 1);
});
```
### JSON Response Helper
```php
// Available in controllers via BaseController
return $this->success($data);
return $this->fail('Error message');
return app('json')->code(500)->make(400, 'msg', $data);
```
### Magic Methods in Request
```php
// These are available via __call in Request class
$uid = $this->request->uid();
$adminInfo = $this->request->adminInfo();
$tokenData = $this->request->tokenData();
```
---
## 12. Type Hints
- Use strict type hints: `public function get(int $id): ?array`
- Return types required for public methods
- Nullable types using `?` prefix