-m:系统配置,是否可注册配置项获取

This commit is contained in:
Xiaojiuc 2022-02-01 04:43:50 +08:00
parent 612c4293d1
commit 8227b85a95
4 changed files with 322 additions and 284 deletions

View File

@ -2,6 +2,8 @@ package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.core.redis.RedisCache;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -23,9 +25,11 @@ import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysConfig; import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysConfigService;
import static com.ruoyi.common.constant.Constants.SYS_CONFIG_KEY;
/** /**
* 参数配置 信息操作处理 * 参数配置 信息操作处理
* *
* @author ruoyi * @author ruoyi
*/ */
@RestController @RestController
@ -35,6 +39,10 @@ public class SysConfigController extends BaseController
@Autowired @Autowired
private ISysConfigService configService; private ISysConfigService configService;
@Autowired
private RedisCache redisCache;
/** /**
* 获取参数配置列表 * 获取参数配置列表
*/ */
@ -76,6 +84,16 @@ public class SysConfigController extends BaseController
return AjaxResult.success(configService.selectConfigByKey(configKey)); return AjaxResult.success(configService.selectConfigByKey(configKey));
} }
/**
* 查询注册配置
*/
@GetMapping(value = "/getRegisterConfig")
public AjaxResult getRegisterConfig()
{
String register = redisCache.getCacheObject(SYS_CONFIG_KEY + "sys.account.registerUser").toString();
return AjaxResult.success(register);
}
/** /**
* 新增参数配置 * 新增参数配置
*/ */

View File

