Parcourir la source

Merge branch 'master' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 into dev

YunaiV il y a 10 mois
Parent
commit
f55c9b7273

+ 0 - 3
.env.dev

@@ -12,9 +12,6 @@ VITE_UPLOAD_TYPE=server
 # 上传路径
 VITE_UPLOAD_URL='http://api-dashboard.yudao.iocoder.cn/admin-api/infra/file/upload'
 
-# 接口前缀
-VITE_API_BASEPATH=/dev-api
-
 # 接口地址
 VITE_API_URL=/admin-api
 

+ 0 - 3
.env.local

@@ -11,9 +11,6 @@ VITE_UPLOAD_TYPE=server
 # 上传路径
 VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
 
-# 接口前缀
-VITE_API_BASEPATH=/dev-api
-
 # 接口地址
 VITE_API_URL=/admin-api
 

+ 0 - 3
.env.prod

@@ -11,9 +11,6 @@ VITE_UPLOAD_TYPE=server
 # 上传路径
 VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
 
-# 接口前缀
-VITE_API_BASEPATH=
-
 # 接口地址
 VITE_API_URL=/admin-api
 

+ 0 - 3
.env.stage

@@ -11,9 +11,6 @@ VITE_UPLOAD_TYPE=server
 # 上传路径
 VITE_UPLOAD_URL='http://api-dashboard.yudao.iocoder.cn/admin-api/infra/file/upload'
 
-# 接口前缀
-VITE_API_BASEPATH=
-
 # 接口地址
 VITE_API_URL=/admin-api
 

+ 0 - 3
.env.test

@@ -11,9 +11,6 @@ VITE_UPLOAD_TYPE=server
 # 上传路径
 VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
 
-# 接口前缀
-VITE_API_BASEPATH=
-
 # 接口地址
 VITE_API_URL=/admin-api
 

+ 6 - 6
package.json

@@ -35,7 +35,7 @@
     "@wangeditor/editor-for-vue": "^5.1.10",
     "@zxcvbn-ts/core": "^3.0.4",
     "animate.css": "^4.1.1",
-    "axios": "^1.6.7",
+    "axios": "^1.6.8",
     "benz-amr-recorder": "^1.1.5",
     "bpmn-js-token-simulation": "^0.10.0",
     "camunda-bpmn-moddle": "^7.0.1",
@@ -46,7 +46,7 @@
     "driver.js": "^1.3.1",
     "echarts": "^5.5.0",
     "echarts-wordcloud": "^2.1.0",
-    "element-plus": "2.5.3",
+    "element-plus": "2.6.1",
     "fast-xml-parser": "^4.3.2",
     "highlight.js": "^11.9.0",
     "jsencrypt": "^3.3.2",
@@ -55,15 +55,15 @@
     "mitt": "^3.0.1",
     "nprogress": "^0.2.0",
     "pinia": "^2.1.7",
-    "pinia-plugin-persistedstate": "^3.2.0",
+    "pinia-plugin-persistedstate": "^3.2.1",
     "qrcode": "^1.5.3",
-    "qs": "^6.11.2",
+    "qs": "^6.12.0",
     "steady-xml": "^0.1.0",
     "url": "^0.11.3",
     "video.js": "^7.21.5",
-    "vue": "3.4.20",
+    "vue": "3.4.21",
     "vue-dompurify-html": "^4.1.4",
-    "vue-i18n": "9.9.1",
+    "vue-i18n": "9.10.2",
     "vue-router": "^4.3.0",
     "vue-types": "^5.1.1",
     "vuedraggable": "^4.1.0",

+ 0 - 16
src/api/infra/dbDoc/index.ts

@@ -1,16 +0,0 @@
-import request from '@/config/axios'
-
-// 导出Html
-export const exportHtml = () => {
-  return request.download({ url: '/infra/db-doc/export-html' })
-}
-
-// 导出Word
-export const exportWord = () => {
-  return request.download({ url: '/infra/db-doc/export-word' })
-}
-
-// 导出Markdown
-export const exportMarkdown = () => {
-  return request.download({ url: '/infra/db-doc/export-markdown' })
-}

+ 0 - 40
src/api/system/errorCode/index.ts

@@ -1,40 +0,0 @@
-import request from '@/config/axios'
-
-export interface ErrorCodeVO {
-  id: number | undefined
-  type: number
-  applicationName: string
-  code: number | undefined
-  message: string
-  memo: string
-  createTime: Date
-}
-
-// 查询错误码列表
-export const getErrorCodePage = (params: PageParam) => {
-  return request.get({ url: '/system/error-code/page', params })
-}
-
-// 查询错误码详情
-export const getErrorCode = (id: number) => {
-  return request.get({ url: '/system/error-code/get?id=' + id })
-}
-
-// 新增错误码
-export const createErrorCode = (data: ErrorCodeVO) => {
-  return request.post({ url: '/system/error-code/create', data })
-}
-
-// 修改错误码
-export const updateErrorCode = (data: ErrorCodeVO) => {
-  return request.put({ url: '/system/error-code/update', data })
-}
-
-// 删除错误码
-export const deleteErrorCode = (id: number) => {
-  return request.delete({ url: '/system/error-code/delete?id=' + id })
-}
-// 导出错误码
-export const excelErrorCode = (params) => {
-  return request.download({ url: '/system/error-code/export-excel', params })
-}

