skills/uniapp-mp-generator/SKILL.md
# uni-app 小程序代码生成器 > **版本**: v1.0.0 > **作者**: AI Assistant > **参考项目**: tt-paikebao-mp(排课宝) ## 功能概述 这是一个基于 **tt-paikebao-mp** 项目代码规范的 uni-app 小程序代码生成器。根据用户提供的需求文档,自动生成符合项目规范的: - Vue3 页面组件 - API 接口文件 - Pinia Store 状态管理 - 路由配置 - 数据库 Schema 定义 ## 触发条件 当用户请求以下内容时,应使用此 Skill: 1. 创建新的页面模块 2. 生成 API 接口文件 3. 创建数据库集合定义 4. 生成 Store 状态管理 5. 提供需求文档要求生成代码 6. 询问 uni-app 小程序开发规范 ## 快速开始 ### 1. 用户提供需求文档 用户应提供以下格式的需求文档: ```markdown # 模块名称 ## 功能描述 简要描述该模块的功能 ## 数据字段 - fieldName: 字段描述(必填/可选,类型) ## 页面列
npx skillsauth add shetengteng/skillix-hub skills/uniapp-mp-generatorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
版本: v1.0.0 作者: AI Assistant 参考项目: tt-paikebao-mp(排课宝)
这是一个基于 tt-paikebao-mp 项目代码规范的 uni-app 小程序代码生成器。根据用户提供的需求文档,自动生成符合项目规范的:
当用户请求以下内容时,应使用此 Skill:
用户应提供以下格式的需求文档:
# 模块名称
## 功能描述
简要描述该模块的功能
## 数据字段
- fieldName: 字段描述(必填/可选,类型)
## 页面列表
- 页面名称:页面描述
## 功能点
1. 功能点描述
从需求中提取:
按以下顺序生成:
| 技术 | 版本/说明 | |-----|---------| | uni-app | Vue3 模式 | | Vue | 3.x (Composition API + script setup) | | Pinia | 状态管理 | | sard-uniapp | UI 组件库 | | dayjs | 日期处理 | | EMAS Serverless | 阿里云云开发 |
所有数据库集合、云函数、存储路径使用统一前缀,在 config/index.js 中配置:
export const PROJECT_CONFIG = {
prefix: 'pkb', // 项目前缀
name: '排课宝',
// ...
}
生成代码时,自动使用此前缀:
{prefix}-students{prefix}-sendSmsCode{prefix}/avatars/{userId}/<template>
<view class="page bg-page">
<!-- 页面内容 -->
<TtBottomPlaceholder />
</view>
</template>
<script>
export default {
options: {
virtualHost: true,
styleIsolation: 'shared'
}
}
</script>
<script setup>
// 1. Vue 核心
import { ref, computed } from 'vue'
// 2. uni-app 生命周期
import { onShow } from '@dcloudio/uni-app'
// 3. 工具函数
import { dayjs } from '@/utils/date'
// 4. 组件
import TtBottomPlaceholder from '@/components/TtBottomPlaceholder.vue'
// 5. 路由/Store
import { goToXxx } from '@/route/index'
// 6. API
import { getXxxList } from './api/getXxxList'
// ============ 响应式数据 ============
const loading = ref(false)
const list = ref([])
// ============ 计算属性 ============
const isEmpty = computed(() => list.value.length === 0)
// ============ 生命周期 ============
onShow(() => {
loadData()
})
// ============ 方法 ============
const loadData = async () => {
// ...
}
</script>
<style lang="scss">
@import '@/styles/global.scss';
</style>
/**
* 获取列表
* @module pages/xxx/api/getXxxList
*/
import { db, COLLECTIONS } from '@/cloud-emas/database/database'
import { checkEmasError } from '@/cloud-emas/database/error'
import { requireAccountId } from '@/utils/auth'
/**
* 数据结构定义
* @typedef {Object} XxxItem
* @property {string} _id - ID
* @property {string} name - 名称
*/
/**
* 获取列表
* @returns {Promise<{success: boolean, list: XxxItem[], error?: string}>}
*/
export async function getXxxList(params = {}) {
try {
const accountId = requireAccountId()
if (!accountId) {
return { success: false, list: [], error: '未登录' }
}
const res = await db.collection(COLLECTIONS.XXX)
.where({ accountId })
.orderBy('createTime', 'desc')
.get()
checkEmasError(res, '获取列表')
return { success: true, list: res.data || [] }
} catch (error) {
console.error('[getXxxList] 失败:', error)
return { success: false, list: [], error: error.message }
}
}
export default getXxxList
| 类型 | 规范 | 示例 |
|-----|------|------|
| 组件文件 | PascalCase | StudentCard.vue |
| API 文件 | camelCase | getStudentList.js |
| 变量 | camelCase | studentList |
| 常量 | UPPER_SNAKE_CASE | COLLECTIONS |
| 集合名 | {prefix}-{name}s | pkb-students |
优先级:
flex-row、p-lg 等)全局工具类:
flex-row flex-col flex-center flex-betweentext-sm text-base text-lg text-mutedp-sm p-md p-lg m-sm m-md m-lgbg-page bg-card bg-mutedborder border-t border-brounded-sm rounded-md rounded-lgpages/
└── {module}/
├── api/ # API 文件
│ ├── get{Module}List.js
│ ├── get{Module}Detail.js
│ ├── create{Module}.js
│ ├── update{Module}.js
│ └── delete{Module}.js
├── components/ # 页面专属组件
│ ├── {Module}Card.vue
│ └── {Module}Filter.vue
├── index.vue # 列表页
└── sub/ # 子页面
├── detail/
│ └── index.vue # 详情页
└── add/
└── index.vue # 新增/编辑页
| 组件 | 说明 |
|-----|------|
| <TtAvatar> | 头像,自动生成背景色和首字 |
| <TtDialog> | 对话框,黑色确认按钮风格 |
| <TtTabbar> | 底部导航栏 |
| <TtSvg> | SVG 图标,支持渐变 |
| <TtInput> | 输入框,支持插槽 |
| <TtBottomPlaceholder> | 底部留白(必须) |
| <TtSafeBottom> | 安全区域占位 |
| 组件 | 用途 |
|-----|------|
| <sar-button> | 按钮 |
| <sar-input> | 输入框 |
| <sar-list> / <sar-list-item> | 列表 |
| <sar-popup> | 弹出层 |
| <sar-dialog> | 对话框 |
| <sar-toast-agent> | Toast 代理 |
| <sar-notify-agent> | 通知代理 |
| <sar-tabs> | 标签页 |
| <sar-empty> | 空状态 |
| <sar-tag> | 标签 |
| <sar-space> | 间距 |
| <sar-sticky> | 粘性定位 |
| <sar-form> / <sar-form-item> | 表单 |
| <sar-datetime-picker-popout> | 日期选择器 |
禁止使用 Emoji 图标
<!-- ❌ --> <text>🔵 张三</text>
<!-- ✅ --> <TtSvg name="user" /> <text>张三</text>
禁止直接导入 dayjs
// ❌ import dayjs from 'dayjs'
// ✅ import { dayjs } from '@/utils/date'
禁止使用 uni.showToast
// ❌ uni.showToast({ title: '成功' })
// ✅ toast.success('成功')
禁止直接使用 uni.navigateTo
// ❌ uni.navigateTo({ url: '/pages/xxx' })
// ✅ goToXxx() // 使用 route/index.js
禁止使用不兼容的 CSS
position: sticky → 使用 <sar-sticky>gap → 使用 <sar-space> 或 marginvar() → 使用 SCSS 变量所有注释使用中文
所有页面添加底部留白
<TtBottomPlaceholder />
页面引入全局样式
<style lang="scss">
@import '@/styles/global.scss';
</style>
组件配置样式隔离
export default {
options: {
virtualHost: true,
styleIsolation: 'shared'
}
}
API 文件包含完整类型定义
API 返回统一格式
{ success: boolean, data/list: any, error?: string }
使用 checkEmasError 检查数据库操作
使用 requireAccountId 检查登录状态
# 课程管理模块
## 功能描述
管理教师的课程信息
## 数据字段
- name: 课程名称(必填,字符串)
- duration: 课时时长(必填,数字,分钟)
- price: 单价(必填,数字,元)
- status: 状态(必填,枚举:active/inactive)
## 页面列表
- 课程列表页
- 课程详情页
- 新增课程页
## 功能点
1. 课程列表展示
2. 按状态筛选
3. 新增课程
4. 编辑课程
5. 删除课程
pages/course/
├── api/
│ ├── getCourseList.js
│ ├── getCourseDetail.js
│ ├── createCourse.js
│ ├── updateCourse.js
│ └── deleteCourse.js
├── components/
│ └── CourseCard.vue
├── index.vue
└── sub/
├── detail/
│ └── index.vue
└── add/
└── index.vue
route/index.js (更新)
pages.json (更新)
本 Skill 目录下提供了完整的代码模板,位于 templates/ 目录:
skills/uniapp-mp-generator/
├── SKILL.md # 本文件
├── default_config.json # 默认配置
└── templates/ # 代码模板
├── page/
│ ├── list.vue # 列表页模板
│ ├── detail.vue # 详情页模板
│ └── form.vue # 表单页模板
├── api/
│ ├── getList.js # 获取列表 API
│ ├── getDetail.js # 获取详情 API
│ ├── create.js # 创建 API
│ ├── update.js # 更新 API
│ └── delete.js # 删除 API
├── component/
│ ├── Card.vue # 卡片组件模板
│ └── Filter.vue # 筛选组件模板
├── store/
│ └── index.js # Store 模板
└── schema/
└── collection.js # 集合定义模板
使用方式:生成代码时,读取对应模板文件,替换模板变量后输出。
| 变量 | 说明 | 示例 |
|-----|------|------|
| {{MODULE_NAME}} | 模块名(PascalCase) | Student |
| {{MODULE_NAME_LOWER}} | 模块名(小写) | student |
| {{MODULE_NAME_CN}} | 模块中文名 | 学生 |
| {{DATE}} | 当前日期 | 2026-01-31 |
| {{PREFIX}} | 项目前缀 | pkb |
| {{COLLECTION_NAME}} | 集合常量名 | STUDENTS |
| {{FIELDS}} | 字段列表 | [{name, type, description}] |
development
读取网页内容,支持 SPA 页面自动检测与浏览器渲染降级。当普通 HTTP fetch 无法获取 Vue/React 等 SPA 页面的渲染数据时,自动通过 Playwright 浏览器获取完整内容。当用户需要读取网页数据、提取页面内容、或 WebFetch 工具返回空内容时使用。
tools
被动录制用户浏览器操作行为。打开浏览器后用户自由操作,系统通过 CDP + DOM 事件注入 自动记录点击、输入、导航等操作和 API 调用。录制完成后 LLM 分析生成结构化工作流。 支持参数化重放、生成独立 Skill、导出 Playwright 脚本。依赖 Playwright Skill。
development
读取并缓存 Swagger/OpenAPI 文档供模型使用。当用户需要添加、读取、刷新 API 文档,或使用 Swagger URL 时触发。
data-ai
苏格拉底式批判性思维分析。自动识别需求分析、系统设计、技术选型、数据分析四类场景,智能决定快速结论(≤1问)或深度探索(≤5问),防止过度追问与草率结论。Socratic critical thinking for requirements, design review, tech research, and data analysis.