Commit e595a044 authored by 郭志伟's avatar 郭志伟

feat(tenant): 接入量星球权限系统

parent 5ee9eceb
...@@ -20,10 +20,6 @@ export default { ...@@ -20,10 +20,6 @@ export default {
getTemplateList() { getTemplateList() {
return http.get('editor/get/template'); return http.get('editor/get/template');
}, },
// 获取权限
getTenantAuthInfo() {
return http.get('tenant/get');
},
// 商品列表-查询 // 商品列表-查询
skuInfo(params) { skuInfo(params) {
return http.post(`${config.opapiHost}/kdspOp/api/kdsp/activity/activity-goods/sku-info/list`, params, { return http.post(`${config.opapiHost}/kdspOp/api/kdsp/activity/activity-goods/sku-info/list`, params, {
......
...@@ -19,3 +19,9 @@ export function getUserInfo() { ...@@ -19,3 +19,9 @@ export function getUserInfo() {
accessToken: true accessToken: true
}); });
} }
// 获取权限
export function getMenuData() {
return http.get(`${config.opapiHost}/backStms/user/getresources/APP016`, {
accessToken: true
});
}
\ No newline at end of file
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<Row type="flex" class="layout-container" v-if="!isDashboard"> <Row type="flex" class="layout-container" v-if="!isDashboard">
<Sider collapsible :collapsed-width="71" style="z-index: 100" ref="sider" v-model="isCollapsed"> <Sider collapsible :collapsed-width="71" style="z-index: 100" ref="sider" v-model="isCollapsed">
<Menu :active-name="activeName" theme="dark" width="auto" :open-names="openNames" accordion @on-select="select" :class="menuitemClasses" ref="menus"> <Menu :active-name="activeName" theme="dark" width="auto" :open-names="openNames" accordion @on-select="select" :class="menuitemClasses" ref="menus">
<template v-for="(menu, index) in page"> <template v-for="(menu, index) in pageList">
<MenuItem style="background: #001529;" v-if="!isCollapsed" :name="index" :key="menu.name"> <MenuItem style="background: #001529;" v-if="!isCollapsed" :name="index" :key="menu.name">
<Icon :type="menu.icon"></Icon> <Icon :type="menu.icon"></Icon>
<span class="layout-text">{{ menu.name }}</span> <span class="layout-text">{{ menu.name }}</span>
...@@ -37,8 +37,8 @@ ...@@ -37,8 +37,8 @@
</div> </div>
</template> </template>
<script> <script>
import { mapActions } from 'vuex' import { mapActions, mapState } from 'vuex';
export default { export default {
data() { data() {
return { return {
showLoading: false, showLoading: false,
...@@ -87,6 +87,20 @@ import { mapActions } from 'vuex' ...@@ -87,6 +87,20 @@ import { mapActions } from 'vuex'
console.log('isDashboard', this.$route); console.log('isDashboard', this.$route);
}, },
computed: { computed: {
...mapState([ 'tmplList', 'draftList', 'workist' ]),
pageList() {
const pageList = JSON.parse(JSON.stringify(this.page));
if(this.tmplList) {
pageList.splice(2, 1);
}
if(this.draftList) {
pageList.splice(1, 1);
}
if(this.workist) {
pageList.splice(0, 1);
}
return pageList;
},
menuitemClasses: function() { menuitemClasses: function() {
return ['ivu-menu-dark', 'menu-item', this.isCollapsed ? 'collapsed-menu' : '']; return ['ivu-menu-dark', 'menu-item', this.isCollapsed ? 'collapsed-menu' : ''];
}, },
...@@ -95,7 +109,7 @@ import { mapActions } from 'vuex' ...@@ -95,7 +109,7 @@ import { mapActions } from 'vuex'
return this.$route.name === 'detail'; return this.$route.name === 'detail';
} }
}, },
} }
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.layout { .layout {
......
...@@ -29,7 +29,7 @@ export default class Layout extends Vue { ...@@ -29,7 +29,7 @@ export default class Layout extends Vue {
activeName: string = 'list'; activeName: string = 'list';
username: string = localStorage.get('user')?.name || '陌生人'; username: string = localStorage.get('user')?.name || '陌生人';
@Action('fetchTenantAuthData') fetchTenantAuthData; @Action('fetchTenantAuthData') fetchTenantAuthData;
@State(state => state) state; @State(state => state.tenant) tenant;
get isDashboard() { get isDashboard() {
return this.activeName === 'detail'; return this.activeName === 'detail';
......
...@@ -4,9 +4,9 @@ ...@@ -4,9 +4,9 @@
<i-col :span="3" class="layout-menu-left"> <i-col :span="3" class="layout-menu-left">
<Menu :active-name="activeName" theme="dark" width="auto" :open-names="['1']" accordion @on-select="select"> <Menu :active-name="activeName" theme="dark" width="auto" :open-names="['1']" accordion @on-select="select">
<div class="layout-logo-left">低代码平台</div> <div class="layout-logo-left">低代码平台</div>
<Menu-item name="list">作品列表</Menu-item> <Menu-item v-if="tenant.workist" name="list">作品列表</Menu-item>
<Menu-item name="my">我的草稿</Menu-item> <Menu-item v-if="tenant.draftList" name="my">我的草稿</Menu-item>
<Menu-item name="template">创意模板</Menu-item> <Menu-item v-if="tenant.tmplList" name="template">创意模板</Menu-item>
</Menu> </Menu>
</i-col> </i-col>
<i-col :span="21" class="layout-menu-right"> <i-col :span="21" class="layout-menu-right">
......
...@@ -12,7 +12,7 @@ import { getStyle } from '@service/utils.service'; ...@@ -12,7 +12,7 @@ import { getStyle } from '@service/utils.service';
export default class DynamicForm extends Vue { export default class DynamicForm extends Vue {
@Getter('pageInfo') pageInfo; @Getter('pageInfo') pageInfo;
@Getter('pageData') pageData; @Getter('pageData') pageData;
@State(state => state.tenant.hideShareBtn) hideShareBtn; @State(state => state.tenant.cartAndShareBtn) cartAndShareBtn;
@Prop(Boolean) value; @Prop(Boolean) value;
showPopup: boolean = false; showPopup: boolean = false;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
<Upload v-model="formCustom.shareCoverImage" :show-input="false" /> <Upload v-model="formCustom.shareCoverImage" :show-input="false" />
<p class="basic-form__tip">可选,默认使用页面缩略图,建议图片比例1:1,图片格式jpg、png</p> <p class="basic-form__tip">可选,默认使用页面缩略图,建议图片比例1:1,图片格式jpg、png</p>
</FormItem> </FormItem>
<FormItem label="分享打开方式" prop="shareOpenMethod" v-if="!hideShareBtn"> <FormItem label="分享打开方式" prop="shareOpenMethod" v-if="cartAndShareBtn">
<RadioGroup v-model="formCustom.shareOpenMethod"> <RadioGroup v-model="formCustom.shareOpenMethod">
<Radio :label="1" :disabled="!enableShare">小程序</Radio> <Radio :label="1" :disabled="!enableShare">小程序</Radio>
<Radio :label="2" :disabled="!enableShare">APP</Radio> <Radio :label="2" :disabled="!enableShare">APP</Radio>
......
...@@ -7,7 +7,7 @@ import { v4 as uuid } from 'uuid'; ...@@ -7,7 +7,7 @@ import { v4 as uuid } from 'uuid';
@Component({ name: 'DynamicComponent' }) @Component({ name: 'DynamicComponent' })
export default class DynamicComponent extends Vue { export default class DynamicComponent extends Vue {
@State(state => state.editor.gridLayout.colNum) colNum; @State(state => state.editor.gridLayout.colNum) colNum;
@State(state => state.tenant.hideFinanceTab) hideFinanceTab; @State(state => state.tenant.financeTab) financeTab;
@Prop({ default: () => ([]), type: Array }) data; @Prop({ default: () => ([]), type: Array }) data;
@Prop(String) type; @Prop(String) type;
...@@ -15,9 +15,9 @@ export default class DynamicComponent extends Vue { ...@@ -15,9 +15,9 @@ export default class DynamicComponent extends Vue {
eleConfigMap: object = {}; eleConfigMap: object = {};
activeName: string = ''; activeName: string = '';
@Watch('hideFinanceTab', { immediate: true }) @Watch('financeTab', { immediate: true })
onHideFinanceTabChange(val) { onFinanceTabChange(val) {
if (val && this.eleConfigMap.fs) { if (!val && this.eleConfigMap.fs) {
this.$delete(this.eleConfigMap, 'fs'); this.$delete(this.eleConfigMap, 'fs');
} }
} }
...@@ -30,7 +30,7 @@ export default class DynamicComponent extends Vue { ...@@ -30,7 +30,7 @@ export default class DynamicComponent extends Vue {
pre[cur.name] = { ...cur, children}; pre[cur.name] = { ...cur, children};
return pre; return pre;
}, {}); }, {});
this.onHideFinanceTabChange(this.hideFinanceTab); this.onFinanceTabChange(this.financeTab);
} else { } else {
this.eleConfig = chunk(newVal, 2); this.eleConfig = chunk(newVal, 2);
} }
......
...@@ -15,7 +15,7 @@ import { SHOP_CART_CONFIG } from '@service/staticData.service'; ...@@ -15,7 +15,7 @@ import { SHOP_CART_CONFIG } from '@service/staticData.service';
@Component({ components: { Upload, ColorSelector, BaseSelect, Textarea, Number, FormList, BackTopPicker, SwitchBtn }, name: 'DynamicPageForm' }) @Component({ components: { Upload, ColorSelector, BaseSelect, Textarea, Number, FormList, BackTopPicker, SwitchBtn }, name: 'DynamicPageForm' })
export default class DynamicPageForm extends Mixins(ContextMenuMixin) { export default class DynamicPageForm extends Mixins(ContextMenuMixin) {
@Getter('pageData') pageData; @Getter('pageData') pageData;
@State(state => state.tenant.hideShareBtn) hideShareBtn; @State(state => state.tenant.cartAndShareBtn) cartAndShareBtn;
title: string = '页面'; title: string = '页面';
commonStyleForm: object = {}; commonStyleForm: object = {};
...@@ -156,9 +156,9 @@ export default class DynamicPageForm extends Mixins(ContextMenuMixin) { ...@@ -156,9 +156,9 @@ export default class DynamicPageForm extends Mixins(ContextMenuMixin) {
return [...this.titleSchema, ...this.bottomSchema, ...this.floatSchema]; return [...this.titleSchema, ...this.bottomSchema, ...this.floatSchema];
} }
@Watch('hideShareBtn', { immediate: true }) @Watch('cartAndShareBtn', { immediate: true })
onAuthStateChange(val) { onAuthStateChange(val) {
const options = val ? ['自定义'] : ['购物车', '分享', '自定义']; const options = val ? ['购物车', '分享', '自定义'] : ['自定义'];
this.$set(this.floatSchema[1].formControl[0], 'options', options); this.$set(this.floatSchema[1].formControl[0], 'options', options);
} }
......
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
background: #fff; background: #fff;
box-shadow: 0 2px 3px 0 hsla(0,0%,39.2%,.06); box-shadow: 0 2px 3px 0 hsla(0,0%,39.2%,.06);
font-size: 16px; font-size: 16px;
z-index: 901; z-index: 10;
.ivu-col { .ivu-col {
text-align: center; text-align: center;
button { button {
......
import operationApi from '@api/operation.api'; import { getMenuData } from '@api/user.api';
import { Module, GetterTree, ActionTree, MutationTree } from 'vuex'; import { Module, GetterTree, ActionTree, MutationTree } from 'vuex';
import { import {
FETCH_AUTH_INFO FETCH_AUTH_INFO
...@@ -18,8 +18,29 @@ export default class TenantModule implements Module<EditorAuthInfo, RootState> { ...@@ -18,8 +18,29 @@ export default class TenantModule implements Module<EditorAuthInfo, RootState> {
actions: ActionTree<EditorAuthInfo, RootState> = { actions: ActionTree<EditorAuthInfo, RootState> = {
async fetchTenantAuthData({ commit }) { async fetchTenantAuthData({ commit }) {
const res: Record<any, any> = await operationApi.getTenantAuthInfo(); const res: Record<any, any> = await getMenuData();
commit(FETCH_AUTH_INFO, JSON.parse(res.authConfig as string)); const authMap: EditorAuthInfo = {};
res.forEach(item => {
let { uri, code } = item.node;
uri = uri ? uri : '';
code = code ? code : '';
if (uri.indexOf('/template') > -1) {
authMap.tmplList = true;
}
if (uri === '/my') {
authMap.draftList = true;
}
if (uri === '/list') {
authMap.workist = true;
}
if (code === 'cartAndShareBtn') {
authMap.cartAndShareBtn = true;
}
if (code === 'financeTab') {
authMap.financeTab = true;
}
});
commit(FETCH_AUTH_INFO, authMap);
} }
}; };
......
export default interface EditorAuthInfo { export default interface EditorAuthInfo {
hideFinanceTab?: boolean; financeTab?: boolean;
hideShareBtn?: boolean; cartAndShareBtn?: boolean;
workist?: boolean;
draftList?: boolean;
tmplList?: boolean;
} }
\ No newline at end of file
...@@ -96,7 +96,7 @@ instance.interceptors.request.use( ...@@ -96,7 +96,7 @@ instance.interceptors.request.use(
config.headers['X-Auth-Token'] = token; config.headers['X-Auth-Token'] = token;
if (config.accessToken) { config.headers['Access-Token'] = token; } if (config.accessToken) { config.headers['Access-Token'] = token; }
} }
const tenantId = localStorage.get('tenantId') || ''; const tenantId = localStorage.get('tenantId') || basicConfig.yxmTenantId || '';
config.headers['qg-tenant-id'] = tenantId || ''; config.headers['qg-tenant-id'] = tenantId || '';
return config; return config;
}, },
......
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