feat: 将Markdown渲染改为HTML渲染
- CMS相关字段由Markdown改为WYSIWYG,前端做出对应更改 - AssetUrl重写:将CMS地址重写为本地API
This commit is contained in:
@ -3,5 +3,13 @@ import { companyProfileService } from '~~/server/services/cms/companyProfileServ
|
||||
export default defineEventHandler(async (event) => {
|
||||
const locale = getHeader(event, 'x-locale') || 'zh-CN';
|
||||
|
||||
return companyProfileService.getCompanyProfile(locale);
|
||||
const companyProfile = await companyProfileService.getCompanyProfile(locale);
|
||||
|
||||
companyProfile.content = rewriteAssetUrls(
|
||||
companyProfile.content,
|
||||
useRuntimeConfig().public.directus.url,
|
||||
'/api/assets'
|
||||
);
|
||||
|
||||
return companyProfile;
|
||||
});
|
||||
|
||||
@ -3,5 +3,13 @@ import { contactInfoService } from '~~/server/services/cms/contactInfoService';
|
||||
export default defineEventHandler(async (event) => {
|
||||
const locale = getHeader(event, 'x-locale') || 'zh-CN';
|
||||
|
||||
return contactInfoService.getContactInfo(locale);
|
||||
const contactInfo = await contactInfoService.getContactInfo(locale);
|
||||
|
||||
contactInfo.content = rewriteAssetUrls(
|
||||
contactInfo.content,
|
||||
useRuntimeConfig().public.directus.url,
|
||||
'/api/assets'
|
||||
);
|
||||
|
||||
return contactInfo;
|
||||
});
|
||||
|
||||
@ -9,5 +9,13 @@ export default defineEventHandler(async (event) => {
|
||||
});
|
||||
const locale = getHeader(event, 'x-locale') || 'zh-CN';
|
||||
|
||||
return productService.getProductById(id, locale);
|
||||
const product = await productService.getProductById(id, locale);
|
||||
|
||||
product.description = rewriteAssetUrls(
|
||||
product.description,
|
||||
useRuntimeConfig().public.directus.url,
|
||||
'/api/assets'
|
||||
);
|
||||
|
||||
return product;
|
||||
});
|
||||
|
||||
@ -2,5 +2,15 @@ import { questionService } from '~~/server/services/cms/questionService';
|
||||
export default defineEventHandler(async (event) => {
|
||||
const locale = getHeader(event, 'x-locale') || 'zh-CN';
|
||||
|
||||
return questionService.getQuestionList(locale);
|
||||
const questions = await questionService.getQuestionList(locale);
|
||||
|
||||
questions.forEach((question) => {
|
||||
question.content = rewriteAssetUrls(
|
||||
question.content,
|
||||
useRuntimeConfig().public.directus.url,
|
||||
'/api/assets'
|
||||
);
|
||||
});
|
||||
|
||||
return questions;
|
||||
});
|
||||
|
||||
@ -10,5 +10,13 @@ export default defineEventHandler(async (event) => {
|
||||
|
||||
const locale = getHeader(event, 'x-locale') || 'zh-CN';
|
||||
|
||||
return solutionService.getSolutionById(id, locale);
|
||||
const solution = await solutionService.getSolutionById(id, locale);
|
||||
|
||||
solution.content = rewriteAssetUrls(
|
||||
solution.content,
|
||||
useRuntimeConfig().public.directus.url,
|
||||
'/api/assets'
|
||||
);
|
||||
|
||||
return solution;
|
||||
});
|
||||
|
||||
14
server/utils/rewriteAssetUrls.test.ts
Normal file
14
server/utils/rewriteAssetUrls.test.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import { test, expect, describe } from 'vitest';
|
||||
import { rewriteAssetUrls } from './rewriteAssetUrls';
|
||||
|
||||
describe('rewriteAssetUrls', () => {
|
||||
const cmsBase = 'https://cms.example.com';
|
||||
const proxyBase = '/api/assets';
|
||||
const baseHTML =
|
||||
'<img src="https://cms.example.com/assets/rand-om__-uuid-1234" /><a href="https://cms.example.com/assets/rand-om__-uuid-5678">Link</a><video src="https://otherdomain.com/video.mp4"></video>';
|
||||
test('rewrites asset URLs correctly', () => {
|
||||
expect(rewriteAssetUrls(baseHTML, cmsBase, proxyBase)).toBe(
|
||||
'<img src="/api/assets/rand-om__-uuid-1234"><a href="/api/assets/rand-om__-uuid-5678">Link</a><video src="https://otherdomain.com/video.mp4"></video>'
|
||||
);
|
||||
});
|
||||
});
|
||||
36
server/utils/rewriteAssetUrls.ts
Normal file
36
server/utils/rewriteAssetUrls.ts
Normal file
@ -0,0 +1,36 @@
|
||||
import { parseDocument, DomUtils } from 'htmlparser2';
|
||||
import serialize from 'dom-serializer';
|
||||
|
||||
export function rewriteAssetUrls(
|
||||
html: string,
|
||||
cmsBase: string,
|
||||
proxyBase: string
|
||||
) {
|
||||
if (!html) return html;
|
||||
|
||||
const dom = parseDocument(html);
|
||||
|
||||
const elements = DomUtils.findAll(
|
||||
(elem) => elem.type === 'tag',
|
||||
dom.children
|
||||
);
|
||||
|
||||
for (const el of elements) {
|
||||
// img / video / source -> src
|
||||
// a -> href
|
||||
const tag = el.name.toLowerCase();
|
||||
const attr = tag === 'a' ? 'href' : 'src';
|
||||
|
||||
if (!el.attribs || !el.attribs[attr]) continue;
|
||||
|
||||
const url = el.attribs[attr];
|
||||
|
||||
// 替换cmsBase为proxyBase
|
||||
if (url.startsWith(cmsBase)) {
|
||||
const uuid = url.replace(`${cmsBase}/assets/`, '');
|
||||
el.attribs[attr] = `${proxyBase}/${uuid}`;
|
||||
}
|
||||
}
|
||||
|
||||
return serialize(dom);
|
||||
}
|
||||
Reference in New Issue
Block a user