diff --git a/docs/.vitepress/src/@types/type-docs.ts b/docs/.vitepress/src/@types/type-feedback.ts similarity index 60% rename from docs/.vitepress/src/@types/type-docs.ts rename to docs/.vitepress/src/@types/type-feedback.ts index 21451f578197ba540e0a55f430347a2c988bf1d6..52dc06e5ed36d4e7f1e24add9971d1d9c97f992e 100644 --- a/docs/.vitepress/src/@types/type-docs.ts +++ b/docs/.vitepress/src/@types/type-feedback.ts @@ -1,9 +1,8 @@ // 文档捉虫参数类型 export interface DocsBugParamsT { bugDocFragment: string; // bug文档片段 - existProblem: []; // 问题类型 + existProblem: string[]; // 问题类型 problemDetail: string; // 问题类型原因 - comprehensiveSatisfication: string; // 文档满意度 - email: string; // 邮箱 + comprehensiveSatisfication: number; // 文档满意度 link: string; // 当前url } diff --git a/docs/.vitepress/src/api/api-docs.ts b/docs/.vitepress/src/api/api-docs.ts deleted file mode 100644 index 81c8cd37c7576824df368423611decaba61cfb1b..0000000000000000000000000000000000000000 --- a/docs/.vitepress/src/api/api-docs.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { request } from '@/shared/axios'; - -import type { DocsBugParamsT } from '@/@types/type-docs'; - -/** - * 文档捉虫 - * @param {string} lang 语言 - * @param { DocsBugParamsT } params 文档捉虫参数类型 - */ -export function submitBug(lang: string, params: DocsBugParamsT) { - const url = `/api-dsapi/query/add/bugquestionnaire?community=openeuler&lang=${lang}`; - return request.post(url, params).then((res) => { - return res.data; - }); -} diff --git a/docs/.vitepress/src/api/api-feedback.ts b/docs/.vitepress/src/api/api-feedback.ts index 840309acd48c6b1cecaa79d38de52d0f6ad052cf..7e88c39ca3fcc6a036e6bcf06997635cf6858b04 100644 --- a/docs/.vitepress/src/api/api-feedback.ts +++ b/docs/.vitepress/src/api/api-feedback.ts @@ -1,5 +1,8 @@ import { request } from '@/shared/axios'; import type { AxiosResponse } from '@/shared/axios'; + +import type { DocsBugParamsT } from '@/@types/type-feedback'; + interface FeedBackQueryT { feedbackPageUrl: string; feedbackText: string; @@ -8,7 +11,7 @@ interface FeedBackQueryT { /** * 满意度评分 * @param {FeedBackQueryT} params - * @return {Object} + * @returns {Promise} */ export function postFeedback(params: FeedBackQueryT): Promise<{ code: number; @@ -19,3 +22,16 @@ export function postFeedback(params: FeedBackQueryT): Promise<{ const url = '/api-dsapi/query/nps?community=openeuler'; return request.post(url, params).then((res: AxiosResponse) => res.data); } + +/** + * 文档捉虫 + * @param {string} lang 语言 + * @param { DocsBugParamsT } params 文档捉虫参数类型 + * @returns {Promise} + */ +export function submitDocsBug(lang: string, params: DocsBugParamsT) { + const url = `/api-dsapi/query/add/bugquestionnaire?community=openeuler&lang=${lang}`; + return request.post(url, params).then((res) => { + return res.data; + }); +} diff --git a/docs/.vitepress/src/assets/category/feedback/svg-icons/icon-score.svg b/docs/.vitepress/src/assets/category/feedback/svg-icons/icon-score.svg new file mode 100644 index 0000000000000000000000000000000000000000..c9f7efdd4cb992d86c3896e0414fb5f5bcaeb00d --- /dev/null +++ b/docs/.vitepress/src/assets/category/feedback/svg-icons/icon-score.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/.vitepress/src/components/DocBugDialog.vue b/docs/.vitepress/src/components/DocBugDialog.vue index 9a9076c5b5c2a01577b6b4b22e577eac095d76eb..3bfc160f3097fece29594c5b3fc3899a01bb2c28 100644 --- a/docs/.vitepress/src/components/DocBugDialog.vue +++ b/docs/.vitepress/src/components/DocBugDialog.vue @@ -16,10 +16,25 @@ import { OToggle, OCheckbox, OLink, + useMessage, } from '@opensig/opendesign'; +import { useRoute } from 'vitepress'; + import IconTips from '~icons/app/icon-tips.svg'; +import type { DocsBugParamsT } from '@/@types/type-feedback'; + +import { submitDocsBug } from '@/api/api-feedback'; + +import { useLocale } from '@/composables/useLocale'; +import { useSearchingStore } from '@/stores/common'; + +const message = useMessage(); +const { t, locale } = useLocale(); +const searchStore = useSearchingStore(); +const route = useRoute(); + const props = defineProps({ modelValue: { type: Boolean, @@ -36,7 +51,6 @@ const emit = defineEmits(['update:modelValue']); const formData = reactive({ fragment: '', description: '', - email: '', }); const formRef = ref>(); @@ -78,37 +92,91 @@ const submitTypeOptions = [ }, ]; // -------------------- 提交类型 -------------------- -const questionType = ref('0'); +const questionType = ref('规范和低错类'); const questionTypeOptions = [ { label: '规范和低错类', - value: '0', + value: '规范和低错类', }, { label: '易用性', - value: '1', + value: '易用性', }, { label: '正确性', - value: '2', + value: '正确性', }, { label: '风险提示', - value: '3', + value: '风险提示', }, { label: '内容合规', - value: '4', + value: '内容合规', }, ]; const isAgree = ref<(string | number)[]>([]); const onAgree = () => {}; +const issueTemplate = (data: DocsBugParamsT) => { + let Problem = ''; + data.existProblem.length == 0 ? '' : (Problem = `- ${data.existProblem.join('、')}`); + return `1. 【文档链接】 + + > ${data.link} + + 2. 【"有虫"文档片段】 + + > ${data.bugDocFragment.replace(/(\r\n|\r|\n)+/g, '$1')} + + 3. 【存在的问题】 + + ${Problem} + > ${data.problemDetail.replace(/(\r\n|\r|\n)+/g, '$1')} + + 4. 【预期结果】 + - 请填写预期结果`; +}; + const submitBug = (results: FieldResultT[]) => { + // 获取要提交的文件的路径 + const path = route.path.replace(`/${locale.value}/`, '/').replace('html', 'md'); + + const regR = /[\r\n]+/g; + const first = formData.fragment.split(regR)[0]; + + const urlArr = route.path.split('/'); + const title = urlArr[urlArr.length - 1].replace('.html', ''); + if (results.find((item) => item?.type === 'danger')) { return; } else { + const postData = { + bugDocFragment: formData.fragment, + existProblem: [questionType.value], + problemDetail: formData.description, + comprehensiveSatisfication: 10, + link: window.location.href, + }; + submitDocsBug(locale.value, postData) + .then((res) => { + const body = encodeURIComponent(issueTemplate(postData)); + if (res.code === 200) { + if (submitType.value === 'issue') { + window.open(`https://gitee.com/openeuler/docs/issues/new?issue%5Bassignee_id%5D=0&issue%5Bmilestone_id%5D=0&title=文档捉虫&description=${body}`); + } else { + window.open( + `https://gitee.com/-/ide/project/openeuler/docs/edit/stable2-${searchStore.version}/-/docs/${locale.value}/docs/${path}?search=${first}&title=文档捉虫-openEuler ${searchStore.version}-${title}&description=${formData.description}&message=${formData.description}&label_names=文档捉虫` + ); + } + } + }) + .catch(() => { + message.warning({ + content: t('feedback.feedbackFailed'), + }); + }); } }; @@ -122,7 +190,7 @@ const change = (visible: boolean) => { } else { formData.fragment = props.selectionText; submitType.value = 'issue'; - questionType.value = '0'; + questionType.value = '规范和低错类'; } }; @@ -167,10 +235,6 @@ const change = (visible: boolean) => { - - - -
您理解并同意,您填写并提交的内容,即视为您已充分阅读并同意openEuler的 diff --git a/docs/.vitepress/src/components/FloatingButtonDocs.vue b/docs/.vitepress/src/components/FloatingButtonDocs.vue index 4d63a6035df18172f2bf6838447a1a3744c3cf78..4789d063398e0a568fea07b7a0f5402649cd5224 100644 --- a/docs/.vitepress/src/components/FloatingButtonDocs.vue +++ b/docs/.vitepress/src/components/FloatingButtonDocs.vue @@ -5,7 +5,7 @@ import { ElSlider } from 'element-plus'; import DocBugDialog from '@/components/DocBugDialog.vue'; -import IconSmile from '~icons/footer/icon-smile.svg'; +import IconScore from '~icons/feedback/icon-score.svg'; import IconClose from '~icons/app/icon-close.svg'; import IconQuickIssue_light from '~icons/footer/icon-quickissue_light.svg'; @@ -128,7 +128,7 @@ const STEP_MB = 25; const floatDataMb = ref([ { img: computed(() => { - return IconSmile; + return IconScore; }), id: 'score', textMb: '我要评分', @@ -195,7 +195,7 @@ onUnmounted(() => {