fix: post slug generation not following selected strategy (#6914)

#### What type of PR is this?

/area ui
/kind bug
/milestone 2.20.x

#### What this PR does / why we need it:

修复文章自动生成别名不按照别名生成策略生成的问题。

#### Which issue(s) this PR fixes:

Fixes #6913 

#### Special notes for your reviewer:

需要测试:

1. 分类、标签创建和更新时的别名生成
2. 文章新建时,别名是否按照生成策略生成。

#### Does this PR introduce a user-facing change?

```release-note
修复文章自动生成别名不按照别名生成策略生成的问题。
```
pull/6920/head
Ryan Wang 2024-10-22 14:52:28 +08:00 committed by GitHub
parent 329bcc5748
commit 9ecc8f1d95
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 43 additions and 43 deletions

View File

@ -3,28 +3,20 @@ import { FormType } from "@/types/slug";
import { randomUUID } from "@/utils/id";
import ShortUniqueId from "short-unique-id";
import { slugify } from "transliteration";
import { watch, type Ref } from "vue";
import { computed, watch, type Ref } from "vue";
const uid = new ShortUniqueId();
const Strategy = {
generateByTitle: (value: string) => {
if (!value) return "";
return slugify(value, { trim: true });
},
shortUUID: (value: string) => {
if (!value) return "";
return uid.randomUUID(8);
},
UUID: (value: string) => {
if (!value) return "";
return randomUUID();
},
timestamp: (value: string) => {
if (!value) return "";
return new Date().getTime().toString();
},
type SlugStrategy = (value?: string) => string;
const strategies: Record<string, SlugStrategy> = {
generateByTitle: (value?: string) => slugify(value || "", { trim: true }),
shortUUID: () => uid.randomUUID(8),
UUID: () => randomUUID(),
timestamp: () => new Date().getTime().toString(),
};
const onceList = ["shortUUID", "UUID", "timestamp"];
const onceStrategies = new Set(["shortUUID", "UUID", "timestamp"]);
export default function useSlugify(
source: Ref<string>,
@ -32,35 +24,43 @@ export default function useSlugify(
auto: Ref<boolean>,
formType: FormType
) {
const handleGenerateSlug = (forceUpdate = false, formType: FormType) => {
const globalInfoStore = useGlobalInfoStore();
const mode = globalInfoStore.globalInfo?.postSlugGenerationStrategy;
if (!mode) {
const currentStrategy = computed(
() =>
globalInfoStore.globalInfo?.postSlugGenerationStrategy ||
"generateByTitle"
);
const generateSlug = (value: string): string => {
const strategy =
formType === FormType.POST
? strategies[currentStrategy.value]
: strategies.generateByTitle;
return strategy(value);
};
const handleGenerateSlug = (forceUpdate = false) => {
if (
!forceUpdate &&
onceStrategies.has(currentStrategy.value) &&
target.value
) {
return;
}
if (formType != FormType.POST) {
target.value = Strategy["generateByTitle"](source.value);
return;
}
if (forceUpdate) {
target.value = Strategy[mode](source.value);
return;
}
if (onceList.includes(mode) && target.value) return;
target.value = Strategy[mode](source.value);
target.value = generateSlug(source.value);
};
watch(
() => source.value,
source,
() => {
if (auto.value) {
handleGenerateSlug(false, formType);
handleGenerateSlug(true);
}
},
{
immediate: true,
}
{ immediate: true }
);
return {

View File

@ -318,7 +318,7 @@ const { handleGenerateSlug } = useSlugify(
$t('core.page.settings.fields.slug.refresh_message')
"
class="group flex h-full cursor-pointer items-center border-l px-3 transition-all hover:bg-gray-100"
@click="handleGenerateSlug(true, FormType.SINGLE_PAGE)"
@click="handleGenerateSlug(true)"
>
<IconRefreshLine
class="h-4 w-4 text-gray-500 group-hover:text-gray-700"

View File

@ -238,7 +238,7 @@ const { handleGenerateSlug } = useSlugify(
)
"
class="group flex h-full cursor-pointer items-center border-l px-3 transition-all hover:bg-gray-100"
@click="handleGenerateSlug(true, FormType.CATEGORY)"
@click="handleGenerateSlug(true)"
>
<IconRefreshLine
class="h-4 w-4 text-gray-500 group-hover:text-gray-700"

View File

@ -331,7 +331,7 @@ const showCancelPublishButton = computed(() => {
$t('core.post.settings.fields.slug.refresh_message')
"
class="group flex h-full cursor-pointer items-center border-l px-3 transition-all hover:bg-gray-100"
@click="handleGenerateSlug(true, FormType.POST)"
@click="handleGenerateSlug(true)"
>
<IconRefreshLine
class="h-4 w-4 text-gray-500 group-hover:text-gray-700"

View File

@ -208,7 +208,7 @@ const { handleGenerateSlug } = useSlugify(
)
"
class="group flex h-full cursor-pointer items-center border-l px-3 transition-all hover:bg-gray-100"
@click="handleGenerateSlug(true, FormType.TAG)"
@click="handleGenerateSlug(true)"
>
<IconRefreshLine
class="h-4 w-4 text-gray-500 group-hover:text-gray-700"

View File

@ -114,7 +114,7 @@ const publishTimeHelp = computed(() => {
<div
v-tooltip="$t('core.post.settings.fields.slug.refresh_message')"
class="group flex h-full cursor-pointer items-center border-l px-3 transition-all hover:bg-gray-100"
@click="handleGenerateSlug(true, FormType.POST)"
@click="handleGenerateSlug(true)"
>
<IconRefreshLine
class="h-4 w-4 text-gray-500 group-hover:text-gray-700"