feat(P1-1本地/P2-1): beforeUpdate草稿转发布合并旧文档fail-closed / es.json ASCII安全西语(备份.zcode/bak)

This commit is contained in:
2026-09-13 07:12:29 +08:00
parent 25307a755e
commit 39d69108f7
2 changed files with 426 additions and 408 deletions
@@ -184,6 +184,24 @@ module.exports = {
// 如果是草稿,不检测
if (updateData.article_status !== 1) return
// P1-1 草稿转发布合并旧文档:仅带 article_status=1 而无内容字段时,
// 直接审 updateData 会审空漏过。读库合并标题/摘要/正文/封面后再审。
// 读库失败则拒绝放行(fail-closed),避免静默漏审。
let auditSrc = updateData;
const hasContentField = updateData.title !== undefined || updateData.excerpt !== undefined ||
updateData.content !== undefined || updateData.cmsLst !== undefined || updateData.thumbnail !== undefined;
if (updateData.article_status === 1 && !hasContentField) {
let oldDoc = null;
try {
const found = await db.collection(articleDBName).doc(id).get();
oldDoc = found && found.data && found.data[0];
} catch (e) {
throw new Error("发布审核需读取原文失败,请重试");
}
if (!oldDoc) throw new Error("发布审核需读取原文失败,请重试");
auditSrc = Object.assign({}, oldDoc, updateData);
}
// 检测内容安全开关
const allowCheckContent = checkContentSecurityEnable('content')
const allowCheckImage = checkContentSecurityEnable('image')
@@ -192,20 +210,20 @@ module.exports = {
const parallel = []
// 检测标题
if (allowCheckContent && updateData.title) {
parallel.push(checkContentSec(updateData.title, clientInfo.requestId, '标题存在敏感字,请修改后提交'))
if (allowCheckContent && auditSrc.title) {
parallel.push(checkContentSec(auditSrc.title, clientInfo.requestId, '标题存在敏感字,请修改后提交'))
}
// 检测摘要
if (allowCheckContent && updateData.excerpt) {
parallel.push(checkContentSec(updateData.excerpt, clientInfo.requestId, '摘要存在敏感字,请修改后提交'))
if (allowCheckContent && auditSrc.excerpt) {
parallel.push(checkContentSec(auditSrc.excerpt, clientInfo.requestId, '摘要存在敏感字,请修改后提交'))
}
// 检测内容:兼容标准 Delta 与移动端 cmsLst
const text = contentText(updateData.content, updateData.cmsLst)
const text = contentText(auditSrc.content, auditSrc.cmsLst)
if (allowCheckContent && text) {
parallel.push(checkContentSec(text, clientInfo.requestId, '内容存在敏感字,请修改后提交'))
}
// 检测封面、正文图片和视频封面
const images = [...(Array.isArray(updateData.thumbnail) ? updateData.thumbnail : []), ...contentImages(updateData.content, updateData.cmsLst)]
const images = [...(Array.isArray(auditSrc.thumbnail) ? auditSrc.thumbnail : []), ...contentImages(auditSrc.content, auditSrc.cmsLst)]
if (allowCheckImage && images.length) {
parallel.push(checkImageSec(images, clientInfo.requestId, '图片存在违规,请修改后提交'))
}
@@ -1,5 +1,5 @@
{
"uni-pagination.prevText": "anterior",
"uni-pagination.nextText": "prxima",
"uni-pagination.piecePerPage": "Art¨ªculo/P¨¢gina"
"uni-pagination.nextText": "siguiente",
"uni-pagination.piecePerPage": "elementos/pagina"
}