aiDoc/frontend-backend/frontend-rules.md
@/utils/request.jskebab-casePascalCasecamelCaseUPPER_SNAKE_CASEv-model 一律用 defineModel()(项目 Vue ≥ 3.4),禁止再写
props.modelValue + defineEmits(['update:modelValue']) + @update:model-value 这套老样板:
const modelValue = defineModel({ type: X, default: ... }),模板上对子组件直接 v-model="modelValue"。computed 作桥,
get 返回变换后的值、set 里写回 modelValue.value。defineModel 的 ref,
在回调里 modelValue.value = ...,不要退回 emit。defineModel('xxx', { ... })。defineModel 仍等价声明 modelValue prop 并 emit update:modelValue,
调用方 v-model / :model-value + @update:model-value 都照常工作。variant / size / format)补 validator 做白名单校验;
结构化 prop(options / marks 等)用 JSDoc @typedef 写清形状。ariaLabel 等可访问名,调用方按语义补中文 aria-label。@/core/componentLibrary(全局 <g-button /> 等),并遵守其主题 token 规范;
详见 frontend-backend/component-library.mdtext-/bg-/border- 等原子类覆盖主题 tokencolor: #xxxxxx 等硬编码颜色font-size: xxpx 等硬编码字号<div class="scenario-bar"> + scoped .scenario-bar { display: flex; gap: 8px; align-items: center };正例:直接 <div class="flex items-center gap-2"><svg-icon>(@/components/svgIcon/svgIcon.vue),
不要用 el-icon + @element-plus/icons-vue,也不要在模板里手写裸 <svg><path/></svg>。<svg-icon icon="lucide:check" />;
本地 symbol 传 local-icon:<svg-icon local-icon="close" />(对应 src/assets/icons/*.svg)。lucide(与基础组件库内置图标一致),不要用 ep: 等 Element Plus 图标集。lucide 图标集,例如取 https://api.iconify.design/lucide/<name>.svg(描边款、viewBox="0 0 24 24")<svg> 头统一为下面「规格」的本项目风格,内部 path 保持 lucide 原样;根 <svg> 上不要写 stroke-width——构建插件 vite-auto-import-svg 会破坏根上的 stroke-width(把属性截断、甚至损坏 viewBox)。线宽由 web/src/components/svgIcon/svgIcon.vue 的 <svg stroke-width="1.75"> 统一提供(经 <use> 继承进 symbol;想整体调粗细改这一个值即可);若某图标确需不同线宽,写在内层 <g> 上(能存活并覆盖默认)web/src/assets/icons/<name>-gva.svg,kebab-case + -gva 后缀(避免与内置图标名冲突)。currentColor 跟随主题色,不要 fill;根上不带 stroke-width):<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"> …线条 path… </svg>web/src/core/global.js 的 registerIcons 会自动 glob assets/icons/**/*.svg 注册为全局组件:
<svg-icon local-icon="<name>-gva" />server/source/system/menu.go 的 Icon 字段):直接写 Icon: "<name>-gva"(菜单侧用 <component :is> 渲染)npm run build 以重生成 svg spritestroke-width):perm-gva(shield-check)、config-gva(settings)、monitor-gva(activity)、ai-gva(sparkles)、version-gva(git-branch)、customer-gva(globe)、example-gva(files)、security-gva(lock)、error-gva(file-warning)、api-gva(code-xml)、role-gva(users)、config-file-gva(file-cog);覆盖内置名的 server(server)、shop(store)、share(share-2,组织管理)、connection(waypoints,Mcp Tools管理)、grid(layout-grid,Mcp Tools模板)、monitor(monitor,AI CLI管理)。shop),又想免重新初始化就换成空心款,可放一个同名本地 svg(如 shop.svg,lucide store 描边)覆盖之——<component :is> 会优先命中本地同名组件。此为唯一允许不带 -gva 后缀、故意与内置名冲突的场景。