Skip to content

Commit d061398

Browse files
YunaiVgitee-org
authored andcommitted
!84 租户优化
Merge pull request !84 from 芋道源码/feature/tenant_op
2 parents db33e48 + 1fbd201 commit d061398

File tree

9 files changed

+448
-31
lines changed

9 files changed

+448
-31
lines changed

.env.development

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,6 @@ VUE_APP_BASE_API = '/dev-api'
1010

1111
# 路由懒加载
1212
VUE_CLI_BABEL_TRANSPILE_MODULES = true
13+
14+
# 多租户的开关
15+
VUE_APP_TENANT_ENABLE = true

src/api/system/tenantPackage.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import request from '@/utils/request'
2+
3+
// 创建租户套餐
4+
export function createTenantPackage(data) {
5+
return request({
6+
url: '/system/tenant-package/create',
7+
method: 'post',
8+
data: data
9+
})
10+
}
11+
12+
// 更新租户套餐
13+
export function updateTenantPackage(data) {
14+
return request({
15+
url: '/system/tenant-package/update',
16+
method: 'put',
17+
data: data
18+
})
19+
}
20+
21+
// 删除租户套餐
22+
export function deleteTenantPackage(id) {
23+
return request({
24+
url: '/system/tenant-package/delete?id=' + id,
25+
method: 'delete'
26+
})
27+
}
28+
29+
// 获得租户套餐
30+
export function getTenantPackage(id) {
31+
return request({
32+
url: '/system/tenant-package/get?id=' + id,
33+
method: 'get'
34+
})
35+
}
36+
37+
// 获得租户套餐分页
38+
export function getTenantPackagePage(query) {
39+
return request({
40+
url: '/system/tenant-package/page',
41+
method: 'get',
42+
params: query
43+
})
44+
}
45+
46+
// 获取租户套餐精简信息列表
47+
export function getTenantPackageList() {
48+
return request({
49+
url: '/system/tenant-package/get-simple-list',
50+
method: 'get'
51+
})
52+
}

src/utils/request.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import store from '@/store'
44
import { getToken } from '@/utils/auth'
55
import errorCode from '@/utils/errorCode'
66
import Cookies from "js-cookie";
7+
import {getTenantEnable} from "@/utils/ruoyi";
78

