菲鸽 пре 1 година
родитељ
комит
cd764b84a3

+ 106 - 0
.commitlintrc.cjs

@@ -0,0 +1,106 @@
+const fs = require('fs')
+const path = require('path')
+const { execSync } = require('child_process')
+
+const scopes = fs
+  .readdirSync(path.resolve(__dirname, 'src'), { withFileTypes: true })
+  .filter((dirent) => dirent.isDirectory())
+  .map((dirent) => dirent.name.replace(/s$/, ''))
+
+// precomputed scope
+const scopeComplete = execSync('git status --porcelain || true')
+  .toString()
+  .trim()
+  .split('\n')
+  .find((r) => ~r.indexOf('M  src'))
+  ?.replace(/(\/)/g, '%%')
+  ?.match(/src%%((\w|-)*)/)?.[1]
+  ?.replace(/s$/, '')
+
+module.exports = {
+  ignores: [(commit) => commit.includes('init')],
+  extends: ['@commitlint/config-conventional'],
+  rules: {
+    'body-leading-blank': [2, 'always'],
+    'footer-leading-blank': [1, 'always'],
+    'header-max-length': [2, 'always', 108],
+    'subject-empty': [2, 'never'],
+    'type-empty': [2, 'never'],
+    'subject-case': [0],
+    'type-enum': [
+      2,
+      'always',
+      [
+        'feat',
+        'fix',
+        'perf',
+        'style',
+        'docs',
+        'test',
+        'refactor',
+        'build',
+        'ci',
+        'chore',
+        'revert',
+        'wip',
+        'workflow',
+        'types',
+        'release',
+      ],
+    ],
+  },
+  prompt: {
+    /** @use `pnpm commit :f` */
+    alias: {
+      f: 'docs: fix typos',
+      r: 'docs: update README',
+      s: 'style: update code format',
+      b: 'build: bump dependencies',
+      c: 'chore: update config',
+    },
+    customScopesAlign: !scopeComplete ? 'top' : 'bottom',
+    defaultScope: scopeComplete,
+    scopes: [...scopes, 'mock'],
+    allowEmptyIssuePrefixs: false,
+    allowCustomIssuePrefixs: false,
+
+    // English
+    typesAppend: [
+      { value: 'wip', name: 'wip:      work in process' },
+      { value: 'workflow', name: 'workflow: workflow improvements' },
+      { value: 'types', name: 'types:    type definition file changes' },
+    ],
+
+    // 中英文对照版
+    // messages: {
+    //   type: '选择你要提交的类型 :',
+    //   scope: '选择一个提交范围 (可选):',
+    //   customScope: '请输入自定义的提交范围 :',
+    //   subject: '填写简短精炼的变更描述 :\n',
+    //   body: '填写更加详细的变更描述 (可选)。使用 "|" 换行 :\n',
+    //   breaking: '列举非兼容性重大的变更 (可选)。使用 "|" 换行 :\n',
+    //   footerPrefixsSelect: '选择关联issue前缀 (可选):',
+    //   customFooterPrefixs: '输入自定义issue前缀 :',
+    //   footer: '列举关联issue (可选) 例如: #31, #I3244 :\n',
+    //   confirmCommit: '是否提交或修改commit ?',
+    // },
+    // types: [
+    //   { value: 'feat', name: 'feat:     新增功能' },
+    //   { value: 'fix', name: 'fix:      修复缺陷' },
+    //   { value: 'docs', name: 'docs:     文档变更' },
+    //   { value: 'style', name: 'style:    代码格式' },
+    //   { value: 'refactor', name: 'refactor: 代码重构' },
+    //   { value: 'perf', name: 'perf:     性能优化' },
+    //   { value: 'test', name: 'test:     添加疏漏测试或已有测试改动' },
+    //   { value: 'build', name: 'build:    构建流程、外部依赖变更 (如升级 npm 包、修改打包配置等)' },
+    //   { value: 'ci', name: 'ci:       修改 CI 配置、脚本' },
+    //   { value: 'revert', name: 'revert:   回滚 commit' },
+    //   { value: 'chore', name: 'chore:    对构建过程或辅助工具和库的更改 (不影响源文件、测试用例)' },
+    //   { value: 'wip', name: 'wip:      正在开发中' },
+    //   { value: 'workflow', name: 'workflow: 工作流程改进' },
+    //   { value: 'types', name: 'types:    类型定义文件修改' },
+    // ],
+    // emptyScopesAlias: 'empty:      不填写',
+    // customScopesAlias: 'custom:     自定义',
+  },
+}

+ 14 - 1
.vscode/settings.json

