Commit d4ce8781 authored by liwenhong's avatar liwenhong

Merge branch 'master' into feature/activity

# Conflicts:
#	package-lock.json
#	server/config.js
#	server/router.js
#	server/utils/request.js
#	src/App.vue
#	src/pages/Goods/Detail/index.vue
#	src/pages/Groupmeal/Distrib/index.vue
#	src/router/index.js
parents 7c2ded6d 2ae4ecb3
...@@ -37,7 +37,7 @@ npm run web-dev ...@@ -37,7 +37,7 @@ npm run web-dev
# 部署发布流程 # 部署发布流程
## 测试环境(http://clay.yidian-inc.com ## 测试环境(http://venus.int.yidian-inc.com:8055
待提测代码push test分支。对应下列三个job 打包部署测试环境 待提测代码push test分支。对应下列三个job 打包部署测试环境
- 1. bp-op-web-service-branch-commit - 1. bp-op-web-service-branch-commit
- 2. bp-op-web-service-branch-assemble - 2. bp-op-web-service-branch-assemble
......
/*
* For a detailed explanation regarding each configuration property, visit:
* https://jestjs.io/docs/configuration
*/
module.exports = {
// All imported modules in your tests should be mocked automatically
// automock: false,
// Stop running tests after `n` failures
// bail: 0,
// The directory where Jest should store its cached dependency information
// cacheDirectory: "/private/var/folders/5p/f45l166j057533bqfd5n9w880000gp/T/jest_dy",
// Automatically clear mock calls and instances between every test
clearMocks: true,
// Indicates whether the coverage information should be collected while executing the test
// collectCoverage: false,
// An array of glob patterns indicating a set of files for which coverage information should be collected
// collectCoverageFrom: undefined,
// The directory where Jest should output its coverage files
// coverageDirectory: undefined,
// An array of regexp pattern strings used to skip coverage collection
// coveragePathIgnorePatterns: [
// "/node_modules/"
// ],
// Indicates which provider should be used to instrument code for coverage
coverageProvider: "v8",
// A list of reporter names that Jest uses when writing coverage reports
// coverageReporters: [
// "json",
// "text",
// "lcov",
// "clover"
// ],
// An object that configures minimum threshold enforcement for coverage results
// coverageThreshold: undefined,
// A path to a custom dependency extractor
// dependencyExtractor: undefined,
// Make calling deprecated APIs throw helpful error messages
// errorOnDeprecated: false,
// Force coverage collection from ignored files using an array of glob patterns
// forceCoverageMatch: [],
// A path to a module which exports an async function that is triggered once before all test suites
// globalSetup: undefined,
// A path to a module which exports an async function that is triggered once after all test suites
// globalTeardown: undefined,
// A set of global variables that need to be available in all test environments
// globals: {},
// The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers.
// maxWorkers: "50%",
// An array of directory names to be searched recursively up from the requiring module's location
// moduleDirectories: [
// "node_modules"
// ],
// An array of file extensions your modules use
moduleFileExtensions: ["js", "json", "vue"],
// A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module
moduleNameMapper: {
"@/(.*)$": "<rootDir>/src/$1"
},
// An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
// modulePathIgnorePatterns: [],
// Activates notifications for test results
// notify: false,
// An enum that specifies notification mode. Requires { notify: true }
// notifyMode: "failure-change",
// A preset that is used as a base for Jest's configuration
// preset: undefined,
// Run tests from one or more projects
// projects: undefined,
// Use this configuration option to add custom reporters to Jest
// reporters: undefined,
// Automatically reset mock state between every test
// resetMocks: false,
// Reset the module registry before running each individual test
// resetModules: false,
// A path to a custom resolver
// resolver: undefined,
// Automatically restore mock state between every test
// restoreMocks: false,
// The root directory that Jest should scan for tests and modules within
// rootDir: undefined,
// A list of paths to directories that Jest should use to search for files in
// roots: [
// "<rootDir>"
// ],
// Allows you to use a custom runner instead of Jest's default test runner
// runner: "jest-runner",
// The paths to modules that run some code to configure or set up the testing environment before each test
// setupFiles: [],
// A list of paths to modules that run some code to configure or set up the testing framework before each test
// setupFilesAfterEnv: [],
// The number of seconds after which a test is considered as slow and reported as such in the results.
// slowTestThreshold: 5,
// A list of paths to snapshot serializer modules Jest should use for snapshot testing
// snapshotSerializers: [],
// The test environment that will be used for testing
testEnvironment: "jsdom",
// Options that will be passed to the testEnvironment
// testEnvironmentOptions: {},
// Adds a location field to test results
// testLocationInResults: false,
// The glob patterns Jest uses to detect test files
// testMatch: [
// "**/__tests__/**/*.[jt]s?(x)",
// "**/?(*.)+(spec|test).[tj]s?(x)"
// ],
// An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
// testPathIgnorePatterns: [
// "/node_modules/"
// ],
// The regexp pattern or array of patterns that Jest uses to detect test files
// testRegex: [],
// This option allows the use of a custom results processor
// testResultsProcessor: undefined,
// This option allows use of a custom test runner
// testRunner: "jest-circus/runner",
// This option sets the URL for the jsdom environment. It is reflected in properties such as location.href
// testURL: "http://localhost",
// Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"
// timers: "real",
// A map from regular expressions to paths to transformers
transform: {
"^.+\\.vue$": "vue3-jest",
"^.+\\.js$": "babel-jest"
}
// An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
// transformIgnorePatterns: [
// "/node_modules/",
// "\\.pnp\\.[^\\/]+$"
// ],
// An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
// unmockedModulePathPatterns: undefined,
// Indicates whether each individual test should be reported during the run
// verbose: undefined,
// An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
// watchPathIgnorePatterns: [],
// Whether to use watchman for file crawling
// watchman: true,
};
...@@ -7300,9 +7300,15 @@ ...@@ -7300,9 +7300,15 @@
"dev": true "dev": true
}, },
"node_modules/dayjs": { "node_modules/dayjs": {
<<<<<<< HEAD
"version": "1.10.6", "version": "1.10.6",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz",
"integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw=="
=======
"version": "1.10.5",
"resolved": "https://registry.nlark.com/dayjs/download/dayjs-1.10.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdayjs%2Fdownload%2Fdayjs-1.10.5.tgz",
"integrity": "sha1-VgDfRUj8JFOz8WPrsqu+llzPuYY="
>>>>>>> master
}, },
"node_modules/deasync": { "node_modules/deasync": {
"version": "0.1.21", "version": "0.1.21",
...@@ -23989,17 +23995,6 @@ ...@@ -23989,17 +23995,6 @@
"color-convert": "^2.0.1" "color-convert": "^2.0.1"
} }
}, },
"chalk": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"cliui": { "cliui": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npm.taobao.org/cliui/download/cliui-6.0.0.tgz", "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-6.0.0.tgz",
...@@ -24035,25 +24030,6 @@ ...@@ -24035,25 +24030,6 @@
"ms": "2.1.2" "ms": "2.1.2"
} }
}, },
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"ms": { "ms": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1607433988749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1607433988749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz",
...@@ -24069,28 +24045,6 @@ ...@@ -24069,28 +24045,6 @@
"minipass": "^3.1.1" "minipass": "^3.1.1"
} }
}, },
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.2.0",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.2.0.tgz",
"integrity": "sha512-TitGhqSQ61RJljMmhIGvfWzJ2zk9m1Qug049Ugml6QP3t0e95o0XJjk29roNEiPKJQBEi8Ord5hFuSuELzSp8Q==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
}
},
"wrap-ansi": { "wrap-ansi": {
"version": "6.2.0", "version": "6.2.0",
"resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz", "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz",
...@@ -37998,6 +37952,87 @@ ...@@ -37998,6 +37952,87 @@
} }
} }
}, },
"vue-loader-v16": {
"version": "npm:vue-loader@16.3.3",
"resolved": "https://registry.nlark.com/vue-loader/download/vue-loader-16.3.3.tgz?cache=0&sync_timestamp=1626830452707&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-loader%2Fdownload%2Fvue-loader-16.3.3.tgz",
"integrity": "sha1-5EDk6xJ4bhYTi12YthIgjynd9TI=",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1618995547052&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz",
"integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.1",
"resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.1.tgz?cache=0&sync_timestamp=1618995354302&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.1.tgz",
"integrity": "sha1-yAs/qyi/Y3HmhjMl7uZ+YYt35q0=",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
"integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
"integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz",
"integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz",
"integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703400240&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
"integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-router": { "vue-router": {
"version": "4.0.8", "version": "4.0.8",
"resolved": "https://registry.nlark.com/vue-router/download/vue-router-4.0.8.tgz", "resolved": "https://registry.nlark.com/vue-router/download/vue-router-4.0.8.tgz",
...@@ -19,5 +19,7 @@ module.exports = { ...@@ -19,5 +19,7 @@ module.exports = {
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],
ACTIVITY_URI: API_INTERNAL_URI[env] ACTIVITY_URI: API_INTERNAL_URI[env],
WITHDRAWAL_URI: API_INTERNAL_URI[env],
GROUPMEAL_URI: API_INTERNAL_URI[env],
}; };
const GROUPMEAL_URI = require("../config.js").GROUPMEAL_URI;
const req = require("../utils/request").httpReq;
// 获取订单管理列表
exports.getOrderList = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/order_list`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 获取主页配送列表
exports.getList = async ctx => {
const opts = {
url: `${GROUPMEAL_URI}/order/deliverer/list_day_deliverer_conf`,
method: "POST",
json: true,
body: ctx.request.body
};
ctx.body = await req(ctx, opts);
};
// 获取配送列表
exports.getDelivererList = async ctx => {
const opts = {
url: `${GROUPMEAL_URI}/order/deliverer/list_day_deliverer`,
method: "POST",
json: true,
body: ctx.request.body
};
ctx.body = await req(ctx, opts);
};
// 添加骑手
exports.getAddDeliverer = async ctx => {
const opts = {
url: `${GROUPMEAL_URI}/order/deliverer/add_deliverer`,
method: "POST",
json: true,
body: ctx.request.body
};
ctx.body = await req(ctx, opts);
};
// 分配骑手
exports.getSaveDeliverer = async ctx => {
const opts = {
url: `${GROUPMEAL_URI}/order/deliverer/save_day_deliverer`,
method: "POST",
json: true,
body: ctx.request.body
};
ctx.body = await req(ctx, opts);
};
// 获取活动名称
exports.getMarketingList = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/marketing_list`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 获取商品名称
exports.getGoodsList = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/goods_list`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 获取自提点
exports.getSubShopList = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/sub_shop_list`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 导出订单
exports.orderExport = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/order_export`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 打印订单
exports.orderPrint = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/order_print`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 订单退款列表
exports.orderItemList = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/order_item_list`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 订单退款列表
exports.orderRefund = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/order_refund`;
const opts = {
url,
method: "POST",
json: true,
body: ctx.request.body
};
ctx.body = await req(ctx, opts);
};
// 订单驳回
exports.orderRefundReject = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/order_refund_reject`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
...@@ -9,7 +9,7 @@ exports.getUserPermission = async (ctx) => { ...@@ -9,7 +9,7 @@ exports.getUserPermission = async (ctx) => {
url, url,
method: "GET", method: "GET",
qs: { qs: {
//user_email: "jianghaiming@126.com" // user_email: "jianghaiming@126.com"
user_email: user user_email: user
} }
}; };
......
const WITHDRAWAL_URI = require("../config").WITHDRAWAL_URI;
const req = require("../utils/request").httpReq;
// const controller_utils = require('./utils')
/**
* 示例
* exports.方法名 = async ctx => {
* const url = `${设置好的域名}/向服务端发送的请求地址`;
* const opts = {
* url,
* method:"发送什么请求",
* qs: ctx.request.query (get请求的参数)
* body:ctx.request.body (post请求的参数)
* json:boolean (是否转换为json)
* };
* ctx.body = await req(ctx,opts); 将发送请求后的数据传递给前端页面
* };
*/
// 获取提现审核列表
exports.getApplyList = async ctx => {
const url = `${WITHDRAWAL_URI}/wallet/background/apply_list`;
const opts = {
url,
method: "GET",
qs: ctx.request.query
};
ctx.body = await req(ctx, opts);
};
// 获取黑名单冻结账户
exports.getBlackList = async ctx => {
const url = `${WITHDRAWAL_URI}/wallet/background/blacklist`;
const opts = {
url,
method: "POST",
json: true,
body: ctx.request.body
};
ctx.body = await req(ctx, opts);
};
// 获取通过、拒绝订单审核
exports.getWithdrawAudit = async ctx => {
const url = `${WITHDRAWAL_URI}/wallet/background/withdraw_audit`;
const opts = {
url,
method: "POST",
json: true,
body: ctx.request.body,
timeout: 10000
}
ctx.body = await req(ctx, opts)
}
// 获取提现失败冻结
exports.getFreezingFund = async ctx => {
const url = `${WITHDRAWAL_URI}/wallet/background/back_freezing_fund`;
const opts = {
url,
method: "POST",
json: true,
body: ctx.request.body
}
ctx.body = await req(ctx, opts)
}
// 获取提现审核详情
exports.getApplyDetail = async ctx => {
const url = `${WITHDRAWAL_URI}/wallet/background/apply_detail`;
const opts = {
url,
method: "GET",
qs: ctx.request.query
}
ctx.body = await req(ctx, opts)
}
const getUserPermission = async (ctx) => {
const url = `${WITHDRAWAL_URI}/merchant/authority/get_role_list`;
const { email, op_cur_user } = ctx.request.query;
const user = email || op_cur_user;
const opts = {
url,
method: "GET",
qs: {
// user_email: "jianghaiming@126.com"
user_email: user
}
};
return await req(ctx, opts);
}
exports.getAll_role_list = async (ctx, next) => {
ctx.body = await getUserPermission(ctx);
}
\ No newline at end of file
...@@ -7,6 +7,8 @@ const role = require('./controllers/role') ...@@ -7,6 +7,8 @@ const role = require('./controllers/role')
const life = require('./controllers/life-no'); const life = require('./controllers/life-no');
const goods = require('./controllers/goods'); const goods = require('./controllers/goods');
const activity = require('./controllers/activity'); const activity = require('./controllers/activity');
const withdrawal = require('./controllers/withdrawal');
const groupmeal = require('./controllers/groupmeal');
const router = Router(); const router = Router();
const API_VERSION = "/api/v1"; const API_VERSION = "/api/v1";
...@@ -82,5 +84,29 @@ router.post(`${API_VERSION}/marketing/background/marketing_info`, activity.marke ...@@ -82,5 +84,29 @@ router.post(`${API_VERSION}/marketing/background/marketing_info`, activity.marke
router.post(`${API_VERSION}/marketing/background/update_marketing`, activity.updateMarketing); router.post(`${API_VERSION}/marketing/background/update_marketing`, activity.updateMarketing);
// 团餐运营--配送
router.post(`${API_VERSION}/order/deliverer/list_day_deliverer_conf`, groupmeal.getList)
router.post(`${API_VERSION}/order/deliverer/list_day_deliverer`, groupmeal.getDelivererList)
router.post(`${API_VERSION}/order/deliverer/add_deliverer`, groupmeal.getAddDeliverer)
router.post(`${API_VERSION}/order/deliverer/save_day_deliverer`, groupmeal.getSaveDeliverer)
// 订单管理
router.get(`${API_VERSION}/order/background/order_list`, groupmeal.getOrderList);
router.get(`${API_VERSION}/order/background/marketing_list`, groupmeal.getMarketingList);
router.get(`${API_VERSION}/order/background/goods_list`, groupmeal.getGoodsList);
router.get(`${API_VERSION}/order/background/sub_shop_list`, groupmeal.getSubShopList);
router.get(`${API_VERSION}/order/background/order_export`, groupmeal.orderExport);
router.get(`${API_VERSION}/order/background/order_export`, groupmeal.orderExport);
router.get(`${API_VERSION}/order/background/order_print`, groupmeal.orderPrint);
router.get(`${API_VERSION}/order/background/order_item_list`, groupmeal.orderItemList);
router.get(`${API_VERSION}/order/background/order_refund_reject`, groupmeal.orderRefundReject);
router.post(`${API_VERSION}/order/background/order_refund`, groupmeal.orderRefund);
// 钱包提现审核 wallet/background/apply_detail
router.get(`${API_VERSION}/get_withdrawal_apply_list`, withdrawal.getApplyList)
router.post(`${API_VERSION}/get_withdrawal_black_list`, withdrawal.getBlackList)
router.post(`${API_VERSION}/get_withdraw_audit`, withdrawal.getWithdrawAudit)
router.post(`${API_VERSION}/get_freezing_fund`, withdrawal.getFreezingFund)
router.get(`${API_VERSION}/get_apply_detail`, withdrawal.getApplyDetail)
module.exports = router; module.exports = router;
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;
opts.timeout = 10000;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
var time_start = +new Date(); var time_start = +new Date();
......
...@@ -14,13 +14,17 @@ import { fetchCurrentUser } from "./service/user"; ...@@ -14,13 +14,17 @@ import { fetchCurrentUser } from "./service/user";
import { redirectToLogin } from "./utils/util"; import { redirectToLogin } from "./utils/util";
export default { export default {
async mounted() { async created() {
console.log("master debug 2 !!!!!!"); console.log("master debug 2 !!!!!!");
if (this.$store.state.permissions && this.$store.state.userInfo) return; if (this.$store.state.permissions && this.$store.state.userInfo) return;
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);
this.$store.dispatch("updateUserPermission", { email: user.email }); this.$store.dispatch("updateUserPermission", { email: user.email });
// 无奈之举,后期需要重构到提现管理中
this.$store.dispatch("fetchPermission", {
appId: "merchant-op-auditing",
});
} else { } else {
redirectToLogin(); redirectToLogin();
} }
......
...@@ -24,7 +24,7 @@ export default { ...@@ -24,7 +24,7 @@ export default {
}, },
data () { data () {
return { return {
currentPage: 5 currentPage: 1
} }
}, },
methods: { methods: {
......
<template>
<div class="user-detail">
<el-page-header @back="goBack" content="角色详情页面"> </el-page-header>
<el-card class="management">
<h5 style="margin-bottom: 10px">角色信息</h5>
<el-descriptions class="margin-top" :column="2" border>
<el-descriptions-item>
<template #label> ID </template>
{{ roleId }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 角色状态 </template>
{{
role_info_detail.role_status == 1
? "正常"
: role_info_detail.role_status == 2
? "禁用"
: "删除"
}}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 角色名称 </template>
{{ role_info_detail.role_name }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 创建人账号 </template>
{{ role_info_detail.create_user_name }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 创建时间 </template>
{{ role_info_detail.create_time }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 最后修改人账号 </template>
{{ role_info_detail.update_user_name }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 最后修改时间 </template>
{{ role_info_detail.update_time }}
</el-descriptions-item>
</el-descriptions>
<div class="tree" v-if="selectedOptions">
<h5 style="margin-bottom: 10px">角色范围</h5>
<div>
<el-cascader
v-model="selectedOptions"
:options="permissionsAll"
placeholder="暂无数据"
disabled
:props="props"
style="width: 300px"
></el-cascader>
</div>
</div>
<div v-if="role_info_detail.role_account_list.length">
<h5 style="margin: 10px 0">角色账号</h5>
<div class="roleList">
<div
class="role_account_list"
v-for="(item, index) in role_info_detail.role_account_list"
:key="index"
>
{{ item }}
</div>
</div>
</div>
</el-card>
</div>
</template>
<script>
import {
get_role_info as reqGet_role_info,
getAll_role_list as reqGetAll_role_list,
} from "../../service/role";
export default {
name: "RoleDetail",
props: ["appId"],
data() {
return {
roleId: this.$route.query.roleId,
props: {
multiple: true, //设置为多选
value: "id", //value值和哪个值绑定
label: "desc", //label值和哪个值绑定
children: "sub_permissions", //children值和哪个值绑定
},
selectedOptions: [],
permissionsAll: [],
role_info_detail: {
//详情非编辑项
role_id: "",
role_name: "",
role_status: "",
update_time: "",
update_user_name: "",
create_time: "",
create_user_name: "",
role_account_list: [],
},
};
},
mounted() {
this.roleId = this.$route.query.roleId;
let { email } = this.$store.state.userInfo;
reqGetAll_role_list(email, this.appId).then((res) => {
this.permissionsAll = res.permissions;
});
reqGet_role_info(this.roleId, this.appId).then((res) => {
const {
role_name,
role_status,
update_time,
update_user_name,
create_time,
create_user_name,
role_account_list,
permissions,
} = res.result;
this.role_info_detail = {
role_name,
role_status,
update_time,
update_user_name,
create_time,
create_user_name,
role_account_list,
};
this.editEchoData(permissions);
});
},
methods: {
goBack() {
this.$router.back(-1);
},
//遍历回显值selectedOptions
editEchoData(permissions) {
let selectData = [];
permissions.map((item) => {
let one = { id: item.id };
if (item.sub_permissions) {
item.sub_permissions.map((info) => {
let selectId = [one.id, info.id];
selectData.push(selectId);
});
}
});
this.selectedOptions = selectData;
},
},
};
</script>
<style lang="less" scoped>
.user-detail {
margin: 50px;
.role_account_list {
padding: 10px;
color: #909399;
background: #fafafa;
font-weight: 400;
line-height: 1.5;
}
.management {
margin-top: 20px;
}
.roleList {
max-height: 300px;
overflow-y: scroll;
}
.tree {
// border: 1px solid #ebeef5;
margin-top: 20px;
}
}
</style>
<template>
<el-card class="role_management">
<!-- 角色检索区域 -->
<div class="creatRole">
<el-form inline :model="searchForm">
<el-form-item label="角色名称">
<el-input v-model="searchForm.roleName"></el-input>
</el-form-item>
<el-form-item label="状态">
<el-select
v-model="searchForm.roleStatus"
placeholder="请选择角色状态"
>
<el-option label="正常" :value="1"></el-option>
<el-option label="禁用" :value="2"></el-option>
<el-option label="删除" :value="3"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSearchSubmit">查询</el-button>
<el-button @click="onReset">重置</el-button>
</el-form-item>
</el-form>
<el-form>
<el-form-item>
<el-button
type="primary"
:disabled="!permission.get('create')"
@click="onCreateRole"
>创建角色</el-button
>
</el-form-item>
</el-form>
</div>
<!-- 角色搜索列表 -->
<el-table border :data="managementList">
<el-table-column
label="ID"
width="200px"
prop="role_id"
align="center"
></el-table-column>
<el-table-column
label="角色名称"
prop="role_name"
align="center"
></el-table-column>
<el-table-column
label="状态"
width="200px"
:formatter="hasStatusFormat"
align="center"
>
</el-table-column>
<el-table-column
label="最后修改日期"
prop="update_time"
align="center"
></el-table-column>
<el-table-column
label="最后修改人账号"
prop="update_user_name"
align="center"
></el-table-column>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
:disabled="
!permission.get('edit') ||
scope.row.role_status == 2 ||
scope.row.role_status == 3
"
@click.stop="handelModify(scope.row)"
type="text"
size="mini"
>修改</el-button
>
<el-button
:disabled="!permission.get('delete')"
@click.stop="handelDelete(scope.row)"
size="mini"
type="text"
>删除</el-button
>
<el-button
:disabled="!permission.get('disable')"
@click.stop="handelDisable(scope.row)"
size="mini"
type="text"
>禁用</el-button
>
<el-button
:disabled="!permission.get('enable')"
@click.stop="handelEnable(scope.row)"
size="mini"
type="text"
>启用</el-button
>
<el-button
@click.stop="toRoleDetail(scope.row)"
size="mini"
type="text"
>查看详情</el-button
>
</template>
</el-table-column>
</el-table>
<page :totalNum="totalNum" @update="update" />
</el-card>
<el-dialog :title="roleTitle" v-model="dialogVisible">
<el-form>
<!-- 新增 -->
<el-form-item label="角色名称" :label-width="formLabelWidth">
<el-input v-model="roleName" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="角色范围" :label-width="formLabelWidth">
<el-cascader
v-model="selectedOptions"
:options="permissionsAll"
:props="props"
style="width: 280px"
@change="parentCateChange"
clearable
></el-cascader>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="confirm">确 定</el-button>
</span>
</template>
</el-dialog>
</template>
<script>
import page from "../Pagination";
import {
getRole_list as reqGetRole_list,
getAll_role_list as reqGetAll_role_list,
getUpdate_role as reqGetUpdate_role,
get_role_info as reqGet_role_info,
getDelete_role as reqGetDelete_role,
getAdd_role as reqGetAdd_role,
} from "../../service/role";
export default {
name: "RoleList",
props: ["appId", "detailPath", "rolePermissionId"],
components: {
page,
},
computed: {
permission() {
let rolePermissionId = this.rolePermissionId || "role";
let appId = this.appId || "";
const modulePermissions =
this.$store.getters.moduleSubPermissions(rolePermissionId, appId) || [];
return new Map(modulePermissions.map((ele) => [ele.name, true]));
},
},
data() {
return {
searchForm: {
roleName: "",
roleStatus: "",
},
formLabelWidth: "120px",
params: {
page: 1,
page_size: 20,
},
totalNum: null,
roleTitle: "",
roleName: "",
edit: true,
props: {
multiple: true, //设置为多选
value: "id", //value值和哪个值绑定
label: "desc", //label值和哪个值绑定
children: "sub_permissions", //children值和哪个值绑定
},
selectedOptions: [],
dialogVisible: false,
dialogText: "",
managementList: [],
role_info_detail: {
//详情非编辑项
role_id: "",
role_name: "",
},
permissionsAll: [],
currenPermissionsUpdate: [],
currentRolePrivilege: [],
};
},
beforeMount() {
this.getGetRole_list();
this.getPermissionsAll();
},
methods: {
hasStatusFormat(row) {
let statusText = ["正常", "禁用", "删除"];
return statusText[row.role_status - 1];
},
onCreateRole() {
this.roleTitle = "新增角色";
this.getPermissionsAll();
this.edit = false;
this.dialogVisible = true;
this.roleName = "";
this.selectedOptions = [];
// this.$router.push({ name: 'AddRole' });
},
toRoleDetail(row) {
this.$router.push({
path: this.detailPath,
query: { roleId: row.role_id },
});
},
getPermissionsAll() {
let { email } = this.$store.state.userInfo;
reqGetAll_role_list(email, this.appId).then((res) => {
this.permissionsAll = res.permissions;
});
},
//获取角色列表
getGetRole_list() {
let { page, page_size } = this.params;
let paramsRole_list = {
page,
page_size,
role_status: this.searchForm.roleStatus,
role_name: this.searchForm.roleName,
};
reqGetRole_list(paramsRole_list, this.appId).then((res) => {
this.managementList = res.result;
this.totalNum = res.count;
});
},
//查询
onSearchSubmit() {
this.getGetRole_list();
},
//重置
onReset() {
(this.searchForm.roleName = ""), (this.searchForm.roleStatus = "");
this.getGetRole_list();
},
//列表分页
update(obj) {
Object.assign(this.params, obj);
let { page, page_size } = this.params;
this.getGetRole_list(page, page_size);
},
//弹框提示
openBounced(type, role_id) {
this.$confirm(`${this.dialogText}是否继续?`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
if (type === "disable") {
this.getRole_info_detail("disable", role_id);
} else {
this.delete(role_id);
}
})
.catch(() => {
this.$message({
type: "info",
message: "已取消",
});
});
},
//删除
delete(role_id) {
reqGetDelete_role(role_id, this.appId).then((res) => {
if (res.status == "success") this.getGetRole_list();
});
},
//角色详情数据
getRole_info_detail(type, role_id) {
reqGet_role_info(role_id, this.appId).then((res) => {
const { role_id, role_name, permissions } = res.result;
this.role_info_detail = {
role_id,
role_name,
};
this.roleName = role_name;
// this.permissionsUpdate = permissions
let role_status;
if (type === "disable") {
role_status = 2;
} else if (type === "enable") {
role_status = 1;
} else if (type === "modify") {
this.currentRolePrivilege = permissions;
this.editEchoData(permissions);
} else {
role_status = "";
}
if (type !== "modify") {
this.getUpdate_role(role_name, role_id, role_status, permissions);
}
});
},
//遍历回显值selectedOptions
editEchoData(permissions) {
let selectData = [];
permissions.map((item) => {
let one = { id: item.id };
if (item.sub_permissions) {
item.sub_permissions.map((info) => {
let selectId = [one.id, info.id];
selectData.push(selectId);
});
}
});
this.selectedOptions = selectData;
},
//启用
handelEnable(row) {
if (row.role_status == 1) {
this.$message({
type: "info",
message: "该条数据已启用",
});
return false;
}
this.getRole_info_detail("enable", row.role_id);
},
//禁用
handelDisable(row) {
if (row.role_status == 2) {
this.$message({
type: "info",
message: "该条数据已禁用",
});
return false;
}
this.dialogText = "禁用拥有此角色用户将受影响";
this.openBounced("disable", row.role_id);
},
//编辑列表操作
getUpdate_role(role_name, role_id, role_status, permissions) {
let paramsUpdate_role = {
role_name: role_name,
role_id,
role_status,
permissions,
};
reqGetUpdate_role(paramsUpdate_role, this.appId).then((res) => {
if (res.status === "success") {
this.dialogVisible = false;
this.getGetRole_list();
} else {
this.dialogVisible = false;
this.$message({
type: "info",
message: `${res.reason}`,
});
}
});
},
//删除
handelDelete(row) {
this.dialogText = "删除后不可恢复,拥有此角色用户将受影响";
this.openBounced("del", row.role_id);
},
//修改
async handelModify(row) {
this.edit = true;
this.roleTitle = "修改角色";
await this.getPermissionsAll();
this.dialogVisible = true;
this.getRole_info_detail("modify", row.role_id);
},
//确认修改
confirm() {
let checkRolePrivilege = [];
this.edit
? (checkRolePrivilege = this.currentRolePrivilege)
: (checkRolePrivilege = this.currenPermissionsUpdate);
if (!(this.roleName && checkRolePrivilege.length > 0)) {
this.$message({
type: "error",
message: "请完善信息",
});
return false;
}
if (this.edit) {
this.getEditRole();
} else {
this.getAdd_role();
}
},
//编辑提交的数据
getEditRole() {
let { role_id } = this.role_info_detail;
let role_status = "";
this.getUpdate_role(
this.roleName,
role_id,
role_status,
this.currentRolePrivilege
);
},
//新增角色
getAdd_role() {
let paramsAdd_role = {
role_name: this.roleName,
permissions: this.currenPermissionsUpdate,
};
reqGetAdd_role(paramsAdd_role, this.appId).then((res) => {
this.dialogVisible = false;
if (res.status === "success") {
this.getGetRole_list();
} else {
this.$message({
type: "info",
message: `${res.reason}`,
});
}
});
},
parentCateChange(id) {
this.getSelectedOptions(id);
},
getSelectedOptions(selectedOptions) {
let oldDataRule = [];
selectedOptions.forEach((el) => {
let oldObj = {
id: el[0],
sub_permissions: [],
};
let btnObj = {
id: el[1],
};
oldObj.sub_permissions.push(btnObj);
oldDataRule.push(oldObj);
});
let newData = [];
let newObj = {};
oldDataRule.forEach((el, i) => {
if (!newObj[el.id]) {
newData.push(el);
newObj[el.id] = true;
} else {
newData.forEach((el) => {
if (el.id === oldDataRule[i].id) {
el.sub_permissions = [
...el.sub_permissions,
...oldDataRule[i].sub_permissions,
];
}
});
}
});
this.currentRolePrivilege = newData;
this.currenPermissionsUpdate = newData;
},
},
};
</script>
<style lang="less" scoped>
.creatRole {
display: flex;
justify-content: space-between;
}
.role_management {
padding: 20px;
}
.role_management .el-button {
margin: 0 2px;
}
</style>
<template>
<div class="user-container">
<el-dialog title="编辑用户" v-model="modalVisable" :before-close="cancel">
<el-form :model="userInfo">
<el-form-item label="用户ID" :label-width="formLabelWidth">
<el-input
class="form-val"
v-model="userInfo.user_id"
size="medium"
disabled
></el-input>
</el-form-item>
<el-form-item label="状态" :label-width="formLabelWidth">
<!-- <el-input class="form-val">{{data.user_status===1?'启用':'禁用'}}</el-input> -->
<el-switch
class="form-val"
v-model="userInfo.user_status"
active-value="1"
inactive-value="2"
active-text="启用"
inactive-text="禁用"
>
</el-switch>
</el-form-item>
<el-form-item label="姓名" :label-width="formLabelWidth">
<el-input
class="form-val"
v-model="userInfo.user_name"
disabled
></el-input>
</el-form-item>
<el-form-item label="邮箱" :label-width="formLabelWidth" required>
<el-input
class="form-val"
v-model="userInfo.user_email"
disabled
></el-input>
</el-form-item>
<el-form-item label="手机号" :label-width="formLabelWidth">
<el-input class="form-val" v-model="userInfo.user_mobile"></el-input>
</el-form-item>
<el-form-item label="所属组织" :label-width="formLabelWidth">
<el-input
class="form-val"
v-model="userInfo.organization"
disabled
></el-input>
</el-form-item>
<el-form-item
label="授权角色信息"
:label-width="formLabelWidth"
required
>
<el-select
v-model="userInfo.roles"
multiple
placeholder="请选择"
class="form-val"
>
<el-option
v-for="item in roles"
:key="item.role_id"
:label="item.role_name"
:value="item.role_id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="敏感词权限" :label-width="formLabelWidth">
<el-switch
v-model="userInfo.is_sensitive_authority"
class="form-val"
active-value="1"
inactive-value="2"
active-text="开启"
inactive-text="关闭"
>
</el-switch>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="cancel">取 消</el-button>
<el-button type="primary" @click="confirm">确 定</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import { ElMessage } from "element-plus";
import { getRole_list as reqGetRoles } from "@/service/role";
export default {
name: "UserInfoEditModal",
props: {
data: Object,
visable: {
type: Boolean,
default: false
},
appId: String
},
data() {
return {
formLabelWidth: "120px",
userInfo: {},
roles: [],
modalVisable: false
};
},
watch: {
data(val) {
this.userInfo = JSON.parse(JSON.stringify(val));
this.userInfo.roles = val.roles.map(ele => ele.role_id);
this.userInfo.user_status = val.user_status.toString();
this.userInfo.is_sensitive_authority = val.is_sensitive_authority.toString();
},
visable(val) {
this.modalVisable = val;
}
},
beforeMount() {
this.getRoles();
},
methods: {
async getRoles() {
const { code, result } = await reqGetRoles(
{ page_size: 2000, page: 1 },
this.appId
);
if (code !== 0) {
ElMessage.error("获取角色列表出错!");
return;
}
this.roles = result;
},
confirm() {
const checkConditions = {
user_email: {
check: val => val.trim() !== "",
tip: "请输入邮箱!"
},
roles: {
check: val => val.length !== 0,
tip: "请添加角色!"
}
};
const keys = Object.keys(checkConditions);
for (let i = 0; i < keys.length; i++) {
const field = keys[i];
if (!checkConditions[field].check(this.userInfo[field])) {
ElMessage.error(checkConditions[field].tip);
return;
}
}
this.$emit("confirm", this.userInfo);
},
cancel() {
this.$emit("cancel");
}
}
};
</script>
<style lang="less">
.form-val {
margin-left: 20px;
width: 300px;
}
.form-val.el-input {
width: 80%;
}
</style>
<template>
<div class="user-container">
<el-dialog :title="title" v-model="modalVisable" :before-close="cancel">
<el-form :model="data">
<el-form-item label="用户ID" :label-width="formLabelWidth">
<text class="form-val">{{ data.user_id }}</text>
</el-form-item>
<el-form-item label="状态" :label-width="formLabelWidth">
<text class="form-val">{{
data.user_status == 1 ? "启用" : "禁用"
}}</text>
</el-form-item>
<el-form-item label="姓名" :label-width="formLabelWidth">
<text class="form-val">{{ data.user_name }}</text>
</el-form-item>
<el-form-item label="账号" :label-width="formLabelWidth">
<text class="form-val">{{ data.user_email }}</text>
</el-form-item>
<el-form-item label="手机号" :label-width="formLabelWidth">
<text class="form-val">{{ data.user_mobile }}</text>
</el-form-item>
<el-form-item label="所属组织" :label-width="formLabelWidth">
<text class="form-val">{{ data.organization }}</text>
</el-form-item>
<el-form-item label="添加账号人" :label-width="formLabelWidth">
<text class="form-val">{{ data.create_user_name }}</text>
</el-form-item>
<el-form-item label="添加时间" :label-width="formLabelWidth">
<text class="form-val">{{ data.create_time }}</text>
</el-form-item>
<el-form-item label="最后修改人账号" :label-width="formLabelWidth">
<text class="form-val">{{ data.update_user_name }}</text>
</el-form-item>
<el-form-item label="最后修改时间" :label-width="formLabelWidth">
<text class="form-val">{{ data.update_time }}</text>
</el-form-item>
<el-form-item label="授权角色信息" :label-width="formLabelWidth">
<text class="form-val">{{
data.roles.map(ele => ele.role_name).join(",")
}}</text>
</el-form-item>
<el-form-item label="敏感词权限" :label-width="formLabelWidth">
<text class="form-val">{{
data.is_sensitive_authority === 1 ? "是" : "否"
}}</text>
</el-form-item>
</el-form>
</el-dialog>
</div>
</template>
<script>
export default {
name: "UserInfoModal",
props: {
mode: {
type: String,
default: "check"
},
data: Object,
title: {
type: String,
default: "用户信息"
},
visable: {
type: Boolean,
default: false
}
},
data() {
return {
formLabelWidth: "180px",
modalVisable: false
};
},
watch: {
visable(val) {
this.modalVisable = val;
}
},
methods: {
cancel: function() {
this.$emit("cancel");
}
}
};
</script>
<style lang="less">
.form-val {
margin-left: 20px;
}
</style>
<template>
<div class="user-container">
<el-dialog title="创建用户" v-model="modalVisable" :before-close="cancel">
<el-form :model="userInfo">
<el-form-item label="状态" :label-width="formLabelWidth">
<!-- <el-input class="form-val">{{data.user_status===1?'启用':'禁用'}}</el-input> -->
<el-switch
class="form-val"
v-model="userInfo.user_status"
active-value="1"
inactive-value="2"
active-text="启用"
inactive-text="禁用"
>
</el-switch>
</el-form-item>
<el-form-item label="姓名" :label-width="formLabelWidth">
<el-input class="form-val" v-model="userInfo.user_name"></el-input>
</el-form-item>
<el-form-item label="邮箱" :label-width="formLabelWidth" required>
<el-input class="form-val" v-model="userInfo.user_email"></el-input>
</el-form-item>
<el-form-item label="手机号" :label-width="formLabelWidth">
<el-input class="form-val" v-model="userInfo.user_mobile"></el-input>
</el-form-item>
<el-form-item label="所属组织" :label-width="formLabelWidth">
<el-input class="form-val" v-model="userInfo.organization"></el-input>
</el-form-item>
<el-form-item label="授权角色" :label-width="formLabelWidth" required>
<el-select
v-model="userInfo.roles"
multiple
placeholder="请选择"
class="form-val"
>
<el-option
v-for="item in roles"
:key="item.role_id"
:label="item.role_name"
:value="item.role_id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="敏感词权限" :label-width="formLabelWidth">
<el-switch
v-model="userInfo.is_sensitive_authority"
class="form-val"
active-value="1"
inactive-value="2"
active-text="开启"
inactive-text="关闭"
>
</el-switch>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="cancel">取 消</el-button>
<el-button type="primary" @click="confirm">确 定</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import { ElMessage } from "element-plus";
import { getRole_list as reqGetRoles } from "@/service/role";
export default {
name: "UserInfoEditModal",
props: {
visable: {
type: Boolean,
default: false
},
appId: String
},
data() {
return {
formLabelWidth: "120px",
userInfo: {
user_name: "",
user_email: "",
is_sensitive_authority: "0",
user_mobile: "",
roles: [],
user_status: "1",
organization: ""
},
roles: [],
modalVisable: false
};
},
watch: {
visable(val) {
this.modalVisable = val;
if (val) {
this.userInfo = {
user_name: "",
user_email: "",
is_sensitive_authority: "0",
user_mobile: "",
roles: [],
user_status: "1",
organization: ""
};
}
}
},
beforeMount() {
this.getRoles();
},
methods: {
async getRoles() {
const { code, result } = await reqGetRoles(
{ page_size: 2000, page: 1 },
this.appId
);
if (code !== 0) {
ElMessage.error("获取角色列表出错!");
return;
}
this.roles = result;
},
confirm() {
const checkConditions = {
user_email: {
check: val => val.trim() !== "",
tip: "请输入邮箱!"
},
roles: {
check: val => val.length !== 0,
tip: "请添加角色!"
}
};
const keys = Object.keys(checkConditions);
for (let i = 0; i < keys.length; i++) {
const field = keys[i];
if (!checkConditions[field].check(this.userInfo[field])) {
ElMessage.error(checkConditions[field].tip);
return;
}
}
this.$emit("confirm", this.userInfo);
},
cancel() {
this.$emit("cancel");
}
}
};
</script>
<style lang="less">
.form-val {
margin-left: 20px;
width: 300px;
}
.form-val.el-input {
width: 80%;
}
</style>
<template>
<div class="user">
<el-form :inline="true" :model="pageParams" class="demo-form-inline">
<el-form-item label="用户姓名">
<el-input
maxlength="15"
v-model="pageParams.user_name"
placeholder="用户姓名"
></el-input>
</el-form-item>
<el-form-item label="用户账号">
<el-input
v-model="pageParams.user_email"
placeholder="用户账号"
></el-input>
</el-form-item>
<el-form-item label="手机号">
<el-input
v-model="pageParams.user_mobile"
placeholder="手机号"
></el-input>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="pageParams.user_status" placeholder="状态">
<el-option value="1" label="启用"></el-option>
<el-option value="2" label="禁用"></el-option>
</el-select>
</el-form-item>
<el-form-item class="func-btn">
<el-button type="primary" @click="getUserList">查询</el-button>
<el-button @click="onReset">重置</el-button>
<el-button @click="createUser" :disabled="!permission.get('create')"
>新建用户</el-button
>
</el-form-item>
</el-form>
<el-table :data="renderUserList" border style="width: 100%">
<el-table-column prop="user_id" label="用户ID" width="70">
</el-table-column>
<el-table-column prop="user_name" label="用户姓名"> </el-table-column>
<el-table-column prop="user_email" label="用户账号"> </el-table-column>
<el-table-column prop="user_status" label="状态"> </el-table-column>
<el-table-column prop="user_mobile" label="手机号"> </el-table-column>
<el-table-column prop="update_time" label="最后修改日期">
</el-table-column>
<el-table-column prop="update_user_name" label="最后修改人账号">
</el-table-column>
<el-table-column fixed="right" label="操作" width="140">
<template #default="scope">
<el-button type="text" size="small" @click="checkUser(scope.row)"
>查看</el-button
>
<el-button
@click="editUser(scope.row)"
type="text"
size="small"
:disabled="!permission.get('edit')"
>修改</el-button
>
<el-button
v-if="scope.row.user_status === '启用'"
type="text"
size="small"
@click="disableUser(scope.row)"
:disabled="!permission.get('enable')"
>禁用</el-button
>
<el-button
v-if="scope.row.user_status === '禁用'"
type="text"
size="small"
@click="enableUser(scope.row)"
:disabled="!permission.get('disable')"
>启用</el-button
>
</template>
</el-table-column>
</el-table>
<page
:totalNum="totalNum"
:pageSize="pageParams.size"
@update="updatePage"
/>
</div>
<user-info-modal
:data="curUserInfo"
:visable="modalVisable.info"
@cancel="cancelModal('info')"
:appId="appId"
></user-info-modal>
<user-info-edit-modal
:data="curUserInfo"
:visable="modalVisable.edit"
@confirm="confirmEditModal"
@cancel="cancelModal('edit')"
:appId="appId"
></user-info-edit-modal>
<user-info-new-modal
:visable="modalVisable.new"
@confirm="confirmEditModal"
@cancel="cancelModal('new')"
:appId="appId"
></user-info-new-modal>
</template>
<script>
import page from "@/components/Pagination";
import UserInfoModal from "./components/UserInfoModal";
import UserInfoEditModal from "./components/UserInfoEditModal";
import UserInfoNewModal from "./components/UserInfoNewModal";
import { ElMessage } from "element-plus";
import {
getUserList as reqGetUserList,
getUserDetail as reqGetUserDetail,
editUser as reqEditUser,
createUser as reqCreateUser,
} from "@/service/user";
export default {
name: "UserList",
props: ["appId", "userPermissionId"],
components: {
page,
UserInfoModal,
UserInfoEditModal,
UserInfoNewModal,
},
data() {
return {
pageParams: {
appid: this.appId,
page: 1,
size: 20,
user_name: "",
user_email: "",
user_mobile: "",
user_status: "",
},
totalNum: 0,
userList: [],
curUserInfo: {},
modalVisable: {
info: false,
edit: false,
new: false,
},
curOperateMode: "new",
};
},
computed: {
permission() {
const appId = this.appId || "";
const userPermissionId = this.userPermissionId || "user";
const modulePermissions =
this.$store.getters.moduleSubPermissions(userPermissionId, appId) || [];
console.log("Current page func-permissions:", modulePermissions);
return new Map(modulePermissions.map((ele) => [ele.name, true]));
},
renderUserList() {
const statusMap = new Map([
[1, "启用"],
[2, "禁用"],
[3, "删除"],
]);
return this.userList.map((ele) => {
ele.user_status = statusMap.get(ele.user_status);
return ele;
});
},
},
beforeMount() {
this.getUserList();
},
methods: {
async getUserList() {
const { code, result } = await reqGetUserList(this.pageParams);
if (code !== 0) {
ElMessage.error("获取用户列表出错!");
return;
}
const { data, count } = result;
this.totalNum = count;
this.userList = data;
},
async setCurUserInfo(user_id) {
const { code, result } = await reqGetUserDetail({
appid: this.appId,
user_id,
});
if (code === 0) {
this.curUserInfo = {
...result.user_info,
roles: result.role_list,
};
} else {
ElMessage.error("获取用户信息出错!");
}
},
async checkUser(row) {
const { user_id } = row;
await this.setCurUserInfo(user_id);
this.openModal("info");
},
async editUser(row) {
const { user_id } = row;
await this.setCurUserInfo(user_id);
// this.openModal('edit');
this.modalVisable.edit = true;
this.curOperateMode = "edit";
},
openModal(key) {
Object.keys(this.modalVisable).forEach((ele) => {
this.modalVisable[ele] = key === ele;
});
},
async confirmEditModal(userInfo) {
const {
user_id,
user_name,
user_email,
is_sensitive_authority,
user_mobile,
roles,
user_status,
organization,
} = userInfo;
let res = {};
if (this.curOperateMode === "edit") {
const editData = {
user_id,
user_name,
user_email,
is_sensitive_authority: parseInt(is_sensitive_authority),
user_mobile,
role_id: roles,
user_status: parseInt(user_status),
};
res = await reqEditUser(editData, this.appId);
} else if (this.curOperateMode === "new") {
const newData = {
user_name,
user_email,
is_sensitive_authority: parseInt(is_sensitive_authority),
user_mobile,
role_id: roles,
user_status: parseInt(user_status),
organization,
};
res = await reqCreateUser(newData, this.appId);
}
if (res.code === 0) {
this.cancelModal(this.curOperateMode);
ElMessage.success("更新成功!");
this.getUserList();
} else {
ElMessage.error(res.reason);
}
},
cancelModal(name) {
this.modalVisable[name] = false;
},
createUser() {
this.curOperateMode = "new";
this.openModal("new");
},
//重置
onReset() {
this.pageParams = {
appid: this.appId,
page: 1,
pageSize: 20,
user_name: "",
user_email: "",
user_mobile: "",
user_status: "",
};
this.getUserList();
},
updatePage({ page, pageSize }) {
page && (this.pageParams.page = page);
pageSize && (this.pageParams.pageSize = pageSize);
this.getUserList();
},
async enableUser(row) {
const { user_id } = row;
const { code, reason } = await reqEditUser(
{
user_status: 1,
user_id,
},
this.appId
);
if (code === 0) {
ElMessage.success("启用成功!");
this.getUserList();
} else {
ElMessage.error(reason);
}
},
async disableUser(row) {
const { user_id } = row;
const { code, reason } = await reqEditUser(
{
user_status: 2,
user_id,
},
this.appId
);
if (code === 0) {
ElMessage.success("禁用成功!");
this.getUserList();
} else {
ElMessage.error(reason);
}
},
},
};
</script>
<style lang="less" scoped>
.user {
padding: 50px;
.search_life {
width: 280px;
}
.func-btn {
float: right;
}
}
</style>
...@@ -54,10 +54,10 @@ export const PERMISSIONNAME_PAGEMODULE = (function () { ...@@ -54,10 +54,10 @@ export const PERMISSIONNAME_PAGEMODULE = (function () {
* router 用该配置做路由权限拦截。需要增加权限拦截的路由,需在此添加配置。 * router 用该配置做路由权限拦截。需要增加权限拦截的路由,需在此添加配置。
*/ */
export const PATH_PERMISSION_NAME = { export const PATH_PERMISSION_NAME = {
'/enterprise/certification': 'enterprise_certification_management', '/op/enterprise/certification': 'enterprise_certification_management',
'/enterprise/audit': 'enterprise_certification_management.audit', '/op/enterprise/audit': 'enterprise_certification_management.audit',
'/enterprise/establish': 'enterprise_certification_management.create', '/op/enterprise/establish': 'enterprise_certification_management.create',
'/lifeNo': 'life_official_account_management', '/op/lifeNo': 'life_official_account_management',
'/roleManageRole': 'role_management', '/op/roleManageRole': 'role_management',
'/user': 'user_management' '/op/user': 'user_management'
} }
\ No newline at end of file
<template> <template>
<div> <div>
<layout> 没有权限! </layout> 没有权限!
</div> </div>
</template> </template>
<script> <script>
import Layout from '@/layouts';
export default { export default {
components: {
Layout,
},
}; };
</script> </script>
......
.detail { .detail {
height: 100%; // height: 100%;
.state { .state {
display: flex; display: flex;
align-items: center; align-items: center;
......
...@@ -440,6 +440,7 @@ ...@@ -440,6 +440,7 @@
v-if="$route.params.operation === 'EDIT'" v-if="$route.params.operation === 'EDIT'"
v-model="goodsObj.rule_refund" v-model="goodsObj.rule_refund"
placeholder="请选择" placeholder="请选择"
:disabled="goodsObj.audit_status===1"
> >
<el-option <el-option
v-for="item in rulesForm.rulesOptions" v-for="item in rulesForm.rulesOptions"
...@@ -689,6 +690,12 @@ export default { ...@@ -689,6 +690,12 @@ export default {
this.optionsValue = [val.category_1_id, val.category_2_id]; this.optionsValue = [val.category_1_id, val.category_2_id];
this.rulesForm.useStartTime = this.formatDate(val.rule_start_time); this.rulesForm.useStartTime = this.formatDate(val.rule_start_time);
this.rulesForm.useEndTime = this.formatDate(val.rule_end_time); this.rulesForm.useEndTime = this.formatDate(val.rule_end_time);
console.log(val.original_price);
if (!val.original_price) {
this.$nextTick(() => {
this.goodsObj.original_price = "";
})
}
}, },
rejectVisible (val) { rejectVisible (val) {
if (!val) { if (!val) {
...@@ -1150,8 +1157,10 @@ export default { ...@@ -1150,8 +1157,10 @@ export default {
// 更改售价 // 更改售价
salePrice () { salePrice () {
if (this.goodsObj.price.length === 0) { if (!this.goodsObj.price) {
this.goodsObj.price = 0; this.$nextTick(() => {
this.goodsObj.price = "";
})
} }
const parseFloatValue = Number(this.goodsObj.price).toFixed(2); const parseFloatValue = Number(this.goodsObj.price).toFixed(2);
this.goodsObj.price = Number(parseFloatValue); this.goodsObj.price = Number(parseFloatValue);
...@@ -1159,7 +1168,7 @@ export default { ...@@ -1159,7 +1168,7 @@ export default {
typeof this.goodsObj.price === "number" && typeof this.goodsObj.price === "number" &&
isNaN(this.goodsObj.price) isNaN(this.goodsObj.price)
) { ) {
this.goodsObj.price = 0; this.goodsObj.price = "";
return this.$message.error("售价价格必须为数字"); return this.$message.error("售价价格必须为数字");
} }
}, },
...@@ -1266,15 +1275,18 @@ export default { ...@@ -1266,15 +1275,18 @@ export default {
if (!query.rule_refund) { if (!query.rule_refund) {
return this.$message.error("请填写退款规则"); return this.$message.error("请填写退款规则");
} }
if (query.original_price.length === 0) { if (query.original_price === "0") {
return this.$message.error("请填写原价(保留两位小数)"); return this.$message.error("原价价格不得为0");
} }
if (query.price.length === 0) { if (query.price.length === 0) {
return this.$message.error("请填写售价(保留两位小数)"); return this.$message.error("请填写售价(保留两位小数)");
} }
if (typeof query.original_price !== "number") { if (query.price == 0) {
return this.$message.error("原价价格必须为数字"); return this.$message.error("售价价格不得为0");
} }
// if (query.original_price && typeof query.original_price !== "number") {
// return this.$message.error("原价价格必须为数字");
// }
if (typeof query.price !== "number") { if (typeof query.price !== "number") {
return this.$message.error("售价价格必须为数字格式"); return this.$message.error("售价价格必须为数字格式");
} }
......
...@@ -205,7 +205,7 @@ ...@@ -205,7 +205,7 @@
label="金额计算方式:" label="金额计算方式:"
> >
<el-radio-group <el-radio-group
v-model="countType" v-model="ruleForm.commission_mode"
> >
<el-radio :label="2">按金额</el-radio> <el-radio :label="2">按金额</el-radio>
<el-radio :label="1">按比例</el-radio> <el-radio :label="1">按比例</el-radio>
...@@ -218,7 +218,7 @@ ...@@ -218,7 +218,7 @@
@input="changeValue($event, 'first_commission_value')" @input="changeValue($event, 'first_commission_value')"
:disabled="shopStart !== 0" :disabled="shopStart !== 0"
> >
<template #append>{{countType == 1? '%' : '¥'}}</template> <template #append>{{ruleForm.commission_mode == 1? '%' : '¥'}}</template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item label="分享者佣金: " prop="second_commission_value"> <el-form-item label="分享者佣金: " prop="second_commission_value">
...@@ -228,7 +228,7 @@ ...@@ -228,7 +228,7 @@
@input="changeValue($event, 'second_commission_value')" @input="changeValue($event, 'second_commission_value')"
:disabled="shopStart !== 0" :disabled="shopStart !== 0"
> >
<template #append>{{countType == 1? '%' : '¥'}}</template> <template #append>{{ruleForm.commission_mode == 1? '%' : '¥'}}</template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item label="活动生效时间:"> <el-form-item label="活动生效时间:">
...@@ -369,7 +369,7 @@ export default { ...@@ -369,7 +369,7 @@ export default {
data() { data() {
var commission = (rule, value, callback) => { var commission = (rule, value, callback) => {
if ( if (
this.countType == 1 && this.ruleForm.commission_mode == 1 &&
(this.ruleForm.first_commission_value + (this.ruleForm.first_commission_value +
this.ruleForm.second_commission_value > this.ruleForm.second_commission_value >
50 || 50 ||
...@@ -410,6 +410,7 @@ export default { ...@@ -410,6 +410,7 @@ export default {
ruleForm: { ruleForm: {
marketing_name: "", marketing_name: "",
commission_mode: 1,
first_commission_value: "", first_commission_value: "",
second_commission_value: "", second_commission_value: "",
start_time: "", start_time: "",
...@@ -450,7 +451,6 @@ export default { ...@@ -450,7 +451,6 @@ export default {
marketing_id: "", marketing_id: "",
marketing_info: {}, marketing_info: {},
disabled: false, disabled: false,
countType: 2
}; };
}, },
methods: { methods: {
...@@ -619,6 +619,7 @@ export default { ...@@ -619,6 +619,7 @@ export default {
let { let {
marketing_name, marketing_name,
first_commission_value, first_commission_value,
commission_mode,
second_commission_value, second_commission_value,
} = this.ruleForm; } = this.ruleForm;
let [start_time, end_time] = this.timeSelect || []; let [start_time, end_time] = this.timeSelect || [];
...@@ -633,6 +634,7 @@ export default { ...@@ -633,6 +634,7 @@ export default {
} }
let addParams = { let addParams = {
goods_sku_id, goods_sku_id,
commission_mode,
marketing_name, marketing_name,
first_commission_value: first_commission_value + "", first_commission_value: first_commission_value + "",
second_commission_value: second_commission_value + "", second_commission_value: second_commission_value + "",
......
.goods {
width: 100%;
height: 100%;
padding: 0 30px;
.header {
text-align: right;
margin-bottom: 30px;
}
.dioFor {
margin-left: 5%;
width: 70%;
}
.diotab {
margin-left: 5%;
margin-top: 10px;
}
.dialog-footer {
display: flex;
align-items: center;
justify-content: center;
}
.commodity_list {
margin-top: 30px;
}
.pagination {
margin-top: 30px;
}
}
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
<!-- 页码区 --> <!-- 页码区 -->
<Pagination <Pagination
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
v-model.current-page="page" v-model:current-page="page"
:page-size="pageSize" :page-size="pageSize"
:total="total" :total="total"
></Pagination> ></Pagination>
......
<template>
<el-dropdown>
<div class="user-info">
<el-avatar
:src="userInfo.avatar || DEFAULT_AVATAR"
size="small"
></el-avatar>
<span class="user-name">{{userInfo.name}}</span>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<i class="el-icon-message"></i>
{{userInfo.email}}
</el-dropdown-item>
<el-dropdown-item>
<span><a
class="link"
href="//pandora.yidian-inc.com/"
>返回pandora工具平台</a></span>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
<script>
import { mapState } from 'vuex'
import { HEADER_CONFIG } from '@/config/pageconfig';
export default {
computed: mapState({
userInfo: state => (state.userInfo || {}),
}),
data () {
return {
DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar,
};
},
};
</script>
<style lang="less" scoped>
.user-info {
display: flex;
align-items: center;
}
.user-name {
margin-left: 12px;
color: #fff;
}
</style>
const headerConfig = [
{
name: "订单管理",
path: "/op/groupmeal/orderManagement"
},
{
path: '/op/groupmeal/distrib',
name: '配送员管理'
},
];
export default headerConfig;
\ No newline at end of file
<template>
<div id="pageheader">
<div class="line"></div>
<el-menu
class="header-menu"
mode="horizontal"
:router="true"
background-color="#545c64"
text-color="#fff"
:default-active="activeMenu"
active-text-color="#ffd04b"
unique-opened
>
<el-menu-item
v-for="item in headerConfig"
:index="item.path"
:key="item.path"
>
{{ item.name }}
</el-menu-item>
<el-menu-item
key="usermenu"
class="user-menu"
>
<user></user>
</el-menu-item>
</el-menu>
</div>
</template>
<script>
import headerConfig from "./config";
import User from "./User.vue";
export default {
name: "PageHeader",
components: {
User
},
data () {
return {
headerConfig
};
},
computed: {
activeMenu () {
return this.$route.path;
}
},
beforeMount () { },
methods: {}
};
</script>
<style lang="less">
</style>
<template>
<div class="block">
<el-pagination
class="pagination"
layout="prev, pager, next, jumper, ->,page , total"
v-bind="$attrs"
v-on="$listener"
>
</el-pagination>
</div>
</template>
<script>
export default {
name: 'Pagination'
};
</script>
<style lang="less">
.block {
margin-top: 50px;
}
</style>
.layout {
display: flex;
flex-direction: column;
height: 100%;
}
.main {
flex: 1;
}
<template>
<div class="layout">
<!-- 页面公共 header -->
<page-header class="page-header"></page-header>
<!-- 页面主体部分 -->
<div class="main">
<slot></slot>
</div>
</div>
</template>
<script>
import PageHeader from '../components/PageHeader';
export default {
components: { PageHeader },
};
</script>
<style lang="less" src="./index.less"></style>
.orderManage {
padding: 30px;
box-sizing: border-box;
}
.tabHead{
margin-bottom:10px;
}
.exportForm,.exportBtn{
text-align:center;
}
.refundBtnGroup {
display: block;
text-align: center;
}
.refundCon /deep/ .el-row {
margin-bottom: 15px;
display: flex;
align-items: center;
}
\ No newline at end of file
<template>
<Layout>
<div class="orderManage">
<!-- 查询栏 -->
<el-form
:inline="true"
:model="orderQueryObj"
ref="ruleForm"
class="demo-form-inline"
>
<el-form-item label="活动名称:" prop="marketing_id">
<el-select
v-model="orderQueryObj.marketing_id"
placeholder="请选择"
@change="activityNameSel"
@focus="activityNameFocus"
filterable
>
<el-option
v-for="item in activityNameArr"
:key="item.marketing_id"
:label="item.marketing_name"
:value="item.marketing_id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="订单状态:" prop="order_status">
<el-select v-model="orderQueryObj.order_status" placeholder="请选择">
<el-option
v-for="item in orderStatusArr"
:key="item.value"
:label="item.label"
:value="item.value"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="商品名称:" prop="goods_id">
<el-select
v-model="orderQueryObj.goods_id"
placeholder="请选择"
filterable
>
<el-option
v-for="item in tradeNameArr"
:key="item.goods_id"
:label="item.goods_name"
:value="item.goods_id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="收货人:" prop="cust_user">
<el-input
placeholder="请输入收货人姓名或手机号"
prefix-icon="el-icon-search"
v-model="orderQueryObj.cust_user"
></el-input>
</el-form-item>
<el-form-item label="订单编号:" prop="order_id">
<el-input
placeholder="请输入订单号"
prefix-icon="el-icon-search"
v-model="orderQueryObj.order_id"
></el-input>
</el-form-item>
<el-form-item label="自提点:" prop="sub_shop_id">
<el-select
v-model="orderQueryObj.sub_shop_id"
placeholder="请选择"
filterable
>
<el-option
v-for="item in selLiftPoinArr"
:key="item.sub_shop_id"
:label="item.sub_shop_name"
:value="item.sub_shop_id"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="resetOrder('ruleForm')">重置</el-button>
<el-button type="primary" @click="searchOrder">搜索</el-button>
</el-form-item>
</el-form>
<!-- Tabs标签页 -->
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-row class="tabHead">
<el-col :span="12">
<div>商品共计:{{ goodsNum }}</div>
</el-col>
<el-col :span="12" style="text-align: right">
<el-button @click="exportOrder">导出</el-button>
<el-button @click="printOrder">打印</el-button>
</el-col>
</el-row>
<el-tab-pane label="全部" name="all">
<el-table :data="orderTableData" border stripe style="width: 100%">
<el-table-column prop="marketing_name" label="活动名称">
<template #default="scope">
<div>
{{ scope.row.marketing_name }}({{ scope.row.marketing_id }})
</div>
</template>
</el-table-column>
<el-table-column
prop="order_id"
label="订单号"
width
></el-table-column>
<el-table-column
prop="order_status_text"
label="订单状态"
></el-table-column>
<el-table-column prop="order_item" label="商品信息">
<template #default="scope">
<div v-for="(item, index) in scope.row.order_item" :key="index">
{{ item.goods_name
}}<span style="color: red"> * {{ item.goods_num }} </span>
</div>
</template>
</el-table-column>
<el-table-column prop="user_name" label="收货人">
<template #default="scope">
<div>
<span
>{{ scope.row.user_name }}({{ scope.row.user_nick }})</span
>
<p>{{ scope.row.user_mobile }}</p>
</div>
</template>
</el-table-column>
<el-table-column
prop="sub_shop_name"
label="自提点"
></el-table-column>
<el-table-column prop="comment" label="备注"></el-table-column>
<el-table-column prop="pay_time" label="支付时间"></el-table-column>
<el-table-column prop="payment" label="支付金额">
<template #default="scope">
<div>
{{ scope.row.payment }}
<span v-show="scope.row.refund_amount"
>(已退¥{{ scope.row.refund_amount }})</span
>
</div>
</template>
</el-table-column>
<el-table-column
prop="discount_fee"
label="优惠金额"
></el-table-column>
<el-table-column fixed="right" label="操作" width="100">
<template #default="scope">
<el-button
type="text"
size="small"
@click="refund(scope.row)"
v-show="
scope.row.order_status == '2' ||
scope.row.order_status == '6' ||
scope.row.order_status == '8'
"
>退款</el-button
>
<el-button-group v-show="scope.row.order_status == '3'">
<el-button type="text" size="small" @click="agree(scope.row)"
>同意</el-button
>
<el-button type="text" size="small" @click="refuse(scope.row)"
>拒绝</el-button
>
</el-button-group>
</template>
</el-table-column>
</el-table>
<page
@current-change="handleCurrentChange"
:current-page="orderQueryObj.page"
:page-size="orderQueryObj.page_size"
:total="totalNum"
/>
</el-tab-pane>
<el-tab-pane label="售后" name="afterSale">
<!-- start -->
<el-table :data="orderTableData" border stripe style="width: 100%">
<el-table-column prop="marketing_name" label="活动名称">
<template #default="scope">
<div>
{{ scope.row.marketing_name }}({{ scope.row.marketing_id }})
</div>
</template>
</el-table-column>
<el-table-column
prop="order_id"
label="订单号"
width
></el-table-column>
<el-table-column
prop="order_status_text"
label="订单状态"
></el-table-column>
<el-table-column prop="order_item" label="商品信息">
<template #default="scope">
<div v-for="(item, index) in scope.row.order_item" :key="index">
{{ item.goods_name
}}<span style="color: red"> * {{ item.goods_num }} </span>
</div>
</template>
</el-table-column>
<el-table-column prop="user_name" label="收货人">
<template #default="scope">
<div>
<span
>{{ scope.row.user_name }}({{ scope.row.user_nick }})</span
>
<p>{{ scope.row.user_mobile }}</p>
</div>
</template>
</el-table-column>
<el-table-column
prop="sub_shop_name"
label="自提点"
></el-table-column>
<el-table-column prop="comment" label="备注"></el-table-column>
<el-table-column prop="pay_time" label="支付时间"></el-table-column>
<el-table-column prop="payment" label="支付金额">
<template #default="scope">
<div>
{{ scope.row.payment }}
<span v-show="scope.row.refund_amount"
>(已退¥{{ scope.row.refund_amount }})</span
>
</div>
</template>
</el-table-column>
<el-table-column
prop="discount_fee"
label="优惠金额"
></el-table-column>
<el-table-column fixed="right" label="操作" width="100">
<template #default="scope">
<el-button
type="text"
size="small"
@click="refund(scope.row)"
v-show="
scope.row.order_status == '2' ||
scope.row.order_status == '6' ||
scope.row.order_status == '8'
"
>退款</el-button
>
<el-button-group v-show="scope.row.order_status == '3'">
<el-button type="text" size="small" @click="agree(scope.row)"
>同意</el-button
>
<el-button type="text" size="small" @click="refuse(scope.row)"
>拒绝</el-button
>
</el-button-group>
</template>
</el-table-column>
</el-table>
<page
@current-change="handleCurrentChange"
:current-page="orderQueryObj.page"
:page-size="orderQueryObj.page_size"
:total="totalNum"
/>
<!-- end -->
</el-tab-pane>
</el-tabs>
<!-- 导出弹窗 -->
<el-dialog title="导出订单" width="25%" top="10%" v-model="exportShow">
<el-form-item class="exportForm" label>
<div style="margin-bottom: 15px">
请选择导出活动{{ exportType }}的表格类型
</div>
<a :href="exportURL1" style="margin-right: 10px"
><el-button type="primary" @click="exportShow = false"
>总表</el-button
></a
>
<a :href="exportURL2" style="margin-right: 10px"
><el-button type="primary" @click="exportShow = false"
>商品表</el-button
></a
>
<a :href="exportURL3"
><el-button type="primary" @click="exportShow = false"
>配送表</el-button
></a
>
<!-- <el-checkbox-group v-model="exportSel">
<el-checkbox
v-for="i in exportSelOpt"
:label="i.type"
:key="i.type"
>{{ i.name }}</el-checkbox
>
</el-checkbox-group> -->
</el-form-item>
<!-- <el-form-item class="exportBtn">
<el-button @click="exportShow = false">取消</el-button>
<a :href="exportURL" style="margin-left: 20px"><el-button type="primary" @click="exportShow = false">确定导出</el-button></a>
</el-form-item> -->
</el-dialog>
<!-- 退款弹窗 -->
<el-dialog title="退款" width="30%" top="10%" v-model="refundShow">
<el-checkbox
:indeterminate="isIndeterminate"
v-model="checkAll"
@change="handleCheckAllChange"
style="margin-bottom: 15px"
>
全选
</el-checkbox>
<div
class="refundCon"
v-for="(item, index) in refundGoods"
:key="index"
>
<el-row>
<el-checkbox
class="check-wrap"
v-model="item.refundedGoodsSel"
:label="item.goods_name"
name="type"
></el-checkbox>
</el-row>
<el-row>
<el-col :span="6">单价:{{ item.price }}</el-col>
<el-col :span="6">数量:{{ item.goods_num }}</el-col>
<el-col :span="6">实付:{{ item.payment }}</el-col>
</el-row>
<el-row>
可退数量:
<el-input-number
v-model="item.refundableQuantity"
@change="handleChange"
:min="0"
:max="item.goods_num - item.refund_count"
></el-input-number>
</el-row>
<el-row>
退款金额(可退金额{{ item.amountToRefund }}元):
<el-input
v-model="item.amountToRefund"
style="width: 150px"
></el-input>
</el-row>
</div>
<template #footer>
<span class="dialog-footer refundBtnGroup">
<el-button @click="refundShow = false">取 消</el-button>
<el-button type="primary" @click="handleConfirmRefund"
>退款</el-button
>
</span>
</template>
</el-dialog>
</div>
</Layout>
</template>
<script>
import Layout from "../layout/index.vue";
import {
getOrderList,
getMarketingList,
getGoodsList,
getSubShopList,
orderPrint,
orderItemList,
orderRefundReject,
refundOrder,
getOrderExportURL,
} from "@/service/Groupmeal/groupmeal";
// import page from "../../components/Pagination.vue";
import page from "../components/Pagination/index.vue";
export default {
name: "orderManagement",
components: {
Layout,
page,
},
data() {
return {
// 查询
orderQueryObj: {
page: 1,
page_size: 10,
marketing_id: "", // 活动名称
order_status: "0", // 订单状态
goods_id: "", // 商品名称
cust_user: "", // 收货人
order_id: "", // 订单编号
sub_shop_id: "", // 自提点
},
// 下拉框数据
// 活动名称
activityNameArr: [],
// 订单状态
orderStatusArr: [
{
value: "0",
label: "全部",
},
{
value: "1",
label: "未支付",
},
{
value: "2",
label: "已支付",
},
{
value: "3",
label: "待退款",
},
{
value: "4",
label: "已退款",
},
{
value: "5",
label: "退款中",
},
{
value: "6",
label: "已拒绝",
},
{
value: "7",
label: "售后",
},
],
// 商品名称
tradeNameArr: [],
// 自提点
selLiftPoinArr: [],
activeName: "all", // Tabs标签页
goodsNum: "", // 商品总计
// 导出
exportShow: false,
exportType: "",
// exportSel: [],
// exportSelOpt: [
// { type: "1", name: "总表" },
// { type: "2", name: "商品表" },
// { type: "3", name: "配送表" },
// ],
// 表格数据
orderTableData: [],
totalNum: null, //总条数
// 退款
refundShow: false, // 退款状态
checkAll: false, // 全选
isIndeterminate: false,
refundGoods: [
{
refundedGoodsSel: false,
goods_name: "",
price: "", // 单价
goods_num: "", // 数量
payment: "", // 实付
refundableQuantity: "",
refundAmount: "",
amountToRefund: "",
},
],
};
},
computed: {
exportURL1() {
return getOrderExportURL(this.orderQueryObj.marketing_id, "1");
},
exportURL2() {
return getOrderExportURL(this.orderQueryObj.marketing_id, "2");
},
exportURL3() {
return getOrderExportURL(this.orderQueryObj.marketing_id, "3");
},
},
methods: {
activityNameFocus() {
this.getMarketingListMet();
},
// 获取活动名称
async getMarketingListMet() {
try {
const res = await getMarketingList();
this.activityNameArr = res.result;
} catch (error) {
this.$message.error("发生未知错误,请稍后再试一下吧~~~");
console.error(error);
}
},
// 活动名称的change事件 获取商品名称+获取自提点
async activityNameSel(val) {
this.orderQueryObj.goods_id = "";
const params = {
marketing_id: val,
};
const res = await getGoodsList(params); // 商品名称
this.getSubShopListMet(val) //自提点
// const res = await getSubShopList(params);
this.tradeNameArr = res.result;
// this.selLiftPoinArr = res.result;
},
// 获取自提点
async getSubShopListMet(params) {
try {
let marketing_id = ''
if(params){
marketing_id = params
}
const res = await getSubShopList({'marketing_id':marketing_id});
this.selLiftPoinArr = res.result;
} catch (error) {
this.$message.error("发生未知错误,请稍后再试一下吧~~~");
console.error(error);
}
},
// 重置
resetOrder(formName) {
this.$refs[formName].resetFields();
this.orderQueryObj.page = 1;
this.orderQueryObj.page_size = 10;
this.getOrderListMet(this.orderQueryObj);
},
// 搜索
searchOrder() {
this.orderQueryObj.page = 1;
this.orderQueryObj.page_size = 10;
this.getOrderListMet(this.orderQueryObj);
},
// 标签页切换
handleClick(targetName) {
if (targetName.props.name == "all") {
this.orderQueryObj.order_status = "0";
this.orderStatusArr[1].disabled = false;
this.orderStatusArr[2].disabled = false;
} else {
this.orderQueryObj.order_status = "7";
this.orderStatusArr[1].disabled = true;
this.orderStatusArr[2].disabled = true;
}
this.getOrderListMet(this.orderQueryObj);
},
// 导出
exportOrder() {
if (this.orderQueryObj.marketing_id === "") {
this.$message.error("请选择活动名称");
return;
}
this.exportShow = true;
this.exportType = this.orderQueryObj.marketing_id;
},
async printOrderMet(forcePrint) {
const params = {
marketing_id: this.orderQueryObj.marketing_id,
// marketing_id: "1NJETU",
force_print: forcePrint ? "1" : "",
};
const res = await orderPrint(params);
return res;
},
// 打印
async printOrder() {
if (this.orderQueryObj.marketing_id === "") {
this.$message.error("请选择活动名称");
return;
}
let res = await this.printOrderMet(false);
if (res.code === 0) {
this.$message({
type: "success",
message: "打印成功",
});
return;
}
if (res.code !== 5111040) {
if (res.reason) {
this.$message.error(res.reason);
} else {
this.$message.error("打印失败");
}
return;
}
if (res.reason) {
try {
await this.$confirm(res.reason, "打印", {
cancelButtonText: "取消",
confirmButtonText: "确定",
});
} catch (e) {
// 取消
return;
}
} else {
this.$message.error("打印失败");
}
res = await this.printOrderMet(true);
// if (res.code !== 0) {
// this.$message.error("打印失败");
// }
},
// 获取订单列表
async getOrderListMet() {
try {
const res = await getOrderList(this.orderQueryObj);
this.goodsNum = res.goods_num; // 商品共计
this.totalNum = res.count; // 商品总数
this.orderTableData = res.result;
} catch (error) {
this.$message.error("发生未知错误,请稍后再试一下吧~~~");
console.error(error);
}
},
//列表分页
// 页码变化
handleCurrentChange(e) {
this.orderQueryObj.page = e;
this.getOrderListMet();
},
// 拒绝
async refuse(val) {
try {
await this.$confirm("确定要拒绝退款么?", "拒绝", {
cancelButtonText: "取消",
confirmButtonText: "确定",
});
} catch (e) {
// 取消
return;
}
const params = {
order_id: val.order_id,
};
const res = await orderRefundReject(params);
if (res.code === 0) {
this.$message({
type: "success",
message: "订单已驳回",
});
} else {
this.$message.error(res.reason);
}
this.getOrderListMet();
},
// 同意
agree(val) {
this.refund(val);
},
// 全选
handleCheckAllChange(val) {
for (var i in this.refundGoods) {
this.refundGoods[i].refundedGoodsSel = val;
}
// this.isIndeterminate = false;
},
// 退款
async refund(val) {
this.refundShow = true;
this.checkAll = false;
this.refundGoods = [];
const params = {
order_id: val.order_id,
};
const res = await orderItemList(params);
this.refundGoods = res.result;
for (var i in res.result) {
this.refundGoods[i].refundableQuantity = Number(
res.result[i].goods_num - res.result[i].refund_count
);
this.refundGoods[i].payment = Number(
res.result[i].payment
//res.result[i].payment - res.result[i].refund_amount
);
// console.log( res.result[i]);
this.refundGoods[i].amountToRefund = Number(
res.result[i].payment - res.result[i].refund_amount
);
}
},
// 退款确认
async handleConfirmRefund() {
const isCheckAllSelected = () => this.refundGoods.refundedGoodsSel;
const getAllItems = () => this.refundGoods;
const getSelectedItems = () => {
const isSelected = ({ refundedGoodsSel }) => refundedGoodsSel;
return this.refundGoods.filter(isSelected);
};
const convertToNumber = (str) => {
return !Number.isNaN(parseFloat(str)) ? parseFloat(str) : 0;
};
const processRefundItem = (item) => {
return {
order_item_id: item.order_item_id,
refund_num: item.refundableQuantity || 0,
refund_amount: convertToNumber(item.amountToRefund),
};
};
const orderId = this.refundGoods[0].order_id;
let itemsToRefund = null;
if (isCheckAllSelected()) {
itemsToRefund = getAllItems();
} else {
itemsToRefund = getSelectedItems();
}
itemsToRefund = itemsToRefund.map(processRefundItem);
// if ((itemsToRefund.length = 0)) {
// this.$message.error("请选择退款商品");
// return;
// }
const res = await refundOrder(orderId, itemsToRefund);
if (res.code === 0) {
this.$message.success("退款成功");
this.refundShow = false;
return;
}
// this.refundShow = false;
this.$message.error(res.reason);
},
},
created() {
this.getMarketingListMet(); // 活动名称
this.getSubShopListMet(); // 自提点
this.getOrderListMet(); // table列表
},
};
</script>
<style lang="less" src="./index.less" scope></style>
<style lang="less" scoped>
.check-wrap{
/deep/ .el-checkbox__label {
white-space: normal;
word-break: break-all;
}
}
</style>
<template> <template>
<layout> <layout>
<el-card class="role_management"> <RoleList appId="merchant-op" detailPath="/op/roleRoleDetail"></RoleList>
<!-- 角色检索区域 -->
<div class="creatRole">
<el-form inline :model="searchForm">
<el-form-item label="角色名称">
<el-input v-model="searchForm.roleName"></el-input>
</el-form-item>
<el-form-item label="状态">
<el-select
v-model="searchForm.roleStatus"
placeholder="请选择角色状态"
>
<el-option label="正常" :value="1"></el-option>
<el-option label="禁用" :value="2"></el-option>
<el-option label="删除" :value="3"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSearchSubmit">查询</el-button>
<el-button @click="onReset">重置</el-button>
</el-form-item>
</el-form>
<el-form>
<el-form-item>
<el-button
type="primary"
:disabled="!permission.get('create')"
@click="onCreateRole"
>创建角色</el-button
>
</el-form-item>
</el-form>
</div>
<!-- 角色搜索列表 -->
<el-table border :data="managementList">
<el-table-column
label="ID"
width="200px"
prop="role_id"
align="center"
></el-table-column>
<el-table-column
label="角色名称"
prop="role_name"
align="center"
></el-table-column>
<el-table-column
label="状态"
width="200px"
:formatter="hasStatusFormat"
align="center"
>
</el-table-column>
<el-table-column
label="最后修改日期"
prop="update_time"
align="center"
></el-table-column>
<el-table-column
label="最后修改人账号"
prop="update_user_name"
align="center"
></el-table-column>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
:disabled="
!permission.get('edit') ||
scope.row.role_status == 2 ||
scope.row.role_status == 3
"
@click.stop="handelModify(scope.row)"
type="text"
size="mini"
>修改</el-button
>
<el-button
:disabled="!permission.get('delete')"
@click.stop="handelDelete(scope.row)"
size="mini"
type="text"
>删除</el-button
>
<el-button
:disabled="!permission.get('disable')"
@click.stop="handelDisable(scope.row)"
size="mini"
type="text"
>禁用</el-button
>
<el-button
:disabled="!permission.get('enable')"
@click.stop="handelEnable(scope.row)"
size="mini"
type="text"
>启用</el-button
>
<el-button
@click.stop="toRoleDetail(scope.row)"
size="mini"
type="text"
>查看详情</el-button
>
</template>
</el-table-column>
</el-table>
<page :totalNum="totalNum" @update="update" />
</el-card>
<el-dialog :title="roleTitle" v-model="dialogVisible">
<el-form>
<!-- 新增 -->
<el-form-item label="角色名称" :label-width="formLabelWidth">
<el-input v-model="roleName" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="角色范围" :label-width="formLabelWidth">
<el-cascader
v-model="selectedOptions"
:options="permissionsAll"
:props="props"
style="width: 280px"
@change="parentCateChange"
clearable
></el-cascader>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="confirm">确 定</el-button>
</span>
</template>
</el-dialog>
</layout> </layout>
</template> </template>
<script> <script>
import Layout from "@/layouts"; import Layout from "@/layouts";
import page from "../components/Pagination" import RoleList from "@/components/Roles/RoleList";
import {
getRole_list as reqGetRole_list, getAll_role_list as reqGetAll_role_list,
getUpdate_role as reqGetUpdate_role, get_role_info as reqGet_role_info,
getDelete_role as reqGetDelete_role, getAdd_role as reqGetAdd_role
} from "../../service/role";
export default { export default {
name: 'KeepRoleManagement', name: 'KeepRoleManagement',
components: { components: {
Layout, Layout,
page, RoleList
},
computed: {
permission () {
const modulePermissions = this.$store.getters.moduleSubPermissions('role') || [];
return new Map(modulePermissions.map(ele => [ele.name, true]))
},
},
data () {
return {
searchForm: {
roleName: '',
roleStatus: ''
},
formLabelWidth: '120px',
parmas: {
page: 1,
page_size: 20
},
totalNum: null,
roleTitle: '',
roleName: '',
edit: true,
props: {
multiple: true,//设置为多选
value: 'id', //value值和哪个值绑定
label: 'desc',//label值和哪个值绑定
children: 'sub_permissions'//children值和哪个值绑定
},
selectedOptions: [],
dialogVisible: false,
dialogText: "",
managementList: [],
role_info_detail: {//详情非编辑项
role_id: "",
role_name: "",
},
permissionsAll: [],
currenPermissionsUpdate: [],
currentRolePrivilege: []
}
},
activated () {
this.getGetRole_list()
this.getPermissionsAll()
},
methods: {
hasStatusFormat (row) {
let statusText = ['正常', '禁用', '删除']
return statusText[row.role_status - 1]
},
onCreateRole () {
this.roleTitle = '新增角色'
this.getPermissionsAll()
this.edit = false
this.dialogVisible = true
this.roleName = ""
this.selectedOptions = []
// this.$router.push({ name: 'AddRole' });
},
toRoleDetail (row) {
this.$router.push({ name: "RoleDetail", query: { roleId: row.role_id } });
},
getPermissionsAll () {
let { email } = this.$store.state.userInfo
reqGetAll_role_list(email).then(res => {
this.permissionsAll = res
})
},
//获取角色列表
getGetRole_list () {
let { page, page_size } = this.parmas
let parmasRole_list = {
page,
page_size,
role_status: this.searchForm.roleStatus,
role_name: this.searchForm.roleName
}
reqGetRole_list(parmasRole_list).then(res => {
this.managementList = res.result
this.totalNum = res.count
})
},
//查询
onSearchSubmit () {
this.getGetRole_list()
},
//重置
onReset () {
this.searchForm.roleName = "",
this.searchForm.roleStatus = ""
this.getGetRole_list()
},
//列表分页
update (obj) {
Object.assign(this.parmas, obj)
let { page, page_size } = this.parmas
this.getGetRole_list(page, page_size)
},
//弹框提示
openBounced (type, role_id) {
this.$confirm(`${this.dialogText}是否继续?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
if (type === "disable") {
this.getRole_info_detail('disable', role_id)
} else {
this.delete(role_id)
}
}).catch(() => {
this.$message({
type: 'info',
message: '已取消'
});
});
},
//删除
delete (role_id) {
reqGetDelete_role(role_id).then(res => {
if (res.status == "success")
this.getGetRole_list()
})
},
//角色详情数据
getRole_info_detail (type, role_id) {
reqGet_role_info(role_id).then(res => {
const { role_id, role_name, permissions } = res
this.role_info_detail = {
role_id,
role_name,
}
this.roleName = role_name
// this.permissionsUpdate = permissions
let role_status
if (type === "disable") {
role_status = 2
} else if (type === "enable") {
role_status = 1
} else if (type === "modify") {
this.currentRolePrivilege = permissions
this.editEchoData(permissions)
}
else {
role_status = ""
}
if (type !== "modify") {
this.getUpdate_role(role_name, role_id, role_status, permissions)
}
})
},
//遍历回显值selectedOptions
editEchoData (permissions) {
let selectData = []
permissions.map(item => {
let one = { id: item.id }
if (item.sub_permissions) {
item.sub_permissions.map(info => {
let selectId = [one.id, info.id]
selectData.push(selectId)
})
}
})
this.selectedOptions = selectData
},
//启用
handelEnable (row) {
if (row.role_status == 1) {
this.$message({
type: 'info',
message: '该条数据已启用'
});
return false
}
this.getRole_info_detail("enable", row.role_id)
},
//禁用
handelDisable (row) {
if (row.role_status == 2) {
this.$message({
type: 'info',
message: '该条数据已禁用'
});
return false
}
this.dialogText = "禁用拥有此角色用户将受影响"
this.openBounced("disable", row.role_id)
},
//编辑列表操作
getUpdate_role (role_name, role_id, role_status, permissions) {
let parmasUpdate_role = {
role_name: role_name,
role_id,
role_status,
permissions,
}
reqGetUpdate_role(parmasUpdate_role).then(res => {
if (res.status === "success") {
this.dialogVisible = false
this.getGetRole_list()
} else {
this.dialogVisible = false
this.$message({
type: 'info',
message: `${res.reason}`
});
}
})
},
//删除
handelDelete (row) {
this.dialogText = "删除后不可恢复,拥有此角色用户将受影响"
this.openBounced('del', row.role_id)
},
//修改
handelModify (row) {
this.edit = true
this.roleTitle = '修改角色'
this.getPermissionsAll()
this.dialogVisible = true
this.getRole_info_detail("modify", row.role_id)
},
//确认修改
confirm () {
let checkRolePrivilege = []
this.edit ? checkRolePrivilege = this.currentRolePrivilege : checkRolePrivilege = this.currenPermissionsUpdate
if (!(this.roleName && checkRolePrivilege.length > 0)) {
this.$message({
type: 'error',
message: "请完善信息"
});
return false
}
if (this.edit) {
this.getEditRole()
} else {
this.getAdd_role()
}
},
//编辑提交的数据
getEditRole () {
let { role_id } = this.role_info_detail
let role_status = ''
this.getUpdate_role(this.roleName, role_id, role_status, this.currentRolePrivilege)
},
//新增角色
getAdd_role () {
let parmasAdd_role = {
role_name: this.roleName,
permissions: this.currenPermissionsUpdate
}
reqGetAdd_role(parmasAdd_role).then(res => {
this.dialogVisible = false
if (res.status === "success") {
this.getGetRole_list()
} else {
this.$message({
type: 'info',
message: `${res.reason}`
});
}
})
},
parentCateChange (id) {
this.getSelectedOptions(id)
},
getSelectedOptions (selectedOptions) {
let oldDataRule = []
selectedOptions.forEach(el => {
let oldObj = {
id: el[0],
sub_permissions: []
}
let btnObj = {
id: el[1],
}
oldObj.sub_permissions.push(btnObj)
oldDataRule.push(oldObj)
})
let newData = []
let newObj = {}
oldDataRule.forEach((el, i) => {
if (!newObj[el.id]) {
newData.push(el);
newObj[el.id] = true;
} else {
newData.forEach(el => {
if (el.id === oldDataRule[i].id) {
el.sub_permissions = [...el.sub_permissions, ...oldDataRule[i].sub_permissions];
}
})
}
})
this.currentRolePrivilege = newData
this.currenPermissionsUpdate = newData
},
} }
}; };
</script> </script>
<style lang="less" scoped>
.creatRole {
display: flex;
justify-content: space-between;
}
.role_management {
padding: 20px;
}
.role_management .el-button {
margin: 0 2px;
}
</style>
<template> <template>
<div class="user-detail"> <RoleDetail appId="merchant-op" />
<el-page-header @back="goBack" content="角色详情页面"> </el-page-header>
<el-card class="management">
<h5 style="margin-bottom: 10px">角色信息</h5>
<el-descriptions class="margin-top" :column="2" border>
<el-descriptions-item>
<template #label> ID </template>
{{ roleId }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 角色状态 </template>
{{
role_info_detail.role_status == 1
? "正常"
: role_info_detail.role_status == 2
? "禁用"
: "删除"
}}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 角色名称 </template>
{{ role_info_detail.role_name }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 创建人账号 </template>
{{ role_info_detail.create_user_name }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 创建时间 </template>
{{ role_info_detail.create_time }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 最后修改人账号 </template>
{{ role_info_detail.update_user_name }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 最后修改时间 </template>
{{ role_info_detail.update_time }}
</el-descriptions-item>
</el-descriptions>
<div class="tree" v-if="selectedOptions">
<h5 style="margin-bottom: 10px">角色范围</h5>
<div>
<el-cascader
v-model="selectedOptions"
:options="permissionsAll"
placeholder="暂无数据"
disabled
:props="props"
style="width: 300px"
></el-cascader>
</div>
</div>
<div v-if="role_info_detail.role_account_list.length">
<h5 style="margin: 10px 0">角色账号</h5>
<div class="roleList">
<div
class="role_account_list"
v-for="(item, index) in role_info_detail.role_account_list"
:key="index"
>
{{ item }}
</div>
</div>
</div>
</el-card>
</div>
</template> </template>
<script> <script>
import { get_role_info as reqGet_role_info, getAll_role_list as reqGetAll_role_list, } from '../../service/role' import RoleDetail from "@/components/Roles/RoleDetail";
export default { export default {
data () { components: {
return { RoleDetail
roleId: this.$route.query.roleId,
user_info: {
name: "jianghaiming",
email: "jianghaiming@126.com",
},
props: {
multiple: true,//设置为多选
value: 'id', //value值和哪个值绑定
label: 'desc',//label值和哪个值绑定
children: 'sub_permissions'//children值和哪个值绑定
},
selectedOptions: [],
permissionsAll: [],
role_info_detail: {//详情非编辑项
role_id: "",
role_name: "",
role_status: "",
update_time: "",
update_user_name: "",
create_time: "",
create_user_name: "",
role_account_list: []
} }
} };
},
activated () {
this.roleId = this.$route.query.roleId
let { email } = this.$store.state.userInfo
reqGetAll_role_list(email).then(res => {
this.permissionsAll = res
})
reqGet_role_info(this.roleId).then((res) => {
const { role_name, role_status, update_time, update_user_name, create_time, create_user_name, role_account_list, permissions } = res
this.role_info_detail = {
role_name,
role_status,
update_time,
update_user_name,
create_time,
create_user_name,
role_account_list
}
this.editEchoData(permissions)
})
},
methods: {
goBack () {
this.$router.back(-1);
},
//遍历回显值selectedOptions
editEchoData (permissions) {
let selectData = []
permissions.map(item => {
let one = { id: item.id }
if (item.sub_permissions) {
item.sub_permissions.map(info => {
let selectId = [one.id, info.id]
selectData.push(selectId)
})
}
})
this.selectedOptions = selectData
},
}
}
</script> </script>
<style lang="less" scoped>
.user-detail {
margin: 50px;
.role_account_list {
padding: 10px;
color: #909399;
background: #fafafa;
font-weight: 400;
line-height: 1.5;
}
.management {
margin-top: 20px;
}
.roleList {
max-height: 300px;
overflow-y: scroll;
}
.tree {
// border: 1px solid #ebeef5;
margin-top: 20px;
}
}
</style>
\ No newline at end of file
<template>
<div class="user-detail">
<el-page-header @back="goBack" content="用户详情页面"> </el-page-header>
<el-card class="management">
<h2 style="margin-bottom: 10px">用户信息</h2>
<el-descriptions class="margin-top" :column="3" :size="size" border>
<el-descriptions-item>
<template #label> 用户姓名 </template>
{{ user_info.user_name }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 手机号 </template>
{{ user_info.user_mobile }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 所属组织 </template>
{{ user_info.organization }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 添加人账号 </template>
{{ user_info.create_user_name }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 添加时间 </template>
{{ user_info.create_time }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 最后修改人账号 </template>
{{ user_info.update_user_name }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 最后修改时间 </template>
{{ user_info.update_user_name }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> 敏感词权限 </template>
{{ user_info.is_sensitive_authority == 1 ? "有" : "无" }}
</el-descriptions-item>
</el-descriptions>
<div class="role">角色信息</div>
<el-table :data="role_list" border style="width: 100%">
<el-table-column prop="role_id" label="ID" width="180">
</el-table-column>
<el-table-column prop="role_name" label="角色名称"> </el-table-column>
</el-table>
</el-card>
</div>
</template>
<script>
import { getUser_detail as reqGetUser_detail } from "../../service/user";
export default {
data () {
return {
user_id: this.$route.query.userId,
user_info: {},
role_list: []//角色池
}
},
created () {
this.getUser_date()
},
methods: {
getUser_date () {
reqGetUser_detail(this.user_id).then((res) => {
this.user_info = res.user_info
this.role_list = res.role_list
})
},
goBack () {
this.$router.go(-1)
}
}
}
</script>
<style lang="less" scoped>
.user-detail {
margin: 50px;
.role {
margin: 10px;
font-weight: bold;
}
}
</style>
\ No newline at end of file
<template> <template>
<layout> <layout>
<div class="user"> <UserList appId="merchant-op" />
<el-form :inline="true" :model="pageParams" class="demo-form-inline">
<el-form-item label="用户姓名">
<el-input
maxlength="15"
v-model="pageParams.user_name"
placeholder="用户姓名"
></el-input>
</el-form-item>
<el-form-item label="用户账号">
<el-input
v-model="pageParams.user_email"
placeholder="用户账号"
></el-input>
</el-form-item>
<el-form-item label="手机号">
<el-input
v-model="pageParams.user_mobile"
placeholder="手机号"
></el-input>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="pageParams.user_status" placeholder="状态">
<el-option value="1" label="启用"></el-option>
<el-option value="2" label="禁用"></el-option>
</el-select>
</el-form-item>
<el-form-item class="func-btn">
<el-button type="primary" @click="getUserList">查询</el-button>
<el-button @click="onReset">重置</el-button>
<el-button @click="createUser" :disabled="!permission.get('create')"
>新建用户</el-button
>
</el-form-item>
</el-form>
<el-table :data="renderUserList" border style="width: 100%">
<el-table-column prop="user_id" label="用户ID" width="70">
</el-table-column>
<el-table-column prop="user_name" label="用户姓名"> </el-table-column>
<el-table-column prop="user_email" label="用户账号"> </el-table-column>
<el-table-column prop="user_status" label="状态"> </el-table-column>
<el-table-column prop="user_mobile" label="手机号"> </el-table-column>
<el-table-column prop="update_time" label="最后修改日期">
</el-table-column>
<el-table-column prop="update_user_name" label="最后修改人账号">
</el-table-column>
<el-table-column fixed="right" label="操作" width="140">
<template #default="scope">
<el-button type="text" size="small" @click="checkUser(scope.row)"
>查看</el-button
>
<el-button
@click="editUser(scope.row)"
type="text"
size="small"
:disabled="!permission.get('edit')"
>修改</el-button
>
<el-button
v-if="scope.row.user_status === '启用'"
type="text"
size="small"
@click="disableUser(scope.row)"
:disabled="!permission.get('enable')"
>禁用</el-button
>
<el-button
v-if="scope.row.user_status === '禁用'"
type="text"
size="small"
@click="enableUser(scope.row)"
:disabled="!permission.get('disable')"
>启用</el-button
>
</template>
</el-table-column>
</el-table>
<page
:totalNum="totalNum"
:pageSize="pageParams.size"
@update="updatePage"
/>
</div>
<user-info-modal
:data="curUserInfo"
:visable="modalVisable.info"
@cancel="cancelModal('info')"
></user-info-modal>
<user-info-edit-modal
:data="curUserInfo"
:visable="modalVisable.edit"
@confirm="confirmEditModal"
@cancel="cancelModal('edit')"
></user-info-edit-modal>
<user-info-new-modal
:visable="modalVisable.new"
@confirm="confirmEditModal"
@cancel="cancelModal('new')"
></user-info-new-modal>
</layout> </layout>
</template> </template>
<script> <script>
import Layout from "@/layouts"; import Layout from "@/layouts";
import page from "@/components/Pagination"; import UserList from "@/components/UserList";
import UserInfoModal from "./components/UserInfoModal";
import UserInfoEditModal from "./components/UserInfoEditModal";
import UserInfoNewModal from "./components/UserInfoNewModal";
import { ElMessage } from "element-plus";
import {
getUserList as reqGetUserList,
getUserDetail as reqGetUserDetail,
editUser as reqEditUser,
createUser as reqCreateUser,
} from "@/service/user";
export default { export default {
components: { components: {
Layout, Layout,
page, UserList
UserInfoModal,
UserInfoEditModal,
UserInfoNewModal,
},
data() {
return {
pageParams: {
page: 1,
size: 20,
user_name: "",
user_email: "",
user_mobile: "",
user_status: "",
},
totalNum: 0,
userList: [],
curUserInfo: {},
modalVisable: {
info: false,
edit: false,
new: false,
},
curOperateMode: "new",
};
},
computed: {
permission() {
const modulePermissions =
this.$store.getters.moduleSubPermissions("user") || [];
console.log("Current page func-permissions:", modulePermissions);
return new Map(modulePermissions.map((ele) => [ele.name, true]));
},
renderUserList() {
const statusMap = new Map([
[1, "启用"],
[2, "禁用"],
[3, "删除"],
]);
return this.userList.map((ele) => {
ele.user_status = statusMap.get(ele.user_status);
return ele;
});
},
},
beforeMount() {
this.getUserList();
},
methods: {
async getUserList() {
const { code, result } = await reqGetUserList(this.pageParams);
if (code !== 0) {
ElMessage.error("获取用户列表出错!");
return;
}
const { data, count } = result;
this.totalNum = count;
this.userList = data;
},
async setCurUserInfo(user_id) {
const { code, result } = await reqGetUserDetail({ user_id });
if (code === 0) {
this.curUserInfo = {
...result.user_info,
roles: result.role_list,
};
} else {
ElMessage.error("获取用户信息出错!");
}
},
async checkUser(row) {
const { user_id } = row;
await this.setCurUserInfo(user_id);
this.openModal("info");
},
async editUser(row) {
const { user_id } = row;
await this.setCurUserInfo(user_id);
// this.openModal('edit');
this.modalVisable.edit = true;
this.curOperateMode = "edit";
},
openModal(key) {
Object.keys(this.modalVisable).forEach((ele) => {
this.modalVisable[ele] = key === ele;
});
},
async confirmEditModal(userInfo) {
const {
user_id,
user_name,
user_email,
is_sensitive_authority,
user_mobile,
roles,
user_status,
organization,
} = userInfo;
let res = {};
if (this.curOperateMode === "edit") {
const editData = {
user_id,
user_name,
user_email,
is_sensitive_authority: parseInt(is_sensitive_authority),
user_mobile,
role_id: roles,
user_status: parseInt(user_status),
};
res = await reqEditUser(editData);
} else if (this.curOperateMode === "new") {
const newData = {
user_name,
user_email,
is_sensitive_authority: parseInt(is_sensitive_authority),
user_mobile,
role_id: roles,
user_status: parseInt(user_status),
organization,
};
res = await reqCreateUser(newData);
}
if (res.code === 0) {
this.cancelModal(this.curOperateMode);
ElMessage.success("更新成功!");
this.getUserList();
} else {
ElMessage.error(res.reason);
}
},
cancelModal(name) {
this.modalVisable[name] = false;
},
createUser() {
this.curOperateMode = "new";
this.openModal("new");
},
//重置
onReset() {
this.pageParams = {
page: 1,
pageSize: 20,
user_name: "",
user_email: "",
user_mobile: "",
user_status: "",
};
this.getUserList();
},
updatePage({ page, pageSize }) {
page && (this.pageParams.page = page);
pageSize && (this.pageParams.pageSize = pageSize);
this.getUserList();
},
async enableUser(row) {
const { user_id } = row;
const { code, reason } = await reqEditUser({ user_status: 1, user_id });
if (code === 0) {
ElMessage.success("启用成功!");
this.getUserList();
} else {
ElMessage.error(reason);
}
},
async disableUser(row) {
const { user_id } = row;
const { code, reason } = await reqEditUser({ user_status: 2, user_id });
if (code === 0) {
ElMessage.success("禁用成功!");
this.getUserList();
} else {
ElMessage.error(reason);
} }
},
},
}; };
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
......
import { render } from "@testing-library/vue";
import ExaminePage from "..";
import { getApplyList } from "@/service/Withdrawal/withdrawal";
import store from "@/store";
jest.mock("@/service/Withdrawal/withdrawal");
it("should not enable audition for people without such privilege", () => {
const $route = {
path: "/op/withdrawal/examine"
};
getApplyList.mockResolvedValue({
code: 0,
status: "success",
result: {
list: [
{
withdraw_apply_id: "21072711253403105009",
wallet_id: "21072214560673105003",
user_id: 510227177373,
amount: "6.00",
withdraw_apply_status: 0,
withdraw_audit_time: "2021-07-27 11:25:34",
refuse_reason: "",
audit_user_name: "",
create_time: "2021-07-27 11:25:34",
lately_amount: "0.00",
id: "21072711253403105009",
city_name: "简网员工",
lately_share: 0,
lately_download: 0,
history_share: 52,
history_download: 0,
history_download_keep: "0%",
status_text: "待审核"
}
],
count: 1
}
});
const { getByText } = render(ExaminePage, {
store,
global: {
mocks: {
$route,
$store: {
getters: {
moduleSubPermissions: jest.fn().mockReturnValue(true)
}
}
}
}
});
getByText("审核");
});
.tab-show {
width: 100%;
height: 100%;
padding: 0px 55px;
background-color: white;
.el-tabs__nav-wrap::after {
background-color: transparent;
}
.el-tabs__header {
margin: 0;
}
}
.goods {
width: 100%;
height: 100%;
padding: 0px 30px;
.search_condition {
display: flex;
flex-wrap: wrap;
align-items: center;
.search_button {
display: flex;
align-items: center;
justify-self: flex-end;
.el-form-item__content {
display: flex;
justify-content: space-around;
}
}
}
.commodity_list {
margin-top: 30px;
}
.pagination {
margin-top: 30px;
}
}
.listShow {
// padding-left: 60px;
padding-left: 120px;
li {
width: 100%;
padding-bottom: 10px;
.list-left {
// display:inline-block;
width: 30%;
// text-align: right;
padding-right: 10px;
}
.list-right {
display:inline-block;
width: 70%;
}
}
}
.text-area {
width: 100%;
padding-left: 120px;
.el-form-item__label {
width: 100%;
text-align: left;
}
}
.dialog-footer {
// display: flex;
// justify-content: center;
// align-items: center;
text-align: center;
}
.cancel {
background-color: #409EFF !important;
color: white;
border: none;
}
.confirm {
background-color: #b8b8b8 !important;
border: none;
}
.el-card__body{
padding: 10px;
}
\ No newline at end of file
<template>
<layout>
<div class="tab-show">
<!-- 审核状态 -->
<el-tabs
class="tab_list"
@tab-click="handleTabChange"
v-model="searchProps.status"
>
<el-tab-pane
label="待审核"
:name="TABS.pending"
@tab-click="handleTabChange"
></el-tab-pane>
<el-tab-pane
label="审核通过"
:name="TABS.passed"
@tab-click="handleTabChange"
></el-tab-pane>
<el-tab-pane
label="审核驳回"
:name="TABS.rejected"
@tab-click="handleTabChange"
></el-tab-pane>
<el-tab-pane
label="提现失败"
:name="TABS.failed"
@tab-click="handleTabChange"
>
</el-tab-pane>
</el-tabs>
</div>
<!-- 提现失败页 -->
<!-- <auditTab v-if="status_text == 'fourth'"></auditTab> -->
<el-card class="goods">
<!-- 筛选区 -->
<el-form inline class="search_condition">
<!-- 用户id -->
<el-form-item label="用户id">
<el-input v-model="searchProps.user_id" @input="
searchProps.user_id = $event
.replace(/\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g, '')
"
></el-input>
</el-form-item>
<el-button
type="primary"
style="margin-left: 30px; margin-bottom: 22px"
@click="findProducts"
>查询</el-button
>
</el-form>
<!-- 列表区 -->
<el-table class="goods_list" :data="goodsList" border stripe>
<el-table-column
label="提现用户"
prop="user_id"
align="center"
></el-table-column>
<el-table-column
label="所在圈"
prop="city_name"
align="center"
></el-table-column>
<el-table-column
label="提现金额"
prop="amount"
align="center"
></el-table-column>
<el-table-column
label="最近24小时收入"
prop="lately_amount"
align="center"
></el-table-column>
<el-table-column
label="近两天分享增长"
prop="lately_share"
align="center"
></el-table-column>
<el-table-column
label="近两天分享下载量"
prop="lately_download"
align="center"
></el-table-column>
<el-table-column
label="历史分享增长"
prop="history_share"
align="center"
></el-table-column>
<el-table-column
label="历史分享下载量"
prop="history_download"
align="center"
></el-table-column>
<el-table-column
label="历史下载留存"
prop="history_download_keep"
align="center"
></el-table-column>
<el-table-column
label="申请时间"
prop="create_time"
align="center"
></el-table-column>
<el-table-column label="状态" prop="status_text" align="center">
</el-table-column>
<el-table-column
label="审核时间"
prop="withdraw_audit_time"
align="center"
></el-table-column>
<el-table-column
label="审核人"
prop="audit_user_name"
align="center"
></el-table-column>
<!-- 操作快捷键 -->
<el-table-column label="操作" align="center" fixed="right" width="200">
<template v-slot:default="scope">
<el-button
type="text"
@click="handleDetail('look', scope.row.id)"
v-show="searchProps.status !== '3'"
>查看</el-button
>
<el-button
type="text"
v-show="searchProps.status == '0' && isAllowedToAudit"
@click="handleDetail('audit', scope.row.id)"
>审核</el-button
>
<el-popconfirm
title="确定解冻吗?"
@confirm="handleFinzingFind(scope.row.id)"
>
<template #reference>
<el-button
type="text"
v-show="searchProps.status == '3' && isAllowedToAudit"
>解冻</el-button
>
</template>
</el-popconfirm>
<!-- <el-button
type="text"
v-if="searchProps.withdraw_apply_status == '3'"
>重新发起</el-button
> -->
</template>
</el-table-column>
</el-table>
<!-- 页码区 -->
<el-pagination
class="pagination"
@current-change="handleCurrentChange"
v-model:currentPage="searchProps.page"
:page-size="searchProps.page_size"
layout="total,prev, pager, next, jumper"
:total="searchProps.count"
>
</el-pagination>
</el-card>
</layout>
<!-- 提现申请审核 -->
<!-- Form -->
<el-dialog
title="提现申请审核"
:show-close="false"
:close-on-click-modal="false"
v-model="outerVisible"
width="50%"
>
<el-form inline :model="form">
<el-form-item label="提现用户" label-width="120px">
<span style="display: inline-block; min-width: 200px">{{
dialogData.showData.user_id
}}</span>
</el-form-item>
<el-button
type="primary"
@click="handleBlackList('黑名单')"
v-show="dialogData.showMode === 'audit'"
>黑名单</el-button
>
<!-- <el-button
@click="handleButtonlist('白名单')"
v-show="dialogData.showMode === 'audit'"
>白名单</el-button
> -->
<ul class="listShow">
<li>
<span class="list-left">提现金额 :</span>
<span class="list-right">{{ dialogData.showData.amount }}</span>
</li>
<li>
<span class="list-left">最近24小时收入 :</span
><span class="list-right">{{
dialogData.showData.lately_amount
}}</span>
</li>
<li>
<span class="list-left">近两天分享增长 :</span
><span class="list-right">{{
dialogData.showData.lately_share
}}</span>
</li>
<li>
<span class="list-left">近两天分享下载量 :</span
><span class="list-right">{{
dialogData.showData.lately_download
}}</span>
</li>
<li>
<span class="list-left">历史分享增长 :</span
><span class="list-right">{{
dialogData.showData.history_share
}}</span>
</li>
</ul>
<el-form-item class="text-area" label="奖励明细:">
<el-table
:data="dialogData.showData.record_list || []"
border
align="center"
style="width: 100%"
max-height="200"
size="small"
>
<el-table-column
align="center"
prop="create_time"
label="流水时间"
width="120"
>
</el-table-column>
<el-table-column
align="center"
prop="amount"
label="分享用户量"
width="120"
>
<template v-slot:default="scope">
<span>{{ scope ? "+" + scope.row.amount : null }}</span>
</template>
</el-table-column>
<el-table-column
align="center"
prop="third_order_desc"
label="说明"
width="150"
>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button
type="primary"
@click="handleAdoptRefuse('通过')"
v-show="dialogData.showMode === 'audit'"
>通过</el-button
>
<el-button
type="danger"
@click="handleAdoptRefuse('拒绝')"
v-show="dialogData.showMode === 'audit'"
>拒绝</el-button
>
<el-button @click="outerVisible = false">{{
dialogData.showMode === "audit" ? "取消" : "返回"
}}</el-button>
</div>
</template>
</el-dialog>
</template>
<script>
import Layout from "../layout/index.vue";
import {
getApplyList,
getBlackList,
getWithdrawAudit,
getApplyDetail,
getFreezingFund,
getRolesForUser,
} from "@/service/Withdrawal/withdrawal";
import { ElMessage } from "element-plus";
import { fetchCurrentUser } from "../../../service/user";
const TABS = {
pending: "0",
passed: "1",
rejected: "2",
failed: "3",
};
export default {
name: "Examine",
components: { Layout },
data() {
return {
goodsList: [
// {
// user_id: "对的", //提现用户
// city_name: "北京", //所在圈
// amount: "45", ///提现金额
// lately_amount: "11", //最近24小时收入
// lately_share: "23", //近两天分享增长
// lately_download: "4", //近两天分享下载量
// history_share: "8", //历史分享增长
// history_download: "7", //历史分享下载量
// history_download_keep: "4", //历史分享留存
// create_time: "2021-5-4", //申请时间
// status_text: "待审核", //状态
// withdraw_audit_time: "", //审核时间
// audit_user_name: "我", //审核人
// },
],
// 查询参数
searchProps: {
user_id: "", //用户id
page: 1,
count: 0,
page_size: 20, //每页条数
status: TABS.pending, //状态
},
// 弹框
dialogData: {
showData: {}, //弹框展示
showMode: "audit", //判断是审核还是查看
},
// 黑名单
// blackList: {
// user_id: "",
// wallet_id: "",
// is_freezing: 0,
// opt_desc: "",
// },
award: "", //奖励明细
outerVisible: false, //外层弹框
permissions: [],
// constants
TABS,
};
},
created() {
this.getApplyList();
},
async mounted() {
const res = await this.getPermissionsAll();
if (!res) {
this.$router.push({ name: "Forbidden" });
return;
}
let withdrawlPermission = res.filter(
({ name }) => name === "withdrawal_audit"
);
if (withdrawlPermission.length === 0) {
// push to forbidden
this.$router.push({ name: "Forbidden" });
return;
}
console.log("withdrawlPermission", withdrawlPermission);
withdrawlPermission = withdrawlPermission[0];
// judge subpermission
let subpermissions = withdrawlPermission.sub_permissions.filter(
({ name }) => name === "show"
);
if (subpermissions.length === 0) {
this.$router.push({ name: "Forbidden" });
}
},
methods: {
async getPermissionsAll() {
// 不能够信赖 store 中的 email,无法知道全局中的 fetchCurrentUser 处理完毕
// 是一个重构的点
const { user } = await fetchCurrentUser();
const res = await getRolesForUser(user.email);
this.permissions = res;
return res;
},
// tab切换
handleTabChange() {
this.searchProps.page = 0;
this.getApplyList();
},
// 分页
handleCurrentChange(e) {
this.searchProps.page = e;
this.getApplyList();
},
// 提现申请审核详情
async handleDetail(showMode, id) {
try {
const res = await getApplyDetail({ id });
const showData = res.info || {};
this.dialogData = { ...this.dialogData, showMode, showData };
this.outerVisible = true;
} catch (error) {
ElMessage.error("请求获取信息失败");
}
},
// 二次确认弹框
handleConfirm(action, params) {
const urlObj = {
黑名单: getBlackList,
通过: getWithdrawAudit,
拒绝: getWithdrawAudit,
};
this.$confirm(`<p>你确定此操作吗</p><p>${action}</p>`, "再次确认", {
confirmButtonText: "取消",
cancelButtonText: "确定",
cancelButtonClass: "cancel",
confirmButtonClass: "confirm",
closeOnClickModal: false,
dangerouslyUseHTMLString: true,
center: true,
showClose: false,
type: "warning",
})
.then(() => {
this.$message({
type: "info",
message: "已取消操作",
});
})
.catch(async () => {
try {
const res = await urlObj[action](params);
this.getApplyList();
this.outerVisible = false;
this.$message({
type: "success",
message: "操作成功",
});
console.log(res);
} catch (error) {
this.$message({
type: "error",
message: "请求操作失败",
});
}
});
},
//获取黑名单
handleBlackList(action) {
const { id, user_id, wallet_id } = this.dialogData.showData;
const params = {
id,
user_id,
wallet_id,
is_freezing: action === "黑名单" ? 1 : 0,
opt_desc: "",
};
this.handleConfirm(action, params);
},
// 通过 & 拒绝
handleAdoptRefuse(action) {
const { withdraw_apply_id: id } = this.dialogData.showData;
const params = {
id,
withdraw_apply_status: action === "通过" ? 1 : 2,
};
this.handleConfirm(action, params);
},
// 获取提现审核列表
async getApplyList() {
const { user_id, page, page_size, status } = this.searchProps;
// 整理参数
const searchProps = {
user_id: user_id || undefined,
page,
page_size,
status,
};
console.log(this.searchProps);
try {
const res = await getApplyList(searchProps);
if (res.code !== 0) return this.$message.error(res.reason);
this.goodsList = res.result.list;
this.searchProps.count = res.result.count;
} catch (error) {
ElMessage.error("请求查询列表失败");
}
},
// 查询
findProducts() {
this.getApplyList();
},
// 解冻
async handleFinzingFind(id) {
try {
await getFreezingFund({ id });
this.getApplyList();
ElMessage.success("解冻成功");
} catch (error) {
ElMessage.error("请求解冻失败");
}
},
// 清空
resetDate() {
(this.goodsList = []),
// 查询参数
(this.searchProps = {
user_id: "", //用户id
page_size: 2, //页码
status: "0", //状态
page: 1,
count: 0, //总条数
}),
// 弹框
(this.dialogData = {
showData: {}, //弹框展示
showMode: "audit", //判断是审核还是查看
}),
(this.award = ""), //奖励明细
(this.outerVisible = false); //外层弹框
},
},
computed: {
isAllowedToAudit() {
// 用户不存在
if (!this.permissions) {
return false;
}
const WITHDRAWAL_PERMISSION_ID = 10;
const WITHDRAWAL_PERMISSION_ID1 = 10000005;
let withdrawlPermission = this.permissions.filter(
(item) => (item.id === WITHDRAWAL_PERMISSION_ID || item.id === WITHDRAWAL_PERMISSION_ID1)
);
// 无此模块权限
if (withdrawlPermission.length === 0) {
return false;
}
const AUDIT_PERMSSION_ID = 14;
const AUDIT_PERMSSION_ID1 = 10000014;
const auditPermission = withdrawlPermission[0].sub_permissions.filter(
(item) => (item.id === AUDIT_PERMSSION_ID || item.id === AUDIT_PERMSSION_ID1)
);
return auditPermission.length !== 0;
},
},
};
</script>
<style lang="less" src="./index.less" scope></style>
...@@ -67,14 +67,14 @@ ...@@ -67,14 +67,14 @@
</div> </div>
</template> </template>
<script> <script>
import page from "../components/Pagination" import page from "../../../components/Pagination"
import roleInfo from './components/roleInfo' import roleInfo from './components/roleInfo'
import { import {
getRole_list as reqGetRole_list, getAdd_role as reqGetAdd_role, getRole_list as reqGetRole_list, getAdd_role as reqGetAdd_role,
getAll_role_list as reqGetAll_role_list, getAll_role_list as reqGetAll_role_list,
getUpdate_role as reqGetUpdate_role, getUpdate_role as reqGetUpdate_role,
get_role_info as reqGet_role_info get_role_info as reqGet_role_info
} from "../../service/role"; } from "../../../service/role";
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
export default { export default {
name: 'KeepaddRole', name: 'KeepaddRole',
...@@ -128,7 +128,7 @@ export default { ...@@ -128,7 +128,7 @@ export default {
}, },
methods: { methods: {
toRoleDetail (row) { toRoleDetail (row) {
this.$router.push({ name: 'RoleDetail', query: { roleId: row.role_id } }); this.$router.push({ name: 'withdrawalRoleDetail', query: { roleId: row.role_id } });
}, },
goBack () { goBack () {
this.$router.go(-1) this.$router.go(-1)
......
<template>
<layout>
<role-list
appId="merchant-op-auditing"
detailPath="/op/withdrawal/roleRoleDetail"
rolePermissionId="role_management"
></role-list>
</layout>
</template>
<script>
import Layout from "../layout";
import RoleList from "../../../components/Roles/RoleList";
export default {
name: "KeepRoleManagement",
components: {
Layout,
RoleList,
},
};
</script>
<style lang="less" scoped></style>
<template>
<role-detail appId="merchant-op-auditing"></role-detail>
</template>
<script>
import RoleDetail from "../../../components/Roles/RoleDetail.vue";
export default {
components: {
RoleDetail,
},
};
</script>
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
<script> <script>
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { getRole_list as reqGetRoles } from '@/service/role'; import { getRole_list as reqGetRoles } from '../../../../../service/role';
export default { export default {
name: 'UserInfoEditModal', name: 'UserInfoEditModal',
......
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
<script> <script>
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { getRole_list as reqGetRoles } from '@/service/role'; import { getRole_list as reqGetRoles } from '../../../../../service/role';
export default { export default {
name: 'UserInfoEditModal', name: 'UserInfoEditModal',
......
<template>
<layout>
<user-list
appId="merchant-op-auditing"
userPermissionId="user_management"
></user-list>
</layout>
</template>
<script>
import UserList from "../../../../components/UserList";
import Layout from "../../layout";
export default {
components: {
Layout,
UserList,
},
};
</script>
<template>
<el-dropdown>
<div class="user-info">
<el-avatar
:src="userInfo.avatar || DEFAULT_AVATAR"
size="small"
></el-avatar>
<span class="user-name">{{userInfo.name}}</span>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<i class="el-icon-message"></i>
{{userInfo.email}}
</el-dropdown-item>
<el-dropdown-item>
<span><a
class="link"
href="//pandora.yidian-inc.com/"
>返回pandora工具平台</a></span>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
<script>
import { mapState } from 'vuex'
import { HEADER_CONFIG } from '@/config/pageconfig';
export default {
computed: mapState({
userInfo: state => (state.userInfo || {}),
}),
data () {
return {
DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar,
};
},
};
</script>
<style lang="less" scoped>
.user-info {
display: flex;
align-items: center;
}
.user-name {
margin-left: 12px;
color: #fff;
}
</style>
const headerConfig = [
{
name: "提现审核",
path: "/op/withdrawal/examine"
},
{
path: "/op/withdrawal/roleManageRole",
name: "角色管理",
requireAuthentication: true,
requiredPermission: "role_management"
},
{
path: "/op/withdrawal/user",
name: "用户管理",
requireAuthentication: true,
requiredPermission: "user_management"
}
];
export default headerConfig;
<template>
<div id="pageheader">
<div class="line"></div>
<el-menu
class="header-menu"
mode="horizontal"
:router="true"
background-color="#545c64"
text-color="#fff"
:default-active="activeMenu"
active-text-color="#ffd04b"
unique-opened
>
<el-menu-item
v-for="item in visibleMenuItems"
:index="item.path"
:key="item.path"
>
{{ item.name }}
</el-menu-item>
<el-menu-item key="usermenu" class="user-menu">
<user></user>
</el-menu-item>
</el-menu>
</div>
</template>
<script>
import headerConfig from "./config";
import User from "./User.vue";
export default {
name: "PageHeader",
components: {
User,
},
data() {
return {
headerConfig,
};
},
computed: {
activeMenu() {
return this.$route.path;
},
visibleMenuItems() {
const visibleMenuItems = this.headerConfig.filter((item) => {
if (!item.requireAuthentication) {
return true;
}
if (this.hasPermission(item.requiredPermission)) {
return true;
}
return false;
});
return visibleMenuItems;
},
},
beforeMount() {},
methods: {
hasPermission(permissionId) {
return (
this.$store.getters.moduleSubPermissions(
permissionId,
"merchant-op-auditing"
).length !== 0
);
},
},
};
</script>
<style lang="less"></style>
.layout {
display: flex;
flex-direction: column;
height: 100%;
}
.main {
flex: 1;
}
<template>
<div class="layout">
<!-- 页面公共 header -->
<page-header class="page-header"></page-header>
<!-- 页面主体部分 -->
<div class="main">
<slot></slot>
</div>
</div>
</template>
<script>
import PageHeader from '../components/PageHeader';
export default {
components: { PageHeader },
};
</script>
<style lang="less" src="./index.less"></style>
/**
* 团餐运营管理
*/
const groupmealRouters = [
{
path: "/op/groupmeal/orderManagement",
name: "orderManagement",
// redirect: "/op/groupmeal/orderManagement",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/orderManagement")
},
{
path: "/op/groupmeal/distrib",
name: "Distrib",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/Distrib")
},
];
export default groupmealRouters;
\ No newline at end of file
// 提现审核
const withdrawalRoutes = [
{
path: "/op/withdrawal",
redirect: "/op/withdrawal/examine"
},
{
path: "/op/withdrawal/examine",
name: "Examine",
component: () =>
import(/* webpackChunkName: "Withdrawal" */ "@/pages/Withdrawal/Examine")
},
//用户管理
{
path: "/op/withdrawal/user",
name: "User",
component: () =>
import(
/* webpackChunkName: "Withdrawal" */ "@/pages/Withdrawal/User/userList"
)
},
//角色管理
{
path: "/op/withdrawal/roleAddRole",
name: "AddRole",
component: () =>
import(
/* webpackChunkName: "Withdrawal" */ "@/pages/Withdrawal/Role/add-role"
),
meta: {
requireAuth: true,
keepAlive: true
}
},
{
path: "/op/withdrawal/roleManageRole",
name: "withdrawalManageRole",
component: () =>
import(
/* webpackChunkName: "Withdrawal" */ "@/pages/Withdrawal/Role/manage-role"
),
meta: {
requireAuth: true,
keepAlive: true
}
},
{
path: "/op/withdrawal/roleRoleDetail",
name: "withdrawalRoleDetail",
component: () =>
import(
/* webpackChunkName: "Withdrawal" */ "@/pages/Withdrawal/Role/role-detail"
)
}
];
export default withdrawalRoutes;
...@@ -4,14 +4,16 @@ import LifeNo from "../pages/Life-no/index.vue"; ...@@ -4,14 +4,16 @@ import LifeNo from "../pages/Life-no/index.vue";
import LifeNoDetail from "../pages/Life-no/life-no-detail.vue"; import LifeNoDetail from "../pages/Life-no/life-no-detail.vue";
import User from "../pages/User/userList"; import User from "../pages/User/userList";
import UserDetail from "../pages/User/user-detail.vue"; // import UserDetail from "../pages/User/user-detail.vue";
import AddRole from "../pages/Role/add-role.vue"; // import AddRole from "../pages/Role/add-role.vue";
import ManageRole from "../pages/Role/manage-role.vue"; import ManageRole from "../pages/Role/manage-role.vue";
import RoleDetail from "../pages/Role/role-detail.vue"; import RoleDetail from "../pages/Role/role-detail.vue";
import goodsRouter from "./Goods/index"; import goodsRouter from "./Goods/index";
import activityRouters from "./Activity/index"; import activityRouters from "./Activity/index";
import withdrawalRoutes from "./Withdrawal/index";
import groupmealRouters from "./Groupmeal/index";
const routes = [ const routes = [
{ {
path: "/op/enterprise", path: "/op/enterprise",
...@@ -81,42 +83,27 @@ const routes = [ ...@@ -81,42 +83,27 @@ const routes = [
name: "/op/User", name: "/op/User",
component: User component: User
}, },
{
path: "/op/userDetail",
name: "UserDetail",
component: UserDetail
},
//角色管理
{
path: "/op/roleAddRole",
name: "AddRole",
component: AddRole,
meta: {
requireAuth: true,
keepAlive: true
}
},
{ {
path: "/op/roleManageRole", path: "/op/roleManageRole",
name: "ManageRole", name: "ManageRole",
component: ManageRole, component: ManageRole,
meta: { meta: {
requireAuth: true, requireAuth: true
keepAlive: true
} }
}, },
{ {
path: "/op/roleRoleDetail", path: "/op/roleRoleDetail",
name: "RoleDetail", name: "RoleDetail",
component: RoleDetail, component: RoleDetail
meta: {
keepAlive: true
}
}, },
// 商品管理路由 // 商品管理路由
...goodsRouter, ...goodsRouter,
// 活动管理路由 // 活动管理路由
...activityRouters ...activityRouters,
// 钱包审核
...withdrawalRoutes,
// 团餐运营
...groupmealRouters
]; ];
console.log(routes); console.log(routes);
......
import axios from "@/utils/request";
// 获取主页配送员列表
export async function getList (params) {
const res = await axios.post("/api/v1/order/deliverer/list_day_deliverer_conf",params);
return res;
}
// 获取分配配送员列表
export async function getDelivererList(params) {
const res = await axios.post(
"/api/v1/order/deliverer/list_day_deliverer",
params
);
return res;
}
// 添加配送员
export async function getAddDeliverer(params) {
const res = await axios.post("/api/v1/order/deliverer/add_deliverer", params);
return res;
}
// 分配配送员
export async function getSaveDeliverer(params) {
const res = await axios.post(
"/api/v1/order/deliverer/save_day_deliverer",
params
);
return res;
}
// 获取订单列表
export async function getOrderList(params) {
const res = await axios.get("/api/v1/order/background/order_list", {
params
});
return res;
}
// 获取活动名称
export async function getMarketingList() {
const res = await axios.get("/api/v1/order/background/marketing_list");
return res;
}
// 获取商品名称
export async function getGoodsList(params) {
const res = await axios.get("/api/v1/order/background/goods_list", {
params
});
return res;
}
// 获取自提点
export async function getSubShopList(params) {
const res = await axios.get("/api/v1/order/background/sub_shop_list",{
params
});
return res;
}
// 导出订单
export async function orderExport(params) {
const res = await axios.get("/api/v1/order/background/order_export", {
params
});
return res;
}
// 打印订单
export async function orderPrint(params) {
const res = await axios.get("/api/v1/order/background/order_print", {
params
});
return res;
}
// 订单退款列表
export async function orderItemList(params) {
const res = await axios.get("/api/v1/order/background/order_item_list", {
params
});
return res;
}
// 订单退款
export async function refundOrder(orderId, itemsToRefund) {
// const params = {
// order_id: orderId,
// refund_list: itemsToRefund
// };
const res = await axios.post("/api/v1/order/background/order_refund", {
order_id: orderId,
refund_list: itemsToRefund
});
return res;
}
// 订单驳回
export async function orderRefundReject(params) {
const res = await axios.get("/api/v1/order/background/order_refund_reject", {
params
});
return res;
}
// 导出订单
export function getOrderExportURL(eventId, type) {
var ENV;
if(process.env.NODE_ENV == "development"){
ENV = "http://bp-dev.ini.yidian-inc.com/"
}else{
ENV = "http://bp-test.ini.yidian-inc.com/"
}
return `${ENV}order/background/order_export?marketing_id=${eventId}&type=${type}`;
}
export const defaultParams = {
appid: "merchant-op-auditing"
}
import axios from "@/utils/request";
import { defaultParams } from "./common";
const getParams = (p = {}) => {
return { ...defaultParams, ...p };
};
// 获取提现审核列表
export async function getApplyList(params) {
const res = await axios.get("/api/v1/get_withdrawal_apply_list", {
params: getParams(params)
});
return res;
}
// 黑名单,冻结用户
export async function getBlackList(params) {
const res = await axios.post(
"/api/v1/get_withdrawal_black_list",
getParams(params)
);
return res;
}
// 获取订单审核--通过,拒绝
export async function getWithdrawAudit(params) {
const res = await axios.post("/api/v1/get_withdraw_audit", getParams(params));
return res;
}
// 获取提现失败冻结
export async function getFreezingFund(params) {
const res = await axios.post("/api/v1/get_freezing_fund", getParams(params));
return res;
}
// 获取提现审核详情
export async function getApplyDetail(params) {
const res = await axios.get("/api/v1/get_apply_detail", {
params: getParams(params)
});
return res;
}
//权限列表
export async function getRolesForUser(user_email) {
const res = await axios.post(
"/api/v1/merchant/authority/get_role_list?appid=merchant-op-auditing",
{
user_email
}
);
return res.permissions;
}
import axios from '../utils/request'; import axios from "../utils/request";
// import qs from 'qs'; // import qs from 'qs';
//角色列表 //角色列表
export async function getRole_list (parmasRole_list) { export async function getRole_list(parmasRole_list, appid) {
const res = await axios.post("/api/v1/merchant/authority/role_list", parmasRole_list) const opts = {
return res; method: "post",
url: "/api/v1/merchant/authority/role_list",
params: { appid },
data: parmasRole_list
};
// const res = await axios.post("/api/v1/merchant/authority/role_list", parmasRole_list)
// return res;
return await axios(opts);
} }
//添加角色 //添加角色
export async function getAdd_role (parmasAdd_role) { export async function getAdd_role(parmasAdd_role, appid) {
const res = await axios.post("/api/v1/merchant/authority/add_role", parmasAdd_role) const opts = {
return res; method: "post",
url: "/api/v1/merchant/authority/add_role",
params: { appid },
data: parmasAdd_role
};
return await axios(opts);
// const res = await axios.post("/api/v1/merchant/authority/add_role", parmasAdd_role)
// return res;
} }
//角色编辑 //角色编辑
export async function getUpdate_role (parmasUpdate_role) { export async function getUpdate_role(parmasUpdate_role, appid) {
const res = await axios.post("/api/v1/merchant/authority/update_role", parmasUpdate_role) const opts = {
return res; method: "post",
url: "/api/v1/merchant/authority/update_role",
params: { appid },
data: parmasUpdate_role
};
return await axios(opts);
// const res = await axios.post("/api/v1/merchant/authority/update_role", parmasUpdate_role)
// return res;
} }
//角色详情 //角色详情
export async function get_role_info (role_id) { export async function get_role_info(role_id, appid) {
const res = await axios.post("/api/v1/merchant/authority/get_role_info", { const opts = {
role_id method: "post",
}) url: "/api/v1/merchant/authority/get_role_info",
return res.result; params: { appid },
data: { role_id }
};
return await axios(opts);
// const res = await axios.post("/api/v1/merchant/authority/get_role_info", {
// role_id
// })
// return res.result;
} }
//角色删除 //角色删除
export async function getDelete_role (role_id) { export async function getDelete_role(role_id, appid) {
const res = await axios.post("/api/v1/merchant/authority/delete_role", { const opts = {
role_id method: "post",
}) url: "/api/v1/merchant/authority/delete_role",
return res; params: { appid },
data: { role_id }
};
return await axios(opts);
// const res = await axios.post("/api/v1/merchant/authority/delete_role", {
// role_id
// })
// return res;
} }
//权限列表 //权限列表
export async function getAll_role_list (user_email) { export async function getAll_role_list(user_email, appid) {
const res = await axios.post("/api/v1/merchant/authority/get_role_list", { const opts = {
user_email method: "post",
}) url: "/api/v1/merchant/authority/get_role_list",
return res.permissions; params: { appid },
data: { user_email }
};
return await axios(opts);
// const res = await axios.post("/api/v1/merchant/authority/get_role_list", {
// user_email
// })
// return res.permissions;
} }
...@@ -24,17 +24,32 @@ export async function getUserDetail (params) { ...@@ -24,17 +24,32 @@ export async function getUserDetail (params) {
return await axios.get("/api/v1/users/detail", { params }); return await axios.get("/api/v1/users/detail", { params });
} }
export async function editUser (data) { export async function editUser (data, appid) {
return await axios.post("/api/v1/users/edit", data); const opts = {
method: "post",
url: "/api/v1/users/edit",
params: { appid },
data: data
};
return await axios(opts);
// return await axios.post("/api/v1/users/edit", data);
} }
export async function createUser (data) { export async function createUser (data, appid) {
return await axios.post("/api/v1/users/new", data); const opts = {
method: "post",
url: "/api/v1/users/new",
params: { appid },
data: data
};
return await axios(opts);
// return await axios.post("/api/v1/users/new", data);
} }
//用户详情 //用户详情
export async function getUser_detail (user_id) { // export async function getUser_detail (user_id) {
const res = await axios.post(`/api/v1/merchant/authority/get_user_info`, { // const res = await axios.post(`/api/v1/merchant/authority/get_user_info`, {
user_id // user_id
}) // })
return res.result; // return res.result;
} // }
import { createStore } from "vuex"; import { createStore } from "vuex";
import { getPermissions } from '@/service/user'; import { getPermissions } from "@/service/user";
import { PERMISSIONNAME_PAGEMODULE } from '../config/pageconfig' import { PERMISSIONNAME_PAGEMODULE } from "../config/pageconfig";
import { getRolesForUser } from "@/service/Withdrawal/withdrawal";
export default createStore({ export default createStore({
state: { state: {
permissions: null, permissions: null,
userInfo: null userInfo: null,
permissionsForApp: {}
}, },
mutations: { mutations: {
updateUserPermission (state, payload) { updateUserPermission(state, payload) {
state.permissions = payload; state.permissions = payload;
}, },
updateUserInfo (state, payload) { updateUserInfo(state, payload) {
state.userInfo = payload; state.userInfo = payload;
},
updatePermissionForApp(state, payload) {
const { appId, permissions } = payload;
state.permissionsForApp = state.permissionsForApp || {};
state.permissionsForApp[appId] = permissions;
} }
}, },
actions: { actions: {
async updateUserPermission ({ commit }, payload) { async updateUserPermission({ commit }, payload) {
const { permissions = [] } = await getPermissions(payload.email); const { permissions = [] } = await getPermissions(payload.email);
console.log("VUEX action updateUserPermission::", permissions); console.log("VUEX action updateUserPermission::", permissions);
commit('updateUserPermission', permissions) commit("updateUserPermission", permissions);
},
async fetchPermission({ commit }, { email, appId }) {
if (appId === "merchant-op-auditing") {
const permissions = await getRolesForUser(email);
if (!permissions) {
return;
}
const permissionMap = permissions.reduce((prev, permission) => {
prev[permission.name] = permission;
return prev;
}, {});
commit("updatePermissionForApp", { appId, permissions: permissionMap });
return;
}
console.error("无 appId 注册", appId);
} }
}, },
modules: {}, modules: {},
...@@ -29,7 +52,9 @@ export default createStore({ ...@@ -29,7 +52,9 @@ export default createStore({
subPermissions: state => { subPermissions: state => {
const permissionCol = {}; const permissionCol = {};
(state.permissions || []).forEach(element => { (state.permissions || []).forEach(element => {
PERMISSIONNAME_PAGEMODULE[element.name] && (permissionCol[PERMISSIONNAME_PAGEMODULE[element.name]] = element.sub_permissions) PERMISSIONNAME_PAGEMODULE[element.name] &&
(permissionCol[PERMISSIONNAME_PAGEMODULE[element.name]] =
element.sub_permissions);
}); });
return permissionCol; return permissionCol;
}, },
...@@ -38,10 +63,22 @@ export default createStore({ ...@@ -38,10 +63,22 @@ export default createStore({
* @param {*} module 模块名,可选值: enterprise, lifeNo, role, user * @param {*} module 模块名,可选值: enterprise, lifeNo, role, user
* @returns * @returns
*/ */
moduleSubPermissions: (state) => (module) => { moduleSubPermissions: state => (module, appId = "") => {
if (appId !== "") {
if (!state.permissionsForApp[appId]) {
return [];
}
if (!state.permissionsForApp[appId][module]) {
return [];
}
return state.permissionsForApp[appId][module].sub_permissions;
}
const permissionCol = {}; const permissionCol = {};
(state.permissions || []).forEach(element => { (state.permissions || []).forEach(element => {
PERMISSIONNAME_PAGEMODULE[element.name] && (permissionCol[PERMISSIONNAME_PAGEMODULE[element.name]] = element.sub_permissions) PERMISSIONNAME_PAGEMODULE[element.name] &&
(permissionCol[PERMISSIONNAME_PAGEMODULE[element.name]] =
element.sub_permissions);
}); });
return permissionCol[module]; return permissionCol[module];
} }
......
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