Merge remote-tracking branch 'origin/master'

master
hshansha 7 months ago
commit f8860f5144

@ -69,3 +69,66 @@ export function getCodeSms() {
timeout: 20000 timeout: 20000
}) })
} }
// 注册 新增公司信息
export function registerGs(data) {
return request({
url: '/registerGs',
headers: {
isToken: false
},
method: 'post',
data: data
})
}
// 注册 新增公司信息
export function registerUser(data) {
return request({
url: '/registerUser',
headers: {
isToken: false
},
method: 'post',
data: data
})
}
// 发送短信验证码
export function getCaptchaSms(query) {
return request({
url: '/captchaSms',
headers: {
isToken: false
},
method: 'get',
params: query
})
}
// 验证短信验证码
export function validateSmsCode(data) {
return request({
url: '/validateSmsCode',
headers: {
isToken: false
},
method: 'post',
params: data
})
}
// 修改密码
export function modifyPass(data) {
return request({
url: '/modifyPass',
headers: {
isToken: false
},
method: 'post',
data: data
})
}

@ -8,7 +8,7 @@ import { isRelogin } from '@/utils/request'
NProgress.configure({ showSpinner: false }) NProgress.configure({ showSpinner: false })
const whiteList = ['/login', '/register'] const whiteList = ['/login', '/register', '/forgetpass']
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
NProgress.start() NProgress.start()

