123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- 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'
- };
- }
|