houyaf 3 rokov pred
rodič
commit
a80e129337

+ 1 - 1
plop-templates/module/detail.hbs

@@ -13,7 +13,7 @@ const formRef = ref()
 
 function onSubmit() {
   formRef.value.submit().then(() => {
-    eventBus.emit('get-data-list')
+    eventBus.emit('get-db-list')
     goBack()
   })
 }

+ 2 - 2
plop-templates/module/list.hbs

@@ -42,7 +42,7 @@ const data = ref({
 onMounted(() => {
   getDataList()
   if (data.value.formMode === 'router') {
-    eventBus.on('get-data-list', () => {
+    eventBus.on('get-db-list', () => {
       getDataList()
     })
   }
@@ -50,7 +50,7 @@ onMounted(() => {
 
 onBeforeUnmount(() => {
   if (data.value.formMode === 'router') {
-    eventBus.off('get-data-list')
+    eventBus.off('get-db-list')
   }
 })
 

+ 2 - 2
scripts/generate.icons.ts

@@ -20,7 +20,7 @@ async function generateIcons() {
   /**
    * 分别会在对应目录下生成以下文件,其中(1)(3)用于离线下载并安装图标,(2)用于图标选择器使用
    * (1) src/iconify/index.json    记录用户 inquirer 的交互信息
-   * (2) src/iconify/data.json     包含多个图标集数据,仅记录图标名
+   * (2) src/iconify/db.json     包含多个图标集数据,仅记录图标名
    * (3) public/icons/*-raw.json   多个图标集的原始数据,独立存放,用于离线使用
    */
   inquirer.prompt([
@@ -75,7 +75,7 @@ async function generateIcons() {
     }
 
     await fs.writeJSON(
-      path.resolve(process.cwd(), 'src/iconify/data.json'),
+      path.resolve(process.cwd(), 'src/iconify/db.json'),
       collectionsMeta,
     )
   })

+ 64 - 0
src/api/repo/repoApi.ts

@@ -0,0 +1,64 @@
+import apiRequest from '@/network/http/apiRequest'
+
+/**
+ * 获取Repo列表
+ * @param data
+ * @returns
+ */
+export function getRepoByList(data: any) {
+  return apiRequest({
+    url: '/repo/type',
+    method: 'GET',
+    params: data,
+  })
+}
+
+/**
+ * 根据Id获取Repo
+ * @param repoId
+ * @returns
+ */
+export function getRepoById(repoId: number) {
+  return apiRequest({
+    url: `/repo/${repoId}`,
+    method: 'GET',
+  })
+}
+
+/**
+ * 添加Repo
+ * @param data
+ * @returns
+ */
+export function createRepo(data: any) {
+  return apiRequest({
+    url: '/repo/add',
+    method: 'POST',
+    data,
+  })
+}
+
+/**
+ * 更新Repo
+ * @param data
+ * @returns
+ */
+export function updateRepo(data: any) {
+  return apiRequest({
+    url: '/repo/update',
+    method: 'PUT',
+    data,
+  })
+}
+
+/**
+ * 删除Repo
+ * @param repoId
+ * @returns
+ */
+export function deleteRepoById(repoId: number) {
+  return apiRequest({
+    url: `/repo/${repoId}`,
+    method: 'DELETE',
+  })
+}

+ 12 - 12
src/api/database/dbTypeApi.ts → src/api/repo/repoCatApi.ts

@@ -5,9 +5,9 @@ import apiRequest from '@/network/http/apiRequest'
  * @param data
  * @returns
  */
-export function getDbTypeByList(data: any) {
+export function getRepoCatByList(data: any) {
   return apiRequest({
-    url: '/db/type',
+    url: '/repo/cat',
     method: 'GET',
     params: data,
   })
@@ -15,12 +15,12 @@ export function getDbTypeByList(data: any) {
 
 /**
  * 根据Id获取DBType
- * @param dbTypeId
+ * @param repoTypeId
  * @returns
  */
-export function getDbTypeById(dbTypeId: number) {
+export function getRepoCatById(repoTypeId: number, repoCatId: number) {
   return apiRequest({
-    url: `/db/type/${dbTypeId}`,
+    url: `/repo/cat/${repoTypeId}/${repoCatId}`,
     method: 'GET',
   })
 }
@@ -30,9 +30,9 @@ export function getDbTypeById(dbTypeId: number) {
  * @param data
  * @returns
  */
-export function createDbType(data: any) {
+export function createRepoCat(data: any) {
   return apiRequest({
-    url: '/db/type/add',
+    url: '/repo/cat/add',
     method: 'POST',
     data,
   })
@@ -43,9 +43,9 @@ export function createDbType(data: any) {
  * @param data
  * @returns
  */
-export function updateDbType(data: any) {
+export function updateRepoCat(data: any) {
   return apiRequest({
-    url: '/db/type/update',
+    url: '/repo/cat/update',
     method: 'PUT',
     data,
   })
@@ -53,12 +53,12 @@ export function updateDbType(data: any) {
 
 /**
  * 删除DBType
- * @param dbTypeId
+ * @param repoTypeId
  * @returns
  */
-export function deleteDbTypeById(dbTypeId: number) {
+export function deleteRepoCatById(repoTypeId: number, repoCatId: number) {
   return apiRequest({
-    url: `/db/type/${dbTypeId}`,
+    url: `/repo/cat/${repoTypeId}/${repoCatId}`,
     method: 'DELETE',
   })
 }

+ 3 - 3
src/api/database/dbApi.ts → src/api/repo/repoDBApi.ts

@@ -7,7 +7,7 @@ import apiRequest from '@/network/http/apiRequest'
  */
 export function getTableDataByPage(objectCode: string) {
   return apiRequest({
-    url: `/db/table/${objectCode}/page`,
+    url: `/repo/db/table/${objectCode}/page`,
     method: 'GET',
   })
 }
@@ -19,7 +19,7 @@ export function getTableDataByPage(objectCode: string) {
  */
 export function getTableDataByList(objectCode: string) {
   return apiRequest({
-    url: `/db/table/${objectCode}`,
+    url: `/repo/db/table/${objectCode}`,
     method: 'GET',
   })
 }
@@ -31,7 +31,7 @@ export function getTableDataByList(objectCode: string) {
  */
 export function getTableFieldsByList(objectCode: string) {
   return apiRequest({
-    url: `/db/table/${objectCode}/fields`,
+    url: `/repo/db/table/${objectCode}/fields`,
     method: 'GET',
   })
 }

+ 64 - 0
src/api/repo/repoTypeApi.ts

@@ -0,0 +1,64 @@
+import apiRequest from '@/network/http/apiRequest'
+
+/**
+ * 获取RepoType列表
+ * @param data
+ * @returns
+ */
+export function getRepoTypeByList(data: any) {
+  return apiRequest({
+    url: '/repo/type',
+    method: 'GET',
+    params: data,
+  })
+}
+
+/**
+ * 根据Id获取RepoType
+ * @param repoTypeId
+ * @returns
+ */
+export function getRepoTypeById(repoTypeId: number) {
+  return apiRequest({
+    url: `/repo/type/${repoTypeId}`,
+    method: 'GET',
+  })
+}
+
+/**
+ * 添加RepoType
+ * @param data
+ * @returns
+ */
+export function createRepoType(data: any) {
+  return apiRequest({
+    url: '/repo/type/add',
+    method: 'POST',
+    data,
+  })
+}
+
+/**
+ * 更新RepoType
+ * @param data
+ * @returns
+ */
+export function updateRepoType(data: any) {
+  return apiRequest({
+    url: '/repo/type/update',
+    method: 'PUT',
+    data,
+  })
+}
+
+/**
+ * 删除RepoType
+ * @param repoTypeId
+ * @returns
+ */
+export function deleteRepoTypeById(repoTypeId: number) {
+  return apiRequest({
+    url: `/repo/type/${repoTypeId}`,
+    method: 'DELETE',
+  })
+}

+ 1 - 1
src/assets/styles/globals.scss

@@ -82,7 +82,7 @@ body {
   box-sizing: inherit;
 }
 
-// 右侧内容区针对fixed元素,有横向铺满的需求,可在fixed元素上设置 [data-fixed-calc-width]
+// 右侧内容区针对fixed元素,有横向铺满的需求,可在fixed元素上设置 [db-fixed-calc-width]
 [data-fixed-calc-width] {
   position: fixed;
   left: 50%;

+ 1 - 1
src/components/GroupSelector/index.vue

@@ -24,7 +24,7 @@ const getData = async () => {
   const { data } = await getGroupView()
   state.dataList = data
   // 初始化第一个给tree
-  // emit('update:modelValue', data[0].groupId)
+  // emit('update:modelValue', db[0].groupId)
 }
 
 const groupId = computed({

+ 3 - 3
src/components/Sparkline/sparkline.ts

@@ -61,10 +61,10 @@ export function sparkline(svg: any, entries: any, options: any) {
   // rendering offset.
   const strokeWidth = parseFloat(svg.attributes['stroke-width'].value)
 
-  // By default, data must be formatted as an array of numbers or
+  // By default, db must be formatted as an array of numbers or
   // an array of objects with the value key (like `[{value: 1}]`).
-  // You can set a custom function to return data for a different
-  // data structure.
+  // You can set a custom function to return db for a different
+  // db structure.
   const fetch = options.fetch || defaultFetch
 
   // Retrieve only values, easing the find for the maximum value.

+ 3 - 3
src/network/http/apiRequest.ts

@@ -1,7 +1,7 @@
 import type { AxiosResponse } from 'axios'
 import axios from 'axios'
 // import qs from 'qs'
-import { ElLoading, ElMessage } from 'element-plus'
+import { ElMessage } from 'element-plus'
 import router from '@/router/index'
 import useSettingsStore from '@/store/modules/settings'
 import useUserStore from '@/store/modules/user'
@@ -43,7 +43,7 @@ apiRequest.interceptors.request.use(
     }
     // 是否将 POST 请求参数进行字符串化处理
     if (request.method === 'post') {
-      // request.data = qs.stringify(request.data, {
+      // request.db = qs.stringify(request.db, {
       //   arrayFormat: 'brackets',
       // })
     }
@@ -56,7 +56,7 @@ apiRequest.interceptors.response.use(
     // loading.close()
     /**
      * 全局拦截请求发送后返回的数据,如果数据有报错则在这做全局的错误提示
-     * 假设返回数据格式为:{ status: 0, error: '', data: '' }
+     * 假设返回数据格式为:{ status: 0, error: '', db: '' }
      * 规则是当 status 为 0 时表示请求成功,为 0 时表示接口需要登录或者登录状态失效,需要重新登录
      * 请求出错时 error 会返回错误信息
      */

+ 48 - 2
src/router/modules/module.ts

@@ -10,7 +10,7 @@ const routes: RouteRecordRaw[] = [
     name: 'customer',
     meta: {
       title: '客户管理',
-      icon: 'ep:avatar',
+      icon: 'ep:user',
       permit: 'system_customer',
     },
     children: [
@@ -41,7 +41,7 @@ const routes: RouteRecordRaw[] = [
     name: 'workflow',
     meta: {
       title: '工作流程',
-      icon: 'ep:postcard',
+      icon: 'ep:finished',
       permit: 'system_workflow',
     },
     children: [
@@ -90,5 +90,51 @@ const routes: RouteRecordRaw[] = [
       },
     ],
   },
+
+  {
+    path: '/article',
+    component: Layout,
+    redirect: '/article/index',
+    name: 'article',
+    meta: {
+      title: '企业智库',
+      icon: 'ep:tickets',
+    },
+    children: [
+      {
+        path: 'index',
+        name: 'article_index',
+        component: () => import('@/views/article/art/index.vue'),
+        meta: {
+          title: '文章管理',
+          sidebar: false,
+          activeMenu: '/article',
+        },
+      },
+    ],
+  },
+
+  {
+    path: '/doc',
+    component: Layout,
+    redirect: '/doc/index',
+    name: 'document',
+    meta: {
+      title: '企业网盘',
+      icon: 'ep:files',
+    },
+    children: [
+      {
+        path: 'index',
+        name: 'doc_index',
+        component: () => import('@/views/document/doc/index.vue'),
+        meta: {
+          title: '文件管理',
+          sidebar: false,
+          activeMenu: '/doc',
+        },
+      },
+    ],
+  },
 ]
 export default routes

+ 9 - 9
src/router/modules/database.ts → src/router/modules/repo.ts

@@ -4,9 +4,9 @@ const Layout = () => import('@/layouts/index.vue')
 
 const routes: RouteRecordRaw[] = [
   {
-    path: '/database/data',
+    path: '/repo/db',
     component: Layout,
-    redirect: '/database/data/database',
+    redirect: '/repo/db/repo',
     name: 'database_data',
     meta: {
       title: '数据仓库',
@@ -14,22 +14,22 @@ const routes: RouteRecordRaw[] = [
     },
     children: [
       {
-        path: 'database',
+        path: 'repo',
         name: 'database_data_index',
-        component: () => import('@/views/database/data/index.vue'),
+        component: () => import('@/views/repository/db/index.vue'),
         meta: {
           title: '数据仓库',
           sidebar: false,
           breadcrumb: false,
-          activeMenu: '/database/data',
+          activeMenu: '/repo/db',
         },
       },
     ],
   },
   {
-    path: '/database/access',
+    path: '/repo/repo',
     component: Layout,
-    redirect: '/database/access/index',
+    redirect: '/repo/repo/index',
     name: 'database_access',
     meta: {
       title: '数据库接入',
@@ -39,11 +39,11 @@ const routes: RouteRecordRaw[] = [
       {
         path: 'index',
         name: 'database_access',
-        component: () => import('@/views/database/access/index.vue'),
+        component: () => import('@/views/repository/access/index.vue'),
         meta: {
           title: '数据库接入',
           sidebar: false,
-          activeMenu: '/database/access',
+          activeMenu: '/repo/repo',
         },
       },
     ],

+ 1 - 1
src/router/routes.ts

@@ -3,7 +3,7 @@ import generatedRoutes from 'virtual:generated-pages'
 import type { RouteRecordRaw } from 'vue-router'
 import DashboardEntries from './modules/dashboard'
 import SystemEntries from './modules/system'
-import DatabaseEntries from './modules/database'
+import DatabaseEntries from './modules/repo'
 import ApiEntries from './modules/api'
 import ModelEntries from './modules/model'
 import BizEntries from './modules/biz'

+ 4 - 4
src/store/modules/settings.ts

@@ -11,7 +11,7 @@ const useSettingsStore = defineStore(
     const mergeSettings: RecursiveRequired<Settings.all> = defaultsDeep(settingsCustom, settingsDefault)
     const settings = ref(mergeSettings)
     watch(() => settings.value.app.theme, (val) => {
-      document.body.setAttribute('data-theme', val)
+      document.body.setAttribute('db-theme', val)
     }, {
       immediate: true,
     })
@@ -31,12 +31,12 @@ const useSettingsStore = defineStore(
       immediate: true,
     })
     watch(() => settings.value.layout.widthMode, (val) => {
-      document.body.setAttribute('data-app-width-mode', val)
+      document.body.setAttribute('db-app-width-mode', val)
     }, {
       immediate: true,
     })
     watch(() => settings.value.menu.menuMode, (val) => {
-      document.body.setAttribute('data-menu-mode', val)
+      document.body.setAttribute('db-menu-mode', val)
     }, {
       immediate: true,
     })
@@ -104,7 +104,7 @@ const useSettingsStore = defineStore(
           settings.value.menu.subMenuCollapse = true
           break
       }
-      document.body.setAttribute('data-mode', val)
+      document.body.setAttribute('db-mode', val)
     }, {
       immediate: true,
     })

+ 2 - 5
src/views/api/log/index.vue

@@ -113,12 +113,9 @@ const onTreeNodeClick = (node: TreeNode) => {
 // 删除日志
 const onReqDel = async (data: { apiTitle: any; reqId: number }) => {
   ElMessageBox.confirm('确认删除吗?', '确认信息').then(async () => {
-    await deleteApiLogById(data.reqId)
+    const { msg } = await deleteApiLogById(data.reqId)
+    ElMessage.success(msg)
     await getApiLogData()
-    ElMessage.success({
-      message: '删除成功',
-      center: true,
-    })
   })
 }
 </script>

+ 27 - 0
src/views/article/art/index.vue

@@ -0,0 +1,27 @@
+<route lang="yaml">
+meta:
+  enabled: false
+</route>
+
+<script lang="ts" setup>
+const value = ref(true)
+const value1 = ref(true)
+const value2 = ref(true)
+const value3 = ref(false)
+</script>
+
+<template>
+  <div>
+    <page-header title="开关" />
+    <page-main title="基础用法" class="demo">
+      <el-switch v-model="value" active-color="#13ce66" inactive-color="#ff4949" />
+    </page-main>
+    <page-main title="文字描述" class="demo">
+      <el-switch v-model="value1" active-text="按月付费" inactive-text="按年付费" />
+    </page-main>
+    <page-main title="禁用状态" class="demo">
+      <el-switch v-model="value2" disabled style="margin-right: 10px;" />
+      <el-switch v-model="value3" disabled />
+    </page-main>
+  </div>
+</template>

+ 27 - 0
src/views/article/cat/index.vue

@@ -0,0 +1,27 @@
+<route lang="yaml">
+meta:
+  enabled: false
+</route>
+
+<script lang="ts" setup>
+const value = ref(true)
+const value1 = ref(true)
+const value2 = ref(true)
+const value3 = ref(false)
+</script>
+
+<template>
+  <div>
+    <page-header title="开关" />
+    <page-main title="基础用法" class="demo">
+      <el-switch v-model="value" active-color="#13ce66" inactive-color="#ff4949" />
+    </page-main>
+    <page-main title="文字描述" class="demo">
+      <el-switch v-model="value1" active-text="按月付费" inactive-text="按年付费" />
+    </page-main>
+    <page-main title="禁用状态" class="demo">
+      <el-switch v-model="value2" disabled style="margin-right: 10px;" />
+      <el-switch v-model="value3" disabled />
+    </page-main>
+  </div>
+</template>

+ 0 - 1
src/views/customer/ent/index.vue

@@ -116,7 +116,6 @@ function onPasswordReset(row: { ocId: number; adminId: number; adminName: string
                 <svg-icon name="i-ep:plus" />
               </el-icon>
             </template>
-            公司单位
           </el-button>
         </template>
       </tool-bar>

+ 0 - 1
src/views/customer/org/index.vue

@@ -112,7 +112,6 @@ function onPasswordReset(row: { ocId: number; adminId: number; adminName: string
                 <svg-icon name="i-ep:plus" />
               </el-icon>
             </template>
-            公司单位
           </el-button>
         </template>
       </tool-bar>

+ 0 - 1
src/views/customer/partner/index.vue

@@ -109,7 +109,6 @@ function onPasswordReset(row: { ocId: number; adminId: number; adminName: string
                 <svg-icon name="i-ep:plus" />
               </el-icon>
             </template>
-            公司单位
           </el-button>
         </template>
       </tool-bar>

+ 0 - 23
src/views/database/data/components/model_data.vue

@@ -1,23 +0,0 @@
-<script lang="ts" setup name="model_data">
-defineExpose({
-  show(msg = '基于模型') {
-    alert(msg)
-  },
-})
-</script>
-
-<template>
-  <div class="page-main">
-    <h1>基于模型</h1>
-  </div>
-</template>
-
-<style lang="scss" scoped>
-.page-main{
-  padding: 10px;
-
-    h1{
-        color: red;
-    }
-}
-</style>

+ 0 - 135
src/views/database/data/components/sql_data.vue

@@ -1,135 +0,0 @@
-<script lang="ts" setup name="sql_data">
-import { cloneDeep } from 'lodash-es'
-import { getTableByList, getTableFieldsByList } from '@/api/database/dbApi'
-
-const state = reactive({
-  layoutMode: 'table',
-  sqlStatement: '',
-  dataList: [],
-  curPage: 1,
-})
-
-const fieldTypes = [
-  { name: 'bigint(20)', value: 'bigint(20)' },
-  { name: 'varchar(255)', value: 'varchar(255)' },
-  { name: 'datetime', value: 'datetime' },
-]
-
-const onBlurEvent = (row: any, column?: any) => {
-  const _row = cloneDeep(row)
-  // const fieldName=row.fieldName
-  //   updateDB(row).then(() => {
-  //     ElMessage.success('修改成功!')
-  //   })
-  window.console.log({ row, _row, name: column.title })
-}
-const onChangeEvent = (row: any) => {
-  window.console.log({ row })
-}
-
-const onDel = (row: any) => {
-  window.console.log({ row })
-}
-
-const init = async () => {
-  const { data } = await getTableByList()
-  if (data && data.length > 0) {
-    const res = await getTableFieldsByList(data[0])
-    state.dataList = res.data
-  }
-}
-onMounted(() => {
-  init()
-})
-defineExpose({
-  init,
-})
-</script>
-
-<template>
-  <div class="page-main">
-    <tool-bar>
-      <template #right>
-        <div class="toolBar">
-          <el-button title="刷新" circle text>
-            <template #icon>
-              <el-icon>
-                <svg-icon name="ep:refresh" />
-              </el-icon>
-            </template>
-          </el-button>
-        </div>
-      </template>
-    </tool-bar>
-    <el-input v-model="state.sqlStatement" type="textarea" :rows="4" placeholder="请输入内容" clearable />
-    <vxe-table
-      class=".el-table list-table"
-      border
-      show-overflow
-      :column-config="{ resizable: true }"
-      :data="state.dataList"
-      :edit-config="{ trigger: 'dblclick', mode: 'cell', showIcon: false }"
-    >
-      <vxe-column type="seq" width="60" />
-      <vxe-column field="comment" title="comment" :edit-render="{ autofocus: '.vxe-input--inner' }">
-        <template #edit="{ row, column }">
-          <vxe-input v-model="row.comment" type="text" @blur="onBlurEvent(row, column)" />
-        </template>
-      </vxe-column>
-      <vxe-column field="defaultValue" title="defaultValue" :edit-render="{ autofocus: '.vxe-input--inner' }">
-        <template #edit="{ row }">
-          <vxe-input v-model="row.defaultValue" type="text" @blur="onBlurEvent(row)" />
-        </template>
-      </vxe-column>
-      <vxe-column field="extra" title="extra" :edit-render="{ autofocus: '.vxe-input--inner' }">
-        <template #edit="{ row }">
-          <vxe-input v-model="row.extra" type="text" @blur="onBlurEvent(row)" />
-        </template>
-      </vxe-column>
-      <vxe-column field="fieldName" title="fieldName" :edit-render="{ autofocus: '.vxe-input--inner' }">
-        <template #edit="{ row }">
-          <vxe-input v-model="row.fieldName" type="text" @blur="onBlurEvent(row)" />
-        </template>
-      </vxe-column>
-      <vxe-column field="accident_cat_id" title="accident_cat_id" :edit-render="{ autofocus: '.vxe-input--inner' }">
-        <template #edit="{ row }">
-          <vxe-input v-model="row.accident_cat_id" type="text" @blur="onBlurEvent(row)" />
-        </template>
-      </vxe-column>
-      <vxe-column field="fieldType" title="fieldType" :edit-render="{ autofocus: '.vxe-input--inner' }">
-        <template #edit="{ row }">
-          <el-select v-model="row.fieldType" @chanbge="onChangeEvent(row)">
-            <el-option v-for=" item in fieldTypes" :key="item.value" :value="item.value" :label="item.name" />
-          </el-select>
-        </template>
-      </vxe-column>
-      <vxe-column field="key" title="key" :edit-render="{ autofocus: '.vxe-input--inner' }">
-        <template #edit="{ row }">
-          <vxe-input v-model="row.key" type="text" @blur="onBlurEvent(row)" />
-        </template>
-      </vxe-column>
-      <vxe-column field="nullable" title="nullable" :edit-render="{ autofocus: '.vxe-input--inner' }">
-        <template #edit="{ row }">
-          <el-select v-model="row.nullable" @chanbge="onChangeEvent(row)">
-            <el-option :value="1" label="YES" />
-            <el-option :value="0" label="NO" />
-          </el-select>
-        </template>
-      </vxe-column>
-      <vxe-column field="操作" title="操作" width="200" align="center">
-        <template #default="{ row }">
-          <el-button type="danger" size="small" plain @click="onDel(row)">
-            删除
-          </el-button>
-        </template>
-      </vxe-column>
-    </vxe-table>
-    <el-pagination v-model:current-page="state.curPage" :total="100" layout="total, sizes, ->, prev, pager, next, jumper" style="padding:10px 0" />
-  </div>
-</template>
-
-<style lang="scss" scoped>
-    .page-main{
-        padding: 10px;
-    }
-</style>

+ 0 - 196
src/views/database/data/components/table_data.vue

@@ -1,196 +0,0 @@
-<script lang="ts" setup name="table_data">
-import { getTableDataByList, getTableFieldsByList } from '@/api/database/dbApi'
-
-interface TreeNode {
-  label: string
-  isLeaf: boolean
-  children?: TreeNode[]
-}
-
-const state = reactive({
-  layoutMode: 'table',
-  sqlStatement: '',
-  treeData: [] as TreeNode[],
-  dataList: [],
-  curPage: 1,
-})
-
-const getTableFields = async (tableName = '') => {
-  const res = await getTableFieldsByList(tableName)
-  state.dataList = res.data
-}
-function handleTreeNodeClick(data: any) {
-  if (data.isLeaf) {
-    getTableFields(data.label)
-  }
-}
-
-const init = async () => {
-  const { data } = await getTableDataByList()
-  const children: TreeNode[] = []
-  data.forEach((item: any) => {
-    children.push({
-      isLeaf: true,
-      label: item,
-    })
-  })
-  state.treeData = [
-    {
-      label: '数据库表',
-      isLeaf: false,
-      children,
-    },
-  ]
-  if (data && data.length > 0) {
-    const res = await getTableFieldsByList(data[0])
-    state.dataList = res.data
-  }
-}
-onMounted(() => {
-  init()
-})
-defineExpose({
-  init,
-})
-</script>
-
-<template>
-  <div class="page-main">
-    <LayoutContainer left-side-width="300px" hide-left-side-toggle>
-      <template #leftSide>
-        <el-scrollbar class="tree">
-          <div v-if="state.layoutMode !== 'sql'">
-            <el-tree :data="state.treeData" default-expand-all highlight-current @node-click="handleTreeNodeClick">
-              <template #default="{ node, data }">
-                <div class="custom-tree-node">
-                  <div class="label" :title="node.label">
-                    <el-icon v-if="data.isLeaf" size="16px" style="margin-right: 5px;">
-                      <svg-icon name="ep:tickets" />
-                    </el-icon>
-                    <div class="text">
-                      {{ data.label }}
-                    </div>
-                  </div>
-                </div>
-              </template>
-            </el-tree>
-          </div>
-        </el-scrollbar>
-      </template>
-
-      <div class="container">
-        <el-table ref="table" class="list-table" :data="state.dataList" border stripe highlight-current-row>
-          <el-table-column prop="comment" label="comment" />
-          <el-table-column prop="defaultValue" label="defaultValue" />
-          <el-table-column prop="extra" label="extra" />
-          <el-table-column prop="fieldName" label="fieldName" />
-          <el-table-column prop="accident_cat_id" label="accident_cat_id" />
-          <el-table-column prop="fieldType" label="fieldType" />
-          <el-table-column prop="key" label="key" />
-          <el-table-column prop="nullable" label="nullable" />
-          <el-table-column label="操作" width="200" align="center">
-            <template #default>
-              <el-button type="danger" size="small" plain>
-                删除
-              </el-button>
-            </template>
-          </el-table-column>
-        </el-table>
-        <el-pagination v-model:current-page="state.curPage" :total="100" layout="total, sizes, ->, prev, pager, next, jumper" style="padding:10px 0" />
-      </div>
-    </layoutcontainer>
-  </div>
-</template>
-
-<style lang="scss" scoped>
-.container {
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-}
-
-.page-main {
-  :deep(.left-side) {
-    display: flex;
-    flex-direction: column;
-    height: 100%;
-
-    .tree {
-      flex: 1;
-      overflow-y: auto;
-
-      .el-tree {
-        .el-tree-node__content {
-          height: 26px;
-        }
-
-        .el-tree-node__expand-icon.is-leaf{
-          padding: 0;
-        }
-
-        .is-current > .el-tree-node__content {
-          background-color: var(--el-color-primary-light-9);
-        }
-
-        .custom-tree-node {
-          flex: 1;
-          position: relative;
-          width: 0;
-          height: 100%;
-          display: flex;
-          flex-direction: column;
-          justify-content: center;
-
-          .label {
-            display: inline-flex;
-            align-items: center;
-            width: calc(100% - 10px);
-            color: var(--el-text-color-primary);
-
-            .text {
-              @include text-overflow;
-            }
-          }
-
-          &:hover {
-            .actions {
-              display: block;
-            }
-          }
-
-          .actions {
-            display: none;
-            position: absolute;
-            right: 10px;
-            top: 50%;
-            transform: translateY(-50%);
-
-            .el-button {
-              padding: 5px 8px;
-            }
-          }
-        }
-      }
-    }
-  }
-
-  .rightSide{
-    padding: 0 10px;
-    flex: 1;
-    max-height: calc(100vh - 180px);
-    overflow-y: auto;
-    background-color: var(--g-app-bg);
-
-    .toolBar{
-      text-align: right;
-
-      .el-icon {
-        color: #606266;
-        margin: 0 20px;
-        font-size: 1.5em;
-        vertical-align: middle;
-      }
-    }
-  }
-}
-</style>

+ 27 - 0
src/views/document/cat/index.vue

@@ -0,0 +1,27 @@
+<route lang="yaml">
+meta:
+  enabled: false
+</route>
+
+<script lang="ts" setup>
+const value = ref(true)
+const value1 = ref(true)
+const value2 = ref(true)
+const value3 = ref(false)
+</script>
+
+<template>
+  <div>
+    <page-header title="开关" />
+    <page-main title="基础用法" class="demo">
+      <el-switch v-model="value" active-color="#13ce66" inactive-color="#ff4949" />
+    </page-main>
+    <page-main title="文字描述" class="demo">
+      <el-switch v-model="value1" active-text="按月付费" inactive-text="按年付费" />
+    </page-main>
+    <page-main title="禁用状态" class="demo">
+      <el-switch v-model="value2" disabled style="margin-right: 10px;" />
+      <el-switch v-model="value3" disabled />
+    </page-main>
+  </div>
+</template>

+ 27 - 0
src/views/document/doc/index.vue

@@ -0,0 +1,27 @@
+<route lang="yaml">
+meta:
+  enabled: false
+</route>
+
+<script lang="ts" setup>
+const value = ref(true)
+const value1 = ref(true)
+const value2 = ref(true)
+const value3 = ref(false)
+</script>
+
+<template>
+  <div>
+    <page-header title="开关" />
+    <page-main title="基础用法" class="demo">
+      <el-switch v-model="value" active-color="#13ce66" inactive-color="#ff4949" />
+    </page-main>
+    <page-main title="文字描述" class="demo">
+      <el-switch v-model="value1" active-text="按月付费" inactive-text="按年付费" />
+    </page-main>
+    <page-main title="禁用状态" class="demo">
+      <el-switch v-model="value2" disabled style="margin-right: 10px;" />
+      <el-switch v-model="value3" disabled />
+    </page-main>
+  </div>
+</template>

+ 27 - 0
src/views/repository/access/index.vue

@@ -0,0 +1,27 @@
+<route lang="yaml">
+meta:
+  enabled: false
+</route>
+
+<script lang="ts" setup>
+const value = ref(true)
+const value1 = ref(true)
+const value2 = ref(true)
+const value3 = ref(false)
+</script>
+
+<template>
+  <div>
+    <page-header title="开关" />
+    <page-main title="基础用法" class="demo">
+      <el-switch v-model="value" active-color="#13ce66" inactive-color="#ff4949" />
+    </page-main>
+    <page-main title="文字描述" class="demo">
+      <el-switch v-model="value1" active-text="按月付费" inactive-text="按年付费" />
+    </page-main>
+    <page-main title="禁用状态" class="demo">
+      <el-switch v-model="value2" disabled style="margin-right: 10px;" />
+      <el-switch v-model="value3" disabled />
+    </page-main>
+  </div>
+</template>

+ 1 - 1
src/views/database/data/index.vue → src/views/repository/db/index.vue

@@ -5,7 +5,7 @@ meta:
 
 <script lang="ts" setup>
 import { getModelTreeData } from '@/api/model/modelApi'
-import { getTableDataByList, getTableFieldsByList } from '@/api/database/dbApi'
+import { getTableDataByList, getTableFieldsByList } from '@/api/repo/repoDBApi'
 
 interface TreeNode {
   label: string

+ 6 - 8
src/views/database/access/components/DBType.vue → src/views/repository/repo/components/RepoType.vue

@@ -6,7 +6,7 @@ meta:
 <script lang="ts" setup>
 import { ElMessage } from 'element-plus'
 import type { FormInstance, FormRules } from 'element-plus'
-import { createDbType, getDbTypeById, updateDbType } from '@/api/database/dbTypeApi'
+import { createRepoType, getRepoTypeById, updateRepoType } from '@/api/repo/repoTypeApi'
 const emit = defineEmits(['success'])
 
 const formRef = ref<FormInstance>()
@@ -35,7 +35,7 @@ onMounted(() => {})
 
 const getData = async (dbTypeId: number) => {
   state.loading = true
-  const { data } = await getDbTypeById(dbTypeId)
+  const { data } = await getRepoTypeById(dbTypeId)
   state.loading = false
   state.formData = data
 }
@@ -44,19 +44,17 @@ function onSubmit() {
   formRef.value && formRef.value.validate(async (valid) => {
     if (valid) {
       if (state.actionType === 1) {
-        await createDbType(state.formData)
+        const { msg } = await createRepoType(state.formData)
+        ElMessage.success(msg)
         state.dialogVisible = false
         emit('success')
       }
       else {
-        await updateDbType(state.formData)
+        const { msg } = await updateRepoType(state.formData)
+        ElMessage.success(msg)
         state.dialogVisible = false
         emit('success')
       }
-      ElMessage.success({
-        message: '保存成功',
-        center: true,
-      })
     }
   })
 }

+ 5 - 5
src/views/database/access/index.vue → src/views/repository/repo/index.vue

@@ -1,7 +1,7 @@
 <script lang="ts" setup name="DBTypeIndex">
 import { ElMessage, ElMessageBox } from 'element-plus'
-import DBType from './components/DBType.vue'
-import { deleteDbTypeById, getDbTypeByList } from '@/api/database/dbTypeApi'
+import DBType from './components/RepoType.vue'
+import { deleteRepoTypeById, getRepoTypeByList } from '@/api/repo/repoTypeApi'
 
 const state = reactive({
   loading: false,
@@ -19,7 +19,7 @@ const appCatRef = ref()
 
 const getDataList = async () => {
   state.loading = true
-  const { data } = await getDbTypeByList({})
+  const { data } = await getRepoTypeByList({})
   state.dataList = data
   state.loading = false
 }
@@ -40,8 +40,8 @@ function onDBTypeEdit(row: any) {
 }
 
 function onDBTypeDel(row: any) {
-  ElMessageBox.confirm(`确认删除「${row.dbTypeTitle}」吗?`, '确认信息').then(async () => {
-    await deleteDbTypeById(row.appCatId)
+  ElMessageBox.confirm(`确认删除「${row.repoTypeTitle}」吗?`, '确认信息').then(async () => {
+    await deleteRepoTypeById(row.repoId)
     await getDataList()
     ElMessage.success({
       message: '删除成功',

+ 4 - 4
src/views/database/type/components/DbType.vue → src/views/repository/type/components/DbType.vue

@@ -6,7 +6,7 @@ meta:
 <script lang="ts" setup>
 import { ElMessage } from 'element-plus'
 import type { FormInstance, FormRules } from 'element-plus'
-import { createDbType, getDbTypeById, updateDbType } from '@/api/database/dbTypeApi'
+import { createRepoType, getRepoTypeById, updateRepoType } from '@/api/repo/repoTypeApi'
 const emit = defineEmits(['success'])
 
 const formRef = ref<FormInstance>()
@@ -35,7 +35,7 @@ onMounted(() => {})
 
 const getData = async (dbTypeId: number) => {
   state.loading = true
-  const { data } = await getDbTypeById(dbTypeId)
+  const { data } = await getRepoTypeById(dbTypeId)
   state.loading = false
   state.formData = data
 }
@@ -44,13 +44,13 @@ function onSubmit() {
   formRef.value && formRef.value.validate(async (valid) => {
     if (valid) {
       if (state.actionType === 1) {
-        const { msg } = await createDbType(state.formData)
+        const { msg } = await createRepoType(state.formData)
         ElMessage.success(msg)
         state.dialogVisible = false
         emit('success')
       }
       else {
-        const { msg } = await updateDbType(state.formData)
+        const { msg } = await updateRepoType(state.formData)
         ElMessage.success(msg)
         state.dialogVisible = false
         emit('success')

+ 3 - 3
src/views/database/type/index.vue → src/views/repository/type/index.vue

@@ -1,7 +1,7 @@
 <script lang="ts" setup name="DbTypeIndex">
 import { ElMessage, ElMessageBox } from 'element-plus'
 import DbType from './components/DbType.vue'
-import { deleteDbTypeById, getDbTypeByList } from '@/api/database/dbTypeApi'
+import { deleteRepoTypeById, getRepoTypeByList } from '@/api/repo/repoTypeApi'
 
 const state = reactive({
   loading: false,
@@ -19,7 +19,7 @@ const dbTypeRef = ref()
 
 const getDataList = async () => {
   state.loading = true
-  const { data } = await getDbTypeByList({})
+  const { data } = await getRepoTypeByList({})
   state.dataList = data
   state.loading = false
 }
@@ -39,7 +39,7 @@ function onDbTypeEdit(row: any) {
 
 function onDbTypeDel(row: any) {
   ElMessageBox.confirm(`确认删除「${row.dbTypeTitle}」吗?`, '确认信息').then(async () => {
-    const { msg } = await deleteDbTypeById(row.dbTypeId)
+    const { msg } = await deleteRepoTypeById(row.dbTypeId)
     ElMessage.success(msg)
     await getDataList()
   }).catch(() => {})