@@ -48,5 +48,18 @@
     "uvui",
     "WechatMiniprogram"
   ],
-  "typescript.tsdk": "node_modules\\typescript\\lib"
+  "typescript.tsdk": "node_modules\\typescript\\lib",
+  // 控制相关文件嵌套展示
+  "explorer.fileNesting.enabled": true,
+  "explorer.fileNesting.expand": false,
+  "explorer.fileNesting.patterns": {
+    "*.ts": "$(capture).test.ts, $(capture).test.tsx",
+    "*.tsx": "$(capture).test.ts, $(capture).test.tsx",
+    "*.env": "$(capture).env.*",
+    "CHANGELOG.md": "CHANGELOG*",
+    "package.json": "pnpm-lock.yaml,pnpm-workspace.yaml,LICENSE,.gitattributes,.gitignore,.gitpod.yml,CNAME,README*,.npmrc,.browserslistrc",
+    ".eslintrc.cjs": ".eslintignore,.prettierignore,.stylelintignore,.commitlintrc.*,.prettierrc.*,.stylelintrc.*,.eslintrc-auto-import.json,.editorconfig,.commitlint.cjs",
+    "vite.config.ts": "tsconfig.*.json,uno.config.ts,tsconfig.json,uni-pages.d.ts",
+    "manifest.config.ts": "manifest.config.ts,pages.config.ts"
+  }
 }

+ 0 - 51
commitlint.config.cjs

@@ -1,51 +0,0 @@
-// commitlint.config.cjs
-
-module.exports = {
-  extends: ['@commitlint/config-conventional'],
-  rules: {
-    // 'body-leading-blank': [2, 'always'], // 主体前有空行,默认就是 always
-    // 'footer-leading-blank': [2, 'always'], // 末行前有空行,默认就是 always
-    // 'header-max-length': [2, 'always', 108], // 首行最大长度,默认就是 always,72
-    // 'subject-empty': [2, 'never'], // 标题不可为空,默认就是 never
-    // 'type-empty': [2, 'never'], // 类型不可为空,默认就是 never
-
-    // 允许的类型
-    'type-enum': [
-      2,
-      'always',
-      [
-        'build', // 构造工具、外部依赖(webpack、npm)
-        'chore', // 不涉及 src、test 的其他修改(构建过程或辅助工具的变更)
-        'ci', // 修改项目继续集成流程(Travis,Jenkins,GitLab CI,Circle等)
-        'docs', // 文档
-        'feat', // 新增功能
-        'fix', // bug 修复
-        'perf', // 性能优化
-        'refactor', // 重构
-        'revert', // 回退
-        'style', // 代码风格(不影响代码含义)
-        'test', // 测试
-
-        // 下面几个是自定义新增的
-        'wip', // 开发中
-        'refine', // 小优化,没有到 refactor 的程度
-      ],
-    ],
-  },
-}
-
-// @see https://commitlint.js.org/#/reference-rules?id=type-enum
-// 默认值为:
-// [
-//   'build',
-//   'chore',
-//   'ci',
-//   'docs',
-//   'feat',
-//   'fix',
-//   'perf',
-//   'refactor',
-//   'revert',
-//   'style',
-//   'test',
-// ];

+ 0 - 1
manifest.config.ts

@@ -5,7 +5,6 @@ import { loadEnv } from 'vite'
 
 // 获取环境变量的范例
 const env = loadEnv(process.env.NODE_ENV!, path.resolve(process.cwd(), 'env'))
