From ff837b0e5282a6994c1ac95689edc7eb1e161140 Mon Sep 17 00:00:00 2001 From: terwer Date: Wed, 23 Aug 2023 12:32:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20AI=20=E5=8A=9F=E8=83=BD=E5=8F=91?= =?UTF-8?q?=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/publish/BatchPublishIndex.vue | 41 +++++++-- .../publish/SinglePublishDoPublish.vue | 39 ++++++-- .../publish/form/CommonCategories.vue | 26 ++++++ .../publish/form/PublishCategories.vue | 65 ++++++++++++-- .../publish/form/PublishDescription.vue | 9 +- src/components/publish/form/PublishTags.vue | 9 +- src/components/publish/form/PublishTitle.vue | 88 +++++++++++++++++++ src/locales/en_US.ts | 4 + src/locales/zh_CN.ts | 4 + 9 files changed, 260 insertions(+), 25 deletions(-) create mode 100644 src/components/publish/form/PublishTitle.vue diff --git a/src/components/publish/BatchPublishIndex.vue b/src/components/publish/BatchPublishIndex.vue index 464f7f8c..85a83d5a 100644 --- a/src/components/publish/BatchPublishIndex.vue +++ b/src/components/publish/BatchPublishIndex.vue @@ -48,6 +48,7 @@ import { ICategoryConfig } from "~/src/types/ICategoryConfig.ts" import { SiyuanAttr } from "zhi-siyuan-api" import { DistributionPattern } from "~/src/models/distributionPattern.ts" import _ from "lodash" +import PublishTitle from "~/src/components/publish/form/PublishTitle.vue" const logger = createAppLogger("publisher-index") @@ -254,6 +255,11 @@ const syncAiSwitch = (val: boolean) => { logger.debug(`syncAiSwitch in batch publish => ${formData.useAi}`) } +const syncPublishTitle = (val: string) => { + formData.siyuanPost.title = val + logger.debug("syncPublishTitle in batch publish") +} + const syncEditMode = async (val: PageEditMode) => { formData.editType = val logger.debug("syncEditMode in batch publish") @@ -346,6 +352,13 @@ onMounted(async () => {
+ @@ -361,11 +374,13 @@ onMounted(async () => { />
-
- - - -
+
@@ -380,7 +395,9 @@ onMounted(async () => {
+ @@ -392,7 +409,8 @@ onMounted(async () => { v-model:use-ai="formData.useAi" v-model:page-id="id" v-model:desc="formData.siyuanPost.shortDesc" - v-model:content="formData.siyuanPost.html" + v-model:md="formData.siyuanPost.markdown" + v-model:html="formData.siyuanPost.html" @emitSyncDesc="syncDesc" /> @@ -401,12 +419,19 @@ onMounted(async () => { v-model:use-ai="formData.useAi" v-model:page-id="id" v-model:tags="formData.siyuanPost.mt_keywords" - v-model:content="formData.siyuanPost.html" + v-model:md="formData.siyuanPost.markdown" + v-model:html="formData.siyuanPost.html" @emitSyncTags="syncTags" /> - + diff --git a/src/components/publish/SinglePublishDoPublish.vue b/src/components/publish/SinglePublishDoPublish.vue index 18e31222..ef793c67 100644 --- a/src/components/publish/SinglePublishDoPublish.vue +++ b/src/components/publish/SinglePublishDoPublish.vue @@ -50,6 +50,7 @@ import { ICategoryConfig } from "~/src/types/ICategoryConfig.ts" import PublishKnowledgeSpace from "~/src/components/publish/form/PublishKnowledgeSpace.vue" import { SiyuanAttr } from "zhi-siyuan-api" import Adaptors from "~/src/adaptors" +import PublishTitle from "~/src/components/publish/form/PublishTitle.vue" const logger = createAppLogger("single-publish-do-publish") @@ -275,6 +276,11 @@ const syncAiSwitch = (val: boolean) => { logger.debug(`syncAiSwitch in single publish => ${formData.useAi}`) } +const syncPublishTitle = (val: string) => { + formData.mergedPost.title = val + logger.debug("syncPublishTitle in single publish") +} + const syncDesc = (val: string) => { formData.mergedPost.shortDesc = val logger.debug("syncDesc in single publish") @@ -396,6 +402,13 @@ onMounted(async () => {
+ @@ -419,11 +432,13 @@ onMounted(async () => { />
-
- - - -
+ {
+ + @@ -457,15 +477,19 @@ onMounted(async () => { v-model:use-ai="formData.useAi" v-model:page-id="id" v-model:tags="formData.mergedPost.mt_keywords" - v-model:content="formData.mergedPost.html" + v-model:md="formData.mergedPost.markdown" + v-model:html="formData.mergedPost.html" @emitSyncTags="syncTags" /> @@ -535,4 +559,7 @@ onMounted(async () => { .top-tip margin-top 10px padding-left 0 +.form-item-tip + padding 2px 4px + margin 0 10px 0 0 diff --git a/src/components/publish/form/CommonCategories.vue b/src/components/publish/form/CommonCategories.vue index 65e28f75..349b846d 100644 --- a/src/components/publish/form/CommonCategories.vue +++ b/src/components/publish/form/CommonCategories.vue @@ -27,11 +27,16 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { useVueI18n } from "~/src/composables/useVueI18n.ts" import { nextTick, reactive, ref } from "vue" +import { watch } from "vue" const logger = createAppLogger("common-categories") const { t } = useVueI18n() const props = defineProps({ + useAi: { + type: Boolean, + default: false, + }, cates: { type: Array, default: [], @@ -41,6 +46,8 @@ const props = defineProps({ // datas const tagRefInput = ref() const formData = reactive({ + isLoading: false, + useAi: props.useAi, cate: { inputValue: "", dynamicCates: (props.cates.length == 0 ? [] : props.cates), @@ -48,6 +55,13 @@ const formData = reactive({ }, }) +watch( + () => props.useAi, + (newValue) => { + formData.useAi = newValue + } +) + const emit = defineEmits(["emitSyncCates"]) const cateMethods = { @@ -71,6 +85,7 @@ const cateMethods = { formData.cate.inputVisible = false formData.cate.inputValue = "" }, + fetchCate: async () => {}, } @@ -100,6 +115,17 @@ const cateMethods = { {{ t("main.cate.new") }} +
+ 推荐的分类 + + + {{ formData.isLoading ? t("main.opt.loading") : t("main.auto.fetch.cate") }} + + + + + +
diff --git a/src/components/publish/form/PublishCategories.vue b/src/components/publish/form/PublishCategories.vue index db74657c..2ec28e9f 100644 --- a/src/components/publish/form/PublishCategories.vue +++ b/src/components/publish/form/PublishCategories.vue @@ -28,10 +28,17 @@ import { CategoryTypeEnum } from "zhi-blog-api" import { reactive, toRaw } from "vue" import { ICategoryConfig, IMultiCategoriesConfig } from "~/src/types/ICategoryConfig.ts" import { createAppLogger } from "~/src/utils/appLogger.ts" +import { useVueI18n } from "~/src/composables/useVueI18n.ts" +import { watch } from "vue" const logger = createAppLogger("publish-categories") +const { t } = useVueI18n() const props = defineProps({ + useAi: { + type: Boolean, + default: false, + }, categoryType: { type: String as () => CategoryTypeEnum, default: CategoryTypeEnum.CategoryType_None, @@ -44,14 +51,33 @@ const props = defineProps({ type: Array, default: [], }, + md: { + type: String, + default: "", + }, + html: { + type: String, + default: "", + }, }) const formData = reactive({ categoryType: props.categoryType, categoryConfig: props.categoryConfig, categories: props.categories, + isLoading: false, + useAi: props.useAi, + md: props.md, + html: props.html, }) +watch( + () => props.useAi, + (newValue) => { + formData.useAi = newValue + } +) + // emits const emit = defineEmits(["emitSyncCates"]) @@ -63,15 +89,40 @@ const syncPubCates = (cates: string[]) => { formData.categories = cates emit("emitSyncCates", cates) } + +const fetchCate = () => {} + + diff --git a/src/components/publish/form/PublishDescription.vue b/src/components/publish/form/PublishDescription.vue index bf413ae2..f70461eb 100644 --- a/src/components/publish/form/PublishDescription.vue +++ b/src/components/publish/form/PublishDescription.vue @@ -46,7 +46,11 @@ const props = defineProps({ type: String, default: "", }, - content: { + md: { + type: String, + default: "", + }, + html: { type: String, default: "", }, @@ -58,7 +62,8 @@ const formData = reactive({ useAi: props.useAi, pageId: props.pageId, desc: props.desc, - html: props.content, + md: props.md, + html: props.html, }) // 对于未强制刷新组件的情况下需要watch或者computed diff --git a/src/components/publish/form/PublishTags.vue b/src/components/publish/form/PublishTags.vue index 5490748f..0ddfdd01 100644 --- a/src/components/publish/form/PublishTags.vue +++ b/src/components/publish/form/PublishTags.vue @@ -46,7 +46,11 @@ const props = defineProps({ type: String, default: "", }, - content: { + md: { + type: String, + default: "", + }, + html: { type: String, default: "", }, @@ -63,7 +67,8 @@ const formData = reactive({ dynamicTags: (StrUtil.isEmptyString(props.tags) ? [] : props.tags.split(",")), inputVisible: false, }, - html: props.content, + md: props.md, + html: props.html, }) watch( diff --git a/src/components/publish/form/PublishTitle.vue b/src/components/publish/form/PublishTitle.vue new file mode 100644 index 00000000..03fbe9b0 --- /dev/null +++ b/src/components/publish/form/PublishTitle.vue @@ -0,0 +1,88 @@ + + + + + + + diff --git a/src/locales/en_US.ts b/src/locales/en_US.ts index 28eda735..4c941e52 100644 --- a/src/locales/en_US.ts +++ b/src/locales/en_US.ts @@ -567,4 +567,8 @@ export default { "preference.setting.removeWidgetTag": "Remove the widget HTML", "pref.setting.ai.proxy.url": "ChatGPT proxy address", "pref.setting.ai.proxy.url.tip": "Can be left blank, note: Filling in the proxy will ignore the ChatGPT request address", + "main.auto.fetch.title": "Auto fetch title", + "main.auto.fetch.cate": "Auto fetch category", + "category.ai.hand": "Due to inconsistent classification systems across platforms, classifications need to be calibrated manually and are not automatically saved", + "category.ai.enabled": "AI is available, please go to the detailed mode to operate", } diff --git a/src/locales/zh_CN.ts b/src/locales/zh_CN.ts index 54792c52..bd184c81 100644 --- a/src/locales/zh_CN.ts +++ b/src/locales/zh_CN.ts @@ -557,4 +557,8 @@ export default { "preference.setting.removeWidgetTag": "去除挂件HTML", "pref.setting.ai.proxy.url": "ChatGPT代理地址", "pref.setting.ai.proxy.url.tip": "可留空,注意:填写了代理会忽略ChatGPT请求地址", + "main.auto.fetch.title": "自动提取标题", + "main.auto.fetch.cate": "自动提取分类", + "category.ai.hand": "由于各平台分类体系不一致,分类需要手动进行校准,不会自动保存", + "category.ai.enabled": "AI可用,请前往详细模式进行操作", }