|
|
const fs = require('fs')
|
|
|
const path = require('path')
|
|
|
const TE = require('./lib/art-template.js');
|
|
|
|
|
|
// 标准语法的界定符规则
|
|
|
TE.defaults.openTag = '{@'
|
|
|
TE.defaults.closeTag = '@}'
|
|
|
|
|
|
const success = {
|
|
|
success: true
|
|
|
}
|
|
|
const fail = {
|
|
|
success: false
|
|
|
}
|
|
|
|
|
|
async function translateTCB(_fileList = []) {
|
|
|
if (!_fileList.length) return _fileList
|
|
|
// 腾讯云和阿里云下载链接不同,需要处理一下,阿里云会原样返回
|
|
|
const {
|
|
|
fileList
|
|
|
} = await uniCloud.getTempFileURL({
|
|
|
fileList: _fileList
|
|
|
});
|
|
|
return fileList.map((item, index) => item.tempFileURL ? item.tempFileURL : _fileList[index])
|
|
|
}
|
|
|
|
|
|
function hasValue(value) {
|
|
|
if (typeof value !== 'object') return !!value
|
|
|
if (value instanceof Array) return !!value.length
|
|
|
return !!(value && Object.keys(value).length)
|
|
|
}
|
|
|
|
|
|
module.exports = async function(id) {
|
|
|
if (!id) {
|
|
|
return {
|
|
|
...fail,
|
|
|
code: -1,
|
|
|
errMsg: 'id required'
|
|
|
};
|
|
|
}
|
|
|
|
|
|
// 根据sitemap配置加载页面模板,例如列表页,详情页
|
|
|
let templatePage = fs.readFileSync(path.resolve(__dirname, './template.html'), 'utf8');
|
|
|
if (!templatePage) {
|
|
|
return {
|
|
|
...fail,
|
|
|
code: -2,
|
|
|
errMsg: 'page template no found'
|
|
|
};
|
|
|
}
|
|
|
|
|
|
const db = uniCloud.database()
|
|
|
let dbPublishList
|
|
|
try {
|
|
|
dbPublishList = db.collection('opendb-app-list')
|
|
|
} catch (e) {}
|
|
|
|
|
|
if (!dbPublishList) return fail;
|
|
|
|
|
|
const record = await dbPublishList.where({
|
|
|
_id: id
|
|
|
}).get({
|
|
|
getOne: true
|
|
|
})
|
|
|
|
|
|
if (record && record.data && record.data.length) {
|
|
|
const appInfo = record.data[0]
|
|
|
|
|
|
const defaultOptions = {
|
|
|
hasApp: false,
|
|
|
hasMP: false,
|
|
|
hasH5: false,
|
|
|
hasQuickApp: false
|
|
|
}
|
|
|
|
|
|
defaultOptions.mpNames = {
|
|
|
'mp_weixin': '微信',
|
|
|
'mp_alipay': '支付宝',
|
|
|
'mp_baidu': '百度',
|
|
|
'mp_toutiao': '字节',
|
|
|
'mp_qq': 'QQ',
|
|
|
'mp_dingtalk': '钉钉',
|
|
|
'mp_kuaishou': '快手',
|
|
|
'mp_lark': '飞书',
|
|
|
'mp_jd': '京东'
|
|
|
}
|
|
|
|
|
|
const imageList = [];
|
|
|
['app_android'].forEach(key => {
|
|
|
if (!hasValue(appInfo[key])) return
|
|
|
imageList.push({
|
|
|
key,
|
|
|
urlKey: 'url',
|
|
|
url: appInfo[key].url
|
|
|
})
|
|
|
})
|
|
|
Object.keys(defaultOptions.mpNames).concat('quickapp').forEach(key => {
|
|
|
if (!hasValue(appInfo[key])) return
|
|
|
imageList.push({
|
|
|
key,
|
|
|
urlKey: 'qrcode_url',
|
|
|
url: appInfo[key].qrcode_url
|
|
|
})
|
|
|
});
|
|
|
['icon_url'].forEach(key => {
|
|
|
if (!hasValue(appInfo[key])) return
|
|
|
imageList.push({
|
|
|
key,
|
|
|
url: appInfo[key]
|
|
|
})
|
|
|
})
|
|
|
const filelist = await translateTCB(imageList.map(item => item.url))
|
|
|
imageList.forEach((item, index) => {
|
|
|
if (item.urlKey) {
|
|
|
appInfo[item.key][item.urlKey] = filelist[index]
|
|
|
} else {
|
|
|
appInfo[item.key] = filelist[index]
|
|
|
}
|
|
|
})
|
|
|
if (hasValue(appInfo.screenshot)) {
|
|
|
appInfo.screenshot = await translateTCB(appInfo.screenshot)
|
|
|
}
|
|
|
|
|
|
{
|
|
|
const appInfoKeys = Object.keys(appInfo)
|
|
|
if (appInfoKeys.some(key => {
|
|
|
return key.indexOf('app_') !== -1 && hasValue(appInfo[key])
|
|
|
})) {
|
|
|
defaultOptions.hasApp = true
|
|
|
}
|
|
|
if (appInfoKeys.some(key => {
|
|
|
return key.indexOf('mp') !== -1 && hasValue(appInfo[key])
|
|
|
})) {
|
|
|
defaultOptions.hasMP = true
|
|
|
}
|
|
|
if (appInfo.h5 && appInfo.h5.url) {
|
|
|
defaultOptions.hasH5 = true
|
|
|
}
|
|
|
if (appInfo.quickapp && appInfo.quickapp.qrcode_url) {
|
|
|
defaultOptions.hasQuickApp = true
|
|
|
}
|
|
|
|
|
|
// app
|
|
|
if (defaultOptions.hasApp && appInfo.app_android && appInfo.app_android.url) {
|
|
|
defaultOptions.android_url = appInfo.app_android.url
|
|
|
} else {
|
|
|
defaultOptions.android_url = ''
|
|
|
}
|
|
|
if (defaultOptions.hasApp && appInfo.app_ios && appInfo.app_ios.url) {
|
|
|
defaultOptions.ios_url = appInfo.app_ios.url
|
|
|
} else {
|
|
|
defaultOptions.ios_url = ''
|
|
|
}
|
|
|
|
|
|
// mp
|
|
|
defaultOptions.mpKeys = Object.keys(appInfo).filter(key => {
|
|
|
return key.indexOf('mp') !== -1 && hasValue(appInfo[key])
|
|
|
})
|
|
|
}
|
|
|
|
|
|
const html = TE.render(templatePage)(Object.assign({}, appInfo, defaultOptions));
|
|
|
|
|
|
if (!(defaultOptions.hasApp || defaultOptions.hasH5 || defaultOptions.hasMP || defaultOptions
|
|
|
.hasQuickApp)) {
|
|
|
return {
|
|
|
...fail,
|
|
|
code: -100,
|
|
|
errMsg: '缺少应用信息,App、小程序、H5、快应用请至少填写一项'
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
...success,
|
|
|
mpserverlessComposedResponse: true, // 使用阿里云返回集成响应是需要此字段为true
|
|
|
statusCode: 200,
|
|
|
headers: {
|
|
|
'content-type': 'text/html'
|
|
|
},
|
|
|
body: html
|
|
|
};
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
...fail,
|
|
|
code: -3,
|
|
|
errMsg: 'no record'
|
|
|
};
|
|
|
}
|