初始化本地仓库
This commit is contained in:
@@ -0,0 +1,186 @@
|
||||
---
|
||||
name: backend-gen-parse
|
||||
description: Parse table definition to extract module name, model name, table name and field definitions. This is the first step in CRUD generation workflow.
|
||||
---
|
||||
|
||||
# Step 1: Parse Table Definition
|
||||
|
||||
Extract key information from user-provided table definitions.
|
||||
|
||||
## Input Examples
|
||||
|
||||
### Example 1: Simple Table
|
||||
```
|
||||
Module: Ask
|
||||
Table: tags
|
||||
Fields:
|
||||
- id (primary key)
|
||||
- name (string, 50, required)
|
||||
- sort (integer, default 0)
|
||||
- status (tinyint, default 1)
|
||||
- created_at (timestamp)
|
||||
- updated_at (timestamp)
|
||||
```
|
||||
|
||||
### Example 2: Table with Foreign Key
|
||||
```
|
||||
Module: Ask
|
||||
Table: questions
|
||||
Fields:
|
||||
- id (primary key)
|
||||
- category_id (foreign key -> ask.categories)
|
||||
- title (string, 200, required)
|
||||
- content (text, required)
|
||||
- price (decimal 10,2, default 0)
|
||||
- view_count (integer, default 0)
|
||||
- status (tinyint, default 1)
|
||||
- created_at (timestamp)
|
||||
- updated_at (timestamp)
|
||||
- deleted_at (timestamp, nullable)
|
||||
```
|
||||
|
||||
### Example 3: Full Definition
|
||||
```
|
||||
Module: Market
|
||||
Table: products
|
||||
Fields:
|
||||
- id (primary key)
|
||||
- category_id (foreign key -> market.categories)
|
||||
- name (string, 100, required)
|
||||
- cover (string, 255, nullable) [image]
|
||||
- price (decimal 10,2, required)
|
||||
- stock (integer, default 0)
|
||||
- sales (integer, default 0)
|
||||
- description (text, nullable)
|
||||
- content (text, nullable) [editor]
|
||||
- sort (integer, default 0)
|
||||
- status (tinyint, default 1)
|
||||
- created_at (timestamp)
|
||||
- updated_at (timestamp)
|
||||
```
|
||||
|
||||
## Output Structure
|
||||
|
||||
```json
|
||||
{
|
||||
"plugin": "official",
|
||||
"module": "ask",
|
||||
"model": "Tag",
|
||||
"table": "official_ask_tags",
|
||||
"fields": [
|
||||
{
|
||||
"name": "id",
|
||||
"type": "id",
|
||||
"migration": "idIncrements()"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": "string",
|
||||
"length": 50,
|
||||
"required": true,
|
||||
"migration": "string('name', 50)"
|
||||
},
|
||||
{
|
||||
"name": "sort",
|
||||
"type": "integer",
|
||||
"default": 0,
|
||||
"migration": "unsignedInteger('sort')->default(0)"
|
||||
},
|
||||
{
|
||||
"name": "status",
|
||||
"type": "tinyint",
|
||||
"default": 1,
|
||||
"comment": "状态: 1正常 2禁用",
|
||||
"migration": "tinyInteger('status')->default(1)"
|
||||
},
|
||||
{
|
||||
"name": "created_at",
|
||||
"type": "timestamp",
|
||||
"migration": "unsignedInteger('created_at')"
|
||||
},
|
||||
{
|
||||
"name": "updated_at",
|
||||
"type": "timestamp",
|
||||
"migration": "unsignedInteger('updated_at')"
|
||||
},
|
||||
{
|
||||
"name": "deleted_at",
|
||||
"type": "soft_delete",
|
||||
"migration": "unsignedInteger('deleted_at')->nullable()"
|
||||
}
|
||||
],
|
||||
"fillable": ["name", "sort", "status"],
|
||||
"casts": {
|
||||
"sort": "integer",
|
||||
"status": "integer"
|
||||
},
|
||||
"foreign_keys": []
|
||||
}
|
||||
```
|
||||
|
||||
## Field Type Mapping
|
||||
|
||||
| Input Type | Migration Method | Vue Component |
|
||||
|------------|------------------|----------------|
|
||||
| string(n) | `string('x', n)` | `el-input` |
|
||||
| text | `text('x')` | `el-input (textarea)` |
|
||||
| integer | `unsignedInteger('x')` | `el-input-number` |
|
||||
| bigint | `unsignedBigInteger('x')` | `el-input-number` |
|
||||
| decimal(m,n) | `decimal('x', m, n)` | `el-input-number` |
|
||||
| tinyint | `tinyInteger('x')` | `ApiDict` |
|
||||
| foreign_key | `unsignedBigInteger('x')` | `ApiSelect` |
|
||||
| date | `date('x')` | `DatePicker` |
|
||||
| datetime | `dateTime('x')` | `DateTimePicker` |
|
||||
| json | `json('x')` | `el-input` |
|
||||
| image | `string('x', 255)` | `ImageUpload` |
|
||||
| boolean | `boolean('x')` | `el-switch` |
|
||||
|
||||
## Naming Convention
|
||||
|
||||
| Item | Convention | Example |
|
||||
|------|------------|---------|
|
||||
| Plugin | snake_case | `official`, `market` |
|
||||
| Module | PascalCase | `Ask`, `Market`, `Question` |
|
||||
| Model | PascalCase singular | `Tag`, `Product`, `Question` |
|
||||
| Table | snake_case with prefix | `official_ask_tags` |
|
||||
| Field | snake_case | `user_name`, `created_at` |
|
||||
|
||||
## Field Attributes
|
||||
|
||||
Each field should have these attributes:
|
||||
|
||||
- `name`: Field name in snake_case
|
||||
- `type`: Field type (string, integer, text, etc.)
|
||||
- `length`: Optional length for string type
|
||||
- `required`: Whether field is required
|
||||
- `default`: Default value
|
||||
- `nullable`: Whether field can be null
|
||||
- `comment`: Field comment
|
||||
- `migration`: Migration method call
|
||||
- `fillable`: Whether in $fillable array
|
||||
- `casts`: Type casting for model
|
||||
|
||||
## Validation Rules
|
||||
|
||||
Generate validation rules based on field attributes:
|
||||
|
||||
| Attribute | Validation |
|
||||
|-----------|------------|
|
||||
| required | `['required', 'max:255']` |
|
||||
| string | `['string', 'max:255']` |
|
||||
| integer | `['integer']` |
|
||||
| decimal | `['numeric']` |
|
||||
| email | `['email']` |
|
||||
| unique | `['unique:table,column']` |
|
||||
|
||||
## Auto-generation Checklist
|
||||
|
||||
When parsing table definition:
|
||||
- [ ] Extract plugin name
|
||||
- [ ] Extract module name (PascalCase)
|
||||
- [ ] Extract model name (PascalCase singular)
|
||||
- [ ] Generate table name with prefix
|
||||
- [ ] Parse each field with full attributes
|
||||
- [ ] Generate fillable array
|
||||
- [ ] Generate casts array
|
||||
- [ ] Identify foreign key relationships
|
||||
Reference in New Issue
Block a user