+ 1 - 0
src/api/system/mail/account/index.ts

@@ -8,6 +8,7 @@ export interface MailAccountVO {
   host: string
   port: number
   sslEnable: boolean
+  starttlsEnable: boolean
 }
 
 // 查询邮箱账号列表

+ 0 - 58
src/api/system/sensitiveWord/index.ts

@@ -1,58 +0,0 @@
-import request from '@/config/axios'
-import qs from 'qs'
-
-export interface SensitiveWordVO {
-  id: number
-  name: string
-  status: number
-  description: string
-  tags: string[]
-  createTime: Date
-}
-
-export interface SensitiveWordTestReqVO {
-  text: string
-  tag: string[]
-}
-
-// 查询敏感词列表
-export const getSensitiveWordPage = (params: PageParam) => {
-  return request.get({ url: '/system/sensitive-word/page', params })
-}
-
-// 查询敏感词详情
-export const getSensitiveWord = (id: number) => {
-  return request.get({ url: '/system/sensitive-word/get?id=' + id })
-}
-
-// 新增敏感词
-export const createSensitiveWord = (data: SensitiveWordVO) => {
-  return request.post({ url: '/system/sensitive-word/create', data })
-}
-
-// 修改敏感词
-export const updateSensitiveWord = (data: SensitiveWordVO) => {
-  return request.put({ url: '/system/sensitive-word/update', data })
-}
-
-// 删除敏感词
-export const deleteSensitiveWord = (id: number) => {
-  return request.delete({ url: '/system/sensitive-word/delete?id=' + id })
-}
-
-// 导出敏感词
-export const exportSensitiveWord = (params) => {
-  return request.download({ url: '/system/sensitive-word/export-excel', params })
-}
-
-// 获取所有敏感词的标签数组
-export const getSensitiveWordTagList = () => {
-  return request.get({ url: '/system/sensitive-word/get-tags' })
-}
-
-// 获得文本所包含的不合法的敏感词数组
-export const validateText = (query: SensitiveWordTestReqVO) => {
-  return request.get({
-    url: '/system/sensitive-word/validate-text?' + qs.stringify(query, { arrayFormat: 'repeat' })
-  })
-}

+ 1 - 1
src/layout/components/TabMenu/src/TabMenu.vue

