新增隐私小号服务类,在订单创建时自动绑定隐私手机号,收货时自动解绑 在快递发货和收货流程中使用隐私小号替代真实手机号,保护用户隐私 添加数据库字段存储绑定关系,提供系统配置开关和测试脚本
8.9 KiB
8.9 KiB
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
# 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
# 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
# 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
# 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
// +----------------------------------------------------------------------
// | 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
- Namespace/use blocks - Insert blank line after use statements
- Braces - Class/method braces on separate lines
- Access modifiers - Required for all methods and properties (
private,protected,public) - Parameters - Comma after each param, not before
- Control structures - Space after keyword (
if (notif() - Assignment - Spaces around
=($arr = []) - Closing tag - Omit
?>for pure PHP files - 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
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
// 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
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
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
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
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
use app\validate\admin\product\StoreProductValidate;
public function save(StoreProductValidate $validate)
{
// Validates automatically, throws ValidateException on failure
}
9. Error Handling
Custom Exceptions
// 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:
// Returns: {"status": 400, "msg": "错误信息", "data": {...}}
10. Middleware Guidelines
Middleware Interface Pattern
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
// In services
$this->transaction(function () use ($data) {
$this->save($data);
$this->dao->incUpdate($id, 'views', 1);
});
JSON Response Helper
// 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
// 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