feat(verbal-trick): 新增增强话术功能

This commit is contained in:
dj
2024-11-29 12:56:12 +08:00
parent 67917e9bb5
commit a88b93e235
2 changed files with 128 additions and 114 deletions

View File

@@ -51,7 +51,7 @@
</div> </div>
</el-scrollbar> </el-scrollbar>
<fvFormDialog ref="formDialogRef" width="400" :title="dialogTitle" <fvFormDialog ref="formDialogRef" width="550" :title="dialogTitle"
:form-schema="formSchema" :form-rules="formRules" :form-schema="formSchema" :form-rules="formRules"
@dialogSubmit="handleSubmitAddressBook"></fvFormDialog> @dialogSubmit="handleSubmitAddressBook"></fvFormDialog>
</div> </div>
@@ -78,16 +78,16 @@ const props = defineProps({
}, },
}) })
const formDialogRef = ref() const formDialogRef = ref()
const dialogTitle = ref("添加问题答案"); const dialogTitle = ref("训练知识库");
const formRules = reactive({ const formRules = reactive({
answer: [ answer: [
{required: true, message: "答案不能为空", trigger: "blur"}, {required: true, message: "知识校准不能为空", trigger: "blur"},
], ],
}); });
const formSchema = computed(() => { const formSchema = computed(() => {
return [ return [
{ {
label: '问题', label: '知识内容',
prop: 'query', prop: 'query',
component: 'el-input', component: 'el-input',
colProps: { colProps: {
@@ -95,16 +95,18 @@ const formSchema = computed(() => {
}, },
}, },
{ {
label: '答案', label: '知识校准',
prop: 'answer', prop: 'answer',
component: 'el-input', component: 'el-input',
colProps: { colProps: {
span: 24 span: 24
}, },
props: { props: {
placeholder: '请输入答案', placeholder: '请输入知识校准',
clearable: true, clearable: true,
} type: 'textarea',
rows: 4,
},
}, },
] ]
}) })

View File

@@ -1,122 +1,134 @@
import { defineStore } from "pinia"; import {defineStore} from "pinia";
import { ref } from "vue"; import {ref} from "vue";
import { getRouters } from "@/api/system/menu"; import {getRouters} from "@/api/system/menu";
import Layout from '@/layout/index.vue' import Layout from '@/layout/index.vue'
import ParentView from '@/components/ParentView.vue' import ParentView from '@/components/ParentView.vue'
import router from "../router"; import router from "../router";
import {getUserInfo} from "@/api/login";
const VueComUrl = import.meta.glob('../views/**/*.vue') const VueComUrl = import.meta.glob('../views/**/*.vue')
export const usePermisstionStroe = defineStore('permisstion', () => { export const usePermisstionStroe = defineStore('permisstion', () => {
const asyncRouters = ref([]) const asyncRouters = ref([])
//定义是否加载路由变量 const userinfo = ref()
const isLoadRoutes = ref(false) //定义是否加载路由变量
const menuList = ref([{ const isLoadRoutes = ref(false)
name: 'home', const menuList = ref([{
path: '/home', name: 'home',
icon: 'home', path: '/home',
title: '工作台', icon: 'home',
meta: { title: '工作台',
breadcrumb: true meta: {
} breadcrumb: true
}])
const setIsLoadRoutes = (status) => {
return isLoadRoutes.value = status
}
const setAsyncRouters = async () => {
await getRouters().then(res => {
if (res.code === 1000) {
const sRouter = JSON.parse(JSON.stringify(res.data))
const mData = JSON.parse(JSON.stringify(res.data))
asyncRouters.value = formatAsyncRouters(sRouter)
// menuList.value = generateMenu(mData)
menuList.value = [...menuList.value, ...generateMenu(mData)]
addAsyncRouters(asyncRouters.value)
isLoadRoutes.value = false
} else {
isLoadRoutes.value = true
setTimeout(() => setAsyncRouters(), 3000)
}
})
}
const formatAsyncRouters = (routers) => {
return routers.filter(route => {
if (route.component) {
if (route.component === 'Layout') {
route.component = Layout
} else if (route.component === 'ParentView') {
route.component = ParentView
} }
else { }])
route.component = loadView(route.component)
const setIsLoadRoutes = (status) => {
return isLoadRoutes.value = status
}
const getUser=async ()=>{
let {data}= await getUserInfo()
return data.user.roles[0].roleKey == 'voice';
}
const setAsyncRouters = async () => {
await getRouters().then(async res => {
if (res.code === 1000) {
const sRouter = JSON.parse(JSON.stringify(res.data))
const mData = JSON.parse(JSON.stringify(res.data))
asyncRouters.value = formatAsyncRouters(sRouter)
let role = await getUser()
if(role){
generateMenu(mData).map(item => {
if (item.path == '/voice/management') {
item.children = item.children.filter(item => item.name !== "Speech")
}
})
}
menuList.value = [...menuList.value, ...generateMenu(mData)]
addAsyncRouters(asyncRouters.value)
isLoadRoutes.value = false
} else {
isLoadRoutes.value = true
setTimeout(() => setAsyncRouters(), 3000)
}
})
}
const formatAsyncRouters = (routers) => {
return routers.filter(route => {
if (route.component) {
if (route.component === 'Layout') {
route.component = Layout
} else if (route.component === 'ParentView') {
route.component = ParentView
} else {
route.component = loadView(route.component)
}
}
if (route.children !== null && route.children && route.children.length !== 0) {
route.children = formatAsyncRouters(route.children)
}
return true
})
}
const addAsyncRouters = (routers) => {
routers.forEach(route => {
router.addRoute(route)
})
}
const generateMenu = (routes) => {
return routes.filter(item => {
if (item.children && item.children.length !== 0) {
generateMenu(item.children)
}
if (item.pathParams != null) {
item.path = formatPath(item.path, JSON.parse(item.pathParams))
}
item.title = item.meta.title
item.icon = item.meta.icon
return true
})
}
// 拼接地址
const formatPath = (path, query) => {
const queryArr = []
let newPath = path
for (const key in query) {
queryArr.push({label: key, value: query[key]})
} }
} queryArr.forEach((item, index) => {
if (route.children !== null && route.children && route.children.length !== 0) { if (!index) {
route.children = formatAsyncRouters(route.children) newPath += `?${item.label}=${item.value}`
} } else {
return true newPath += `&${item.label}=${item.value}`
}) }
} })
return newPath
const addAsyncRouters = (routers) => {
routers.forEach(route => {
router.addRoute(route)
})
}
const generateMenu = (routes) => {
return routes.filter(item => {
if (item.children && item.children.length !== 0) {
generateMenu(item.children)
}
if (item.pathParams != null) {
item.path = formatPath(item.path, JSON.parse(item.pathParams))
}
item.title = item.meta.title
item.icon = item.meta.icon
return true
})
}
// 拼接地址
const formatPath = (path, query) => {
const queryArr = []
let newPath = path
for (const key in query) {
queryArr.push({label: key, value: query[key]})
} }
queryArr.forEach((item, index)=>{
if(!index) {
newPath += `?${item.label}=${item.value}`
} else {
newPath += `&${item.label}=${item.value}`
}
})
return newPath
}
const loadView = (view) => { const loadView = (view) => {
if (import.meta.env.MODE === 'development') { if (import.meta.env.MODE === 'development') {
return () => import(/* @vite-ignore */`/src/views/${view}.vue`) return () => import(/* @vite-ignore */`/src/views/${view}.vue`)
} else { } else {
return VueComUrl['../views/' + view + '.vue'] return VueComUrl['../views/' + view + '.vue']
}
} }
}
const removeMenu = () => { const removeMenu = () => {
menuList.value.length = 0 menuList.value.length = 0
asyncRouters.value.length = 0 asyncRouters.value.length = 0
} }
return { return {
asyncRouters, asyncRouters,
menuList, menuList,
isLoadRoutes, isLoadRoutes,
setAsyncRouters, setAsyncRouters,
setIsLoadRoutes, setIsLoadRoutes,
removeMenu removeMenu
} }
}) })