@@ -195,7 +195,7 @@ export default defineComponent({
         </div>
         <Menu
           class={[
-            '!absolute top-0',
+            '!absolute top-0 z-11',
             {
               '!left-[var(--tab-menu-min-width)]': unref(collapse),
               '!left-[var(--tab-menu-max-width)]': !unref(collapse),

+ 0 - 3
src/views/crm/statistics/funnel/components/FunnelBusiness.vue

@@ -33,8 +33,6 @@
 import { CrmStatisticFunnelRespVO, StatisticFunnelApi } from '@/api/crm/statistics/funnel'
 import { EChartsOption } from 'echarts'
 import { DICT_TYPE } from '@/utils/dict'
-import echarts from '@/plugins/echarts'
-import { FunnelChart } from 'echarts/charts'
 
 defineOptions({ name: 'FunnelBusiness' })
 const props = defineProps<{ queryParams: any }>() // 搜索参数
@@ -44,7 +42,6 @@ const loading = ref(false) // 加载中
 const list = ref<CrmStatisticFunnelRespVO[]>([]) // 列表的数据
 
 /** 销售漏斗 */
-echarts?.use([FunnelChart])
 const echartsOption = reactive<EChartsOption>({
   title: {
     text: '销售漏斗'

+ 0 - 59
src/views/infra/dbDoc/index.vue

@@ -1,59 +0,0 @@
-<template>
-  <doc-alert title="数据库文档" url="https://doc.iocoder.cn/db-doc/" />
-
-  <ContentWrap title="数据库文档">
-    <div class="mb-10px">
-      <el-button type="primary" plain @click="handleExport('HTML')">
-        <Icon icon="ep:download" /> 导出 HTML
-      </el-button>
-      <el-button type="primary" plain @click="handleExport('Word')">
-        <Icon icon="ep:download" /> 导出 Word
-      </el-button>
-      <el-button type="primary" plain @click="handleExport('Markdown')">
-        <Icon icon="ep:download" /> 导出 Markdown
-      </el-button>
-    </div>
-    <IFrame v-if="!loading" v-loading="loading" :src="src" />
-  </ContentWrap>
-</template>
-<script lang="ts" setup>
-import download from '@/utils/download'
-import * as DbDocApi from '@/api/infra/dbDoc'
-
-defineOptions({ name: 'InfraDBDoc' })
-
-const loading = ref(true) // 是否加载中
-const src = ref('') // HTML 的地址
-
-/** 页面加载 */
-const init = async () => {
-  try {
-    const data = await DbDocApi.exportHtml()
-    const blob = new Blob([data], { type: 'text/html' })
-    src.value = window.URL.createObjectURL(blob)
-  } finally {
-    loading.value = false
-  }
-}
-
-/** 处理导出  */
-const handleExport = async (type: string) => {
-  if (type === 'HTML') {
-    const res = await DbDocApi.exportHtml()
-    download.html(res, '数据库文档.html')
-  }
-  if (type === 'Word') {
-    const res = await DbDocApi.exportWord()
-    download.word(res, '数据库文档.doc')
-  }
-  if (type === 'Markdown') {
-    const res = await DbDocApi.exportMarkdown()
-    download.markdown(res, '数据库文档.md')
-  }
-}
-
-/** 初始化 */
-onMounted(async () => {
-  await init()
-})
-</script>

+ 1 - 1
src/views/mp/components/wx-reply/components/TabImage.vue

@@ -63,7 +63,7 @@ import { getAccessToken } from '@/utils/auth'
 import { Reply } from './types'
 const message = useMessage()
 
-const UPLOAD_URL = import.meta.env.VITE_API_BASEPATH + '/admin-api/mp/material/upload-temporary'
+const UPLOAD_URL = import.meta.env.VITE_BASE_URL + '/admin-api/mp/material/upload-temporary'
 const HEADERS = { Authorization: 'Bearer ' + getAccessToken() } // 设置上传的请求头部
 
 const props = defineProps<{

+ 1 - 1
src/views/mp/components/wx-reply/components/TabMusic.vue

@@ -67,7 +67,7 @@ import { Reply } from './types'
 
 const message = useMessage()
 
-const UPLOAD_URL = import.meta.env.VITE_API_BASEPATH + '/admin-api/mp/material/upload-temporary'
+const UPLOAD_URL = import.meta.env.VITE_BASE_URL + '/admin-api/mp/material/upload-temporary'
 const HEADERS = { Authorization: 'Bearer ' + getAccessToken() } // 设置上传的请求头部
 
 const props = defineProps<{

+ 1 - 1
src/views/mp/components/wx-reply/components/TabVideo.vue

@@ -58,7 +58,7 @@ import { Reply } from './types'
 
 const message = useMessage()
 
-const UPLOAD_URL = import.meta.env.VITE_API_BASEPATH + '/admin-api/mp/material/upload-temporary'
+const UPLOAD_URL = import.meta.env.VITE_BASE_URL + '/admin-api/mp/material/upload-temporary'
 const HEADERS = { Authorization: 'Bearer ' + getAccessToken() }
 
 const props = defineProps<{

+ 1 - 1
src/views/mp/components/wx-reply/components/TabVoice.vue

@@ -61,7 +61,7 @@ import { getAccessToken } from '@/utils/auth'
 import { Reply } from './types'
 const message = useMessage()
 
-const UPLOAD_URL = import.meta.env.VITE_API_BASEPATH + '/admin-api/mp/material/upload-temporary'
+const UPLOAD_URL = import.meta.env.VITE_BASE_URL + '/admin-api/mp/material/upload-temporary'
 const HEADERS = { Authorization: 'Bearer ' + getAccessToken() } // 设置上传的请求头部
 
 const props = defineProps<{

+ 0 - 112
src/views/system/errorCode/ErrorCodeForm.vue

@@ -1,112 +0,0 @@
-<template>
-  <Dialog v-model="dialogVisible" :title="dialogTitle">
-    <el-form
-      ref="formRef"
-      v-loading="formLoading"
-      :model="formData"
-      :rules="formRules"
-      label-width="100px"
-    >
-      <el-form-item label="应用名" prop="applicationName">
-        <el-input v-model="formData.applicationName" clearable placeholder="请输入应用名" />
-      </el-form-item>
-      <el-form-item label="错误码编码" prop="code">
-        <el-input v-model="formData.code" clearable placeholder="请输入错误码编码" />
-      </el-form-item>
-      <el-form-item label="错误码提示" prop="message">
-        <el-input v-model="formData.message" clearable placeholder="请输入错误码提示" />
-      </el-form-item>
-      <el-form-item label="备注" prop="memo">
-        <el-input v-model="formData.memo" clearable placeholder="请输入备注" />
-      </el-form-item>
-    </el-form>
-    <template #footer>
-      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
-    </template>
-  </Dialog>
-</template>
-<script lang="ts" setup>
-import * as ErrorCodeApi from '@/api/system/errorCode'
-
-defineOptions({ name: 'SystemErrorCodeForm' })
-
-const { t } = useI18n() // 国际化
-const message = useMessage() // 消息弹窗
-
-const dialogVisible = ref(false) // 弹窗的是否展示
-const dialogTitle = ref('') // 弹窗的标题
-const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
-const formType = ref('') // 表单的类型:create - 新增;update - 修改
-// 表单参数
-const formData = ref({
-  id: undefined,
-  code: undefined,
-  applicationName: '',
-  message: '',
-  memo: ''
-})
-// 表单校验
-const formRules = reactive({
-  applicationName: [{ required: true, message: '应用名不能为空', trigger: 'blur' }],
-  code: [{ required: true, message: '错误码编码不能为空', trigger: 'blur' }],
-  message: [{ required: true, message: '错误码提示不能为空', trigger: 'blur' }]
-})
-const formRef = ref() // 表单 Ref
-
-/** 打开弹窗 */
-const open = async (type: string, id?: number) => {
-  dialogVisible.value = true
-  dialogTitle.value = t('action.' + type)
-  formType.value = type
-  resetForm()
-  // 修改时,设置数据
-  if (id) {
-    formLoading.value = true
-    try {
-      formData.value = await ErrorCodeApi.getErrorCode(id)
-    } finally {
-      formLoading.value = false
-    }
-  }
-}
-defineExpose({ open }) // 提供 open 方法,用于打开弹窗
-
-/** 提交表单 */
-const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
-const submitForm = async () => {
-  // 校验表单
-  if (!formRef) return
-  const valid = await formRef.value.validate()
-  if (!valid) return
-  // 提交请求
-  formLoading.value = true
-  try {
-    const data = formData.value as ErrorCodeApi.ErrorCodeVO
-    if (formType.value === 'create') {
-      await ErrorCodeApi.createErrorCode(data)
-      message.success(t('common.createSuccess'))
-    } else {
-      await ErrorCodeApi.updateErrorCode(data)
-      message.success(t('common.updateSuccess'))
-    }
-    dialogVisible.value = false
-    // 发送操作成功的事件
-    emit('success')
-  } finally {
-    formLoading.value = false
-  }
-}
-
-/** 表单重置 */
-const resetForm = () => {
-  formData.value = {
-    id: undefined,
-    applicationName: '',
-    code: undefined,
-    message: '',
-    memo: ''
-  }
-  formRef.value?.resetFields()
-}
-</script>

+ 0 - 228
src/views/system/errorCode/index.vue

@@ -1,228 +0,0 @@
-<template>
-  <doc-alert title="异常处理(错误码)" url="https://doc.iocoder.cn/exception/" />
-
-  <!-- 搜索工作栏 -->
-  <ContentWrap>
-    <el-form
-      class="-mb-15px"
-      :model="queryParams"
-      ref="queryFormRef"
-      :inline="true"
-      label-width="90px"
-    >
-      <el-form-item label="错误码类型" prop="type">
-        <el-select v-model="queryParams.type" placeholder="请选择错误码类型" clearable>
-          <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_ERROR_CODE_TYPE)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-            class="!w-240px"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="应用名" prop="applicationName">
-        <el-input
-          v-model="queryParams.applicationName"
-          placeholder="请输入应用名"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="错误码编码" prop="code">
-        <el-input
-          v-model="queryParams.code"
-          placeholder="请输入错误码编码"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="错误码提示" prop="message">
-        <el-input
-          v-model="queryParams.message"
-          placeholder="请输入错误码提示"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
-        <el-date-picker
-          v-model="queryParams.createTime"
-          value-format="YYYY-MM-DD HH:mm:ss"
-          type="daterange"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
-          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
-        <el-button
-          type="primary"
-          plain
-          @click="openForm('create')"
-          v-hasPermi="['system:error-code:create']"
-        >
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
-        </el-button>
-        <el-button
-          type="success"
-          plain
-          @click="handleExport"
-          :loading="exportLoading"
-          v-hasPermi="['system:error-code:export']"
-        >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
-        </el-button>
-      </el-form-item>
-    </el-form>
-  </ContentWrap>
-
-  <!-- 列表 -->
-  <ContentWrap>
-    <el-table v-loading="loading" :data="list">
-      <el-table-column label="编号" align="center" prop="id" />
-      <el-table-column label="类型" align="center" prop="type" width="80">
-        <template #default="scope">
-          <dict-tag :type="DICT_TYPE.SYSTEM_ERROR_CODE_TYPE" :value="scope.row.type" />
-        </template>
-      </el-table-column>
-      <el-table-column label="应用名" align="center" prop="applicationName" width="200" />
-      <el-table-column label="错误码编码" align="center" prop="code" width="120" />
-      <el-table-column label="错误码提示" align="center" prop="message" width="300" />
-      <el-table-column label="备注" align="center" prop="memo" width="200" />
-      <el-table-column
-        label="创建时间"
-        align="center"
-        prop="createTime"
-        width="180"
-        :formatter="dateFormatter"
-      />
-      <el-table-column label="操作" align="center" class-name="small-paddingfixed-width">
-        <template #default="scope">
-          <el-button
-            link
-            type="primary"
-            @click="openForm('update', scope.row.id)"
-            v-hasPermi="['system:error-code:update']"
-          >
-            编辑
-          </el-button>
-          <el-button
-            link
-            type="danger"
-            @click="handleDelete(scope.row.id)"
-            v-hasPermi="['system:error-code:delete']"
-          >
-            删除
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <!-- 分页组件 -->
-    <Pagination
-      :total="total"
-      v-model:page="queryParams.pageNo"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
-    />
-  </ContentWrap>
-
-  <!-- 表单弹窗:添加/修改 -->
-  <ErrorCodeForm ref="formRef" @success="getList" />
-</template>
-
-<script lang="ts" setup>
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
-import { dateFormatter } from '@/utils/formatTime'
-import download from '@/utils/download'
-import * as ErrorCodeApi from '@/api/system/errorCode'
-import ErrorCodeForm from './ErrorCodeForm.vue'
-
-defineOptions({ name: 'SystemErrorCode' })
-
-const message = useMessage() // 消息弹窗
-const { t } = useI18n() // 国际化
-
-const loading = ref(true) // 遮罩层
-const exportLoading = ref(false) // 导出遮罩层
-const total = ref(0) // 总条数
-const list = ref([]) // 错误码列表
-const queryParams = reactive({
-  pageNo: 1,
-  pageSize: 10,
-  type: undefined,
-  applicationName: undefined,
-  code: undefined,
-  message: undefined,
-  createTime: []
-})
-const queryFormRef = ref() // 搜索的表单
-
-/** 查询列表 */
-const getList = async () => {
-  loading.value = true
-  try {
-    const data = await ErrorCodeApi.getErrorCodePage(queryParams)
-    list.value = data.list
-    total.value = data.total
-  } finally {
-    loading.value = false
-  }
-}
-
-/** 搜索按钮操作 */
-const handleQuery = () => {
-  queryParams.pageNo = 1
-  getList()
-}
-
-/** 重置按钮操作 */
-const resetQuery = () => {
-  queryFormRef.value.resetFields()
-  handleQuery()
-}
-
-/** 添加/修改操作 */
-const formRef = ref()
-const openForm = (type: string, id?: number) => {
-  formRef.value.open(type, id)
-}
-
-/** 删除按钮操作 */
-const handleDelete = async (id: number) => {
-  try {
-    // 删除的二次确认
-    await message.delConfirm()
-    await ErrorCodeApi.deleteErrorCode(id)
-    message.success(t('common.delSuccess'))
-    // 刷新列表
-    await getList()
-  } catch {}
-}
-
-/** 导出按钮操作 */
-const handleExport = async () => {
-  try {
-    // 导出的二次确认
-    await message.exportConfirm()
-    // 发起导出
-    exportLoading.value = true
-    const data = await ErrorCodeApi.excelErrorCode(queryParams)
-    download.excel(data, '错误码.xls')
-  } catch {
-  } finally {
-    exportLoading.value = false
-  }
-}
-
-/** 初始化 **/
-onMounted(() => {
-  getList()
-})
-</script>

+ 11 - 1
src/views/system/mail/account/account.data.ts

@@ -16,7 +16,8 @@ export const rules = reactive({
   password: [required],
   host: [required],
   port: [required],
-  sslEnable: [required]
+  sslEnable: [required],
+  starttlsEnable: [required]
 })
 
 // CrudSchema:https://doc.iocoder.cn/vue3/crud-schema/
@@ -57,6 +58,15 @@ const crudSchemas = reactive<CrudSchema[]>([
       component: 'Radio'
     }
   },
+  {
+    label: '是否开启 STARTTLS',
+    field: 'starttlsEnable',
+    dictType: DICT_TYPE.INFRA_BOOLEAN_STRING,
+    dictClass: 'boolean',
+    form: {
+      component: 'Radio'
+    }
+  },
   {
     label: '创建时间',
     field: 'createTime',

+ 5 - 1
src/views/system/role/index.vue

@@ -87,7 +87,11 @@
     <el-table v-loading="loading" :data="list">
       <el-table-column align="center" label="角色编号" prop="id" />
       <el-table-column align="center" label="角色名称" prop="name" />
-      <el-table-column align="center" label="角色类型" prop="type" />
+      <el-table-column label="角色类型" align="center" prop="type">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.SYSTEM_ROLE_TYPE" :value="scope.row.type" />
+        </template>
+      </el-table-column>
       <el-table-column align="center" label="角色标识" prop="code" />
       <el-table-column align="center" label="显示顺序" prop="sort" />
       <el-table-column align="center" label="备注" prop="remark" />

+ 0 - 131
src/views/system/sensitiveWord/SensitiveWordForm.vue

@@ -1,131 +0,0 @@
-<template>
-  <Dialog v-model="dialogVisible" :title="dialogTitle">
-    <el-form
-      ref="formRef"
-      v-loading="formLoading"
-      :model="formData"
-      :rules="formRules"
-      label-width="80px"
-    >
-      <el-form-item label="敏感词" prop="name">
-        <el-input v-model="formData.name" placeholder="请输入敏感词" />
-      </el-form-item>
-      <el-form-item label="状态" prop="status">
-        <el-radio-group v-model="formData.status">
-          <el-radio
-            v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
-            :key="dict.value"
-            :label="dict.value"
-          >
-            {{ dict.label }}
-          </el-radio>
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item label="备注" prop="description">
-        <el-input v-model="formData.description" placeholder="请输入内容" />
-      </el-form-item>
-      <el-form-item label="标签" prop="tags">
-        <el-select
-          v-model="formData.tags"
-          allow-create
-          filterable
-          multiple
-          placeholder="请选择文章标签"
-          style="width: 380px"
-        >
-          <el-option v-for="tag in tagList" :key="tag" :label="tag" :value="tag" />
-        </el-select>
-      </el-form-item>
-    </el-form>
-    <template #footer>
-      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
-    </template>
-  </Dialog>
-</template>
-<script lang="ts" setup>
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
-import * as SensitiveWordApi from '@/api/system/sensitiveWord'
-import { CommonStatusEnum } from '@/utils/constants'
-
-defineOptions({ name: 'SystemSensitiveWordForm' })
-
-const { t } = useI18n() // 国际化
-const message = useMessage() // 消息弹窗
-
-const dialogVisible = ref(false) // 弹窗的是否展示
-const dialogTitle = ref('') // 弹窗的标题
-const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
-const formType = ref('') // 表单的类型:create - 新增;update - 修改
-const formData = ref({
-  id: undefined,
-  name: '',
-  status: CommonStatusEnum.ENABLE,
-  description: '',
-  tags: []
-})
-const formRules = reactive({
-  name: [{ required: true, message: '敏感词不能为空', trigger: 'blur' }],
-  tags: [{ required: true, message: '标签不能为空', trigger: 'blur' }]
-})
-const formRef = ref() // 表单 Ref
-const tagList = ref([]) // 标签数组
-
-/** 打开弹窗 */
-const open = async (type: string, id?: number) => {
-  dialogVisible.value = true
-  dialogTitle.value = t('action.' + type)
-  formType.value = type
-  resetForm()
-  // 修改时,设置数据
-  if (id) {
-    formLoading.value = true
-    try {
-      formData.value = await SensitiveWordApi.getSensitiveWord(id)
-    } finally {
-      formLoading.value = false
-    }
-  }
-  // 获得 Tag 标签列表
-  tagList.value = await SensitiveWordApi.getSensitiveWordTagList()
-}
-defineExpose({ open }) // 提供 open 方法,用于打开弹窗
-
-/** 提交表单 */
-const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
-const submitForm = async () => {
-  // 校验表单
-  if (!formRef) return
-  const valid = await formRef.value.validate()
-  if (!valid) return
-  // 提交请求
-  formLoading.value = true
-  try {
-    const data = formData.value as unknown as SensitiveWordApi.SensitiveWordVO
-    if (formType.value === 'create') {
-      await SensitiveWordApi.createSensitiveWord(data)
-      message.success(t('common.createSuccess'))
-    } else {
-      await SensitiveWordApi.updateSensitiveWord(data)
-      message.success(t('common.updateSuccess'))
-    }
-    dialogVisible.value = false
-    // 发送操作成功的事件
-    emit('success')
-  } finally {
-    formLoading.value = false
-  }
-}
-
-/** 重置表单 */
-const resetForm = () => {
-  formData.value = {
-    id: undefined,
-    name: '',
-    status: CommonStatusEnum.ENABLE,
-    description: '',
-    tags: []
-  }
-  formRef.value?.resetFields()
-}
-</script>

+ 0 - 91
src/views/system/sensitiveWord/SensitiveWordTestForm.vue

@@ -1,91 +0,0 @@
-<template>
-  <Dialog v-model="dialogVisible" title="检测敏感词">
-    <el-form
-      ref="formRef"
-      v-loading="formLoading"
-      :model="formData"
-      :rules="formRules"
-      label-width="80px"
-    >
-      <el-form-item label="文本" prop="text">
-        <el-input v-model="formData.text" placeholder="请输入测试文本" type="textarea" />
-      </el-form-item>
-      <el-form-item label="标签" prop="tags">
-        <el-select
-          v-model="formData.tags"
-          allow-create
-          filterable
-          multiple
-          placeholder="请选择标签"
-          style="width: 380px"
-        >
-          <el-option v-for="tag in tagList" :key="tag" :label="tag" :value="tag" />
-        </el-select>
-      </el-form-item>
-    </el-form>
-    <template #footer>
-      <el-button :disabled="formLoading" type="primary" @click="submitForm">检 测</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
-    </template>
-  </Dialog>
-</template>
-<script lang="ts" setup>
-import * as SensitiveWordApi from '@/api/system/sensitiveWord'
-
-defineOptions({ name: 'SystemSensitiveWordTestForm' })
-
-const message = useMessage() // 消息弹窗
-
-const dialogVisible = ref(false) // 弹窗的是否展示
-const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
-const formData = ref({
-  text: '',
-  tags: []
-})
-const formRules = reactive({
-  text: [{ required: true, message: '测试文本不能为空', trigger: 'blur' }],
-  tags: [{ required: true, message: '标签不能为空', trigger: 'blur' }]
-})
-const formRef = ref() // 表单 Ref
-const tagList = ref([]) // 标签数组
-
-/** 打开弹窗 */
-const open = async () => {
-  dialogVisible.value = true
-  resetForm()
-  // 获得 Tag 标签列表
-  tagList.value = await SensitiveWordApi.getSensitiveWordTagList()
-}
-defineExpose({ open }) // 提供 open 方法,用于打开弹窗
-
-/** 提交表单 */
-const submitForm = async () => {
-  // 校验表单
-  if (!formRef) return
-  const valid = await formRef.value.validate()
-  if (!valid) return
-  // 提交请求
-  formLoading.value = true
-  try {
-    const form = formData.value as unknown as SensitiveWordApi.SensitiveWordTestReqVO
-    const data = await SensitiveWordApi.validateText(form)
-    if (data.length === 0) {
-      message.success('不包含敏感词!')
-      return
-    }
-    message.warning('包含敏感词:' + data.join(', '))
-    dialogVisible.value = false
-  } finally {
-    formLoading.value = false
-  }
-}
-
-/** 重置表单 */
-const resetForm = () => {
-  formData.value = {
-    text: '',
-    tags: []
-  }
-  formRef.value?.resetFields()
-}
-</script>

+ 0 - 253
src/views/system/sensitiveWord/index.vue

@@ -1,253 +0,0 @@
-<template>
-  <!-- 搜索工作栏 -->
-  <ContentWrap>
-    <el-form
-      ref="queryFormRef"
-      :inline="true"
-      :model="queryParams"
-      class="-mb-15px"
-      label-width="68px"
-    >
-      <el-form-item label="敏感词" prop="name">
-        <el-input
-          v-model="queryParams.name"
-          class="!w-240px"
-          clearable
-          placeholder="请输入敏感词"
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="标签" prop="tag">
-        <el-select
-          v-model="queryParams.tag"
-          class="!w-240px"
-          clearable
-          placeholder="请选择标签"
-          @keyup.enter="handleQuery"
-        >
-          <el-option v-for="tag in tagList" :key="tag" :label="tag" :value="tag" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="状态" prop="status">
-        <el-select v-model="queryParams.status" clearable placeholder="请选择启用状态">
-          <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-            class="!w-240px"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
-        <el-date-picker
-          v-model="queryParams.createTime"
-          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
-          class="!w-240px"
-          end-placeholder="结束日期"
-          start-placeholder="开始日期"
-          type="daterange"
-          value-format="YYYY-MM-DD HH:mm:ss"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="handleQuery">
-          <Icon class="mr-5px" icon="ep:search" />
-          搜索
-        </el-button>
-        <el-button @click="resetQuery">
-          <Icon class="mr-5px" icon="ep:refresh" />
-          重置
-        </el-button>
-        <el-button
-          v-hasPermi="['system:sensitive-word:create']"
-          plain
-          type="primary"
-          @click="openForm('create')"
-        >
-          <Icon class="mr-5px" icon="ep:plus" />
-          新增
-        </el-button>
-        <el-button
-          v-hasPermi="['system:sensitive-word:export']"
-          :loading="exportLoading"
-          plain
-          type="success"
-          @click="handleExport"
-        >
-          <Icon class="mr-5px" icon="ep:download" />
-          导出
-        </el-button>
-        <el-button plain type="warning" @click="openTestForm">
-          <Icon class="mr-5px" icon="ep:document-checked" />
-          测试
-        </el-button>
-      </el-form-item>
-    </el-form>
-  </ContentWrap>
-
-  <!-- 列表 -->
-  <ContentWrap>
-    <el-table v-loading="loading" :data="list">
-      <el-table-column align="center" label="编号" prop="id" />
-      <el-table-column align="center" label="敏感词" prop="name" />
-      <el-table-column align="center" label="状态" prop="status">
-        <template #default="scope">
-          <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
-        </template>
-      </el-table-column>
-      <el-table-column align="center" label="描述" prop="description" />
-      <el-table-column align="center" label="标签" prop="tags">
-        <template #default="scope">
-          <el-tag
-            v-for="tag in scope.row.tags"
-            :key="tag"
-            :disable-transitions="true"
-            class="mr-5px"
-          >
-            {{ tag }}
-          </el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column
-        :formatter="dateFormatter"
-        align="center"
-        label="创建时间"
-        prop="createTime"
-        width="180"
-      />
-      <el-table-column align="center" label="操作">
-        <template #default="scope">
-          <el-button
-            v-hasPermi="['infra:sensitive-word:update']"
-            link
-            type="primary"
-            @click="openForm('update', scope.row.id)"
-          >
-            编辑
-          </el-button>
-          <el-button
-            v-hasPermi="['infra:sensitive-word:delete']"
-            link
-            type="danger"
-            @click="handleDelete(scope.row.id)"
-          >
-            删除
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <!-- 分页 -->
-    <Pagination
-      v-model:limit="queryParams.pageSize"
-      v-model:page="queryParams.pageNo"
-      :total="total"
-      @pagination="getList"
-    />
-  </ContentWrap>
-
-  <!-- 表单弹窗:添加/修改 -->
-  <SensitiveWordForm ref="formRef" @success="getList" />
-
-  <!-- 表单弹窗:测试敏感词 -->
-  <SensitiveWordTestForm ref="testFormRef" />
-</template>
-<script lang="ts" setup>
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
-import { dateFormatter } from '@/utils/formatTime'
-import download from '@/utils/download'
-import * as SensitiveWordApi from '@/api/system/sensitiveWord'
-import SensitiveWordForm from './SensitiveWordForm.vue'
-import SensitiveWordTestForm from './SensitiveWordTestForm.vue'
-
-defineOptions({ name: 'SystemSensitiveWord' })
-
-const message = useMessage() // 消息弹窗
-const { t } = useI18n() // 国际化
-
-const loading = ref(true) // 列表的加载中
-const total = ref(0) // 列表的总页数
-const list = ref([]) // 列表的数据
-const queryParams = reactive({
-  pageNo: 1,
-  pageSize: 10,
-  name: undefined,
-  tag: undefined,
-  status: undefined,
-  createTime: []
-})
-const queryFormRef = ref() // 搜索的表单
-const exportLoading = ref(false) // 导出的加载中
-const tagList = ref([]) // 标签数组
-
-/** 查询列表 */
-const getList = async () => {
-  loading.value = true
-  try {
-    const data = await SensitiveWordApi.getSensitiveWordPage(queryParams)
-    list.value = data.list
-    total.value = data.total
-  } finally {
-    loading.value = false
-  }
-}
-
-/** 搜索按钮操作 */
-const handleQuery = () => {
-  queryParams.pageNo = 1
-  getList()
-}
-
-/** 重置按钮操作 */
-const resetQuery = () => {
-  queryFormRef.value.resetFields()
-  handleQuery()
-}
-
-/** 添加/修改操作 */
-const formRef = ref()
-const openForm = (type: string, id?: number) => {
-  formRef.value.open(type, id)
-}
-
-/** 测试敏感词按钮操作 */
-const testFormRef = ref()
-const openTestForm = () => {
-  testFormRef.value.open()
-}
-
-/** 删除按钮操作 */
-const handleDelete = async (id: number) => {
-  try {
-    // 删除的二次确认
-    await message.delConfirm()
-    // 发起删除
-    await SensitiveWordApi.deleteSensitiveWord(id)
-    message.success(t('common.delSuccess'))
-    // 刷新列表
-    await getList()
-  } catch {}
-}
-
-/** 导出按钮操作 */
-const handleExport = async () => {
-  try {
-    // 导出的二次确认
-    await message.exportConfirm()
-    // 发起导出
-    exportLoading.value = true
-    const data = await SensitiveWordApi.exportSensitiveWord(queryParams)
-    download.excel(data, '敏感词.xls')
-  } catch {
-  } finally {
-    exportLoading.value = false
-  }
-}
-
-/** 初始化 **/
-onMounted(async () => {
-  await getList()
-  // 获得 Tag 标签列表
-  tagList.value = await SensitiveWordApi.getSensitiveWordTagList()
-})
-</script>

+ 0 - 1
types/env.d.ts

@@ -17,7 +17,6 @@ interface ImportMetaEnv {
   readonly VITE_APP_DOCALERT_ENABLE: string
   readonly VITE_BASE_URL: string
   readonly VITE_UPLOAD_URL: string
-  readonly VITE_API_BASEPATH: string
   readonly VITE_API_URL: string
   readonly VITE_BASE_PATH: string
   readonly VITE_DROP_DEBUGGER: string