对接注册 忘记密码接口

This commit is contained in:
wangchengming 2025-07-03 18:02:47 +08:00
parent 9e96ecddcf
commit 6cfeb735d5
3 changed files with 207 additions and 113 deletions

View File

@ -44,6 +44,19 @@ export function delUser(userId) {
})
}
// 忘记密码重置
export function resetPwd(userId, password) {
const data = {
userId,
password
}
return request({
url: '/system/user/resetPwd',
method: 'put',
data: data
})
}
// 用户密码重置
export function resetUserPwd(userId, password) {
const data = {

View File

@ -15,99 +15,109 @@
</template>
<el-form ref="registerRef" :model="registerForm" :rules="registerRules" label-width="100"
label-position="left">
<el-form-item label="工号:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
</el-form-item>
<el-form-item label="邮箱:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="工号:" prop="workNo">
<el-input v-model="registerForm.workNo"> </el-input>
</el-form-item>
<el-form-item label="属地:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="邮箱:" prop="email">
<el-input v-model="registerForm.email"> </el-input>
</el-form-item>
<el-form-item label="属地ESC:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="属地:" prop="dependencyId">
<el-select v-model="registerForm.dependencyId" filterable placeholder="请选择属地" @change="selectChanged">
<el-option v-for="item in busDependencyData" :key="item.id" :label="item.dependencyName"
:value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="ESC邮箱:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="属地ESC:" prop="escUserName">
<el-input v-model="registerForm.escUserName"> </el-input>
</el-form-item>
<el-form-item label="ESC邮箱:" prop="escEmail">
<el-input v-model="registerForm.escEmail"> </el-input>
</el-form-item>
<el-form-item label="新密码:" prop="password">
<el-input v-model="registerForm.password" type="password" auto-complete="off"> </el-input>
</el-form-item>
<el-form-item label="新密码:" prop="code">
<el-input v-model="registerForm.code" type="password" auto-complete="off"> </el-input>
</el-form-item>
<el-form-item label="确认密码:" prop="code">
<el-input v-model="registerForm.code" type="password" auto-complete="off"> </el-input>
</el-form-item>
</el-form>
</el-card>
</div>
<div class="el-register-footer">
<el-button class="submitApplyBtn">提交</el-button>
<el-button class="submitApplyBtn" @click="handleRegister">提交</el-button>
</div>
</el-main>
</el-container>
</template>
<script setup>
import { onMounted, ref } from 'vue'
import { ElMessageBox } from "element-plus"
import { getCodeImg, register } from "@/api/login"
import systemlogo from '@/assets/logo/systemLogo.png'
import { resetPwd } from "@/api/system/user"
import { getBusDependencyPage } from "@/api/system/dependency"
const router = useRouter()
const { proxy } = getCurrentInstance()
const registerForm = ref({
username: "",
password: "",
confirmPassword: "",
code: "",
uuid: ""
workNo: null,
email: null,
dependencyId: null,
escUserName: null,
escEmail: null,
password: null
})
const equalToPassword = (rule, value, callback) => {
if (registerForm.value.password !== value) {
callback(new Error("两次输入的密码不一致"))
} else {
callback()
const registerRules = {
workNo: [{ required: true, message: "工号不能为空", trigger: "blur" }],
password: [{ required: true, message: "新密码不能为空", trigger: "blur" }, { min: 5, max: 20, message: "登录密码长度必须介于 5 和 20 之间", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }],
email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
deptId: [{ required: true, message: "请选择归属部门", trigger: ["change"] }],
sectionId: [{ required: true, message: "请选择科室", trigger: ["change"] }],
dependencyId: [{ required: true, message: "请选择属地", trigger: ["change"] }],
escEmail: [{ required: true, type: "email", message: "ESC邮箱不能为空", trigger: ["blur", "change"] }],
}
const loading = ref(false)
//
const selectChanged = (value) => {
if (value) {
const curDependency = busDependencyData.value.find(item => item.id == value)
registerForm.value.escUserName = curDependency.escUserName
registerForm.value.escEmail = curDependency.escEmail
}
}
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" },
{ pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }
],
confirmPassword: [
{ required: true, trigger: "blur", message: "请再次输入您的密码" },
{ required: true, validator: equalToPassword, trigger: "blur" }
],
code: [{ required: true, trigger: "change", message: "请输入验证码" }]
//
onMounted(() => {
getBusDependencyData();
});
//
const busDependencyData = ref([])
//
const getBusDependencyData = () => {
getBusDependencyPage({
pageIndex: 1,
pageSize: 100,
}).then(response => {
if (response.code == 200) {
busDependencyData.value = response.data.list
}
})
}
const codeUrl = ref("")
const loading = ref(false)
const captchaEnabled = ref(true)
function handleRegister() {
const 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>", "系统提示", {
resetPwd(registerForm.value).then(res => {
ElMessageBox.alert("<font color='red'>恭喜你,您的密码重置成功!</font>", "系统提示", {
dangerouslyUseHTMLString: true,
type: "success",
}).then(() => {
router.push("/login")
}).catch(() => { })
}).catch(() => {
loading.value = false
if (captchaEnabled) {
getCode()
}
loading.value = false
})
}
})

View File

@ -15,111 +15,182 @@
</template>
<el-form ref="registerRef" :model="registerForm" :rules="registerRules" label-width="100"
label-position="left">
<el-form-item label="工号:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="工号:" prop="workNo">
<el-input v-model="registerForm.workNo" placeholder="请输入员工工号" @input="handleInput" />
</el-form-item>
<el-form-item label="账号:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="账号:" prop="username">
<el-input v-model="registerForm.username"> </el-input>
</el-form-item>
<el-form-item label="密码:" prop="code">
<el-input v-model="registerForm.code" type="password" auto-complete="off"> </el-input>
<el-form-item label="密码:" prop="password">
<el-input v-model="registerForm.password" type="password" auto-complete="off"> </el-input>
</el-form-item>
<el-form-item label="邮箱:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="邮箱:" prop="email">
<el-input v-model="registerForm.email"> </el-input>
</el-form-item>
<el-form-item label="中文姓名:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="中文姓名:" prop="nickName">
<el-input v-model="registerForm.nickName"> </el-input>
</el-form-item>
<el-form-item label="英文姓名:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="英文姓名:" prop="englishName">
<el-input v-model="registerForm.englishName"> </el-input>
</el-form-item>
<el-form-item label="部门:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="部门:" prop="deptId">
<el-tree-select v-model="registerForm.deptId" :data="enabledDeptOptions"
:props="{ value: 'id', label: 'label', children: 'children' }" value-key="id" placeholder="请选择部门"
check-strictly />
</el-form-item>
<el-form-item label="科室:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="科室:" prop="sectionId">
<el-select v-model="registerForm.sectionId" filterable placeholder="请选择科室">
<el-option v-for="item in sectionData" :key="item.sectionId" :label="item.sectionName"
:value="item.sectionId" />
</el-select>
</el-form-item>
<el-form-item label="属地:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="属地:" prop="dependencyId">
<el-select v-model="registerForm.dependencyId" filterable placeholder="请选择属地" @change="selectChanged">
<el-option v-for="item in busDependencyData" :key="item.id" :label="item.dependencyName"
:value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="属地ESC:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="属地ESC:">
<el-input v-model="registerForm.escUserName"> </el-input>
</el-form-item>
<el-form-item label="ESC邮箱:" prop="code">
<el-input v-model="registerForm.code"> </el-input>
<el-form-item label="ESC邮箱:" prop="escEmail">
<el-input v-model="registerForm.escEmail"> </el-input>
</el-form-item>
</el-form>
</el-card>
</div>
<div class="el-register-footer">
<el-button class="submitApplyBtn">立即注册</el-button>
<el-button v-loading="loading" class="submitApplyBtn" @click="handleRegister">立即注册</el-button>
</div>
</el-main>
</el-container>
</template>
<script setup>
import { onMounted, ref } from 'vue'
import { ElMessageBox } from "element-plus"
import { getCodeImg, register } from "@/api/login"
import { register } from "@/api/login"
import systemlogo from '@/assets/logo/systemLogo.png'
import { getBusDependencyPage } from "@/api/system/dependency"
import { deptTreeSelect } from "@/api/system/user"
import { getSysSectionPage } from "@/api/system/section"
const router = useRouter()
const { proxy } = getCurrentInstance()
const registerForm = ref({
username: "",
password: "",
confirmPassword: "",
code: "",
uuid: ""
workNo: null,
nickName: null,
englishName: null,
username: null,
password: null,
email: null,
deptId: null,
sectionId: null,
dependencyId: null,
escUserName: null,
escEmail: null,
})
const equalToPassword = (rule, value, callback) => {
if (registerForm.value.password !== value) {
callback(new Error("两次输入的密码不一致"))
} else {
callback()
const registerRules = {
workNo: [{ required: true, message: "工号不能为空", trigger: "blur" }],
nickName: [{ required: true, message: "中文姓名不能为空", trigger: "blur" }, { min: 2, max: 20, message: "中文姓名长度必须介于 2 和 20 之间", trigger: "blur" }],
englishName: [{ required: true, message: "英文姓名不能为空", trigger: "blur" }, { min: 2, max: 20, message: "英文姓名长度必须介于 2 和 20 之间", trigger: "blur" }],
username: [{ required: true, message: "登录账号不能为空", trigger: "blur" }, { min: 2, max: 20, message: "登录账号长度必须介于 2 和 20 之间", trigger: "blur" }],
password: [{ required: true, message: "登录密码不能为空", trigger: "blur" }, { min: 5, max: 20, message: "登录密码长度必须介于 5 和 20 之间", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }],
email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
deptId: [{ required: true, message: "请选择归属部门", trigger: ["change"] }],
sectionId: [{ required: true, message: "请选择科室", trigger: ["change"] }],
dependencyId: [{ required: true, message: "请选择属地", trigger: ["change"] }],
escEmail: [{ required: true, type: "email", message: "ESC邮箱不能为空", trigger: ["blur", "change"] }],
}
//
const handleInput = (value) => {
registerForm.value.username = value
}
//
const selectChanged = (value) => {
if (value) {
const curDependency = busDependencyData.value.find(item => item.id == value)
console.log('选择属地信息', curDependency)
registerForm.value.escUserName = curDependency.escUserName
registerForm.value.escEmail = curDependency.escEmail
}
}
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" },
{ pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }
],
confirmPassword: [
{ required: true, trigger: "blur", message: "请再次输入您的密码" },
{ required: true, validator: equalToPassword, trigger: "blur" }
],
code: [{ required: true, trigger: "change", message: "请输入验证码" }]
const loading = ref(false)
//
onMounted(() => {
getSysSectionData();
getBusDependencyData();
getDeptTree();
});
//
const sectionData = ref([])
//
const getSysSectionData = () => {
getSysSectionPage({
pageIndex: 1,
pageSize: 100,
}).then(res => {
if (res.code == 200) {
sectionData.value = res.data.list
}
})
}
const codeUrl = ref("")
const loading = ref(false)
const captchaEnabled = ref(true)
//
const busDependencyData = ref([])
//
const getBusDependencyData = () => {
getBusDependencyPage({
pageIndex: 1,
pageSize: 100,
}).then(response => {
if (response.code == 200) {
busDependencyData.value = response.data.list
}
})
}
function handleRegister() {
//
const enabledDeptOptions = ref(undefined)
//
const getDeptTree = () => {
deptTreeSelect().then(res => {
enabledDeptOptions.value = filterDisabledDept(JSON.parse(JSON.stringify(res.data)))
})
}
/** 过滤禁用的部门 */
const filterDisabledDept = (deptList) => {
return deptList.filter(dept => {
if (dept.disabled) {
return false
}
if (dept.children && dept.children.length) {
dept.children = filterDisabledDept(dept.children)
}
return true
})
}
const handleRegister = () => {
proxy.$refs.registerRef.validate(valid => {
if (valid) {
loading.value = true
register(registerForm.value).then(res => {
console.log('注册结果', res)
const username = registerForm.value.username
ElMessageBox.alert("<font color='red'>恭喜你,您的账号 " + username + " 注册成功!</font>", "系统提示", {
dangerouslyUseHTMLString: true,
type: "success",
}).then(() => {
router.push("/login")
window.close();
}).catch(() => { })
}).catch(() => {
loading.value = false
if (captchaEnabled) {
getCode()
}
})
}
})