@ -20,7 +20,7 @@ import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;
/** /**
* spring security配置 * spring security配置
* *
* @author ruoyi * @author ruoyi
*/ */
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@ -31,7 +31,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
*/ */
@Autowired @Autowired
private UserDetailsService userDetailsService; private UserDetailsService userDetailsService;
/** /**
* 认证失败处理类 * 认证失败处理类
*/ */
@ -49,13 +49,13 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
*/ */
@Autowired @Autowired
private JwtAuthenticationTokenFilter authenticationTokenFilter; private JwtAuthenticationTokenFilter authenticationTokenFilter;
/** /**
* 跨域过滤器 * 跨域过滤器
*/ */
@Autowired @Autowired
private CorsFilter corsFilter; private CorsFilter corsFilter;
/** /**
* 解决 无法直接注入 AuthenticationManager * 解决 无法直接注入 AuthenticationManager
* *
@ -97,7 +97,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
// 过滤请求 // 过滤请求
.authorizeRequests() .authorizeRequests()
// 对于登录login 注册register 验证码captchaImage 允许匿名访问 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
.antMatchers("/login", "/register", "/captchaImage").anonymous() .antMatchers("/login", "/register", "/captchaImage", "/system/config/getRegisterConfig").anonymous()
.antMatchers( .antMatchers(
HttpMethod.GET, HttpMethod.GET,
"/", "/",

View File

@ -1,59 +1,70 @@
import request from '@/utils/request' import request from '@/utils/request'
// 登录方法 // 登录方法
export function login(username, password, code, uuid) { export function login(username, password, code, uuid) {
const data = { const data = {
username, username,
password, password,
code, code,
uuid uuid
} }
return request({ return request({
url: '/login', url: '/login',
headers: { headers: {
isToken: false isToken: false
}, },
method: 'post', method: 'post',
data: data data: data
}) })
} }
// 注册方法 // 注册方法
export function register(data) { export function register(data) {
return request({ return request({
url: '/register', url: '/register',
headers: { headers: {
isToken: false isToken: false
}, },
method: 'post', method: 'post',
data: data data: data
}) })
} }
// 获取用户详细信息 // 注册配置获取
export function getInfo() { export function registerConfig() {
return request({ return request({
url: '/getInfo', url: '/system/config/getRegisterConfig',
method: 'get' headers: {
}) isToken: false
} },
method: 'get'
// 退出方法 })
export function logout() { }
return request({
url: '/logout', // 获取用户详细信息
method: 'post' export function getInfo() {
}) return request({
} url: '/getInfo',
method: 'get'
// 获取验证码 })
export function getCodeImg() { }
return request({
url: '/captchaImage', // 退出方法
headers: { export function logout() {
isToken: false return request({
}, url: '/logout',
method: 'get', method: 'post'
timeout: 20000 })
}) }
}
// 获取验证码
export function getCodeImg() {
return request({
url: '/captchaImage',
headers: {
isToken: false
},
method: 'get',
timeout: 20000
})
}

View File

@ -1,219 +1,228 @@
<template> <template>
<div class="login"> <div class="login">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form"> <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
<h3 class="title">若依后台管理系统</h3> <h3 class="title">若依后台管理系统</h3>
<el-form-item prop="username"> <el-form-item prop="username">
<el-input <el-input
v-model="loginForm.username" v-model="loginForm.username"
type="text" type="text"
auto-complete="off" auto-complete="off"
placeholder="账号" placeholder="账号"
> >
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" /> <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item prop="password"> <el-form-item prop="password">
<el-input <el-input
v-model="loginForm.password" v-model="loginForm.password"
type="password" type="password"
auto-complete="off" auto-complete="off"
placeholder="密码" placeholder="密码"
@keyup.enter.native="handleLogin" @keyup.enter.native="handleLogin"
> >
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" /> <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item prop="code" v-if="captchaOnOff"> <el-form-item prop="code" v-if="captchaOnOff">
<el-input <el-input
v-model="loginForm.code" v-model="loginForm.code"
auto-complete="off" auto-complete="off"
placeholder="验证码" placeholder="验证码"
style="width: 63%" style="width: 63%"
@keyup.enter.native="handleLogin" @keyup.enter.native="handleLogin"
> >
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" /> <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
</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 0px;">记住密码</el-checkbox> <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
<el-form-item style="width:100%;"> <el-form-item style="width:100%;">
<el-button <el-button
:loading="loading" :loading="loading"
size="medium" size="medium"
type="primary" type="primary"
style="width:100%;" style="width:100%;"
@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"> <div style="float: right;" v-if="register">
<router-link class="link-type" :to="'/register'">立即注册</router-link> <router-link class="link-type" :to="'/register'">立即注册</router-link>
</div> </div>
</el-form-item> </el-form-item>
</el-form> </el-form>
<!-- 底部 --> <!-- 底部 -->
<div class="el-login-footer"> <div class="el-login-footer">
<span>Copyright © 2018-2022 ruoyi.vip All Rights Reserved.</span> <span>Copyright © 2018-2022 ruoyi.vip All Rights Reserved.</span>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { getCodeImg } from "@/api/login"; import { getCodeImg, registerConfig } from "@/api/login";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { encrypt, decrypt } from '@/utils/jsencrypt' import { encrypt, decrypt } from '@/utils/jsencrypt'
export default { export default {
name: "Login", name: "Login",
data() { data() {
return { return {
codeUrl: "", codeUrl: "",
loginForm: { loginForm: {
username: "admin", username: "admin",
password: "admin123", password: "admin123",
rememberMe: false, rememberMe: false,
code: "", code: "",
uuid: "" uuid: ""
}, },
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: "请输入您的密码" }
], ],
code: [{ required: true, trigger: "change", message: "请输入验证码" }] code: [{ required: true, trigger: "change", message: "请输入验证码" }]
}, },
loading: false, loading: false,
// //
captchaOnOff: true, captchaOnOff: true,
// //
register: false, register: false,
redirect: undefined redirect: undefined
}; };
}, },
watch: { watch: {
$route: { $route: {
handler: function(route) { handler: function(route) {
this.redirect = route.query && route.query.redirect; this.redirect = route.query && route.query.redirect;
}, },
immediate: true immediate: true
} }
}, },
created() { created() {
this.getCode(); this.getCode();
this.getCookie(); this.getCookie();
}, this.getRegisterConfig()
methods: { },
getCode() { methods: {
getCodeImg().then(res => { /**
this.captchaOnOff = res.captchaOnOff === undefined ? true : res.captchaOnOff; * 获取注册配置信息
if (this.captchaOnOff) { */
this.codeUrl = "data:image/gif;base64," + res.img; getRegisterConfig(){
this.loginForm.uuid = res.uuid; registerConfig().then(res => {
} this.register = res.msg == "true" ? true : false
}); })
}, },
getCookie() { getCode() {
const username = Cookies.get("username"); getCodeImg().then(res => {
const password = Cookies.get("password"); this.captchaOnOff = res.captchaOnOff === undefined ? true : res.captchaOnOff;
const rememberMe = Cookies.get('rememberMe') if (this.captchaOnOff) {
this.loginForm = { this.codeUrl = "data:image/gif;base64," + res.img;
username: username === undefined ? this.loginForm.username : username, this.loginForm.uuid = res.uuid;
password: password === undefined ? this.loginForm.password : decrypt(password), }
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe) });
}; },
}, getCookie() {
handleLogin() { const username = Cookies.get("username");
this.$refs.loginForm.validate(valid => { const password = Cookies.get("password");
if (valid) { const rememberMe = Cookies.get('rememberMe')
this.loading = true; this.loginForm = {
if (this.loginForm.rememberMe) { username: username === undefined ? this.loginForm.username : username,
Cookies.set("username", this.loginForm.username, { expires: 30 }); password: password === undefined ? this.loginForm.password : decrypt(password),
Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 }); rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 }); };
} else { },
Cookies.remove("username"); handleLogin() {
Cookies.remove("password"); this.$refs.loginForm.validate(valid => {
Cookies.remove('rememberMe'); if (valid) {
} this.loading = true;
this.$store.dispatch("Login", this.loginForm).then(() => { if (this.loginForm.rememberMe) {
this.$router.push({ path: this.redirect || "/" }).catch(()=>{}); Cookies.set("username", this.loginForm.username, { expires: 30 });
}).catch(() => { Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
this.loading = false; Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
if (this.captchaOnOff) { } else {
this.getCode(); Cookies.remove("username");
} Cookies.remove("password");
}); Cookies.remove('rememberMe');
} }
}); this.$store.dispatch("Login", this.loginForm).then(() => {
} this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
} }).catch(() => {
}; this.loading = false;
</script> if (this.captchaOnOff) {
this.getCode();
<style rel="stylesheet/scss" lang="scss"> }
.login { });
display: flex; }
justify-content: center; });
align-items: center; }
height: 100%; }
background-image: url("../assets/images/login-background.jpg"); };
background-size: cover; </script>
}
.title { <style rel="stylesheet/scss" lang="scss">
margin: 0px auto 30px auto; .login {
text-align: center; display: flex;
color: #707070; justify-content: center;
} align-items: center;
height: 100%;
.login-form { background-image: url("../assets/images/login-background.jpg");
border-radius: 6px; background-size: cover;
background: #ffffff; }
width: 400px; .title {
padding: 25px 25px 5px 25px; margin: 0px auto 30px auto;
.el-input { text-align: center;
height: 38px; color: #707070;
input { }
height: 38px;
} .login-form {
} border-radius: 6px;
.input-icon { background: #ffffff;
height: 39px; width: 400px;
width: 14px; padding: 25px 25px 5px 25px;
margin-left: 2px; .el-input {
} height: 38px;
} input {
.login-tip { height: 38px;
font-size: 13px; }
text-align: center; }
color: #bfbfbf; .input-icon {
} height: 39px;
.login-code { width: 14px;
width: 33%; margin-left: 2px;
height: 38px; }
float: right; }
img { .login-tip {
cursor: pointer; font-size: 13px;
vertical-align: middle; text-align: center;
} color: #bfbfbf;
} }
.el-login-footer { .login-code {
height: 40px; width: 33%;
line-height: 40px; height: 38px;
position: fixed; float: right;
bottom: 0; img {
width: 100%; cursor: pointer;
text-align: center; vertical-align: middle;
color: #fff; }
font-family: Arial; }
font-size: 12px; .el-login-footer {
letter-spacing: 1px; height: 40px;
} line-height: 40px;
.login-code-img { position: fixed;
height: 38px; bottom: 0;
} width: 100%;
</style> text-align: center;
color: #fff;
font-family: Arial;
font-size: 12px;
letter-spacing: 1px;
}
.login-code-img {
height: 38px;
}
</style>