Compare commits

..

No commits in common. "1cc0f4671e0e5196f9ce8fcd39174725251d5cbd" and "83ebb675dca93c559384751c4fa091f9563d1da1" have entirely different histories.

16 changed files with 658 additions and 972 deletions

View File

@ -66,7 +66,7 @@ export default {
label: '订单出货日期', label: '订单出货日期',
dateType: 'daterange', dateType: 'daterange',
format: 'yyyy-MM-dd', format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss', valueFormat: 'yyyy-MM-dd hh:mm:ss',
rangeSeparator: '-', rangeSeparator: '-',
startPlaceholder: '开始时间', startPlaceholder: '开始时间',
endPlaceholder: '结束时间', endPlaceholder: '结束时间',

View File

@ -94,7 +94,7 @@ export default {
label: '订单出货日期', label: '订单出货日期',
dateType: 'daterange', dateType: 'daterange',
format: 'yyyy-MM-dd', format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss', valueFormat: 'yyyy-MM-dd hh:mm:ss',
rangeSeparator: '-', rangeSeparator: '-',
startPlaceholder: '开始时间', startPlaceholder: '开始时间',
endPlaceholder: '结束时间', endPlaceholder: '结束时间',

View File

@ -191,7 +191,7 @@ export default {
label: '选择日期', label: '选择日期',
dateType: 'daterange', dateType: 'daterange',
format: 'yyyy-MM-dd', format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss', valueFormat: 'yyyy-MM-dd hh:mm:ss',
rangeSeparator: '-', rangeSeparator: '-',
startPlaceholder: '开始时间', startPlaceholder: '开始时间',
endPlaceholder: '结束时间', endPlaceholder: '结束时间',

View File

@ -200,7 +200,7 @@ export default {
label: '选择日期', label: '选择日期',
dateType: 'daterange', dateType: 'daterange',
format: 'yyyy-MM-dd', format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss', valueFormat: 'yyyy-MM-dd hh:mm:ss',
rangeSeparator: '-', rangeSeparator: '-',
startPlaceholder: '开始时间', startPlaceholder: '开始时间',
endPlaceholder: '结束时间', endPlaceholder: '结束时间',

View File

@ -66,7 +66,7 @@ export default {
label: '订单出货日期', label: '订单出货日期',
dateType: 'daterange', dateType: 'daterange',
format: 'yyyy-MM-dd', format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss', valueFormat: 'yyyy-MM-dd hh:mm:ss',
rangeSeparator: '-', rangeSeparator: '-',
startPlaceholder: '开始时间', startPlaceholder: '开始时间',
endPlaceholder: '结束时间', endPlaceholder: '结束时间',

View File

@ -32,9 +32,7 @@
<el-table-column prop="process" label="工序" width="110"> <el-table-column prop="process" label="工序" width="110">
<template slot-scope="scope"> <template slot-scope="scope">
<span> <span>
{{ {{ scope.row.process>=0 ? processArr[scope.row.process].name : '' }}
scope.row.process >= 0 ? processArr[scope.row.process].name : ''
}}
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
@ -43,14 +41,11 @@
<span>{{ scope.row.cacheLocation === 0 ? '否' : '是' }}</span> <span>{{ scope.row.cacheLocation === 0 ? '否' : '是' }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column prop="warehouseStorehouseState" label="库位状态" width="100">
prop="warehouseStorehouseState"
label="库位状态"
width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<span> <span>
{{ {{
scope.row.warehouseStorehouseState >= 0 scope.row.warehouseStorehouseState>=0
? warehouseStorehouseState[scope.row.warehouseStorehouseState] ? warehouseStorehouseState[scope.row.warehouseStorehouseState]
.name .name
: '' : ''
@ -60,29 +55,16 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" width="70"> <el-table-column label="操作" width="70">
<template v-slot="scope"> <template v-slot="scope">
<span v-if="scope.row.deactivate === 1"> <el-button
<el-button size="mini"
size="mini" type="text"
type="text" :disabled="scope.row.warehouseStorehouseState===1"
:disabled="scope.row.warehouseStorehouseState === 1" @click="handleClick({ data: {id:scope.row}, type: 'edit' })"
@click="handleClick({ data: { id: scope.row }, type: 'edit' })" v-hasPermi="[
v-hasPermi="[ 'asrs:warehouse-storehouse-goods-specification:update',
'asrs:warehouse-storehouse-goods-specification:update', ]">
]"> <span class="iconfont icon-edit primary-color"></span>
<span class="iconfont icon-edit primary-color"></span> </el-button>
</el-button>
</span>
<span v-else>
<el-button
size="mini"
type="text"
@click="handleClick({ data: { id: scope.row }, type: 'restore' })"
v-hasPermi="[
'asrs:warehouse-storehouse-goods-specification:update',
]">
启用库位
</el-button>
</span>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -103,10 +85,7 @@ import AddOrUpdate from './add-or-updata';
import product from '../product-mini'; import product from '../product-mini';
import basicPage from '../mixins/basic-page'; import basicPage from '../mixins/basic-page';
import { parseTime } from '../mixins/code-filter'; import { parseTime } from '../mixins/code-filter';
import { import { getWarehouseStorehousePage, } from "@/api/asrs/warehouseStorehouse";
getWarehouseStorehousePage,
updateWarehouseStorehouse,
} from '@/api/asrs/warehouseStorehouse';
const processArr = [ const processArr = [
{ {
@ -229,8 +208,7 @@ export default {
this.listQuery.goodName = val.pname; this.listQuery.goodName = val.pname;
this.listQuery.goodCode = val.pcode; this.listQuery.goodCode = val.pcode;
this.listQuery.process = val.processId; this.listQuery.process = val.processId;
this.listQuery.warehouseStorehouseState = this.listQuery.warehouseStorehouseState = val.warehouseStorehouseStateId;
val.warehouseStorehouseStateId;
this.getDataList(); this.getDataList();
break; break;
case 'reset': case 'reset':
@ -254,21 +232,6 @@ export default {
console.log(val); console.log(val);
} }
}, },
otherMethods(val) {
if (val.type === 'restore') {
const dataForm = {
id: val.data.id.id,
deactivate: 1,
trayCode: val.data.id.trayCode ? val.data.id.trayCode : '',
};
updateWarehouseStorehouse(dataForm).then((response) => {
this.$modal.msgSuccess('启用成功');
this.getDataList();
});
} else {
console.log(11);
}
},
}, },
}; };
</script> </script>

View File

@ -53,31 +53,17 @@
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="80"> <el-table-column label="操作" width="70">
<template v-slot="scope"> <template v-slot="scope">
<span v-if="scope.row.deactivate === 1"> <el-button
<el-button size="mini"
size="mini" type="text"
type="text" @click="handleClick({ data: {id:scope.row}, type: 'edit' })"
:disabled="scope.row.warehouseStorehouseState === 1" v-hasPermi="[
@click="handleClick({ data: { id: scope.row }, type: 'edit' })" 'asrs:warehouse-storehouse-goods-specification:update',
v-hasPermi="[ ]">
'asrs:warehouse-storehouse-goods-specification:update', <span class="iconfont icon-edit primary-color"></span>
]"> </el-button>
<span class="iconfont icon-edit primary-color"></span>
</el-button>
</span>
<span v-else>
<el-button
size="mini"
type="text"
@click="handleClick({ data: { id: scope.row }, type: 'restore' })"
v-hasPermi="[
'asrs:warehouse-storehouse-goods-specification:update',
]">
启用库位
</el-button>
</span>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -98,10 +84,7 @@ import AddOrUpdate from './add-or-updata';
import product from '../product-mini'; import product from '../product-mini';
import basicPage from '../mixins/basic-page'; import basicPage from '../mixins/basic-page';
import { parseTime } from '../mixins/code-filter'; import { parseTime } from '../mixins/code-filter';
import { import { getWarehouseStorehousePage, } from "@/api/asrs/warehouseStorehouse";
getWarehouseStorehousePage,
updateWarehouseStorehouse,
} from '@/api/asrs/warehouseStorehouse';
const processArr = [ const processArr = [
{ {
@ -251,21 +234,6 @@ export default {
console.log(val); console.log(val);
} }
}, },
otherMethods(val) {
if (val.type === 'restore') {
const dataForm = {
id: val.data.id.id,
deactivate: 1,
trayCode: val.data.id.trayCode ? val.data.id.trayCode : '',
};
updateWarehouseStorehouse(dataForm).then((response) => {
this.$modal.msgSuccess('启用成功');
this.getDataList();
});
} else {
console.log(11);
}
},
}, },
}; };
</script> </script>

View File

@ -138,7 +138,7 @@ export default {
}, },
{ {
type: 'select', type: 'select',
label: '出入库状态', label: '状态',
selectOptions: warehouseStorehouseStorageState, selectOptions: warehouseStorehouseStorageState,
param: 'state', param: 'state',
defaultSelect: '', defaultSelect: '',
@ -149,7 +149,7 @@ export default {
label: '出入库时间', label: '出入库时间',
dateType: 'daterange', dateType: 'daterange',
format: 'yyyy-MM-dd', format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss', valueFormat: 'yyyy-MM-dd hh:mm:ss',
rangeSeparator: '-', rangeSeparator: '-',
startPlaceholder: '开始时间', startPlaceholder: '开始时间',
endPlaceholder: '结束时间', endPlaceholder: '结束时间',

View File

@ -138,7 +138,7 @@ export default {
}, },
{ {
type: 'select', type: 'select',
label: '出入库状态', label: '状态',
selectOptions: warehouseStorehouseStorageState, selectOptions: warehouseStorehouseStorageState,
param: 'state', param: 'state',
defaultSelect: '', defaultSelect: '',
@ -149,11 +149,11 @@ export default {
label: '出入库时间', label: '出入库时间',
dateType: 'daterange', dateType: 'daterange',
format: 'yyyy-MM-dd', format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss', valueFormat: 'yyyy-MM-dd hh:mm:ss',
rangeSeparator: '-', rangeSeparator: '-',
startPlaceholder: '开始时间', startPlaceholder: '开始时间',
endPlaceholder: '结束时间', endPlaceholder: '结束时间',
param: 'searchTime', param: 'searchTime2',
}, },
{ {
type: 'button', type: 'button',

View File

@ -110,7 +110,7 @@ export default {
label: '出入库时间', label: '出入库时间',
dateType: 'daterange', dateType: 'daterange',
format: 'yyyy-MM-dd', format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss', valueFormat: 'yyyy-MM-dd hh:mm:ss',
rangeSeparator: '-', rangeSeparator: '-',
startPlaceholder: '开始时间', startPlaceholder: '开始时间',
endPlaceholder: '结束时间', endPlaceholder: '结束时间',

View File

@ -1,138 +1,81 @@
<template xmlns=""> <template xmlns="">
<div class="container"> <div class="container">
<div class="logo"></div> <div class="logo"></div>
<!-- 登录区域 --> <!-- 登录区域 -->
<div class="content"> <div class="content">
<!-- 配图 --> <!-- 配图 -->
<div class="pic"></div> <div class="pic"></div>
<!-- 表单 --> <!-- 表单 -->
<div class="field"> <div class="field">
<!-- [移动端]标题 --> <!-- [移动端]标题 -->
<h2 class="mobile-title"> <h2 class="mobile-title">
<h3 class="title">芋道后台管理系统</h3> <h3 class="title">芋道后台管理系统</h3>
</h2> </h2>
<!-- 表单 --> <!-- 表单 -->
<div class="form-cont"> <div class="form-cont">
<el-tabs <el-tabs class="form" v-model="loginForm.loginType" style=" float:none;">
class="form" <el-tab-pane label="账号密码登录" name="uname">
v-model="loginForm.loginType" </el-tab-pane>
style="float: none"> <!-- <el-tab-pane label="短信验证码登录" name="sms">
<el-tab-pane label="账号密码登录" name="uname"></el-tab-pane>
<!-- <el-tab-pane label="短信验证码登录" name="sms">
</el-tab-pane> --> </el-tab-pane> -->
</el-tabs> </el-tabs>
<div> <div>
<el-form <el-form ref="loginForm" :model="loginForm" :rules="LoginRules" class="login-form">
ref="loginForm" <el-form-item prop="tenantName" v-if="tenantEnable">
:model="loginForm" <el-input v-model="loginForm.tenantName" type="text" auto-complete="off" placeholder='租户'>
:rules="LoginRules" <svg-icon slot="prefix" icon-class="tree" class="el-input__icon input-icon" />
class="login-form"> </el-input>
<el-form-item prop="tenantName" v-if="tenantEnable"> </el-form-item>
<el-input <!-- 账号密码登录 -->
v-model="loginForm.tenantName" <div v-if="loginForm.loginType === 'uname'">
type="text" <el-form-item prop="username">
auto-complete="off" <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
placeholder="租户"> <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
<svg-icon </el-input>
slot="prefix" </el-form-item>
icon-class="tree" <el-form-item prop="password">
class="el-input__icon input-icon" /> <el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码"
</el-input> @keyup.enter.native="getCode">
</el-form-item> <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
<!-- 账号密码登录 --> </el-input>
<div v-if="loginForm.loginType === 'uname'"> </el-form-item>
<el-form-item prop="username"> <el-checkbox v-model="loginForm.rememberMe" style="margin:0 0 25px 0;">记住密码</el-checkbox>
<el-input </div>
v-model="loginForm.username"
type="text"
auto-complete="off"
placeholder="账号">
<svg-icon
slot="prefix"
icon-class="user"
class="el-input__icon input-icon" />
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter.native="getCode">
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon" />
</el-input>
</el-form-item>
<el-checkbox
v-model="loginForm.rememberMe"
style="margin: 0 0 25px 0">
记住密码
</el-checkbox>
</div>
<!-- 短信验证码登录 --> <!-- 短信验证码登录 -->
<div v-if="loginForm.loginType === 'sms'"> <div v-if="loginForm.loginType === 'sms'">
<el-form-item prop="mobile"> <el-form-item prop="mobile">
<el-input <el-input v-model="loginForm.mobile" type="text" auto-complete="off" placeholder="请输入手机号">
v-model="loginForm.mobile" <svg-icon slot="prefix" icon-class="phone" class="el-input__icon input-icon" />
type="text" </el-input>
auto-complete="off" </el-form-item>
placeholder="请输入手机号"> <el-form-item prop="mobileCode">
<svg-icon <el-input v-model="loginForm.mobileCode" type="text" auto-complete="off" placeholder="短信验证码"
slot="prefix" class="sms-login-mobile-code-prefix" @keyup.enter.native="handleLogin">
icon-class="phone" <template>
class="el-input__icon input-icon" /> <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
</el-input> </template>
</el-form-item> <template slot="append">
<el-form-item prop="mobileCode"> <span v-if="mobileCodeTimer <= 0" class="getMobileCode" @click="getSmsCode"
<el-input style="cursor: pointer;">获取验证码</span>
v-model="loginForm.mobileCode" <span v-if="mobileCodeTimer > 0" class="getMobileCode">{{ mobileCodeTimer }}秒后可重新获取</span>
type="text" </template>
auto-complete="off" </el-input>
placeholder="短信验证码" </el-form-item>
class="sms-login-mobile-code-prefix" </div>
@keyup.enter.native="handleLogin">
<template>
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon" />
</template>
<template slot="append">
<span
v-if="mobileCodeTimer <= 0"
class="getMobileCode"
@click="getSmsCode"
style="cursor: pointer">
获取验证码
</span>
<span v-if="mobileCodeTimer > 0" class="getMobileCode">
{{ mobileCodeTimer }}秒后可重新获取
</span>
</template>
</el-input>
</el-form-item>
</div>
<!-- 下方的登录按钮 --> <!-- 下方的登录按钮 -->
<el-form-item style="width: 100%"> <el-form-item style="width:100%;">
<el-button <el-button :loading="loading" size="medium" type="primary" style="width:100%;"
:loading="loading" @click.native.prevent="getCode">
size="medium" <span v-if="!loading"> </span>
type="primary" <span v-else> 中...</span>
style="width: 100%" </el-button>
@click.native.prevent="getCode"> </el-form-item>
<span v-if="!loading"> </span>
<span v-else> 中...</span>
</el-button>
</el-form-item>
<!-- 社交登录 --> <!-- 社交登录 -->
<!-- <el-form-item style="width:100%;"> <!-- <el-form-item style="width:100%;">
<div class="oauth-login" style="display:flex"> <div class="oauth-login" style="display:flex">
<div class="oauth-login-item" v-for="item in SysUserSocialTypeEnum" :key="item.type" @click="doSocialLogin(item)"> <div class="oauth-login-item" v-for="item in SysUserSocialTypeEnum" :key="item.type" @click="doSocialLogin(item)">
<img :src="item.img" height="25px" width="25px" alt="登录" > <img :src="item.img" height="25px" width="25px" alt="登录" >
@ -140,308 +83,267 @@
</div> </div>
</div> </div>
</el-form-item> --> </el-form-item> -->
</el-form> </el-form>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- 图形验证码 --> <!-- 图形验证码 -->
<Verify <Verify ref="verify" :captcha-type="'blockPuzzle'" :img-size="{ width: '400px', height: '200px' }"
ref="verify" @success="handleLogin" />
:captcha-type="'blockPuzzle'"
:img-size="{ width: '400px', height: '200px' }"
@success="handleLogin" />
<!-- footer --> <!-- footer -->
<div class="footer"> <div class="footer">
Copyright © 2023 中建材智能自动化院 All Rights Reserved. Copyright © 2023 中建材智能自动化院 All Rights Reserved.
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { sendSmsCode, socialAuthRedirect } from '@/api/login'; import { sendSmsCode, socialAuthRedirect } from "@/api/login";
import { getTenantIdByName } from '@/api/system/tenant'; import { getTenantIdByName } from "@/api/system/tenant";
import { SystemUserSocialTypeEnum } from '@/utils/constants'; import { SystemUserSocialTypeEnum } from "@/utils/constants";
import { getCaptchaEnable, getTenantEnable } from '@/utils/ruoyi'; import { getCaptchaEnable, getTenantEnable } from "@/utils/ruoyi";
import { import {
getPassword, getPassword,
getRememberMe, getRememberMe, getTenantName,
getTenantName, getUsername,
getUsername, removePassword, removeRememberMe, removeTenantName,
removePassword, removeUsername,
removeRememberMe, setPassword, setRememberMe, setTenantId, setTenantName,
removeTenantName, setUsername
removeUsername, } from "@/utils/auth";
setPassword,
setRememberMe,
setTenantId,
setTenantName,
setUsername,
} from '@/utils/auth';
import Verify from '@/components/Verifition/Verify'; import Verify from '@/components/Verifition/Verify';
import { resetUserPwd } from '@/api/system/user'; import { resetUserPwd } from "@/api/system/user";
export default { export default {
name: 'Login', name: "Login",
components: { components: {
Verify, Verify
}, },
data() { data() {
return { return {
codeUrl: '', codeUrl: "",
captchaEnable: true, captchaEnable: true,
tenantEnable: true, tenantEnable: true,
mobileCodeTimer: 0, mobileCodeTimer: 0,
loginForm: { loginForm: {
loginType: 'uname', loginType: "uname",
username: 'admin', username: "admin",
password: 'admin123', password: "admin123",
captchaVerification: '', captchaVerification: "",
mobile: '', mobile: "",
mobileCode: '', mobileCode: "",
rememberMe: false, rememberMe: false,
tenantName: '芋道源码', tenantName: "芋道源码",
}, },
scene: 21, scene: 21,
LoginRules: { LoginRules: {
username: [ username: [
{ required: true, trigger: 'blur', message: '用户名不能为空' }, { required: true, trigger: "blur", message: "用户名不能为空" }
], ],
password: [ password: [
{ required: true, trigger: 'blur', message: '密码不能为空' }, { required: true, trigger: "blur", message: "密码不能为空" }
], ],
mobile: [ mobile: [
{ required: true, trigger: 'blur', message: '手机号不能为空' }, { required: true, trigger: "blur", message: "手机号不能为空" },
{ {
validator: function (rule, value, callback) { validator: function (rule, value, callback) {
if ( if (/^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/.test(value) === false) {
/^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/.test( callback(new Error("手机号格式错误"));
value } else {
) === false callback();
) { }
callback(new Error('手机号格式错误')); }, trigger: "blur"
} else { }
callback(); ],
} tenantName: [
}, { required: true, trigger: "blur", message: "租户不能为空" },
trigger: 'blur', {
}, validator: (rule, value, callback) => {
], // debugger
tenantName: [ getTenantIdByName(value).then(res => {
{ required: true, trigger: 'blur', message: '租户不能为空' }, const tenantId = res.data;
{ if (tenantId && tenantId >= 0) {
validator: (rule, value, callback) => { //
// debugger setTenantId(tenantId)
getTenantIdByName(value).then((res) => { callback();
const tenantId = res.data; } else {
if (tenantId && tenantId >= 0) { callback('租户不存在');
// }
setTenantId(tenantId); });
callback(); },
} else { trigger: 'blur'
callback('租户不存在'); }
} ]
}); },
}, loading: false,
trigger: 'blur', redirect: undefined,
}, //
], SysUserSocialTypeEnum: SystemUserSocialTypeEnum,
}, };
loading: false, },
redirect: undefined, created() {
// //
SysUserSocialTypeEnum: SystemUserSocialTypeEnum, this.tenantEnable = getTenantEnable();
}; if (this.tenantEnable) {
}, getTenantIdByName(this.loginForm.tenantName).then(res => { //
created() { const tenantId = res.data;
// if (tenantId && tenantId >= 0) {
this.tenantEnable = getTenantEnable(); setTenantId(tenantId)
if (this.tenantEnable) { }
getTenantIdByName(this.loginForm.tenantName).then((res) => { });
// }
const tenantId = res.data; //
if (tenantId && tenantId >= 0) { this.captchaEnable = getCaptchaEnable();
setTenantId(tenantId); //
} this.redirect = this.$route.query.redirect ? decodeURIComponent(this.$route.query.redirect) : undefined;
}); this.getCookie();
} },
// methods: {
this.captchaEnable = getCaptchaEnable(); getCode() {
// this.captchaEnable = false
this.redirect = this.$route.query.redirect //
? decodeURIComponent(this.$route.query.redirect) if (!this.captchaEnable) {
: undefined; this.handleLogin({})
this.getCookie(); return;
}, }
methods: {
getCode() {
this.captchaEnable = false;
//
if (!this.captchaEnable) {
this.handleLogin({});
return;
}
// //
// //
this.$refs.verify.show(); this.$refs.verify.show()
}, },
getCookie() { getCookie() {
const username = getUsername(); const username = getUsername();
const password = getPassword(); const password = getPassword();
const rememberMe = getRememberMe(); const rememberMe = getRememberMe();
const tenantName = getTenantName(); const tenantName = getTenantName();
this.loginForm = { this.loginForm = {
...this.loginForm, ...this.loginForm,
username: username ? username : this.loginForm.username, username: username ? username : this.loginForm.username,
password: password ? password : this.loginForm.password, password: password ? password : this.loginForm.password,
rememberMe: rememberMe ? getRememberMe() : false, rememberMe: rememberMe ? getRememberMe() : false,
tenantName: tenantName ? tenantName : this.loginForm.tenantName, tenantName: tenantName ? tenantName : this.loginForm.tenantName,
}; };
}, },
handleLogin(captchaParams) { handleLogin(captchaParams) {
this.$refs.loginForm.validate((valid) => { this.$refs.loginForm.validate(valid => {
if (valid) { if (valid) {
this.loading = true; this.loading = true;
// Cookie // Cookie
if (this.loginForm.rememberMe) { if (this.loginForm.rememberMe) {
setUsername(this.loginForm.username); setUsername(this.loginForm.username)
setPassword(this.loginForm.password); setPassword(this.loginForm.password)
setRememberMe(this.loginForm.rememberMe); setRememberMe(this.loginForm.rememberMe)
setTenantName(this.loginForm.tenantName); setTenantName(this.loginForm.tenantName)
} else { } else {
removeUsername(); removeUsername()
removePassword(); removePassword()
removeRememberMe(); removeRememberMe()
removeTenantName(); removeTenantName()
} }
this.loginForm.captchaVerification = this.loginForm.captchaVerification = captchaParams.captchaVerification
captchaParams.captchaVerification; //
// // console.log("", this.loginForm);
// console.log("", this.loginForm); this.$store.dispatch(this.loginForm.loginType === "sms" ? "SmsLogin" : "Login", this.loginForm).then(() => {
this.$store console.log(this.redirect)
.dispatch( this.$router.push({ path: "/" }).catch(() => {
this.loginForm.loginType === 'sms' ? 'SmsLogin' : 'Login', });
this.loginForm }).catch(() => {
) this.loading = false;
.then(() => { });
console.log(this.redirect); }
this.$store.dispatch('tagsView/delAllVisitedViews'); });
this.$router.push({ path: '/' }).catch(() => {}); },
}) async doSocialLogin(socialTypeEnum) {
.catch(() => { //
this.loading = false; this.loading = true;
}); let tenant = false;
} if (this.tenantEnable) {
}); await this.$prompt('请输入租户名称', "提示", {
}, confirmButtonText: "确定",
async doSocialLogin(socialTypeEnum) { cancelButtonText: "取消"
// }).then(async ({ value }) => {
this.loading = true; await getTenantIdByName(value).then(res => {
let tenant = false; const tenantId = res.data;
if (this.tenantEnable) { tenant = true
await this.$prompt('请输入租户名称', '提示', { if (tenantId && tenantId >= 0) {
confirmButtonText: '确定', setTenantId(tenantId)
cancelButtonText: '取消', }
}) });
.then(async ({ value }) => { }).catch(() => {
await getTenantIdByName(value).then((res) => { // loading
const tenantId = res.data; this.loading = false;
tenant = true;
if (tenantId && tenantId >= 0) {
setTenantId(tenantId);
}
});
})
.catch(() => {
// loading
this.loading = false;
return false; return false
}); });
} else { } else {
tenant = true; tenant = true
} }
if (tenant) { if (tenant) {
// redirectUri // redirectUri
const redirectUri = const redirectUri = location.origin + '/social-login?'
location.origin + + encodeURIComponent('type=' + socialTypeEnum.type + '&redirect=' + (this.redirect || "/")); //
'/social-login?' + // const redirectUri = 'http://127.0.0.1:48080/api/gitee/callback';
encodeURIComponent( // const redirectUri = 'http://127.0.0.1:48080/api/dingtalk/callback';
'type=' + //
socialTypeEnum.type + socialAuthRedirect(socialTypeEnum.type, encodeURIComponent(redirectUri)).then((res) => {
'&redirect=' + // console.log(res.url);
(this.redirect || '/') window.location.href = res.data;
); // });
// const redirectUri = 'http://127.0.0.1:48080/api/gitee/callback'; }
// const redirectUri = 'http://127.0.0.1:48080/api/dingtalk/callback'; },
// /** ========== 以下为升级短信登录 ========== */
socialAuthRedirect( getSmsCode() {
socialTypeEnum.type, if (this.mobileCodeTimer > 0) return;
encodeURIComponent(redirectUri) this.$refs.loginForm.validate(valid => {
).then((res) => { if (!valid) return;
// console.log(res.url); sendSmsCode(this.loginForm.mobile, this.scene, this.loginForm.uuid, this.loginForm.code).then(res => {
window.location.href = res.data; this.$modal.msgSuccess("获取验证码成功")
}); this.mobileCodeTimer = 60;
} let msgTimer = setInterval(() => {
}, this.mobileCodeTimer = this.mobileCodeTimer - 1;
/** ========== 以下为升级短信登录 ========== */ if (this.mobileCodeTimer <= 0) {
getSmsCode() { clearInterval(msgTimer);
if (this.mobileCodeTimer > 0) return; }
this.$refs.loginForm.validate((valid) => { }, 1000);
if (!valid) return; });
sendSmsCode( });
this.loginForm.mobile, }
this.scene, }
this.loginForm.uuid,
this.loginForm.code
).then((res) => {
this.$modal.msgSuccess('获取验证码成功');
this.mobileCodeTimer = 60;
let msgTimer = setInterval(() => {
this.mobileCodeTimer = this.mobileCodeTimer - 1;
if (this.mobileCodeTimer <= 0) {
clearInterval(msgTimer);
}
}, 1000);
});
});
},
},
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/styles/login.scss'; @import "~@/assets/styles/login.scss";
.oauth-login { .oauth-login {
display: flex; display: flex;
align-items: center; align-items: center;
cursor: pointer; cursor: pointer;
} }
.oauth-login-item { .oauth-login-item {
display: flex; display: flex;
align-items: center; align-items: center;
margin-right: 10px; margin-right: 10px;
} }
.oauth-login-item img { .oauth-login-item img {
height: 25px; height: 25px;
width: 25px; width: 25px;
} }
.oauth-login-item span:hover { .oauth-login-item span:hover {
text-decoration: underline red; text-decoration: underline red;
color: red; color: red;
} }
.sms-login-mobile-code-prefix { .sms-login-mobile-code-prefix {
:deep(.el-input__prefix) { :deep(.el-input__prefix) {
top: 22%; top: 22%;
} }
} }</style>
</style>

View File

@ -92,7 +92,7 @@ export default {
label: '订单出货日期', label: '订单出货日期',
dateType: 'daterange', dateType: 'daterange',
format: 'yyyy-MM-dd', format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss', valueFormat: 'yyyy-MM-dd hh:mm:ss',
rangeSeparator: '-', rangeSeparator: '-',
startPlaceholder: '开始时间', startPlaceholder: '开始时间',
endPlaceholder: '结束时间', endPlaceholder: '结束时间',

View File

@ -47,7 +47,7 @@
<dict-tag :type="DICT_TYPE.SYSTEM_ROLE_TYPE" :value="scope.row.type"/> <dict-tag :type="DICT_TYPE.SYSTEM_ROLE_TYPE" :value="scope.row.type"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="显示顺序" prop="sort" sortable width="100" /> <el-table-column label="显示顺序" prop="sort" width="100" />
<el-table-column label="状态" align="center" width="100"> <el-table-column label="状态" align="center" width="100">
<template v-slot="scope"> <template v-slot="scope">
<el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1" @change="handleStatusChange(scope.row)"/> <el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1" @change="handleStatusChange(scope.row)"/>
@ -58,7 +58,6 @@
<span>{{ parseTime(scope.row.createTime) }}</span> <span>{{ parseTime(scope.row.createTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="备注" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template v-slot="scope"> <template v-slot="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
@ -483,7 +482,7 @@ export default {
/** 导出按钮操作 */ /** 导出按钮操作 */
handleExport() { handleExport() {
const queryParams = this.queryParams; const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有角色数据项?').then(()=> { this.$modal.confirm('是否确认导出所有角色数据项?').then(function() {
this.exportLoading = true; this.exportLoading = true;
return exportRole(queryParams); return exportRole(queryParams);
}).then(response => { }).then(response => {

View File

@ -1,460 +1,314 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<doc-alert title="SaaS 多租户" url="https://doc.iocoder.cn/saas-tenant/" /> <doc-alert title="SaaS 多租户" url="https://doc.iocoder.cn/saas-tenant/" />
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
:model="queryParams" <el-form-item label="租户名" prop="name">
ref="queryForm" <el-input v-model="queryParams.name" placeholder="请输入租户名" clearable @keyup.enter.native="handleQuery"/>
size="small" </el-form-item>
:inline="true" <el-form-item label="联系人" prop="contactName">
v-show="showSearch" <el-input v-model="queryParams.contactName" placeholder="请输入联系人" clearable @keyup.enter.native="handleQuery"/>
label-width="68px"> </el-form-item>
<el-form-item label="租户名" prop="name"> <el-form-item label="联系手机" prop="contactMobile">
<el-input <el-input v-model="queryParams.contactMobile" placeholder="请输入联系手机" clearable @keyup.enter.native="handleQuery"/>
v-model="queryParams.name" </el-form-item>
placeholder="请输入租户名" <el-form-item label="租户状态" prop="status">
clearable <el-select v-model="queryParams.status" placeholder="请选择租户状态" clearable>
@keyup.enter.native="handleQuery" /> <el-option v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
</el-form-item> :key="dict.value" :label="dict.label" :value="dict.value"/>
<el-form-item label="联系人" prop="contactName"> </el-select>
<el-input </el-form-item>
v-model="queryParams.contactName" <el-form-item label="创建时间" prop="createTime">
placeholder="请输入联系人" <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
clearable range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
@keyup.enter.native="handleQuery" /> </el-form-item>
</el-form-item> <el-form-item>
<el-form-item label="联系手机" prop="contactMobile"> <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
<el-input <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
v-model="queryParams.contactMobile" </el-form-item>
placeholder="请输入联系手机" </el-form>
clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="租户状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择租户状态"
clearable>
<el-option
v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['00:00:00', '23:59:59']" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">
搜索
</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 操作工具栏 --> <!-- 操作工具栏 -->
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
type="primary" v-hasPermi="['system:tenant:create']">新增</el-button>
plain </el-col>
icon="el-icon-plus" <el-col :span="1.5">
size="mini" <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
@click="handleAdd" v-hasPermi="['system:tenant:export']">导出</el-button>
v-hasPermi="['system:tenant:create']"> </el-col>
新增 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-button> </el-row>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['system:tenant:export']">
导出
</el-button>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"></right-toolbar>
</el-row>
<!-- 列表 --> <!-- 列表 -->
<el-table v-loading="loading" :data="list"> <el-table v-loading="loading" :data="list">
<el-table-column label="租户编号" align="center" prop="id" /> <el-table-column label="租户编号" align="center" prop="id" />
<el-table-column label="租户名" align="center" prop="name" /> <el-table-column label="租户名" align="center" prop="name" />
<el-table-column label="租户套餐" align="center" prop="packageId"> <el-table-column label="租户套餐" align="center" prop="packageId">
<template v-slot="scope"> <template v-slot="scope">
<el-tag v-if="scope.row.packageId === 0" type="danger"> <el-tag v-if="scope.row.packageId === 0" type="danger">系统租户</el-tag>
系统租户 <el-tag v-else> {{getPackageName(scope.row.packageId)}} </el-tag>
</el-tag> </template>
<el-tag v-else>{{ getPackageName(scope.row.packageId) }}</el-tag> </el-table-column>
</template> <el-table-column label="联系人" align="center" prop="contactName" />
</el-table-column> <el-table-column label="联系手机" align="center" prop="contactMobile" />
<el-table-column label="联系人" align="center" prop="contactName" /> <el-table-column label="账号额度" align="center" prop="accountCount">
<el-table-column label="联系手机" align="center" prop="contactMobile" /> <template v-slot="scope">
<el-table-column label="账号额度" align="center" prop="accountCount"> <el-tag> {{scope.row.accountCount}} </el-tag>
<template v-slot="scope"> </template>
<el-tag>{{ scope.row.accountCount }}</el-tag> </el-table-column>
</template> <el-table-column label="过期时间" align="center" prop="expireTime" width="180">
</el-table-column> <template v-slot="scope">
<el-table-column <span>{{ parseTime(scope.row.expireTime) }}</span>
label="过期时间" </template>
align="center" </el-table-column>
prop="expireTime" <el-table-column label="绑定域名" align="center" prop="domain" width="180" />
width="180"> <el-table-column label="租户状态" align="center" prop="status">
<template v-slot="scope"> <template v-slot="scope">
<span>{{ parseTime(scope.row.expireTime) }}</span> <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="创建时间" align="center" prop="createTime" width="180">
label="绑定域名" <template v-slot="scope">
align="center" <span>{{ parseTime(scope.row.createTime) }}</span>
prop="domain" </template>
width="180" /> </el-table-column>
<el-table-column label="租户状态" align="center" prop="status"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template v-slot="scope"> <template v-slot="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
</template> v-hasPermi="['system:tenant:update']">修改</el-button>
</el-table-column> <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
<el-table-column v-hasPermi="['system:tenant:delete']">删除</el-button>
label="创建时间" </template>
align="center" </el-table-column>
prop="createTime" </el-table>
width="180"> <!-- 分页组件 -->
<template v-slot="scope"> <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
<span>{{ parseTime(scope.row.createTime) }}</span> @pagination="getList"/>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width">
<template v-slot="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:tenant:update']">
修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:tenant:delete']">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList" />
<!-- 对话框(添加 / 修改) --> <!-- 对话框(添加 / 修改) -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="租户名" prop="name"> <el-form-item label="租户名" prop="name">
<el-input v-model="form.name" placeholder="请输入租户名" /> <el-input v-model="form.name" placeholder="请输入租户名" />
</el-form-item> </el-form-item>
<el-form-item label="租户套餐" prop="packageId"> <el-form-item label="租户套餐" prop="packageId">
<el-select <el-select v-model="form.packageId" placeholder="请选择租户套餐" clearable size="small">
v-model="form.packageId" <el-option v-for="item in packageList" :key="item.id" :label="item.name" :value="item.id"/>
placeholder="请选择租户套餐" </el-select>
clearable </el-form-item>
size="small"> <el-form-item label="联系人" prop="contactName">
<el-option <el-input v-model="form.contactName" placeholder="请输入联系人" />
v-for="item in packageList" </el-form-item>
:key="item.id" <el-form-item label="联系手机" prop="contactMobile">
:label="item.name" <el-input v-model="form.contactMobile" placeholder="请输入联系手机" />
:value="item.id" /> </el-form-item>
</el-select> <el-form-item v-if="form.id === undefined" label="用户名称" prop="username">
</el-form-item> <el-input v-model="form.username" placeholder="请输入用户名称" />
<el-form-item label="联系人" prop="contactName"> </el-form-item>
<el-input v-model="form.contactName" placeholder="请输入联系人" /> <el-form-item v-if="form.id === undefined" label="用户密码" prop="password">
</el-form-item> <el-input v-model="form.password" placeholder="请输入用户密码" type="password" show-password />
<el-form-item label="联系手机" prop="contactMobile"> </el-form-item>
<el-input v-model="form.contactMobile" placeholder="请输入联系手机" /> <el-form-item label="账号额度" prop="accountCount">
</el-form-item> <el-input-number v-model="form.accountCount" placeholder="请输入账号额度" controls-position="right" :min="0" />
<el-form-item </el-form-item>
v-if="form.id === undefined" <el-form-item label="过期时间" prop="expireTime">
label="用户名称" <el-date-picker clearable size="small" v-model="form.expireTime" type="date"
prop="username"> value-format="timestamp" placeholder="请选择过期时间" />
<el-input v-model="form.username" placeholder="请输入用户名称" /> </el-form-item>
</el-form-item> <el-form-item label="绑定域名" prop="domain">
<el-form-item <el-input v-model="form.domain" placeholder="请输入绑定域名" />
v-if="form.id === undefined" </el-form-item>
label="用户密码" <el-form-item label="租户状态" prop="status">
prop="password"> <el-radio-group v-model="form.status">
<el-input <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
v-model="form.password" :key="dict.value" :label="parseInt(dict.value)">{{dict.label}}</el-radio>
placeholder="请输入用户密码" </el-radio-group>
type="password" </el-form-item>
show-password /> </el-form>
</el-form-item> <div slot="footer" class="dialog-footer">
<el-form-item label="账号额度" prop="accountCount"> <el-button type="primary" @click="submitForm"> </el-button>
<el-input-number <el-button @click="cancel"> </el-button>
v-model="form.accountCount" </div>
placeholder="请输入账号额度" </el-dialog>
controls-position="right" </div>
:min="0" />
</el-form-item>
<el-form-item label="过期时间" prop="expireTime">
<el-date-picker
clearable
size="small"
v-model="form.expireTime"
type="date"
value-format="timestamp"
placeholder="请选择过期时间" />
</el-form-item>
<el-form-item label="绑定域名" prop="domain">
<el-input v-model="form.domain" placeholder="请输入绑定域名" />
</el-form-item>
<el-form-item label="租户状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
:label="parseInt(dict.value)">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template> </template>
<script> <script>
import { import { createTenant, updateTenant, deleteTenant, getTenant, getTenantPage, exportTenantExcel } from "@/api/system/tenant";
createTenant, import { CommonStatusEnum } from '@/utils/constants'
updateTenant, import {getTenantPackageList} from "@/api/system/tenantPackage";
deleteTenant,
getTenant,
getTenantPage,
exportTenantExcel,
} from '@/api/system/tenant';
import { CommonStatusEnum } from '@/utils/constants';
import { getTenantPackageList } from '@/api/system/tenantPackage';
export default { export default {
name: 'SystemTenant', name: "SystemTenant",
components: {}, components: {
data() { },
return { data() {
// return {
loading: true, //
// loading: true,
exportLoading: false, //
// exportLoading: false,
showSearch: true, //
// showSearch: true,
total: 0, //
// total: 0,
list: [], //
// list: [],
packageList: [], //
// packageList: [],
title: '', //
// title: "",
open: false, //
// open: false,
queryParams: { //
pageNo: 1, queryParams: {
pageSize: 10, pageNo: 1,
name: null, pageSize: 10,
contactName: null, name: null,
contactMobile: null, contactName: null,
status: undefined, contactMobile: null,
createTime: [], status: undefined,
}, createTime: []
// },
form: {}, //
// form: {},
rules: { //
name: [{ required: true, message: '租户名不能为空', trigger: 'blur' }], rules: {
packageId: [ name: [{ required: true, message: "租户名不能为空", trigger: "blur" }],
{ required: true, message: '租户套餐不能为空', trigger: 'blur' }, packageId: [{ required: true, message: "租户套餐不能为空", trigger: "blur" }],
], contactName: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
contactName: [ status: [{ required: true, message: "租户状态不能为空", trigger: "blur" }],
{ required: true, message: '联系人不能为空', trigger: 'blur' }, accountCount: [{ required: true, message: "账号额度不能为空", trigger: "blur" }],
], expireTime: [{ required: true, message: "过期时间不能为空", trigger: "blur" }],
status: [ domain: [{ required: true, message: "绑定域名不能为空", trigger: "blur" }],
{ required: true, message: '租户状态不能为空', trigger: 'blur' }, username: [{ required: true, message: "用户名称不能为空", trigger: "blur" }],
], password: [{ required: true, message: "用户密码不能为空", trigger: "blur" }],
accountCount: [ }
{ required: true, message: '账号额度不能为空', trigger: 'blur' }, };
], },
expireTime: [ created() {
{ required: true, message: '过期时间不能为空', trigger: 'blur' }, this.getList();
], //
domain: [ getTenantPackageList().then(response => {
{ required: true, message: '绑定域名不能为空', trigger: 'blur' }, this.packageList = response.data;
], })
username: [ },
{ required: true, message: '用户名称不能为空', trigger: 'blur' }, methods: {
], /** 查询列表 */
password: [ getList() {
{ required: true, message: '用户密码不能为空', trigger: 'blur' }, this.loading = true;
], //
}, getTenantPage(this.queryParams).then(response => {
}; this.list = response.data.list;
}, this.total = response.data.total;
created() { this.loading = false;
this.getList(); });
}, },
methods: { /** 取消按钮 */
/** 查询列表 */ cancel() {
getList() { this.open = false;
this.loading = true; this.reset();
// },
getTenantPage(this.queryParams).then((response) => { /** 表单重置 */
this.list = response.data.list; reset() {
this.total = response.data.total; this.form = {
this.loading = false; id: undefined,
}); name: undefined,
}, packageId: undefined,
/** 取消按钮 */ contactName: undefined,
cancel() { contactMobile: undefined,
this.open = false; accountCount: undefined,
this.reset(); expireTime: undefined,
}, domain: undefined,
/** 表单重置 */ status: CommonStatusEnum.ENABLE,
reset() { };
this.form = { this.resetForm("form");
id: undefined, },
name: undefined, /** 搜索按钮操作 */
packageId: undefined, handleQuery() {
contactName: undefined, this.queryParams.pageNo = 1;
contactMobile: undefined, this.getList();
accountCount: undefined, },
expireTime: undefined, /** 重置按钮操作 */
domain: undefined, resetQuery() {
status: CommonStatusEnum.ENABLE, this.resetForm("queryForm");
}; this.handleQuery();
this.resetForm('form'); },
}, /** 新增按钮操作 */
/** 搜索按钮操作 */ handleAdd() {
handleQuery() { this.reset();
this.queryParams.pageNo = 1; this.open = true;
this.getList(); this.title = "添加租户";
}, },
/** 重置按钮操作 */ /** 修改按钮操作 */
resetQuery() { handleUpdate(row) {
this.resetForm('queryForm'); this.reset();
this.handleQuery(); const id = row.id;
}, getTenant(id).then(response => {
/** 新增按钮操作 */ this.form = response.data;
handleAdd() { this.open = true;
this.reset(); this.title = "修改租户";
// });
getTenantPackageList().then((response) => { },
this.packageList = response.data; /** 提交按钮 */
}); submitForm() {
this.$nextTick(() => { this.$refs["form"].validate(valid => {
this.open = true; if (!valid) {
this.title = '添加租户'; return;
}); }
}, //
/** 修改按钮操作 */ if (this.form.id != null) {
handleUpdate(row) { updateTenant(this.form).then(response => {
this.reset(); this.$modal.msgSuccess("修改成功");
const id = row.id; this.open = false;
getTenant(id).then((response) => { this.getList();
this.form = response.data; });
this.open = true; return;
this.title = '修改租户'; }
}); //
}, createTenant(this.form).then(response => {
/** 提交按钮 */ this.$modal.msgSuccess("新增成功");
submitForm() { this.open = false;
this.$refs['form'].validate((valid) => { this.getList();
if (!valid) { });
return; });
} },
// /** 删除按钮操作 */
if (this.form.id != null) { handleDelete(row) {
updateTenant(this.form).then((response) => { const id = row.id;
this.$modal.msgSuccess('修改成功'); this.$modal.confirm('是否确认删除租户编号为"' + id + '"的数据项?').then(function() {
this.open = false; return deleteTenant(id);
this.getList(); }).then(() => {
}); this.getList();
return; this.$modal.msgSuccess("删除成功");
} }).catch(() => {});
// },
createTenant(this.form).then((response) => { /** 导出按钮操作 */
this.$modal.msgSuccess('新增成功'); handleExport() {
this.open = false; //
this.getList(); let params = {...this.queryParams};
}); params.pageNo = undefined;
}); params.pageSize = undefined;
}, //
/** 删除按钮操作 */ this.$modal.confirm('是否确认导出所有租户数据项?').then(() => {
handleDelete(row) { this.exportLoading = true;
const id = row.id; return exportTenantExcel(params);
this.$modal }).then(response => {
.confirm('是否确认删除租户编号为"' + id + '"的数据项?') this.$download.excel(response, '租户.xls');
.then(function () { this.exportLoading = false;
return deleteTenant(id); }).catch(() => {});
}) },
.then(() => { /** 套餐名格式化 */
this.getList(); getPackageName(packageId) {
this.$modal.msgSuccess('删除成功'); for (const item of this.packageList) {
}) if (item.id === packageId) {
.catch(() => {}); return item.name;
}, }
/** 导出按钮操作 */ }
handleExport() { return '未知套餐';
// }
let params = { ...this.queryParams }; }
params.pageNo = undefined;
params.pageSize = undefined;
//
this.$modal
.confirm('是否确认导出所有租户数据项?')
.then(() => {
this.exportLoading = true;
return exportTenantExcel(params);
})
.then((response) => {
this.$download.excel(response, '租户.xls');
this.exportLoading = false;
})
.catch(() => {});
},
/** 套餐名格式化 */
getPackageName(packageId) {
for (const item of this.packageList) {
if (item.id === packageId) {
return item.name;
}
}
return '未知套餐';
},
},
}; };
</script> </script>

View File

@ -18,8 +18,8 @@
<!--用户数据--> <!--用户数据-->
<el-col :span="20" :xs="24"> <el-col :span="20" :xs="24">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户账号" prop="username"> <el-form-item label="用户名称" prop="username">
<el-input v-model="queryParams.username" placeholder="请输入用户账号" clearable style="width: 240px" <el-input v-model="queryParams.username" placeholder="请输入用户名称" clearable style="width: 240px"
@keyup.enter.native="handleQuery"/> @keyup.enter.native="handleQuery"/>
</el-form-item> </el-form-item>
<el-form-item label="手机号码" prop="mobile"> <el-form-item label="手机号码" prop="mobile">
@ -59,7 +59,7 @@
<el-table v-loading="loading" :data="userList"> <el-table v-loading="loading" :data="userList">
<el-table-column label="用户编号" align="center" key="id" prop="id" v-if="columns[0].visible" /> <el-table-column label="用户编号" align="center" key="id" prop="id" v-if="columns[0].visible" />
<el-table-column label="用户账号" align="center" key="username" prop="username" v-if="columns[1].visible" :show-overflow-tooltip="true" /> <el-table-column label="用户名称" align="center" key="username" prop="username" v-if="columns[1].visible" :show-overflow-tooltip="true" />
<el-table-column label="用户昵称" align="center" key="nickname" prop="nickname" v-if="columns[2].visible" :show-overflow-tooltip="true" /> <el-table-column label="用户昵称" align="center" key="nickname" prop="nickname" v-if="columns[2].visible" :show-overflow-tooltip="true" />
<el-table-column label="部门" align="center" key="deptName" prop="dept.name" v-if="columns[3].visible" :show-overflow-tooltip="true" /> <el-table-column label="部门" align="center" key="deptName" prop="dept.name" v-if="columns[3].visible" :show-overflow-tooltip="true" />
<el-table-column label="手机号码" align="center" key="mobile" prop="mobile" v-if="columns[4].visible" width="120" /> <el-table-column label="手机号码" align="center" key="mobile" prop="mobile" v-if="columns[4].visible" width="120" />
@ -128,8 +128,8 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item v-if="form.id === undefined" label="用户账号" prop="username"> <el-form-item v-if="form.id === undefined" label="用户名称" prop="username">
<el-input v-model="form.username" placeholder="请输入用户账号" /> <el-input v-model="form.username" placeholder="请输入用户名称" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -197,7 +197,7 @@
<!-- 分配角色 --> <!-- 分配角色 -->
<el-dialog title="分配角色" :visible.sync="openRole" width="500px" append-to-body> <el-dialog title="分配角色" :visible.sync="openRole" width="500px" append-to-body>
<el-form :model="form" label-width="80px"> <el-form :model="form" label-width="80px">
<el-form-item label="用户账号"> <el-form-item label="用户名称">
<el-input v-model="form.username" :disabled="true" /> <el-input v-model="form.username" :disabled="true" />
</el-form-item> </el-form-item>
<el-form-item label="用户昵称"> <el-form-item label="用户昵称">
@ -312,7 +312,7 @@ export default {
// //
columns: [ columns: [
{ key: 0, label: `用户编号`, visible: true }, { key: 0, label: `用户编号`, visible: true },
{ key: 1, label: `用户账号`, visible: true }, { key: 1, label: `用户名称`, visible: true },
{ key: 2, label: `用户昵称`, visible: true }, { key: 2, label: `用户昵称`, visible: true },
{ key: 3, label: `部门`, visible: true }, { key: 3, label: `部门`, visible: true },
{ key: 4, label: `手机号码`, visible: true }, { key: 4, label: `手机号码`, visible: true },
@ -322,7 +322,7 @@ export default {
// //
rules: { rules: {
username: [ username: [
{ required: true, message: "用户账号不能为空", trigger: "blur" } { required: true, message: "用户名称不能为空", trigger: "blur" }
], ],
nickname: [ nickname: [
{ required: true, message: "用户昵称不能为空", trigger: "blur" } { required: true, message: "用户昵称不能为空", trigger: "blur" }

View File

@ -12,7 +12,7 @@
</div> --> </div> -->
<ul class="list-group list-group-striped"> <ul class="list-group list-group-striped">
<li class="list-group-item"> <li class="list-group-item">
<svg-icon icon-class="user" />用户账号 <svg-icon icon-class="user" />用户名称
<div class="pull-right">{{ user.username }}</div> <div class="pull-right">{{ user.username }}</div>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">