-// console.log(env)
 const {
   VITE_APP_TITLE,
   VITE_UNI_APPID,

+ 3 - 1
package.json

@@ -62,7 +62,8 @@
     "build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei",
     "build:quickapp-webview-union": "uni build -p quickapp-webview-union",
     "prepare": "git init && husky install ",
-    "type-check": "vue-tsc --noEmit"
+    "type-check": "vue-tsc --noEmit",
+    "cz": "czg"
   },
   "lint-staged": {
     "**/*.{html,vue,ts,cjs,json,md}": [
@@ -93,6 +94,7 @@
     "@dcloudio/uni-mp-weixin": "3.0.0-4010420240430001",
     "@dcloudio/uni-mp-xhs": "3.0.0-4010420240430001",
     "@dcloudio/uni-quickapp-webview": "3.0.0-4010420240430001",
+    "czg": "^1.9.2",
     "dayjs": "1.11.10",
     "pinia": "2.0.36",
     "pinia-plugin-persistedstate": "3.2.1",

+ 9 - 0
pnpm-lock.yaml

@@ -50,6 +50,9 @@ dependencies:
   '@dcloudio/uni-quickapp-webview':
     specifier: 3.0.0-4010420240430001
     version: 3.0.0-4010420240430001(postcss@8.4.38)(vue@3.4.26)
+  czg:
+    specifier: ^1.9.2
+    version: 1.9.2
   dayjs:
     specifier: 1.11.10
     version: 1.11.10
@@ -5528,6 +5531,12 @@ packages:
   /csstype@3.1.3:
     resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
 
+  /czg@1.9.2:
+    resolution: {integrity: sha512-uPSKTIsAhZp1Tu7DRO7K68qPixVFyheRKlOGhuKXo2wdlpcE0hoCmTQAwsUTerKtjcFRnhRTpJ5j0bC6SOj01Q==}
+    engines: {node: '>=v12.20.0'}
+    hasBin: true
+    dev: false
+
   /dargs@7.0.0:
     resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==}
     engines: {node: '>=8'}

+ 7 - 7
src/hooks/useRequest.ts

@@ -1,7 +1,7 @@
 import { UnwrapRef } from 'vue'
 
 type IUseRequestOptions<T> = {
-  /** 是否立即执行,如果是则在onLoad执行 */
+  /** 是否立即执行 */
   immediate?: boolean
   /** 初始化数据 */
   initialData?: T
@@ -11,34 +11,34 @@ type IUseRequestOptions<T> = {
  * useRequest是一个定制化的请求钩子,用于处理异步请求和响应。
  * @param func 一个执行异步请求的函数,返回一个包含响应数据的Promise。
  * @param options 包含请求选项的对象 {immediate, initialData}。
- * @param options.immediate 是否立即执行请求,默认为true。
+ * @param options.immediate 是否立即执行请求,默认为false。
  * @param options.initialData 初始化数据,默认为undefined。
  * @returns 返回一个对象{loading, error, data, run},包含请求的加载状态、错误信息、响应数据和手动触发请求的函数。
  */
 export default function useRequest<T>(
   func: () => Promise<IResData<T>>,
-  options: IUseRequestOptions<T> = { immediate: true },
+  options: IUseRequestOptions<T> = { immediate: false },
 ) {
   const loading = ref(false)
   const error = ref(false)
   const data = ref<T>(options.initialData)
   const run = async () => {
     loading.value = true
-    func()
+    return func()
       .then((res) => {
         data.value = res.data as UnwrapRef<T>
         error.value = false
+        return data.value
       })
       .catch((err) => {
         error.value = err
+        throw err
       })
       .finally(() => {
         loading.value = false
       })
   }
 
-  onLoad(() => {
-    options.immediate && run()
-  })
+  options.immediate && run()
   return { loading, error, data, run }
 }

+ 3 - 3
src/hooks/useUpload.ts

@@ -23,7 +23,7 @@ export default function useUpload<T = string>(formData: Record<string, any> = {}
         uploadFile<T>({ tempFilePath, formData, data, error, loading })
       },
       fail: (err) => {
-        console.log('uni.chooseMedia err->', err)
+        console.error('uni.chooseMedia err->', err)
         error.value = true
       },
     })
@@ -37,7 +37,7 @@ export default function useUpload<T = string>(formData: Record<string, any> = {}
         uploadFile<T>({ tempFilePath, formData, data, error, loading })
       },
       fail: (err) => {
-        console.log('uni.chooseImage err->', err)
+        console.error('uni.chooseImage err->', err)
         error.value = true
       },
     })