@ -51,6 +51,11 @@ export const constantRoutes = [
component: () => import('@/views/register'), component: () => import('@/views/register'),
hidden: true hidden: true
}, },
{
path: '/forgetpass',
component: () => import('@/views/forgetpass'),
hidden: true
},
{ {
path: '/404', path: '/404',
component: () => import('@/views/error/404'), component: () => import('@/views/error/404'),

@ -0,0 +1,290 @@
<template>
<div class="login">
<div class="login-form">
<h2>找回密码</h2>
<el-steps :space="300" :active="activeStep" align-center style="margin-bottom: 50px;margin-top: 20px;">
<el-step title="安全验证"></el-step>
<el-step title="重置密码"></el-step>
<el-step title="设置成功"></el-step>
</el-steps>
<div v-if="activeStep===0" style="width: 350px;margin: 0 auto;">
<el-form ref="aqyzForm" :model="aqyz.form" :rules="aqyz.rules" >
<el-form-item prop="phonenumber">
<el-input
v-model="aqyz.form.phonenumber"
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="smsCode">
<el-input
v-model="aqyz.form.smsCode"
auto-complete="off"
placeholder="校验码"
style="width: 60%"
@keyup.enter.native="getCaptchaSms"
>
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
</el-input>
<div class="login-code" @click="getAuthCode" v-if="aqyz.isAuthCode">
发送获取校验码
</div>
<div class="login-code-disable" v-if="!aqyz.isAuthCode">
{{ aqyz.msg }}
</div>
</el-form-item>
<el-form-item style="width:100%;">
<el-button
:loading="aqyz.loading"
size="medium"
type="primary"
style="width:100%;"
@click.native.prevent="submitValidate"
>
<span v-if="!aqyz.loading"></span>
<span v-else> ...</span>
</el-button>
</el-form-item>
</el-form>
</div>
<div v-if="activeStep===1" style="width: 350px;margin: 0 auto;">
<el-form ref="resetPWForm" :model="resetPW.form" :rules="resetPW.rules" >
<el-form-item prop="password">
<el-input
v-model="resetPW.form.password"
type="password"
auto-complete="off"
placeholder="请输入新密码"
>
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
</el-input>
</el-form-item>
<el-form-item style="width:100%;">
<el-button
:loading="resetPW.loading"
size="medium"
type="primary"
style="width:100%;"
@click.native.prevent="submitReset"
>
<span v-if="!resetPW.loading"></span>
<span v-else> ...</span>
</el-button>
</el-form-item>
</el-form>
</div>
<div v-if="activeStep===2" style="width: 350px;margin: 0 auto;">
<el-result icon="success" subTitle="设置成功,请返回登录页重新登录">
<template slot="extra">
<router-link class="link-type" :to="'/login'">返回登录页</router-link>
</template>
</el-result>
</div>
</div>
<!-- 底部 -->
<!-- <div class="el-login-footer">
<span>Copyright © 2021-2022 konbai.work All Rights Reserved.</span>
</div>-->
</div>
</template>
<script>
import { getCaptchaSms, validateSmsCode, modifyPass } from "@/api/login";
export default {
name: "Forgetpass",
data() {
return {
activeStep: 0,
//
aqyz:{
//
isAuthCode: true,
msg:'',
form: {
phonenumber: "",
smsCode: "",
},
rules: {
phonenumber: [
{ required: true, trigger: "blur", message: "请输入手机号" },
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur"
}
],
smsCode: [{ required: true, trigger: "change", message: "请输入校验码" }]
},
loading: false,
},
//
resetPW:{
form: {
password: "",
},
rules: {
password: [
{ required: true, trigger: "blur", message: "请输入新密码" },
],
},
loading: false,
},
redirect: undefined
};
},
watch: {
$route: {
handler: function(route) {
this.redirect = route.query && route.query.redirect;
},
immediate: true
}
},
created() {
},
methods: {
getAuthCode(){
let regex = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/;
if(this.aqyz.form.phonenumber && regex.test(this.aqyz.form.phonenumber)){
getCaptchaSms({ phonenumber: this.aqyz.form.phonenumber }).then(res => {
console.log(res);
var time = 59;// 60s
var timer = null;//
this.aqyz.isAuthCode=false;
timer = setInterval(()=>{
if(time==0){
this.aqyz.isAuthCode=true;
clearInterval(timer);//
}else{
this.aqyz.msg=time+"S 重新发送";
time--;
}
},1000);
});
}else {
this.$alert(`请输入正确手机号码!`, `提示`, {
type: 'warning'
});
}
},
//
submitValidate(){
this.$refs["aqyzForm"].validate(valid => {
if (valid) {
this.aqyz.loading = true;
validateSmsCode(this.aqyz.form).then(response => {
console.log(response,123);
this.resetPW.form.userId = response.data.userId;
this.resetPW.form.userName = response.data.userName;
this.aqyz.loading = false;
this.activeStep = 1;
}).finally(() => {
this.aqyz.loading = false;
});
}
});
},
//
submitReset(){
this.$refs["resetPWForm"].validate(valid => {
if (valid) {
this.resetPW.loading = true;
modifyPass(this.resetPW.form).then(response => {
this.resetPW.loading = false;
this.activeStep = 2;
}).finally(() => {
this.resetPW.loading = false;
});
}
});
},
goLogin(){
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.login {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
background-image: url("../assets/images/login-background.jpg");
background-size: cover;
}
.title {
margin: 0px auto 30px auto;
text-align: center;
color: #707070;
}
.login-form {
border-radius: 6px;
background: #ffffff;
width: 800px;
padding: 30px 30px 50px 30px;
.el-input {
height: 38px;
input {
height: 38px;
}
}
.input-icon {
height: 39px;
width: 14px;
margin-left: 2px;
}
}
.login-tip {
font-size: 13px;
text-align: center;
color: #bfbfbf;
}
.login-code {
width: 38%;
height: 38px;
float: right;
text-align: center;
font-size: 14px;
color: #ff5f00;
border: 1px solid #ff5f00;
border-radius: 6px;
}
.login-code-disable{
width: 38%;
height: 38px;
float: right;
text-align: center;
font-size: 14px;
color: #bfbfbf;
border: 1px solid #bfbfbf;
border-radius: 6px;
}
.el-login-footer {
height: 40px;
line-height: 40px;
position: fixed;
bottom: 0;
width: 100%;
text-align: center;
color: #fff;
font-family: Arial;
font-size: 12px;
letter-spacing: 1px;
}
</style>

@ -1,7 +1,7 @@
<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"

@ -1,146 +1,215 @@
<template> <template>
<div class="register"> <div class="register">
<el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
<div class="register-form">
<h3 class="title">薪资管理系统</h3> <h3 class="title">薪资管理系统</h3>
<el-form-item prop="username">
<el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="账号"> <el-steps :space="300" :active="activeType" align-center style="margin-bottom: 50px;margin-top: 20px;">
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" /> <el-step title="注册公司"></el-step>
</el-input> <el-step title="注册用户"></el-step>
</el-form-item> <el-step title="注册成功"></el-step>
<el-form-item prop="password"> </el-steps>
<el-input
v-model="registerForm.password" <div style="width: 400px;margin: 0 auto;" v-if="activeType===0">
type="password" <el-form ref="formGs" :model="formGs" :rules="rulesGs" label-width="100px">
auto-complete="off" <el-form-item label="公司名称" prop="name">
placeholder="密码" <el-input v-model="formGs.name" placeholder="请输入公司名称" />
@keyup.enter.native="handleRegister" </el-form-item>
> <el-form-item label="联系手机号" prop="phone">
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" /> <el-input v-model="formGs.phone" placeholder="请输入手机号码" maxlength="11"/>
</el-input> </el-form-item>
</el-form-item> <el-form-item label="公司固话" prop="fixPhone">
<el-form-item prop="confirmPassword"> <el-input v-model="formGs.fixPhone" placeholder="请输入公司固话" />
<el-input </el-form-item>
v-model="registerForm.confirmPassword" <el-form-item label="公司地址" prop="address">
type="password" <el-input v-model="formGs.address" placeholder="请输入公司地址" />
auto-complete="off" </el-form-item>
placeholder="确认密码" <el-form-item label="公司网址" prop="website">
@keyup.enter.native="handleRegister" <el-input v-model="formGs.website" placeholder="请输入公司网址" />
> </el-form-item>
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" /> <el-form-item label="备注" prop="remark">
</el-input> <el-input v-model="formGs.remark" type="textarea" placeholder="请输入内容" />
</el-form-item> </el-form-item>
<el-form-item prop="code" v-if="captchaEnabled"> <el-button
<el-input :loading="loadingGs"
v-model="registerForm.code" size="medium"
auto-complete="off" type="primary"
placeholder="验证码" style="width:100%;"
style="width: 63%" @click.native.prevent="submitGs"
@keyup.enter.native="handleRegister" >
> <span v-if="!loadingGs"></span>
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" /> <span v-else> ...</span>
</el-input> </el-button>
<div class="register-code"> </el-form>
<img :src="codeUrl" @click="getCode" class="register-code-img"/> </div>
</div>
</el-form-item> <div style="width: 400px;margin: 0 auto;" v-if="activeType===1">
<el-form-item style="width:100%;"> <el-form ref="formUser" :model="formUser" :rules="rulesUser" label-width="80px" label-position="right">
<el-button <el-row>
:loading="loading" <el-form-item label="用户昵称" prop="nickName">
size="medium" <el-input v-model="formUser.nickName" placeholder="请输入用户昵称" maxlength="30" />
type="primary" </el-form-item>
style="width:100%;" <el-form-item label="用户账号" prop="userName">
@click.native.prevent="handleRegister" <el-input v-model="formUser.userName" placeholder="请输入用户账号" maxlength="30" />
> </el-form-item>
<span v-if="!loading"> </span> <el-form-item label="用户密码" prop="password">
<span v-else> ...</span> <el-input v-model="formUser.password" placeholder="请输入用户密码" type="password" maxlength="20" show-password/>
</el-button> </el-form-item>
<div style="float: right;"> <el-form-item label="手机号码" prop="phonenumber">
<router-link class="link-type" :to="'/login'">使用已有账户登录</router-link> <el-input v-model="formUser.phonenumber" placeholder="请输入手机号码" maxlength="11" />
</div> </el-form-item>
</el-form-item> <el-form-item label="邮箱" prop="email">
</el-form> <el-input v-model="formUser.email" placeholder="请输入邮箱" maxlength="50" />
<!-- 底部 --> </el-form-item>
<div class="el-register-footer"> </el-row>
<span>Copyright © 2018-2023 KonBAI All Rights Reserved.</span> <el-button
:loading="loadingUser"
size="medium"
type="primary"
style="width:100%;"
@click.native.prevent="submitUser"
>
<span v-if="!loadingUser"></span>
<span v-else> ...</span>
</el-button>
</el-form>
</div>
<div v-if="activeType===2" style="width: 400px;margin: 0 auto;">
<el-result icon="success" subTitle="注册成功,请返回登录页登录">
</el-result>
</div>
<div style="font-size: 14px;margin-top: 30px;">
<div style="color: #d50000">温馨提示注册成功前请不要关闭页面手机号注册过一次后不可在重复注册</div>
</div>
<div style="font-size: 14px;margin-top: 10px;">
<router-link class="link-type" :to="'/login'">返回登录页</router-link>
</div>
</div> </div>
<!-- 底部 -->
<!-- <div class="el-register-footer">
<span>Copyright © 2018-2023 ruoyi.vip All Rights Reserved.</span>
</div>-->
</div> </div>
</template> </template>
<script> <script>
import { getCodeImg, register } from "@/api/login"; import { registerGs, registerUser } from "@/api/login";
export default { export default {
name: "Register", name: "Register",
data() { data() {
const equalToPassword = (rule, value, callback) => {
if (this.registerForm.password !== value) {
callback(new Error("两次输入的密码不一致"));
} else {
callback();
}
};
return { return {
codeUrl: "", codeUrl: "",
registerForm: { activeType: 0, // 0 1 2
username: "", //
password: "", formGs: {},
confirmPassword: "", //
code: "", rulesGs: {
uuid: "", name: [
userType: "sys_user" { required: true, message: "公司名称不能为空", trigger: "blur" }
],
phone: [
{ required: true, message: "联系手机号不能为空", trigger: "blur" },
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur"
}
],
/*fixPhone: [
{ required: true, message: "公司固话不能为空", trigger: "blur" }
],*/
address: [
{ required: true, message: "公司地址不能为空", trigger: "blur" }
],
/*website: [
{ required: true, message: "公司网址不能为空", trigger: "blur" }
],*/
/*remark: [
{ required: true, message: "备注不能为空", trigger: "blur" }
]*/
}, },
registerRules: { loadingGs: false,
username: [ //
{ required: true, trigger: "blur", message: "请输入您的账号" }, formUser: {},
//
rulesUser: {
userType: [
{ required: true, message: "用户类型不能为空", trigger: "blur" }
],
userName: [
{ required: true, message: "用户账号不能为空", trigger: "blur" },
{ min: 2, max: 20, message: '用户账号长度必须介于 2 和 20 之间', trigger: 'blur' } { min: 2, max: 20, message: '用户账号长度必须介于 2 和 20 之间', trigger: 'blur' }
], ],
nickName: [
{ required: true, message: "用户昵称不能为空", trigger: "blur" }
],
password: [ password: [
{ required: true, trigger: "blur", message: "请输入您的密码" }, { required: true, message: "用户密码不能为空", trigger: "blur" },
{ min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' } { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
], ],
confirmPassword: [ email: [
{ required: true, trigger: "blur", message: "请再次输入您的密码" }, {
{ required: true, validator: equalToPassword, trigger: "blur" } type: "email",
message: "请输入正确的邮箱地址",
trigger: ["blur", "change"]
}
],
phonenumber: [
{ required: true, message: "手机号码不能为空", trigger: "blur" },
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur"
}
], ],
code: [{ required: true, trigger: "change", message: "请输入验证码" }] tenantId:[
{ required: true, message: "所属公司不能为空", trigger: "blur" },
]
}, },
loading: false, loadingUser: false,
captchaEnabled: true loading: false
}; };
}, },
created() { created() {
this.getCode();
}, },
methods: { methods: {
getCode() { submitGs(){
getCodeImg().then(res => { this.$refs["formGs"].validate(valid => {
this.captchaEnabled = res.data.captchaEnabled === undefined ? true : res.data.captchaEnabled; if (valid) {
if (this.captchaEnabled) { this.loadingGs = true;
this.codeUrl = "data:image/gif;base64," + res.data.img; registerGs(this.formGs).then(response => {
this.registerForm.uuid = res.data.uuid; this.$modal.msgSuccess("提交成功");
this.activeType=1;
this.formUser.tenantId = response.data.id;
this.formUser.tenantName = this.formGs.name;
response.data.roles.forEach(item=>{
if(item.roleKey==='companyAdmin'){
this.formUser.roleIds = [item.roleId]
}
})
}).finally(() => {
this.loadingGs = false;
});
} }
}); });
}, },
handleRegister() { submitUser(){
this.$refs.registerForm.validate(valid => { this.$refs["formUser"].validate(valid => {
if (valid) { if (valid) {
this.loading = true; this.loadingUser = true;
let registerForm = this.registerForm; this.formUser.userType = 'sys_user'
registerForm.userType = "sys_user" registerUser(this.formUser).then(response => {
register(registerForm).then(res => { this.activeType=2;
const username = this.registerForm.username; }).finally(() => {
this.$alert("<font color='red'>恭喜你,您的账号 " + username + " 注册成功!</font>", '系统提示', { this.loadingUser = false;
dangerouslyUseHTMLString: true, });
type: 'success'
}).then(() => {
this.$router.push("/login");
}).catch(() => {});
}).catch(() => {
this.loading = false;
if (this.captchaEnabled) {
this.getCode();
}
})
} }
}); });
} }
@ -166,8 +235,8 @@ export default {
.register-form { .register-form {
border-radius: 6px; border-radius: 6px;
background: #ffffff; background: #ffffff;
width: 400px; width: 800px;
padding: 25px 25px 5px 25px; padding: 30px 30px 50px 30px;
.el-input { .el-input {
height: 38px; height: 38px;
input { input {

Loading…
Cancel
Save