gemercheung 2 years ago
parent
commit
ad3126f88a

+ 15 - 15
.eslintrc.js

@@ -1,11 +1,11 @@
 // @ts-check
 // @ts-check
-const { defineConfig } = require('eslint-define-config');
+const { defineConfig } = require('eslint-define-config')
 module.exports = defineConfig({
 module.exports = defineConfig({
   root: true,
   root: true,
   env: {
   env: {
     browser: true,
     browser: true,
     node: true,
     node: true,
-    es6: true,
+    es6: true
   },
   },
   parser: 'vue-eslint-parser',
   parser: 'vue-eslint-parser',
   parserOptions: {
   parserOptions: {
@@ -14,15 +14,15 @@ module.exports = defineConfig({
     sourceType: 'module',
     sourceType: 'module',
     jsxPragma: 'React',
     jsxPragma: 'React',
     ecmaFeatures: {
     ecmaFeatures: {
-      jsx: true,
-    },
+      jsx: true
+    }
   },
   },
   extends: [
   extends: [
     'plugin:vue/vue3-recommended',
     'plugin:vue/vue3-recommended',
     'plugin:@typescript-eslint/recommended',
     'plugin:@typescript-eslint/recommended',
     'prettier',
     'prettier',
     'plugin:prettier/recommended',
     'plugin:prettier/recommended',
-    'plugin:jest/recommended',
+    'plugin:jest/recommended'
   ],
   ],
   rules: {
   rules: {
     'vue/script-setup-uses-vars': 'error',
     'vue/script-setup-uses-vars': 'error',
@@ -42,15 +42,15 @@ module.exports = defineConfig({
       'error',
       'error',
       {
       {
         argsIgnorePattern: '^_',
         argsIgnorePattern: '^_',
-        varsIgnorePattern: '^_',
-      },
+        varsIgnorePattern: '^_'
+      }
     ],
     ],
     'no-unused-vars': [
     'no-unused-vars': [
       'error',
       'error',
       {
       {
         argsIgnorePattern: '^_',
         argsIgnorePattern: '^_',
-        varsIgnorePattern: '^_',
-      },
+        varsIgnorePattern: '^_'
+      }
     ],
     ],
     'space-before-function-paren': 'off',
     'space-before-function-paren': 'off',
 
 
@@ -70,12 +70,12 @@ module.exports = defineConfig({
         html: {
         html: {
           void: 'always',
           void: 'always',
           normal: 'never',
           normal: 'never',
-          component: 'always',
+          component: 'always'
         },
         },
         svg: 'always',
         svg: 'always',
-        math: 'always',
-      },
+        math: 'always'
+      }
     ],
     ],
-    'vue/multi-word-component-names': 'off',
-  },
-});
+    'vue/multi-word-component-names': 'off'
+  }
+})

+ 1 - 3
src/App.vue

@@ -31,9 +31,7 @@ export default defineComponent({
     LayoutHeader
     LayoutHeader
   },
   },
   setup() {
   setup() {
-    onMounted(() => {
- 
-    })
+    onMounted(() => {})
     return { contentRef }
     return { contentRef }
   }
   }
 })
 })

+ 1 - 1
src/components/data-list/index.vue

@@ -5,7 +5,7 @@
     <p v-if="keyword">{{ t('base.noSearchResult') }}</p>
     <p v-if="keyword">{{ t('base.noSearchResult') }}</p>
     <p v-if="!unSearchDesc">
     <p v-if="!unSearchDesc">
       <!-- 您还没有{{ name || '数据' }},请先创建{{ name || '数据' }}~ -->
       <!-- 您还没有{{ name || '数据' }},请先创建{{ name || '数据' }}~ -->
-      {{t('base.unSearchDesc') }}
+      {{ t('base.unSearchDesc') }}
     </p>
     </p>
     <p v-else>{{ unSearchDesc }}</p>
     <p v-else>{{ unSearchDesc }}</p>
     <div class="undata">
     <div class="undata">

