Commit 68962cf3 authored by liwenhong's avatar liwenhong

Merge branch 'master' into release-activity

parents 1dd36432 ae1b92d9
node_modules/
.idea/
.vscode/
build/*.js
src/assets
public
dist
.prettierrc.js
.eslintrc.js
server/
.DS_Store .DS_Store
node_modules node_modules
*.lock *.lock
# package-lock.json *package-lock.json
*.log *.log
dist dist
......
This diff is collapsed.
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
"lint": "vue-cli-service lint" "lint": "vue-cli-service lint"
}, },
"dependencies": { "dependencies": {
"@types/qr-image": "^3.2.4",
"axios": "^0.21.1", "axios": "^0.21.1",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"dayjs": "^1.10.6", "dayjs": "^1.10.6",
...@@ -28,7 +29,9 @@ ...@@ -28,7 +29,9 @@
"koa-static": "^5.0.0", "koa-static": "^5.0.0",
"koa-views": "^7.0.1", "koa-views": "^7.0.1",
"moment": "^2.29.1", "moment": "^2.29.1",
"qr-image": "^3.2.0",
"request": "^2.88.2", "request": "^2.88.2",
"uglifyjs-webpack-plugin": "^2.2.0",
"uuid": "^8.3.2", "uuid": "^8.3.2",
"vue": "3.0.11", "vue": "3.0.11",
"vue-router": "^4.0.0-beta.12", "vue-router": "^4.0.0-beta.12",
......
...@@ -6,6 +6,16 @@ ...@@ -6,6 +6,16 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="https://static.yidianzixun.com/img/faviconred.ico"> <link rel="icon" href="https://static.yidianzixun.com/img/faviconred.ico">
<!-- 使用CDN的CSS文件 -->
<% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.css) { %>
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="preload" as="style" />
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet" />
<% } %>
<!-- 使用CDN的JS文件 -->
<% for (let i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
<% } %>
<title><%= htmlWebpackPlugin.options.title %></title> <title><%= htmlWebpackPlugin.options.title %></title>
</head> </head>
......
const env = process.env.NODE_ENV || "development"; const env = process.env.NODE_ENV || "development";
const port = process.env.PORT || 8055; const port = process.env.PORT || 8055;
const API_YD_LOGIN = 'http://web-rest.int.yidian-inc.com/api/v1/pandora/auth'
const PANDORA_URI = { const PANDORA_URI = {
development: "http://pandora.yidian-inc.com", development: "http://pandora.yidian-inc.com",
test: "http://pandora.yidian-inc.com", test: "http://pandora.yidian-inc.com",
...@@ -19,7 +21,8 @@ module.exports = { ...@@ -19,7 +21,8 @@ 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],
GROUPMEAL_URI: API_INTERNAL_URI[env],
ACTIVITY_URI: API_INTERNAL_URI[env], ACTIVITY_URI: API_INTERNAL_URI[env],
WITHDRAWAL_URI: API_INTERNAL_URI[env], WITHDRAWAL_URI: API_INTERNAL_URI[env],
GROUPMEAL_URI: API_INTERNAL_URI[env], API_YD_LOGIN
}; };
const qr = require('qr-image');
exports.gen_qr_code = async (ctx) => {
const url = ctx.query.url;
try {
let img = qr.image(decodeURIComponent(url));
ctx.type= 'image/png';
ctx.body = img;
} catch (e) {
ctx.type='text/html;charset=utf-8';
ctx.body='<h1>414 Request-URI Too Large</h1>';
}
};
const fs = require('fs') const fs = require("fs");
const path = require('path') const path = require("path");
let cachePage = null; let cachePage = null;
exports.index = (ctx, next) => { exports.index = (ctx, next) => {
console.log('----- home') console.log("----- home");
// console.log(ctx.request.path)
// console.log(ctx.path)
const hostname = ctx.hostname;
const pathArr = ctx.path.substring(1).split("/");
// console.log(hostname);
// console.log(pathArr);
if (hostname === "opservice.yidianzixun.com" || hostname === "www.opservice.yidianzixun.com") {
if (pathArr[1] !== "activity" && pathArr[1] !== "groupmeal") {
ctx.body = "权限不足";
return;
}
}
if (!cachePage) { if (!cachePage) {
cachePage = fs.readFileSync(path.join(__dirname, '../../public/dist/index.html'), {encoding: 'utf-8'}) cachePage = fs.readFileSync(path.join(__dirname, "../../public/dist/index.html"), { encoding: "utf-8" });
} }
const content = cachePage; const content = cachePage;
ctx.body = content ctx.body = content;
} };
\ No newline at end of file
const PANDORA_URI = require("../config.js").PANDORA_URI; const PANDORA_URI = require("../config.js").PANDORA_URI;
const req = require("../utils/request").httpReq; const req = require("../utils/request").httpReq;
const { API_INTERNAL_URI, API_YD_LOGIN } = require("../config.js");
exports.fetch_user = async (ctx, next) => { exports.fetch_user = async (ctx, next) => {
const url = `${PANDORA_URI}/api/user/getuser`; const url = `${PANDORA_URI}/api/user/getuser`;
const cookie = ctx.request.header.cookie;
const opts = { const opts = {
url: url, url: url,
method: "GET", method: "GET",
...@@ -13,3 +14,25 @@ exports.fetch_user = async (ctx, next) => { ...@@ -13,3 +14,25 @@ exports.fetch_user = async (ctx, next) => {
}; };
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
}; };
exports.J_login = async (ctx, next) => {
var url = `${API_INTERNAL_URI}/merchant/authority/login`;
var opts = {
url: url,
method: 'POST',
json: true,
body: ctx.request.body
}
ctx.body = await req(ctx, opts)
}
exports.YD_login = async (ctx, next) => {
var url = API_YD_LOGIN;
var opts = {
url: url,
method: 'POST',
json: true,
body: ctx.request.body
}
ctx.body = await req(ctx, opts)
}
...@@ -9,15 +9,18 @@ const goods = require('./controllers/goods'); ...@@ -9,15 +9,18 @@ const goods = require('./controllers/goods');
const activity = require('./controllers/activity'); const activity = require('./controllers/activity');
const withdrawal = require('./controllers/withdrawal'); const withdrawal = require('./controllers/withdrawal');
const groupmeal = require('./controllers/groupmeal'); const groupmeal = require('./controllers/groupmeal');
const qr_code = require('./controllers/qr-code');
const router = Router(); const router = Router();
const API_VERSION = "/api/v1"; const API_VERSION = "/api/v1";
router.get(/^\/op.*/, static.index) router.get(/^\/op.*/, static.index)
router.get(`${API_VERSION}/qr_code`, qr_code.gen_qr_code);
router.get(`${API_VERSION}/fetch_user`, system.fetch_user); router.get(`${API_VERSION}/fetch_user`, system.fetch_user);
router.get(`${API_VERSION}/user/:type`, user.query) router.get(`${API_VERSION}/user/:type`, user.query)
router.post(`${API_VERSION}/J_login`, system.J_login);
router.post(`${API_VERSION}/YD_login`, system.YD_login);
router.get(`${API_VERSION}/users`, user.user_list); router.get(`${API_VERSION}/users`, user.user_list);
router.get(`${API_VERSION}/users/detail`, user.user_detail); router.get(`${API_VERSION}/users/detail`, user.user_detail);
router.post(`${API_VERSION}/users/edit`, user.user_edit); router.post(`${API_VERSION}/users/edit`, user.user_edit);
...@@ -52,7 +55,7 @@ router.post(`${API_VERSION}/goods/background/audit_reject`, goods.auditReject); ...@@ -52,7 +55,7 @@ router.post(`${API_VERSION}/goods/background/audit_reject`, goods.auditReject);
router.get(`${API_VERSION}/shop/background/shop_list`, goods.getShopsList); router.get(`${API_VERSION}/shop/background/shop_list`, goods.getShopsList);
router.post(`${API_VERSION}/shop/background/add_shop`, goods.addShop); router.post(`${API_VERSION}/shop/background/add_shop`, goods.addShop);
router.post(`${API_VERSION}/goods/background/edit_goods`, goods.editGoods) router.post(`${API_VERSION}/goods/background/edit_goods`, goods.editGoods)
router.get(`${API_VERSION}/get_goods_category_list`, goods.getCategoryList)
// 营销活动 // 营销活动
router.post(`${API_VERSION}/get_marketing_list`, goods.getMarketingList) router.post(`${API_VERSION}/get_marketing_list`, goods.getMarketingList)
router.post(`${API_VERSION}/get_addmarketing_list`, goods.getAddMarketingList) router.post(`${API_VERSION}/get_addmarketing_list`, goods.getAddMarketingList)
......
<template> <template>
<div class="app-wrapper"> <div class="app-wrapper">
<router-view v-slot="{ Component }"> <router-view v-slot="{ Component }">
<keep-alive v-if="$route.meta.keepAlive"> <keep-alive v-if="$route.meta.keepAlive">
<component :is="Component"> </component> <component :is="Component"></component>
</keep-alive> </keep-alive>
<component :is="Component" v-if="!$route.meta.keepAlive"> </component> <component :is="Component" v-if="!$route.meta.keepAlive"></component>
</router-view> </router-view>
</div> </div>
</template> </template>
<script> <script>
import { fetchCurrentUser } from "./service/user"; import { getCookie, redirectToLogin } from '@/utils/util';
import { redirectToLogin } from "./utils/util"; import { fetchCurrentUser } from './service/user';
export default { export default {
async created() { async mounted() {
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; if (!getCookie('username') && window.location.pathname != '/op/login') {
const { status, user } = await fetchCurrentUser(); this.$message('请先登录');
if (status === "success") { return redirectToLogin();
this.$store.commit("updateUserInfo", user); }
this.$store.dispatch("updateUserPermission", { email: user.email }); if (!this.$store.state.permissions) {
// 无奈之举,后期需要重构到提现管理中 const { status, user } = await fetchCurrentUser();
this.$store.dispatch("fetchPermission", { if (status === 'success') {
appId: "merchant-op-auditing", this.$store.commit('updateUserInfo', user);
}); await this.$store.dispatch('updateUserPermission', { email: user.email });
} else { this.$store.dispatch('fetchPermission', {
redirectToLogin(); appId: 'merchant-op-auditing'
} });
} }
}; }
}
};
</script> </script>
<style lang="less" src="./global.less"></style> <style lang="less" src="./global.less"></style>
<style lang="less" scoped> <style lang="less" scoped>
.app-wrapper { .app-wrapper {
height: 100%; height: 100%;
} }
</style> </style>
<template> <template>
<el-dropdown> <el-dropdown>
<div class="user-info"> <div class="user-info">
<el-avatar :src="userInfo.avatar || DEFAULT_AVATAR" size="small"></el-avatar> <el-avatar
:src="userInfo.avatar || DEFAULT_AVATAR"
size="small"
></el-avatar>
<span class="user-name">{{userInfo.name}}</span> <span class="user-name">{{userInfo.name}}</span>
</div> </div>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu trigger="hover">
<el-dropdown-item> <el-dropdown-item>
<i class="el-icon-message"></i> {{ userEmail }}
{{userInfo.email}}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item> <el-dropdown-item @click="$emit('logout')">
<span><a class="link" href="//pandora.yidian-inc.com/">返回pandora工具平台</a></span> 退出登录
</el-dropdown-item> </el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
...@@ -21,17 +23,22 @@ ...@@ -21,17 +23,22 @@
<script> <script>
import { mapState } from 'vuex' import { mapState } from 'vuex'
import { HEADER_CONFIG } from '@/config/pageconfig'; import { HEADER_CONFIG } from '@/config/pageconfig';
import { getCookie } from "@/utils/util";
export default { export default {
computed: mapState({ computed: mapState({
userInfo: state => (state.userInfo || {}), userInfo: state => (state.userInfo || {}),
}), }),
data() { data () {
return { return {
DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar, DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar,
userEmail: ''
}; };
}, },
mounted() {
this.userEmail = getCookie('username') || ''
}
}; };
</script> </script>
...@@ -43,6 +50,6 @@ export default { ...@@ -43,6 +50,6 @@ export default {
.user-name { .user-name {
margin-left: 12px; margin-left: 12px;
color: #FFF; color: #fff;
} }
</style> </style>
<template> <template>
<div id="pageheader"> <div>
<div class="line"></div>
<el-menu <el-menu
class="header-menu"
mode="horizontal"
:router="true" :router="true"
background-color="#545c64" background-color="#545c64"
text-color="#fff" text-color="#fff"
:default-active="activeMenu" :default-active="activeMenu"
active-text-color="#ffd04b" active-text-color="#ffd04b"
mode="horizontal"
> >
<el-menu-item <el-menu-item
v-for="item in menuItemsWithAuth" v-for="item in menuItemsWithAuth"
:index="item.path" :index="item.path"
:key="item.name" :key="item.name"
> >
{{ item.name }} {{ item.name }}
</el-menu-item> </el-menu-item>
<el-menu-item key="usermenu" class="user-menu"> <el-menu-item key="usermenu" class="user-menu">
<user></user> <user @logout="handleLogout"></user>
</el-menu-item> </el-menu-item>
</el-menu> </el-menu>
</div> </div>
...@@ -27,7 +25,8 @@ ...@@ -27,7 +25,8 @@
<script> <script>
import { HEADER_CONFIG } from "@/config/pageconfig"; import { HEADER_CONFIG } from "@/config/pageconfig";
import User from './User.vue'; import User from './User.vue';
import { createNamespacedHelpers } from 'vuex'
const { mapActions } = createNamespacedHelpers('login')
const { menuItems } = HEADER_CONFIG; const { menuItems } = HEADER_CONFIG;
export default { export default {
...@@ -52,7 +51,12 @@ export default { ...@@ -52,7 +51,12 @@ export default {
}, },
beforeMount () { beforeMount () {
}, },
methods: {}, methods: {
...mapActions(['logout']),
handleLogout() {
this.logout()
},
},
}; };
</script> </script>
...@@ -62,7 +66,7 @@ export default { ...@@ -62,7 +66,7 @@ export default {
line-height: 60px; line-height: 60px;
width: 100%; width: 100%;
} }
.header-menu .user-menu { .user-menu {
float: right !important; float: right !important;
margin-right: 20px; margin-right: 20px;
} }
......
...@@ -101,7 +101,7 @@ export default { ...@@ -101,7 +101,7 @@ export default {
}, },
mounted() { mounted() {
this.roleId = this.$route.query.roleId; this.roleId = this.$route.query.roleId;
let { email } = this.$store.state.userInfo; let email = this.$store.state.userInfo;
reqGetAll_role_list(email, this.appId).then((res) => { reqGetAll_role_list(email, this.appId).then((res) => {
this.permissionsAll = res.permissions; this.permissionsAll = res.permissions;
}); });
......
...@@ -155,6 +155,7 @@ export default { ...@@ -155,6 +155,7 @@ export default {
let appId = this.appId || ""; let appId = this.appId || "";
const modulePermissions = const modulePermissions =
this.$store.getters.moduleSubPermissions(rolePermissionId, appId) || []; this.$store.getters.moduleSubPermissions(rolePermissionId, appId) || [];
console.log('modulePermissions', modulePermissions)
return new Map(modulePermissions.map((ele) => [ele.name, true])); return new Map(modulePermissions.map((ele) => [ele.name, true]));
}, },
}, },
...@@ -218,7 +219,7 @@ export default { ...@@ -218,7 +219,7 @@ export default {
}); });
}, },
getPermissionsAll() { getPermissionsAll() {
let { email } = this.$store.state.userInfo; let email = this.$store.state.userInfo;
reqGetAll_role_list(email, this.appId).then((res) => { reqGetAll_role_list(email, this.appId).then((res) => {
this.permissionsAll = res.permissions; this.permissionsAll = res.permissions;
}); });
......
...@@ -11,29 +11,42 @@ import locale from "element-plus/lib/locale/lang/zh-cn"; ...@@ -11,29 +11,42 @@ import locale from "element-plus/lib/locale/lang/zh-cn";
import { fetchCurrentUser } from "./service/user"; import { fetchCurrentUser } from "./service/user";
import { checkPathAuth } from "./utils/authUtil"; import { checkPathAuth } from "./utils/authUtil";
import { redirectToLogin } from "./utils/util"; import { redirectToLogin } from "./utils/util";
import { ElMessage } from "element-plus";
// 处理路由权限 // 处理路由权限
router.beforeResolve(async (to, from, next) => { router.beforeResolve(async (to, from, next) => {
if (!to.meta.requireAuth) { if (!to.meta.requireAuth) {
next(); next();
return true; return true;
} }
if (!store.state.permissions) { if (!store.state.permissions) {
const { status, user } = await fetchCurrentUser(); const { status, user } = await fetchCurrentUser();
if (status === "success") { if (status === "success") {
store.commit("updateUserInfo", user); store.commit("updateUserInfo", user);
await store.dispatch("updateUserPermission", { email: user.email }); await store.dispatch("updateUserPermission", { email: user.email });
store.dispatch("fetchPermission", {
appId: "merchant-op-auditing",
});
} else { } else {
redirectToLogin(); redirectToLogin();
return false; return ElMessage("您没有权限");
} }
} }
// if (isDefault === "2") {
// await store.dispatch("updateUserPermission", {
// email: localStorage.getItem("_user_email")
// });
// }
if (!checkPathAuth(to.path)) { if (!checkPathAuth(to.path)) {
router.push({ name: "Forbidden" }); redirectToLogin();
return ElMessage("您没有权限");
// router.push({name: 'Forbidden'})
} else { } else {
next(); next();
return true;
} }
}); });
......
...@@ -128,6 +128,7 @@ ...@@ -128,6 +128,7 @@
v-model="commodityForm.inventory_total" v-model="commodityForm.inventory_total"
placeholder="" placeholder=""
@input="inventoryIpt" @input="inventoryIpt"
:rules="[{ required: true, message: '请输入库存' }]"
></el-input> ></el-input>
</el-form-item> </el-form-item>
<div style="display: inline-block; height: 42px; margin-left: 33px"> <div style="display: inline-block; height: 42px; margin-left: 33px">
...@@ -238,8 +239,9 @@ ...@@ -238,8 +239,9 @@
<script> <script>
import { GOODS_URI } from "../../../../../server/config"; import { GOODS_URI } from "../../../../../server/config";
import store from "../../../../store/index";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { getCookie } from "@/utils/util";
import { import {
addGoods, addGoods,
getBusinessList, getBusinessList,
...@@ -434,7 +436,8 @@ export default { ...@@ -434,7 +436,8 @@ export default {
marketing_name: this.editInfo.marketing_name, marketing_name: this.editInfo.marketing_name,
marketing_type: "4", marketing_type: "4",
ota_id: this.commodityForm.business1, ota_id: this.commodityForm.business1,
op_cur_user: store.state.userInfo.email, op_cur_user: getCookie('username'),
// op_cur_user: store.state.userInfo.email,
goods_sku_id: goodsSkuID, goods_sku_id: goodsSkuID,
}); });
if (res.code == 0) { if (res.code == 0) {
...@@ -501,7 +504,7 @@ export default { ...@@ -501,7 +504,7 @@ export default {
marketing_type: "4", marketing_type: "4",
price: this.commodityForm.price, price: this.commodityForm.price,
ota_id: this.commodityForm.business1, ota_id: this.commodityForm.business1,
op_cur_user: store.state.userInfo.email, op_cur_user: getCookie('username'),
}); });
if (res.code == 0) { if (res.code == 0) {
ElMessage.success({ ElMessage.success({
......
...@@ -55,6 +55,8 @@ import { ElMessage } from "element-plus"; ...@@ -55,6 +55,8 @@ import { ElMessage } from "element-plus";
import infoEditing from "./components/infoEditing.vue"; import infoEditing from "./components/infoEditing.vue";
import addProduc from "./components/addProduc.vue"; import addProduc from "./components/addProduc.vue";
import spellOrderSet from "./components/spellOrderSet.vue"; import spellOrderSet from "./components/spellOrderSet.vue";
import { getCookie } from "@/utils/util";
import { import {
addMarketing, addMarketing,
marketingInfo, marketingInfo,
...@@ -156,7 +158,7 @@ export default { ...@@ -156,7 +158,7 @@ export default {
goods_sku_id: this.goodsSkuIDArr.join(","), goods_sku_id: this.goodsSkuIDArr.join(","),
marketing_name: this.$refs.infoEdit.infoEditForm.title, marketing_name: this.$refs.infoEdit.infoEditForm.title,
marketing_type: "4", marketing_type: "4",
op_cur_user: this.$store.state.userInfo.email, op_cur_user: getCookie('username'),
start_time: dayJs(this.startDate).format("YYYY-MM-DD HH:mm:ss"), start_time: dayJs(this.startDate).format("YYYY-MM-DD HH:mm:ss"),
end_time: dayJs(this.endDate).format("YYYY-MM-DD HH:mm:ss"), end_time: dayJs(this.endDate).format("YYYY-MM-DD HH:mm:ss"),
pindan_pic: picList, pindan_pic: picList,
......
...@@ -333,6 +333,8 @@ ...@@ -333,6 +333,8 @@
import Layout from "@/layouts"; import Layout from "@/layouts";
import { getRecordInfo, getLog, postAudit } from "@/service/enterprise"; import { getRecordInfo, getLog, postAudit } from "@/service/enterprise";
import EnterpriseForm from "../components/enterpriseForm.vue"; import EnterpriseForm from "../components/enterpriseForm.vue";
import { getCookie } from "@/utils/util";
export default { export default {
name: "Audit", name: "Audit",
components: { Layout, EnterpriseForm }, components: { Layout, EnterpriseForm },
...@@ -421,8 +423,8 @@ export default { ...@@ -421,8 +423,8 @@ export default {
async auditResult (status) { async auditResult (status) {
const params = { const params = {
audit_status: status, audit_status: status,
audit_user_name: this.$store.state.userInfo.name, audit_user_name: (this.$store.state.userInfo && this.$store.state.userInfo.name) || getCookie('nickname'),
audit_user_id: this.$store.state.userInfo.userid, audit_user_id: (this.$store.state.userInfo && this.$store.state.userInfo.userid) || getCookie('userid'),
enterprise_auth_record_id: this.auditId, enterprise_auth_record_id: this.auditId,
audit_opinion: this.opinionArea audit_opinion: this.opinionArea
}; };
......
...@@ -182,6 +182,8 @@ ...@@ -182,6 +182,8 @@
<script> <script>
import { postBusiness, opCommit, opBusinessUpdate } from "@/service/enterprise"; import { postBusiness, opCommit, opBusinessUpdate } from "@/service/enterprise";
import { API_INTERNAL_URI } from "../../../../server/config"; import { API_INTERNAL_URI } from "../../../../server/config";
import { getCookie } from "@/utils/util";
export default { export default {
props: { props: {
enterpriseId: { type: Number }, enterpriseId: { type: Number },
...@@ -402,7 +404,7 @@ export default { ...@@ -402,7 +404,7 @@ export default {
data_from: 3, data_from: 3,
data_type, data_type,
mobile, mobile,
proxy_user_name: this.$store.state.userInfo.email proxy_user_name: getCookie('username')
}; };
postBusiness(enterpriseQuery).then(res => { postBusiness(enterpriseQuery).then(res => {
if (res.code !== 0) return this.$message.error(res.reason); if (res.code !== 0) return this.$message.error(res.reason);
......
...@@ -381,6 +381,18 @@ ...@@ -381,6 +381,18 @@
></el-input> ></el-input>
<span v-else>{{ goodsObj.original_price }}</span> <span v-else>{{ goodsObj.original_price }}</span>
</el-form-item> </el-form-item>
<el-form-item label="结算价">
<!-- oninput="value=value.toString().match(/^\d+(?:\.\d{0,2})?/)" -->
<el-input
oninput="value=value.toString().match(/^\d+(?:\.\d{0,2})?/)"
@input="changeValue($event, 'clear_price')"
v-if="$route.params.operation === 'EDIT'"
v-model="goodsObj.clear_price"
@change="perPrice"
></el-input>
<span v-else>{{ goodsObj.clear_price }}</span>
</el-form-item>
<h4 style="margin:20px 0">库存信息</h4> <h4 style="margin:20px 0">库存信息</h4>
<el-form-item label="剩余库存量:"> <el-form-item label="剩余库存量:">
<span>{{ goodsObj.inventory_rest }}</span> <span>{{ goodsObj.inventory_rest }}</span>
...@@ -450,7 +462,7 @@ ...@@ -450,7 +462,7 @@
">购买后不允许退款</span> ">购买后不允许退款</span>
<span v-else-if=" <span v-else-if="
$route.params.operation !== 'EDIT' && goodsObj.rule_refund === 3 $route.params.operation !== 'EDIT' && goodsObj.rule_refund === 3
">到期后不允许退款</span> ">到期后不退款</span>
</el-form-item> </el-form-item>
<el-form-item label="使用日期:"> <el-form-item label="使用日期:">
<el-radio-group <el-radio-group
...@@ -737,9 +749,9 @@ export default { ...@@ -737,9 +749,9 @@ export default {
rulesForm: { rulesForm: {
// 退款选项 // 退款选项
rulesOptions: [ rulesOptions: [
{ value: 1, label: "到期自动退款" }, { value: 1, label: "到期自动退款" },
{ value: 2, label: "购买后不允许退款" }, { value: 2, label: "购买后不允许退款" },
{ value: 3, label: "到期后不允许退款" } { value: 3, label: "到期后不退款" }
], ],
useStartTime: "", // 使用开始时间 useStartTime: "", // 使用开始时间
useEndTime: "", // 使用结束时间 useEndTime: "", // 使用结束时间
...@@ -791,6 +803,13 @@ export default { ...@@ -791,6 +803,13 @@ export default {
}, },
methods: { methods: {
//结算价两位小数校验
// changeValue(value, level) {
// if (value && value.indexOf(".") !== value.length - 1 && (parseFloat(value)|| value==='0'))
// this.goodsObj[level] = parseFloat(value);
// else if (value && value.indexOf(".") === value.length - 1) return;
// else this.goodsObj[level] = "";
// },
// 获取级联选择商品列表 // 获取级联选择商品列表
async getOptions () { async getOptions () {
try { try {
...@@ -1167,11 +1186,17 @@ export default { ...@@ -1167,11 +1186,17 @@ export default {
}, },
// 更改原价 // 更改原价
perPrice () { perPrice (val) {
if (!this.goodsObj.original_price || this.goodsObj.original_price == 0) { let reg = /^\d+(\.\d{1,2})?$/;
this.$nextTick(() => { if(!reg.test(val)) {
this.goodsObj.original_price = ""; return this.$message.error("请输入两位小数");
}) }
if (val.length === 0) val = 0;
// const parseOriginalPrice = Number(val).toFixed(2);
// val = Number(parseOriginalPrice);
if (typeof val === "number" &&isNaN(val)) {
val = 0;
return this.$message.error("原价价格必为数字");
} }
const parseOriginalPrice = Number(this.goodsObj.original_price).toFixed( const parseOriginalPrice = Number(this.goodsObj.original_price).toFixed(
2 2
...@@ -1240,6 +1265,7 @@ export default { ...@@ -1240,6 +1265,7 @@ export default {
rule_end_time: this.activeEndTime, // 规则结束时间 rule_end_time: this.activeEndTime, // 规则结束时间
inventory_add: this.inventoryAdd, // 库存增减 inventory_add: this.inventoryAdd, // 库存增减
original_price: this.goodsObj.original_price, // 原价 original_price: this.goodsObj.original_price, // 原价
clear_price: +this.goodsObj.clear_price, // 结算价
price: this.goodsObj.price, // 现价 price: this.goodsObj.price, // 现价
sub_shop_ids: this.shopIds, // 门店id sub_shop_ids: this.shopIds, // 门店id
rule_date_type: this.goodsObj.rule_date_type // 使用日期类型(周末/工作日) rule_date_type: this.goodsObj.rule_date_type // 使用日期类型(周末/工作日)
......
...@@ -72,7 +72,11 @@ ...@@ -72,7 +72,11 @@
> >
<template #default="scope"> <template #default="scope">
<span> <span>
{{ scope.row.first_commission_value + "%" }} {{
scope.row.first_commission_value
? (scope.row.first_commission_value + (scope.row.commission_mode==1 ? "%" : '元'))
: "0%"
}}
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
...@@ -85,7 +89,7 @@ ...@@ -85,7 +89,7 @@
<span> <span>
{{ {{
scope.row.second_commission_value scope.row.second_commission_value
? scope.row.second_commission_value + "%" ? (scope.row.second_commission_value + (scope.row.commission_mode==1 ? "%" : '元'))
: "0%" : "0%"
}} }}
</span> </span>
...@@ -200,6 +204,18 @@ ...@@ -200,6 +204,18 @@
></el-input> ></el-input>
<div style="margin: 20px 0"></div> <div style="margin: 20px 0"></div>
</el-form-item> </el-form-item>
<el-form-item
label="金额计算方式:"
prop="commission_mode"
:disable="disabled"
>
<el-radio-group
v-model="ruleForm.commission_mode"
>
<el-radio :label="2">按金额</el-radio>
<el-radio :label="1">按比例</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="上线佣金:" prop="first_commission_value"> <el-form-item label="上线佣金:" prop="first_commission_value">
<el-input <el-input
v-model="ruleForm.first_commission_value" v-model="ruleForm.first_commission_value"
...@@ -207,7 +223,7 @@ ...@@ -207,7 +223,7 @@
@input="changeValue($event, 'first_commission_value')" @input="changeValue($event, 'first_commission_value')"
:disabled="shopStart !== 0" :disabled="shopStart !== 0"
> >
<template #append>%</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">
...@@ -217,7 +233,7 @@ ...@@ -217,7 +233,7 @@
@input="changeValue($event, 'second_commission_value')" @input="changeValue($event, 'second_commission_value')"
:disabled="shopStart !== 0" :disabled="shopStart !== 0"
> >
<template #append>%</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="活动生效时间:">
...@@ -356,7 +372,24 @@ export default { ...@@ -356,7 +372,24 @@ export default {
Layout, Layout,
}, },
data() { data() {
var commission = (rule, value, callback) => { var commission = async (rule, value, callback) => {
if (
this.ruleForm.commission_mode == 1 &&
(this.ruleForm.first_commission_value +
this.ruleForm.second_commission_value >
50 ||
value > 50 )
) {
callback(new Error("上线佣金与分享者佣金之和不可大于50%"));
} else if (
this.ruleForm.commission_mode == 2 && this.ruleForm.first_commission_value >99
) {
callback(new Error("不能大于两位数"))
} else {
callback();
}
};
var commissionSec = async (rule, value, callback) => {
if ( if (
this.ruleForm.first_commission_value + this.ruleForm.first_commission_value +
this.ruleForm.second_commission_value > this.ruleForm.second_commission_value >
...@@ -364,10 +397,15 @@ export default { ...@@ -364,10 +397,15 @@ export default {
value > 50 value > 50
) { ) {
callback(new Error("上线佣金与分享者佣金之和不可大于50%")); callback(new Error("上线佣金与分享者佣金之和不可大于50%"));
} else if (
this.ruleForm.commission_mode == 2 && this.ruleForm.second_commission_value > 99
) {
callback(new Error("不能大于两位数"))
} else { } else {
callback(); callback();
} }
}; };
return { return {
tableData: [], tableData: [],
// 详情页 // 详情页
...@@ -400,6 +438,7 @@ export default { ...@@ -400,6 +438,7 @@ export default {
marketing_name: "", marketing_name: "",
first_commission_value: "", first_commission_value: "",
second_commission_value: "", second_commission_value: "",
commission_mode: '',
start_time: "", start_time: "",
end_time: "", end_time: "",
goods_spu_id: [], goods_spu_id: [],
...@@ -423,10 +462,11 @@ export default { ...@@ -423,10 +462,11 @@ export default {
trigger: "blur", trigger: "blur",
}, },
{ type: "number", message: "必须为数值型" }, { type: "number", message: "必须为数值型" },
{ validator: commission }, { validator: commissionSec },
], ],
first_commission_value: [ first_commission_value: [
{ type: "number", message: "必须为数值型" },
{ type: "number", message: "必须为数值型", trigger: "blur", },
{ validator: commission }, { validator: commission },
], ],
}, },
...@@ -445,7 +485,7 @@ export default { ...@@ -445,7 +485,7 @@ export default {
if (value && value.indexOf(".") !== value.length - 1 && parseFloat(value)) if (value && value.indexOf(".") !== value.length - 1 && parseFloat(value))
this.ruleForm[level] = parseFloat(value); this.ruleForm[level] = parseFloat(value);
else if (value && value.indexOf(".") === value.length - 1) return; else if (value && value.indexOf(".") === value.length - 1) return;
else this.ruleForm[level] = ""; // else this.ruleForm[level] = "";
}, },
// 查看详情列表 // 查看详情列表
async handleClick(row) { async handleClick(row) {
...@@ -606,6 +646,7 @@ export default { ...@@ -606,6 +646,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 || [];
...@@ -614,7 +655,7 @@ export default { ...@@ -614,7 +655,7 @@ export default {
!second_commission_value || !second_commission_value ||
!start_time || !start_time ||
!end_time !end_time
) { ){
ElMessage("请填写完整"); ElMessage("请填写完整");
return; return;
} }
...@@ -623,6 +664,7 @@ export default { ...@@ -623,6 +664,7 @@ export default {
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 + "",
commission_mode: commission_mode,
start_time: this.formatTime(start_time), start_time: this.formatTime(start_time),
end_time: this.formatTime(end_time), end_time: this.formatTime(end_time),
}; };
...@@ -649,6 +691,7 @@ export default { ...@@ -649,6 +691,7 @@ export default {
marketing_name: "", marketing_name: "",
first_commission_value: "", first_commission_value: "",
second_commission_value: "", second_commission_value: "",
commission_mode: '',
start_time: "", start_time: "",
end_time: "", end_time: "",
goods_spu_id: [], goods_spu_id: [],
...@@ -669,9 +712,10 @@ export default { ...@@ -669,9 +712,10 @@ export default {
this.getMarketingList(); this.getMarketingList();
}, },
}, },
created() { async created() {
this.getMarketingList(); await this.getMarketingList();
this.getAllList(); await this.getAllList();
this.ruleForm.commission_mode = 1
}, },
}; };
</script> </script>
......
...@@ -8,16 +8,12 @@ ...@@ -8,16 +8,12 @@
<span class="user-name">{{userInfo.name}}</span> <span class="user-name">{{userInfo.name}}</span>
</div> </div>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item> <el-dropdown-item>
<i class="el-icon-message"></i> {{ userEmail }}
{{userInfo.email}}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item> <el-dropdown-item @click="$emit('logout')">
<span><a 退出登录
class="link"
href="//pandora.yidian-inc.com/"
>返回pandora工具平台</a></span>
</el-dropdown-item> </el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
...@@ -27,7 +23,7 @@ ...@@ -27,7 +23,7 @@
<script> <script>
import { mapState } from 'vuex' import { mapState } from 'vuex'
import { HEADER_CONFIG } from '@/config/pageconfig'; import { HEADER_CONFIG } from '@/config/pageconfig';
import { getCookie } from "@/utils/util";
export default { export default {
computed: mapState({ computed: mapState({
userInfo: state => (state.userInfo || {}), userInfo: state => (state.userInfo || {}),
...@@ -36,8 +32,12 @@ export default { ...@@ -36,8 +32,12 @@ export default {
data () { data () {
return { return {
DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar, DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar,
userEmail: ''
}; };
}, },
mounted() {
this.userEmail = getCookie('username') || ''
}
}; };
</script> </script>
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
key="usermenu" key="usermenu"
class="user-menu" class="user-menu"
> >
<user></user> <user @logout="handleLogout"></user>
</el-menu-item> </el-menu-item>
</el-menu> </el-menu>
</div> </div>
...@@ -31,6 +31,8 @@ ...@@ -31,6 +31,8 @@
<script> <script>
import headerConfig from "./config"; import headerConfig from "./config";
import User from "./User.vue"; import User from "./User.vue";
import { createNamespacedHelpers } from 'vuex'
const { mapActions } = createNamespacedHelpers('login')
export default { export default {
name: "PageHeader", name: "PageHeader",
...@@ -47,8 +49,12 @@ export default { ...@@ -47,8 +49,12 @@ export default {
return this.$route.path; return this.$route.path;
} }
}, },
beforeMount () { }, methods: {
methods: {} ...mapActions(['logout']),
handleLogout() {
this.logout()
}
}
}; };
</script> </script>
......
...@@ -369,7 +369,7 @@ export default { ...@@ -369,7 +369,7 @@ export default {
} else if (process.env.NODE_ENV == "test") { } else if (process.env.NODE_ENV == "test") {
ENV = "http://bp-test.ini.yidian-inc.com/"; ENV = "http://bp-test.ini.yidian-inc.com/";
} else { } else {
ENV = "http://bp.ini.yidian-inc.com/"; ENV = "http://bp.int.yidian-inc.com/";
} }
url && window.open(ENV + url); url && window.open(ENV + url);
}, },
......
...@@ -8,16 +8,12 @@ ...@@ -8,16 +8,12 @@
<span class="user-name">{{userInfo.name}}</span> <span class="user-name">{{userInfo.name}}</span>
</div> </div>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu trigger="hover">
<el-dropdown-item> <el-dropdown-item>
<i class="el-icon-message"></i> {{ userEmail }}
{{userInfo.email}}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item> <el-dropdown-item @click="$emit('logout')">
<span><a 退出登录
class="link"
href="//pandora.yidian-inc.com/"
>返回pandora工具平台</a></span>
</el-dropdown-item> </el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
...@@ -27,6 +23,7 @@ ...@@ -27,6 +23,7 @@
<script> <script>
import { mapState } from 'vuex' import { mapState } from 'vuex'
import { HEADER_CONFIG } from '@/config/pageconfig'; import { HEADER_CONFIG } from '@/config/pageconfig';
import { getCookie } from "@/utils/util";
export default { export default {
computed: mapState({ computed: mapState({
...@@ -36,8 +33,12 @@ export default { ...@@ -36,8 +33,12 @@ export default {
data () { data () {
return { return {
DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar, DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar,
userEmail: ''
}; };
}, },
mounted() {
this.userEmail = getCookie('username') || ''
}
}; };
</script> </script>
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
key="usermenu" key="usermenu"
class="user-menu" class="user-menu"
> >
<user></user> <user @logout="handleLogout"></user>
</el-menu-item> </el-menu-item>
</el-menu> </el-menu>
</div> </div>
...@@ -31,6 +31,8 @@ ...@@ -31,6 +31,8 @@
<script> <script>
import headerConfig from "./config"; import headerConfig from "./config";
import User from "./User.vue"; import User from "./User.vue";
import { createNamespacedHelpers } from 'vuex'
const { mapActions } = createNamespacedHelpers('login')
export default { export default {
name: "PageHeader", name: "PageHeader",
...@@ -48,7 +50,12 @@ export default { ...@@ -48,7 +50,12 @@ export default {
} }
}, },
beforeMount () { }, beforeMount () { },
methods: {} methods: {
...mapActions(['logout']),
handleLogout() {
this.logout()
},
}
}; };
</script> </script>
......
...@@ -18,14 +18,20 @@ ...@@ -18,14 +18,20 @@
<el-button @click="login">登录</el-button> <el-button @click="login">登录</el-button>
</div> </div>
<div class="tip"> <div class="tip">
<p>1. 请使用一点邮箱登录,登录密码为当前的邮箱密码。</p> <p>1. 请使用邮箱登录,登录密码为当前的邮箱密码。</p>
<p>2. 用户默认无功能权限,请联系管理员开通。</p> <p>2. 用户默认无功能权限,请联系管理员开通。</p>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { login as reqLogin } from "../../service/user"; import { createNamespacedHelpers } from 'vuex'
const { mapActions } = createNamespacedHelpers('login')
import { fetchCurrentUser } from "@/service/user";
import { redirectPage } from "@/utils/util";
import {
// getAll_role_list as reqGetAll_role_list,
} from "@/service/role";
export default { export default {
name: "Login", name: "Login",
data () { data () {
...@@ -34,33 +40,49 @@ export default { ...@@ -34,33 +40,49 @@ export default {
email: "", email: "",
password: "", password: "",
}, },
permissionsAll: []
}; };
}, },
created () { }, created () {
},
computed: {
},
methods: { methods: {
...mapActions(['userLogin', 'logout']),
async login () { async login () {
const { email, password } = this.userInfo; this.logout()
const { email } = this.userInfo;
let validEmail = email.match(/@yidian-inc.com|@linkingcities/);
if (!email) { if (!email) {
console.error("请输入用户邮箱"); return this.$message("请输入用户邮箱");
return; } else if(!validEmail) {
} return this.$message("请输入合法邮箱");
try {
const emailAddress =
email.indexOf("@") === -1 ? email + "@yidian-inc.com" : email;
const res = await reqLogin(emailAddress, password);
if (!res || !res.token) return;
} catch (e) {
console.log(e);
// message.error("登录不成功,请检查登录信息后重试!")
} }
this.userInfo.email = email.indexOf("@") === -1 ? email + "@yidian-inc.com" : email;
const res = await this.userLogin({ payload: this.userInfo });
res && (await this.fentchUser(), redirectPage())
}, },
async fentchUser() {
if (!this.$store.state.permissions) {
const { status, user } = await fetchCurrentUser();
if (status === "success") {
this.$store.commit("updateUserInfo", user);
await this.$store.dispatch("updateUserPermission", { email: user.email });
this.$store.dispatch("fetchPermission", {
appId: "merchant-op-auditing",
});
}
}
}
}, },
}; };
</script> </script>
<style lang="less" scope> <style lang="less" scope>
#login-page { #login-page {
height: 100%; height: 100vh;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
...@@ -68,7 +90,6 @@ export default { ...@@ -68,7 +90,6 @@ export default {
background: url("../../assets/img/banner1.jpg") center top no-repeat; background: url("../../assets/img/banner1.jpg") center top no-repeat;
background-size: cover; background-size: cover;
color: #fff; color: #fff;
.title { .title {
font-size: 40px; font-size: 40px;
} }
......
...@@ -8,7 +8,7 @@ import Layout from "@/layouts"; ...@@ -8,7 +8,7 @@ import Layout from "@/layouts";
import RoleList from "@/components/Roles/RoleList"; import RoleList from "@/components/Roles/RoleList";
export default { export default {
name: 'KeepRoleManagement', // name: 'KeepRoleManagement',
components: { components: {
Layout, Layout,
RoleList RoleList
......
<template> <template>
<!-- <RoleDetail /> -->
<RoleDetail appId="merchant-op" /> <RoleDetail appId="merchant-op" />
</template> </template>
<script> <script>
......
...@@ -136,7 +136,6 @@ export default { ...@@ -136,7 +136,6 @@ export default {
this.$router.push({ name: "Forbidden" }); this.$router.push({ name: "Forbidden" });
return; return;
} }
console.log("withdrawlPermission", withdrawlPermission);
withdrawlPermission = withdrawlPermission[0]; withdrawlPermission = withdrawlPermission[0];
// judge subpermission // judge subpermission
let subpermissions = withdrawlPermission.sub_permissions.filter( let subpermissions = withdrawlPermission.sub_permissions.filter(
...@@ -326,4 +325,30 @@ export default { ...@@ -326,4 +325,30 @@ export default {
}, },
}; };
</script> </script>
<style lang="less" src="./index.less" scope></style> <style lang="less" src="./index.less" scope>
.goods-h5 {
width: 90%;
margin: 20px auto;
.dialog-footer {
display: flex;
justify-content: center;
align-items: center;
}
.apply-list {
li {
width: 70%;
display: flex;
justify-content: space-between;
span {
width: 70px;
text-align: left;
}
}
}
}
.el-message-box {
width: 80vw;
margin: 0 auto;
}
</style>
...@@ -107,4 +107,4 @@ ...@@ -107,4 +107,4 @@
.el-message-box { .el-message-box {
width: 20vw; width: 20vw;
margin: 0 auto; margin: 0 auto;
} }
\ No newline at end of file
...@@ -120,7 +120,7 @@ ...@@ -120,7 +120,7 @@
align="center" align="center"
></el-table-column> ></el-table-column>
<!-- 操作快捷键 --> <!-- 操作快捷键 -->
<el-table-column label="操作" align="center" fixed="right" width="200"> <el-table-column label="操作" align="center" width="130">
<template v-slot:default="scope"> <template v-slot:default="scope">
<el-button <el-button
type="text" type="text"
...@@ -227,6 +227,12 @@ ...@@ -227,6 +227,12 @@
dialogData.showData.history_share dialogData.showData.history_share
}}</span> }}</span>
</li> </li>
<li>
<span class="list-left">历史下载留存 :</span
><span class="list-right">{{
dialogData.showData.history_download_keep
}}</span>
</li>
</ul> </ul>
<el-form-item class="text-area" label="奖励明细:"> <el-form-item class="text-area" label="奖励明细:">
<el-table <el-table
...@@ -298,6 +304,7 @@ import { ...@@ -298,6 +304,7 @@ import {
} from "@/service/Withdrawal/withdrawal"; } from "@/service/Withdrawal/withdrawal";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { fetchCurrentUser } from "../../../service/user"; import { fetchCurrentUser } from "../../../service/user";
import { redirectToLogin } from "@/utils/util";
const TABS = { const TABS = {
pending: "0", pending: "0",
...@@ -361,10 +368,9 @@ export default { ...@@ -361,10 +368,9 @@ export default {
}, },
async mounted() { async mounted() {
const res = await this.getPermissionsAll(); const res = await this.getPermissionsAll();
if (!res) { if (!res) {
this.$router.push({ name: "Forbidden" }); redirectToLogin();
return; return ElMessage("您没有权限");
} }
let withdrawlPermission = res.filter( let withdrawlPermission = res.filter(
...@@ -373,17 +379,17 @@ export default { ...@@ -373,17 +379,17 @@ export default {
if (withdrawlPermission.length === 0) { if (withdrawlPermission.length === 0) {
// push to forbidden // push to forbidden
this.$router.push({ name: "Forbidden" }); redirectToLogin();
return; return ElMessage("您没有权限");
} }
console.log("withdrawlPermission", withdrawlPermission);
withdrawlPermission = withdrawlPermission[0]; withdrawlPermission = withdrawlPermission[0];
// judge subpermission // judge subpermission
let subpermissions = withdrawlPermission.sub_permissions.filter( let subpermissions = withdrawlPermission.sub_permissions.filter(
({ name }) => name === "show" ({ name }) => name === "show"
); );
if (subpermissions.length === 0) { if (subpermissions.length === 0) {
this.$router.push({ name: "Forbidden" }); redirectToLogin();
return ElMessage("您没有权限");
} }
}, },
methods: { methods: {
......
...@@ -12,7 +12,7 @@ import Layout from "../layout"; ...@@ -12,7 +12,7 @@ import Layout from "../layout";
import RoleList from "../../../components/Roles/RoleList"; import RoleList from "../../../components/Roles/RoleList";
export default { export default {
name: "KeepRoleManagement", name: "RoleManagement",
components: { components: {
Layout, Layout,
RoleList, RoleList,
......
...@@ -10,14 +10,10 @@ ...@@ -10,14 +10,10 @@
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item> <el-dropdown-item>
<i class="el-icon-message"></i> {{ userEmail }}
{{userInfo.email}}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item> <el-dropdown-item @click="$emit('logout')">
<span><a 退出登录
class="link"
href="//pandora.yidian-inc.com/"
>返回pandora工具平台</a></span>
</el-dropdown-item> </el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
...@@ -27,6 +23,7 @@ ...@@ -27,6 +23,7 @@
<script> <script>
import { mapState } from 'vuex' import { mapState } from 'vuex'
import { HEADER_CONFIG } from '@/config/pageconfig'; import { HEADER_CONFIG } from '@/config/pageconfig';
import { getCookie } from "@/utils/util";
export default { export default {
computed: mapState({ computed: mapState({
...@@ -36,8 +33,12 @@ export default { ...@@ -36,8 +33,12 @@ export default {
data () { data () {
return { return {
DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar, DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar,
userEmail: ''
}; };
}, },
mounted() {
this.userEmail = getCookie('username') || ''
}
}; };
</script> </script>
......
const headerConfig = [ const headerConfig = [
{ {
name: "提现审核", name: "提现审核",
path: "/op/withdrawal/examine" path: "/op/withdrawal/examine",
// requiredPermission: "withdrawal_audit"
}, },
{ {
name: "钱包账户", name: "钱包账户",
...@@ -10,13 +11,13 @@ const headerConfig = [ ...@@ -10,13 +11,13 @@ const headerConfig = [
{ {
path: "/op/withdrawal/roleManageRole", path: "/op/withdrawal/roleManageRole",
name: "角色管理", name: "角色管理",
requireAuthentication: true, // requireAuthentication: true,
requiredPermission: "role_management" requiredPermission: "role_management"
}, },
{ {
path: "/op/withdrawal/user", path: "/op/withdrawal/user",
name: "用户管理", name: "用户管理",
requireAuthentication: true, // requireAuthentication: true,
requiredPermission: "user_management" requiredPermission: "user_management"
} }
]; ];
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
{{ item.name }} {{ item.name }}
</el-menu-item> </el-menu-item>
<el-menu-item key="usermenu" class="user-menu"> <el-menu-item key="usermenu" class="user-menu">
<user></user> <user @logout="handleLogout"></user>
</el-menu-item> </el-menu-item>
</el-menu> </el-menu>
</div> </div>
...@@ -28,7 +28,9 @@ ...@@ -28,7 +28,9 @@
<script> <script>
import headerConfig from "./config"; import headerConfig from "./config";
import User from "./User.vue"; import User from "./User.vue";
import { createNamespacedHelpers } from 'vuex'
const { mapActions } = createNamespacedHelpers('login')
const { mapGetters } = createNamespacedHelpers('user')
export default { export default {
name: "PageHeader", name: "PageHeader",
components: { components: {
...@@ -40,6 +42,7 @@ export default { ...@@ -40,6 +42,7 @@ export default {
}; };
}, },
computed: { computed: {
...mapGetters(['moduleSubPermissions']),
activeMenu() { activeMenu() {
return this.$route.path; return this.$route.path;
}, },
...@@ -58,13 +61,17 @@ export default { ...@@ -58,13 +61,17 @@ export default {
}, },
beforeMount() {}, beforeMount() {},
methods: { methods: {
...mapActions(['logout']),
hasPermission(permissionId) { hasPermission(permissionId) {
return ( return (
this.$store.getters.moduleSubPermissions( this.$store.getters.moduleSubPermissions(
permissionId, permissionId,
"merchant-op-auditing" "merchant-op-auditing"
).length !== 0 ).length !== 0
); );
},
handleLogout() {
this.logout()
}, },
}, },
}; };
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
import PageHeader from '../components/PageHeader'; import PageHeader from '../components/PageHeader';
export default { export default {
components: { PageHeader }, components: { PageHeader },
}; };
</script> </script>
......
...@@ -76,14 +76,14 @@ ...@@ -76,14 +76,14 @@
> >
<!-- <page :totalNum="totalNum" @update="update" /> --> <!-- <page :totalNum="totalNum" @update="update" /> -->
<el-pagination <el-pagination
:class="totalNum/params.page_size>=7? 'page': ''" :class="totalNum / params.page_size >= 7 ? 'page' : ''"
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
v-model:currentPage="params.page" v-model:currentPage="params.page"
:page-size="params.page_size" :page-size="params.page_size"
layout="total, prev, pager, next" layout="total, prev, pager, next"
:total="totalNum" :total="totalNum"
> >
</el-pagination> </el-pagination>
</el-card> </el-card>
</div> </div>
</template> </template>
...@@ -108,16 +108,16 @@ export default { ...@@ -108,16 +108,16 @@ export default {
amount: 4, amount: 4,
balance: 555, balance: 555,
trade_type: "提现", trade_type: "提现",
status: "失败" status: "失败",
} },
], ],
tableLoading: false, tableLoading: false,
params: { params: {
page: 1, page: 1,
currentPage: 1, currentPage: 1,
page_size: 20 page_size: 20,
}, },
totalNum: null totalNum: null,
}; };
}, },
...@@ -148,7 +148,7 @@ export default { ...@@ -148,7 +148,7 @@ export default {
wallet_id, wallet_id,
page, page,
page_size, page_size,
type type,
}; };
getRecordList(params_list) getRecordList(params_list)
.then((res) => { .then((res) => {
...@@ -168,9 +168,15 @@ export default { ...@@ -168,9 +168,15 @@ export default {
}, },
// 返回 // 返回
handleBack() { handleBack() {
this.$router.back(); this.$router.push({
}, path: "/op/withdrawal/walletaccount",
}, query: {
search_id: this.$route.query.search_id || undefined,
search_type: this.$route.query.search_type || undefined
}
});
}
}
}; };
</script> </script>
...@@ -183,9 +189,8 @@ export default { ...@@ -183,9 +189,8 @@ export default {
padding: 20px; padding: 20px;
} }
.page { .page {
/deep/ .el-pager>li:last-of-type { /deep/ .el-pager > li:last-of-type {
display: none; display: none;
}
} }
}
</style> </style>
\ No newline at end of file
...@@ -119,7 +119,7 @@ ...@@ -119,7 +119,7 @@
<!-- 分页 --> <!-- 分页 -->
<!-- <page :totalNum="totalNum" @update="update" ref="params" /> --> <!-- <page :totalNum="totalNum" @update="update" ref="params" /> -->
<el-pagination <el-pagination
:class="totalNum/params.page_size>=7? 'page': ''" :class="totalNum / params.page_size >= 7 ? 'page' : ''"
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
v-model:currentPage="params.page" v-model:currentPage="params.page"
:page-size="params.page_size" :page-size="params.page_size"
...@@ -167,6 +167,8 @@ export default { ...@@ -167,6 +167,8 @@ export default {
}, },
created() { created() {
this.tableLoading = true; this.tableLoading = true;
this.searchProps.user_id = this.$route.query.search_id || "";
this.searchProps.type = +this.$route.query.search_type || "";
this.getAccountList(); this.getAccountList();
// this.getPermissionsAll(); // this.getPermissionsAll();
}, },
...@@ -224,24 +226,29 @@ export default { ...@@ -224,24 +226,29 @@ export default {
}是否继续?`, }是否继续?`,
"提示", "提示",
{ {
confirmButtonText: "确定", confirmButtonText: "取消",
cancelButtonText: "取消", cancelButtonText: "确定",
cancelButtonClass: "cancel",
confirmButtonClass: "confirm",
dangerouslyUseHTMLString: true,
closeOnClickModal: false,
showClose: false,
type: "warning", type: "warning",
center: true, center: true,
} }
) )
.then(() => { .then(() => {
this.$message({
type: "info",
message: "已取消",
});
})
.catch(() => {
if (+type === 0) { if (+type === 0) {
this.handleBlackList(user_id, wallet_id); this.handleBlackList(user_id, wallet_id);
} else { } else {
this.release(user_id, wallet_id); this.release(user_id, wallet_id);
} }
})
.catch(() => {
this.$message({
type: "info",
message: "已取消",
});
}); });
}, },
...@@ -265,7 +272,12 @@ export default { ...@@ -265,7 +272,12 @@ export default {
handelRecord(row) { handelRecord(row) {
this.$router.push({ this.$router.push({
path: "/op/withdrawal/flowrecord", path: "/op/withdrawal/flowrecord",
query: { user_id: row.user_id, wallet_id: row.wallet_id }, query: {
user_id: row.user_id,
wallet_id: row.wallet_id,
search_id: this.searchProps.user_id || undefined,
search_type: this.searchProps.type || undefined,
},
}); });
}, },
//黑名单 //黑名单
...@@ -301,11 +313,14 @@ export default { ...@@ -301,11 +313,14 @@ export default {
margin: 0 2px; margin: 0 2px;
} }
.page { .page {
/deep/ .el-pager>li:last-of-type { /deep/ .el-pager > li:last-of-type {
display: none; display: none;
} }
} }
// /deep/ .el-button el-button--default el-button--small .cancel {
// float: right;
// margin-left: 10px;
// }
</style> </style>
......
...@@ -32,25 +32,25 @@ const withdrawalRoutes = [ ...@@ -32,25 +32,25 @@ const withdrawalRoutes = [
/* webpackChunkName: "Withdrawal" */ "@/pages/Withdrawal/User/userList" /* webpackChunkName: "Withdrawal" */ "@/pages/Withdrawal/User/userList"
) )
}, },
//角色管理
{ {
path: "/op/withdrawal/roleAddRole", path: "/op/withdrawal/roleManageRole",
name: "AddRole", name: "KeepRoleManagement",
component: () => component: () =>
import( import(
/* webpackChunkName: "Withdrawal" */ "@/pages/Withdrawal/Role/add-role" /* webpackChunkName: "Withdrawal" */ "@/pages/Withdrawal/Role/manage-role"
), ),
meta: { meta: {
requireAuth: true, requireAuth: true,
keepAlive: true keepAlive: true
} }
}, },
//角色管理
{ {
path: "/op/withdrawal/roleManageRole", path: "/op/withdrawal/roleAddRole",
name: "withdrawalManageRole", name: "AddRole",
component: () => component: () =>
import( import(
/* webpackChunkName: "Withdrawal" */ "@/pages/Withdrawal/Role/manage-role" /* webpackChunkName: "Withdrawal" */ "@/pages/Withdrawal/Role/add-role"
), ),
meta: { meta: {
requireAuth: true, requireAuth: true,
......
...@@ -7,14 +7,21 @@ import User from "../pages/User/userList"; ...@@ -7,14 +7,21 @@ 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";
import RoleDetail from "../pages/Role/role-detail.vue"; // import ManageRole from "@/pages/Withdrawal/Role/manage-role.vue";
import RoleDetail from "../pages/Withdrawal/Role/role-detail.vue";
import goodsRouter from "./Goods/index"; import goodsRouter from "./Goods/index";
import activityRouters from "./Activity/index";
import withdrawalRoutes from "./Withdrawal/index"; import withdrawalRoutes from "./Withdrawal/index";
import groupmealRouters from "./Groupmeal/index"; import groupmealRouters from "./Groupmeal/index";
import activityRouters from "./Activity/index";
import Login from "@/pages/Login/index"; //登录
const routes = [ const routes = [
{
path: "/op/login",
name: "Login",
component: Login
},
{ {
path: "/op/enterprise", path: "/op/enterprise",
redirect: "/op/enterprise/certification" redirect: "/op/enterprise/certification"
...@@ -81,11 +88,14 @@ const routes = [ ...@@ -81,11 +88,14 @@ const routes = [
{ {
path: "/op/user", path: "/op/user",
name: "/op/User", name: "/op/User",
component: User component: User,
meta: {
requireAuth: true
}
}, },
{ {
path: "/op/roleManageRole", path: "/op/roleManageRole",
name: "ManageRole", name: "/op/ManageRole",
component: ManageRole, component: ManageRole,
meta: { meta: {
requireAuth: true requireAuth: true
...@@ -102,7 +112,6 @@ const routes = [ ...@@ -102,7 +112,6 @@ const routes = [
...activityRouters, ...activityRouters,
// 钱包审核 // 钱包审核
...withdrawalRoutes, ...withdrawalRoutes,
// 团餐运营
...groupmealRouters ...groupmealRouters
]; ];
......
...@@ -112,7 +112,7 @@ export function getOrderExportURL(eventId, type) { ...@@ -112,7 +112,7 @@ export function getOrderExportURL(eventId, type) {
}else if(process.env.NODE_ENV == "test"){ }else if(process.env.NODE_ENV == "test"){
ENV = "http://bp-test.ini.yidian-inc.com/" ENV = "http://bp-test.ini.yidian-inc.com/"
}else{ }else{
ENV = "http://bp.ini.yidian-inc.com/" ENV = "http://bp.int.yidian-inc.com/"
} }
return `${ENV}order/oldbackground/order_export?marketing_id=${eventId}&type=${type}`; return `${ENV}order/oldbackground/order_export?marketing_id=${eventId}&type=${type}`;
} }
...@@ -190,7 +190,7 @@ export function newGetOrderExportURL(eventId, type) { ...@@ -190,7 +190,7 @@ export function newGetOrderExportURL(eventId, type) {
}else if(process.env.NODE_ENV == "test"){ }else if(process.env.NODE_ENV == "test"){
ENV = "http://bp-test.ini.yidian-inc.com/" ENV = "http://bp-test.ini.yidian-inc.com/"
}else{ }else{
ENV = "http://bp.ini.yidian-inc.com/" ENV = "http://bp.int.yidian-inc.com/"
} }
return `${ENV}order/background/order_export?marketing_id=${eventId}&type=${type}`; return `${ENV}order/background/order_export?marketing_id=${eventId}&type=${type}`;
} }
import axios from '../utils/request'; import axios from '../utils/request';
import { getCookie } from "@/utils/util";
export async function login (email, password) { export async function yd_login (userInfo) {
const res = await axios.post(`/api/v1/login`, { const res = await axios.post("/api/v1/YD_login", userInfo);
email, password, authCode: '' return res;
}); }
return res.data;
export async function j_login (userInfo) {
const res = await axios.post("/api/v1/J_login", userInfo);
return res;
} }
export async function fetchCurrentUser () { export async function fetchCurrentUser () {
let isDefault = window.localStorage.getItem('isDefault');
let username = getCookie('username')
if(isDefault == 2) return {user:{email:username}, status: 'success'};
return await axios.get("/api/v1/fetch_user"); return await axios.get("/api/v1/fetch_user");
} }
......
import { createStore } from "vuex"; import Vuex from 'vuex'
import { getPermissions } from "@/service/user"; import user from './modules/user'
import { PERMISSIONNAME_PAGEMODULE } from "../config/pageconfig"; import login from './modules/login'
import { getRolesForUser } from "@/service/Withdrawal/withdrawal";
export default createStore({
state: {
permissions: null,
userInfo: null,
permissionsForApp: {}
},
mutations: {
updateUserPermission(state, payload) {
state.permissions = payload;
},
updateUserInfo(state, payload) {
state.userInfo = payload;
},
updatePermissionForApp(state, payload) {
const { appId, permissions } = payload;
state.permissionsForApp = state.permissionsForApp || {};
state.permissionsForApp[appId] = permissions;
}
},
actions: {
async updateUserPermission({ commit }, payload) {
const { permissions = [] } = await getPermissions(payload.email);
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) => { export default new Vuex.Store({
prev[permission.name] = permission; modules: {
return prev; user,
}, {}); login,
commit("updatePermissionForApp", { appId, permissions: permissionMap });
return;
}
console.error("无 appId 注册", appId);
}
},
modules: {},
getters: {
subPermissions: state => {
const permissionCol = {};
(state.permissions || []).forEach(element => {
PERMISSIONNAME_PAGEMODULE[element.name] &&
(permissionCol[PERMISSIONNAME_PAGEMODULE[element.name]] =
element.sub_permissions);
});
return permissionCol;
}, },
/** })
*
* @param {*} module 模块名,可选值: enterprise, lifeNo, role, user
* @returns
*/
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 = {};
(state.permissions || []).forEach(element => {
PERMISSIONNAME_PAGEMODULE[element.name] &&
(permissionCol[PERMISSIONNAME_PAGEMODULE[element.name]] =
element.sub_permissions);
});
return permissionCol[module];
}
}
});
import { yd_login, j_login } from "@/service/user";
import { isYdUser, setCookie, delCookie,redirectToLogin, getCookie } from "@/utils/util";
import { ElMessage } from "element-plus";
export default {
state: {},
mutations: {},
actions: {
async userLogin({commit}, { payload }) {
let flag = isYdUser(payload.email);
let params;
if(!flag) {
params = new URLSearchParams();
params.append('email', payload.email);
params.append('password', payload.password);
}
let res = flag ? await yd_login(payload) : await j_login(params)
let storage = window.localStorage;
// if(!getCookie('username')) {
if (res.userInfo && flag) {
if(!storage.getItem('YD_PANDORA_auth')) storage['YD_PANDORA_auth'] = JSON.stringify(res.auth || {})
if(!storage.getItem('YD_PANDORA_JWT_TOKEN')) storage['YD_PANDORA_JWT_TOKEN'] = (res.type + ' ' + res.token )|| ''
if(!storage.getItem('YD_PANDORA_user')) storage['YD_PANDORA_user'] = JSON.stringify(res.userInfo || {})
if(!getCookie('uid')) setCookie('uid', res.userInfo && res.userInfo.id, 16)
if(!getCookie('YD_PANDORA_UID')) setCookie('YD_PANDORA_UID', res.userInfo && res.userInfo.id, 16)
if(!getCookie('userid')) setCookie('userid', res.userInfo && res.userInfo.id, 16)
if(!getCookie('username')) setCookie('username', res.userInfo && res.userInfo.email, 16)
if(!getCookie('nickname')) setCookie('nickname', res.userInfo && res.userInfo.displayName, 16)
if(!getCookie('YD_PANDORA_JWT_TOKEN')) setCookie('YD_PANDORA_JWT_TOKEN', (res.type + ' ' + res.token )|| '', 16)
storage['isDefault'] = 1;
return true
} else if(+res.code === 0){
// TODO: refactor to pass directly
localStorage.setItem("_user_email", payload.email)
storage['isDefault'] = 2;
if(!getCookie('username')) setCookie('username', payload.email, 16);
return true
} else {
ElMessage.error(res);
}
// }
},
logout() {
return new Promise(async (resolve) => {
window.localStorage.clear();
delCookie()
redirectToLogin()
resolve()
});
}
},
getters: {},
namespaced: true
}
import { getPermissions } from "@/service/user";
import { PERMISSIONNAME_PAGEMODULE } from "@/config/pageconfig";
import { getRolesForUser } from "@/service/Withdrawal/withdrawal";
export default {
state: {
permissions: null,
userInfo: null,
permissionsForApp: {}
},
mutations: {
updateUserPermission(state, payload) {
state.permissions = payload;
},
updateUserInfo(state, payload) {
state.userInfo = payload;
},
updatePermissionForApp(state, payload) {
const { appId, permissions } = payload;
state.permissionsForApp = state.permissionsForApp || {};
state.permissionsForApp[appId] = permissions;
}
},
actions: {
async updateUserPermission({ commit }, payload) {
const { permissions = [] } = await getPermissions(payload.email);
console.log("VUEX action updateUserPermission::", permissions);
commit("updateUserPermission", permissions);
},
async fetchPermission({ commit }, { email, appId }) {
if (appId === "merchant-op-auditing") {
const permissions = await getRolesForUser(email);
console.log('permissions', permissions)
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);
}
},
getters: {
subPermissions: state => {
const permissionCol = {};
(state.permissions || []).forEach(element => {
PERMISSIONNAME_PAGEMODULE[element.name] &&
(permissionCol[PERMISSIONNAME_PAGEMODULE[element.name]] =
element.sub_permissions);
});
return permissionCol;
},
/**
*
* @param {*} module 模块名,可选值: enterprise, lifeNo, role, user
* @returns
*/
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 = {};
(state.permissions || []).forEach(element => {
PERMISSIONNAME_PAGEMODULE[element.name] &&
(permissionCol[PERMISSIONNAME_PAGEMODULE[element.name]] =
element.sub_permissions);
});
return permissionCol[module];
}
},
};
// 包含权限相关的工具方法,注意要在vue的生命周期中调用这些方法,否则会有获取不到权限的问题 // 包含权限相关的工具方法,注意要在vue的生命周期中调用这些方法,否则会有获取不到权限的问题
import store from '../store' import store from "../store";
import { PATH_PERMISSION_NAME } from '../config/pageconfig' import { PATH_PERMISSION_NAME } from "../config/pageconfig";
function getPermissionObj () { function getPermissionObj() {
// 支持到二级权限 // 支持到二级权限
const permissions = store.state.permissions || []; const permissions = store.state.user.permissions || [];
const authObj = {}; const authObj = {};
permissions.forEach(ele => { permissions.forEach(ele => {
authObj[ele.name] = {}; authObj[ele.name] = {};
if (ele.sub_permissions) { if (ele.sub_permissions) {
ele.sub_permissions.forEach(sp => { ele.sub_permissions.forEach(sp => {
authObj[ele.name][sp.name] = true; authObj[ele.name][sp.name] = true;
}) });
} }
}) });
return authObj; return authObj;
} }
...@@ -23,11 +23,11 @@ function getPermissionObj () { ...@@ -23,11 +23,11 @@ function getPermissionObj () {
* @param {*} path * @param {*} path
* @returns * @returns
*/ */
export function checkPathAuth (path) { export function checkPathAuth(path) {
const authObj = getPermissionObj(); const authObj = getPermissionObj();
if (path in PATH_PERMISSION_NAME) { if (path in PATH_PERMISSION_NAME) {
const authArr = PATH_PERMISSION_NAME[path].split('.'); const authArr = PATH_PERMISSION_NAME[path].split(".");
const [p, subP] = authArr; const [p, subP] = authArr;
if (p && subP) { if (p && subP) {
return !!authObj[p][subP]; return !!authObj[p][subP];
......
import axios from "axios"; import axios from "axios";
import store from "@/store"; import store from "@/store"
import { v1 as uuidv1 } from "uuid"; import { v1 as uuidv1 } from 'uuid';
import { getCookie } from "@/utils/util";
// import jsonBig from 'json-bigint' // import jsonBig from 'json-bigint'
// import { ElMessage } from "element-plus"; // import { ElMessage } from "element-plus";
...@@ -32,16 +33,17 @@ export const defaultConfig = { ...@@ -32,16 +33,17 @@ export const defaultConfig = {
*/ */
const getDefaultParams = () => { const getDefaultParams = () => {
return { return {
op_cur_user: store.state.userInfo && store.state.userInfo.email, 'op_cur_user': (store.state.userInfo && store.state.userInfo.email) || getCookie('username'),
reqid: uuidv1().replace(/-/g, "") 'reqid': uuidv1().replace(/-/g, '')
};
}
}; };
const getDefaultHeaders = config => { const getDefaultHeaders = config => {
const { method } = config; const { method } = config;
if (method.toLowerCase() === "post") { if (method.toLowerCase() === "post") {
return { return {
"Content-Type": "application/json" "Content-Type": config.url == '/api/v1/J_login'? "application/x-www-form-urlencoded" : "application/json"
}; }
} }
}; };
...@@ -64,8 +66,8 @@ instance.interceptors.request.use( ...@@ -64,8 +66,8 @@ instance.interceptors.request.use(
/** /**
* merge headers * merge headers
*/ */
config.headers = { ...getDefaultHeaders(config), ...config.headers }; config.headers = { ...getDefaultHeaders(config), ...config.headers }
// console.log('config.headers',)
/** /**
* merge params * merge params
*/ */
......
import router from "@/router";
// export async function handleUserLogin() { // export async function handleUserLogin() {
// const { status, user } = await fetchCurrentUser(); // const { status, user } = await fetchCurrentUser();
// // {"status":"success","user":{"userid":"732473439","name":"吕伟朝","email":"lvweichao@yidian-inc.com","avatar":""}} // // {"status":"success","user":{"userid":"732473439","name":"吕伟朝","email":"lvweichao@yidian-inc.com","avatar":""}}
...@@ -20,7 +21,49 @@ ...@@ -20,7 +21,49 @@
// } // }
export function redirectToLogin() { export function redirectToLogin() {
const loginUrl = '//pandora.yidian-inc.com/tools/admin/login'; let hasCallback = window.location.href.match(/\?callback/);
const cbUrl = location.href; if(hasCallback) return;
location.href = `${loginUrl}?callback=${cbUrl}`; let isLogin = window.location.pathname.match(/op\/login/);
router.push(`/op/login${!isLogin ? '?callback=' + window.encodeURIComponent(window.location.pathname) : ''}`)
}
export function redirectPage() {
let url = window.location.search.split('?callback=')[1] || window.location.pathname;
router.push(window.decodeURIComponent(url))
}
export function isYdUser(email) {
return email.match(/yidian-inc/) || false
}
export function setCookie(name, value) {
var hour = 8;
var exp = new Date();
exp.setTime(exp.getTime() + hour*60*60*1000);
document.cookie = name + "="+ value + ";expires=" + exp.toGMTString()+";path=/";
}
//获取cookie
export function getCookie(NameOfCookie) {
if (document.cookie.length > 0) {
let begin = document.cookie.indexOf(NameOfCookie + "=");
if (begin !== -1) {
begin += NameOfCookie.length + 1;
let end = document.cookie.indexOf(";", begin);
if (end === -1) end = document.cookie.length;
return document.cookie.substring(begin, end);
}
}
return null;
}
export function delCookie() {
var keys = document.cookie.match(/[^ =;]+(?==)/g)
if (keys) {
for (var i = keys.length; i--;) {
document.cookie = keys[i] + '=0;path=/;expires=' + new Date(0).toUTCString()
document.cookie = keys[i] + '=0;path=/;domain=' + document.domain + ';expires=' + new Date(0).toUTCString()
document.cookie = keys[i] + '=0;path=/;domain=yidian-inc.com;expires=' + new Date(0).toUTCString()
}
}
} }
\ No newline at end of file
const path = require("path"); const path = require("path");
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const isProduction = process.env.NODE_ENV === 'production';
const isDev = process.env.NODE_ENV === "development"; const isDev = process.env.NODE_ENV === "development";
const plugins = [];
let externalObj = {};
if(isProduction) {
externalObj = {
'element-plus': 'ElementPlus',
vue: "Vue",
"vue-router": "VueRouter",
vuex: "Vuex",
axios: "axios"
}
}
if (process.env.NODE_ENV === 'production') {
plugins.push(new UglifyJsPlugin({
uglifyOptions: {
warnings: false
},
sourceMap: false,
parallel: true,
}));
}
const cdn = {
// 开发环境
dev: {
css: [],
js: []
},
// 生产环境
build: {
css: [
"https://unpkg.com/element-plus/lib/theme-chalk/index.css"
],
js: [
'https://cdn.bootcdn.net/ajax/libs/vue/3.0.11/vue.global.js',
'https://cdn.bootcdn.net/ajax/libs/vue-router/4.0.6/vue-router.global.js',
'https://cdn.bootcdn.net/ajax/libs/vuex/4.0.0/vuex.global.js',
'https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.js',
'https://cdn.bootcdn.net/ajax/libs/element-plus/1.0.2-beta.44/index.full.js',
'https://cdn.bootcdn.net/ajax/libs/element-plus/1.0.2-beta.44/umd/locale/zh-cn.js',
'https://unpkg.com/dayjs/locale/zh-cn.js'
]
}
}
module.exports = { module.exports = {
outputDir: isDev ? "./dist" : path.resolve("./public/dist/"), outputDir: isDev ? "./dist" : path.resolve("./public/dist/"),
publicPath: isDev ? "/" : "/dist", publicPath: isDev ? "/" : "/dist",
indexPath: './index.html',
lintOnSave: false,
configureWebpack: { configureWebpack: {
devServer: { devServer: {
proxy: "http://127.0.0.1:8055", //http://localhost:8055 proxy: "http://127.0.0.1:8055", //http://localhost:8055
hot: true, hot: true,
disableHostCheck: true disableHostCheck: true,
} },
resolve: {
// 配置解析规则
alias: {
'@': path.join(__dirname, 'src') // 使用@别名简写src目录所在的绝对路径
},
},
externals: externalObj,
plugins,
}, },
chainWebpack: config => { chainWebpack: config => {
// 默认不开启 c // 默认不开启 c
...@@ -22,7 +75,15 @@ module.exports = { ...@@ -22,7 +75,15 @@ module.exports = {
// 修改页面 title // 修改页面 title
config.plugin("html").tap(args => { config.plugin("html").tap(args => {
args[0].title = "运营管理系统"; args[0].title = "运营管理系统";
if (isProduction) {
args[0].cdn = cdn.build
}
// if (!isProduction) {
// args[0].cdn = cdn.dev
// }
return args; return args;
}); });
} },
productionSourceMap: false,
}; };
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