From 515a265a809d0c12fb5cbff39cb743f391938a41 Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: Thu, 30 Nov 2023 08:49:34 +0800
Subject: [PATCH] 新增
---
src/layout/components/Register/index.vue | 616 +++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 505 insertions(+), 111 deletions(-)
diff --git a/src/layout/components/Register/index.vue b/src/layout/components/Register/index.vue
index 42bfc31..a7eae8c 100644
--- a/src/layout/components/Register/index.vue
+++ b/src/layout/components/Register/index.vue
@@ -1,97 +1,348 @@
<template>
- <el-dialog v-model="dialogVisible" title="注册用户" width="30%" :append-to-body="true" top="50vh" custom-class="regForm">
- <el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form">
- <el-form-item prop="username">
- <el-input
- v-model="registerForm.username"
- type="text"
- size="large"
- auto-complete="off"
- placeholder="账号"
- >
- <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
- </el-input>
- </el-form-item>
- <el-form-item prop="password">
- <el-input
- v-model="registerForm.password"
- type="password"
- size="large"
- auto-complete="off"
- placeholder="密码"
- @keyup.enter="handleRegister"
- >
- <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
- </el-input>
- </el-form-item>
- <el-form-item prop="confirmPassword">
- <el-input
- v-model="registerForm.confirmPassword"
- type="password"
- size="large"
- auto-complete="off"
- placeholder="确认密码"
- @keyup.enter="handleRegister"
- >
- <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
- </el-input>
- </el-form-item>
- <el-form-item prop="code" v-if="captchaEnabled">
- <el-input
- size="large"
- v-model="registerForm.code"
- auto-complete="off"
- placeholder="验证码"
- style="width: 63%"
- @keyup.enter="handleRegister"
- >
- <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
- </el-input>
- <div class="register-code">
- <img :src="codeUrl" @click="getCode" class="register-code-img"/>
- </div>
- </el-form-item>
+ <el-dialog v-model="dialogVisible" width="75%" top="50vh" align-center @close="closeDialog">
+ <template #header>
+ <div style="display:flex;font-size: 1.2rem;font-weight: bolder">
+ 机构注册
+ <div style="font-size: 0.9rem;display:flex;align-items: center;font-weight: normal;margin-left: 6px"><Warning style="color:#EF4444;width: 0.9rem; height: 0.9rem;margin-right: 2px" />请认真填写注册信息,带 <span style="color:#EF4444;vertical-align: middle">*</span> 为必填项</div>
+ </div>
+ </template>
+ <el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form" label-position="top">
+ <el-row :gutter="30">
+ <el-col :span="8">
+ <el-form-item prop="agency.name" label="机构名称">
+ <el-input
+ v-model="registerForm.agency.name"
+ size="large"
+ placeholder="请输入机构名称"
+ >
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item prop="agency.creditCode" label="社会信用代码">
+ <el-input
+ v-model="registerForm.agency.creditCode"
+ size="large"
+ placeholder="请输入社会信用代码"
+ >
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item prop="agency.attribute" label="机构属性">
+ <el-radio-group v-model="registerForm.agency.attribute" style="width: 50%" @change="changeAttr()">
+ <el-radio :label="0" size="large">疆内</el-radio>
+ <el-radio :label="1" size="large">疆外</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item prop="agency.area" label="实际经营地址所属区域">
+ <el-cascader
+ v-model="registerForm.agency.area"
+ :options="state.areaList"
+ :props="props"
+ @change="handleChange"
+ style="width: 100%"
+ size="large"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item prop="agency.address" label="实际经营地址">
+ <el-input
+ v-model="registerForm.agency.address"
+ size="large"
+ placeholder="请输入实际经营地址"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item prop="agency.legalPerson" label="法定代表人">
+ <el-input
+ v-model="registerForm.agency.legalPerson"
+ size="large"
+ placeholder="请输入法定代表人"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item prop="agency.legalPhone" label="法人电话">
+ <el-input
+ v-model="registerForm.agency.legalPhone"
+ size="large"
+ placeholder="请输入法人电话"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item prop="agency.manager" label="机构负责人">
+ <el-input
+ v-model="registerForm.agency.manager"
+ size="large"
+ placeholder="请输入机构负责人"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item prop="agency.managerPhone" label="负责人电话">
+ <el-input
+ v-model="registerForm.agency.managerPhone"
+ size="large"
+ placeholder="请输入负责人电话"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="8">
+ <el-form-item prop="agency.certNumber" label="资质证书编号">
+ <el-input
+ v-model="registerForm.agency.certNumber"
+ size="large"
+ placeholder="请输入机构负责人"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item prop="agency.issueDate" label="发证日期">
+ <el-date-picker
+ v-model="registerForm.agency.issueDate"
+ type="date"
+ placeholder="请选择发证日期"
+ value-format="YYYY-MM-DD 00:00:00"
+ size="large"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item prop="agency.validDate" label="有效日期">
+ <el-date-picker
+ v-model="registerForm.agency.validDate"
+ type="date"
+ placeholder="请选择有效日期"
+ value-format="YYYY-MM-DD 00:00:00"
+ size="large"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="8">
+ <el-form-item prop="agency.assetValue" label="固定资产总值">
+ <el-input
+ v-model="registerForm.agency.assetValue"
+ type="number"
+ size="large"
+ placeholder="请输入固定资产总值"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item prop="agency.workArea" label="工作场所建筑面积">
+ <el-input
+ type="number"
+ v-model="registerForm.agency.workArea"
+ size="large"
+ placeholder="请输入工作场所建筑面积"
+ ><template #append>㎡</template></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item prop="agency.archiveArea" label="档案室面积">
+ <el-input
+ type="number"
+ v-model="registerForm.agency.archiveArea"
+ size="large"
+ placeholder="请输入档案室面积"
+ ><template #append>㎡</template></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="8">
+ <el-form-item prop="agency.regAddress" label="注册地址">
+ <el-input
+ v-model="registerForm.agency.regAddress"
+ size="large"
+ placeholder="请输入注册地址"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item prop="agency.business" label="申请的法定安全评价业务范围">
+ <el-select v-model="registerForm.agency.business" placeholder="请选择业务范围" size="large" style="width: 100%">
+ <el-option
+ v-for="item in state.busList"
+ :key="item.id"
+ :label="item.label"
+ :value="item.label"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="8">
+ <el-form-item prop="agency.reportPath" label="加盖公章的《机构信息上报表》">
+ <!-- <el-upload-->
+ <!-- v-model:file-list="state.fileList"-->
+ <!-- class="upload-demo"-->
+ <!-- action=""-->
+ <!-- multiple-->
+ <!-- :on-preview="handlePreview"-->
+ <!-- :on-remove="handleRemove"-->
+ <!-- :before-remove="beforeRemove"-->
+ <!-- :limit="3"-->
+ <!-- :on-exceed="handleExceed"-->
+ <!-- >-->
+ <!-- <el-button type="primary">点击上传</el-button>-->
+ <!-- <template #tip>-->
+ <!-- <div class="el-upload__tip">-->
+ <!-- 上传文件大小不超过2M-->
+ <!-- </div>-->
+ <!-- </template>-->
+ <!-- </el-upload>-->
+ <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='state.imgLimit' v-model:file-list="state.fileList" list-type="picture-card" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove">
+ <el-icon><Plus /></el-icon>
+ <template #tip>
+ <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div>
+ </template>
+ </el-upload>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item prop="username" label="登录用户名(字母+数字,长度在5-16之间)">
+ <el-input
+ v-model="registerForm.username"
+ size="large"
+ placeholder="请输入登录用户名"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item prop="phone" label="用户电话">
+ <el-input
+ v-model="registerForm.phone"
+ size="large"
+ placeholder="请输入用户电话"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item prop="password" label="密码">
+ <el-input
+ v-model="registerForm.password"
+ type="password"
+ size="large"
+ placeholder="请输入密码"
+ show-password
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item prop="confirmPassword" label="确认密码">
+ <el-input
+ v-model="registerForm.confirmPassword"
+ type="password"
+ size="large"
+ auto-complete="off"
+ placeholder="确认密码"
+ show-password
+ >
+ </el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
<el-form-item style="width:100%;">
<el-button
:loading="loading"
size="large"
type="primary"
- style="width:100%;"
+ style="width:40%;margin: 0 auto"
@click.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>
+ <el-dialog v-model="state.dialogImg">
+ <el-image style="width: 100%; height: 100%" :src="state.dialogImageUrl"/>
+ </el-dialog>
</el-dialog>
- <!-- 底部 -->
-<!-- <div class="el-Register-footer">-->
-<!-- <span>Copyright © 2018-2023 ruoyi.vip All Rights Reserved.</span>-->
-<!-- </div>-->
</template>
<script setup>
-import {ref, watch, defineExpose, onMounted} from "vue"
-import { ElMessageBox } from "element-plus";
-import { getCodeImg, register } from "@/api/login";
+import {ref, watch, defineExpose, onMounted, reactive} from "vue"
+import {ElMessage, ElMessageBox} from "element-plus"
+import { register,delPic,getDict } from "@/api/login"
+import { getRegionTree } from "@/api/area"
+import { getToken } from "@/utils/auth";
+import {verifyPhone, verifyUsername, verifyPwd} from "../../../utils/validate";
+let { proxy } = getCurrentInstance()
+import { Base64 } from 'js-base64'
+const registerForm = ref({
+ agency:{
+ name: "",
+ creditCode: "",
+ attribute: 0,
+ area: [],
+ province: '',
+ city: '',
+ district: '',
+ address: '',
+ legalPerson: '',
+ legalPhone: '',
+ manager: '',
+ managerPhone: '',
+ certNumber: '',
+ issueDate: '',
+ validDate: '',
+ assetValue: '',
+ workArea: '',
+ archiveArea: '',
+ regAddress: '',
+ business: '',
+ reportPath: '',
+ },
+ username: '',
+ phone: '',
+ password: '',
+ confirmPassword: ''
+});
-const router = useRouter();
-const { proxy } = getCurrentInstance();
-const test=()=>{
- dialogVisible.value = false
+const props = {
+ expandTrigger: 'hover',
+ value: 'name',
+ label: 'name'
}
-const registerForm = ref({
- username: "",
- password: "",
- confirmPassword: "",
- code: "",
- uuid: ""
-});
+const state = reactive({
+ areaList: [],
+ busList: [],
+ fileList: [],
+ imgLimit: 1,
+ uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+ header: {
+ Authorization: 'Bearer ' + getToken()
+ },
+ dialogImageUrl: '',
+ dialogImg: false
+})
+
const equalToPassword = (rule, value, callback) => {
if (registerForm.value.password !== value) {
@@ -101,65 +352,205 @@
}
};
+const validatePhone = (rule, value, callback)=>{
+ if(value === ''){
+ callback(new Error('请输入手机号'))
+ }else{
+ if(!verifyPhone(value)){
+ callback(new Error('手机号格式有误'))
+ }else{
+ callback()
+ }
+ }
+}
+
+const validateUsername = (rule, value, callback)=>{
+ if(value === ''){
+ callback(new Error('请输入登录时用户名'))
+ }else{
+ if(!verifyUsername(value)){
+ callback(new Error('用户名须使用字母+数字,长度在5-16之间'))
+ }else{
+ callback()
+ }
+ }
+}
+
+let validatePwd = (rule, value, callback)=>{
+ if(value === ''){
+ callback(new Error('请输入密码'))
+ }else{
+ if(!verifyPwd(value)){
+ callback(new Error('密码须包含字母、数字、特殊字符(不包括下划线),长度在6-16之间'))
+ }else{
+ callback()
+ }
+ }
+}
+
const 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" }
- ],
+ "agency.name": [{required: true, trigger: "blur", message: "请输入机构名称"}],
+ "agency.creditCode": [{required: true, trigger: "blur", message: "请输入社会信用代码"}],
+ "agency.attribute": [{required: true, trigger: "blur", message: "请选择机构属性"}],
+ "agency.area": [{required: true, trigger: "blur", message: "请选择实际经营地址所属区域"}],
+ "agency.address": [{required: true, trigger: "blur", message: "请输入实际经营地址"}],
+ "agency.legalPerson": [{required: true, trigger: "blur", message: "请输入法定代表人"}],
+ "agency.legalPhone": [{required: true, trigger: "blur", validator: validatePhone}],
+ "agency.manager": [{required: true, trigger: "blur", message: "请输入机构负责人"}],
+ "agency.managerPhone": [{required: true, trigger: "blur", validator: validatePhone}],
+ "agency.certNumber": [{required: true, trigger: "blur", message: "请输入资质证书编号"}],
+ "agency.issueDate": [{required: true, trigger: "blur", message: "请选择发证日期"}],
+ "agency.validDate": [{required: true, trigger: "blur", message: "请选择有效日期"}],
+ "agency.assetValue": [{required: true, trigger: "blur", message: "请输入固定资产总值"}],
+ "agency.workArea": [{required: true, trigger: "blur", message: "请输入工作场所建筑面积"}],
+ "agency.archiveArea": [{required: true, trigger: "blur", message: "请输入档案室面积"}],
+ "agency.regAddress": [{required: true, trigger: "blur", message: "请输入注册地址"}],
+ "agency.business": [{required: true, trigger: "blur", message: "请选择申请的法定安全评价业务范围"}],
+ "agency.reportPath": [{required: true, trigger: "blur", message: "请上传加盖公章的《机构信息上报表》"}],
+ username: [{ required: true, trigger: "blur", validator: validateUsername }],
+ phone: [{ required: true, trigger: "blur", validator: validatePhone }],
+ password: [{ required: true, trigger: "blur", validator: validatePwd }],
confirmPassword: [
- { required: true, trigger: "blur", message: "请再次输入您的密码" },
+ { required: true, trigger: "blur", message: "请再次确认密码" },
{ required: true, validator: equalToPassword, trigger: "blur" }
- ],
- code: [{ required: true, trigger: "change", message: "请输入验证码" }]
+ ]
};
-const codeUrl = ref("");
-const loading = ref(false);
-const captchaEnabled = ref(true);
+const loading = ref(false)
const dialogVisible = ref(false)
+const registerRef = ref(null)
+
onMounted(()=>{
- getCode();
+ getBusiness()
+ getArea()
})
+
+const handleChange = (value) => {
+ if(registerForm.value.agency.attribute == 0){
+ registerForm.value.agency.province = '新疆维吾尔自治区'
+ registerForm.value.agency.city = value[0]?value[0]:''
+ registerForm.value.agency.district = value[1]?value[1]:''
+ }else{
+ registerForm.value.agency.province = value[0]?value[0]:''
+ registerForm.value.agency.city = value[1]?value[1]:''
+ registerForm.value.agency.district = value[2]?value[2]:''
+ }
+}
+
+const getBusiness = async ()=>{
+ const res = await getDict({dictType: 'sys_business_scope'})
+ if(res.code == 200){
+ state.busList = res.data
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+
+const getArea = async ()=>{
+ const type = registerForm.value.agency.attribute
+ const res = await getRegionTree({name: '',parentId: null,regionType: type})
+ if(res.code == 200){
+ state.areaList = res.data
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+
+const changeAttr=()=>{
+ getArea()
+}
+
+// 图片上传
+const showTip =()=>{
+ ElMessage({
+ type: 'warning',
+ message: '超出文件上传数量'
+ });
+}
+
+const picSize = async (rawFile) => {
+ if(rawFile.size / 1024 / 1024 > 5){
+ ElMessage({
+ type: 'warning',
+ message: '文件大小不能超过5M'
+ });
+ return false
+ }
+};
+
+const handlePictureCardPreview = (uploadFile) => {
+ state.dialogImageUrl = uploadFile.url
+ state.dialogImg = true
+};
+
+
+const handleAvatarSuccess = (res, uploadFile) => {
+ if(res.code == 200){
+ registerForm.value.agency.reportPath = res.data.path
+ }else{
+ ElMessage({
+ type: 'warning',
+ message: '文件上传失败'
+ })
+ }
+}
+
+const handleRemove = async (file, uploadFiles) => {
+ const res = await delPic({path: registerForm.value.agency.reportPath})
+ if(res.code == 200){
+ ElMessage({
+ type: 'success',
+ message: '文件已删除'
+ })
+ }else{
+ ElMessage({
+ type: 'warning',
+ message: res.message
+ })
+ }
+}
function handleRegister() {
proxy.$refs.registerRef.validate(valid => {
if (valid) {
loading.value = true;
- register(registerForm.value).then(res => {
- const username = registerForm.value.username;
- ElMessageBox.alert("<font color='red'>恭喜你,您的账号 " + username + " 注册成功!</font>", "系统提示", {
- dangerouslyUseHTMLString: true,
- type: "success",
- }).then(() => {
- router.push("/homePage");
- }).catch(() => {});
- }).catch(() => {
- loading.value = false;
- if (captchaEnabled) {
- getCode();
+ const {confirmPassword, ...data} = registerForm.value
+ data.password = Base64.encode(data.password)
+ delete data.agency.area
+ register(data).then(res => {
+ if(res.code == 200){
+ const username = registerForm.value.username
+ ElMessageBox.alert("<font color='red'>恭喜,您的账号 " + username + " 注册成功!</font>", "系统提示", {
+ dangerouslyUseHTMLString: true,
+ type: "success",
+ }).then(() => {
+ dialogVisible.value = false
+ proxy.$refs.registerRef.resetFields()
+ proxy.$refs.registerRef.clearValidate()
+ state.fileList = []
+ // router.push("/homePage")
+ }).catch(() => {})
+ }else{
+ ElMessage({
+ type: 'warning',
+ message: res.message
+ })
}
- });
+ }).catch(() => {
+ loading.value = false
+ })
}
});
}
-function getCode() {
- getCodeImg().then(res => {
- captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled;
- if (captchaEnabled.value) {
- codeUrl.value = "data:image/gif;base64," + res.img;
- registerForm.value.uuid = res.uuid;
- }
- });
+const closeDialog = ()=>{
+ proxy.$refs.registerRef.resetFields()
+ proxy.$refs.registerRef.clearValidate()
+ state.fileList = []
}
defineExpose({
dialogVisible,
- test
})
</script>
@@ -183,6 +574,9 @@
width: 14px;
margin-left: 0px;
}
+ .el-radio-group{
+ width: 200px !important;
+ }
}
.register-tip {
font-size: 13px;
--
Gitblit v1.9.2