refactor:账号管理国际化

This commit is contained in:
PZ688 2025-02-28 17:54:01 +08:00
parent 8fe5c89fdd
commit 1a39c1d3f0
5 changed files with 275 additions and 220 deletions

View File

@ -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();
}

View File

@ -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) {

View File

@ -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 }">

View File

@ -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);
};

View File

@ -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(() => {});
};