feat: 打通 HBuilderX CLI 构建 + 修复文章闭环静态盲区

构建:
- 新增 tools/build.js:junction HBuilderX 工具链,CLI 构建 h5/mp-weixin
- vue 指向补丁版 @dcloudio/uni-h5-vue(官方 npm vue 不导出 isInSSRComponentSetup)
- 设 HX_APP_ROOT 避免退化成 H5 空壳产物;产物完整性校验

校验工具:
- 新增 check-cloud-methods.js:acorn 解析云对象方法,比对 94 处调用点
- 新增 check-android-contract.js:Kotlin 侧云对象契约校验
- audit-project.js 修 downloadFile 误报(注释未剥离);tools/ 排除出扫描
- package.json 声明此前隐式依赖的 acorn

功能:
- 补 uni-cms-articles.getPublishedArticles(安卓端依赖但此前不存在)
- 修 u-parse <audio> 引用已移除组件导致 H5 构建失败
This commit is contained in:
2026-09-12 01:02:45 +08:00
parent 4f5893f87a
commit 3117146281
26 changed files with 2043 additions and 337 deletions
+38 -57
View File
@@ -117,11 +117,7 @@
{ text: "三图模式", value: 3 },
])
const thumbnail = reactive([
{ src: "" },
{ src: "" },
{ src: "" },
])
const thumbnail = reactive(["", "", ""])
const pItems = ref([
[
@@ -151,35 +147,35 @@
tags.value = [res.tags]
}
if (cms.category_id) {
category_id.value = cms.category_id
for (let i = 0; i < tags.value[0].length; i++) {
if (cms.category_id && tags.value[0]) {
category_id.value = cms.category_id
for (let i = 0; i < tags.value[0].length; i++) {
if (category_id.value === tags.value[0][i].value) {
tag_index.value = i
break
}
}
} else {
category_id.value = tags.value[0][0].value
tag_index.value = 0
}
} else if (tags.value[0] && tags.value[0].length) {
category_id.value = tags.value[0][0].value
tag_index.value = 0
}
if (cms.thumbnail) {
thumbMode.value = cms.thumbnail.length
if (thumbMode.value === 0) {
thumbnail[0] = { src: "" }
thumbnail[1] = { src: "" }
thumbnail[2] = { src: "" }
thumbnail[0] = ""
thumbnail[1] = ""
thumbnail[2] = ""
thumbMode.value = 0
} else if (thumbMode.value === 1) {
thumbnail[0] = cms.thumbnail[0]
thumbnail[1] = { src: "" }
thumbnail[2] = { src: "" }
thumbnail[0] = typeof cms.thumbnail[0] === 'string' ? cms.thumbnail[0] : (cms.thumbnail[0]?.src || '')
thumbnail[1] = ""
thumbnail[2] = ""
thumbMode.value = 1
} else if (thumbMode.value === 3) {
thumbnail[0] = cms.thumbnail[0]
thumbnail[1] = cms.thumbnail[1]
thumbnail[2] = cms.thumbnail[2]
thumbnail[0] = typeof cms.thumbnail[0] === 'string' ? cms.thumbnail[0] : (cms.thumbnail[0]?.src || '')
thumbnail[1] = typeof cms.thumbnail[1] === 'string' ? cms.thumbnail[1] : (cms.thumbnail[1]?.src || '')
thumbnail[2] = typeof cms.thumbnail[2] === 'string' ? cms.thumbnail[2] : (cms.thumbnail[2]?.src || '')
thumbMode.value = 3
}
}
@@ -237,7 +233,7 @@
fileID: uploadFileOptionsRes.fileID,
fileURL: uploadFileOptionsRes.fileURL
}
thumbnail[index].src = res2.fileID
thumbnail[index] = res2.fileID
},
fail: (err) => {
console.log("上传失败", err)
@@ -296,8 +292,9 @@
thumb.push(thumbnail[i])
}
}
cms.thumbnail = thumb
cms.thumbnail = thumb.filter(Boolean)
}
uni.setStorageSync("cms", cms)
}
function back() {
@@ -310,48 +307,32 @@
}
function toPreview() {
let flag = true
let cms = uni.getStorageSync("cms")
const cms = uni.getStorageSync("cms") || { cmsLst: [] }
cms.category_id = category_id.value
cms.p_type = p_type.value
if (!cms.p_type) {
uni.showLoading({ title: `兵种不能为空` })
setTimeout(() => uni.hideLoading(), 1000)
flag = false
} else if (!cms.category_id) {
uni.showLoading({ title: `分类不能为空` })
setTimeout(() => uni.hideLoading(), 1000)
flag = false
} else {
if (thumbMode.value === 0) {
cms.thumbnail = []
} else if (thumbMode.value === 1) {
cms.thumbnail = [thumbnail[0]]
} else if (thumbMode.value === 3) {
let thumb = []
for (let i = 0; i < 3; i++) {
if (thumbnail[i]) {
thumb.push(thumbnail[i])
}
}
cms.thumbnail = thumb
}
uni.showToast({ title: '兵种不能为空', icon: 'none' })
return
}
if (!cms.category_id) {
uni.showToast({ title: '分类不能为空', icon: 'none' })
return
}
for (let i = 0; i < cms.thumbnail.length; i++) {
if (cms.thumbnail[i] === "") {
uni.showLoading({ title: `封面图不能为空` })
setTimeout(() => uni.hideLoading(), 1000)
flag = false
}
if (thumbMode.value === 0) {
cms.thumbnail = []
} else if (thumbMode.value === 1) {
cms.thumbnail = thumbnail[0] ? [thumbnail[0]] : []
} else {
cms.thumbnail = thumbnail.slice(0, 3).filter(Boolean)
}
if (thumbMode.value > 0 && cms.thumbnail.length !== thumbMode.value) {
uni.showToast({ title: '封面图不能为空', icon: 'none' })
return
}
uni.setStorageSync("cms", cms)
if (flag) {
uni.navigateTo({ url: "/pages2/editCms/preview" })
}
uni.navigateTo({ url: "/pages2/editCms/preview" })
}
return {