diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..fb8442a --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,100 @@ +# AGENTS.md - Vue 3 Frontend + +**Generated:** 2026-03-03 +**Stack:** Vue 3.4 + TypeScript 4.9 + Element Plus 2.5 + Pinia 2.0 + Vite 4.3 + +## Overview + +Vue 3 SPA with custom composables for data fetching. Element Plus for UI. + +## Structure +``` +cloud-ui/src/ +├── api/ # API modules (one per entity) +├── components/ # Reusable components +├── hooks/ # Composables (useDict, useTable, etc.) +├── stores/ # Pinia stores +├── router/ # Vue Router config +├── views/ # Page components (flat per module) +├── const/ # Constants (non-standard name) +├── utils/ # Utilities (request.ts for HTTP) +└── types/ # TypeScript types +``` + +## Key Hooks + +| Hook | Purpose | +|------|---------| +| `useDict(type1, type2)` | Dictionary data with caching | +| `useTable({ pageList, queryForm })` | Table + pagination | +| `useMessage()` | Toast notifications | +| `useMessageBox()` | Confirm dialogs | +| `useParam(type)` | System parameters | + +## API Pattern +```typescript +import request from '/@/utils/request'; + +// One file per entity: api/module/entity.ts +export const fetchList = (params) => request.get('/module/entity/page', { params }); +export const addObj = (data) => request.post('/module/entity', data); +export const putObj = (data) => request.post('/module/entity/edit', data); +export const delObj = (id) => request.post('/module/entity/delete', id); +``` + +## Hooks Usage +```typescript +// Dictionary +const { dict } = useDict('sex', 'status'); +// Access: dict.sex, dict.status + +// Table +const { tableData, loading, getData, pagination } = useTable({ + pageList: fetchList, + queryForm: reactive({ name: '' }) +}); + +// Message +const { msgSuccess, msgError } = useMessage(); +msgSuccess('操作成功'); + +// Confirm +const { msgBoxConfirm } = useMessageBox(); +await msgBoxConfirm('确定删除?'); +``` + +## Constraints + +| Rule | Details | +|------|---------| +| **Hardcoding** | NO hardcoded strings. Define constants first. | +| **Line width** | 150 chars (Prettier) | +| **Indentation** | Tabs (Prettier) | +| **Quotes** | Single quotes | +| **API updates** | POST /edit (NOT PUT) | +| **API deletes** | POST /delete (NOT DELETE) | + +## Commands +```bash +npm run dev # Development server +npm run build # Production build +npm run lint:eslint # Lint + fix +npm run prettier # Format code +``` + +## Non-Standard + +| Location | Issue | +|----------|-------| +| `src/composables/` + `src/hooks/` | Both exist (prefer hooks/) | +| `src/directive/` + `src/directives/` | Both exist | +| `src/const/` | Named "const" not "constants" | + +## ESLint Relaxed Rules + +Many TypeScript rules are OFF: +- `@typescript-eslint/no-explicit-any`: OFF +- `@typescript-eslint/explicit-function-return-type`: OFF +- `vue/require-default-prop`: OFF + +Follow existing patterns in codebase. \ No newline at end of file diff --git a/src/hooks/AGENTS.md b/src/hooks/AGENTS.md new file mode 100644 index 0000000..c58e1df --- /dev/null +++ b/src/hooks/AGENTS.md @@ -0,0 +1,78 @@ +# AGENTS.md - Vue Composables (hooks) + +**Generated:** 2026-03-03 +**Purpose:** Custom Vue 3 composables for data fetching and UI state + +## Key Hooks + +### useDict +Fetch dictionary data with automatic caching. + +```typescript +const { dict } = useDict('sex', 'status', 'type'); +// Access: dict.sex, dict.status, dict.type +// Automatically cached per type +``` + +### useTable +Table data management with pagination. + +```typescript +const { tableData, loading, pagination, getData, resetQuery } = useTable({ + pageList: fetchList, // API function + queryForm: reactive({ name: '' }) // Query params +}); + +// pagination: { current, size, total } +// getData(): refresh table +// resetQuery(): reset to defaults +``` + +### useMessage +Toast notifications. + +```typescript +const { msgSuccess, msgError, msgWarning } = useMessage(); +msgSuccess('操作成功'); +msgError('操作失败'); +``` + +### useMessageBox +Confirm/alert dialogs. + +```typescript +const { msgBoxConfirm, msgBoxAlert } = useMessageBox(); + +// Confirm +await msgBoxConfirm('确定删除该记录?'); +// Returns promise, resolves on confirm + +// Alert +await msgBoxAlert('提示信息'); +``` + +### useParam +Fetch system parameters. + +```typescript +const { param } = useParam('SYSTEM_NAME'); +// Access: param.SYSTEM_NAME +``` + +## Files + +| File | Purpose | +|------|---------| +| useDict.ts | Dictionary data with caching | +| useTable.ts | Table + pagination state | +| useMessage.ts | Toast notifications | +| useMessageBox.ts | Confirm dialogs | +| useParam.ts | System parameters | + +## Pattern + +All hooks follow Vue 3 composition API pattern: +1. Accept reactive params +2. Return reactive state + methods +3. Handle loading/error states internally +4. Provide clean API surface \ No newline at end of file diff --git a/src/views/stuwork/classpaper/summary.vue b/src/views/stuwork/classpaper/summary.vue index c0931f1..7ab8b08 100644 --- a/src/views/stuwork/classpaper/summary.vue +++ b/src/views/stuwork/classpaper/summary.vue @@ -173,13 +173,13 @@ :width="col.width" :min-width="col.minWidth" :show-overflow-tooltip="col.showOverflowTooltip !== false" - :align="col.align || 'center'> + :align="col.align || 'center'"> -