.agent/skills/uni-page-generator/SKILL.md
@@ -64,7 +64,7 @@ ├── pages/ # 主包页面(TabBar 页面) │ ├── index/ │ │ └── index.vue │ └── about/ │ └── mine/ │ └── index.vue ├── subPages/ # 分包页面 │ ├── router/ .versionrc
File was deleted CHANGELOG.md
File was deleted README.md
@@ -1,10 +1,3 @@ <p align="center"> <img alt="logo" src="https://starter.wot-ui.cn/logo.svg" width="200"> </p> <h1 align="center"> Wot Starter </h1> <p align="center">基于<a href="https://github.com/uni-helper/vitesse-uni-app">vitesse-uni-app</a>的深度整合 Wot UI 组件库,现代化的 uni-app 快速起手项目</p> @@ -71,45 +64,3 @@ | [wot-design-uni AI 助手](https://www.coze.cn/store/bot/7347916532258701363) | 一个能回答你关于 wot-ui 组件库问题的智能助手 | | [uni-ku-root](https://github.com/uni-ku/root) | 一个模拟 App.vue 原有能力的根组件插件 | | [uni-echarts](https://uni-echarts.xiaohe.ink/) | 适用于 uni-app 的 Apache ECharts 组件 | ## 贡献者们 感谢以下所有给 Wot Starter 贡献过代码的 [开发者](https://github.com/wot-ui/wot-starter/graphs/contributors)。 <a href="https://github.com/wot-ui/wot-starter/graphs/contributors"> <img src="https://contrib.rocks/image?repo=wot-ui/wot-starter" /> </a> ## 捐赠本项目 开发一个好的模板是一项耗时的工作,尤其是要多端适配。为此 Wot Starter 的开发者经常肝到深夜 …… 如果您认为 Wot Starter 帮助到了您的开发工作,您可以捐赠 Wot Starter 的研发工作,捐赠无门槛,哪怕是一杯可乐也好。 捐赠后您的昵称、留言等将会展示在[捐赠榜单](https://wot-ui.cn/reward/donor.html)中。 ### 爱发电捐赠 <a href="https://afdian.com/a/weisheng233">https://afdian.com/a/weisheng233</a> ### 扫码捐赠 <p> <img src="https://wot-ui.cn/weixinQrcode.jpg" width="200" height="200" style="margin-right:30px"/> <img src="https://wot-ui.cn/alipayQrcode.jpg" width="200" height="200" /> </p> ## 鸣谢 - [uni-helper](https://github.com/uni-helper) - 感谢 uni-helper 团队为 uni-app 开发体验优化做出的贡献。 - [vitesse-uni-app](https://github.com/uni-helper/vitesse-uni-app) - 感谢 vitesse-uni-app 提供的快速起手项目。 - [uni-ku](https://uni-ku.js.org/) - 感谢 uni-ku 团队为 uni-app 插件生态做出的贡献。 ## 开源协议 本项目基于 [MIT](https://zh.wikipedia.org/wiki/MIT%E8%A8%B1%E5%8F%AF%E8%AD%89) 协议,请自由地享受和参与开源。 [](https://star-history.com/#wot-ui/wot-starter&Date) manifest.config.ts
@@ -11,7 +11,7 @@ export default defineManifestConfig({ 'name': 'wot-starter', 'appid': '__UNI__1208592', 'appid': 'wxe91f1af7638aa5dd', 'description': '', 'versionName': '1.0.0', 'versionCode': '100', pages.config.ts
@@ -46,7 +46,7 @@ list: [{ pagePath: 'pages/index/index', }, { pagePath: 'pages/about/index', pagePath: 'pages/mine/index', }], }, }) src/App.vue
@@ -3,6 +3,10 @@ </script> <style lang="scss"> @font-face { font-family: 'YouSheBiaoTiHei'; src: url('https://deshenghuiyuan.obs.cn-southwest-2.myhuaweicloud.com/images/1a57f53ff4804f3fbb183c559b607972.ttf'); } .page-wraper { min-height: calc(100vh - var(--window-top)); box-sizing: border-box; src/api/mock/mockAdapter.ts
@@ -33,7 +33,7 @@ onMockResponse: uniappMockResponse, // 根据环境变量启用/禁用mock enable: true, enable: false, // 添加延迟以模拟网络延迟 (200-600ms) delay: Math.random() * 400 + 200, src/components.d.ts
@@ -12,19 +12,11 @@ GlobalMessage: typeof import('./components/GlobalMessage.vue')['default'] GlobalToast: typeof import('./components/GlobalToast.vue')['default'] PrivacyPopup: typeof import('./components/PrivacyPopup.vue')['default'] UniEcharts: typeof import('uni-echarts')['default'] WdActionSheet: typeof import('wot-design-uni/components/wd-action-sheet/wd-action-sheet.vue')['default'] WdButton: typeof import('wot-design-uni/components/wd-button/wd-button.vue')['default'] WdCell: typeof import('wot-design-uni/components/wd-cell/wd-cell.vue')['default'] WdCellGroup: typeof import('wot-design-uni/components/wd-cell-group/wd-cell-group.vue')['default'] WdConfigProvider: typeof import('wot-design-uni/components/wd-config-provider/wd-config-provider.vue')['default'] WdGap: typeof import('wot-design-uni/components/wd-gap/wd-gap.vue')['default'] WdIcon: typeof import('wot-design-uni/components/wd-icon/wd-icon.vue')['default'] WdInput: typeof import('wot-design-uni/components/wd-input/wd-input.vue')['default'] WdMessageBox: typeof import('wot-design-uni/components/wd-message-box/wd-message-box.vue')['default'] WdNotify: typeof import('wot-design-uni/components/wd-notify/wd-notify.vue')['default'] WdPopup: typeof import('wot-design-uni/components/wd-popup/wd-popup.vue')['default'] WdSwitch: typeof import('wot-design-uni/components/wd-switch/wd-switch.vue')['default'] WdTabbar: typeof import('wot-design-uni/components/wd-tabbar/wd-tabbar.vue')['default'] WdTabbarItem: typeof import('wot-design-uni/components/wd-tabbar-item/wd-tabbar-item.vue')['default'] WdToast: typeof import('wot-design-uni/components/wd-toast/wd-toast.vue')['default'] src/composables/useTabbar.ts
@@ -3,12 +3,27 @@ value: number | null active: boolean title: string icon: string activeIcon: string inactiveIcon: string } const tabbarItems = ref<TabbarItem[]>([ { name: 'home', value: null, active: true, title: '首页', icon: 'home' }, { name: 'about', value: null, active: false, title: '关于', icon: 'user' }, { name: 'home', value: null, active: true, title: '首页', activeIcon: '/static/tabbar/home-s.png', inactiveIcon: '/static/tabbar/home-no.png', }, { name: 'mine', value: null, active: false, title: '我的', activeIcon: '/static/tabbar/mine-s.png', inactiveIcon: '/static/tabbar/mine-no.png', }, ]) export function useTabbar() { src/layouts/tabbar.vue
@@ -36,12 +36,16 @@ <slot /> <wd-gap safe-area-bottom height="var(--wot-tabbar-height, 50px)" /> <wd-tabbar :model-value="activeTabbar.name" bordered safe-area-inset-bottom fixed :model-value="activeTabbar.name" active-color="#0068FF" inactive-color="#1A1A1A" bordered safe-area-inset-bottom fixed @change="handleTabbarChange" > <wd-tabbar-item v-for="(item, index) in tabbarList" :key="index" :name="item.name" :value="getTabbarItemValue(item.name)" :title="item.title" :icon="item.icon" /> :value="getTabbarItemValue(item.name)" :title="item.title" > <template #icon="{ active }"> <image class="h-[44rpx] w-[44rpx]" :src="active ? item.activeIcon : item.inactiveIcon" mode="aspectFit" /> </template> </wd-tabbar-item> </wd-tabbar> </template> src/manifest.json
@@ -1,6 +1,6 @@ { "name": "wot-starter", "appid": "__UNI__1208592", "appid": "wxe91f1af7638aa5dd", "description": "", "versionName": "1.0.0", "versionCode": "100", src/pages.json
New file @@ -0,0 +1,56 @@ { "globalStyle": { "navigationBarBackgroundColor": "@navBgColor", "navigationBarTextStyle": "@navTxtStyle", "navigationBarTitleText": "Wot Starter", "backgroundColor": "@bgColor", "backgroundTextStyle": "@bgTxtStyle", "backgroundColorTop": "@bgColorTop", "backgroundColorBottom": "@bgColorBottom", "enablePullDownRefresh": false, "onReachBottomDistance": 50, "animationType": "pop-in", "animationDuration": 300 }, "pages": [ // GENERATED BY UNI-PAGES, PLATFORM: MP-WEIXIN { "path": "pages/index/index", "type": "home", "name": "home", "layout": "tabbar", "style": { "navigationStyle": "custom" } }, { "path": "pages/mine/index", "type": "page", "name": "mine", "layout": "tabbar", "style": { "navigationBarTitleText": "我的" } } ], "subPackages": [], "tabBar": { "custom": true, "customize": true, "overlay": true, "height": "0", "color": "@tabColor", "selectedColor": "@tabSelectedColor", "backgroundColor": "@tabBgColor", "borderStyle": "@tabBorderStyle", "list": [ // GENERATED BY UNI-PAGES, PLATFORM: MP-WEIXIN { "pagePath": "pages/index/index" }, { "pagePath": "pages/mine/index" } ] } } src/pages/about/index.vue
File was deleted src/pages/index/index.vue
@@ -1,137 +1,135 @@ <script setup lang="ts"> const { safeAreaInsets } = uni.getSystemInfoSync() definePage({ name: 'home', layout: 'tabbar', style: { navigationBarTitleText: '首页', navigationStyle: 'custom', }, }) const router = useRouter() const { theme, toggleTheme, currentThemeColor, showThemeColorSheet, themeColorOptions, openThemeColorPicker, closeThemeColorPicker, selectThemeColor, setFollowSystem, } = useManualTheme() const isDark = computed({ get() { return theme.value === 'dark' }, set() { toggleTheme() }, }) // 页面跳转方法 function navigateTo(name: string) { router.push({ name, }) } // 处理主题色选择 function handleThemeColorSelect(option: any) { selectThemeColor(option) } function openUrl(url: string) { window.open(url, '_blank') } </script> <template> <view class="box-border py-3"> <view class="mx-3 box-border rounded-3 bg-white px-4 py-6 text-center dark:bg-[var(--wot-dark-background2)]"> <text class="mb-3 block text-left text-5 text-gray-800 font-bold dark:text-gray-200"> Wot Starter </text> <text class="mb-3 block text-left text-30rpx text-gray-600 leading-relaxed dark:text-gray-300"> ⚡️ 基于 vitesse-uni-app 由 vite & uni-app 驱动的、深度整合 Wot UI 组件库的快速启动模板 </text> <text class="block text-left text-3 text-gray-400 leading-relaxed dark:text-gray-400"> 背靠 Uni Helper、Wot UI 团队,告别 HBuilderX ,拥抱现代前端开发工具链 <view class="relative bg-[#F8F9FA]"> <!-- 背景图 --> <image src="/static/home/bg.png" class="absolute left-0 top-0 z-0 h-[1624rpx] w-full" mode="scaleToFill" /> <!-- 内容区 --> <view class="relative z-10" :style="{ paddingTop: `${safeAreaInsets?.top || 44}px` }"> <!-- 导航栏标题 --> <view class="mb-[64rpx] h-[88rpx] flex items-center px-[32rpx]"> <text class="text-[36rpx] text-white font-medium"> 预约小程序 </text> </view> <demo-block title="基础设置" transparent> <wd-cell-group border custom-class="rounded-2! overflow-hidden"> <wd-cell title="暗黑模式"> <wd-switch v-model="isDark" size="18px" /> </wd-cell> <wd-cell title="跟随系统"> <wd-button size="small" @click="setFollowSystem"> 跟随系统 </wd-button> </wd-cell> <wd-cell title="选择主题色" is-link @click="openThemeColorPicker"> <view class="flex items-center justify-end gap-2"> <!-- 欢迎使用区 --> <view class="mb-[36rpx] flex items-center pl-[26rpx] pr-[22rpx]"> <image src="/static/home/hi.png" class="mr-[24rpx] h-[96rpx] w-[212rpx]" mode="aspectFit" /> <view class="welcome-title flex items-center text-[56rpx] text-white font-[600]"> <text>欢迎使用,</text> <view class="login-text relative"> 请登录 <view class="login-text__underline absolute bottom-0 left-0 h-[4rpx] w-full bg-white" /> </view> </view> </view> <!-- 待办/待接待区 --> <view class="mb-[32rpx] w-full pl-[26rpx] pr-[22rpx]" style="box-sizing: border-box;"> <view class="h-4 w-4 rounded-full" :style="{ backgroundColor: currentThemeColor.primary }" /> <text>{{ currentThemeColor.name }}</text> </view> </wd-cell> </wd-cell-group> </demo-block> <demo-block title="工具链介绍" transparent> <wd-cell-group border custom-class="rounded-2! overflow-hidden"> <wd-cell title="🧩 WotUI组件库" is-link @click="openUrl('https://wot-ui.cn/')" /> <wd-cell title="🧠 Agent Skills" is-link @click="navigateTo('skills')" /> <wd-cell title="🚦 Router 路由管理" is-link @click="navigateTo('router')" /> <wd-cell title="🌐 Alova 网络请求" is-link @click="navigateTo('request')" /> <wd-cell title="🎨 Icon 图标" is-link @click="navigateTo('icon')" /> <wd-cell title="✨ Unocss 原子化" is-link @click="navigateTo('styles')" /> <wd-cell title="🍍 Pinia 持久化" is-link @click="navigateTo('pinia')" /> <wd-cell title="💬 Fedback 反馈组件" is-link @click="navigateTo('feedback')" /> <wd-cell title="🌱 CreateUni 脚手架" is-link @click="navigateTo('create-uni') " /> <wd-cell title="🔄 CI/CD 持续集成" is-link @click="navigateTo('ci')" /> <wd-cell title="🦾 uni-ku/root" is-link @click="navigateTo('root')" /> <wd-cell title="📊 uni-echarts" is-link @click="navigateTo('echarts')" /> </wd-cell-group> </demo-block> <!-- 主题色选择 ActionSheet --> <wd-action-sheet v-model="showThemeColorSheet" title="选择主题色" :close-on-click-action="true" @cancel="closeThemeColorPicker" class="rounded-[16rpx] p-[24rpx] pb-[26rpx]" style="background: linear-gradient(180deg, #CCE4FE 0%, #FAFCFD 40%, #FDFDFD 100%); box-shadow: 0 4rpx 8rpx 0 rgba(0, 104, 255, 0.2);border: 1rpx solid #fff;" > <view class="px-4 pb-4"> <view class="flex gap-[30rpx]"> <!-- 待办 --> <view v-for="option in themeColorOptions" :key="option.value" class="flex items-center justify-between border-b border-gray-100 py-3 last:border-b-0 dark:border-gray-700" @click="handleThemeColorSelect(option)" class="h-[126rpx] w-[312rpx] flex rounded-[20rpx] pl-[38rpx] pt-[20rpx]" style="background: url('/static/home/toDo_bg.png') no-repeat center center; background-size: 100%;box-sizing: border-box; box-shadow: 0 2rpx 8rpx 0 rgba(119, 144, 213, 0.3)" > <view class="flex items-center gap-3"> <view class="h-6 w-6 border-2 border-gray-200 rounded-full dark:border-gray-600" :style="{ backgroundColor: option.primary }" /> <text class="text-4 text-gray-800 dark:text-gray-200"> {{ option.name }} <image src="/static/home/toDo.png" class="mr-[14rpx] h-[100rpx] w-[108rpx]" /> <view class="mt-[8rpx] flex flex-col"> <text class="mb-[4rpx] text-[24rpx] text-[#056DFF] font-[600]"> 待办 </text> <text class="text-[32rpx] text-[#056DFF] font-bold"> - </text> </view> <wd-icon v-if="currentThemeColor.value === option.value" name="check" :color="option.primary" size="20px" /> </view> <!-- 待接待 --> <view class="h-[126rpx] w-[312rpx] flex items-center rounded-[20rpx] pl-[38rpx] pt-[20rpx]" style="background: url('/static/home/wait_bg.png') no-repeat center center; background-size: 100%;box-sizing: border-box; box-shadow: 0 2rpx 8rpx 0 rgba(119, 144, 213, 0.3)" > <image src="/static/home/wait.png" class="mr-[14rpx] h-[100rpx] w-[108rpx]" /> <view class="mt-[8rpx] flex flex-col"> <text class="mb-[4rpx] text-[24rpx] text-[#F86911] font-[600]"> 待接待 </text> <text class="text-[32rpx] text-[#F86911] font-bold"> - </text> </view> </view> <wd-gap :height="50" /> </wd-action-sheet> </view> </view> </view> <!-- 功能区 --> <view class="flex gap-[16rpx] pl-[24rpx] pr-[22rpx]"> <!-- 预约 --> <view class="h-[240rpx] w-[344rpx] flex flex-1 flex-col items-center justify-center rounded-[20rpx]" style="background: linear-gradient(180deg, #DEF4FF 0%, #FFFFFF 100%);border: 1rpx solid #fff;box-shadow: 0 4rpx 10rpx 0 rgba(0, 104, 255, 0.16)" > <image src="/static/home/appointment.png" class="mb-[12rpx] h-[96rpx] w-[96rpx]" /> <text class="text-[28rpx] text-[#1a1a1a]"> 预约 </text> </view> <!-- 预约记录 & 常用来访人 --> <view class="flex flex-1 flex-col gap-[16rpx]"> <view class="flex flex-1 items-center rounded-[20rpx] px-[40rpx]" style="background: linear-gradient(180deg, #FFF7E0 0%, #FFFFFF 100%);box-shadow: 0 4rpx 10rpx 0 rgba(0, 104, 255, 0.16)"> <image src="/static/home/record.png" class="mr-[16rpx] h-[64rpx] w-[64rpx]" /> <text class="text-[28rpx] text-[#000000]"> 预约记录 </text> </view> <view class="flex flex-1 items-center rounded-[20rpx] px-[40rpx]" style="background: linear-gradient(180deg, #E0FAEE 0%, #FFFFFF 100%);border: 1rpx solid #fff;box-shadow: 0 4rpx 10rpx 0 rgba(0, 104, 255, 0.16)" > <image src="/static/home/visitor.png" class="mr-[16rpx] h-[64rpx] w-[64rpx]" /> <text class="text-[28rpx] text-[#000000]"> 常用来访人 </text> </view> </view> </view> </view> <!-- 悬浮流程图标 --> <image src="/static/home/process.png" class="fixed bottom-[482rpx] right-[-42rpx] z-50 h-[128rpx] w-[128rpx]" /> </view> </template> <style scoped> .welcome-title { font-family: 'YouSheBiaoTiHei', sans-serif; } .welcome-title text { font-family: 'YouSheBiaoTiHei', sans-serif; } .login-text { display: inline-block; position: relative; } </style> src/pages/mine/index.vue
New file @@ -0,0 +1,13 @@ <script setup lang="ts"> definePage({ name: 'mine', layout: 'tabbar', style: { navigationBarTitleText: '我的', }, }) </script> <template> <view /> </template> src/static/home/appointment.png
src/static/home/bg.png
src/static/home/hi.png
src/static/home/process.png
src/static/home/record.png
src/static/home/tips.png
src/static/home/toDo.png
src/static/home/toDo_bg.png
src/static/home/visitor.png
src/static/home/wait.png
src/static/home/wait_bg.png
src/static/tabbar/home-no.png
src/static/tabbar/home-s.png
src/static/tabbar/mine-no.png
src/static/tabbar/mine-s.png
src/static/vite.pngBinary files differ
src/uni-pages.d.ts
@@ -5,26 +5,7 @@ type _LocationUrl = "/pages/index/index" | "/pages/about/index" | "/subPages/ci/index" | "/subPages/create-uni/index" | "/subPages/feedback/index" | "/subPages/icon/index" | "/subPages/pinia/index" | "/subPages/request/index" | "/subPages/router/demo-aftereach" | "/subPages/router/demo-guard" | "/subPages/router/demo-object" | "/subPages/router/demo-params" | "/subPages/router/demo-protected" | "/subPages/router/demo-query" | "/subPages/router/demo-string" | "/subPages/router/index" | "/subPages/skills/index" | "/subPages/styles/index" | "/subPages/uni-ku-root/index" | "/subEcharts/echarts/index" | "/subAsyncEcharts/asyncEcharts/index"; "/pages/mine/index"; interface NavigateToOptions { url: _LocationUrl; @@ -32,7 +13,7 @@ interface RedirectToOptions extends NavigateToOptions {} interface SwitchTabOptions { url: "/pages/index/index" | "/pages/about/index" url: "/pages/index/index" | "/pages/mine/index" } type ReLaunchOptions = NavigateToOptions | SwitchTabOptions; vite.config.ts
@@ -25,11 +25,6 @@ // https://github.com/uni-helper/vite-plugin-uni-pages UniHelperPages({ dts: 'src/uni-pages.d.ts', subPackages: [ 'src/subPages', ], /** * 排除的页面,相对于 dir 和 subPackages * @default []