Commit e451828d by 钟乾明

u: 兼容轻应用

parent a47484d9
Showing with 1613 additions and 502 deletions
{ {
"name": "城投项目动态", "name": "城投大运营",
"identifier": "com.cnd.jffc.testbaobiao", "identifier": "com.cnd.jffc.cityinvestment",
"build": 90, "build": 90,
"version": "1.0.90", "version": "1.0.90",
"releaseNote": "湖滨取消强拆" "releaseNote": "湖滨取消强拆"
......
...@@ -10,7 +10,10 @@ npm install ...@@ -10,7 +10,10 @@ npm install
npm run dev npm run dev
# build for production with minification # build for production with minification
npm run build npm run build:test // 打包美信云测试环境
npm run build:prod// 打包美信云正式环境
npm run build:test:qing // 打包云之家测试环境
npm run build:prod:qing // 打包云之家正式环境
# build for production and view the bundle analyzer report # build for production and view the bundle analyzer report
npm run build --report npm run build --report
......
// see http://vuejs-templates.github.io/webpack for documentation. // see http://vuejs-templates.github.io/webpack for documentation.
var path = require('path') var path = require('path')
const appConfFileMap = {
prod: 'CubeModule-prod.json',
test: 'CubeModule-test.json',
}
module.exports = { module.exports = {
build: { build: {
env: require('./prod.env'), env: require('./prod.env'),
...@@ -8,6 +11,7 @@ module.exports = { ...@@ -8,6 +11,7 @@ module.exports = {
assetsRoot: path.resolve(__dirname, '../../dist'), assetsRoot: path.resolve(__dirname, '../../dist'),
assetsSubDirectory: 'static', assetsSubDirectory: 'static',
assetsPublicPath: '/', assetsPublicPath: '/',
// assetsPublicPath: process.env.PACK_PLATFORM === 'qing' ? "/jffc-fe-newfkdyy" : '',
productionSourceMap: false, productionSourceMap: false,
appConfFile: 'CubeModule.json', appConfFile: 'CubeModule.json',
eslint: false, eslint: false,
...@@ -35,7 +39,20 @@ module.exports = { ...@@ -35,7 +39,20 @@ module.exports = {
autoOpenBrowser: false, autoOpenBrowser: false,
assetsSubDirectory: 'static', assetsSubDirectory: 'static',
assetsPublicPath: '', assetsPublicPath: '',
proxyTable: {}, proxyTable: {
'/mas/proxy': {
target: 'https://staging.jffctest.com/', // 测试
// target: 'https://portal.cndrealty.com/', // 生产
secure: false, // 如果是https接口,需要配置这个参数
changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
},
'/mas-api/proxy': {
// target: 'https://mxytest.cndrealty.com:4433/', // 测试
target: 'https://jffcvp.cndrealty.com:4433/', // 生产
secure: false, //
changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
},
},
appConfFile: 'CubeModule.json', appConfFile: 'CubeModule.json',
eslint: false, eslint: false,
autoRoutes: false, autoRoutes: false,
......
...@@ -85,7 +85,7 @@ var baseWebpackConfig = { ...@@ -85,7 +85,7 @@ var baseWebpackConfig = {
'~lib':resolve('src/libraries'), '~lib':resolve('src/libraries'),
'~com': resolve('src/shared/components'), '~com': resolve('src/shared/components'),
'~config' : resolve('src/shared/config'), '~config' : resolve('src/shared/config'),
'~proj' : resolve('src/projectDynamic'), '~proj' : resolve('src/projectOfCityInvestment'),
'configuration': resolve(process.env.PACK_ENV === 'prod' 'configuration': resolve(process.env.PACK_ENV === 'prod'
? './src/shared/config/prod' ? './src/shared/config/prod'
: './src/shared/config/test') : './src/shared/config/test')
...@@ -101,7 +101,7 @@ var baseWebpackConfig = { ...@@ -101,7 +101,7 @@ var baseWebpackConfig = {
{ {
test: /\.js$/, test: /\.js$/,
loader: 'babel-loader', loader: 'babel-loader',
include: [resolve('src/shared'), resolve('src/libraries'), resolve('src/projectDynamic'), resolve('test')], include: [resolve('src/shared'), resolve('src/libraries'), resolve('src/projectOfCityInvestment'), resolve('test')],
exclude: /(node_modules|router\.js)/ exclude: /(node_modules|router\.js)/
}, },
{ {
......
...@@ -33,7 +33,8 @@ var webpackConfig = merge(baseWebpackConfig, { ...@@ -33,7 +33,8 @@ var webpackConfig = merge(baseWebpackConfig, {
// http://vuejs.github.io/vue-loader/en/workflow/production.html // http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env': env, 'process.env': env,
'process.env.PACK_ENV': JSON.stringify(process.env.PACK_ENV) 'process.env.PACK_ENV': JSON.stringify(process.env.PACK_ENV),
'process.env.PACK_PLATFORM': JSON.stringify(process.env.PACK_PLATFORM),
}), }),
new webpack.optimize.UglifyJsPlugin({ new webpack.optimize.UglifyJsPlugin({
compress: { compress: {
......
.common-config:
only:
refs:
- test
- uat
- master
.test-common-config:
extends: .common-config
only:
refs:
- test
environment:
name: test
url: 'https://bpmtest.cndrealty.com/jffc-fe-newfkdyy/'
variables:
IMG_STASH: 'harbor.jffctest.com/test-fangkai'
IMG_NAME: 'fe-jffc-newfkdyy'
DEPLOYMENT_PATH: 'test/jffc-new-fkdyy/deployment.yaml'
K8S_APP_NAME: 'test-fangkai-jffc-newfkdyy-frontend'
K8S_WORKSPACE_ID: '39'
K8S_WORKSPACE_NAME: 'test-fangkai-frontend'
.prod-common-config:
extends: .common-config
only:
refs:
- master
environment:
name: prod
url: 'https://bpm.cndrealty.com/jffc-fe-newfkdyy/'
variables:
IMG_STASH: 'harbor.cndrealty.com/prod-fangkai'
IMG_NAME: 'fe-jffc-newfkdyy'
DEPLOYMENT_PATH: 'prod/jffc-new-fkdyy/deployment.yaml'
K8S_APP_NAME: 'prod-fangkai-jffc-newfkdyy-frontend'
K8S_WORKSPACE_ID: '96'
K8S_WORKSPACE_NAME: 'prod-fangkai-jffc-fkdyy-frontend'
image:
name: node:14.18.1
stages:
# 依赖安装
- install
# 构建
- build
# 构建并推送镜像
- image-update
# 更新deploy配置文件
- deploy-config-update
# 部署
- deploy
cache:
key: $CI_COMMIT_REF_NAME
paths:
- node_modules
# test jobs
test_install:
extends: .test-common-config
stage: install
script: npm install
test_build:
extends: .test-common-config
stage: build
script: npm run build:test:qing
dependencies:
- test_install
artifacts:
name: $CI_PROJECT_NAME-$CI_COMMIT_REF_NAME
expire_in: 180 day
paths:
- dist/
test_image-update:
extends: .test-common-config
image: docker:stable
services:
- docker:24.0.7-dind
dependencies:
- test_build
stage: image-update
script:
- echo "打包docker镜像并上传至harbor"
- IMAGE_TAG=$(date +%Y%m%d_%H%M)
- echo "$IMAGE_TAG" >> vars.env
- docker login $IMG_STASH -u $HARBOR_USER -p $HARBOR_PASS
- docker build -f deploy/Dockerfile -t $IMG_STASH/$IMG_NAME:$IMAGE_TAG .
- docker push $IMG_STASH/$IMG_NAME:$IMAGE_TAG
- docker rmi $IMG_STASH/$IMG_NAME:$IMAGE_TAG
- echo "镜像($IMG_STASH/$IMG_NAME:$IMAGE_TAG)成功上传至harbor ---->成功"
artifacts:
expire_in: 30 mins
paths:
- vars.env
test_deploy-config-update:
extends: .test-common-config
stage: deploy-config-update
script:
- echo "更改k8s deploy配置文件的image版本号"
- IMAGE_TAG=$(cat vars.env)
- git config --global user.name "gitlab-ci"
- git config --global user.email "gitlab-ci@xxx.com"
- git clone "http://${GIT_USER}:${GIT_PASS}@gitlab.cndrealty.com/fe/k8s-deploy-config.git"
- cd ./k8s-deploy-config
- grep 'harbor' $DEPLOYMENT_PATH
- sed -i "s#${IMG_STASH}.*#${IMG_STASH}/${IMG_NAME}:${IMAGE_TAG}#g" $DEPLOYMENT_PATH
- git add . && git commit -m "update image: ${DEPLOYMENT_PATH}"
- git push "http://${GIT_USER}:${GIT_PASS}@gitlab.cndrealty.com/fe/k8s-deploy-config.git"
- echo "更改k8s deploy配置文件的image版本号---->成功"
test_deploy:
extends: .test-common-config
stage: deploy
script:
- echo "请求执行 gitops 同步操作"
- SYNC_RES_HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" -X POST -H "Content-Type:application/json" -H "Authorization:Bearer ${K8S_TOKEN}" -d "{\"workspaceId\":\"${K8S_WORKSPACE_ID}\",\"name\":\"${K8S_APP_NAME}\",\"dryRun\":false,\"prune\":false,\"applyOnly\":false,\"force\":false,\"revision\":\"master\",\"syncPolicy\":{\"options\":{\"skipSchemaValidate\":false,\"replace\":false,\"pruneLast\":false,\"applyOutOfSyncOnly\":false,\"respectIgnoreDifferences\":false,\"prunePropagationPolicy\":\"Background\"}},\"resources\":[{\"group\":\"apps\",\"name\":\"${K8S_APP_NAME}\",\"kind\":\"Deployment\",\"namespace\":\"${K8S_WORKSPACE_NAME}\"}]}" https://k8s-dev.jffctest.com/apis/gitops.amamba.io/v1alpha1/workspaces/${K8S_WORKSPACE_ID}/applications/${K8S_APP_NAME}:sync)
- if [ "$SYNC_RES_HTTP_CODE" != "200" ]; then echo -e "\e[31m k8s gitOpt 同步异常,${SYNC_RES_HTTP_CODE} \e[0m"; exit 1; fi;
- echo "同步操作---->成功"
#prod jobs
prod_install:
extends: .prod-common-config
stage: install
script: npm install
prod_build:
extends: .prod-common-config
stage: build
script: npm run build:prod:qing
dependencies:
- prod_install
artifacts:
name: $CI_PROJECT_NAME-$CI_COMMIT_REF_NAME
expire_in: 365 day
paths:
- dist/
prod_image-update:
extends: .prod-common-config
image: docker:stable
services:
- docker:24.0.7-dind
dependencies:
- prod_build
stage: image-update
script:
- echo "打包docker镜像并上传至harbor"
- IMAGE_TAG=$(date +%Y%m%d_%H%M)
- echo "$IMAGE_TAG" >> vars.env
- docker login $IMG_STASH -u $HARBOR_USER -p $HARBOR_PASS
- docker build -f deploy/Dockerfile -t $IMG_STASH/$IMG_NAME:$IMAGE_TAG .
- docker push $IMG_STASH/$IMG_NAME:$IMAGE_TAG
- docker rmi $IMG_STASH/$IMG_NAME:$IMAGE_TAG
- echo "镜像($IMG_STASH/$IMG_NAME:$IMAGE_TAG)成功上传至harbor ---->成功"
artifacts:
expire_in: 30 mins
paths:
- vars.env
prod_deploy-config-update:
extends: .prod-common-config
stage: deploy-config-update
script:
- echo "更改k8s deploy配置文件的image版本号"
- IMAGE_TAG=$(cat vars.env)
- git config --global user.name "gitlab-ci"
- git config --global user.email "gitlab-ci@xxx.com"
- git clone "http://${GIT_USER}:${GIT_PASS}@gitlab.cndrealty.com/fe/k8s-deploy-config.git"
- cd ./k8s-deploy-config
- grep 'harbor' $DEPLOYMENT_PATH
- sed -i "s#${IMG_STASH}.*#${IMG_STASH}/${IMG_NAME}:${IMAGE_TAG}#g" $DEPLOYMENT_PATH
- git add . && git commit -m "update image: ${DEPLOYMENT_PATH}"
- git push "http://${GIT_USER}:${GIT_PASS}@gitlab.cndrealty.com/fe/k8s-deploy-config.git"
- echo "更改k8s deploy配置文件的image版本号---->成功"
FROM harbor.cndrealty.com/bmp-front/nginx:1.25.5
WORKDIR /app/
COPY dist ./
COPY deploy/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
server {
listen 80;
server_name localhost;
# 静态资源重写地址 去掉/jffc-fe-fkdyy目录
location ^~ /jffc-fe-newfkdyy {
rewrite ^/jffc-fe-newfkdyy/(.*)$ /$1 last;
}
location / {
# 配置页面不缓存html和htm结尾的文件
if ($request_filename ~* .*\.(?:htm|html)$) {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
expires off;
}
root /app/;
index index.html index.htm;
# try_files $uri $uri/ /index.html; # history模式防止重刷新返回404
}
}
\ No newline at end of file
...@@ -2,10 +2,50 @@ ...@@ -2,10 +2,50 @@
<html lang="zh-CN"> <html lang="zh-CN">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>jf-citySheet</title> <title>城投大运营</title>
<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<meta name="format-detection" content="telephone=no"/> <meta name="format-detection" content="telephone=no"/>
<script src="miniapp://common/js/qing/qing.js"></script> <script>
console.log('开始引入库>>');
const ua = window.navigator.userAgent.toLocaleLowerCase();
if (ua.indexOf('qing') > -1) {
console.log('ua qing>>')
if (ua.indexOf('miniapp') > -1) {
console.log('ua 云之家小程序>>')
document.write('<scr' + 'ipt src="miniapp://common/js/qing/qing.js"></scr' + 'ipt>');
sessionStorage.setItem('runClientEnv', 'miniapp');
} else {
console.log('轻应用>>');
document.write('<scr' + 'ipt src="https://portal.cndrealty.com/public/js/qing/latest/qing.js"></scr' + 'ipt>');
// 轻应用从url上取ticket
let urlParamStr = location.href.split('?')[ 1 ] || '';
urlParamStr = urlParamStr.split('/')[ 0 ] || ''; // 截止/。用于去除尾部 /
urlParamStr = urlParamStr.split('#')[ 0 ] || ''; // 截止#。用于去除尾部 #
const urlParams = new URLSearchParams(((location.href.split('?')[ 1 ] || '').split('/')[ 0 ] || '').split('#')[ 0 ]);
// 从url上取ticket 存至全局
sessionStorage.setItem('ticket', urlParams.get('ticket') || '');
sessionStorage.setItem('runClientEnv', 'qing');
const testFlags = ['test', 'localhost', '192.168'];// 测试环境的url标志
if (testFlags.some(flag => location.origin.includes(flag))) {
sessionStorage.setItem('env', 'test');
} else {
sessionStorage.setItem('env', 'prod');
}
}
}
</script>
<script>
console.log('window.qing 已经引入>>',window.qing)
window.qing && window.qing.ready(() => {
// 隐藏轻应用自带的标题栏
window.qing && window.qing.call('setWebViewTitleBar', {isShow: false})
// 适配iPhone X底部偏移量
window.qing && window.qing.call('setWebBottomInset', {show: true});
})
</script>
<!-- <script src="https://staging.jffctest.com/public/js/qing/latest/qing.js"></script>--> <!-- <script src="https://staging.jffctest.com/public/js/qing/latest/qing.js"></script>-->
</head> </head>
<body> <body>
......
No preview for this file type
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
"~config/*": [ "~config/*": [
"./src/shared/config/*" "./src/shared/config/*"
] ,"~proj/*": [ ] ,"~proj/*": [
"./src/projectDynamic/*" "./src/projectOfCityInvestment/*"
] ]
} }
} }
......
...@@ -95,6 +95,36 @@ ...@@ -95,6 +95,36 @@
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"dev": true "dev": true
}, },
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"string-width": { "string-width": {
"version": "5.1.2", "version": "5.1.2",
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz",
...@@ -106,6 +136,40 @@ ...@@ -106,6 +136,40 @@
"strip-ansi": "^7.0.1" "strip-ansi": "^7.0.1"
} }
}, },
"string-width-cjs": {
"version": "npm:string-width@4.2.3",
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
}
}
}
},
"strip-ansi": { "strip-ansi": {
"version": "7.1.0", "version": "7.1.0",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz",
...@@ -114,6 +178,68 @@ ...@@ -114,6 +178,68 @@
"requires": { "requires": {
"ansi-regex": "^6.0.1" "ansi-regex": "^6.0.1"
} }
},
"strip-ansi-cjs": {
"version": "npm:strip-ansi@6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
}
}
},
"wrap-ansi-cjs": {
"version": "npm:wrap-ansi@7.0.0",
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
}
},
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
}
}
}
} }
} }
}, },
...@@ -9018,46 +9144,6 @@ ...@@ -9018,46 +9144,6 @@
"strip-ansi": "^3.0.0" "strip-ansi": "^3.0.0"
} }
}, },
"string-width-cjs": {
"version": "npm:string-width@4.2.3",
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
}
}
}
},
"string_decoder": { "string_decoder": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
...@@ -9083,23 +9169,6 @@ ...@@ -9083,23 +9169,6 @@
"ansi-regex": "^2.0.0" "ansi-regex": "^2.0.0"
} }
}, },
"strip-ansi-cjs": {
"version": "npm:strip-ansi@6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
}
}
},
"strip-bom": { "strip-bom": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-2.0.0.tgz", "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-2.0.0.tgz",
...@@ -10893,81 +10962,6 @@ ...@@ -10893,81 +10962,6 @@
} }
} }
}, },
"wrap-ansi-cjs": {
"version": "npm:wrap-ansi@7.0.0",
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
}
},
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
}
}
}
},
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
......
{ {
"name": "jf-operation2", "name": "jf-city-investment",
"version": "1.0.0", "version": "1.0.0",
"description": "建发V+移动开发框架", "description": "建发V+城投大运营",
"author": "zhj701", "author": "zhj701",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "node build/dev-server.js", "dev": "node build/dev-server.js",
"start": "npm run dev", "start": "npm run dev",
"build": "npm run build:test", "build": "npm run build:test",
"build:test": "cross-env PACK_ENV=test node build/build.js", "build:test": "cross-env PACK_ENV=test PACK_PLATFORM=cordova node build/build.js",
"build:prod": "cross-env PACK_ENV=prod node build/build.js", "build:prod": "cross-env PACK_ENV=prod PACK_PLATFORM=cordova node build/build.js",
"build:test:cordova": "cross-env PACK_ENV=test PACK_PLATFORM=cordova node build/build.js",
"build:test:qing": "cross-env PACK_ENV=test PACK_PLATFORM=qing node build/build.js",
"build:prod:cordova": "cross-env PACK_ENV=prod PACK_PLATFORM=cordova node build/build.js",
"build:prod:qing": "cross-env PACK_ENV=prod PACK_PLATFORM=qing node build/build.js",
"build:report": "npm run build --report" "build:report": "npm run build --report"
}, },
"dependencies": { "dependencies": {
......
...@@ -31,8 +31,8 @@ class MAS { ...@@ -31,8 +31,8 @@ class MAS {
*/ */
static get TYPE() { static get TYPE() {
return { return {
PROXY: 'mas-api/proxy?alias=', PROXY:process.env.NODE_ENV === 'development' ? 'mas-api/proxy?alias=' : process.env.PACK_PLATFORM === 'qing' ? 'mas/proxy?alias=' : 'mas-api/proxy?alias=',
RESTFUL: 'mas-api/restful/' RESTFUL:process.env.NODE_ENV === 'development' ? 'mas-api/restful/' : process.env.PACK_PLATFORM === 'qing' ? 'mas/restful/' : 'mas-api/restful/',
} }
} }
......
...@@ -27,7 +27,12 @@ export default class CordovaApi extends NativeApi { ...@@ -27,7 +27,12 @@ export default class CordovaApi extends NativeApi {
if (typeof window !== 'undefined' && typeof window.document !== 'undefined') { if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {
var self = this var self = this
/* if (process.env.PACK_PLATFORM === 'qing') {
window.qing.ready(() => {
self.doReady(self)
})
} else {
console.log('走的这里 cordova>>')
if (!window.document.getElementById('cordovaJS')) { if (!window.document.getElementById('cordovaJS')) {
var script = window.document.createElement('script') var script = window.document.createElement('script')
script.id = 'cordovaJS' script.id = 'cordovaJS'
...@@ -37,6 +42,7 @@ export default class CordovaApi extends NativeApi { ...@@ -37,6 +42,7 @@ export default class CordovaApi extends NativeApi {
script.onload = function () { script.onload = function () {
console.log('Loading Cordova Plugin...') console.log('Loading Cordova Plugin...')
window.document.addEventListener('deviceready', function () { window.document.addEventListener('deviceready', function () {
console.log('cordova 就绪!!!>>')
self.doReady(self) self.doReady(self)
}, false) }, false)
} }
...@@ -45,10 +51,7 @@ export default class CordovaApi extends NativeApi { ...@@ -45,10 +51,7 @@ export default class CordovaApi extends NativeApi {
} }
window.document.body.appendChild(script) window.document.body.appendChild(script)
} }
*/ }
qing.ready(() => {
self.doReady(self)
})
} }
} }
......
...@@ -4,7 +4,7 @@ import GeoLocation from './modules/geoLocation' ...@@ -4,7 +4,7 @@ import GeoLocation from './modules/geoLocation'
import UserInteraction from './modules/userInteraction' import UserInteraction from './modules/userInteraction'
import Account from './modules/account' import Account from './modules/account'
import Navigator from './modules/navigator' import Navigator from './modules/navigator'
import DataInteraction from './modules/DataInteraction' import DataInteraction from './modules/dataInteraction'
export default function (config) { export default function (config) {
return new CordovaApi(config) return new CordovaApi(config)
......
/** @module extend/common **/ /** @module extend/common **/
import * as types from '../types' import * as types from '../types'
import BaseModel from '../../native/BaseModel' import BaseModel from '../../native/baseModel'
/** /**
* 用户账户 * 用户账户
* @extends BaseModel * @extends BaseModel
......
/** @module extend/common **/ /** @module extend/common **/
import * as types from '../types' import * as types from '../types'
import BaseModel from '../../native/BaseModel' import BaseModel from '../../native/baseModel'
/** /**
* 原生与h5数据交互相关 * 原生与h5数据交互相关
* @extends BaseModel * @extends BaseModel
......
/** @module extend/common **/ /** @module extend/common **/
import * as types from '../types' import * as types from '../types'
import BaseModel from '../../native/BaseModel' import BaseModel from '../../native/baseModel'
/** /**
* 地图定位导航相关接口 * 地图定位导航相关接口
* @extends BaseModel * @extends BaseModel
......
/** @module extend/common **/ /** @module extend/common **/
import * as types from '../types' import * as types from '../types'
import BaseModel from '../../native/BaseModel' import BaseModel from '../../native/baseModel'
/** /**
* 应用导航器 * 应用导航器
* @extends BaseModel * @extends BaseModel
......
/** @module extend/common **/ /** @module extend/common **/
import * as types from '../types' import * as types from '../types'
import BaseModel from '../../native/BaseModel' import BaseModel from '../../native/baseModel'
import configJson from '../../../../../../CubeModule.json' import configJsonProd from '../../../../../../CubeModule-prod.json'
import configJsonTest from '../../../../../../CubeModule-test.json'
/** /**
* 系统通用接口 * 系统通用接口
...@@ -218,6 +219,7 @@ export default class System extends BaseModel { ...@@ -218,6 +219,7 @@ export default class System extends BaseModel {
* @result # * @result #
*/ */
uploadUserData (valParams) { uploadUserData (valParams) {
const configJson = process.env.PACK_ENV === 'test' ? configJsonTest : configJsonProd
let tmpParams = Object.assign({ let tmpParams = Object.assign({
identifier:configJson.identifier, identifier:configJson.identifier,
widget_name:configJson.name, widget_name:configJson.name,
......
/** @module extend/common **/ /** @module extend/common **/
import * as types from '../types' import * as types from '../types'
import BaseModel from '../../native/BaseModel' import BaseModel from '../../native/baseModel'
/** /**
* 用户交互相关 * 用户交互相关
* @extends BaseModel * @extends BaseModel
......
;(function (global) { (function (global) {
var qing = global.qing if (process.env.PACK_PLATFORM === 'qing') {
var qing = global.qing;
var appMap = { var appMap = {
'com.cnd.jffc.tyypt': process.env.PACK_ENV === 'test' ? '500000155' : '', 'com.cnd.jffc.newSalesDynamic': process.env.PACK_ENV === "prod" ? '500000266' : '500000227',//项目销售档案(项目销售动态)
} 'com.cnd.jffc.newMarketing': process.env.PACK_ENV === "prod" ? '500000264' : '500000226'//营销看板(营销日报)
}
console.log('appMap>>',appMap) let urlMap = {
"com.cnd.jffc.newSalesDynamic":
process.env.PACK_ENV === "prod"
? "https://bpm.cndrealty.com/jffc-fe-newxsdt?isNavHidden=1"
: "https://bpmtest.cndrealty.com/jffc-fe-newxsdt?isNavHidden=1",
"com.cnd.jffc.newMarketing":
process.env.PACK_ENV === "prod"
? "https://bpm.cndrealty.com/jffc-fe-newyxkb?isNavHidden=1&appType=v2"
: "https://bpmtest.cndrealty.com/jffc-fe-newyxkb?isNavHidden=1&appType=v2",
};
function isObject(value) { function isObject(value) {
return value !== null && typeof value === 'object' return value !== null && typeof value === "object";
} }
var qingPromise = function (fnName, params) { var qingPromise = function (fnName, params) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
var originSuccess = params.success var originSuccess = params.success;
var originError = params.error var originError = params.error;
var opt = Object.assign(params, { var opt = Object.assign(params, {
success: function (res) { success: function (res) {
if (originSuccess) { if (originSuccess) {
originSuccess(res) originSuccess(res);
} }
resolve(res) resolve(res);
}, },
error: function (e) { error: function (e) {
if (originError) { if (originError) {
originError(e) originError(e);
}
reject(e)
}
})
qing.call(fnName, opt)
})
} }
reject(e);
},
});
qing.call(fnName, opt);
});
};
// 根据“工号”查询【工号、eid、orgId】等信息 // 根据“工号”查询【工号、eid、orgId】等信息
function getPersonInfosByJobNo(jobNos) { function getPersonInfosByJobNo(jobNos) {
const origin = {
test: "https://staging.jffctest.com",
prod: "https://portal.cndrealty.com",
}[ window.sessionStorage.getItem("env") ];
var opt = { var opt = {
url: '/gateway/xmjf-other-service/person/role/query/jobNo', url: `${
serializer: 'form', origin ? origin : ""
method: 'POST', }/gateway/xmjf-other-service/person/role/query/jobNo`,
serializer: "form",
method: "POST",
headers: { headers: {
'Content-Type': 'application/x-www-form-urlencoded', "Content-Type": "application/x-www-form-urlencoded",
'Cloudoffice-Version': 'v0.0.1' "Cloudoffice-Version": "v0.0.1",
}, },
data: { data: {
jobNos: jobNos.join(',') jobNos: jobNos.join(","),
} },
} };
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
opt.success = function (result) { opt.success = function (result) {
var success = (result || {}).success || false var success = (result || {}).success || false;
var data = (result || {}).data || [] var data = (result || {}).data || [];
if (String(success).toLowerCase() !== 'true' || data.length === 0) { if (String(success).toLowerCase() !== "true" || data.length === 0) {
reject(result.error || '获取人员信息失败!') reject(result.error || "获取人员信息失败!");
return return;
} }
resolve(result.data) resolve(result.data);
} };
opt.error = function (e) { opt.error = function (e) {
reject(e) reject(e);
} };
qing.call('request', opt) qing.call("request", opt);
}) });
} }
// 根据openId查询【工号、eid、orgId】等信息 // 根据openId查询【工号、eid、orgId】等信息
function getPersonInfosByoIds(oIds) { function getPersonInfosByoIds(oIds) {
const origin = {
test: "https://staging.jffctest.com",
prod: "https://portal.cndrealty.com",
}[ window.sessionStorage.getItem("env") ];
var opt = { var opt = {
url: '/gateway/xmjf-other-service/person/role/query/oId', url: `${
serializer: 'form', origin ? origin : ""
method: 'POST', }/gateway/xmjf-other-service/person/role/query/oId`,
serializer: "form",
method: "POST",
headers: { headers: {
'Content-Type': 'application/x-www-form-urlencoded', "Content-Type": "application/x-www-form-urlencoded",
'Cloudoffice-Version': 'v0.0.1' "Cloudoffice-Version": "v0.0.1",
}, },
data: { data: {
oIds: oIds.join(',') oIds: oIds.join(","),
} },
} };
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
opt.success = function (result) { opt.success = function (result) {
var success = (result || {}).success var success = (result || {}).success;
var data = (result || {}).data || [] var data = (result || {}).data || [];
if (String(success).toLowerCase() !== 'true' || data.length === 0) { if (String(success).toLowerCase() !== "true" || data.length === 0) {
reject(result.error || '获取人员信息失败!') reject(result.error || "获取人员信息失败!");
return return;
} }
resolve(result.data) resolve(result.data);
} };
opt.error = function (e) { opt.error = function (e) {
reject(e) reject(e);
} };
qing.call('request', opt) qing.call("request", opt);
}) });
} }
// 通过qingjs选人 // 通过qingjs选人
function selectPersonByQing(selected, isMulti) { function selectPersonByQing(selected, isMulti) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
qing.call('selectPersons', { qing.call("selectPersons", {
isMulti: isMulti, isMulti: isMulti,
selected: selected, selected: selected,
success: function (result) { success: function (result) {
var success = (result || {}).success || false var success = (result || {}).success || false;
var persons = ((result || {}).data || {}).persons || [] var persons = ((result || {}).data || {}).persons || [];
if ( if (
String(success).toLowerCase() !== 'true' || String(success).toLowerCase() !== "true" ||
persons.length === 0 persons.length === 0
) { ) {
reject(result.error || '请选择人员后再提交') reject(result.error || "请选择人员后再提交");
return return;
}
resolve(persons)
} }
}) resolve(persons);
}) },
});
});
} }
// 将人员信息转化成美信的 // 将人员信息转化成美信的
function formatData2Mx(persons) { function formatData2Mx(persons) {
// openId和人员的映射关系 // openId和人员的映射关系
var personMap = {} var personMap = {};
var openIds = persons.map(function (p) { var openIds = persons.map(function (p) {
// 将云之家的人员字段与美信的人员字段映射起来 // 将云之家的人员字段与美信的人员字段映射起来
p.telephonenumber = p.phone p.telephonenumber = p.phone;
p.cn = p.name p.cn = p.name;
p.positionname = p.jobTitle p.positionname = p.jobTitle;
p.mobile = p.phone p.mobile = p.phone;
// 创建缓存,方便后续根据openId查询人员信息 // 创建缓存,方便后续根据openId查询人员信息
var openId = p.openId var openId = p.openId;
personMap[openId] = p personMap[ openId ] = p;
return openId return openId;
}) });
return getPersonInfosByoIds(openIds).then(function (ids) { return getPersonInfosByoIds(openIds).then(function (ids) {
var persons = ids.map(function (personIds) { var persons = ids.map(function (personIds) {
var openId = personIds.oId var openId = personIds.oId;
var jobNo = personIds.jobNo var jobNo = personIds.jobNo;
// 从缓存里面查询对应人员 // 从缓存里面查询对应人员
var p = personMap[openId] var p = personMap[ openId ];
// 更新工号 // 更新工号
p.uid = jobNo p.uid = jobNo;
p.jobNo = jobNo p.jobNo = jobNo;
return p return p;
}) });
return persons return persons;
}) });
} }
// 选人 // 选人
function selectPersons(selected, isMulti, successFn, failFn) { function selectPersons(selected, isMulti, successFn, failFn) {
// 将传入的工号转为openId // 将传入的工号转为openId
var selectedPromise = Promise.resolve([]) var selectedPromise = Promise.resolve([]);
if (selected && selected.length) { if (selected && selected.length) {
selectedPromise = getPersonInfosByJobNo(selected) selectedPromise = getPersonInfosByJobNo(selected);
} }
// 根据openId选人 // 根据openId选人
selectedPromise selectedPromise.then(function (persons) {
.then(function (persons) {
var oIds = persons.map(function (p) { var oIds = persons.map(function (p) {
return p.oId return p.oId;
}) });
return selectPersonByQing(oIds, isMulti) return selectPersonByQing(oIds, isMulti);
}) }).then(function (persons) {
.then(function (persons) {
// 格式化选人信息 // 格式化选人信息
return formatData2Mx(persons) return formatData2Mx(persons);
}) }).then(function (persons) {
.then(function (persons) {
successFn({ successFn({
result: true, result: true,
array: persons array: persons,
}) });
}) }).catch(function () {
.catch(function () {
failFn({ failFn({
result: false, result: false,
array: [] array: [],
}) });
}) });
} }
// 获取当前用户信息 // 获取当前用户信息
function getCurrentUserInfo(callback) { function getCurrentUserInfo(callback) {
const origin = {
test: "https://staging.jffctest.com",
prod: "https://portal.cndrealty.com",
}[ window.sessionStorage.getItem("env") ];
var opt = { var opt = {
url: '/gateway/xmjf-other-service/person/role/save/person', url: `${
method: 'POST', origin ? origin : ""
}/gateway/xmjf-other-service/person/role/save/person`,
method: "POST",
headers: { headers: {
'Cloudoffice-Version': 'v0.0.1' "Cloudoffice-Version": "v0.0.1",
}, },
data: {}, data: {},
success: callback success: callback,
} };
qing.call('request', opt) qing.call("request", opt);
} }
function openAppWithData(appName, data, url) { function openAppWithData(appName, data, url, is2Light) {
var val = '' console.log("openAppWithData 实参 2025年4月9日 20:50:41>>", {appName, data, url, is2Light});
var val = "";
if (isObject(data)) { if (isObject(data)) {
data = JSON.stringify(data) data = JSON.stringify(data);
// 针对json数据格式化来的字符串添加特殊标识,方便后续还原 // 针对json数据格式化来的字符串添加特殊标识,方便后续还原
data = '__json__=' + data data = "__json__=" + data;
} }
if (typeof data === 'string') { if (typeof data === "string") {
// IOS有个奇葩的设计,把双引号转单引号输出了,所以需要将单引号,双引号在保存前特殊处理,然后再还原。 // IOS有个奇葩的设计,把双引号转单引号输出了,所以需要将单引号,双引号在保存前特殊处理,然后再还原。
val = data.replace(/'/gm, '∆∆').replace(/"/gm, 'åå') val = data.replace(/'/gm, "∆∆").replace(/"/gm, "åå");
} }
val = encodeURIComponent(val) val = encodeURIComponent(val);
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
qing.call('storage.setItem', { qing.call("storage.setItem", {
shared: true, shared: true,
key: appName, key: appName,
value: val, value: val,
success: function (res) { success: function (res) {
if (String(res.success).toLowerCase() === 'true') { if (String(res.success).toLowerCase() === "true") {
qing.call('gotoLightApp', { const opt = {
urlParam: url urlParam: url,
}) };
resolve(true) if (is2Light) {
opt.appId = appMap[ appName ];
}
qing.call("gotoLightApp", opt);
resolve(true);
} else { } else {
reject(res.error) reject(res.error);
} }
}, },
error: function (e) { error: function (e) {
reject(e) reject(e);
} },
}) });
}) });
} }
var handlers = { var handlers = {
MIDEACOMMON: { MIDEACOMMON: {
launchExternalAPPByThird: function (params, successFn, failFn) { launchExternalAPPByThird: function (params, successFn, failFn) {
params = params || [] params = params || [];
if (!params.length) { if (!params.length) {
failFn('未检测到要打开应用的包名!') failFn("未检测到要打开应用的包名!");
return return;
} }
let scheme = params[0] let scheme = params[ 0 ];
const urlParams = params[ 1 ];
if (!scheme) { if (!scheme) {
failFn('未检测到要打开应用的包名!') failFn("未检测到要打开应用的包名!");
return return;
} }
// 针对scheme可能丢失尾部的://的情况进行追加 // 针对scheme可能丢失尾部的://的情况进行追加
scheme = `${scheme}://` scheme = `${scheme}://`;
scheme = scheme.replace('://://', '://') scheme = scheme.replace("://://", "://");
qing.call('gotoApp', { qing.call("gotoApp", {
data: `${scheme}p?`, data: `${scheme}p?${urlParams}`,
success: function (result) { success: function (result) {
const success = (result || {}).success || false const success = (result || {}).success || false;
if (`${success}`.toLowerCase() === 'true') { if (`${success}`.toLowerCase() === "true") {
successFn(true) successFn(true);
} else { } else {
failFn('打开应用失败!') failFn("打开应用失败!");
} }
}, },
error: function () { error: function () {
failFn('打开应用失败!') failFn("打开应用失败!");
} },
}) });
}, },
setBounces: function (p, successFn, failFn) { setBounces: function (p, successFn, failFn) {
p = p || [0] p = p || [0];
var enable = p[0] var enable = p[ 0 ];
var map = { var map = {
'0': 0, 0: 0,
'1': 1 1: 1,
} };
qing.call('setBounce', { qing.call("setBounce", {
enable: map[`${enable}`] || 0 enable: map[ `${enable}` ] || 0,
}) });
successFn('success') successFn("success");
}, },
exit: function (p, successFn, failFn) { exit: function (p, successFn, failFn) {
qing.call('closeWebView') qing.call("closeWebView");
successFn('success') successFn("success");
}, },
openSysBrowser: function (urls, successFn, failFn) { openSysBrowser: function (urls, successFn, failFn) {
var u = urls || [] var u = urls || [];
if (!u.length) { if (!u.length) {
failFn('未检测到要打开的url!') failFn("未检测到要打开的url!");
return return;
} }
qing.call('localFunction', { qing.call("localFunction", {
name: 'openExtBrowser', name: "openExtBrowser",
param: { param: {
url: u[0] url: u[ 0 ],
}, },
success: successFn success: successFn,
}) });
}, },
language: function (param, successFn, failFn) { language: function (param, successFn, failFn) {
var lang = 'zh-CN' var lang = "zh-CN";
var result = navigator.userAgent.match(/(;|^)\s*lang\s*:([^;]*)/) var result = navigator.userAgent.match(/(;|^)\s*lang\s*:([^;]*)/);
if (result && result.length === 3) { if (result && result.length === 3) {
lang = result[2] lang = result[ 2 ];
} }
// 只取后面的国家代码 // 只取后面的国家代码
lang = lang.replace(/^[a-z]+\-/i, '') lang = lang.replace(/^[a-z]+\-/i, "");
successFn({ successFn({
language: lang.toLowerCase() language: lang.toLowerCase(),
}) });
}, },
vcard: function (uids, successFn, failFn) { vcard: function (uids, successFn, failFn) {
var jobNos = uids || [] var jobNos = uids || [];
if (!jobNos.length) { if (!jobNos.length) {
failFn('未检测到要打开人员的openId!') failFn("未检测到要打开人员的openId!");
return return;
} }
// 通过工号获取openId,然后用openId打开人员详情页面。 // 通过工号获取openId,然后用openId打开人员详情页面。
getPersonInfosByJobNo(jobNos) getPersonInfosByJobNo(jobNos).then(function (personInfos) {
.then(function (personInfos) {
// 打开人员卡片只有一条信息 // 打开人员卡片只有一条信息
qing.call('personInfo', { qing.call("personInfo", {
openId: personInfos[0].oId openId: personInfos[ 0 ].oId,
}) });
successFn(true) successFn(true);
}) }).catch(function (e) {
.catch(function (e) { failFn(e);
failFn(e) });
})
}, },
openUrl: function (params, successFn, failFn) { openUrl: function (params, successFn, failFn) {
// params的第一个参数是要打开的url // params的第一个参数是要打开的url
var url = (params || [])[0] var url = (params || [])[ 0 ];
// 第二个参数是打开url的参数 // 第二个参数是打开url的参数
var _p = (params || [])[1] || {} var _p = (params || [])[ 1 ] || {};
if (!url) { if (!url) {
failFn('未检测到要打开的url!') failFn("未检测到要打开的url!");
return return;
} }
// 注册页面关闭的回调事件。 // 注册页面关闭的回调事件。
if (_p.H5CallBackFunction) { if (_p.H5CallBackFunction) {
var fnName = _p.H5CallBackFunction.replace('()', '') var fnName = _p.H5CallBackFunction.replace("()", "");
var fn = window[fnName] var fn = window[ fnName ];
if (fn && (typeof fn === 'function')) { if (fn && typeof fn === "function") {
qing.on('appear', function () { qing.on("appear", function () {
fn() fn();
}) });
} }
} }
qing.call('gotoLightApp', { qing.call("gotoLightApp", {
urlParam: url urlParam: url,
}) });
}, },
showWidget: function (params, successFn, failFn) { showWidget: function (params, successFn, failFn) {
if (!Array.isArray(params) || !params[0]) { console.log("showWidget is run 2025年4月9日 20:50:12>>>", {params, successFn, failFn});
failFn('未检测到要打开的应用地址!') if (!Array.isArray(params) || !params[ 0 ]) {
return failFn("未检测到要打开的应用地址!");
} return;
var appName = params[0] }
var appId = appMap[appName] var appName = params[ 0 ];
console.log('appName>>',appName) var appId = appMap[ appName ];
console.log('appMap>>',appMap) console.log("showWidget--2025年4月9日 20:50:27>>", {appMap, appName, appId});
if (!appId) { if (!appId) {
failFn('未检测到要打开的应用!') failFn("未检测到要打开的应用!");
return return;
} }
var data = params[1] || '' var data = params[ 1 ] || "";
let is2Light = true// params[2] || true;
var url = is2Light
? urlMap[ appName ]
: "cloudhub://miniapp?appid=" + appId + "&path=index.html";
console.log('key唯一>>', encodeURIComponent(appName) + appMap[ params[ 0 ] ])
openAppWithData( openAppWithData(
encodeURIComponent(appName), encodeURIComponent(appName) + appMap[ params[ 0 ] ],
data, data,
'cloudhub://miniapp?appid=' + appId + '&path=index.html' url,
).then(successFn, failFn) is2Light
).then(successFn, failFn);
}, },
getExtra: function (params, successFn, failFn) { getExtra: function (params, successFn, failFn) {
if (Array.isArray(params)) { if (Array.isArray(params)) {
var appName = params[0] var appName = params[ 0 ];
if (appName) { if (appName) {
qing.call('storage.getItem', { qing.call("storage.getItem", {
key: encodeURIComponent(appName), key: encodeURIComponent(appName) + appMap[ params[ 0 ] ],
shared: true, shared: true,
success: function (res) { success: function (res) {
if (String(res.success).toLowerCase() === 'true') { if (String(res.success).toLowerCase() === "true") {
try { try {
var data = (res.data || {}).value || '' var data = (res.data || {}).value || "";
data = decodeURIComponent(data) data = decodeURIComponent(data);
if (data) { if (data) {
// IOS有个奇葩的设计,把双引号转单引号输出了,所以需要将单引号,双引号在保存前特殊处理,然后再还原。 // IOS有个奇葩的设计,把双引号转单引号输出了,所以需要将单引号,双引号在保存前特殊处理,然后再还原。
data = data.replace(/∆∆/gm, "'").replace(/åå/gm, '"') data = data.replace(/∆∆/gm, "'").replace(/åå/gm, '"');
// 将json数据反编译回object // 将json数据反编译回object
if (data.indexOf('__json__=') === 0) { if (data.indexOf("__json__=") === 0) {
data = data.replace(/^__json__=/, '') data = data.replace(/^__json__=/, "");
data = JSON.parse(data) data = JSON.parse(data);
} }
successFn({ successFn({
result: true, result: true,
msg: '成功', msg: "成功",
widgetId: appName, widgetId: appName,
extra: { extra: {
showWidgetKey: data showWidgetKey: data,
} },
}) });
} else { } else {
successFn({}) successFn({});
} }
} catch (error) { } catch (error) {
console.error('getExtra error:', error) console.error("getExtra error:", error);
failFn() failFn();
} }
} else { } else {
failFn() failFn();
} }
} },
}) });
} else { } else {
failFn() failFn();
} }
} else { } else {
failFn() failFn();
}
} }
}, },
},
MIDEAUSER: { MIDEAUSER: {
orgChoose: function (p, successFn, failFn) { orgChoose: function (p, successFn, failFn) {
selectPersons([], false, successFn, failFn) selectPersons([], false, successFn, failFn);
}, },
orgMuChoose: function (selected, successFn, failFn) { orgMuChoose: function (selected, successFn, failFn) {
selectPersons(selected, true, successFn, failFn) selectPersons(selected, true, successFn, failFn);
}, },
getUser: function (param, successFn, failFn) { getUser: function (param, successFn, failFn) {
getCurrentUserInfo(function (result) { getCurrentUserInfo(function (result) {
var success = (result || {}).success var success = (result || {}).success;
var error = (result || {}).error var error = (result || {}).error;
var data = (result || {}).data || {} var data = (result || {}).data || {};
if (String(success).toLowerCase() !== 'true') { console.log("user result:", result);
failFn(error) if (String(success).toLowerCase() !== "true") {
return failFn(error);
} return;
var userInfo = data.userInfo || {} }
var userInfo = data.userInfo || {};
successFn({ successFn({
uid: userInfo.username, uid: userInfo.username,
email: userInfo.email, email: userInfo.email,
...@@ -437,22 +471,23 @@ ...@@ -437,22 +471,23 @@
cn: userInfo.name, cn: userInfo.name,
gender: userInfo.gender, gender: userInfo.gender,
mobile: userInfo.email, mobile: userInfo.email,
fullDeptName: userInfo.fullDeptName.replace('!', '_'), fullDeptName:
userInfo.fullDeptName && userInfo.fullDeptName.replace("!", "_"),
departmentName: userInfo.deptName, departmentName: userInfo.deptName,
ssoToken: data.ssoToken ssoToken: data.ssoToken,
}) });
}) });
}, },
getUserPassword: function (param, successFn, failFn) { getUserPassword: function (param, successFn, failFn) {
successFn({}) successFn({});
} },
}, },
MIDEAPDF: { MIDEAPDF: {
showTxt: function (param, successFn, failFn) { showTxt: function (param, successFn, failFn) {
var p = param || {} var p = param || {};
if (!p.url) { if (!p.url) {
failFn('未检测到要打开文件的url!') failFn("未检测到要打开文件的url!");
return return;
} }
/* /*
var ext = ''; var ext = '';
...@@ -468,50 +503,49 @@ ...@@ -468,50 +503,49 @@
fileDownloadUrl: param.url, fileDownloadUrl: param.url,
success: successFn, success: successFn,
fail: failFn, fail: failFn,
error: failFn error: failFn,
} };
if (param.title) { if (param.title) {
qingParam.fileName = param.title qingParam.fileName = param.title;
} }
qing.call('showFile', qingParam) qing.call("showFile", qingParam);
}, },
showPdf: function (urls, successFn, failFn) { showPdf: function (urls, successFn, failFn) {
var u = urls || [] var u = urls || [];
if (!u.length) { if (!u.length) {
failFn('未检测到要打开文件的url!') failFn("未检测到要打开文件的url!");
return return;
} }
qing.call('showFile', { qing.call("showFile", {
fileDownloadUrl: u[0], fileDownloadUrl: u[ 0 ],
success: successFn, success: successFn,
fail: failFn, fail: failFn,
error: failFn error: failFn,
}) });
}, },
showRAR: function () { showRAR: function () {},
} },
} };
}
global.cordova = { global.cordova = {
exec: function (successFn, failFn, module, method, params) { exec: function (successFn, failFn, module, method, params) {
params = params || [] params = params || [];
console.warn('cordova-module:' + module + ', method:' + method) console.warn("cordova-module:" + module + ", method:" + method);
var modules = handlers[module.toUpperCase()] var modules = handlers[ module.toUpperCase() ];
if (!modules) { if (!modules) {
console.error('请求的模块' + module + '未注册!') console.error("请求的模块" + module + "未注册!");
failFn('请求的模块' + module + '未注册!') failFn("请求的模块" + module + "未注册!");
return return;
} }
var handler = modules[method] var handler = modules[ method ];
if (!handler) { if (!handler) {
console.error('未在' + module + '模块找到' + method + '方法的实现!') console.error("未在" + module + "模块找到" + method + "方法的实现!");
// 当桥不存在的时候,不阻断业务让流程还可以正常走。 // 当桥不存在的时候,不阻断业务让流程还可以正常走。
successFn({}) successFn({});
return return;
}
handler(params, successFn, failFn)
}
} }
handler(params, successFn, failFn);
},
};
// var CAMERA = { // var CAMERA = {
// PictureSourceType: { // PictureSourceType: {
...@@ -523,24 +557,24 @@ ...@@ -523,24 +557,24 @@
global.navigator.camera = { global.navigator.camera = {
getPicture: function (successFn, failFn, params) { getPicture: function (successFn, failFn, params) {
var sourceType = params.sourceType || 1 var sourceType = params.sourceType || 1;
var opt = { var opt = {
type: sourceType === 1 ? 'camera' : 'photo' type: sourceType === 1 ? "camera" : "photo",
} };
qingPromise('selectPic', opt) qingPromise("selectPic", opt).then(function (result) {
.then(function (result) { var success = (result || {}).success || false;
var success = (result || {}).success || false var data = (result || {}).data || {};
var data = (result || {}).data || {} var error = (result || {}).error || "获取图片信息失败!";
var error = (result || {}).error || '获取图片信息失败!' if (String(success).toLowerCase() === "true") {
if (String(success).toLowerCase() === 'true') { successFn(data.fileData);
successFn(data.fileData)
} else { } else {
failFn(error) failFn(error);
}
})
.catch(function (e) {
failFn(e)
})
} }
}).catch(function (e) {
failFn(e);
});
},
};
} }
})(window)
})(window);
;(function (global) {
if (process.env.PACK_PLATFORM === 'qing') {
var qing = global.qing
var appMap = {
'com.cnd.jffc.newSalesDynamic': process.env.PACK_ENV === "prod" ? '500000089' : '500000227',//项目销售档案(项目销售动态)
'com.cnd.jffc.newMarketing': process.env.PACK_ENV === "prod" ? '500000090' : '500000226'//营销看板(营销日报)
}
function isObject(value) {
return value !== null && typeof value === 'object'
}
var qingPromise = function (fnName, params) {
return new Promise(function (resolve, reject) {
var originSuccess = params.success
var originError = params.error
var opt = Object.assign(params, {
success: function (res) {
if (originSuccess) {
originSuccess(res)
}
resolve(res)
},
error: function (e) {
if (originError) {
originError(e)
}
reject(e)
}
})
qing.call(fnName, opt)
})
}
// 根据“工号”查询【工号、eid、orgId】等信息
function getPersonInfosByJobNo(jobNos) {
const origin = ({
test: 'https://staging.jffctest.com',
prod: 'https://portal.cndrealty.com'
})[window.sessionStorage.getItem('env')]
var opt = {
url: `${origin ? origin : ''}/gateway/xmjf-other-service/person/role/query/jobNo`,
serializer: 'form',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Cloudoffice-Version': 'v0.0.1'
},
data: {
jobNos: jobNos.join(',')
}
}
return new Promise(function (resolve, reject) {
opt.success = function (result) {
var success = (result || {}).success || false
var data = (result || {}).data || []
if (String(success).toLowerCase() !== 'true' || data.length === 0) {
reject(result.error || '获取人员信息失败!')
return
}
resolve(result.data)
}
opt.error = function (e) {
reject(e)
}
qing.call('request', opt)
})
}
// 根据openId查询【工号、eid、orgId】等信息
function getPersonInfosByoIds(oIds) {
const origin = ({
test: 'https://staging.jffctest.com',
prod: 'https://portal.cndrealty.com'
})[window.sessionStorage.getItem('env')]
var opt = {
url: `${origin ? origin : ''}/gateway/xmjf-other-service/person/role/query/oId`,
serializer: 'form',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Cloudoffice-Version': 'v0.0.1'
},
data: {
oIds: oIds.join(',')
}
}
return new Promise(function (resolve, reject) {
opt.success = function (result) {
var success = (result || {}).success
var data = (result || {}).data || []
if (String(success).toLowerCase() !== 'true' || data.length === 0) {
reject(result.error || '获取人员信息失败!')
return
}
resolve(result.data)
}
opt.error = function (e) {
reject(e)
}
qing.call('request', opt)
})
}
// 通过qingjs选人
function selectPersonByQing(selected, isMulti) {
return new Promise(function (resolve, reject) {
qing.call('selectPersons', {
isMulti: isMulti,
selected: selected,
success: function (result) {
var success = (result || {}).success || false
var persons = ((result || {}).data || {}).persons || []
if (
String(success).toLowerCase() !== 'true' ||
persons.length === 0
) {
reject(result.error || '请选择人员后再提交')
return
}
resolve(persons)
}
})
})
}
// 将人员信息转化成美信的
function formatData2Mx(persons) {
// openId和人员的映射关系
var personMap = {}
var openIds = persons.map(function (p) {
// 将云之家的人员字段与美信的人员字段映射起来
p.telephonenumber = p.phone
p.cn = p.name
p.positionname = p.jobTitle
p.mobile = p.phone
// 创建缓存,方便后续根据openId查询人员信息
var openId = p.openId
personMap[openId] = p
return openId
})
return getPersonInfosByoIds(openIds).then(function (ids) {
var persons = ids.map(function (personIds) {
var openId = personIds.oId
var jobNo = personIds.jobNo
// 从缓存里面查询对应人员
var p = personMap[openId]
// 更新工号
p.uid = jobNo
p.jobNo = jobNo
return p
})
return persons
})
}
// 选人
function selectPersons(selected, isMulti, successFn, failFn) {
// 将传入的工号转为openId
var selectedPromise = Promise.resolve([])
if (selected && selected.length) {
selectedPromise = getPersonInfosByJobNo(selected)
}
// 根据openId选人
selectedPromise
.then(function (persons) {
var oIds = persons.map(function (p) {
return p.oId
})
return selectPersonByQing(oIds, isMulti)
})
.then(function (persons) {
// 格式化选人信息
return formatData2Mx(persons)
})
.then(function (persons) {
successFn({
result: true,
array: persons
})
})
.catch(function () {
failFn({
result: false,
array: []
})
})
}
// 获取当前用户信息
function getCurrentUserInfo(callback) {
const origin = ({
test: 'https://staging.jffctest.com',
prod: 'https://portal.cndrealty.com'
})[window.sessionStorage.getItem('env')]
var opt = {
url: `${origin ? origin : ''}/gateway/xmjf-other-service/person/role/save/person`,
method: 'POST',
headers: {
'Cloudoffice-Version': 'v0.0.1'
},
data: {},
success: callback
}
qing.call('request', opt)
}
function openAppWithData(appName, data, url) {
var val = ''
if (isObject(data)) {
data = JSON.stringify(data)
// 针对json数据格式化来的字符串添加特殊标识,方便后续还原
data = '__json__=' + data
}
if (typeof data === 'string') {
// IOS有个奇葩的设计,把双引号转单引号输出了,所以需要将单引号,双引号在保存前特殊处理,然后再还原。
val = data.replace(/'/gm, '∆∆').replace(/"/gm, 'åå')
}
val = encodeURIComponent(val)
return new Promise(function (resolve, reject) {
qing.call('storage.setItem', {
shared: true,
key: appName,
value: val,
success: function (res) {
if (String(res.success).toLowerCase() === 'true') {
qing.call('gotoLightApp', {
urlParam: url
})
resolve(true)
} else {
reject(res.error)
}
},
error: function (e) {
reject(e)
}
})
})
}
var handlers = {
MIDEACOMMON: {
launchExternalAPPByThird: function (params, successFn, failFn) {
params = params || []
if (!params.length) {
failFn('未检测到要打开应用的包名!')
return
}
let scheme = params[0]
const urlParams = params[1]
if (!scheme) {
failFn('未检测到要打开应用的包名!')
return
}
// 针对scheme可能丢失尾部的://的情况进行追加
scheme = `${scheme}://`
scheme = scheme.replace('://://', '://')
qing.call('gotoApp', {
data: `${scheme}p?${urlParams}`,
success: function (result) {
const success = (result || {}).success || false
if (`${success}`.toLowerCase() === 'true') {
successFn(true)
} else {
failFn('打开应用失败!')
}
},
error: function () {
failFn('打开应用失败!')
}
})
},
setBounces: function (p, successFn, failFn) {
p = p || [0]
var enable = p[0]
var map = {
'0': 0,
'1': 1
}
qing.call('setBounce', {
enable: map[`${enable}`] || 0
})
successFn('success')
},
exit: function (p, successFn, failFn) {
qing.call('closeWebView')
successFn('success')
},
openSysBrowser: function (urls, successFn, failFn) {
var u = urls || []
if (!u.length) {
failFn('未检测到要打开的url!')
return
}
qing.call('localFunction', {
name: 'openExtBrowser',
param: {
url: u[0]
},
success: successFn
})
},
language: function (param, successFn, failFn) {
var lang = 'zh-CN'
var result = navigator.userAgent.match(/(;|^)\s*lang\s*:([^;]*)/)
if (result && result.length === 3) {
lang = result[2]
}
// 只取后面的国家代码
lang = lang.replace(/^[a-z]+\-/i, '')
successFn({
language: lang.toLowerCase()
})
},
vcard: function (uids, successFn, failFn) {
var jobNos = uids || []
if (!jobNos.length) {
failFn('未检测到要打开人员的openId!')
return
}
// 通过工号获取openId,然后用openId打开人员详情页面。
getPersonInfosByJobNo(jobNos)
.then(function (personInfos) {
// 打开人员卡片只有一条信息
qing.call('personInfo', {
openId: personInfos[0].oId
})
successFn(true)
})
.catch(function (e) {
failFn(e)
})
},
openUrl: function (params, successFn, failFn) {
// params的第一个参数是要打开的url
var url = (params || [])[0]
// 第二个参数是打开url的参数
var _p = (params || [])[1] || {}
if (!url) {
failFn('未检测到要打开的url!')
return
}
// 注册页面关闭的回调事件。
if (_p.H5CallBackFunction) {
var fnName = _p.H5CallBackFunction.replace('()', '')
var fn = window[fnName]
if (fn && (typeof fn === 'function')) {
qing.on('appear', function () {
fn()
})
}
}
qing.call('gotoLightApp', {
urlParam: url
})
},
showWidget: function (params, successFn, failFn) {
console.log('showWidget is run>>>', {params, successFn, failFn})
if (!Array.isArray(params) || !params[0]) {
failFn('未检测到要打开的应用地址!')
return
}
var appName = params[0]
var appId = appMap[appName]
console.log('showWidget-->>', {appMap, appName, appId})
if (!appId) {
failFn('未检测到要打开的应用!')
return
}
var data = params[1] || ''
openAppWithData(
encodeURIComponent(appName),
data,
'cloudhub://miniapp?appid=' + appId + '&path=index.html'
).then(successFn, failFn)
},
getExtra: function (params, successFn, failFn) {
if (Array.isArray(params)) {
var appName = params[0]
if (appName) {
qing.call('storage.getItem', {
key: encodeURIComponent(appName),
shared: true,
success: function (res) {
if (String(res.success).toLowerCase() === 'true') {
try {
var data = (res.data || {}).value || ''
data = decodeURIComponent(data)
if (data) {
// IOS有个奇葩的设计,把双引号转单引号输出了,所以需要将单引号,双引号在保存前特殊处理,然后再还原。
data = data.replace(/∆∆/gm, "'").replace(/åå/gm, '"')
// 将json数据反编译回object
if (data.indexOf('__json__=') === 0) {
data = data.replace(/^__json__=/, '')
data = JSON.parse(data)
}
successFn({
result: true,
msg: '成功',
widgetId: appName,
extra: {
showWidgetKey: data
}
})
} else {
successFn({})
}
} catch (error) {
console.error('getExtra error:', error)
failFn()
}
} else {
failFn()
}
}
})
} else {
failFn()
}
} else {
failFn()
}
}
},
MIDEAUSER: {
orgChoose: function (p, successFn, failFn) {
selectPersons([], false, successFn, failFn)
},
orgMuChoose: function (selected, successFn, failFn) {
selectPersons(selected, true, successFn, failFn)
},
getUser: function (param, successFn, failFn) {
getCurrentUserInfo(function (result) {
var success = (result || {}).success
var error = (result || {}).error
var data = (result || {}).data || {}
console.log('user result:', result);
if (String(success).toLowerCase() !== 'true') {
failFn(error)
return
}
var userInfo = data.userInfo || {}
successFn({
uid: userInfo.username,
email: userInfo.email,
avatar: userInfo.avatar,
cn: userInfo.name,
gender: userInfo.gender,
mobile: userInfo.email,
fullDeptName: userInfo.fullDeptName && userInfo.fullDeptName.replace('!', '_'),
departmentName: userInfo.deptName,
ssoToken: data.ssoToken
})
})
},
getUserPassword: function (param, successFn, failFn) {
successFn({})
}
},
MIDEAPDF: {
showTxt: function (param, successFn, failFn) {
var p = param || {}
if (!p.url) {
failFn('未检测到要打开文件的url!')
return
}
/*
var ext = '';
var extIndex = param.title.lastIndexOf('.');
if (extIndex !== -1) {
var innerExt = param.title.slice(extIndex + 1);
if (innerExt.length > 0 && innerExt.length <=4) {
ext = innerExt;
}
}
*/
var qingParam = {
fileDownloadUrl: param.url,
success: successFn,
fail: failFn,
error: failFn
}
if (param.title) {
qingParam.fileName = param.title
}
qing.call('showFile', qingParam)
},
showPdf: function (urls, successFn, failFn) {
var u = urls || []
if (!u.length) {
failFn('未检测到要打开文件的url!')
return
}
qing.call('showFile', {
fileDownloadUrl: u[0],
success: successFn,
fail: failFn,
error: failFn
})
},
showRAR: function () {
}
}
}
global.cordova = {
exec: function (successFn, failFn, module, method, params) {
params = params || []
console.warn('cordova-module:' + module + ', method:' + method)
var modules = handlers[module.toUpperCase()]
if (!modules) {
console.error('请求的模块' + module + '未注册!')
failFn('请求的模块' + module + '未注册!')
return
}
var handler = modules[method]
if (!handler) {
console.error('未在' + module + '模块找到' + method + '方法的实现!')
// 当桥不存在的时候,不阻断业务让流程还可以正常走。
successFn({})
return
}
handler(params, successFn, failFn)
}
}
// var CAMERA = {
// PictureSourceType: {
// 0: 'photo',
// 1: 'camera',
// 2: 'photo'
// }
// }
global.navigator.camera = {
getPicture: function (successFn, failFn, params) {
var sourceType = params.sourceType || 1
var opt = {
type: sourceType === 1 ? 'camera' : 'photo'
}
qingPromise('selectPic', opt)
.then(function (result) {
var success = (result || {}).success || false
var data = (result || {}).data || {}
var error = (result || {}).error || '获取图片信息失败!'
if (String(success).toLowerCase() === 'true') {
successFn(data.fileData)
} else {
failFn(error)
}
})
.catch(function (e) {
failFn(e)
})
}
}
}
})(window)
import './cordova.js' import './cordova.js'
import './request.js' import './request.js'
const events = {} const events = {}
window.customEvt = { window.customEvt = {
addEventListener: function (name, fn) { addEventListener: function (name, fn) {
console.log('customEvt addEventListener>>', name)
if (!events[name]) { if (!events[name]) {
events[name] = [] events[name] = []
} }
......
import axios from 'axios' // 若有跨域一定要开启
// var originAdapter = axios.defaults.adapter
/*axios.defaults.adapter = function (config) {
return originAdapter(config)
// 区分美信云cordova环境、云之家qing环境
// if(sessionStorage.getItem('runClientEnv') === 'qing') {
// return originAdapter(config)
// }
// if (!/^https?/.test(config.url)) {
// return originAdapter(config)
// }
// return request(config)
var originAdapter = axios.defaults.adapter
// axios.defaults.adapter = function (config) { if (process.env.PACK_PLATFORM === 'qing') {
// if (!/^https?/.test(config.url)) { if (sessionStorage.getItem('runClientEnv') === 'qing') {
// return originAdapter(config) console.log('轻应用request config>>', config)
// } return request(config)
// return request(config) }
// } if (!/^https?/.test(config.url)) {
console.log('is https>>')
return originAdapter(config)
}
console.log('适配器接管axios请求>>', config)
return request(config)
} else {
return originAdapter(config)
}
}*/
function isObject(value) { function isObject(value) {
return value !== null && typeof value === 'object' return value !== null && typeof value === 'object'
...@@ -16,10 +38,15 @@ function isFormData(fd) { ...@@ -16,10 +38,15 @@ function isFormData(fd) {
return Object.prototype.toString.call(fd) === '[object FormData]' return Object.prototype.toString.call(fd) === '[object FormData]'
} }
function isString(str) {
return Object.prototype.toString.call(str) === '[object String]'
}
function formData2obj(fd) { function formData2obj(fd) {
var data = {} var data = {}
for (var p of fd.entries()) { for (var p of fd.entries()) {
data[p[0]] = p[1] data[ p[ 0 ] ] = p[ 1 ]
} }
return data return data
} }
...@@ -29,24 +56,32 @@ function params2object(url) { ...@@ -29,24 +56,32 @@ function params2object(url) {
if (typeof url === 'object') { if (typeof url === 'object') {
return url return url
} else if (typeof url === 'string') { } else if (typeof url === 'string') {
url url.replace(/^.*\?|#.*$/g, '').split('&').forEach((n) => {
.replace(/^.*\?|#.*$/g, '')
.split('&')
.forEach((n) => {
n = n.split('=') n = n.split('=')
if (n.length === 2) { if (n.length === 2) {
params[n[0]] = n[1] params[ n[ 0 ] ] = encodeURIComponent(n[ 1 ])
} }
}) })
} }
return params return params
} }
const replaceMxy = null
function request(opt) { function request(opt) {
console.log('run request>>', opt)
// 设置content-type默认为form,否则MAS网关接口会报错。
var serializer = opt.serializer || 'form'
opt = opt || {} opt = opt || {}
if (!opt.url) { if (!opt.url) {
return Promise.reject('interface url is required!') return Promise.reject('interface url is required!')
} }
console.log('replaceMxy--->>', replaceMxy)
// if (replaceMxy) {
// var sourceDomain = replaceMxy.sourceDomain
// var targetDomain = replaceMxy.targetDomain
// opt.url = opt.url.replace(sourceDomain, targetDomain)
// }
// 默认get请求 // 默认get请求
opt.method = opt.method || 'get' opt.method = opt.method || 'get'
...@@ -60,11 +95,10 @@ function request(opt) { ...@@ -60,11 +95,10 @@ function request(opt) {
opt.url = opt.url.replace(/^\s+|\s+$/g, '') opt.url = opt.url.replace(/^\s+|\s+$/g, '')
// 将params拼接到url中 // 将params拼接到url中
opt.url = opt.url =
opt.url.split('?')[0] + opt.url.split('?')[ 0 ] +
'?' + '?' +
Object.keys(urlParams) Object.keys(urlParams).map((key) => {
.map((key) => { var val = urlParams[ key ]
var val = urlParams[key]
if (isObject(val)) { if (isObject(val)) {
val = JSON.stringify(val) val = JSON.stringify(val)
val = encodeURIComponent(val) val = encodeURIComponent(val)
...@@ -72,18 +106,159 @@ function request(opt) { ...@@ -72,18 +106,159 @@ function request(opt) {
val = encodeURIComponent(val) val = encodeURIComponent(val)
} }
return key + '=' + val return key + '=' + val
}).join('&')
var headers = opt.headers || {}
var contentType = headers[ 'content-type' ] || headers[ 'Content-Type' ] || headers[ 'CONTENT-TYPE' ] || ''
if (contentType.indexOf('application/json') !== -1) {
serializer = 'json'
}
console.log('serializer>>', serializer)
// post非json即是form。
if (opt.method.toLowerCase() === 'post') {
var data = opt.data
if ((serializer === 'form') && isFormData(data)) {
opt.data = formData2obj(data)
} else if (isString(data)) {
if (serializer === 'json') {
try {
opt.data = JSON.parse(data)
} catch (error) {
opt.data = {}
}
} else {
opt.data = params2object(data)
}
}
}
// 处理header
var finalHeaders = {}
// headers字段值必须是字符串型
Object.keys(headers).forEach(function (key) {
var val = headers[ key ]
if (val) {
var type = typeof val
if (type !== 'string') {
val = val + ''
}
// 因content-type可能存在大小写不规范,这里先过滤掉,后面根据serializer统一添加
var _key = key.toLowerCase()
finalHeaders[ _key ] = val
}
})
// 根据serializer统一添加content-type
finalHeaders[ 'content-type' ] = serializer === 'json' ? 'application/json' : 'application/x-www-form-urlencoded'
opt.headers = finalHeaders
console.log('qing 请求配置表opt>>', opt.url, opt)
return new Promise(function (resolve, reject) {
qing.call('request', {
url: opt.url,
method: opt.method,
headers: opt.headers,
header: opt.headers,
data: opt.data || {},
dataType: opt.dataType,
serializer: serializer,
success: function (resp) {
console.log('qing resp响应原始数据>>', opt.url, resp)
// if (opt.url.includes('getOrgTreeList') || opt.url.includes('getAuthedPageList')) {
// console.log('qing request响应原格式数据>>', opt.url, resp)
// }
var response = {
code: resp.success == 'true' ? 200 : 0,
data: {
code: resp.errorCode == '0' ? 200 : resp.errorCode,
data: {...resp.data},
msg: resp.error || '',
success: resp.success === 'true',
},
// data: {...resp.data},
// status: resp.statusCode,
status: resp.success == 'true' ? 200 : 500,
success: resp.success,
headers: resp.header,
config: opt,
request: opt//业务逻辑有用到该字段
}
var validateStatus = response.config.validateStatus
// Note: status is not exposed by XDomainRequest
if (
!response.status ||
!validateStatus ||
validateStatus(response.status)
) {
console.log('执行了 resolve>>', opt.url, response)
resolve(response)
} else {
var error = new Error(
'Request failed with status code ' + response.status
)
error.config = response.config
error.response = response
reject(error)
}
},
error: function (e) {
console.log('request error>>', e)
var error = new Error(JSON.stringify(e))
error.config = opt
console.log('error--request>>', {error});
reject(error)
}
})
}) })
.join('&') }
function request__old(opt) {
opt = opt || {}
if (!opt.url) {
return Promise.reject('interface url is required!')
}
// 默认get请求
opt.method = opt.method || 'get'
// 处理params
var urlParams = opt.params || {}
// 合并url和params字段的数据,如果params字段与url中有重名参数,以params中的为准
urlParams = Object.assign(params2object(opt.url), urlParams)
// 处理url
// url如果包含空格,会在iOS中报错
opt.url = opt.url.replace(/^\s+|\s+$/g, '')
opt.responseURL = opt.url//业务逻辑有用到
// 将params拼接到url中
opt.url =
opt.url.split('?')[ 0 ] +
'?' +
Object.keys(urlParams).map((key) => {
var val = urlParams[ key ]
// if (isObject(val)) {
// val = JSON.stringify(val)
// val = encodeURIComponent(val)
// } else if (/[^\x00-\xff]/.test(val)) {
// val = encodeURIComponent(val)
// }
return key + '=' + val
}).join('&')
// post非json即是form。 // post非json即是form。
if (opt.method.toLowerCase() === 'post') { if (opt.method.toLowerCase() === 'post') {
var data = opt.data var data = opt.data
if (isFormData(data)) { if (isFormData(data)) {
console.log('m1>>', opt.data);
opt.headers = Object.assign(opt.headers || {}, { opt.headers = Object.assign(opt.headers || {}, {
'Content-Type': 'application/x-www-form-urlencoded' 'Content-Type': 'application/x-www-form-urlencoded'
}) })
opt.data = formData2obj(data) opt.data = formData2obj(data)
} else if (isObject(data)) { } else if (isObject(data)) {
console.log('m2>>', opt.data);
opt.headers = Object.assign(opt.headers || {}, {
'Content-Type': 'application/json;charset=UTF-8'
})
} else {
opt.headers = Object.assign(opt.headers || {}, { opt.headers = Object.assign(opt.headers || {}, {
'Content-Type': 'application/json;charset=UTF-8' 'Content-Type': 'application/json;charset=UTF-8'
}) })
...@@ -94,29 +269,46 @@ function request(opt) { ...@@ -94,29 +269,46 @@ function request(opt) {
opt.headers = opt.headers || {} opt.headers = opt.headers || {}
// headers字段值必须是字符串型 // headers字段值必须是字符串型
Object.keys(opt.headers).forEach(function (key) { Object.keys(opt.headers).forEach(function (key) {
var val = opt.headers[key] var val = opt.headers[ key ]
var type = typeof val var type = typeof val
if (type === 'undefined') { if (type === 'undefined') {
delete opt.headers[key] delete opt.headers[ key ]
} else if (type !== 'string') { } else if (type !== 'string') {
opt.headers[key] = val + '' opt.headers[ key ] = val + ''
} }
}) })
console.log('请求配置 opt>>', opt.url, opt)
// if (opt.url.includes('getOrgTreeList') || opt.url.includes('getAuthedPageList')) {
// console.log('请求 opt>>', opt.url, opt)
// }
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
qing.call('request', { qing.call('request', {
url: opt.url, url: opt.url,
method: opt.method, method: opt.method.toUpperCase(),
headers: opt.headers, headers: opt.headers,
header: opt.headers, header: opt.headers,
data: opt.data || {}, data: opt.data || {},
dataType: opt.dataType, dataType: opt.dataType,
success: function (resp) { success: function (resp) {
console.log('qing request响应原格式数据>>', opt.url, resp)
// if (opt.url.includes('getOrgTreeList') || opt.url.includes('getAuthedPageList')) {
// console.log('qing request响应原格式数据>>', opt.url, resp)
// }
var response = { var response = {
data: resp.data, code: resp.success == 'true' ? 200 : 0,
status: resp.statusCode, data: {
code: resp.errorCode == '0' ? 200 : resp.errorCode,
data: {...resp.data},
msg: resp.error || '',
success: resp.success === 'true',
},
// data: {...resp.data},
// status: resp.statusCode,
status: resp.success == 'true' ? 200 : 500,
success: resp.success,
headers: resp.header, headers: resp.header,
config: opt config: opt,
request: opt//业务逻辑有用到该字段
} }
var validateStatus = response.config.validateStatus var validateStatus = response.config.validateStatus
// Note: status is not exposed by XDomainRequest // Note: status is not exposed by XDomainRequest
...@@ -125,6 +317,7 @@ function request(opt) { ...@@ -125,6 +317,7 @@ function request(opt) {
!validateStatus || !validateStatus ||
validateStatus(response.status) validateStatus(response.status)
) { ) {
console.log('执行了 resolve>>', opt.url, response)
resolve(response) resolve(response)
} else { } else {
var error = new Error( var error = new Error(
...@@ -136,8 +329,10 @@ function request(opt) { ...@@ -136,8 +329,10 @@ function request(opt) {
} }
}, },
error: function (e) { error: function (e) {
var error = new Error(e) console.log('request error>>', e)
var error = new Error(JSON.stringify(e))
error.config = opt error.config = opt
console.log('error--request>>', {error});
reject(error) reject(error)
} }
}) })
......
...@@ -24,7 +24,7 @@ export function randomNumber(minNum, maxNum) { ...@@ -24,7 +24,7 @@ export function randomNumber(minNum, maxNum) {
} }
//获取cookie、 //获取cookie、
export function getCookie(name) { export function getCookie_qing(name) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
qing.call('getStorage', { qing.call('getStorage', {
key: name, key: name,
...@@ -57,7 +57,7 @@ export function getCookie(name) { ...@@ -57,7 +57,7 @@ export function getCookie(name) {
} }
//设置cookie,增加到vue实例方便全局调用 //设置cookie,增加到vue实例方便全局调用
export function setCookie(name, value, days) { export function setCookie_qing(name, value, days) {
days = days || 1 days = days || 1
if (days < 0) { if (days < 0) {
return delCookie(name) return delCookie(name)
...@@ -87,10 +87,9 @@ export function setCookie(name, value, days) { ...@@ -87,10 +87,9 @@ export function setCookie(name, value, days) {
} }
//删除cookie //删除cookie
export function delCookie(name) { export function delCookie_qing(name) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
getCookie(name) getCookie(name).then((val) => {
.then((val) => {
if (val === null) { if (val === null) {
resolve() resolve()
return return
...@@ -112,3 +111,33 @@ export function delCookie(name) { ...@@ -112,3 +111,33 @@ export function delCookie(name) {
}) })
}) })
} }
//获取cookie、
export function getCookie_cordova(name) {
var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
if (arr = document.cookie.match(reg))
return (arr[ 2 ]);
else
return null;
}
//设置cookie,增加到vue实例方便全局调用
export function setCookie_cordova(c_name, value, expiredays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + expiredays);
document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
}
//删除cookie
export function delCookie_cordova(name) {
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval = getCookie(name);
if (cval != null)
document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}
export const setCookie = process.env.PACK_PLATFORM === 'qing' ? setCookie_qing : setCookie_cordova
export const getCookie = process.env.PACK_PLATFORM === 'qing' ? getCookie_qing : getCookie_cordova
export const delCookie = process.env.PACK_PLATFORM === 'qing' ? delCookie_qing : delCookie_cordova
const testToken = 'T5542469125211136' // 华南区域:xuhy@cndrealty.com账号 const testToken = 'yzj_97f7215ff22d58013b61d9f47abe7679' // 华南区域:xuhy@cndrealty.com账号
const testUid = '' // 华南区域:xuhy@cndrealty.com账号 const testUid = '' // 华南区域:xuhy@cndrealty.com账号
export const SetToken = function (val) { export const SetToken = function (val) {
let env = process.env.NODE_ENV let env = process.env.NODE_ENV
......
...@@ -8,6 +8,7 @@ import App from './app.vue' ...@@ -8,6 +8,7 @@ import App from './app.vue'
import store from './store' import store from './store'
import plugin from './plugin' import plugin from './plugin'
import routerStore from '../libraries/plugins/RouterStore' import routerStore from '../libraries/plugins/RouterStore'
Vue.use(routerStore, store, router) Vue.use(routerStore, store, router)
Vue.config.debug = process.env.NODE_ENV !== 'production' Vue.config.debug = process.env.NODE_ENV !== 'production'
...@@ -27,7 +28,13 @@ const vm = new Vue({ ...@@ -27,7 +28,13 @@ const vm = new Vue({
App App
} }
}) })
window.qing.ready(async () => { if (process.env.PACK_PLATFORM === 'qing') {
window.qing.ready(async () => {
await SetToken(vm) await SetToken(vm)
vm.$mount('#app') vm.$mount('#app')
}) })
} else {
SetToken(vm)
vm.$mount('#app')
}
...@@ -40,10 +40,20 @@ Vue.use(nativeApi, Object.assign({ ...@@ -40,10 +40,20 @@ Vue.use(nativeApi, Object.assign({
maxRetryTimes: 10, maxRetryTimes: 10,
retrySleepTime: 100 retrySleepTime: 100
})) }))
const baseUrl = let platformMap = {
process.env.PACK_ENV === 'prod' qing: {
? 'https://jffcvp.cndrealty.com:4433' test: 'https://staging.jffctest.com',
: 'https://mxytest.cndrealty.com:4433' prod: 'https://portal.cndrealty.com'
},
cordova: {
test: 'https://mxytest.cndrealty.com:4433',
prod: 'https://jffcvp.cndrealty.com:4433'
}
}
let baseUrl = process.env.NODE_ENV === 'development' ? '' :
process.env.PACK_ENV === 'prod' && process.env.PACK_PLATFORM
? platformMap[ process.env.PACK_PLATFORM ].prod
: platformMap[ process.env.PACK_PLATFORM ].test
Vue.use(mas, { Vue.use(mas, {
baseUrl: baseUrl, baseUrl: baseUrl,
code: 'cndvp-api' code: 'cndvp-api'
......
This diff could not be displayed because it is too large.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment