Commit f5788527 authored by tanyang's avatar tanyang

Merge remote-tracking branch 'origin/zuhuduan' into zuhuduan

parents 6dbeaec5 da003db4
...@@ -41,7 +41,8 @@ public class SysDeptController extends BaseController { ...@@ -41,7 +41,8 @@ public class SysDeptController extends BaseController {
List<SysDept> depts = deptService.selectDeptList(dept); List<SysDept> depts = deptService.selectDeptList(dept);
List<SysDeptVo> deptVos = BeanUtil.copyToList(depts, SysDeptVo.class); List<SysDeptVo> deptVos = BeanUtil.copyToList(depts, SysDeptVo.class);
deptVos.forEach(sysDeptVo -> { deptVos.forEach(sysDeptVo -> {
sysDeptVo.setExistUsers(deptService.hasChildByDeptId(sysDeptVo.getDeptId())); //查询该部门及其子部门是否存在用户
sysDeptVo.setExistUsers(deptService.checkAllDeptsAndUsers(sysDeptVo.getDeptId()));
}); });
return R.ok(deptVos); return R.ok(deptVos);
} }
......
package com.dsk.common.constant;
/**
* 租户套餐常量信息
*
* @author Lion Li
*/
public interface TenantPackageConstants {
/**
* 租户套餐正常状态
*/
String NORMAL = "0";
/**
* 租户套餐停用状态
*/
String DISABLE = "1";
}
package com.dsk.common.tenant.helper; package com.dsk.common.tenant.helper;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.spring.SpringMVCUtil; import cn.dev33.satoken.spring.SpringMVCUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import com.alibaba.ttl.TransmittableThreadLocal; import com.alibaba.ttl.TransmittableThreadLocal;
...@@ -9,10 +8,7 @@ import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; ...@@ -9,10 +8,7 @@ import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import com.dsk.common.constant.GlobalConstants; import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.helper.LoginHelper; import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.StringUtils; import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.redis.RedisUtils;
import com.dsk.common.utils.spring.SpringUtils; import com.dsk.common.utils.spring.SpringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
......
<template> <template>
<div id="tags-view-container" class="tags-view-container"> <div id="tags-view-container" class="tags-view-container">
<div class="alltags" v-if="visitedViews.length > 0"> <div class="alltags" v-if="visitedViews.length > 0">
<div class="" @click="closeall"><i class="el-icon-arrow-down" v-if="!showall"></i> <i class="el-icon-arrow-up" v-if="showall"></i></div> <div class="imgs" @click="closeall">
<img src="@/assets/images/all.png" v-if="!showall"/>
<img src="@/assets/images/all_on.png" v-if="showall"/>
<!--<i class="el-icon-arrow-down" v-if="!showall"></i> <i class="el-icon-arrow-up" v-if="showall"></i>-->
</div>
<div class="tagslist" v-if="showall"> <div class="tagslist" v-if="showall">
<!--<div v-for="(tag, index) in visitedViews"--> <!--<div v-for="(tag, index) in visitedViews"-->
<!--:key="tag.path"--> <!--:key="tag.path"-->
...@@ -340,7 +344,7 @@ export default { ...@@ -340,7 +344,7 @@ export default {
} }
} }
&:first-of-type { &:first-of-type {
margin-left: 24px; margin-left: 64px;
} }
&:hover { &:hover {
.el-icon-close{ .el-icon-close{
...@@ -384,63 +388,78 @@ export default { ...@@ -384,63 +388,78 @@ export default {
} }
} }
.alltags{ .alltags{
position: fixed; position: absolute;
align-items: center; align-items: center;
border-radius: 9px;
height: 17px;
justify-content: center; justify-content: center;
width: 36px; width: 24px;
right: 10px; height: 24px;
top: 37px; left: 24px;
top: 28px;
cursor: pointer; cursor: pointer;
text-align: center; text-align: center;
&:hover{ z-index: 10;
background: #EFEFEF; &::after{
content: ' ';
position: absolute;
border-right: 1px solid #EFEFEF;
height: 18px;
width: 0;
top: 3px;
right: -8px;
}
.imgs>img{
width: 24px;
height: 24px;
} }
.tagslist{ .tagslist{
position: absolute; position: absolute;
right: 0; left: 0;
top: 20px; top: 32px;
background-color: #fcfcfc; background-color: #fcfcfc;
color: #141414; color: #141414;
font-size: 13px; font-size: 13px;
line-height: 1em; line-height: 1em;
margin-bottom: 0; margin-bottom: 0;
max-height: 450px; max-height: 450px;
overflow-y: auto; /*overflow-y: auto;*/
overflow-y: overlay; overflow-y: overlay;
padding: 20px 0 10px; padding: 8px 0 0;
width: 325px; width: 325px;
text-align: left; text-align: left;
border-radius: 4px;
box-shadow: 0 2px 9px 2px rgba(0,0,0,.09), 0 1px 2px -2px rgba(0,0,0,.16); box-shadow: 0 2px 9px 2px rgba(0,0,0,.09), 0 1px 2px -2px rgba(0,0,0,.16);
.tags-view-item{ .tags-view-item{
display: block; display: block;
position: relative; position: relative;
>div{ >div{
padding: 8px 24px; padding: 8px 8px 8px 32px;
line-height: 20px;
} }
&:hover{ &:hover{
color: #0081FF; background: rgba(0, 0, 0, 0.04);
} }
.el-icon-check{ .el-icon-check{
display: none; display: none;
position: absolute; position: absolute;
left: 5px; left: 8px;
width: 13px; width: 16px;
font-size: 16px;
} }
&.active{ &.active{
color: #0081FF; background: rgba(0, 129, 255, 0.04);
.el-icon-check{ .el-icon-check{
display: block; display: block;
color: #0081FF;
} }
} }
} }
.clasall{ .clasall{
border-top: 1px solid #EFEFEF; border-top: 1px solid #EFEFEF;
padding: 10px 24px 0; padding: 10px 32px;
margin-top: 10px; line-height: 20px;
color: #FF3C3C;
&:hover{ &:hover{
color: #0081FF; background: #FFECE8;
} }
} }
} }
......
...@@ -181,7 +181,6 @@ ...@@ -181,7 +181,6 @@
:key="dict.packageId" :key="dict.packageId"
:label="dict.packageName" :label="dict.packageName"
:value="dict.packageId" :value="dict.packageId"
:disabled="dict.disabled"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -301,13 +300,13 @@ ...@@ -301,13 +300,13 @@
selectTenant().then(res=>{ selectTenant().then(res=>{
if(res.code = 200){ if(res.code = 200){
this.packageList = res.data this.packageList = res.data
this.packageList.forEach(item=>{ // this.packageList.forEach(item=>{
if(item.status == '0'){ // if(item.status == '0'){
item.disabled = false // item.disabled = false
}else{ // }else{
item.disabled = true // item.disabled = true
} // }
}) // })
} }
}) })
}, },
......
...@@ -352,16 +352,24 @@ ...@@ -352,16 +352,24 @@
// return false // return false
if (this.form.packageId != undefined) { if (this.form.packageId != undefined) {
saveTenantPackage(this.form).then(response => { saveTenantPackage(this.form).then(response => {
if(response.code == 200){
this.$modal.msgSuccess("修改成功"); this.$modal.msgSuccess("修改成功");
this.open = false; this.open = false;
this.getList(); this.getList();
}else{
this.$message.error(response.msg)
}
}); });
} else { } else {
// this.form.menuIds = this.getMenuAllCheckedKeys(); // this.form.menuIds = this.getMenuAllCheckedKeys();
addTenantPackage(this.form).then(response => { addTenantPackage(this.form).then(response => {
if(response.code == 200){
this.$modal.msgSuccess("新增成功"); this.$modal.msgSuccess("新增成功");
this.open = false; this.open = false;
this.getList(); this.getList();
}else{
this.$message.error(response.msg)
}
}); });
} }
} }
......
...@@ -5,8 +5,67 @@ ...@@ -5,8 +5,67 @@
<img class="logo" src="../assets/images/logo1.png" /> <img class="logo" src="../assets/images/logo1.png" />
<img class="img" src="../assets/images/login/img.png" /> <img class="img" src="../assets/images/login/img.png" />
</div> </div>
<el-form v-if="!islog && !islang" ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form"> <!--快捷登录-->
<h3 class="title"><img src="../assets/images/title_icon.png"/>欢迎登录系统</h3> <el-form v-if="!islog && !islang && isDXlogin" ref="dxform" :model="dxform" :rules="dxRules" class="login-form">
<div class="logintitle">
<div class="on" @click="isDXlogin = true">快捷登录</div>
<div @click="isDXlogin = false">密码登录</div>
</div>
<el-form-item prop="phonenumber">
<el-input
v-model="dxform.phonenumber"
type="text"
auto-complete="off"
placeholder="请输入手机号码"
>
<img class="img" slot="prefix" src="../assets/images/phone.png"/>
</el-input>
</el-form-item>
<el-form-item prop="captchaCode" v-if="captchaEnabled">
<el-input
v-model="dxform.captchaCode"
auto-complete="off"
placeholder="请输入图形验证码"
style="width: 196px;float: left;"
>
<img class="img" slot="prefix" src="../assets/images/txyzm.png"/>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img"/>
</div>
</el-form-item>
<el-form-item prop="smsCode">
<el-input
v-model="dxform.smsCode"
auto-complete="off"
placeholder="请输入验证码"
style="width: 196px;float: left;"
@keyup.enter.native="dxLogin"
>
<img class="img" slot="prefix" src="../assets/images/validCode.png"/>
</el-input>
<div class="login-code">
<div class="hqyzm" @click="getsms">{{smstitle}}</div>
</div>
</el-form-item>
<el-form-item style="width:100%;margin-top: 42px">
<el-button
size="medium"
type="primary"
style="width:100%;height: 48px;border-radius: 4px;font-size: 16px;"
@click.native.prevent="dxLogin"
>
<span v-if="!loading">确认</span>
<span v-else>登 录 中...</span>
</el-button>
</el-form-item>
</el-form>
<!--密码登录-->
<el-form v-if="!islog && !islang && !isDXlogin" ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
<div class="logintitle">
<div @click="isDXlogin = true">快捷登录</div>
<div class="on" @click="isDXlogin = false">密码登录</div>
</div>
<el-form-item prop="username"> <el-form-item prop="username">
<el-input <el-input
v-model="loginForm.username" v-model="loginForm.username"
...@@ -32,18 +91,17 @@ ...@@ -32,18 +91,17 @@
<el-input <el-input
v-model="loginForm.code" v-model="loginForm.code"
auto-complete="off" auto-complete="off"
placeholder="请输入验证码" placeholder="请输入图形验证码"
style="width: 56%;float: left;" style="width: 196px;float: left;"
@keyup.enter.native="handleLogin" @keyup.enter.native="handleLogin"
> >
<img class="img" slot="prefix" src="../assets/images/validCode.png"/> <img class="img" slot="prefix" src="../assets/images/txyzm.png"/>
</el-input> </el-input>
<div class="login-code"> <div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img"/> <img :src="codeUrl" @click="getCode" class="login-code-img"/>
</div> </div>
</el-form-item> </el-form-item>
<el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 48px;">记住密码</el-checkbox> <el-form-item style="width:100%;margin-top: 42px;">
<el-form-item style="width:100%;">
<el-button <el-button
:loading="loading" :loading="loading"
size="medium" size="medium"
...@@ -51,25 +109,22 @@ ...@@ -51,25 +109,22 @@
style="width:100%;height: 48px;border-radius: 4px;font-size: 16px;" style="width:100%;height: 48px;border-radius: 4px;font-size: 16px;"
@click.native.prevent="handleLogin" @click.native.prevent="handleLogin"
> >
<span v-if="!loading"> </span> <span v-if="!loading">登录</span>
<span v-else>登 录 中...</span> <span v-else>登 录 中...</span>
</el-button> </el-button>
<!--<div style="float: right;" v-if="register">-->
<!--<router-link class="link-type" :to="'/register'">立即注册</router-link>-->
<!--</div>-->
</el-form-item> </el-form-item>
</el-form> </el-form>
<!--安全验证-->
<el-form v-if="!islog && islang" ref="dxform" :model="dxform" :rules="dxRules" class="login-form"> <el-form v-if="!islog && islang" ref="dxform" :model="dxform" :rules="dxRules" class="login-form">
<h3 class="title"><img src="../assets/images/title_icon.png"/>欢迎登录系统</h3> <h3 class="title"><img src="../assets/images/safe.png"/>请完成安全验证</h3>
<h4>安全验证</h4>
<el-form-item prop="phonenumber"> <el-form-item prop="phonenumber">
<el-input <el-input
v-model="dxform.phonenumber" v-model="dxform.phonenumber"
type="text" type="text"
auto-complete="off" auto-complete="off"
placeholder="请输入登录账号" placeholder="请输入手机号码"
> >
<img class="img" slot="prefix" src="../assets/images/user.png"/> <img class="img" slot="prefix" src="../assets/images/phone.png"/>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item prop="captchaCode" v-if="captchaEnabled && showcode"> <el-form-item prop="captchaCode" v-if="captchaEnabled && showcode">
...@@ -77,32 +132,40 @@ ...@@ -77,32 +132,40 @@
v-model="dxform.captchaCode" v-model="dxform.captchaCode"
auto-complete="off" auto-complete="off"
placeholder="请输入验证码" placeholder="请输入验证码"
style="width: 56%;float: left;" style="width: 196px;float: left;"
> >
<img class="img" slot="prefix" src="../assets/images/validCode.png"/> <img class="img" slot="prefix" src="../assets/images/txyzm.png"/>
</el-input> </el-input>
<div class="login-code"> <div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img"/> <img :src="codeUrl" @click="getCode" class="login-code-img"/>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item prop="captchaCode"> <el-form-item prop="smsCode">
<div style="margin-top: 15px;"> <el-input
<el-input placeholder="请输入短信验证码" v-model="dxform.smsCode" @keyup.enter.native="dxLogin"> v-model="dxform.smsCode"
<template slot="append"><div @click="getsms">{{smstitle}}</div></template> auto-complete="off"
placeholder="请输入验证码"
style="width: 196px;float: left;"
@keyup.enter.native="dxLogin"
>
<img class="img" slot="prefix" src="../assets/images/validCode.png"/>
</el-input> </el-input>
<div class="login-code">
<div class="hqyzm" @click="getsms">{{smstitle}}</div>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item style="width:100%;"> <el-form-item style="width:100%;margin-top: 42px">
<el-button <el-button
size="medium" size="medium"
type="primary" type="primary"
style="width:100%;height: 48px;border-radius: 4px;font-size: 16px;" style="width:100%;height: 48px;border-radius: 4px;font-size: 16px;"
@click.native.prevent="dxLogin" @click.native.prevent="dxLogin"
> >
<span></span> <span></span>
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<!--选择租户企业-->
<div v-if="islog" class="login-form choose-form"> <div v-if="islog" class="login-form choose-form">
<h3 class="title i"><img src="../assets/images/login/title_choose.png"/>请选择你想要登录的企业</h3> <h3 class="title i"><img src="../assets/images/login/title_choose.png"/>请选择你想要登录的企业</h3>
<div class="enterpriselist"> <div class="enterpriselist">
...@@ -117,7 +180,6 @@ ...@@ -117,7 +180,6 @@
<script> <script>
import store from '@/store' import store from '@/store'
import { changeTenants, defaultTenantid, getCodeImg, getTenants,userTenantList,logincaptchaSms,smsLogin} from '@/api/login' import { changeTenants, defaultTenantid, getCodeImg, getTenants,userTenantList,logincaptchaSms,smsLogin} from '@/api/login'
import Cookies from 'js-cookie'
import { decrypt, encrypt } from '@/utils/jsencrypt' import { decrypt, encrypt } from '@/utils/jsencrypt'
import {Base64} from 'js-base64' import {Base64} from 'js-base64'
import { getTenantid, setTenantid,setToken } from '@/utils/auth' import { getTenantid, setTenantid,setToken } from '@/utils/auth'
...@@ -128,11 +190,11 @@ ...@@ -128,11 +190,11 @@
return { return {
tenantId:-1, tenantId:-1,
islog:false, islog:false,
isDXlogin:true,
codeUrl: "", codeUrl: "",
loginForm: { loginForm: {
username: "", username: "",
password: "", password: "",
rememberMe: false,
code: "", code: "",
uuid: "" uuid: ""
}, },
...@@ -173,6 +235,7 @@ ...@@ -173,6 +235,7 @@
smstime:60, smstime:60,
smstitle:'获取验证码', smstitle:'获取验证码',
showcode:false,//是否展示验证码 showcode:false,//是否展示验证码
}; };
}, },
watch: { watch: {
...@@ -181,11 +244,16 @@ ...@@ -181,11 +244,16 @@
this.redirect = route.query && route.query.redirect; this.redirect = route.query && route.query.redirect;
}, },
immediate: true immediate: true
},
isDXlogin(){
this.resetForm('dxform')
this.resetForm('loginForm')
this.getCode()
} }
}, },
created() { created() {
this.getCode(); this.getCode();
this.getCookie();
}, },
methods: { methods: {
getCode() { getCode() {
...@@ -198,25 +266,13 @@ ...@@ -198,25 +266,13 @@
} }
}); });
}, },
getCookie() {
const username = Cookies.get("username");
const password = Cookies.get("password");
const rememberMe = Cookies.get('rememberMe')
this.loginForm = {
username: username === undefined ? this.loginForm.username : username,
// password: password === undefined ? this.loginForm.password : decrypt(password),
password: password === undefined ? this.loginForm.password : Base64.encode(password),
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
};
},
getsms(){ getsms(){
logincaptchaSms(this.dxform).then(res=>{ logincaptchaSms(this.dxform).then(res=>{
console.log(res)
if(res.code == 200){ if(res.code == 200){
this.$message.success('已发送短信!') this.$message.success('已发送短信!')
let _this = this let _this = this
this.timers = setInterval(()=>{ this.timers = setInterval(()=>{
_this.smstitle = '剩余' + _this.smstime +'S' _this.smstitle = _this.smstime +'秒后重试'
_this.smstime--; _this.smstime--;
if(_this.smstime <= 0){ if(_this.smstime <= 0){
_this.smstitle = '发送验证码' _this.smstitle = '发送验证码'
...@@ -224,7 +280,7 @@ ...@@ -224,7 +280,7 @@
} }
},1000) },1000)
}else{ }else{
this.$message.error('短信发送失败!') this.$message.error(res.msg)
this.getCode() this.getCode()
this.showcode = true this.showcode = true
} }
...@@ -236,16 +292,6 @@ ...@@ -236,16 +292,6 @@
this.$refs.loginForm.validate(valid => { this.$refs.loginForm.validate(valid => {
if (valid) { if (valid) {
this.loading = true; this.loading = true;
if (this.loginForm.rememberMe) {
Cookies.set("username", this.loginForm.username, { expires: 30 });
// Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
Cookies.set("password", Base64.encode(this.loginForm.password), { expires: 30 });
Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
} else {
Cookies.remove("username");
Cookies.remove("password");
Cookies.remove('rememberMe');
}
let froms = JSON.parse(JSON.stringify(this.loginForm)) let froms = JSON.parse(JSON.stringify(this.loginForm))
froms.password = Base64.encode(this.loginForm.password) froms.password = Base64.encode(this.loginForm.password)
//密码登录时根据手机号获取是否有多个租户 //密码登录时根据手机号获取是否有多个租户
...@@ -267,20 +313,6 @@ ...@@ -267,20 +313,6 @@
}); });
} }
}) })
// this.$store.dispatch("Login", froms).then(() => {
// defaultTenantid().then(res=>{
// if(res.data.tenantId == "" || res.data.tenantId == null){//无默认企业id
// this.goin()
// }else{
// this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
// }
// })
// }).catch(() => {
// this.loading = false;
// if (this.captchaEnabled) {
// this.getCode();
// }
// });
} }
}); });
}, },
...@@ -292,16 +324,22 @@ ...@@ -292,16 +324,22 @@
froms.phonenumber = this.dxform.phonenumber froms.phonenumber = this.dxform.phonenumber
froms.smsCode = this.dxform.smsCode froms.smsCode = this.dxform.smsCode
smsLogin(JSON.stringify(froms)).then(res => { smsLogin(JSON.stringify(froms)).then(res => {
defaultTenantid().then(res=>{ if(res.code == 200) {
if(res.data.tenantId == "" || res.data.tenantId == null){//无默认企业id setToken(res.data.token)
this.goin() store.commit('SET_TOKEN', res.data.token)
}else{
setToken(res.data.accessToken)
store.commit('SET_TOKEN', res.data.accessToken)
setTenantid(res.data.tenantId) setTenantid(res.data.tenantId)
this.$router.push({ path: this.redirect || "/" }).catch(()=>{}); defaultTenantid().then(res => {
if (res.data.tenantId == "" || res.data.tenantId == null) {//无默认企业id
this.goin()
} else {
this.$router.push({ path: this.redirect || "/" }).catch(() => {
});
} }
}) })
}else{
this.getCode()
this.showcode = true
}
}) })
} }
}) })
...@@ -367,15 +405,17 @@ ...@@ -367,15 +405,17 @@
} }
} }
.title { .title {
padding: 46px 0 32px 48px; padding: 40px 0 25px 48px;
border-bottom: 1px solid #F0F0F0; border-bottom: 1px solid #F0F0F0;
font-size: 22px; font-size: 18px;
line-height: 26px;
color: #232323; color: #232323;
margin: 0 0 32px 0; margin: 0 0 32px 0;
img{ img{
width: 17px; width: 24px;
height: 17px; height: 24px;
margin-bottom: 3px; margin-right: 12px;
float: left;
} }
&.i{ &.i{
padding: 40px 0 40px 20px; padding: 40px 0 40px 20px;
...@@ -394,11 +434,12 @@ ...@@ -394,11 +434,12 @@
} }
.login-form { .login-form {
border-radius: 6px; border-radius: 10px;
background: #ffffff; background: #ffffff;
width: 420px; width: 420px;
float: right; float: right;
margin-top: 70px; margin-top: 70px;
padding-bottom: 72px;
/*padding: 25px 25px 5px 25px;*/ /*padding: 25px 25px 5px 25px;*/
.el-form-item{ .el-form-item{
padding: 0 48px; padding: 0 48px;
...@@ -408,13 +449,14 @@ ...@@ -408,13 +449,14 @@
width: 324px; width: 324px;
height: 48px; height: 48px;
background: #F2F4F9; background: #F2F4F9;
border-radius: 4px;
input { input {
height: 48px; height: 48px;
background: #F2F4F9; background: #F2F4F9;
font-size: 14px; font-size: 14px;
} }
.el-input__inner{ .el-input__inner{
padding-left: 73px; padding-left: 61px;
border: 0; border: 0;
} }
} }
...@@ -422,11 +464,39 @@ ...@@ -422,11 +464,39 @@
border-right: 1px solid #D8D8D8; border-right: 1px solid #D8D8D8;
height: 24px; height: 24px;
margin: 12px 0; margin: 12px 0;
left: 0;
width: 48px;
} }
.img { .img {
height: 24px; height: 24px;
width: 24px; width: 24px;
margin: 0 14px 0 12px; margin: 0 12px;
}
.logintitle{
border-bottom: 1px solid #F0F0F0;
margin-bottom: 48px;
padding: 50px 48px 14px;
box-sizing: border-box;
>div{
display: inline-block;
font-size: 18px;
line-height: 26px;
margin-right: 40px;
color: #81878F;
position: relative;
cursor: pointer;
&.on{
color: #232323;
&:after{
content: ' ';
width: 29px;
height: 3px;
background: #0081FF;
position: absolute;
margin: 37px -47px;
}
}
}
} }
} }
.login-tip { .login-tip {
...@@ -438,11 +508,22 @@ ...@@ -438,11 +508,22 @@
width: 33%; width: 33%;
height: 38px; height: 38px;
float: left; float: left;
margin-left: 16px; margin-left: 14px;
img { img {
cursor: pointer; cursor: pointer;
vertical-align: middle; vertical-align: middle;
} }
.hqyzm{
width: 116px;
height: 48px;
border-radius: 4px;
border: 1px solid #EFEFEF;
text-align: center;
color: rgba(35, 35, 35, 0.40);
font-size: 14px;
cursor: pointer;
line-height: 48px;
}
} }
.el-login-footer { .el-login-footer {
height: 40px; height: 40px;
...@@ -457,6 +538,7 @@ ...@@ -457,6 +538,7 @@
letter-spacing: 1px; letter-spacing: 1px;
} }
.login-code-img { .login-code-img {
width: 116px;
height: 48px; height: 48px;
} }
.enterpriselist{ .enterpriselist{
......
...@@ -364,7 +364,7 @@ ...@@ -364,7 +364,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="nickname" prop="nickName"
label="用户昵称"> label="用户昵称">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
...@@ -743,6 +743,7 @@ export default { ...@@ -743,6 +743,7 @@ export default {
} }
this.getList(); this.getList();
}, },
// 提交上传文件 // 提交上传文件
submitFileForm() { submitFileForm() {
this.$refs.upload.submit(); this.$refs.upload.submit();
......
...@@ -2,8 +2,6 @@ package com.dsk.system.domain.vo; ...@@ -2,8 +2,6 @@ package com.dsk.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.dsk.common.annotation.ExcelDictFormat;
import com.dsk.common.convert.ExcelDictConvert;
import com.dsk.system.domain.SysTenantPackage; import com.dsk.system.domain.SysTenantPackage;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
...@@ -34,10 +32,4 @@ public class SysTenantPackageSelectVo implements Serializable { ...@@ -34,10 +32,4 @@ public class SysTenantPackageSelectVo implements Serializable {
@ExcelProperty(value = "套餐名称") @ExcelProperty(value = "套餐名称")
private String packageName; private String packageName;
/**
* 状态(0正常 1停用)
*/
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "0=正常,1=停用")
private String status;
} }
...@@ -71,18 +71,25 @@ public interface ISysDeptService { ...@@ -71,18 +71,25 @@ public interface ISysDeptService {
* 是否存在部门子节点 * 是否存在部门子节点
* *
* @param deptId 部门ID * @param deptId 部门ID
* @return 结果 * @return 结果 true 存在 false 不存在
*/ */
boolean hasChildByDeptId(Long deptId); boolean hasChildByDeptId(Long deptId);
/** /**
* 查询部门是否存在用户 * 查询部门是否存在用户
* *
* @param deptId 部门ID * @param deptId 部门ID
* @return 结果 true 存在 false 不存在 * @return 结果 true 存在 false 不存在
*/ */
boolean checkDeptExistUser(Long deptId); boolean checkDeptExistUser(Long deptId);
/**
* 查询该部门及其子部门是否存在用户
* @param deptId 部门ID
* @return 结果 true 存在 false 不存在
*/
Boolean checkAllDeptsAndUsers(Long deptId);
/** /**
* 校验部门名称是否唯一 * 校验部门名称是否唯一
* *
......
...@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil; ...@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.common.constant.TenantPackageConstants;
import com.dsk.common.core.domain.PageQuery; import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.exception.ServiceException; import com.dsk.common.exception.ServiceException;
...@@ -22,6 +23,7 @@ import org.springframework.stereotype.Service; ...@@ -22,6 +23,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -56,7 +58,9 @@ public class ISysTenantPackageServiceImpl implements ISysTenantPackageService { ...@@ -56,7 +58,9 @@ public class ISysTenantPackageServiceImpl implements ISysTenantPackageService {
*/ */
@Override @Override
public List<SysTenantPackageSelectVo> selectList() { public List<SysTenantPackageSelectVo> selectList() {
List<SysTenantPackageVo> tenantPackageVo = baseMapper.selectVoList(null); LambdaQueryWrapper<SysTenantPackage> wrapper = new LambdaQueryWrapper<SysTenantPackage>()
.eq(SysTenantPackage::getStatus, TenantPackageConstants.NORMAL);
List<SysTenantPackageVo> tenantPackageVo = baseMapper.selectVoList(wrapper);
return BeanUtil.copyToList(tenantPackageVo, SysTenantPackageSelectVo.class); return BeanUtil.copyToList(tenantPackageVo, SysTenantPackageSelectVo.class);
} }
...@@ -113,6 +117,12 @@ public class ISysTenantPackageServiceImpl implements ISysTenantPackageService { ...@@ -113,6 +117,12 @@ public class ISysTenantPackageServiceImpl implements ISysTenantPackageService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(SysTenantPackageBo bo) { public Boolean updateByBo(SysTenantPackageBo bo) {
SysTenantPackage update = BeanUtil.toBean(bo, SysTenantPackage.class); SysTenantPackage update = BeanUtil.toBean(bo, SysTenantPackage.class);
List<Long> packageIds = new ArrayList<>();
packageIds.add(bo.getPackageId());
//校验该套餐是否正在被使用
if (TenantPackageConstants.DISABLE.equals(bo.getStatus())) {
checkPackageIsUsed(packageIds);
}
// 保存菜单id // 保存菜单id
List<Long> menuIds = Arrays.asList(bo.getMenuIds()); List<Long> menuIds = Arrays.asList(bo.getMenuIds());
if (CollUtil.isNotEmpty(menuIds)) { if (CollUtil.isNotEmpty(menuIds)) {
...@@ -123,6 +133,18 @@ public class ISysTenantPackageServiceImpl implements ISysTenantPackageService { ...@@ -123,6 +133,18 @@ public class ISysTenantPackageServiceImpl implements ISysTenantPackageService {
return baseMapper.updateById(update) > 0; return baseMapper.updateById(update) > 0;
} }
/**
* 校验套餐是否正在被租户使用
*
* @param ids 套餐ID数组
*/
private void checkPackageIsUsed(List<Long> ids) {
boolean exists = tenantMapper.exists(new LambdaQueryWrapper<SysTenant>().in(SysTenant::getPackageId, ids));
if (exists) {
throw new ServiceException("租户套餐已被使用");
}
}
// /** // /**
// * 修改套餐状态 // * 修改套餐状态
// */ // */
...@@ -139,10 +161,7 @@ public class ISysTenantPackageServiceImpl implements ISysTenantPackageService { ...@@ -139,10 +161,7 @@ public class ISysTenantPackageServiceImpl implements ISysTenantPackageService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(List<Long> ids, boolean isValid) { public Boolean deleteWithValidByIds(List<Long> ids, boolean isValid) {
if (isValid) { if (isValid) {
boolean exists = tenantMapper.exists(new LambdaQueryWrapper<SysTenant>().in(SysTenant::getPackageId, ids)); checkPackageIsUsed(ids);
if (exists) {
throw new ServiceException("租户套餐已被使用");
}
} }
return baseMapper.deleteBatchIds(ids) > 0; return baseMapper.deleteBatchIds(ids) > 0;
} }
......
...@@ -16,7 +16,6 @@ import com.dsk.common.core.domain.entity.SysDictData; ...@@ -16,7 +16,6 @@ import com.dsk.common.core.domain.entity.SysDictData;
import com.dsk.common.core.domain.entity.SysDictType; import com.dsk.common.core.domain.entity.SysDictType;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.exception.ServiceException; import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.DingTalkUtil;
import com.dsk.common.utils.PasswordUtils; import com.dsk.common.utils.PasswordUtils;
import com.dsk.common.utils.StringUtils; import com.dsk.common.utils.StringUtils;
import com.dsk.system.domain.*; import com.dsk.system.domain.*;
...@@ -36,9 +35,10 @@ import java.util.Collection; ...@@ -36,9 +35,10 @@ import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
* 企业Service业务层处理
*
* @author sxk * @author sxk
* @date 2023.08.22 * @date 2023.08.22
* @description: 企业Service业务层处理
*/ */
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
...@@ -233,7 +233,8 @@ public class ISysTenantServiceImpl implements ISysTenantService { ...@@ -233,7 +233,8 @@ public class ISysTenantServiceImpl implements ISysTenantService {
+ "您好,您已经成功注册央企数字经营管理系统,请使用手机号码登录,初始密码为" + "您好,您已经成功注册央企数字经营管理系统,请使用手机号码登录,初始密码为"
+ password + password
+ "。友情提示:为了您的账号安全,请勿泄露密码。若需要修改密码,请联系管理员。"; + "。友情提示:为了您的账号安全,请勿泄露密码。若需要修改密码,请联系管理员。";
DingTalkUtil.sendDingTalkMsg(content); //DingTalkUtil.sendDingTalkMsg(content);
System.out.println("👉🏻:" + content);
return true; return true;
} }
......
...@@ -8,9 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; ...@@ -8,9 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.dsk.common.constant.CacheNames; import com.dsk.common.constant.CacheNames;
import com.dsk.common.constant.UserConstants; import com.dsk.common.constant.UserConstants;
import com.dsk.system.domain.SysDept;
import com.dsk.system.domain.SysRole;
import com.dsk.system.domain.SysUser;
import com.dsk.common.core.service.DeptService; import com.dsk.common.core.service.DeptService;
import com.dsk.common.exception.ServiceException; import com.dsk.common.exception.ServiceException;
import com.dsk.common.helper.DataBaseHelper; import com.dsk.common.helper.DataBaseHelper;
...@@ -19,6 +16,9 @@ import com.dsk.common.utils.StringUtils; ...@@ -19,6 +16,9 @@ import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.TreeBuildUtils; import com.dsk.common.utils.TreeBuildUtils;
import com.dsk.common.utils.redis.CacheUtils; import com.dsk.common.utils.redis.CacheUtils;
import com.dsk.common.utils.spring.SpringUtils; import com.dsk.common.utils.spring.SpringUtils;
import com.dsk.system.domain.SysDept;
import com.dsk.system.domain.SysRole;
import com.dsk.system.domain.SysUser;
import com.dsk.system.mapper.SysDeptMapper; import com.dsk.system.mapper.SysDeptMapper;
import com.dsk.system.mapper.SysRoleMapper; import com.dsk.system.mapper.SysRoleMapper;
import com.dsk.system.mapper.SysUserMapper; import com.dsk.system.mapper.SysUserMapper;
...@@ -183,7 +183,7 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { ...@@ -183,7 +183,7 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
} }
/** /**
* 查询部门是否存在用户 * 查询部门是否存在用户
* *
* @param deptId 部门ID * @param deptId 部门ID
* @return 结果 true 存在 false 不存在 * @return 结果 true 存在 false 不存在
...@@ -194,6 +194,26 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { ...@@ -194,6 +194,26 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
.eq(SysUser::getDeptId, deptId)); .eq(SysUser::getDeptId, deptId));
} }
/**
* 查询该部门及其子部门是否存在用户
*
* @param deptId 部门ID
* @return 结果 true 存在 false 不存在
*/
@Override
public Boolean checkAllDeptsAndUsers(Long deptId) {
List<SysDept> childDeptList = baseMapper.selectDeptList(new LambdaQueryWrapper<SysDept>()
.eq(SysDept::getParentId, deptId));
if (!childDeptList.isEmpty()) {
for (SysDept sysDept : childDeptList) {
if (checkDeptExistUser(sysDept.getDeptId())) {
return true;
}
}
}
return checkDeptExistUser(deptId);
}
/** /**
* 校验部门名称是否唯一 * 校验部门名称是否唯一
* *
......
...@@ -149,19 +149,11 @@ public class SysMenuServiceImpl implements ISysMenuService { ...@@ -149,19 +149,11 @@ public class SysMenuServiceImpl implements ISysMenuService {
*/ */
@Override @Override
public List<SysMenu> selectMenuTreeByUserId(Long userId) { public List<SysMenu> selectMenuTreeByUserId(Long userId) {
List<SysMenu> menus = null; List<SysMenu> menus;
if (LoginHelper.isSuperAdmin(userId)) { if (LoginHelper.isSuperAdmin(userId)) {
//Sass超管 //Sass超管
menus = baseMapper.selectMenuTreeAll(); menus = baseMapper.selectMenuTreeAll();
} }else {
// else if (LoginHelper.isTenantAdmin()) {
// //租户管理员
// SysTenantVo sysTenantVo = tenantMapper.selectVoOne(new LambdaQueryWrapper<SysTenant>().eq(SysTenant::getTenantId, LoginHelper.getTenantId()));
// SysTenantPackageVo sysTenantPackageVo = tenantPackageMapper.selectVoOne(new LambdaQueryWrapper<SysTenantPackage>().eq(SysTenantPackage::getPackageId, sysTenantVo.getPackageId()));
// List<Long> menuIds = StringUtils.splitTo(sysTenantPackageVo.getMenuIds(), Convert::toLong);
// menus = baseMapper.selectBatchIds(menuIds);
// }
else {
//租户下的员工 //租户下的员工
menus = baseMapper.selectMenuTreeByUserId(userId); menus = baseMapper.selectMenuTreeByUserId(userId);
} }
......
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