@@ -57,7 +57,7 @@ function uploadFile<T>({ tempFilePath, formData, data, error, loading }) {
       data.value = uploadFileRes.data as T
     },
     fail: (err) => {
-      console.log('uni.uploadFile err->', err)
+      console.error('uni.uploadFile err->', err)
       error.value = true
     },
     complete: () => {

+ 1 - 1
src/interceptors/request.ts

@@ -28,7 +28,7 @@ const httpInterceptor = {
     // 非 http 开头需拼接地址
     if (!options.url.startsWith('http')) {
       // #ifdef H5
-      console.log(__VITE_APP_PROXY__)
+      // console.log(__VITE_APP_PROXY__)
       if (JSON.parse(__VITE_APP_PROXY__)) {
         // 啥都不需要做
       } else {

+ 1 - 0
src/pages/about/components/request.vue

@@ -47,6 +47,7 @@ const recommendUrl = ref('http://laf.run/signup?code=ohaOgIX')
 const initialData = undefined
 // 适合少部分全局性的接口————多个页面都需要的请求接口,额外编写一个 Service 层
 const { loading, error, data, run } = useRequest<IFooItem>(() => getFooAPI('菲鸽'), {
+  immediate: true,
   initialData,
 })
 const reset = () => {

+ 1 - 1
src/pages/index/index.vue

@@ -43,7 +43,7 @@ const author = ref('菲鸽')
 const description = ref(
   'unibest 是一个集成了多种工具和技术的 uniapp 开发模板,由 uniapp + Vue3 + Ts + Vite4 + UnoCss + UniUI + VSCode 构建,模板具有代码提示、自动格式化、统一配置、代码片段等功能,并内置了许多常用的基本组件和基本功能,让你编写 uniapp 拥有 best 体验。',
 )
-
+// 测试 uni API 自动引入
 onLoad(() => {
   console.log(author)
 })

+ 10 - 5
src/utils/index.ts

@@ -1,4 +1,3 @@
-// @ts-expect-error import json file
 import { pages, subPackages, tabBar } from '@/pages.json'
 
 /** 判断当前页面是否是tabbar页  */
@@ -31,7 +30,7 @@ export const currRoute = () => {
   // console.log('lastPage.options:', (lastPage as any).options)
   // 经过多端测试,只有 fullPath 靠谱,其他都不靠谱
   const { fullPath } = currRoute as { fullPath: string }
-  console.log(fullPath)
+  // console.log(fullPath)
   // eg: /pages/login/index?redirect=%2Fpages%2Fdemo%2Fbase%2Froute-interceptor (小程序)
   // eg: /pages/login/index?redirect=%2Fpages%2Froute-interceptor%2Findex%3Fname%3Dfeige%26age%3D30(h5)
   return getUrlObj(fullPath)
@@ -50,12 +49,18 @@ const ensureDecodeURIComponent = (url: string) => {
  */
 export const getUrlObj = (url: string) => {
   const [path, queryStr] = url.split('?')
-  console.log(path, queryStr)
+  // console.log(path, queryStr)
 
+  if (!queryStr) {
+    return {
+      path,
+      query: {},
+    }
+  }
   const query: Record<string, string> = {}
   queryStr.split('&').forEach((item) => {
     const [key, value] = item.split('=')
-    console.log(key, value)
+    // console.log(key, value)
     query[key] = ensureDecodeURIComponent(value) // 这里需要统一 decodeURIComponent 一下,可以兼容h5和微信y
   })
   return { path, query }
@@ -91,7 +96,7 @@ export const getAllPages = (key = 'needLogin') => {
       })
   })
   const result = [...mainPages, ...subPages]
-  console.log(`getAllPages by ${key} result: `, result)
+  // console.log(`getAllPages by ${key} result: `, result)
   return result
 }
 

+ 0 - 28
uni-pages.d.ts

@@ -1,28 +0,0 @@
-/* eslint-disable */
-/* prettier-ignore */
-// @ts-nocheck
-// Generated by vite-plugin-uni-pages
-
-interface NavigateToOptions {
-  url: "/pages/index/index" |
-       "/pages/index/about" |
-       "/pages/index/request" |
-       "/pages/index/request2" |
-       "/pages/index/upload" |
-       "/pages/index/upload2" |
-       "/pages-sub/demo/index";
-}
-interface RedirectToOptions extends NavigateToOptions {}
-
-interface SwitchTabOptions {
-  url: "/pages/index/index" | "/pages/index/about"
-}
-
-type ReLaunchOptions = NavigateToOptions | SwitchTabOptions;
-
-declare interface Uni {
-  navigateTo(options: UniNamespace.NavigateToOptions & NavigateToOptions): void;
-  redirectTo(options: UniNamespace.RedirectToOptions & RedirectToOptions): void;
-  switchTab(options: UniNamespace.SwitchTabOptions & SwitchTabOptions): void;
-  reLaunch(options: UniNamespace.ReLaunchOptions & ReLaunchOptions): void;
-}

+ 12 - 0
vite.config.ts

@@ -62,6 +62,18 @@ export default ({ command, mode }) => {
       UniManifest(),
       // UniXXX 需要在 Uni 之前引入
       Uni(),
+      {
+        // 临时解决 dcloudio 官方的 @dcloudio/uni-mp-compiler 出现的编译 BUG
+        // 参考 github issue: https://github.com/dcloudio/uni-app/issues/4952
+        // 自定义插件禁用 vite:vue 插件的 devToolsEnabled,强制编译 vue 模板时 inline 为 true
+        name: 'fix-vite-plugin-vue',
+        configResolved(config) {
+          const plugin = config.plugins.find((p) => p.name === 'vite:vue')
+          if (plugin && plugin.api && plugin.api.options) {
+            plugin.api.options.devToolsEnabled = false
+          }
+        },
+      },
       UnoCSS(),
       AutoImport({
         imports: ['vue', 'uni-app'],