refactor:账号管理国际化
This commit is contained in:
parent
8fe5c89fdd
commit
1a39c1d3f0
@ -4,27 +4,27 @@
|
||||
<template #header>
|
||||
<div style="color: #fff">
|
||||
<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-View /> </el-icon>
|
||||
<span> 修改密码 </span>
|
||||
<span> {{ t('message.list.changePassword') }} </span>
|
||||
</div>
|
||||
</template>
|
||||
<div style="color: red; padding: 10px 10px; background: #faecd8; margin-bottom: 30px">
|
||||
<el-icon style="transform: translateY(2px)"><ele-Bell /></el-icon>
|
||||
<span> 密码安全策略:必须包含大小写字母、数字和特殊字符的组合,长度在6-16之间。 </span>
|
||||
<span> {{ t('message.list.passwordPolicy') }} </span>
|
||||
</div>
|
||||
<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto">
|
||||
<el-row :gutter="10">
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
|
||||
<el-form-item label="当前密码" prop="passwordOld" :rules="[{ required: true, message: '当前密码不能为空', trigger: 'blur' }]">
|
||||
<el-form-item :label="t('message.list.currentPassword')" prop="passwordOld" :rules="[{ required: true, message: t('message.list.currentPasswordRequired'), trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleForm.passwordOld" type="password" autocomplete="off" show-password />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
|
||||
<el-form-item label="新密码" prop="passwordNew" :rules="[{ required: true, message: '新密码不能为空', trigger: 'blur' }]">
|
||||
<el-form-item :label="t('message.list.newPassword')" prop="passwordNew" :rules="[{ required: true, message: t('message.list.newPasswordRequired'), trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleForm.passwordNew" type="password" autocomplete="off" show-password />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
|
||||
<el-form-item label="确认密码" prop="passwordNew2" :rules="[{ validator: validatePassword, required: true, trigger: 'blur' }]">
|
||||
<el-form-item :label="t('message.list.confirmPassword')" prop="passwordNew2" :rules="[{ validator: validatePassword, required: true, trigger: 'blur' }]">
|
||||
<el-input v-model="state.passwordNew2" type="password" autocomplete="off" show-password />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -32,8 +32,8 @@
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button type="danger" plain @click="logout">退 出</el-button>
|
||||
<el-button type="primary" icon="ele-CircleCheckFilled" @click="submit">确 定</el-button>
|
||||
<el-button type="danger" plain @click="logout">{{ t('message.list.cancelButtonText') }}</el-button>
|
||||
<el-button type="primary" icon="ele-CircleCheckFilled" @click="submit">{{ t('message.list.confirmButtonText') }}</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@ -48,6 +48,9 @@ import { sm2 } from 'sm-crypto-v2';
|
||||
import { clearAccessTokens, getAPI } from '/@/utils/axios-utils';
|
||||
import { SysUserApi } from '/@/api-services/api';
|
||||
import { ChangePwdInput } from '/@/api-services/models';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
const ruleFormRef = ref();
|
||||
const state = reactive({
|
||||
@ -79,7 +82,7 @@ const submit = () => {
|
||||
cpwd.passwordNew = sm2.doEncrypt(state.ruleForm.passwordNew, publicKey, 1);
|
||||
await getAPI(SysUserApi).apiSysUserChangePwdPost(cpwd);
|
||||
|
||||
ElMessage.success('密码已修改,请重新登录系统!');
|
||||
ElMessage.success(t('message.list.passwordChangedNeedRelogin'));
|
||||
state.isShowDialog = false;
|
||||
clearAccessTokens();
|
||||
});
|
||||
@ -88,7 +91,7 @@ const submit = () => {
|
||||
// 密码验证
|
||||
const validatePassword = (_rule: any, value: any, callback: any) => {
|
||||
if (state.passwordNew2 != state.ruleForm.passwordNew) {
|
||||
callback(new Error('两次密码不一致!'));
|
||||
callback(new Error(t('message.list.passwordNotMatch')));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
|
||||
@ -8,59 +8,59 @@
|
||||
</div>
|
||||
</template>
|
||||
<el-tabs v-loading="state.loading" v-model="state.selectedTabName">
|
||||
<el-tab-pane label="基础信息" style="height: 650px; overflow-y: auto; overflow-x: hidden">
|
||||
<el-tab-pane :label="$t('message.list.basicInfo')" style="height: 650px; overflow-y: auto; overflow-x: hidden">
|
||||
<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto">
|
||||
<el-row :gutter="10">
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="账号名称" prop="account" :rules="[{ required: true, message: '账号名称不能为空', trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleForm.account" placeholder="账号名称" clearable />
|
||||
<el-form-item :label="$t('message.list.account')" prop="account" :rules="[{ required: true, message: $t('message.list.accountNameRequired'), trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleForm.account" :placeholder="$t('message.list.account')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="昵称">
|
||||
<el-input v-model="state.ruleForm.nickName" placeholder="昵称" clearable />
|
||||
<el-form-item :label="$t('message.list.nickname')">
|
||||
<el-input v-model="state.ruleForm.nickName" :placeholder="$t('message.list.nickname')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="手机号码" prop="phone" :rules="[{ required: true, message: '手机号码不能为空', trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleForm.phone" placeholder="手机号码" clearable />
|
||||
<el-form-item :label="$t('message.list.phoneNumber')" prop="phone" :rules="[{ required: true, message: $t('message.list.phoneRequired'), trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleForm.phone" :placeholder="$t('message.list.phoneNumber')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="真实姓名" prop="realName" :rules="[{ required: true, message: '真实姓名不能为空', trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleForm.realName" placeholder="真实姓名" clearable />
|
||||
<el-form-item :label="$t('message.list.realName')" prop="realName" :rules="[{ required: true, message: $t('message.list.realNameRequired'), trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleForm.realName" :placeholder="$t('message.list.realName')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="账号类型" prop="accountType" :rules="[{ required: true, message: '账号类型不能为空', trigger: 'blur' }]">
|
||||
<el-select v-model="state.ruleForm.accountType" placeholder="账号类型" collapse-tags collapse-tags-tooltip class="w100">
|
||||
<el-option label="系统管理员" :value="888" :disabled="userInfos.accountType != 888 && userInfos.accountType != 999" />
|
||||
<el-option label="普通账号" :value="777" />
|
||||
<el-option label="会员" :value="666" />
|
||||
<el-form-item :label="$t('message.list.accountType')" prop="accountType" :rules="[{ required: true, message: $t('message.list.accountTypeRequired'), trigger: 'blur' }]">
|
||||
<el-select v-model="state.ruleForm.accountType" :placeholder="$t('message.list.accountType')" collapse-tags collapse-tags-tooltip class="w100">
|
||||
<el-option :label="$t('message.list.systemAdmin')" :value="888" :disabled="userInfos.accountType != 888 && userInfos.accountType != 999" />
|
||||
<el-option :label="$t('message.list.normalAccount')" :value="777" />
|
||||
<el-option :label="$t('message.list.member')" :value="666" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="邮箱">
|
||||
<el-input v-model="state.ruleForm.email" placeholder="邮箱" clearable />
|
||||
<el-form-item :label="$t('message.list.email')">
|
||||
<el-input v-model="state.ruleForm.email" :placeholder="$t('message.list.email')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="入职日期">
|
||||
<el-date-picker v-model="state.ruleForm.joinDate" type="date" placeholder="入职日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" class="w100" />
|
||||
<el-form-item :label="$t('message.list.entryDate')">
|
||||
<el-date-picker v-model="state.ruleForm.joinDate" type="date" :placeholder="$t('message.list.entryDate')" format="YYYY-MM-DD" value-format="YYYY-MM-DD" class="w100" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb5">
|
||||
<el-form-item label="排序">
|
||||
<el-input-number v-model="state.ruleForm.orderNo" placeholder="排序" class="w100" />
|
||||
<el-form-item :label="$t('message.list.orderNo')">
|
||||
<el-input-number v-model="state.ruleForm.orderNo" :placeholder="$t('message.list.orderNo')" class="w100" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-divider border-style="dashed" content-position="center">
|
||||
<div style="color: #b1b3b8">机构组织</div>
|
||||
<div style="color: #b1b3b8">{{ $t('message.list.orgStructure') }}</div>
|
||||
</el-divider>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="所属机构" prop="orgId" :rules="[{ required: true, message: '所属机构不能为空', trigger: 'blur' }]">
|
||||
<el-cascader :options="props.orgData" :props="cascaderProps" placeholder="所属机构" clearable filterable class="w100" v-model="state.ruleForm.orgId">
|
||||
<el-form-item :label="$t('message.list.organization')" prop="orgId" :rules="[{ required: true, message: $t('message.list.organizationRequired'), trigger: 'blur' }]">
|
||||
<el-cascader :options="props.orgData" :props="cascaderProps" :placeholder="$t('message.list.organization')" clearable filterable class="w100" v-model="state.ruleForm.orgId">
|
||||
<template #default="{ node, data }">
|
||||
<span>{{ data.name }}</span>
|
||||
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
|
||||
@ -69,39 +69,39 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="职位" prop="posId" :rules="[{ required: true, message: '职位名称不能为空', trigger: 'blur' }]">
|
||||
<el-select v-model="state.ruleForm.posId" placeholder="职位" class="w100">
|
||||
<el-form-item :label="$t('message.list.jobTitle')" prop="posId" :rules="[{ required: true, message: $t('message.list.jobTitleRequired'), trigger: 'blur' }]">
|
||||
<el-select v-model="state.ruleForm.posId" :placeholder="$t('message.list.jobTitle')" class="w100">
|
||||
<el-option v-for="d in state.posData" :key="d.id" :label="d.name" :value="d.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="工号">
|
||||
<el-input v-model="state.ruleForm.jobNum" placeholder="工号" clearable />
|
||||
<el-form-item :label="$t('message.list.employeeId')">
|
||||
<el-input v-model="state.ruleForm.jobNum" :placeholder="$t('message.list.employeeId')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="域账号">
|
||||
<el-input v-model="state.ruleForm.domainAccount" placeholder="域账号" clearable />
|
||||
<el-form-item :label="$t('message.list.domainAccount')">
|
||||
<el-input v-model="state.ruleForm.domainAccount" :placeholder="$t('message.list.domainAccount')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-divider border-style="dashed" content-position="center">
|
||||
<div style="color: #b1b3b8">附属机构</div>
|
||||
<div style="color: #b1b3b8">{{ $t('message.list.affiliatedOrg') }}</div>
|
||||
</el-divider>
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb10">
|
||||
<el-button icon="ele-Plus" type="primary" plain @click="addExtOrgRow"> 增加附属机构 </el-button>
|
||||
<span style="font-size: 12px; color: gray; padding-left: 5px"> 具有相应组织机构的数据权限 </span>
|
||||
<el-button icon="ele-Plus" type="primary" plain @click="addExtOrgRow"> {{ $t('message.list.addAffiliatedOrg') }} </el-button>
|
||||
<span style="font-size: 12px; color: gray; padding-left: 5px"> {{ $t('message.list.orgDataPermission') }} </span>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
|
||||
<template v-if="state.ruleForm.extOrgIdList != undefined && state.ruleForm.extOrgIdList.length > 0">
|
||||
<el-row :gutter="10" v-for="(v, k) in state.ruleForm.extOrgIdList" :key="k">
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="机构" :prop="`extOrgIdList[${k}].orgId`" :rules="[{ required: true, message: `机构不能为空`, trigger: 'blur' }]">
|
||||
<el-form-item :label="$t('message.list.organization')" :prop="`extOrgIdList[${k}].orgId`" :rules="[{ required: true, message: $t('message.list.orgRequired'), trigger: 'blur' }]">
|
||||
<template #label>
|
||||
<el-button icon="ele-Delete" type="danger" circle plain size="small" @click="deleteExtOrgRow(k)" />
|
||||
<span class="ml5">机构</span>
|
||||
<span class="ml5">{{ $t('message.list.organization') }}</span>
|
||||
</template>
|
||||
<el-cascader :options="props.orgData" :props="cascaderProps" placeholder="机构组织" clearable filterable class="w100" v-model="state.ruleForm.extOrgIdList[k].orgId">
|
||||
<el-cascader :options="props.orgData" :props="cascaderProps" :placeholder="$t('message.list.organization')" clearable filterable class="w100" v-model="state.ruleForm.extOrgIdList[k].orgId">
|
||||
<template #default="{ node, data }">
|
||||
<span>{{ data.name }}</span>
|
||||
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
|
||||
@ -110,122 +110,127 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="职位" :prop="`extOrgIdList[${k}].posId`" :rules="[{ required: true, message: `职位不能为空`, trigger: 'blur' }]">
|
||||
<el-select v-model="state.ruleForm.extOrgIdList[k].posId" placeholder="职位名称" class="w100">
|
||||
<el-form-item :label="$t('message.list.jobTitle')" :prop="`extOrgIdList[${k}].posId`" :rules="[{ required: true, message: $t('message.list.positionRequired'), trigger: 'blur' }]">
|
||||
<el-select v-model="state.ruleForm.extOrgIdList[k].posId" :placeholder="$t('message.list.jobTitle')" class="w100">
|
||||
<el-option v-for="d in state.posData" :key="d.id" :label="d.name" :value="d.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</template>
|
||||
<el-empty :image-size="70" description="空数据" v-else></el-empty>
|
||||
<el-empty :image-size="70" :description="$t('message.list.noData')" v-else></el-empty>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="角色授权" style="height: 550px; overflow-y: auto; overflow-x: hidden">
|
||||
<Transfer left-title="未授权" right-title="已授权" v-model:leftData="state.availableRoles" v-model:rightData="state.grantedRoles" />
|
||||
<el-tab-pane :label="$t('message.list.roleAuth')" style="height: 550px; overflow-y: auto; overflow-x: hidden">
|
||||
<Transfer
|
||||
:left-title="$t('message.list.unauthorized')"
|
||||
:right-title="$t('message.list.authorized')"
|
||||
v-model:leftData="state.availableRoles"
|
||||
v-model:rightData="state.grantedRoles"
|
||||
/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="档案信息" style="height: 550px; overflow-y: auto; overflow-x: hidden">
|
||||
<el-tab-pane :label="$t('message.list.profileInfo')" style="height: 550px; overflow-y: auto; overflow-x: hidden">
|
||||
<el-form :model="state.ruleForm" label-width="auto">
|
||||
<el-row :gutter="10">
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="证件类型" prop="cardType">
|
||||
<el-select v-model="state.ruleForm.cardType" placeholder="证件类型" class="w100">
|
||||
<el-option label="身份证" :value="0" />
|
||||
<el-option label="护照" :value="1" />
|
||||
<el-option label="出生证" :value="2" />
|
||||
<el-option label="港澳台通行证" :value="3" />
|
||||
<el-option label="外国人居留证" :value="4" />
|
||||
<el-form-item :label="$t('message.list.idType')" prop="cardType">
|
||||
<el-select v-model="state.ruleForm.cardType" :placeholder="$t('message.list.idType')" class="w100">
|
||||
<el-option :label="$t('message.list.idCard')" :value="0" />
|
||||
<el-option :label="$t('message.list.passport')" :value="1" />
|
||||
<el-option :label="$t('message.list.birthCertificate')" :value="2" />
|
||||
<el-option :label="$t('message.list.hkMacauPass')" :value="3" />
|
||||
<el-option :label="$t('message.list.foreignerCard')" :value="4" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="证件号码">
|
||||
<el-input v-model="state.ruleForm.idCardNum" placeholder="证件号码" clearable />
|
||||
<el-form-item :label="$t('message.list.idNumber')">
|
||||
<el-input v-model="state.ruleForm.idCardNum" :placeholder="$t('message.list.idNumber')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="出生日期" prop="birthday">
|
||||
<el-date-picker v-model="state.ruleForm.birthday" type="date" placeholder="出生日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" class="w100" />
|
||||
<el-form-item :label="$t('message.list.birthDate')" prop="birthday">
|
||||
<el-date-picker v-model="state.ruleForm.birthday" type="date" :placeholder="$t('message.list.birthDate')" format="YYYY-MM-DD" value-format="YYYY-MM-DD" class="w100" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="性别">
|
||||
<el-form-item :label="$t('message.list.gender')">
|
||||
<el-radio-group v-model="state.ruleForm.sex">
|
||||
<el-radio :value="1">男</el-radio>
|
||||
<el-radio :value="2">女</el-radio>
|
||||
<el-radio :value="0">未知</el-radio>
|
||||
<el-radio :value="9">未说明</el-radio>
|
||||
<el-radio :value="1">{{ $t('message.list.male') }}</el-radio>
|
||||
<el-radio :value="2">{{ $t('message.list.female') }}</el-radio>
|
||||
<el-radio :value="0">{{ $t('message.list.unknown') }}</el-radio>
|
||||
<el-radio :value="9">{{ $t('message.list.unspecified') }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb5">
|
||||
<el-form-item label="年龄">
|
||||
<el-input-number v-model="state.ruleForm.age" placeholder="年龄" class="w100" />
|
||||
<el-form-item :label="$t('message.list.age')">
|
||||
<el-input-number v-model="state.ruleForm.age" :placeholder="$t('message.list.age')" class="w100" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="民族">
|
||||
<el-input v-model="state.ruleForm.nation" placeholder="民族" clearable />
|
||||
<el-form-item :label="$t('message.list.ethnicity')">
|
||||
<el-input v-model="state.ruleForm.nation" :placeholder="$t('message.list.ethnicity')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
|
||||
<el-form-item label="地址">
|
||||
<el-input v-model="state.ruleForm.address" placeholder="地址" clearable type="textarea" />
|
||||
<el-form-item :label="$t('message.list.address')">
|
||||
<el-input v-model="state.ruleForm.address" :placeholder="$t('message.list.address')" clearable type="textarea" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="毕业学校">
|
||||
<el-input v-model="state.ruleForm.college" placeholder="毕业学校" clearable />
|
||||
<el-form-item :label="$t('message.list.graduateSchool')">
|
||||
<el-input v-model="state.ruleForm.college" :placeholder="$t('message.list.graduateSchool')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="文化程度">
|
||||
<el-select v-model="state.ruleForm.cultureLevel" placeholder="文化程度" class="w100">
|
||||
<el-option label="其他" :value="0" />
|
||||
<el-option label="小学" :value="1" />
|
||||
<el-option label="初中" :value="2" />
|
||||
<el-option label="普通高中" :value="3" />
|
||||
<el-option label="技工学校" :value="4" />
|
||||
<el-option label="职业教育" :value="5" />
|
||||
<el-option label="职业高中" :value="6" />
|
||||
<el-option label="中等专科" :value="7" />
|
||||
<el-option label="大学专科" :value="8" />
|
||||
<el-option label="大学本科" :value="9" />
|
||||
<el-option label="硕士研究生" :value="10" />
|
||||
<el-option label="博士研究生" :value="11" />
|
||||
<el-form-item :label="$t('message.list.educationLevel')">
|
||||
<el-select v-model="state.ruleForm.cultureLevel" :placeholder="$t('message.list.educationLevel')" class="w100">
|
||||
<el-option :label="$t('message.list.other')" :value="0" />
|
||||
<el-option :label="$t('message.list.primarySchool')" :value="1" />
|
||||
<el-option :label="$t('message.list.juniorHigh')" :value="2" />
|
||||
<el-option :label="$t('message.list.seniorHigh')" :value="3" />
|
||||
<el-option :label="$t('message.list.technicalSchool')" :value="4" />
|
||||
<el-option :label="$t('message.list.vocationalEdu')" :value="5" />
|
||||
<el-option :label="$t('message.list.vocationalHigh')" :value="6" />
|
||||
<el-option :label="$t('message.list.technicalCollege')" :value="7" />
|
||||
<el-option :label="$t('message.list.juniorCollege')" :value="8" />
|
||||
<el-option :label="$t('message.list.undergraduate')" :value="9" />
|
||||
<el-option :label="$t('message.list.master')" :value="10" />
|
||||
<el-option :label="$t('message.list.doctor')" :value="11" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="政治面貌">
|
||||
<el-input v-model="state.ruleForm.politicalOutlook" placeholder="政治面貌" clearable />
|
||||
<el-form-item :label="$t('message.list.politicalStatus')">
|
||||
<el-input v-model="state.ruleForm.politicsStatus" :placeholder="$t('message.list.politicalStatus')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="办公电话">
|
||||
<el-input v-model="state.ruleForm.officePhone" placeholder="办公电话" clearable />
|
||||
<el-form-item :label="$t('message.list.officePhone')">
|
||||
<el-input v-model="state.ruleForm.officePhone" :placeholder="$t('message.list.officePhone')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="紧急联系人">
|
||||
<el-input v-model="state.ruleForm.emergencyContact" placeholder="紧急联系人" clearable />
|
||||
<el-form-item :label="$t('message.list.emergencyContact')">
|
||||
<el-input v-model="state.ruleForm.emergencyContact" :placeholder="$t('message.list.emergencyContact')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="联系人电话">
|
||||
<el-input v-model="state.ruleForm.emergencyPhone" placeholder="联系人电话" clearable />
|
||||
<el-form-item :label="$t('message.list.contactPhone')">
|
||||
<el-input v-model="state.ruleForm.emergencyPhone" :placeholder="$t('message.list.contactPhone')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
|
||||
<el-form-item label="联系人地址">
|
||||
<el-input v-model="state.ruleForm.emergencyAddress" placeholder="联系人地址" clearable type="textarea" />
|
||||
<el-form-item :label="$t('message.list.contactAddress')">
|
||||
<el-input v-model="state.ruleForm.emergencyAddress" :placeholder="$t('message.list.contactAddress')" clearable type="textarea" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
|
||||
<el-form-item label="备注">
|
||||
<el-input v-model="state.ruleForm.remark" placeholder="备注" clearable type="textarea" />
|
||||
<el-form-item :label="$t('message.list.remark')">
|
||||
<el-input v-model="state.ruleForm.remark" :placeholder="$t('message.list.needInputRemark')" clearable type="textarea" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
@ -234,8 +239,8 @@
|
||||
</el-tabs>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button icon="ele-CircleCloseFilled" @click="cancel">取 消</el-button>
|
||||
<el-button type="primary" icon="ele-CircleCheckFilled" @click="submit">确 定</el-button>
|
||||
<el-button icon="ele-CircleCloseFilled" @click="cancel">{{ $t('message.list.cancelButtonText') }}</el-button>
|
||||
<el-button type="primary" icon="ele-CircleCheckFilled" @click="submit">{{ $t('message.list.confirmButtonText') }}</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@ -252,6 +257,9 @@ import Transfer from '/@/components/transfer/index.vue';
|
||||
import { getAPI } from '/@/utils/axios-utils';
|
||||
import { SysPosApi, SysRoleApi, SysUserApi } from '/@/api-services/api';
|
||||
import { SysOrg, PagePosOutput, UpdateUserInput } from '/@/api-services/models';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
const props = defineProps({
|
||||
title: String,
|
||||
@ -319,7 +327,7 @@ const submit = () => {
|
||||
if (!valid) return;
|
||||
if (state.grantedRoles?.length > 0) state.ruleForm.roleIdList = state.grantedRoles.map((e: any) => e.id);
|
||||
else {
|
||||
ElMessage.error(`请分配角色`);
|
||||
ElMessage.error(t('message.list.pleaseAssignRole'));
|
||||
return;
|
||||
}
|
||||
if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div v-loading="state.loading">
|
||||
<div style="text-align: right">
|
||||
<div style="margin-right: 10px"><el-switch v-model="state.horizontal"></el-switch> 横向/纵向</div>
|
||||
<div style="margin-right: 10px"><el-switch v-model="state.horizontal"></el-switch> {{ $t('message.list.layout') }}</div>
|
||||
</div>
|
||||
<div style="height: 500px">
|
||||
<vue3-tree-org
|
||||
@ -19,7 +19,7 @@
|
||||
<template v-slot="{ node }">
|
||||
<div class="tree-org-node__text node-label">
|
||||
<div class="node-title">{{ node.label }}</div>
|
||||
<div class="node-id">编码:{{ node.id }}</div>
|
||||
<div class="node-id">{{ $t('message.list.code') }}:{{ node.id }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:expand="{ node }">
|
||||
|
||||
@ -21,19 +21,19 @@
|
||||
</div>
|
||||
<div class="account-center-org">
|
||||
<p>
|
||||
<el-icon><ele-School /></el-icon> <span>{{ userInfos.orgName ?? '组织' }}</span>
|
||||
<el-icon><ele-School /></el-icon> <span>{{ userInfos.orgName ?? $t('message.list.organizationNameText') }}</span>
|
||||
</p>
|
||||
<p>
|
||||
<el-icon><ele-Mug /></el-icon> <span>{{ userInfos.posName ?? '职位' }}</span>
|
||||
<el-icon><ele-Mug /></el-icon> <span>{{ userInfos.posName ?? $t('message.list.positionText') }}</span>
|
||||
</p>
|
||||
<p>
|
||||
<el-icon><ele-LocationInformation /></el-icon> <span>{{ userInfos.address ?? '地址' }}</span>
|
||||
<el-icon><ele-LocationInformation /></el-icon> <span>{{ userInfos.address ?? $t('message.list.address') }}</span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="image-signature">
|
||||
<el-image :src="userInfos.signature" fit="contain" alt="电子签名" loading="lazy" style="width: 100%; height: 100%"> </el-image>
|
||||
<el-image :src="userInfos.signature" fit="contain" :alt="t('message.list.electronicSignatureText')" loading="lazy" style="width: 100%; height: 100%"> </el-image>
|
||||
</div>
|
||||
<el-button icon="ele-Edit" type="primary" @click="openSignDialog" v-auth="'sysFile/uploadSignature'"> 电子签名 </el-button>
|
||||
<el-button icon="ele-Edit" type="primary" @click="openSignDialog" v-auth="'sysFile/uploadSignature'"> {{ $t('message.list.electronicSignatureText') }} </el-button>
|
||||
<el-upload
|
||||
ref="uploadSignRef"
|
||||
action
|
||||
@ -45,7 +45,7 @@
|
||||
:on-exceed="uploadSignFileExceed"
|
||||
style="display: inline-block; margin-left: 12px; position: absolute"
|
||||
>
|
||||
<el-button icon="ele-UploadFilled" v-auth="'sysFile/uploadSignature'">上传手写签名</el-button>
|
||||
<el-button icon="ele-UploadFilled" v-auth="'sysFile/uploadSignature'">{{ $t('message.list.uploadHandwrittenSignatureText') }}</el-button>
|
||||
</el-upload>
|
||||
</el-card>
|
||||
</el-col>
|
||||
@ -53,81 +53,91 @@
|
||||
<el-col :span="16" :xs="24">
|
||||
<el-card shadow="hover">
|
||||
<el-tabs>
|
||||
<el-tab-pane label="基础信息" v-loading="state.loading">
|
||||
<el-tab-pane :label="t('message.list.basicInfo')" v-loading="state.loading">
|
||||
<el-form :model="state.ruleFormBase" ref="ruleFormBaseRef" label-width="auto">
|
||||
<el-row :gutter="10">
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="真实姓名" prop="realName" :rules="[{ required: true, message: '真实姓名不能为空', trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleFormBase.realName" placeholder="真实姓名" clearable />
|
||||
<el-form-item :label="t('message.list.realNameText')" prop="realName" :rules="[{ required: true, message: t('message.list.realNameRequired'), trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleFormBase.realName" :placeholder="t('message.list.realNameText')" clearable />
|
||||
|
||||
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="昵称">
|
||||
<el-input v-model="state.ruleFormBase.nickName" placeholder="昵称" clearable />
|
||||
<el-form-item :label="t('message.list.nickname')">
|
||||
<el-input v-model="state.ruleFormBase.nickName" :placeholder="t('message.list.nickname')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item :label="t('message.list.phoneNumber')" prop="phone" :rules="[{ required: true, message: t('message.list.phoneRequired'), trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleFormBase.phone" :placeholder="t('message.list.phoneNumber')" clearable />
|
||||
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="手机号码" prop="phone" :rules="[{ required: true, message: '手机号码不能为空', trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleFormBase.phone" placeholder="手机号码" clearable />
|
||||
<el-form-item :label="t('message.list.email')">
|
||||
<el-input v-model="state.ruleFormBase.email" :placeholder="t('message.list.email')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item :label="t('message.list.birthDate')" prop="birthday" :rules="[{ required: true, message: t('message.list.birthDateRequired'), trigger: 'blur' }]">
|
||||
<el-date-picker v-model="state.ruleFormBase.birthday" type="date" :placeholder="t('message.list.birthDate')" format="YYYY-MM-DD" value-format="YYYY-MM-DD" class="w100" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="邮箱">
|
||||
<el-input v-model="state.ruleFormBase.email" placeholder="邮箱" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="出生日期" prop="birthday" :rules="[{ required: true, message: '出生日期不能为空', trigger: 'blur' }]">
|
||||
<el-date-picker v-model="state.ruleFormBase.birthday" type="date" placeholder="出生日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" class="w100" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="性别">
|
||||
<el-form-item :label="t('message.list.gender')">
|
||||
<el-radio-group v-model="state.ruleFormBase.sex">
|
||||
<el-radio :value="1">男</el-radio>
|
||||
<el-radio :value="2">女</el-radio>
|
||||
<el-radio :value="1">{{ t('message.list.male') }}</el-radio>
|
||||
<el-radio :value="2">{{ t('message.list.female') }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
|
||||
<el-form-item label="地址">
|
||||
<el-input v-model="state.ruleFormBase.address" placeholder="地址" clearable type="textarea" />
|
||||
<el-form-item :label="t('message.list.address')">
|
||||
<el-input v-model="state.ruleFormBase.address" :placeholder="t('message.list.address')" clearable type="textarea" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
|
||||
<el-form-item label="备注">
|
||||
<el-input v-model="state.ruleFormBase.remark" placeholder="备注" clearable type="textarea" />
|
||||
<el-form-item :label="t('message.list.remark')">
|
||||
<el-input v-model="state.ruleFormBase.remark" :placeholder="t('message.list.remark')" clearable type="textarea" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb10">
|
||||
<el-form-item>
|
||||
<el-button icon="ele-SuccessFilled" type="primary" @click="submitUserBase" v-auth="'sysUser/baseInfo'"> 保存基本信息 </el-button>
|
||||
<el-button icon="ele-SuccessFilled" type="primary" @click="submitUserBase" v-auth="'sysUser/baseInfo'"> {{ $t('message.list.saveBasicInfo') }} </el-button>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="组织机构">
|
||||
<el-tab-pane :label="t('message.list.organizationStructure')">
|
||||
<OrgTree ref="orgTreeRef" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="修改密码">
|
||||
<el-tab-pane :label="t('message.list.changePassword')">
|
||||
|
||||
<div style="color: red; padding: 10px 10px; background: #faecd8; margin-bottom: 15px">
|
||||
<el-icon style="transform: translateY(2px)"><ele-Bell /></el-icon>
|
||||
<span> 密码安全策略:必须包含大小写字母、数字和特殊字符的组合,长度在6-16之间。 </span>
|
||||
<span> {{ $t('message.list.passwordPolicy') }} </span>
|
||||
|
||||
</div>
|
||||
<el-form ref="ruleFormPasswordRef" :model="state.ruleFormPassword" label-width="auto" class="mb10">
|
||||
<el-form-item label="当前密码" prop="passwordOld" :rules="[{ required: true, message: '当前密码不能为空', trigger: 'blur' }]">
|
||||
<el-form-item :label="t('message.list.currentPassword')" prop="passwordOld" :rules="[{ required: true, message: t('message.list.currentPasswordRequired'), trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleFormPassword.passwordOld" type="password" autocomplete="off" show-password />
|
||||
</el-form-item>
|
||||
<el-form-item label="新密码" prop="passwordNew" :rules="[{ required: true, message: '新密码不能为空', trigger: 'blur' }]">
|
||||
<el-form-item :label="t('message.list.newPassword')" prop="passwordNew" :rules="[{ required: true, message: t('message.list.newPasswordRequired'), trigger: 'blur' }]">
|
||||
<el-input v-model="state.ruleFormPassword.passwordNew" type="password" autocomplete="off" show-password />
|
||||
</el-form-item>
|
||||
<el-form-item label="确认密码" prop="passwordNew2" :rules="[{ validator: validatePassword, required: true, trigger: 'blur' }]">
|
||||
<el-form-item :label="t('message.list.confirmPassword')" prop="passwordNew2" :rules="[{ validator: validatePassword, required: true, trigger: 'blur' }]">
|
||||
<el-input v-model="state.passwordNew2" type="password" autocomplete="off" show-password />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button icon="ele-Refresh" @click="resetPassword">重 置</el-button>
|
||||
<el-button icon="ele-CircleCheckFilled" type="primary" @click="submitPassword" v-auth="'sysUser/changePwd'">确 定</el-button>
|
||||
<el-button icon="ele-Refresh" @click="resetPassword">{{ $t('message.list.reset') }}</el-button>
|
||||
<el-button icon="ele-CircleCheckFilled" type="primary" @click="submitPassword" v-auth="'sysUser/changePwd'">{{ $t('message.list.confirmButtonText') }}</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
@ -140,21 +150,21 @@
|
||||
<template #header>
|
||||
<div style="color: #fff">
|
||||
<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-EditPen /> </el-icon>
|
||||
<span> 电子签名 </span>
|
||||
<span> {{ $t('message.list.electronicSignatureText') }} </span>
|
||||
</div>
|
||||
</template>
|
||||
<div style="border: 1px dashed gray; width: 100%; height: 250px">
|
||||
<VueSignaturePad ref="signaturePadRef" :options="state.signOptions" />
|
||||
</div>
|
||||
<div style="margin-top: 10px">
|
||||
<div style="display: inline">画笔粗细:<el-input-number v-model="state.signOptions.minWidth" :min="0.5" :max="2.5" :step="0.1" size="small" /></div>
|
||||
<div style="display: inline; margin-left: 30px">画笔颜色:<el-color-picker v-model="state.signOptions.penColor" color-format="hex" size="default"> </el-color-picker></div>
|
||||
<div style="display: inline">{{ $t('message.list.brushThickness') }}:<el-input-number v-model="state.signOptions.minWidth" :min="0.5" :max="2.5" :step="0.1" size="small" /></div>
|
||||
<div style="display: inline; margin-left: 30px">{{ $t('message.list.brushColor') }}:<el-color-picker v-model="state.signOptions.penColor" color-format="hex" size="default"> </el-color-picker></div>
|
||||
</div>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="unDoSign">撤销</el-button>
|
||||
<el-button @click="clearSign">清屏</el-button>
|
||||
<el-button type="primary" @click="saveUploadSign">保存</el-button>
|
||||
<el-button @click="unDoSign">{{ $t('message.list.undo') }}</el-button>
|
||||
<el-button @click="clearSign">{{ $t('message.list.clearScreen') }}</el-button>
|
||||
<el-button type="primary" @click="saveUploadSign">{{ $t('message.list.save') }}</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@ -175,10 +185,12 @@ import CropperDialog from '/@/components/cropper/index.vue';
|
||||
import VueGridLayout from 'vue-grid-layout';
|
||||
import { sm2 } from 'sm-crypto-v2';
|
||||
import { clearAccessTokens, getAPI } from '/@/utils/axios-utils';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
import { SysFileApi, SysUserApi } from '/@/api-services/api';
|
||||
import { ChangePwdInput, SysUser, SysFile } from '/@/api-services/models';
|
||||
|
||||
const { t } = useI18n();
|
||||
const stores = useUserInfo();
|
||||
const { userInfos } = storeToRefs(stores);
|
||||
const uploadSignRef = ref<UploadInstance>();
|
||||
@ -272,9 +284,9 @@ const handleChangeSignFile = (_file: any, fileList: []) => {
|
||||
const submitUserBase = () => {
|
||||
ruleFormBaseRef.value?.validate(async (valid: boolean) => {
|
||||
if (!valid) return;
|
||||
ElMessageBox.confirm('确定修改个人基础信息?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
ElMessageBox.confirm(t('message.list.confirmModifyBasicInfo'), t('message.list.hint'), {
|
||||
confirmButtonText: t('message.list.confirmButtonText'),
|
||||
cancelButtonText: t('message.list.cancelButtonText'),
|
||||
type: 'warning',
|
||||
}).then(async () => {
|
||||
await getAPI(SysUserApi).apiSysUserUpdateBaseInfoPost(state.ruleFormBase);
|
||||
@ -285,7 +297,7 @@ const submitUserBase = () => {
|
||||
// 密码验证
|
||||
const validatePassword = (_rule: any, value: any, callback: any) => {
|
||||
if (state.passwordNew2 != state.ruleFormPassword.passwordNew) {
|
||||
callback(new Error('两次密码不一致!'));
|
||||
callback(new Error(t('message.list.passwordNotMatch')));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
@ -311,9 +323,9 @@ const submitPassword = () => {
|
||||
await getAPI(SysUserApi).apiSysUserChangePwdPost(cpwd);
|
||||
|
||||
// 退出系统
|
||||
ElMessageBox.confirm('密码已修改,是否重新登录系统?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
ElMessageBox.confirm(t('message.list.passwordModifiedConfirmRelogin'), t('message.list.hint'), {
|
||||
confirmButtonText: t('message.list.confirmButtonText'),
|
||||
cancelButtonText: t('message.list.cancelButtonText'),
|
||||
type: 'warning',
|
||||
}).then(async () => {
|
||||
clearAccessTokens();
|
||||
@ -323,7 +335,7 @@ const submitPassword = () => {
|
||||
|
||||
// 打开裁剪弹窗
|
||||
const openCropperDialog = () => {
|
||||
state.cropperTitle = '更换头像';
|
||||
state.cropperTitle = t('message.list.changeAvatar');
|
||||
cropperDialogRef.value?.openDialog(userInfos.value.avatar);
|
||||
};
|
||||
|
||||
|
||||
@ -9,25 +9,28 @@
|
||||
<el-form :model="state.queryParams" ref="queryForm" :show-message="false" :inlineMessage="true" label-width="auto" style="flex: 1 1 0%">
|
||||
<el-row :gutter="10">
|
||||
<el-col class="mb5" :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
|
||||
<el-form-item label="账号" prop="account">
|
||||
<el-input v-model="state.queryParams.account" placeholder="账号" clearable @keyup.enter.native="handleQuery(true)" />
|
||||
<el-form-item :label="$t('message.list.account')" prop="account">
|
||||
<el-input v-model="state.queryParams.account" :placeholder="$t('message.list.account')" clearable @keyup.enter.native="handleQuery(true)" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col class="mb5" :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
|
||||
<el-form-item :label="$t('message.list.realName')" prop="realName">
|
||||
<el-input v-model="state.queryParams.realName" :placeholder="$t('message.list.realName')" clearable @keyup.enter.native="handleQuery(true)" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col class="mb5" :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
|
||||
<el-form-item label="姓名" prop="realName">
|
||||
<el-input v-model="state.queryParams.realName" placeholder="姓名" clearable @keyup.enter.native="handleQuery(true)" />
|
||||
<el-form-item :label="$t('message.list.jobTitle')" prop="posName">
|
||||
<el-input v-model="state.queryParams.posName" :placeholder="$t('message.list.jobTitle')" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col class="mb5" :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
|
||||
<el-form-item label="职位名称">
|
||||
<el-input v-model="state.queryParams.posName" placeholder="职位名称" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col class="mb5" :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
|
||||
<el-form-item label="手机号码" prop="phone">
|
||||
<el-input v-model="state.queryParams.phone" placeholder="手机号码" clearable @keyup.enter.native="handleQuery(true)" />
|
||||
<el-form-item :label="$t('message.list.phoneNumber')" prop="phone">
|
||||
<el-input v-model="state.queryParams.phone" :placeholder="$t('message.list.phoneNumber')" clearable @keyup.enter.native="handleQuery(true)" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
</el-row>
|
||||
</el-form>
|
||||
|
||||
@ -36,37 +39,42 @@
|
||||
<el-row>
|
||||
<el-col>
|
||||
<el-button-group>
|
||||
<el-button type="primary" icon="ele-Search" @click="handleQuery(true)" v-auth="'sysUser/page'" :loading="options.loading"> 查询 </el-button>
|
||||
<el-button icon="ele-Refresh" @click="resetQuery" :loading="options.loading"> 重置 </el-button>
|
||||
<el-button type="primary" icon="ele-Search" @click="handleQuery(true)" v-auth="'sysUser/page'" :loading="options.loading"> {{ $t('message.list.query') }} </el-button>
|
||||
<el-button icon="ele-Refresh" @click="resetQuery" :loading="options.loading"> {{ $t('message.list.reset') }} </el-button>
|
||||
</el-button-group>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
</el-card>
|
||||
|
||||
<el-card class="full-table" shadow="hover" style="margin-top: 5px; flex: 1">
|
||||
<vxe-grid ref="xGrid" class="xGrid-style" v-bind="options" v-on="gridEvents">
|
||||
<template #toolbar_buttons>
|
||||
<el-button type="primary" icon="ele-Plus" @click="handleAdd" v-auth="'sysUser/add'"> 新增 </el-button>
|
||||
<el-button type="primary" icon="ele-Plus" @click="handleAdd" v-auth="'sysUser/add'"> {{ $t('message.list.add') }} </el-button>
|
||||
</template>
|
||||
<template #toolbar_tools> </template>
|
||||
<template #empty>
|
||||
|
||||
<el-empty :image-size="200" />
|
||||
</template>
|
||||
<template #row_avatar="{ row }">
|
||||
<!-- <template #row_avatar="{ row }">
|
||||
<el-avatar :src="row.avatar" size="small"> {{ row.nickName?.slice(0, 1) ?? row.realName?.slice(0, 1) }} </el-avatar>
|
||||
</template>
|
||||
</template> -->
|
||||
<template #row_sex="{ row }">
|
||||
<el-tag v-if="row.sex === 1" type="success">男</el-tag>
|
||||
<el-tag v-else-if="row.sex === 2" type="danger">女</el-tag>
|
||||
<el-tag v-else-if="row.sex === 0" type="info">未知</el-tag>
|
||||
<el-tag v-else-if="row.sex === 9" type="info">未说明</el-tag>
|
||||
<el-tag v-if="row.sex === 1" type="success"> {{ $t('message.list.male') }} </el-tag>
|
||||
<el-tag v-else-if="row.sex === 2" type="danger"> {{ $t('message.list.female') }} </el-tag>
|
||||
<el-tag v-else-if="row.sex === 0" type="info"> {{ $t('message.list.unknown') }} </el-tag>
|
||||
|
||||
<el-tag v-else-if="row.sex === 9" type="info"> {{ $t('message.list.unspecified') }} </el-tag>
|
||||
</template>
|
||||
<template #row_accountType="{ row }">
|
||||
<el-tag v-if="row.accountType === 888">系统管理员</el-tag>
|
||||
<el-tag v-else-if="row.accountType === 777">普通账号</el-tag>
|
||||
<el-tag v-else-if="row.accountType === 666">会员</el-tag>
|
||||
<el-tag v-else>其他</el-tag>
|
||||
<el-tag v-if="row.accountType === 888"> {{ $t('message.list.systemAdmin') }} </el-tag>
|
||||
|
||||
<el-tag v-else-if="row.accountType === 777"> {{ $t('message.list.normalAccount') }} </el-tag>
|
||||
<el-tag v-else-if="row.accountType === 666"> {{ $t('message.list.member') }} </el-tag>
|
||||
<el-tag v-else> {{ $t('message.list.other') }} </el-tag>
|
||||
</template>
|
||||
|
||||
<template #row_status="{ row }">
|
||||
<el-switch v-model="row.status" :active-value="1" :inactive-value="2" size="small" @change="changeStatus(row)" v-auth="'sysUser/setStatus'" />
|
||||
</template>
|
||||
@ -74,19 +82,21 @@
|
||||
<ModifyRecord :data="row" />
|
||||
</template>
|
||||
<template #row_buttons="{ row }">
|
||||
<el-tooltip content="编辑" placement="top">
|
||||
<el-tooltip :content="$t('message.list.edit')" placement="top">
|
||||
<el-button icon="ele-Edit" text type="primary" v-auth="'sysUser/update'" @click="handleEdit(row)"> </el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip content="删除" placement="top">
|
||||
<el-tooltip :content="$t('message.list.delete')" placement="top">
|
||||
<el-button icon="ele-Delete" text type="danger" v-auth="'sysUser/delete'" @click="handleDelete(row)"> </el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip content="复制" placement="top">
|
||||
<el-tooltip :content="$t('message.list.copy')" placement="top">
|
||||
<el-button icon="ele-CopyDocument" text type="primary" v-auth="'sysUser/add'" @click="openCopyMenu(row)"> </el-button>
|
||||
</el-tooltip>
|
||||
<el-button icon="ele-RefreshLeft" text type="danger" v-auth="'sysUser/resetPwd'" @click="resetQueryPwd(row)">重置密码</el-button>
|
||||
<el-button icon="ele-Unlock" text type="primary" v-auth="'sysUser/unlockLogin'" @click="handleUnlock(row)">解除锁定</el-button>
|
||||
|
||||
<el-button icon="ele-RefreshLeft" text type="danger" v-auth="'sysUser/resetPwd'" @click="resetQueryPwd(row)">{{ $t('message.list.resetPassword') }}</el-button>
|
||||
<el-button icon="ele-Unlock" text type="primary" v-auth="'sysUser/unlockLogin'" @click="handleUnlock(row)">{{ $t('message.list.unlockAccount') }}</el-button>
|
||||
</template>
|
||||
</vxe-grid>
|
||||
|
||||
</el-card>
|
||||
</pane>
|
||||
</splitpanes>
|
||||
@ -112,6 +122,9 @@ import ModifyRecord from '/@/components/table/modifyRecord.vue';
|
||||
import { getAPI } from '/@/utils/axios-utils';
|
||||
import { SysUserApi, SysOrgApi } from '/@/api-services/api';
|
||||
import { SysOrg, PageTenantInput, UserOutput, UpdateUserInput } from '/@/api-services/models';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
const xGrid = ref<VxeGridInstance>();
|
||||
// const treeRef = ref<InstanceType<typeof OrgTree>>();
|
||||
@ -139,25 +152,32 @@ const localPageParamKey = 'localPageParam:sysUser';
|
||||
const options = useVxeTable<UserOutput>(
|
||||
{
|
||||
id: 'sysUser',
|
||||
name: '账号',
|
||||
name: t('message.list.account'),
|
||||
columns: [
|
||||
// { type: 'checkbox', width: 40, fixed: 'left' },
|
||||
{ field: 'seq', type: 'seq', title: '序号', width: 60, fixed: 'left' },
|
||||
{ field: 'avatar', title: '头像', minWidth: 80, showOverflow: 'tooltip', slots: { default: 'row_avatar' } },
|
||||
{ field: 'account', title: '账号', minWidth: 120, showOverflow: 'tooltip' },
|
||||
{ field: 'nickName', title: '昵称', minWidth: 120, showOverflow: 'tooltip' },
|
||||
{ field: 'realName', title: '姓名', minWidth: 120, showOverflow: 'tooltip' },
|
||||
{ field: 'phone', title: '手机号码', minWidth: 120, showOverflow: 'tooltip' },
|
||||
{ field: 'birthday', title: '出生日期', minWidth: 100, showOverflow: 'tooltip', formatter: ({ cellValue }: any) => XEUtils.toDateString(cellValue, 'yyyy-MM-dd') },
|
||||
{ field: 'sex', title: '性别', minWidth: 70, showOverflow: 'tooltip', slots: { default: 'row_sex' } },
|
||||
{ field: 'accountType', title: '账号类型', minWidth: 100, showOverflow: 'tooltip', slots: { default: 'row_accountType' } },
|
||||
{ field: 'roleName', title: '角色集合', minWidth: 130, showOverflow: 'tooltip' },
|
||||
{ field: 'orgName', title: '所属机构', minWidth: 120, showOverflow: 'tooltip' },
|
||||
{ field: 'posName', title: '职位名称', minWidth: 120, showOverflow: 'tooltip' },
|
||||
{ field: 'status', title: '状态', width: 80, showOverflow: 'tooltip', slots: { default: 'row_status' } },
|
||||
{ field: 'orderNo', title: '排序', width: 80, showOverflow: 'tooltip' },
|
||||
{ field: 'record', title: '修改记录', width: 100, showOverflow: 'tooltip', slots: { default: 'row_record' } },
|
||||
{ field: 'buttons', title: '操作', fixed: 'right', width: 300, showOverflow: true, slots: { default: 'row_buttons' } },
|
||||
{ field: 'seq', type: 'seq', title: t('message.list.seq'), width: 60, fixed: 'left' },
|
||||
|
||||
// { field: 'avatar', title: t('message.list.avatar'), minWidth: 80, showOverflow: 'tooltip', slots: { default: 'row_avatar' } },
|
||||
{ field: 'account', title: t('message.list.account'), minWidth: 120, showOverflow: 'tooltip' },
|
||||
{ field: 'nickName', title: t('message.list.nickname'), minWidth: 120, showOverflow: 'tooltip' },
|
||||
|
||||
{ field: 'realName', title: t('message.list.realName'), minWidth: 120, showOverflow: 'tooltip' },
|
||||
{ field: 'phone', title: t('message.list.phoneNumber'), minWidth: 120, showOverflow: 'tooltip' },
|
||||
|
||||
{ field: 'birthday', title: t('message.list.birthDate'), minWidth: 100, showOverflow: 'tooltip', formatter: ({ cellValue }: any) => XEUtils.toDateString(cellValue, 'yyyy-MM-dd') },
|
||||
{ field: 'sex', title: t('message.list.gender'), minWidth: 70, showOverflow: 'tooltip', slots: { default: 'row_sex' } },
|
||||
|
||||
{ field: 'accountType', title: t('message.list.accountType'), minWidth: 100, showOverflow: 'tooltip', slots: { default: 'row_accountType' } },
|
||||
{ field: 'roleName', title: t('message.list.roleSet'), minWidth: 130, showOverflow: 'tooltip' },
|
||||
{ field: 'orgName', title: t('message.list.organization'), minWidth: 120, showOverflow: 'tooltip' },
|
||||
|
||||
{ field: 'posName', title: t('message.list.jobTitle'), minWidth: 120, showOverflow: 'tooltip' },
|
||||
{ field: 'status', title: t('message.list.status'), width: 80, showOverflow: 'tooltip', slots: { default: 'row_status' } },
|
||||
{ field: 'orderNo', title: t('message.list.orderNo'), width: 80, showOverflow: 'tooltip' },
|
||||
|
||||
{ field: 'record', title: t('message.list.record'), width: 100, showOverflow: 'tooltip', slots: { default: 'row_record' } },
|
||||
{ field: 'buttons', title: t('message.list.operation'), fixed: 'right', width: 300, showOverflow: true, slots: { default: 'row_buttons' } },
|
||||
|
||||
],
|
||||
},
|
||||
// vxeGrid配置参数(此处可覆写任何参数),参考vxe-table官方文档
|
||||
@ -216,38 +236,42 @@ const fetchOrgData = async () => {
|
||||
|
||||
// 打开新增页面
|
||||
const handleAdd = () => {
|
||||
state.title = '添加账号';
|
||||
state.title = t('message.list.addAccount');
|
||||
editUserRef.value?.openDialog({ id: undefined, birthday: '2000-01-01', sex: 1, orderNo: 100, cardType: 0, cultureLevel: 5 });
|
||||
};
|
||||
|
||||
// 打开编辑页面
|
||||
const handleEdit = (row: any) => {
|
||||
state.title = '编辑账号';
|
||||
state.title = t('message.list.editAccount');
|
||||
editUserRef.value?.openDialog(row);
|
||||
};
|
||||
|
||||
|
||||
// 打开复制页面
|
||||
const openCopyMenu = (row: any) => {
|
||||
state.title = '复制账号';
|
||||
state.title = t('message.list.copyAccount');
|
||||
var copyRow = JSON.parse(JSON.stringify(row)) as UpdateUserInput;
|
||||
copyRow.id = 0;
|
||||
copyRow.account = '';
|
||||
editUserRef.value?.openDialog(copyRow);
|
||||
};
|
||||
|
||||
|
||||
// 删除
|
||||
const handleDelete = (row: any) => {
|
||||
ElMessageBox.confirm(`确定删除账号:【${row.account}】?`, '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
ElMessageBox.confirm(t('message.list.confirmDeleteAccount', { account: row.account }), t('message.list.hint'), {
|
||||
confirmButtonText: t('message.list.confirmButtonText'),
|
||||
cancelButtonText: t('message.list.cancelButtonText'),
|
||||
type: 'warning',
|
||||
|
||||
})
|
||||
.then(async () => {
|
||||
await getAPI(SysUserApi).apiSysUserDeletePost({ id: row.id });
|
||||
await handleQuery();
|
||||
ElMessage.success('删除成功');
|
||||
ElMessage.success(t('message.list.successDelete'));
|
||||
})
|
||||
.catch(() => {});
|
||||
|
||||
};
|
||||
|
||||
// 表格事件
|
||||
@ -269,43 +293,51 @@ const changeStatus = (row: any) => {
|
||||
getAPI(SysUserApi)
|
||||
.apiSysUserSetStatusPost({ id: row.id, status: row.status })
|
||||
.then(() => {
|
||||
ElMessage.success('账号状态设置成功');
|
||||
ElMessage.success(t('message.list.accountStatusUpdateSuccess'));
|
||||
})
|
||||
.catch(() => {
|
||||
row.status = row.status == 1 ? 2 : 1;
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
// 重置密码
|
||||
const resetQueryPwd = async (row: any) => {
|
||||
ElMessageBox.confirm(`确定重置密码:【${row.account}】?`, '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
ElMessageBox.confirm(t('message.list.confirmResetPassword', { account: row.account }), t('message.list.hint'), {
|
||||
confirmButtonText: t('message.list.confirmButtonText'),
|
||||
cancelButtonText: t('message.list.cancelButtonText'),
|
||||
type: 'warning',
|
||||
|
||||
|
||||
|
||||
|
||||
})
|
||||
.then(async () => {
|
||||
await getAPI(SysUserApi)
|
||||
.apiSysUserResetPwdPost({ id: row.id })
|
||||
.then((res) => {
|
||||
ElMessage.success(`密码重置成功为:${res.data.result}`);
|
||||
ElMessage.success(t('message.list.passwordResetSuccess', { password: res.data.result }));
|
||||
});
|
||||
|
||||
})
|
||||
.catch(() => {});
|
||||
};
|
||||
|
||||
// 解除登录锁定
|
||||
const handleUnlock = async (row: any) => {
|
||||
ElMessageBox.confirm(`确定解除登录锁定:【${row.account}】?`, '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
ElMessageBox.confirm(t('message.list.confirmUnlockAccount', { account: row.account }), t('message.list.hint'), {
|
||||
confirmButtonText: t('message.list.confirmButtonText'),
|
||||
cancelButtonText: t('message.list.cancelButtonText'),
|
||||
type: 'warning',
|
||||
|
||||
})
|
||||
.then(async () => {
|
||||
await getAPI(SysUserApi)
|
||||
.apiSysUserUnlockLoginPost({ id: row.id })
|
||||
.then(() => {
|
||||
ElMessage.success('解除登录锁定成功');
|
||||
ElMessage.success(t('message.list.unlockSuccess'));
|
||||
});
|
||||
|
||||
})
|
||||
.catch(() => {});
|
||||
};
|
||||
|
||||
Loading…
Reference in New Issue
Block a user