Commit c3a373c3 authored by liwenhong's avatar liwenhong

Merge branch 'master' into lwh/head-distribution

# Conflicts:
#	server/controllers/user.js
#	server/router.js
#	src/pages/Groupmeal/components/PageHeader/config.js
#	src/router/Groupmeal/index.js
parents 7f46b0fe 0e2efed7
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = false
insert_final_newline = false
\ No newline at end of file
...@@ -7,4 +7,3 @@ public ...@@ -7,4 +7,3 @@ public
dist dist
.prettierrc.js .prettierrc.js
.eslintrc.js .eslintrc.js
server/
module.exports = { module.exports = {
root: true, root: true,
env: { env: {
node: true, node: true,
}, },
extends: ['plugin:vue/vue3-essential', 'eslint:recommended', '@vue/prettier'], extends: ["plugin:vue/vue3-essential", "eslint:recommended", "@vue/prettier"],
parserOptions: { parserOptions: {
parser: 'babel-eslint', parser: "babel-eslint",
}, },
rules: { rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
}, "prettier/prettier": "error",
overrides: [ "vue/script-setup-uses-vars": "off",
{ "no-unused-vars": "off",
files: [
'**/__tests__/*.{j,t}s?(x)',
'**/tests/unit/**/*.spec.{j,t}s?(x)',
],
env: {
jest: true,
},
}, },
],
}; };
...@@ -7,7 +7,6 @@ dist ...@@ -7,7 +7,6 @@ dist
# Editor directories and files # Editor directories and files
.idea .idea
.vscode
*.suo *.suo
*.ntvs* *.ntvs*
*.njsproj *.njsproj
......
// https://prettier.io/docs/en/options.html
module.exports = {
printWidth: 150,
tabWidth: 4,
semi: true,
singleQuote: false,
trailingComma: "all",
bracketSpacing: true,
jsxBracketSameLine: false,
htmlWhitespaceSensitivity: "ignore",
endOfLine: "auto",
vueIndentScriptAndStyle: true,
};
{
// 保存自动格式化
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
// For ESLint
"source.fixAll.eslint": true
},
"eslint.validate": [
"vue",
"javascript",
"javascriptreact"
],
// 设置全部语言的默认格式化程序为prettier
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[less]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
module.exports = { module.exports = {
presets: ['@vue/cli-plugin-babel/preset'], presets: ["@vue/cli-plugin-babel/preset"],
}; };
This diff is collapsed.
{ {
"name": "op-management", "name": "op-management",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"main": "app.js", "main": "app.js",
"scripts": { "scripts": {
"dev": "sh ./bin/start.sh development", "dev": "sh ./bin/start.sh development",
"test": "sh ./bin/start.sh test", "test": "sh ./bin/start.sh test",
"prod": "sh ./bin/start.sh production", "prod": "sh ./bin/start.sh production",
"koa": "nodemon app.js", "koa": "nodemon app.js",
"web-dev": "cross-env NODE_ENV=development vue-cli-service serve", "web-dev": "cross-env NODE_ENV=development vue-cli-service serve",
"web-test": "cross-env NODE_ENV=test vue-cli-service build", "web-test": "cross-env NODE_ENV=test vue-cli-service build",
"web-build": "cross-env NODE_ENV=production vue-cli-service build", "web-build": "cross-env NODE_ENV=production vue-cli-service build",
"test:unit": "vue-cli-service test:unit", "web-build-report": "cross-env NODE_ENV=production vue-cli-service build --report",
"lint": "vue-cli-service lint" "test:unit": "vue-cli-service test:unit",
}, "lint": "vue-cli-service lint"
"dependencies": { },
"@types/qr-image": "^3.2.4", "dependencies": {
"axios": "^0.21.1", "axios": "^0.21.1",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"dayjs": "^1.10.6", "dayjs": "^1.10.6",
"element-plus": "^1.0.2-beta.44", "element-plus": "^1.0.2-beta.44",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"json-bigint": "^1.0.0", "json-bigint": "^1.0.0",
"koa": "^2.13.1", "koa": "^2.13.1",
"koa-body": "^4.2.0", "koa-body": "^4.2.0",
"koa-bodyparser": "^4.3.0", "koa-bodyparser": "^4.3.0",
"koa-router": "^10.0.0", "koa-router": "^10.0.0",
"koa-static": "^5.0.0", "koa-static": "^5.0.0",
"koa-views": "^7.0.1", "koa-views": "^7.0.1",
"moment": "^2.29.1", "moment": "^2.29.1",
"qr-image": "^3.2.0", "qr-image": "^3.2.0",
"request": "^2.88.2", "request": "^2.88.2",
"uglifyjs-webpack-plugin": "^2.2.0", "uuid": "^8.3.2",
"uuid": "^8.3.2", "vue": "3.0.11",
"vue": "3.0.11", "vue-router": "^4.0.0-beta.12",
"vue-router": "^4.0.0-beta.12", "vuex": "^4.0.0-beta.4"
"vuex": "^4.0.0-beta.4" },
}, "devDependencies": {
"devDependencies": { "@vue/cli-plugin-babel": "^4.5.6",
"@testing-library/vue": "^6.4.2", "@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-plugin-babel": "^4.5.6", "@vue/cli-service": "^4.5.6",
"@vue/cli-plugin-eslint": "^4.5.6", "@vue/compiler-sfc": "^3.0.0-beta.1",
"@vue/cli-plugin-unit-jest": "^4.5.6", "@vue/eslint-config-prettier": "^6.0.0",
"@vue/cli-service": "^4.5.6", "babel-eslint": "^10.1.0",
"@vue/compiler-sfc": "^3.0.0-beta.1", "cross-env": "^7.0.3",
"@vue/eslint-config-prettier": "^6.0.0", "eslint": "^6.7.2",
"@vue/test-utils": "^2.0.0-alpha.1", "eslint-plugin-prettier": "^3.3.1",
"babel-eslint": "^10.1.0", "eslint-plugin-vue": "^7.17.0",
"babel-jest": "^27.0.6", "less": "^3.0.4",
"cross-env": "^7.0.3", "less-loader": "^5.0.0",
"eslint": "^6.7.2", "lint-staged": "^11.1.2",
"eslint-plugin-prettier": "^3.1.3", "nodemon": "^2.0.7",
"eslint-plugin-vue": "^7.0.0-alpha.0", "pm2": "3.5.1",
"jest": "^27.0.6", "prettier": "^2.2.1"
"less": "^3.0.4", },
"less-loader": "^5.0.0", "browserslist": [
"nodemon": "^2.0.7", "> 1%",
"pm2": "3.5.1", "last 10 versions",
"prettier": "^1.19.1", "not ie <= 8",
"vue3-jest": "^27.0.0-alpha.1" "iOS >= 8",
}, "Android >= 4.1"
"browserslist": [ ],
"> 1%", "license": "YIDIAN",
"last 10 versions", "gitHooks": {
"not ie <= 8", "pre-commit": "lint-staged"
"iOS >= 8", },
"Android >= 4.1" "lint-staged": {
], "src/**/*.{js,vue}": [
"license": "YIDIAN" "eslint --fix"
],
"server/**/*.js": [
"eslint --fix"
]
}
} }
const env = process.env.NODE_ENV || "development"; const env = process.env.NODE_ENV || "development";
const port = process.env.PORT || 8055; const port = process.env.PORT || 8055;
const API_YD_LOGIN = 'http://web-rest.int.yidian-inc.com/api/v1/pandora/auth' const API_YD_LOGIN = "http://web-rest.int.yidian-inc.com/api/v1/pandora/auth";
const PANDORA_URI = { const PANDORA_URI = {
development: "http://pandora.yidian-inc.com", development: "http://pandora.yidian-inc.com",
test: "http://pandora.yidian-inc.com", test: "http://pandora.yidian-inc.com",
production: "http://pandora.yidian-inc.com" production: "http://pandora.yidian-inc.com",
}; };
const API_INTERNAL_URI = { const API_INTERNAL_URI = {
test: "http://bp-dev.ini.yidian-inc.com", test: "http://bp-dev.ini.yidian-inc.com",
development: "http://bp-test.ini.yidian-inc.com", development: "http://bp-test.ini.yidian-inc.com",
production: "http://bp.int.yidian-inc.com" production: "http://bp.int.yidian-inc.com",
}; };
module.exports = { module.exports = {
env: env, env: env,
port: port, port: port,
API_INTERNAL_URI: API_INTERNAL_URI[env], API_INTERNAL_URI: API_INTERNAL_URI[env],
PANDORA_URI: PANDORA_URI[env], PANDORA_URI: PANDORA_URI[env],
GOODS_URI: API_INTERNAL_URI[env], GOODS_URI: API_INTERNAL_URI[env],
GROUPMEAL_URI: API_INTERNAL_URI[env], GROUPMEAL_URI: API_INTERNAL_URI[env],
ACTIVITY_URI: API_INTERNAL_URI[env], ACTIVITY_URI: API_INTERNAL_URI[env],
WITHDRAWAL_URI: API_INTERNAL_URI[env], WITHDRAWAL_URI: API_INTERNAL_URI[env],
API_YD_LOGIN API_YD_LOGIN,
}; };
...@@ -2,183 +2,183 @@ const ACTIVITY_URI = require("../config.js").ACTIVITY_URI; ...@@ -2,183 +2,183 @@ const ACTIVITY_URI = require("../config.js").ACTIVITY_URI;
const req = require("../utils/request").httpReq; const req = require("../utils/request").httpReq;
// 获取商家列表 // 获取商家列表
exports.getBusinessList = async ctx => { exports.getBusinessList = async (ctx) => {
const url = `${ACTIVITY_URI}/goods/background/ota_list`; const url = `${ACTIVITY_URI}/goods/background/ota_list`;
const opts = { const opts = {
url, url,
method: "GET" method: "GET",
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 添加商品 // 添加商品
exports.addGoods = async ctx => { exports.addGoods = async (ctx) => {
const url = `${ACTIVITY_URI}/goods/background/add_goods`; const url = `${ACTIVITY_URI}/goods/background/add_goods`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 商品库列表 // 商品库列表
exports.pindanGoods = async ctx => { exports.pindanGoods = async (ctx) => {
const url = `${ACTIVITY_URI}/goods/background/pindan_goods`; const url = `${ACTIVITY_URI}/goods/background/pindan_goods`;
const opts = { const opts = {
url, url,
method: "GET" method: "GET",
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 查看商品详情 // 查看商品详情
exports.markGoodsInfo = async ctx => { exports.markGoodsInfo = async (ctx) => {
const url = `${ACTIVITY_URI}/goods/background/marketing_goods_info`; const url = `${ACTIVITY_URI}/goods/background/marketing_goods_info`;
const opts = { const opts = {
url, url,
method: "GET" method: "GET",
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 编辑商品 // 编辑商品
exports.editGoods = async ctx => { exports.editGoods = async (ctx) => {
const url = `${ACTIVITY_URI}/goods/background/edit_goods`; const url = `${ACTIVITY_URI}/goods/background/edit_goods`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 获取活动过列表 // 获取活动过列表
exports.getActivityList = async ctx => { exports.getActivityList = async (ctx) => {
const url = `${ACTIVITY_URI}/marketing/background/marketing_list`; const url = `${ACTIVITY_URI}/marketing/background/marketing_list`;
const opts = { const opts = {
url, url,
method: "GET" method: "GET",
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 修改商品 // 修改商品
exports.editGoodsDetail = async ctx => { exports.editGoodsDetail = async (ctx) => {
const url = `${ACTIVITY_URI}/goods/background/edit_goods`; const url = `${ACTIVITY_URI}/goods/background/edit_goods`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 添加营销活动 // 添加营销活动
exports.addMarketing = async ctx => { exports.addMarketing = async (ctx) => {
const url = `${ACTIVITY_URI}/marketing/background/add_marketing`; const url = `${ACTIVITY_URI}/marketing/background/add_marketing`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 编辑营销活动 // 编辑营销活动
exports.updateMarketing = async ctx => { exports.updateMarketing = async (ctx) => {
const url = `${ACTIVITY_URI}/marketing/background/update_marketing`; const url = `${ACTIVITY_URI}/marketing/background/update_marketing`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 营销活动详情 // 营销活动详情
exports.marketingInfo = async ctx => { exports.marketingInfo = async (ctx) => {
const url = `${ACTIVITY_URI}/marketing/background/marketing_info`; const url = `${ACTIVITY_URI}/marketing/background/marketing_info`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 关闭/开启 活动 // 关闭/开启 活动
exports.updateActivity = async ctx => { exports.updateActivity = async (ctx) => {
const url = `${ACTIVITY_URI}/marketing/background/update_marketing_online_status`; const url = `${ACTIVITY_URI}/marketing/background/update_marketing_online_status`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 查看活动订单 // 查看活动订单
exports.checkActivityDetail = async ctx => { exports.checkActivityDetail = async (ctx) => {
const url = `${ACTIVITY_URI}/marketing/background/marketing_info`; const url = `${ACTIVITY_URI}/marketing/background/marketing_info`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 查看活动订单 // 查看活动订单
exports.checkActivityDetailInfo = async ctx => { exports.checkActivityDetailInfo = async (ctx) => {
const url = `${ACTIVITY_URI}/order/background/pindan_marketing_info_data_statistics`; const url = `${ACTIVITY_URI}/order/background/pindan_marketing_info_data_statistics`;
const opts = { const opts = {
url, url,
method: "GET", method: "GET",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 获取自提点列表 // 获取自提点列表
exports.getPlaceList = async ctx => { exports.getPlaceList = async (ctx) => {
const url = `${ACTIVITY_URI}/marketing/background/take_place_list`; const url = `${ACTIVITY_URI}/marketing/background/take_place_list`;
const opts = { const opts = {
url, url,
method: "GET" method: "GET",
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 添加自提点 // 添加自提点
exports.addPlace = async ctx => { exports.addPlace = async (ctx) => {
const url = `${ACTIVITY_URI}/marketing/background/add_take_place`; const url = `${ACTIVITY_URI}/marketing/background/add_take_place`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
//删除自提点 //删除自提点
exports.deletePlace = async ctx => { exports.deletePlace = async (ctx) => {
const url = `${ACTIVITY_URI}/marketing/background/delete_take_place`; const url = `${ACTIVITY_URI}/marketing/background/delete_take_place`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
...@@ -3,128 +3,128 @@ const req = require("../utils/request").httpReq; ...@@ -3,128 +3,128 @@ const req = require("../utils/request").httpReq;
const controller_utils = require("./utils"); const controller_utils = require("./utils");
// 获取企业信息列表 // 获取企业信息列表
exports.auditList = async ctx => { exports.auditList = async (ctx) => {
const url = `${API_INTERNAL_URI}/merchant/inner/audit_list`; const url = `${API_INTERNAL_URI}/merchant/inner/audit_list`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = JSON.stringify(await req(ctx, opts)); ctx.body = JSON.stringify(await req(ctx, opts));
}; };
// 企业认证获取验证码 // 企业认证获取验证码
exports.sendCode = async ctx => { exports.sendCode = async (ctx) => {
const url = `${API_INTERNAL_URI}/merchant/lifeinner/send_code`; const url = `${API_INTERNAL_URI}/merchant/lifeinner/send_code`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 企业认证校验验证码 // 企业认证校验验证码
exports.checkCode = async ctx => { exports.checkCode = async (ctx) => {
const url = `${API_INTERNAL_URI}/merchant/lifeinner/check_code`; const url = `${API_INTERNAL_URI}/merchant/lifeinner/check_code`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 审核列表详情页回显信息列表 // 审核列表详情页回显信息列表
exports.getRecordInfo = async ctx => { exports.getRecordInfo = async (ctx) => {
const url = `${API_INTERNAL_URI}/merchant/inner/get_record_info`; const url = `${API_INTERNAL_URI}/merchant/inner/get_record_info`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
let permission = await controller_utils.getUserPermission(ctx); let permission = await controller_utils.getUserPermission(ctx);
permission = JSON.parse(permission); permission = JSON.parse(permission);
const request = await req(ctx, opts); const request = await req(ctx, opts);
if (permission.is_sensitive_data !== 1) { if (permission.is_sensitive_data !== 1) {
request.result.record.entterprise_image = null; // 营业执照照片 request.result.record.entterprise_image = null; // 营业执照照片
request.result.record.legal_person = "********"; // 法人姓名 request.result.record.legal_person = "********"; // 法人姓名
request.result.record.legal_id_card = "********"; // 法人身份证号 request.result.record.legal_id_card = "********"; // 法人身份证号
request.result.record.legal_validity_start_time = "********"; // 法人身份证开始时间 request.result.record.legal_validity_start_time = "********"; // 法人身份证开始时间
request.result.record.legal_validity_end_time = "********"; // 法人身份证结束时间 request.result.record.legal_validity_end_time = "********"; // 法人身份证结束时间
request.result.record.legal_front_id_card = null; // 法人身份证正面照 request.result.record.legal_front_id_card = null; // 法人身份证正面照
request.result.record.legal_back_id_card = null; // 法人身份证反面照 request.result.record.legal_back_id_card = null; // 法人身份证反面照
request.result.record.legal_id_card_hash = "********"; // 法人身份证哈希值 request.result.record.legal_id_card_hash = "********"; // 法人身份证哈希值
request.result.record.enterprice_address = "********"; // 企业地址 request.result.record.enterprice_address = "********"; // 企业地址
request.result.record.legal_issued_by = "********"; // 法人身份证地址 request.result.record.legal_issued_by = "********"; // 法人身份证地址
request.result.record.legal_nationality = "********"; // 法人民族 request.result.record.legal_nationality = "********"; // 法人民族
request.result.record.mobile = "********"; // 法人电话 request.result.record.mobile = "********"; // 法人电话
request.result.record.sensitiveWord = false; // 是否有查看敏感词权限 request.result.record.sensitiveWord = false; // 是否有查看敏感词权限
} else { } else {
request.result.record.sensitiveWord = true; // 是否有查看敏感词权限 request.result.record.sensitiveWord = true; // 是否有查看敏感词权限
} }
ctx.body = request; ctx.body = request;
}; };
// 历史提交审核日志详情页 // 历史提交审核日志详情页
exports.getLog = async ctx => { exports.getLog = async (ctx) => {
const url = `${API_INTERNAL_URI}/merchant/inner/get_log`; const url = `${API_INTERNAL_URI}/merchant/inner/get_log`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 企业资料审核 // 企业资料审核
exports.postAudit = async ctx => { exports.postAudit = async (ctx) => {
const url = `${API_INTERNAL_URI}/merchant/inner/audit`; const url = `${API_INTERNAL_URI}/merchant/inner/audit`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 企业资料修改 // 企业资料修改
exports.opBusinessUpdate = async ctx => { exports.opBusinessUpdate = async (ctx) => {
const url = `${API_INTERNAL_URI}/merchant/inner/op_business_update`; const url = `${API_INTERNAL_URI}/merchant/inner/op_business_update`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
} };
// 商户上传营业执照信息 // 商户上传营业执照信息
exports.postBusiness = async ctx => { exports.postBusiness = async (ctx) => {
const url = `${API_INTERNAL_URI}/merchant/inner/op_business_commit`; const url = `${API_INTERNAL_URI}/merchant/inner/op_business_commit`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 商户信息代提交(op后台) // 商户信息代提交(op后台)
exports.opCommit = async ctx => { exports.opCommit = async (ctx) => {
const url = `${API_INTERNAL_URI}/merchant/inner/op_commit`; const url = `${API_INTERNAL_URI}/merchant/inner/op_commit`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
This diff is collapsed.
This diff is collapsed.
const API_INTERNAL_URI = require('../config.js').API_INTERNAL_URI const API_INTERNAL_URI = require("../config.js").API_INTERNAL_URI;
//生活号列表 //生活号列表
const req = require('../utils/request').httpReq const req = require("../utils/request").httpReq;
exports.get_life_list = async (ctx, next) => { exports.get_life_list = async (ctx, next) => {
var url = `${API_INTERNAL_URI}/merchant/lifeinner/life_list`; var url = `${API_INTERNAL_URI}/merchant/lifeinner/life_list`;
var opts = { var opts = {
url: url, url: url,
method: 'GET', method: "GET",
qs: ctx.request.query qs: ctx.request.query,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
//生活号详情 //生活号详情
exports.get_life_info = async (ctx, next) => { exports.get_life_info = async (ctx, next) => {
var url = `${API_INTERNAL_URI}/merchant/lifeinner/life_info`; var url = `${API_INTERNAL_URI}/merchant/lifeinner/life_info`;
var opts = { var opts = {
url: url, url: url,
method: 'POST', method: "POST",
json: true, json: true,
timeout: 8000, timeout: 8000,
body: ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
const qr = require('qr-image'); const qr = require("qr-image");
exports.gen_qr_code = async (ctx) => { exports.gen_qr_code = async (ctx) => {
const url = ctx.query.url; const url = ctx.query.url;
try { try {
let img = qr.image(decodeURIComponent(url)); let img = qr.image(decodeURIComponent(url));
ctx.type= 'image/png'; ctx.type = "image/png";
ctx.body = img; ctx.body = img;
} catch (e) { } catch (e) {
ctx.type='text/html;charset=utf-8'; ctx.type = "text/html;charset=utf-8";
ctx.body='<h1>414 Request-URI Too Large</h1>'; ctx.body = "<h1>414 Request-URI Too Large</h1>";
} }
}; };
const API_INTERNAL_URI = require('../config.js').API_INTERNAL_URI const API_INTERNAL_URI = require("../config.js").API_INTERNAL_URI;
const req = require('../utils/request').httpReq const req = require("../utils/request").httpReq;
const controller_utils = require('./utils') const controller_utils = require("./utils");
exports.getAll_role_list = async (ctx, next) => { exports.getAll_role_list = async (ctx, next) => {
ctx.body = await controller_utils.getUserPermission(ctx); ctx.body = await controller_utils.getUserPermission(ctx);
} };
exports.getRole_list = async (ctx, next) => { exports.getRole_list = async (ctx, next) => {
var url = `${API_INTERNAL_URI}/merchant/authority/role_list`; var url = `${API_INTERNAL_URI}/merchant/authority/role_list`;
var opts = { var opts = {
url: url, url: url,
method: 'POST', method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
exports.getAdd_role = async (ctx, next) => { exports.getAdd_role = async (ctx, next) => {
var url = `${API_INTERNAL_URI}/merchant/authority/add_role`; var url = `${API_INTERNAL_URI}/merchant/authority/add_role`;
var opts = { var opts = {
url: url, url: url,
method: 'POST', method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
exports.get_role_info = async (ctx, next) => { exports.get_role_info = async (ctx, next) => {
var url = `${API_INTERNAL_URI}/merchant/authority/get_role_info`; var url = `${API_INTERNAL_URI}/merchant/authority/get_role_info`;
var opts = { var opts = {
url: url, url: url,
method: 'POST', method: "POST",
json: true, json: true,
timeout: 8000, timeout: 8000,
body: ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
exports.getUpdate_role = async (ctx, next) => { exports.getUpdate_role = async (ctx, next) => {
var url = `${API_INTERNAL_URI}/merchant/authority/update_role`; var url = `${API_INTERNAL_URI}/merchant/authority/update_role`;
var opts = { var opts = {
url: url, url: url,
method: 'POST', method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
exports.getDelete_role = async (ctx, next) => { exports.getDelete_role = async (ctx, next) => {
var url = `${API_INTERNAL_URI}/merchant/authority/delete_role`; var url = `${API_INTERNAL_URI}/merchant/authority/delete_role`;
var opts = { var opts = {
url: url, url: url,
method: 'POST', method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
...@@ -11,14 +11,21 @@ exports.index = (ctx, next) => { ...@@ -11,14 +11,21 @@ exports.index = (ctx, next) => {
const hostname = ctx.hostname; const hostname = ctx.hostname;
const pathArr = ctx.path.substring(1).split("/"); const pathArr = ctx.path.substring(1).split("/");
// console.log(hostname); console.log(hostname);
// console.log(pathArr); console.log(pathArr);
if (hostname === "opservice.yidianzixun.com" || hostname === "www.opservice.yidianzixun.com") { // 外网域名
if (pathArr[1] !== "activity" && pathArr[1] !== "groupmeal") { const hostNameArr = ["127.0.0.1", "opservice.yidianzixun.com", "test-opservice.yidianzixun.com", "preprod-opservice.yidianzixun.com"];
ctx.body = "权限不足";
return; // 允许访问的模块
} const allowModuleArr = ["activity", "groupmeal"];
// 不允许访问的模块
const noAllowModuleArr = ["goods", "enterprise", "withdrawal"];
if (hostNameArr.includes(hostname) && noAllowModuleArr.includes(pathArr[1])) {
ctx.body = "权限不足";
return;
} }
if (!cachePage) { if (!cachePage) {
......
...@@ -2,37 +2,36 @@ const PANDORA_URI = require("../config.js").PANDORA_URI; ...@@ -2,37 +2,36 @@ const PANDORA_URI = require("../config.js").PANDORA_URI;
const req = require("../utils/request").httpReq; const req = require("../utils/request").httpReq;
const { API_INTERNAL_URI, API_YD_LOGIN } = require("../config.js"); const { API_INTERNAL_URI, API_YD_LOGIN } = require("../config.js");
exports.fetch_user = async (ctx, next) => { exports.fetch_user = async (ctx, next) => {
const url = `${PANDORA_URI}/api/user/getuser`; const url = `${PANDORA_URI}/api/user/getuser`;
const opts = { const opts = {
url: url, url: url,
method: "GET", method: "GET",
headers: { headers: {
Cookie: ctx.request.header.cookie Cookie: ctx.request.header.cookie,
} },
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
exports.J_login = async (ctx, next) => { exports.J_login = async (ctx, next) => {
var url = `${API_INTERNAL_URI}/merchant/authority/login`; var url = `${API_INTERNAL_URI}/merchant/authority/login`;
var opts = { var opts = {
url: url, url: url,
method: 'POST', method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
exports.YD_login = async (ctx, next) => { exports.YD_login = async (ctx, next) => {
var url = API_YD_LOGIN; var url = API_YD_LOGIN;
var opts = { var opts = {
url: url, url: url,
method: 'POST', method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
const API_INTERNAL_URI = require('../config.js').API_INTERNAL_URI const API_INTERNAL_URI = require("../config.js").API_INTERNAL_URI;
const req = require('../utils/request').httpReq const req = require("../utils/request").httpReq;
const controller_utils = require('./utils') const controller_utils = require("./utils");
//用户详情 //用户详情
exports.getUser_detail = async (ctx, next) => { exports.getUser_detail = async (ctx, next) => {
var url = `${API_INTERNAL_URI}/merchant/authority/get_user_info`; var url = `${API_INTERNAL_URI}/merchant/authority/get_user_info`;
var opts = { var opts = {
url: url, url: url,
method: 'POST', method: "POST",
json: true, json: true,
timeout: 8000, timeout: 8000,
body: ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
var query = { var query = {
async get_permissions (ctx) { async get_permissions(ctx) {
ctx.body = await controller_utils.getUserPermission(ctx); ctx.body = await controller_utils.getUserPermission(ctx);
} },
}; };
exports.query = async (ctx, next) => { exports.query = async (ctx, next) => {
var type = ctx.params.type; var type = ctx.params.type;
if (query[type]) { if (query[type]) {
try { try {
ctx.set("Content-Type", "application/json; charset=utf-8"); ctx.set("Content-Type", "application/json; charset=utf-8");
await query[type](ctx, next); await query[type](ctx, next);
} catch (e) { } catch (e) {
console.error("/api/v1 error", e, ctx.url, ctx.headers["cookie"]); console.error("/api/v1 error", e, ctx.url, ctx.headers["cookie"]);
ctx.body = { status: "failed", reason: "Internal Server Error" }; ctx.body = { status: "failed", reason: "Internal Server Error" };
}
} else {
ctx.body = {
status: "failed",
reason: "Invalid type param",
};
} }
} else {
ctx.body = {
status: "failed",
reason: "Invalid type param"
};
}
}; };
exports.user_list = async (ctx, next) => { exports.user_list = async (ctx, next) => {
const url = `${API_INTERNAL_URI}/merchant/authority/get_user_list`; const url = `${API_INTERNAL_URI}/merchant/authority/get_user_list`;
const opts = { const opts = {
url: url, url: url,
method: "GET", method: "GET",
qs: ctx.request.query, qs: ctx.request.query,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
exports.user_detail = async (ctx, next) => { exports.user_detail = async (ctx, next) => {
const url = `${API_INTERNAL_URI}/merchant/authority/get_user_info`; const url = `${API_INTERNAL_URI}/merchant/authority/get_user_info`;
const opts = { const opts = {
url: url, url: url,
method: "GET", method: "GET",
qs: ctx.request.query, qs: ctx.request.query,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
exports.user_edit = async (ctx, next) => { exports.user_edit = async (ctx, next) => {
const url = `${API_INTERNAL_URI}/merchant/authority/update_user`; const url = `${API_INTERNAL_URI}/merchant/authority/update_user`;
const opts = { const opts = {
url: url, url: url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body, body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
exports.user_new = async (ctx, next) => { exports.user_new = async (ctx, next) => {
const url = `${API_INTERNAL_URI}/merchant/authority/add_user_role`; const url = `${API_INTERNAL_URI}/merchant/authority/add_user_role`;
const opts = { const opts = {
url: url, url: url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body, body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
//通过手机号获取小程序用户信息 //通过手机号获取小程序用户信息
exports.getPhoneWechat = async (ctx, next) => { exports.getPhoneWechat = async (ctx, next) => {
const url = `${API_INTERNAL_URI}/user/background/get_phone_wechat`; const url = `${API_INTERNAL_URI}/user/background/get_phone_wechat`;
const opts = { const opts = {
url: url, url: url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body, body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 配置优惠券 // 配置优惠券
exports.couponGrant = async (ctx, next) => { exports.couponGrant = async (ctx, next) => {
const url = `${API_INTERNAL_URI}/coupon/background/grant`; const url = `${API_INTERNAL_URI}/coupon/background/grant`;
const opts = { const opts = {
url: url, url: url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body, body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
const API_INTERNAL_URI = require('../config.js').API_INTERNAL_URI const API_INTERNAL_URI = require("../config.js").API_INTERNAL_URI;
const req = require('../utils/request').httpReq const req = require("../utils/request").httpReq;
exports.getUserPermission = async (ctx) => { exports.getUserPermission = async (ctx) => {
const url = `${API_INTERNAL_URI}/merchant/authority/get_role_list`; const url = `${API_INTERNAL_URI}/merchant/authority/get_role_list`;
const { email, op_cur_user } = ctx.request.query; const { email, op_cur_user } = ctx.request.query;
const user = email || op_cur_user; const user = email || op_cur_user;
const opts = { const opts = {
url, url,
method: "GET", method: "GET",
qs: { qs: {
// user_email: "jianghaiming@126.com" // user_email: "jianghaiming@126.com"
user_email: user user_email: user,
} },
}; };
return await req(ctx, opts); return await req(ctx, opts);
} };
\ No newline at end of file
...@@ -17,139 +17,139 @@ const req = require("../utils/request").httpReq; ...@@ -17,139 +17,139 @@ const req = require("../utils/request").httpReq;
* }; * };
*/ */
// 获取提现审核列表 // 获取提现审核列表
exports.getApplyList = async ctx => { exports.getApplyList = async (ctx) => {
const url = `${WITHDRAWAL_URI}/wallet/background/apply_list`; const url = `${WITHDRAWAL_URI}/wallet/background/apply_list`;
const opts = { const opts = {
url, url,
method: "GET", method: "GET",
qs: ctx.request.query qs: ctx.request.query,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 获取黑名单冻结账户 // 获取黑名单冻结账户
exports.getBlackList = async ctx => { exports.getBlackList = async (ctx) => {
const url = `${WITHDRAWAL_URI}/wallet/background/blacklist`; const url = `${WITHDRAWAL_URI}/wallet/background/blacklist`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
// 获取通过、拒绝订单审核 // 获取通过、拒绝订单审核
exports.getWithdrawAudit = async ctx => { exports.getWithdrawAudit = async (ctx) => {
const url = `${WITHDRAWAL_URI}/wallet/background/withdraw_audit`; const url = `${WITHDRAWAL_URI}/wallet/background/withdraw_audit`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body, body: ctx.request.body,
timeout: 10000 timeout: 10000,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
// 获取提现失败冻结 // 获取提现失败冻结
exports.getFreezingFund = async ctx => { exports.getFreezingFund = async (ctx) => {
const url = `${WITHDRAWAL_URI}/wallet/background/back_freezing_fund`; const url = `${WITHDRAWAL_URI}/wallet/background/back_freezing_fund`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
// 获取提现审核详情 // 获取提现审核详情
exports.getApplyDetail = async ctx => { exports.getApplyDetail = async (ctx) => {
const url = `${WITHDRAWAL_URI}/wallet/background/apply_detail`; const url = `${WITHDRAWAL_URI}/wallet/background/apply_detail`;
const opts = { const opts = {
url, url,
method: "GET", method: "GET",
qs: ctx.request.query qs: ctx.request.query,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
// 提现审核迭代 // 提现审核迭代
// 获取钱包账户列表 // 获取钱包账户列表
exports.getAccountList = async ctx => { exports.getAccountList = async (ctx) => {
const url = `${WITHDRAWAL_URI}/wallet/background/account_list`; const url = `${WITHDRAWAL_URI}/wallet/background/account_list`;
const opts = { const opts = {
url, url,
method: "GET", method: "GET",
qs: ctx.request.query qs: ctx.request.query,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
// 获取钱包账户流水列表 // 获取钱包账户流水列表
exports.getRecordList = async ctx => { exports.getRecordList = async (ctx) => {
const url = `${WITHDRAWAL_URI}/wallet/background/record_list`; const url = `${WITHDRAWAL_URI}/wallet/background/record_list`;
const opts = { const opts = {
url, url,
method: "GET", method: "GET",
qs: ctx.request.query qs: ctx.request.query,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
// 钱包账户黑名单 // 钱包账户黑名单
exports.getAccountBlackList = async ctx => { exports.getAccountBlackList = async (ctx) => {
const url = `${WITHDRAWAL_URI}/wallet/background/blacklist`; const url = `${WITHDRAWAL_URI}/wallet/background/blacklist`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
// 钱包账户释放 // 钱包账户释放
exports.getReblackList = async ctx => { exports.getReblackList = async (ctx) => {
const url = `${WITHDRAWAL_URI}/wallet/background/reblacklist`; const url = `${WITHDRAWAL_URI}/wallet/background/reblacklist`;
const opts = { const opts = {
url, url,
method: "POST", method: "POST",
json: true, json: true,
body: ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts);
} };
// 获取钱包账户余额状态 // 获取钱包账户余额状态
exports.getWalletAccountStatus = async ctx=>{ exports.getWalletAccountStatus = async (ctx) => {
const url = `${WITHDRAWAL_URI}/wallet/background/get_wallet_account_status`; const url = `${WITHDRAWAL_URI}/wallet/background/get_wallet_account_status`;
const opts = { const opts = {
url, url,
method: "GET", method: "GET",
qs: ctx.request.query qs: ctx.request.query,
} };
ctx.body = await req(ctx,opts) ctx.body = await req(ctx, opts);
} };
// 钱包账户余额状态 // 钱包账户余额状态
exports.resetAccountStatus = async ctx=>{ exports.resetAccountStatus = async (ctx) => {
const url = `${WITHDRAWAL_URI}/wallet/background/reset_wallet_account_status`; const url = `${WITHDRAWAL_URI}/wallet/background/reset_wallet_account_status`;
const opts = { const opts = {
url, url,
method:"POST", method: "POST",
json:true, json: true,
body:ctx.request.body body: ctx.request.body,
} };
ctx.body = await req(ctx,opts) ctx.body = await req(ctx, opts);
} };
const getUserPermission = async (ctx) => { const getUserPermission = async (ctx) => {
const url = `${WITHDRAWAL_URI}/merchant/authority/get_role_list`; const url = `${WITHDRAWAL_URI}/merchant/authority/get_role_list`;
const { email, op_cur_user } = ctx.request.query; const { email, op_cur_user } = ctx.request.query;
const user = email || op_cur_user; const user = email || op_cur_user;
const opts = { const opts = {
url, url,
method: "GET", method: "GET",
qs: { qs: {
// user_email: "jianghaiming@126.com" // user_email: "jianghaiming@126.com"
user_email: user user_email: user,
} },
}; };
return await req(ctx, opts); return await req(ctx, opts);
} };
exports.getAll_role_list = async (ctx, next) => { exports.getAll_role_list = async (ctx, next) => {
ctx.body = await getUserPermission(ctx); ctx.body = await getUserPermission(ctx);
} };
\ No newline at end of file
This diff is collapsed.
const request = require("request"); const request = require("request");
exports.httpReq = (ctx, opts) => { exports.httpReq = (ctx, opts) => {
opts.timeout = opts.timeout || 10000; opts.timeout = opts.timeout || 10000;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
var time_start = +new Date(); var time_start = +new Date();
const defaultQs = { const defaultQs = {
appid: "merchant-op", appid: "merchant-op",
cv: "1.0.0", cv: "1.0.0",
version: "999999", version: "999999",
distribution: "op", distribution: "op",
net: "wifi", net: "wifi",
platform: "2" platform: "2",
}; };
opts.qs = { ...defaultQs, ...ctx.request.query, ...opts.qs }; opts.qs = { ...defaultQs, ...ctx.request.query, ...opts.qs };
request(opts, (err, res, body) => { request(opts, (err, res, body) => {
console.info( console.info(`[Api] httpReq (${opts.url}, user:[${opts.qs.op_cur_user}]) spent: ${+new Date() - time_start}ms`);
`[Api] httpReq (${opts.url}, user:[${
opts.qs.op_cur_user
}]) spent: ${+new Date() - time_start}ms`
);
if (!err) { if (!err) {
resolve(body); resolve(body);
} else { } else {
reject(err); reject(err);
console.error(opts.url, err); console.error(opts.url, err);
} }
});
}); });
});
}; };
...@@ -10,27 +10,27 @@ ...@@ -10,27 +10,27 @@
</template> </template>
<script> <script>
import { getCookie, redirectToLogin } from '@/utils/util'; import { getCookie, redirectToLogin } from "@/utils/util";
import { fetchCurrentUser } from './service/user'; import { fetchCurrentUser } from "./service/user";
export default { export default {
async mounted() { async mounted() {
if (this.$store.state.permissions && this.$store.state.userInfo) return; if (this.$store.state.permissions && this.$store.state.userInfo) return;
if (!getCookie('username') && window.location.pathname != '/op/login') { if (!getCookie("username") && window.location.pathname != "/op/login") {
this.$message('请先登录'); this.$message("请先登录");
return redirectToLogin(); return redirectToLogin();
} }
if (!this.$store.state.permissions) { if (!this.$store.state.permissions) {
const { status, user } = await fetchCurrentUser(); const { status, user } = await fetchCurrentUser();
if (status === 'success') { if (status === "success") {
this.$store.commit('updateUserInfo', user); this.$store.commit("updateUserInfo", user);
await this.$store.dispatch('updateUserPermission', { email: user.email }); await this.$store.dispatch("updateUserPermission", { email: user.email });
this.$store.dispatch('fetchPermission', { this.$store.dispatch("fetchPermission", {
appId: 'merchant-op-auditing' appId: "merchant-op-auditing",
}); });
} }
} }
} },
}; };
</script> </script>
......
<template> <template>
<div class="YDDialog"> <div class="YDDialog">
<el-dialog <el-dialog
:title="dialogTitle" :title="dialogTitle"
v-model="dialogVisible" v-model="dialogVisible"
:width="dialogWidth" :width="dialogWidth"
:show-close="showDialogClose" :show-close="showDialogClose"
:top="dialogMarginTop" :top="dialogMarginTop"
:modal="dialogModel" :modal="dialogModel"
:close-on-click-modal="dialogCloseOnClickModal" :close-on-click-modal="dialogCloseOnClickModal"
:close-on-press-escape="dialogCloseOnPressEscape" :close-on-press-escape="dialogCloseOnPressEscape"
:center="dialogCenter" :center="dialogCenter"
> >
<slot></slot> <slot></slot>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button v-show="isShowCancelButton" @click="cancel">{{ <el-button v-show="isShowCancelButton" @click="cancel">{{ cancelButtonText }}</el-button>
cancelButtonText <el-button v-show="isShowConfirmButton" type="primary" @click="cofirm">{{ confirmButtonText }}</el-button>
}}</el-button> </span>
<el-button </template>
v-show="isShowConfirmButton" </el-dialog>
type="primary" </div>
@click="cofirm"
>{{ confirmButtonText }}</el-button
>
</span>
</template>
</el-dialog>
</div>
</template> </template>
<script> <script>
export default { export default {
props: { props: {
// 标题 // 标题
dialogTitle: { dialogTitle: {
type: String, type: String,
default: "标题" default: "标题",
}, },
// dialog 显示控制 // dialog 显示控制
myDialogVisible: { myDialogVisible: {
type: Boolean, type: Boolean,
default: false default: false,
}, },
// 确认button文案 // 确认button文案
confirmButtonText: { confirmButtonText: {
type: String, type: String,
default: "确 定" default: "确 定",
}, },
// 取消button文案 // 取消button文案
cancelButtonText: { cancelButtonText: {
type: String, type: String,
default: "取 消" default: "取 消",
}, },
// 宽度 // 宽度
dialogWidth: { dialogWidth: {
type: String, type: String,
default: "50%" default: "50%",
}, },
// 距离顶部的margin // 距离顶部的margin
dialogMarginTop: { dialogMarginTop: {
type: String, type: String,
default: "15vh" default: "15vh",
}, },
// 是否需要遮罩层 // 是否需要遮罩层
dialogModel: { dialogModel: {
type: Boolean, type: Boolean,
default: true default: true,
}, },
// 点击遮罩层是否关闭dialog // 点击遮罩层是否关闭dialog
dialogCloseOnClickModal: { dialogCloseOnClickModal: {
type: Boolean, type: Boolean,
default: false default: false,
}, },
// 是否显示关闭(右上角X) // 是否显示关闭(右上角X)
showDialogClose: { showDialogClose: {
type: Boolean, type: Boolean,
default: false default: false,
}, },
// 是否展示确定按钮 // 是否展示确定按钮
isShowConfirmButton: { isShowConfirmButton: {
type: Boolean, type: Boolean,
default: true default: true,
}, },
// 是否展示取消按钮 // 是否展示取消按钮
isShowCancelButton: { isShowCancelButton: {
type: Boolean, type: Boolean,
default: true default: true,
}, },
// 点击esc是否关闭 // 点击esc是否关闭
dialogCloseOnPressEscape: { dialogCloseOnPressEscape: {
type: Boolean, type: Boolean,
default: false default: false,
}, },
// 底部按钮是否居中显示 // 底部按钮是否居中显示
dialogCenter: { dialogCenter: {
type: Boolean, type: Boolean,
default: false default: false,
}, },
// cancelDialog 方法名称 // cancelDialog 方法名称
cancelDialogMethodName: { cancelDialogMethodName: {
type: String, type: String,
default: "dialogCancel" default: "dialogCancel",
}, },
// confirmDialog 方法名称 // confirmDialog 方法名称
confirmDialogMethodName: { confirmDialogMethodName: {
type: String, type: String,
default: "dialogConfirm" default: "dialogConfirm",
} },
}, },
data() { data() {
return { return {
dialogVisible: this.myDialogVisible dialogVisible: this.myDialogVisible,
}; };
}, },
watch: { watch: {
myDialogVisible(newVal) { myDialogVisible(newVal) {
this.dialogVisible = newVal; this.dialogVisible = newVal;
} },
}, },
methods: { methods: {
cancel() { cancel() {
this.$emit(this.cancelDialogMethodName); this.$emit(this.cancelDialogMethodName);
}, },
cofirm() { cofirm() {
this.$emit(this.confirmDialogMethodName); this.$emit(this.confirmDialogMethodName);
} },
} },
}; };
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>
<template> <template>
<div class="page-footer"></div> <div class="page-footer"></div>
</template> </template>
<script> <script>
export default {}; export default {};
</script> </script>
<style></style> <style></style>
<template> <template>
<el-dropdown> <el-dropdown>
<div class="user-info"> <div class="user-info">
<el-avatar <el-avatar :src="userInfo.avatar || DEFAULT_AVATAR" size="small"></el-avatar>
:src="userInfo.avatar || DEFAULT_AVATAR" <span class="user-name">{{ userInfo.name }}</span>
size="small" </div>
></el-avatar> <template #dropdown>
<span class="user-name">{{userInfo.name}}</span> <el-dropdown-menu trigger="hover">
</div> <el-dropdown-item>
<template #dropdown> {{ userEmail }}
<el-dropdown-menu trigger="hover"> </el-dropdown-item>
<el-dropdown-item> <el-dropdown-item @click="$emit('logout')">退出登录</el-dropdown-item>
{{ userEmail }} </el-dropdown-menu>
</el-dropdown-item> </template>
<el-dropdown-item @click="$emit('logout')"> </el-dropdown>
退出登录
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template> </template>
<script> <script>
import { mapState } from 'vuex' import { mapState } from "vuex";
import { HEADER_CONFIG } from '@/config/pageconfig'; import { HEADER_CONFIG } from "@/config/pageconfig";
import { getCookie } from "@/utils/util"; import { getCookie } from "@/utils/util";
export default { export default {
computed: mapState({ computed: mapState({
userInfo: state => (state.userInfo || {}), userInfo: (state) => state.userInfo || {},
}), }),
data () { data() {
return { return {
DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar, DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar,
userEmail: '' userEmail: "",
};
},
mounted() {
this.userEmail = getCookie("username") || "";
},
}; };
},
mounted() {
this.userEmail = getCookie('username') || ''
}
};
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.user-info { .user-info {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.user-name { .user-name {
margin-left: 12px; margin-left: 12px;
color: #fff; color: #fff;
} }
</style> </style>
const headerConfig = { const headerConfig = {
appName: 'OP运营管理后台', appName: "OP运营管理后台",
logo: 'http://si1.go2yd.com/get-image/0ZAJxXeZ6iu', logo: "http://si1.go2yd.com/get-image/0ZAJxXeZ6iu",
menuItems: [ menuItems: [
{ {
path: '/enterprise/certification', path: "/enterprise/certification",
name: '企业认证管理' name: "企业认证管理",
},
{
path: "/lifeNo",
name: "生活号管理",
},
{
path: "/role",
name: "角色管理",
},
{
path: "/user",
name: "用户管理",
},
],
miscellaneous: {
// 配置当用户头像不存在时使用的fallback头像图URL
defaultAvatar: "//s.go2yd.com/a/thead_meiguoduizhang.png",
}, },
{
path: '/lifeNo',
name: '生活号管理'
},
{
path: '/role',
name: '角色管理'
},
{
path: '/user',
name: '用户管理'
}
],
miscellaneous: {
// 配置当用户头像不存在时使用的fallback头像图URL
defaultAvatar: '//s.go2yd.com/a/thead_meiguoduizhang.png',
},
}; };
export default headerConfig; export default headerConfig;
\ No newline at end of file
<template> <template>
<div> <div>
<el-menu <el-menu
:router="true" :router="true"
background-color="#545c64" background-color="#545c64"
text-color="#fff" text-color="#fff"
:default-active="activeMenu" :default-active="activeMenu"
active-text-color="#ffd04b" active-text-color="#ffd04b"
mode="horizontal" mode="horizontal"
>
<el-menu-item
v-for="item in menuItemsWithAuth"
:index="item.path"
:key="item.name"
> >
{{ item.name }} <el-menu-item v-for="item in menuItemsWithAuth" :index="item.path" :key="item.name">
</el-menu-item> {{ item.name }}
<el-menu-item key="usermenu" class="user-menu"> </el-menu-item>
<user @logout="handleLogout"></user> <el-menu-item key="usermenu" class="user-menu">
</el-menu-item> <user @logout="handleLogout"></user>
</el-menu> </el-menu-item>
</div> </el-menu>
</div>
</template> </template>
<script> <script>
import { HEADER_CONFIG } from "@/config/pageconfig"; import { HEADER_CONFIG } from "@/config/pageconfig";
import User from './User.vue'; import User from "./User.vue";
import { createNamespacedHelpers } from 'vuex' import { createNamespacedHelpers } from "vuex";
const { mapActions } = createNamespacedHelpers('login') const { mapActions } = createNamespacedHelpers("login");
const { menuItems } = HEADER_CONFIG; const { menuItems } = HEADER_CONFIG;
export default { export default {
name: "PageHeader", name: "PageHeader",
components: { components: {
User, User,
}, },
data () { data() {
return { return {
menuItems, menuItems,
}; };
}, },
computed: { computed: {
menuItemsWithAuth: function () { menuItemsWithAuth: function () {
const keys = Object.keys(this.$store.getters.subPermissions) const keys = Object.keys(this.$store.getters.subPermissions);
return this.menuItems.filter(ele => keys.includes(ele.key)) return this.menuItems.filter((ele) => keys.includes(ele.key));
}, },
activeMenu: function () { activeMenu: function () {
return this.$route.path; return this.$route.path;
}, },
}, },
beforeMount () { beforeMount() {},
}, methods: {
methods: { ...mapActions(["logout"]),
...mapActions(['logout']), handleLogout() {
handleLogout() { this.logout();
this.logout() },
}, },
}, };
};
</script> </script>
<style lang="less"> <style lang="less">
.menu-router { .menu-router {
display: inline-block; display: inline-block;
line-height: 60px; line-height: 60px;
width: 100%; width: 100%;
} }
.user-menu { .user-menu {
float: right !important; float: right !important;
margin-right: 20px; margin-right: 20px;
} }
</style> </style>
<template> <template>
<div class="block"> <div class="block">
<el-pagination <el-pagination
@size-change="handleSizeChange" @size-change="handleSizeChange"
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
v-model:currentPage="currentPage" v-model:currentPage="currentPage"
:page-size="pageSize" :page-size="pageSize"
layout=" total,prev, pager, next" layout=" total,prev, pager, next"
:total="totalNum" :total="totalNum"
> ></el-pagination>
</el-pagination> </div>
</div>
</template> </template>
<script> <script>
export default { export default {
props: { props: {
data: Object, data: Object,
totalNum: Number, totalNum: Number,
pageSize: { pageSize: {
type: Number, type: Number,
default: 20, default: 20,
} },
},
}, data() {
data () { return {
return { currentPage: 1,
currentPage: 1 };
} },
}, methods: {
methods: { handleSizeChange(size) {
handleSizeChange (size) { console.log(`每页 ${size} 条`);
console.log(`每页 ${size} 条`); this.$emit("update", { pageSize: size });
this.$emit('update', { pageSize: size, }) },
}, handleCurrentChange(pageIndex) {
handleCurrentChange (pageIndex) { console.log(`当前页: ${pageIndex}`);
console.log(`当前页: ${pageIndex}`); this.$emit("update", { page: pageIndex });
this.$emit('update', { page: pageIndex }) },
} },
}, };
}
</script> </script>
<style lang="less"> <style lang="less">
.block { .block {
margin-top: 50px; margin-top: 50px;
} }
</style> </style>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template> <template>
<el-dialog <el-dialog title="提示" v-model="dialogVisible" width="30%" :before-close="handleClose">
title="提示" <span>这是一段信息</span>
v-model="dialogVisible" <template #footer>
width="30%" <span class="dialog-footer">
:before-close="handleClose" <el-button @click="dialogVisible = false">取 消</el-button>
> <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
<span>这是一段信息</span> </span>
<template #footer> </template>
<span class="dialog-footer"> </el-dialog>
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="dialogVisible = false"
>确 定</el-button
>
</span>
</template>
</el-dialog>
</template> </template>
<script> <script>
export default { export default {
components: {}, components: {},
props: {}, props: {},
data() { data() {
return { return {
dialogVisible: true dialogVisible: true,
};
},
watch: {},
computed: {},
methods: {},
created() {},
mounted() {},
}; };
},
watch: {},
computed: {},
methods: {},
created() {},
mounted() {}
};
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>
const currEnv = "prod" const currEnv = "prod";
const API_URI = { const API_URI = {
'dev': "XXX", dev: "XXX",
'test': "XXX", test: "XXX",
'prod': "XXX" prod: "XXX",
} };
export default { export default {
API_URI: API_URI[currEnv], API_URI: API_URI[currEnv],
} };
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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 to comment