+ 1 - 1
src/layout/header.vue

@@ -15,7 +15,7 @@
                 :class="{ [menu.key]: true }"
                 :class="{ [menu.key]: true }"
               >
               >
                 <img style="height: 10px" :src="menu.icon" />
                 <img style="height: 10px" :src="menu.icon" />
-               
+
                 {{ menu.label }}
                 {{ menu.label }}
               </a-menu-item>
               </a-menu-item>
             </a-menu>
             </a-menu>

+ 2 - 2
src/locales/lang/en/base.ts

@@ -15,9 +15,9 @@ export default {
 
 
   saveSuccess: 'save successfully!',
   saveSuccess: 'save successfully!',
   noSearchResult: 'No Search Result',
   noSearchResult: 'No Search Result',
-  unSearchDesc: "您还没有场景,请先创建场景",
+  unSearchDesc: '您还没有场景,请先创建场景',
   tourist: 'tourist',
   tourist: 'tourist',
   loginToLogin: 'Go to login',
   loginToLogin: 'Go to login',
   loginFail: 'Invalid login status; please log in again!',
   loginFail: 'Invalid login status; please log in again!',
-  loginToCancel: 'Continue',
+  loginToCancel: 'Continue'
 }
 }

+ 2 - 2
src/locales/lang/zh/base.ts

@@ -14,9 +14,9 @@ export default {
   cancel: '取消',
   cancel: '取消',
   saveSuccess: '保存成功',
   saveSuccess: '保存成功',
   noSearchResult: '未搜索到结果',
   noSearchResult: '未搜索到结果',
-  unSearchDesc: "您还没有场景,请先创建场景",
+  unSearchDesc: '您还没有场景,请先创建场景',
   tourist: '游客',
   tourist: '游客',
   loginToLogin: '去登录',
   loginToLogin: '去登录',
   loginFail: '登录状态失效,请重新登录',
   loginFail: '登录状态失效,请重新登录',
-  loginToCancel: '登录完毕,继续',
+  loginToCancel: '登录完毕,继续'
 }
 }

+ 1 - 2
src/locales/lang/zh/room.ts

@@ -30,6 +30,5 @@ export default {
   deletedScenes: '删除场景',
   deletedScenes: '删除场景',
   deletedScenesWaring: '删除后无法恢复,是否确认?',
   deletedScenesWaring: '删除后无法恢复,是否确认?',
   projectLink: '房间链接',
   projectLink: '房间链接',
-
-
+  nickNameRegrexError: '昵称应是为中文、英文、数字或者下划线,且长度为1到15'
 }
 }

+ 1 - 3
src/locales/useLocale.ts

@@ -17,10 +17,9 @@ function setI18nLanguage(locale: LocaleType) {
   const localeStore = useLocaleStoreWithOut()
   const localeStore = useLocaleStoreWithOut()
 
 
   if (i18n.mode === 'legacy') {
   if (i18n.mode === 'legacy') {
-
     i18n.global.locale = locale
     i18n.global.locale = locale
   } else {
   } else {
-    ; (i18n.global.locale as any).value = locale
+    ;(i18n.global.locale as any).value = locale
   }
   }
   localeStore.setLocaleInfo({ locale })
   localeStore.setLocaleInfo({ locale })
   // localeStore.setSingleLocale(locale)
   // localeStore.setSingleLocale(locale)
@@ -61,7 +60,6 @@ export function useLocale() {
     globalI18n.setLocaleMessage(locale, message)
     globalI18n.setLocaleMessage(locale, message)
     loadLocalePool.push(locale)
     loadLocalePool.push(locale)
 
 
-
     setI18nLanguage(locale)
     setI18nLanguage(locale)
     return locale
     return locale
   }
   }

+ 2 - 2
src/store/modules/room.ts

