bug修改

This commit is contained in:
bb_pan 2026-01-03 14:19:46 +08:00
parent f817dc2005
commit 01f5b4673b
18 changed files with 102 additions and 760 deletions

View File

@ -62,18 +62,6 @@ export function getPhoneCode(payload) {
})
}
// 注册方法
export function register(data) {
return request({
url: '/auth/register',
headers: {
isToken: false
},
method: 'post',
data: data
})
}
// 刷新方法
export function refreshToken() {
return request({

View File

@ -219,25 +219,49 @@ export default {
isWord(file) {
return /\.(doc|docx)$/i.test(file.name)
},
isValidFileUrl(rawUrl) {
if (!rawUrl || typeof rawUrl !== 'string') return false
try {
const url = new URL(rawUrl, window.location.origin)
// 1
if (!['http:', 'https:'].includes(url.protocol)) {
return false
}
// 2
const pathname = url.pathname.toLowerCase()
return /\.(jpg|jpeg|png|gif|webp|pdf|doc|docx)$/.test(pathname)
} catch (e) {
return false
}
},
//
handlePictureCardPreview(file) {
console.log('🚀 ~ file:', file)
const url = file.url || file.response?.data?.url
const rawUrl = file.url || file.response?.data?.url
// 🚨
if (!this.isValidFileUrl(rawUrl)) {
this.$modal.msgError('非法文件地址')
return
}
const safeUrl = new URL(rawUrl, window.location.origin).toString()
console.log('🚀 ~ safeUrl:', safeUrl)
if (this.isPDF(file)) {
// PDF
window.open(url, '_blank')
window.open(safeUrl, '_blank')
return
}
if (this.isWord(file)) {
// Word
window.location.href = url
window.location.href = safeUrl
return
}
if (!this.isImage(file)) {
window.open(url, '_blank')
window.open(safeUrl, '_blank')
return
}

View File

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

View File

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

View File

@ -70,11 +70,6 @@
<span v-if="!loading"> </span>
<span v-else> 中...</span>
</el-button>
<div style="float: right" v-if="register">
<router-link class="link-type" :to="'/register'"
>立即注册</router-link
>
</div>
</el-form-item>
</el-form>
<!-- 底部 -->

View File

@ -105,15 +105,6 @@
<el-link v-if="config.loginConfig.emailCode || config.loginConfig.phoneCode" @click="toggleLoginMethod">
{{ loginMethod === 'password' ? '短信登录' : '密码登录' }}
</el-link>
<!-- <router-link
v-if="
config.registersConfig.emailRegisters ||
config.registersConfig.phoneRegisters
"
to="/register"
>
<el-link>注册账号</el-link>
</router-link> -->
<!-- <el-checkbox v-model="loginForm.rememberMe">记住密码</el-checkbox> -->
</div>
<el-form-item style="width: 100%">
@ -207,10 +198,6 @@ export default {
phoneCode: false,
emailCode: false
},
registersConfig: {
phoneRegisters: true,
emailRegisters: true
}
}
) // JSON
},

View File

@ -1,263 +0,0 @@
<template>
<div class="register">
<el-form
ref="registerForm"
:model="registerForm"
:rules="registerRules"
class="register-form"
>
<h3 class="title">机械化施工装备管理共享平台</h3>
<el-form-item prop="username">
<el-input
v-model="registerForm.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="registerForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter.native="handleRegister"
>
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="confirmPassword">
<el-input
v-model="registerForm.confirmPassword"
type="password"
auto-complete="off"
placeholder="确认密码"
@keyup.enter.native="handleRegister"
>
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled">
<el-input
v-model="registerForm.code"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
@keyup.enter.native="handleRegister"
>
<svg-icon
slot="prefix"
icon-class="validCode"
class="el-input__icon input-icon"
/>
</el-input>
<div class="register-code">
<img :src="codeUrl" @click="getCode" class="register-code-img" />
</div>
</el-form-item>
<el-form-item style="width: 100%">
<el-button
:loading="loading"
size="medium"
type="primary"
style="width: 100%"
@click.native.prevent="handleRegister"
>
<span v-if="!loading"> </span>
<span v-else> 中...</span>
</el-button>
<div style="float: right">
<router-link class="link-type" :to="'/iws/glweb/login'"
>使用已有账户登录</router-link
>
</div>
</el-form-item>
</el-form>
<!-- 底部 -->
<div class="el-register-footer">
<span>Copyright © 2018-2024 bonus.vip All Rights Reserved.</span>
</div>
</div>
</template>
<script>
import { getCodeImg, register } from "@/api/login";
export default {
name: "Register",
data() {
const equalToPassword = (rule, value, callback) => {
if (this.registerForm.password !== value) {
callback(new Error("两次输入的密码不一致"));
} else {
callback();
}
};
return {
codeUrl: "",
registerForm: {
username: "",
password: "",
confirmPassword: "",
code: "",
uuid: "",
},
registerRules: {
username: [
{ required: true, trigger: "blur", message: "请输入您的账号" },
{
min: 2,
max: 20,
message: "用户账号长度必须介于 2 和 20 之间",
trigger: "blur",
},
],
password: [
{ required: true, trigger: "blur", message: "请输入您的密码" },
{
min: 5,
max: 20,
message: "用户密码长度必须介于 5 和 20 之间",
trigger: "blur",
},
{
pattern: /^[^<>"'|\\]+$/,
message: "不能包含非法字符:< > \" ' \\\ |",
trigger: "blur",
},
],
confirmPassword: [
{ required: true, trigger: "blur", message: "请再次输入您的密码" },
{ required: true, validator: equalToPassword, trigger: "blur" },
],
code: [{ required: true, trigger: "change", message: "请输入验证码" }],
},
loading: false,
captchaEnabled: true,
};
},
created() {
this.getCode();
},
methods: {
getCode() {
getCodeImg().then((res) => {
this.captchaEnabled =
res.captchaEnabled === undefined ? true : res.captchaEnabled;
if (this.captchaEnabled) {
this.codeUrl = "data:image/gif;base64," + res.img;
this.registerForm.uuid = res.uuid;
}
});
},
handleRegister() {
this.$refs.registerForm.validate((valid) => {
if (valid) {
this.loading = true;
register(this.registerForm)
.then((res) => {
const username = this.registerForm.username;
this.$alert(
"<font color='red'>恭喜你,您的账号 " +
username +
" 注册成功!</font>",
"系统提示",
{
dangerouslyUseHTMLString: true,
type: "success",
}
)
.then(() => {
this.$router.push("/login");
})
.catch(() => {});
})
.catch(() => {
this.loading = false;
if (this.captchaEnabled) {
this.getCode();
}
});
}
});
},
},
};
</script>
<style rel="stylesheet/scss" lang="scss">
.register {
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;
}
.register-form {
border-radius: 6px;
background: #ffffff;
width: 400px;
padding: 25px 25px 5px 25px;
.el-input {
height: 38px;
input {
height: 38px;
}
}
.input-icon {
height: 39px;
width: 14px;
margin-left: 2px;
}
}
.register-tip {
font-size: 13px;
text-align: center;
color: #bfbfbf;
}
.register-code {
width: 33%;
height: 38px;
float: right;
img {
cursor: pointer;
vertical-align: middle;
}
}
.el-register-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;
}
.register-code-img {
height: 38px;
}
</style>

View File

@ -1,409 +0,0 @@
<template>
<div class="container">
<div class="register">
<el-form
ref="registerForm"
:model="registerForm"
:rules="registerRules"
class="register-form"
>
<h3 class="title">机械化施工装备管理共享平台</h3>
<el-form-item prop="nickName">
<el-input
v-model="registerForm.nickName"
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="mobile">
<el-input
v-model="registerForm.mobile"
type="text"
auto-complete="off"
:placeholder="`请输入${
config.registersConfig.phoneRegisters ? '手机号' : ''
}${config.registersConfig.emailRegisters ? '/邮箱' : ''}`"
>
<svg-icon
slot="prefix"
icon-class="phone"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="registerForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter.native="handleRegister"
show-password
>
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="confirmPassword">
<el-input
v-model="registerForm.confirmPassword"
type="password"
auto-complete="off"
placeholder="确认密码"
@keyup.enter.native="handleRegister"
show-password
>
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled">
<el-input
v-model="registerForm.code"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
@keyup.enter.native="handleRegister"
>
<svg-icon
slot="prefix"
icon-class="validCode"
class="el-input__icon input-icon"
/>
</el-input>
<div class="register-code">
<img :src="codeUrl" @click="getCode" class="register-code-img" />
</div>
</el-form-item>
<el-form-item
v-show="config.registersConfig.verificationCode"
prop="verificationCode"
>
<el-input
v-model="registerForm.verificationCode"
:readonly="!isSendingCode"
placeholder="请输入验证码"
>
<template slot="append">
<el-button
type="primary"
@click="sendCode"
:disabled="
isSendingCode || captchaEnabled ? !registerForm.code : false
"
class="send-code-button"
>
{{ isSendingCode ? `${countdown}s` : "获取验证码" }}
</el-button>
</template>
<svg-icon
slot="prefix"
icon-class="message"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item style="width: 100%">
<el-button
:loading="loading"
size="medium"
type="primary"
style="width: 100%"
@click.native.prevent="handleRegister"
>
<span v-if="!loading"> </span>
<span v-else> 中...</span>
</el-button>
<div style="float: right">
<router-link class="link-type" :to="'/login'"
>使用已有账户登录</router-link
>
</div>
</el-form-item>
</el-form>
<!-- 底部 -->
<div class="el-register-footer">
<span>Copyright © 2018-2024 bonus.vip All Rights Reserved.</span>
</div>
</div>
</div>
</template>
<script>
import { getCodeImg, register } from "@/api/login";
import { validateNewPassword } from "@/utils/validate";
import { decryptCBC } from "@/utils/aescbc";
export default {
name: "Register",
computed: {
LOGIN() {
return LOGIN;
},
config() {
return (
JSON.parse(localStorage.getItem("systemConfig")) || {
registersConfig: {
phoneRegisters: true,
emailRegisters: true,
verificationCode: true,
},
}
); // JSON
},
},
data() {
//
const validateNickName = (rule, value, callback) => {
const regex = /^[\u4e00-\u9fa5]{2,4}$/;
if (!value) {
callback(new Error("请输入姓名"));
} else if (!regex.test(value)) {
callback(new Error("名字必须是2到4个汉字"));
} else {
callback();
}
};
//
const equalToPassword = (rule, value, callback) => {
if (this.registerForm.password !== value) {
callback(new Error("两次输入的密码不一致"));
} else {
callback();
}
};
return {
codeUrl: "",
isSendingCode: false,
countdown: 0,
registerForm: {
username: "",
password: "",
confirmPassword: "",
verificationCode: "",
mobile: "",
nickName: "",
code: "",
uuid: "",
phoneUuid: "",
mobileCodeType: "REGISTER",
},
registerRules: {
nickName: [
{ required: true, trigger: "blur", validator: validateNickName },
],
mobile: [
{ required: true, message: "请输入手机号/邮箱", trigger: "blur" },
{ validator: this.validateContact, trigger: "blur" },
],
password: [
{ required: true, trigger: "blur", message: "请输入您的密码" },
{ validator: validateNewPassword, trigger: "blur" },
],
confirmPassword: [
{ required: true, trigger: "blur", message: "请再次输入您的密码" },
{ required: true, validator: equalToPassword, trigger: "blur" },
],
code: [{ required: true, trigger: "change", message: "请输入验证码" }],
},
loading: false,
captchaEnabled: true,
};
},
created() {
this.getCode();
},
methods: {
//
getCode() {
getCodeImg().then((res) => {
this.captchaEnabled =
res.captchaEnabled === undefined ? true : res.captchaEnabled;
if (this.captchaEnabled) {
this.codeUrl = "data:image/gif;base64," + res.img;
this.registerForm.uuid = res.uuid;
}
});
},
//
handleRegister() {
this.$refs.registerForm.validate((valid) => {
if (valid) {
this.loading = true;
register(this.registerForm)
.then((res) => {
const username = this.registerForm.username;
this.$alert(
`<font color="red">恭喜你,您的账号 ${username} 注册成功!</font>`,
"系统提示",
{
dangerouslyUseHTMLString: true,
type: "success",
}
)
.then(() => {
this.$router.push("/login");
})
.catch(() => {});
})
.catch(() => {
this.loading = false;
if (this.captchaEnabled) {
this.getCode();
}
});
}
});
},
//
sendCode() {
if (!this.registerForm.mobile) {
this.$message.error("请先填写手机号");
return;
}
this.$store
.dispatch("GetPhoneCode", this.registerForm)
.then((res) => {
console.log(res);
this.isSendingCode = true;
this.countdown = 60;
const timer = setInterval(() => {
this.countdown -= 1;
if (this.countdown <= 0) {
clearInterval(timer);
}
}, 1000);
})
.catch(() => {
this.loading = false;
if (this.captchaEnabled) {
this.getCode();
}
this.isSendingCode = false;
this.countdown = 0;
});
},
//
validateContact(rule, value, callback) {
const phoneRegex = /^1[3-9]\d{9}$/;
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
if (!value) {
return callback(new Error("请输入电子邮件或电话号码"));
}
if (!phoneRegex.test(value) && !emailRegex.test(value)) {
return callback(new Error("必须是有效的电子邮件或电话号码"));
}
callback();
},
},
};
</script>
<style rel="stylesheet/scss" lang="scss">
.container {
display: flex;
justify-content: flex-end;
align-items: center;
height: 100%;
background-image: url("../assets/images/bg.png");
background-size: cover;
}
.register {
width: 42%;
display: flex;
justify-content: center;
align-items: center;
height: 100%;
}
.title {
margin: 0px auto 30px auto;
text-align: center;
color: #707070;
}
.register-form {
border-radius: 6px;
background: #ffffff;
width: 400px;
padding: 25px 25px 5px 25px;
.el-input {
height: 38px;
input {
height: 38px;
}
}
.input-icon {
height: 39px;
width: 14px;
margin-left: 2px;
}
}
.register-tip {
font-size: 13px;
text-align: center;
color: #bfbfbf;
}
.register-code {
width: 33%;
height: 38px;
float: right;
img {
cursor: pointer;
vertical-align: middle;
}
}
.el-register-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;
}
.register-code-img {
height: 38px;
}
</style>

View File

@ -44,7 +44,7 @@ export default {
//
const categories = ['2020', '2021', '2022', '2023', '2024', '2025']
const data = Array.from({ length: 6 }, () => Math.floor(Math.random() * 1000 + 500))
const data = [520, 680, 750, 820, 910, 1050]
const option = {
tooltip: {

View File

@ -8,8 +8,9 @@ export default {
return {}
},
mounted() {
const url = process.env.VUE_APP_BASE_API == '/iws/jiju-api' ? 'iws/glweb/#' : ''
//
window.open('iws/glweb/#/screen/cityScreen', '_blank')
window.open(`${url}/screen/cityScreen`, '_blank')
//
this.$tab.closePage()
},

View File

@ -8,8 +8,9 @@ export default {
return {}
},
mounted() {
const url = process.env.VUE_APP_BASE_API == '/iws/jiju-api' ? 'iws/glweb/#' : ''
//
window.open('iws/glweb/#/screen/cityWidescreen', '_blank')
window.open(`${url}/screen/cityWidescreen`, '_blank')
//
this.$tab.closePage()
},

View File

@ -8,8 +8,9 @@ export default {
return {}
},
mounted() {
const url = process.env.VUE_APP_BASE_API == '/iws/jiju-api' ? 'iws/glweb/#' : ''
//
window.open('iws/glweb/#/screen/gwScreen', '_blank')
window.open(`${url}/screen/gwScreen`, '_blank')
//
this.$tab.closePage()
},

View File

@ -8,8 +8,9 @@ export default {
return {}
},
mounted() {
const url = process.env.VUE_APP_BASE_API == '/iws/jiju-api' ? 'iws/glweb/#' : ''
//
window.open('iws/glweb/#/screen/wsScreenWidescreen', '_blank')
window.open(`${url}/screen/wsScreenWidescreen`, '_blank')
//
this.$tab.closePage()
},

View File

@ -8,8 +8,9 @@ export default {
return {}
},
mounted() {
const url = process.env.VUE_APP_BASE_API == '/iws/jiju-api' ? 'iws/glweb/#' : ''
//
window.open('iws/glweb/#/screen/shareScreen', '_blank')
window.open(`${url}/screen/shareScreen`, '_blank')
//
this.$tab.closePage()
},

View File

@ -8,8 +8,9 @@ export default {
return {}
},
mounted() {
const url = process.env.VUE_APP_BASE_API == '/iws/jiju-api' ? 'iws/glweb/#' : ''
//
window.open('iws/glweb/#/screen/wsScreen', '_blank')
window.open(`${url}/screen/wsScreen`, '_blank')
//
this.$tab.closePage()
},

View File

@ -44,7 +44,7 @@ export default {
//
const categories = ['2020', '2021', '2022', '2023', '2024', '2025']
const data = Array.from({ length: 6 }, () => Math.floor(Math.random() * 1000 + 500))
const data = [520, 680, 750, 820, 910, 1050]
const option = {
tooltip: {

View File

@ -44,7 +44,7 @@ export default {
//
const categories = ['2020', '2021', '2022', '2023', '2024', '2025']
const data = Array.from({ length: 6 }, () => Math.floor(Math.random() * 1000 + 500))
const data = [520, 680, 750, 820, 910, 1050]
const option = {
tooltip: {

View File

@ -695,30 +695,31 @@ export default {
})
},
confirmPassword(row) {
this.$prompt('请输入密码,鉴别用户', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
closeOnClickModal: false,
inputPattern: /^.{8,16}$/,
inputErrorMessage: '用户密码长度必须介于 8 和 16 之间',
inputValidator: (value) => {
// validateNewPassword
const errorMessage = function (error) {
if (error) {
return error.message;
} else {
console.log('验证通过');
}
};
validateNewPassword(null, value, errorMessage);
}
}).then(({value}) => {
confirmPassword(value).then(response => {
this.$modal.msgSuccess('验证成功')
this.handleUpdate(row)
})
}).catch(() => {
})
this.handleUpdate(row)
// this.$prompt(',', '', {
// confirmButtonText: '',
// cancelButtonText: '',
// closeOnClickModal: false,
// inputPattern: /^.{8,16}$/,
// inputErrorMessage: ' 8 16 ',
// inputValidator: (value) => {
// // validateNewPassword
// const errorMessage = function (error) {
// if (error) {
// return error.message;
// } else {
// console.log('');
// }
// };
// validateNewPassword(null, value, errorMessage);
// }
// }).then(({value}) => {
// confirmPassword(value).then(response => {
// this.$modal.msgSuccess('')
// this.handleUpdate(row)
// })
// }).catch(() => {
// })
},
confirmResetPwd(row) {
this.$prompt('请输入密码,鉴别用户', '提示', {
@ -752,25 +753,43 @@ export default {
confirmButtonText: '确定',
cancelButtonText: '取消',
closeOnClickModal: false,
inputPattern: /^.{8,16}$/,
inputErrorMessage: '用户密码长度必须介于 8 和 16 之间',
inputValidator: (value) => {
// validateNewPassword
const errorMessage = function (error) {
// 1
if (!value || value.trim() === '') {
return '密码不能为空'
}
// 2
if (/\s/.test(value)) {
return '密码不能包含空格'
}
// 3
if (value.length < 8 || value.length > 16) {
return '用户密码长度必须介于 8 和 16 之间'
}
// 4
let errorMsg = ''
validateNewPassword(null, value, (error) => {
if (error) {
return error.message;
} else {
console.log('验证通过');
errorMsg = error.message
}
};
validateNewPassword(null, value, errorMessage);
})
if (errorMsg) {
return errorMsg
}
return true
}
}).then(({value}) => {
resetUserPwd(row.userId, value).then(response => {
})
.then(({ value }) => {
resetUserPwd(row.userId, value).then(() => {
this.$modal.msgSuccess('修改成功,新密码是:' + value)
})
}).catch(() => {
})
.catch(() => {})
},
/** 分配角色操作 */
handleAuthRole: function (row) {