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