89
// 是否显示重新登录
910
let isReloginShow;
@@ -24,9 +25,11 @@ service.interceptors.request.use(config => {
2425
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
2526
}
2627
// 设置租户
27-
const tenantId = Cookies.get('tenantId');
28-
if (tenantId) {
29-
config.headers['tenant-id'] = tenantId;
28+
if (getTenantEnable()) {
29+
const tenantId = Cookies.get('tenantId');
30+
if (tenantId) {
31+
config.headers['tenant-id'] = tenantId;
32+
}
3033
}
3134
// get请求映射params参数
3235
if (config.method === 'get' && config.params) {

src/utils/ruoyi.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,17 @@ export function getNowDateTime(timeStr) {
170170
let seconds = now.getSeconds().toString().padStart(2, "0") // 得到秒;
171171
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
172172
}
173+
174+
/**
175+
* 获得租户功能是否开启
176+
*/
177+
export function getTenantEnable() {
178+
console.log("enable: " + process.env.VUE_APP_TENANT_ENABLE)
179+
if (process.env.VUE_APP_TENANT_ENABLE === "true") {
180+
return true;
181+
}
182+
if (process.env.VUE_APP_TENANT_ENABLE === "false") {
183+
return false;
184+
}
185+
return process.env.VUE_APP_TENANT_ENABLE || true;
186+
}

src/views/login.vue

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<div class="login">
33
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
44
<h3 class="title">芋道后台管理系统</h3>
5-
<el-form-item prop="tenantName">
5+
<el-form-item prop="tenantName" v-if="tenantEnable">
66
<el-input v-model="loginForm.tenantName" type="text" auto-complete="off" placeholder='租户'>
77
<svg-icon slot="prefix" icon-class="tree" class="el-input__icon input-icon" />
88
</el-input>
@@ -54,14 +54,16 @@ import { getCodeImg,socialAuthRedirect } from "@/api/login";
5454
import { getTenantIdByName } from "@/api/system/tenant";
5555
import Cookies from "js-cookie";
5656
import { encrypt, decrypt } from '@/utils/jsencrypt'
57-
import {InfraApiErrorLogProcessStatusEnum, SystemUserSocialTypeEnum} from "@/utils/constants";
57+
import {SystemUserSocialTypeEnum} from "@/utils/constants";
58+
import { getTenantEnable } from "@/utils/ruoyi";
5859
5960
export default {
6061
name: "Login",
6162
data() {
6263
return {
6364
codeUrl: "",
6465
captchaEnable: true,
66+
tenantEnable: true,
6567
loginForm: {
6668
username: "admin",
6769
password: "admin123",
@@ -71,6 +73,13 @@ export default {
7173
tenantName: "芋道源码",
7274
},
7375
loginRules: {
76+
username: [
77+
{ required: true, trigger: "blur", message: "用户名不能为空" }
78+
],
79+
password: [
80+
{ required: true, trigger: "blur", message: "密码不能为空" }
81+
],
82+
code: [{ required: true, trigger: "change", message: "验证码不能为空" }],
7483
tenantName: [
7584
{ required: true, trigger: "blur", message: "租户不能为空" },
7685
{
@@ -90,13 +99,6 @@ export default {
9099
trigger: 'blur'
91100
}
92101
],
93-
username: [
94-
{ required: true, trigger: "blur", message: "用户名不能为空" }
95-
],
96-
password: [
97-
{ required: true, trigger: "blur", message: "密码不能为空" }
98-
],
99-
code: [{ required: true, trigger: "change", message: "验证码不能为空" }]
100102
},
101103
loading: false,
102104
redirect: undefined,
@@ -113,6 +115,8 @@ export default {
113115
// }
114116
// },
115117
created() {
118+
// 租户开关
119+
this.tenantEnable = getTenantEnable();
116120
// 重定向地址
117121
this.redirect = this.$route.query.redirect;
118122
this.getCode();

src/views/system/dept/index.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
5858
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
5959
<el-row>
60-
<el-col :span="24" v-if="form.parentId !== 0">
60+
<el-col :span="24">
6161
<el-form-item label="上级部门" prop="parentId">
6262
<treeselect v-model="form.parentId" :options="deptOptions" :normalizer="normalizer" placeholder="选择上级部门" />
6363
</el-form-item>
@@ -152,9 +152,6 @@ export default {
152152
form: {},
153153
// 表单校验
154154
rules: {
155-
parentId: [
156-
{ required: true, message: "上级部门不能为空", trigger: "blur" }
157-
],
158155
name: [
159156
{ required: true, message: "部门名称不能为空", trigger: "blur" }
160157
],
@@ -278,6 +275,9 @@ export default {
278275
this.reset();
279276
getDept(row.id).then(response => {
280277
this.form = response.data;
278+
if (this.form.parentId === 0) { // 无父部门时,标记为 undefined,避免展示为 Unknown
279+
this.form.parentId = undefined;
280+
}
281281
this.open = true;
282282
this.title = "修改部门";
283283
});

src/views/system/role/index.vue

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -149,16 +149,8 @@
149149
<el-form-item label="菜单权限">
150150
<el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
151151
<el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
152-
<el-tree
153-
class="tree-border"
154-
:data="menuOptions"
155-
show-checkbox
156-
ref="menu"
157-
node-key="id"
158-
:check-strictly="form.menuCheckStrictly"
159-
empty-text="加载中,请稍后"
160-
:props="defaultProps"
161-
></el-tree>
152+
<el-tree class="tree-border" :data="menuOptions" show-checkbox ref="menu" node-key="id"
153+
:check-strictly="form.menuCheckStrictly" empty-text="加载中,请稍后" :props="defaultProps"></el-tree>
162154
</el-form-item>
163155
</el-form>
164156
<div slot="footer" class="dialog-footer">

src/views/system/tenant/index.vue

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,6 @@
1818
:key="dict.value" :label="dict.label" :value="dict.value"/>
1919
</el-select>
2020
</el-form-item>
21-
<el-form-item label="创建时间">
22-
<el-date-picker v-model="dateRangeCreateTime" size="small" style="width: 240px" value-format="yyyy-MM-dd"
23-
type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
24-
</el-form-item>
2521
<el-form-item>
2622
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
2723
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -45,8 +41,25 @@
4541
<el-table v-loading="loading" :data="list">
4642
<el-table-column label="租户编号" align="center" prop="id" />
4743
<el-table-column label="租户名" align="center" prop="name" />
44+
<el-table-column label="租户套餐" align="center" prop="packageId">
45+
<template slot-scope="scope">
46+
<el-tag v-if="scope.row.packageId === 0" type="danger">系统租户</el-tag>
47+
<el-tag v-else> {{getPackageName(scope.row.packageId)}} </el-tag>
48+
</template>
49+
</el-table-column>
4850
<el-table-column label="联系人" align="center" prop="contactName" />
4951
<el-table-column label="联系手机" align="center" prop="contactMobile" />
52+
<el-table-column label="账号额度" align="center" prop="accountCount">
53+
<template slot-scope="scope">
54+
<el-tag> {{scope.row.accountCount}} </el-tag>
55+
</template>
56+
</el-table-column>
57+
<el-table-column label="过期时间" align="center" prop="expireTime" width="180">
58+
<template slot-scope="scope">
59+
<span>{{ parseTime(scope.row.expireTime) }}</span>
60+
</template>
61+
</el-table-column>
62+
<el-table-column label="绑定域名" align="center" prop="domain" width="180" />
5063
<el-table-column label="租户状态" align="center" prop="status">
5164
<template slot-scope="scope">
5265
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/>
@@ -76,12 +89,33 @@
7689
<el-form-item label="租户名" prop="name">
7790
<el-input v-model="form.name" placeholder="请输入租户名" />
7891
</el-form-item>
92+
<el-form-item label="租户套餐" prop="packageId">
93+
<el-select v-model="form.packageId" placeholder="请选择租户套餐" clearable size="small">
94+
<el-option v-for="item in packageList" :key="item.id" :label="item.name" :value="item.id"/>
95+
</el-select>
96+
</el-form-item>
7997
<el-form-item label="联系人" prop="contactName">
8098
<el-input v-model="form.contactName" placeholder="请输入联系人" />
8199
</el-form-item>
82100
<el-form-item label="联系手机" prop="contactMobile">
83101
<el-input v-model="form.contactMobile" placeholder="请输入联系手机" />
84102
</el-form-item>
103+
<el-form-item v-if="form.id === undefined" label="用户名称" prop="username">
104+
<el-input v-model="form.username" placeholder="请输入用户名称" />
105+
</el-form-item>
106+
<el-form-item v-if="form.id === undefined" label="用户密码" prop="password">
107+
<el-input v-model="form.password" placeholder="请输入用户密码" type="password" show-password />
108+
</el-form-item>
109+
<el-form-item label="账号额度" prop="accountCount">
110+
<el-input-number v-model="form.accountCount" placeholder="请输入账号额度" controls-position="right" :min="0" />
111+
</el-form-item>
112+
<el-form-item label="过期时间" prop="expireTime">
113+
<el-date-picker clearable size="small" v-model="form.expireTime" type="date"
114+
value-format="timestamp" placeholder="请选择过期时间" />
115+
</el-form-item>
116+
<el-form-item label="绑定域名" prop="domain">
117+
<el-input v-model="form.domain" placeholder="请输入绑定域名" />
118+
</el-form-item>
85119
<el-form-item label="租户状态" prop="status">
86120
<el-radio-group v-model="form.status">
87121
<el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
@@ -100,6 +134,7 @@
100134
<script>
101135
import { createTenant, updateTenant, deleteTenant, getTenant, getTenantPage, exportTenantExcel } from "@/api/system/tenant";
102136
import { CommonStatusEnum } from '@/utils/constants'
137+
import {getTenantPackageList} from "@/api/system/tenantPackage";
103138
104139
export default {
105140
name: "Tenant",
@@ -117,6 +152,8 @@ export default {
117152
total: 0,
118153
// 租户列表
119154
list: [],
155+
// 租户套餐列表
156+
packageList: [],
120157
// 弹出层标题
121158
title: "",
122159
// 是否显示弹出层
@@ -136,13 +173,23 @@ export default {
136173
// 表单校验
137174
rules: {
138175
name: [{ required: true, message: "租户名不能为空", trigger: "blur" }],
176+
packageId: [{ required: true, message: "租户套餐不能为空", trigger: "blur" }],
139177
contactName: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
140-
status: [{ required: true, message: "租户状态(0正常 1停用)不能为空", trigger: "blur" }],
178+
status: [{ required: true, message: "租户状态不能为空", trigger: "blur" }],
179+
accountCount: [{ required: true, message: "账号额度不能为空", trigger: "blur" }],
180+
expireTime: [{ required: true, message: "过期时间不能为空", trigger: "blur" }],
181+
domain: [{ required: true, message: "绑定域名不能为空", trigger: "blur" }],
182+
username: [{ required: true, message: "用户名称不能为空", trigger: "blur" }],
183+
password: [{ required: true, message: "用户密码不能为空", trigger: "blur" }],
141184
}
142185
};
143186
},
144187
created() {
145188
this.getList();
189+
// 获得租户套餐列表
190+
getTenantPackageList().then(response => {
191+
this.packageList = response.data;
192+
})
146193
},
147194
methods: {
148195
/** 查询列表 */
@@ -168,8 +215,12 @@ export default {
168215
this.form = {
169216
id: undefined,
170217
name: undefined,
218+
packageId: undefined,
171219
contactName: undefined,
172220
contactMobile: undefined,
221+
accountCount: undefined,
222+
expireTime: undefined,
223+
domain: undefined,
173224
status: CommonStatusEnum.ENABLE,
174225
};
175226
this.resetForm("form");
@@ -249,6 +300,15 @@ export default {
249300
this.$download.excel(response, '租户.xls');
250301
this.exportLoading = false;
251302
}).catch(() => {});
303+
},
304+
/** 套餐名格式化 */
305+
getPackageName(packageId) {
306+
for (const item of this.packageList) {
307+
if (item.id === packageId) {
308+
return item.name;
309+
}
310+
}
311+
return '未知套餐';
252312
}
253313
}
254314
};

0 commit comments

Comments
 (0)