@@ -57,8 +57,8 @@ export const useRoomStore = defineStore('room', {
   getters: {
   getters: {
     getNums:
     getNums:
       () =>
       () =>
-        <T extends Pick<Room, 'scenes'>>(room: T) =>
-          room.scenes.map(scene => scene.num),
+      <T extends Pick<Room, 'scenes'>>(room: T) =>
+        room.scenes.map(scene => scene.num),
     getShareUrl: () => (param: ShareLinkType) => {
     getShareUrl: () => (param: ShareLinkType) => {
       const search = new URLSearchParams()
       const search = new URLSearchParams()
       search.set('m', `${param.num}`)
       search.set('m', `${param.num}`)

+ 1 - 1
src/store/modules/user.ts

@@ -4,7 +4,7 @@ import { defineStore } from 'pinia'
 import type { User } from '@/api'
 import type { User } from '@/api'
 import { useI18n } from '@/hook/useI18n'
 import { useI18n } from '@/hook/useI18n'
 
 
-const { t } = useI18n();
+const { t } = useI18n()
 
 
 const defUser: User = {
 const defUser: User = {
   nickname: t('base.tourist'),
   nickname: t('base.tourist'),

File diff suppressed because it is too large
+ 161 - 142
src/utils/browser.ts


+ 19 - 3
src/views/room/edit-room/index.vue

@@ -74,7 +74,8 @@
           :label="t('room.form.nickname')"
           :label="t('room.form.nickname')"
           name="leaderName"
           name="leaderName"
           :rules="[
           :rules="[
-            { required: true, message: t('room.form.nicknameRequired') }
+            { required: true, message: t('room.form.nicknameRequired') },
+            { validator: handleNickRegex }
           ]"
           ]"
         >
         >
           <a-input
           <a-input
@@ -116,8 +117,7 @@ import type { FormInstance } from 'ant-design-vue'
 import { useI18n } from '@/hook/useI18n'
 import { useI18n } from '@/hook/useI18n'
 import { useLocale } from '@/locales/useLocale'
 import { useLocale } from '@/locales/useLocale'
 
 
-const roomStore = useRoomStore()
-const { t } = useI18n()
+
 
 
 // const titleValidator = ref({
 // const titleValidator = ref({
 //   validator: (_, value) =>
 //   validator: (_, value) =>
@@ -132,7 +132,9 @@ export default defineComponent({
   props,
   props,
   setup(props) {
   setup(props) {
     const visible = ref(true)
     const visible = ref(true)
+    const roomStore = useRoomStore()
     const { getLocale } = useLocale()
     const { getLocale } = useLocale()
+    const { t } = useI18n()
     const returnLocale = computed(() => {
     const returnLocale = computed(() => {
       if (unref(getLocale).includes('zh')) {
       if (unref(getLocale).includes('zh')) {
         return 'zh'
         return 'zh'
@@ -163,7 +165,21 @@ export default defineComponent({
     //   }))
     //   }))
     // }
     // }
 
 
+    const handleNickRegex = async (_: any, value: string) => {
+      console.log('value', value)
+      const regex = new RegExp(
+        '^([\u4E00-\uFA29]|[\uE7C7-\uE7F3]|[a-zA-Z0-9_]){1,15}$'
+      )
+      if (value?.length && !regex.test(value)) {
+        return Promise.reject(
+          t('room.nickNameRegrexError')
+        )
+      }
+      return Promise.resolve('')
+    }
+
     return {
     return {
+      handleNickRegex,
       returnLocale,
       returnLocale,
       t,
       t,
       visible,
       visible,

+ 1 - 1
src/views/room/list.vue

@@ -167,7 +167,7 @@ const webSyncRoom = async (room: Room) => {
     avatar: encodeURIComponent(user.avatar) || '',
     avatar: encodeURIComponent(user.avatar) || '',
     userId: '1',
     userId: '1',
     isTour: '0',
     isTour: '0',
-    lang: unref(getLocale) || 'zh',
+    lang: unref(getLocale) || 'zh'
   })
   })
   console.log('带看link', link)
   console.log('带看link', link)
   window.open(link, '_blank')
   window.open(link, '_blank')

+ 10 - 2
src/views/scene/list.vue

@@ -9,13 +9,21 @@
     @ok="saveHandler"
     @ok="saveHandler"
   >
   >
     <div class="scene-modal">
     <div class="scene-modal">
-      <a-input v-model:value="keyword" :placeholder="t('room.form.inputSearch')" allow-clear>
+      <a-input
+        v-model:value="keyword"
+        :placeholder="t('room.form.inputSearch')"
+        allow-clear
+      >
         <template #suffix>
         <template #suffix>
           <search-outlined class="search-icon" />
           <search-outlined class="search-icon" />
         </template>
         </template>
       </a-input>
       </a-input>
       <div class="scene-list-layout">
       <div class="scene-list-layout">
-        <DataList :data-source="filterScenes" :keyword="keyword" :name="t('room.form.scene')">
+        <DataList
+          :data-source="filterScenes"
+          :keyword="keyword"
+          :name="t('room.form.scene')"
+        >
           <div class="scene-list">
           <div class="scene-list">
             <a-table
             <a-table
               row-key="num"
               row-key="num"

+ 50 - 49
vite.config.ts

@@ -15,56 +15,57 @@ import { resolve } from 'path'
 // }
 // }
 
 
 // https://vitejs.dev/config/
 // https://vitejs.dev/config/
-export default ({ mode }) => defineConfig({
-  base: './',
-  plugins: [
-    vue(),
-    DefineOptions(),
-    ViteComponents({
-      resolvers: [
-        AntDesignVueResolver({ resolveIcons: true, importStyle: 'less' })
-      ],
-      dts: 'src/components.d.ts'
-    })
-  ],
-  css: {
-    preprocessorOptions: {
-      less: {
-        javascriptEnabled: true,
-        modifyVars: {
-          'primary-color': '#0076F6',
-          'link-color': '#0076F6',
-          'border-radius-base': '2px'
+export default ({ mode }) =>
+  defineConfig({
+    base: './',
+    plugins: [
+      vue(),
+      DefineOptions(),
+      ViteComponents({
+        resolvers: [
+          AntDesignVueResolver({ resolveIcons: true, importStyle: 'less' })
+        ],
+        dts: 'src/components.d.ts'
+      })
+    ],
+    css: {
+      preprocessorOptions: {
+        less: {
+          javascriptEnabled: true,
+          modifyVars: {
+            'primary-color': '#0076F6',
+            'link-color': '#0076F6',
+            'border-radius-base': '2px'
+          }
         }
         }
       }
       }
-    }
-  },
-  resolve: {
-    alias: [
-      {
-        find: 'vue-i18n',
-        replacement: 'vue-i18n/dist/vue-i18n.cjs.js'
-      },
-      {
-        find: '@',
-        replacement: resolve(__dirname, './src')
-      },
-      {
-        find: '#',
-        replacement: resolve(__dirname, './types')
-      }
-    ]
-  },
-  server: {
-    host: '0.0.0.0',
-    port: 5173,
-    open: true,
-    proxy: {
-      '/api': {
-        target: loadEnv(mode, process.cwd()).VITE_BASE_API_URL,
-        changeOrigin: true,
-        rewrite: path => path.replace(/^\/api/, '')
+    },
+    resolve: {
+      alias: [
+        {
+          find: 'vue-i18n',
+          replacement: 'vue-i18n/dist/vue-i18n.cjs.js'
+        },
+        {
+          find: '@',
+          replacement: resolve(__dirname, './src')
+        },
+        {
+          find: '#',
+          replacement: resolve(__dirname, './types')
+        }
+      ]
+    },
+    server: {
+      host: '0.0.0.0',
+      port: 5173,
+      open: true,
+      proxy: {
+        '/api': {
+          target: loadEnv(mode, process.cwd()).VITE_BASE_API_URL,
+          changeOrigin: true,
+          rewrite: path => path.replace(/^\/api/, '')
+        }
       }
       }
     }
     }
-  }
-})
+  })