支持中文姓名生成英文姓名

This commit is contained in:
wangchengming 2025-09-27 20:47:35 +08:00
parent 7717a1b1a7
commit 6f2ea8a209
5 changed files with 147 additions and 76 deletions

View File

@ -34,6 +34,7 @@
"moment": "^2.30.1",
"nprogress": "0.2.0",
"pinia": "2.1.7",
"pinyin-pro": "^3.27.0",
"splitpanes": "3.1.5",
"tinymce": "^7.9.1",
"vue": "3.4.31",

View File

@ -70,7 +70,7 @@
</div>
</el-dialog>
<el-dialog :title="title" v-model="open" width="800px" append-to-body>
<el-form ref="postRef" :model="form" :rules="rules" label-width="160px">
<el-form ref="postRef" :model="form" :rules="rules" label-width="200px">
<el-form-item label="证书名称" prop="factoryArea">
<el-input v-model="form.qualificationName" disabled />
</el-form-item>

View File

@ -54,7 +54,7 @@
</div>
</el-dialog>
<el-dialog :title="title" v-model="open" width="800px" append-to-body>
<el-form ref="postRef" :model="form" :rules="rules" label-width="160px">
<el-form ref="postRef" :model="form" :rules="rules" label-width="200px">
<el-form-item label="证书名称" prop="factoryArea">
<el-input v-model="form.qualificationName" disabled />
</el-form-item>
@ -124,7 +124,7 @@ const hasFilesList = [
]
//
const handleCheckedHasFileChange = (value) => {
const handleCheckedHasFileChange = (value) => {
if (value.length > 0) {
//
checkedFs.value = true

View File

@ -35,7 +35,8 @@
<el-input v-model="registerForm.email"> </el-input>
</el-form-item>
<el-form-item label="中文姓名:" prop="nickName">
<el-input v-model="registerForm.nickName" @keyup.enter="convertToEnglishName"> </el-input>
<el-input v-model="registerForm.nickName" @input="handleInputNickName">
</el-input>
</el-form-item>
<el-form-item label="英文姓名:" prop="englishName">
<el-input v-model="registerForm.englishName"> </el-input>
@ -81,6 +82,7 @@ import systemlogo from '@/assets/logo/systemLogo.png'
import { getCustomerBusDependencyPage } from "@/api/system/dependency"
import { customerDeptTreeSelect } from "@/api/system/user"
import { getCustomerSysSectionPage } from "@/api/system/section"
import { pinyin } from 'pinyin-pro';
const router = useRouter()
const { proxy } = getCurrentInstance()
@ -99,6 +101,15 @@ const registerForm = ref({
escEmail: null,
isHasEmail: 1
})
const isCompoundSurname = ref(false);
//
const compoundSurnames = [
'欧阳', '司马', '上官', '诸葛', '司徒', '司空',
'夏侯', '皇甫', '慕容', '端木', '东方', '南宫',
'万俟', '闻人', '澹台', '公冶', '宗政', '濮阳',
'单于', '太史', '申屠', '公孙', '仲孙', '轩辕',
'令狐', '钟离', '宇文', '长孙', '鲜于', '闾丘'
];
const registerRules = {
isHasEmail: [{ required: true, message: "请选择是否有邮箱", trigger: ["change"] }],
@ -117,6 +128,11 @@ const registerRules = {
const handleInput = (value) => {
registerForm.value.username = value
}
//
const handleInputNickName = (value) => {
registerForm.value.nickName = value
convertToEnglishName()
}
//
const selectChanged = (value) => {
if (value) {
@ -184,49 +200,73 @@ const filterDisabledDept = (deptList) => {
return true
})
}
//
const capitalizeFirst = (str) => {
if (!str) return '';
return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
};
//
const detectCompoundSurname = (name) => {
for (const surname of compoundSurnames) {
if (name.startsWith(surname)) {
return surname;
}
}
return null;
};
//
const convertToEnglishName = () => {
if (!registerForm.value.nickName.trim()) {
registerForm.value.englishName = '';
isCompoundSurname.value = false;
return;
}
//
let name = form.value.nickName.trim();
try {
const name = registerForm.value.nickName.trim();
//
let isCompound = false;
let surnameParts = [];
//
const compoundSurname = detectCompoundSurname(name);
isCompoundSurname.value = compoundSurname !== null;
for (const sn of compoundSurnames) {
if (name.startsWith(sn)) {
isCompound = true;
surnameParts = [sn];
name = name.slice(sn.length);
break;
//
const pinyinArray = pinyin(name, {
toneType: 'none',
type: 'array'
});
if (pinyinArray.length === 0) {
registerForm.value.englishName = '转换失败';
return;
}
let lastNamePart, firstNamePart;
if (compoundSurname) {
// N
const surnameLength = compoundSurname.length;
lastNamePart = pinyinArray.slice(0, surnameLength).join('');
firstNamePart = pinyinArray.slice(surnameLength).join('');
} else {
//
lastNamePart = pinyinArray[0];
firstNamePart = pinyinArray.slice(1).join('');
}
//
const formattedLastName = capitalizeFirst(lastNamePart);
const formattedFirstName = firstNamePart
.split(' ')
.map(word => capitalizeFirst(word))
.join(' ');
//
registerForm.value.englishName = `${formattedLastName} ${formattedFirstName}`;
//
// registerForm.value.englishName = `${capitalizeFirst(formattedFirstName)} ${capitalizeFirst(formattedLastName)}`;
} catch (error) {
console.error('转换错误:', error);
registerForm.value.englishName = '转换失败,请检查输入';
}
//
if (!isCompound && name.length > 0) {
surnameParts = [name[0]];
name = name.slice(1);
}
//
const givenNameParts = name.split('');
// ()
const engSurname = surnameParts.join('').toUpperCase();
// ()
const engGivenName = givenNameParts
.map(char => char.charAt(0).toUpperCase() + char.slice(1).toLowerCase())
.join('');
//
registerForm.value.englishName = `${engSurname} ${engGivenName}`;
};
const handleRegister = () => {
@ -235,7 +275,6 @@ const handleRegister = () => {
loading.value = true
if (registerForm.value.isHasEmail == 0) registerForm.value.email = undefined
register(registerForm.value).then(res => {
console.log('注册结果', res)
const username = registerForm.value.username
const escName = registerForm.value.escUserName
const _email = registerForm.value.email

View File

@ -177,8 +177,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="中文姓名" prop="nickName">
<el-input v-model="form.nickName" placeholder="请输入中文姓名" maxlength="30"
@keyup.enter="convertToEnglishName" />
<el-input v-model="form.nickName" placeholder="请输入中文姓名" maxlength="30" @input="handleInputNickName" />
</el-form-item>
</el-col>
</el-row>
@ -329,6 +328,7 @@ import { getSysSectionPage } from "@/api/system/section"
import { getBusDependencyPage } from "@/api/system/dependency"
import { Splitpanes, Pane } from "splitpanes"
import "splitpanes/dist/splitpanes.css"
import { pinyin } from 'pinyin-pro';
const router = useRouter()
const appStore = useAppStore()
@ -376,12 +376,14 @@ const columns = ref([
{ key: 5, label: `状态`, visible: true },
{ key: 6, label: `创建时间`, visible: true }
])
//
const isCompoundSurname = ref(false);
//
const compoundSurnames = [
'欧阳', '太史', '端木', '上官', '司马',
'东方', '公孙', '尉迟', '公羊', '澹台',
'宗政', '濮阳', '闾丘', '子车', '亓官',
'南宫', '墨夷', '恰喇', '阏氏', '竺联'
'欧阳', '司马', '上官', '诸葛', '司徒', '司空',
'夏侯', '皇甫', '慕容', '端木', '东方', '南宫',
'万俟', '闻人', '澹台', '公冶', '宗政', '濮阳',
'单于', '太史', '申屠', '公孙', '仲孙', '轩辕',
'令狐', '钟离', '宇文', '长孙', '鲜于', '闾丘'
];
const validateRoles = (rule, value, callback) => {
console.log('选择值', value)
@ -425,6 +427,11 @@ const { queryParams, form, rules } = toRefs(data)
const handleInput = (value) => {
form.value.userName = value
}
//
const handleInputNickName = (value) => {
form.value.nickName = value
convertToEnglishName()
}
//
const sectionData = ref([])
//
@ -702,49 +709,73 @@ function submitForm() {
}
})
}
//
const capitalizeFirst = (str) => {
if (!str) return '';
return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
};
//
const detectCompoundSurname = (name) => {
for (const surname of compoundSurnames) {
if (name.startsWith(surname)) {
return surname;
}
}
return null;
};
//
const convertToEnglishName = () => {
if (!form.value.nickName.trim()) {
form.value.englishName = '';
isCompoundSurname.value = false;
return;
}
//
let name = form.value.nickName.trim();
try {
const name = form.value.nickName.trim();
//
let isCompound = false;
let surnameParts = [];
//
const compoundSurname = detectCompoundSurname(name);
isCompoundSurname.value = compoundSurname !== null;
for (const sn of compoundSurnames) {
if (name.startsWith(sn)) {
isCompound = true;
surnameParts = [sn];
name = name.slice(sn.length);
break;
//
const pinyinArray = pinyin(name, {
toneType: 'none',
type: 'array'
});
if (pinyinArray.length === 0) {
form.value.englishName = '转换失败';
return;
}
let lastNamePart, firstNamePart;
if (compoundSurname) {
// N
const surnameLength = compoundSurname.length;
lastNamePart = pinyinArray.slice(0, surnameLength).join('');
firstNamePart = pinyinArray.slice(surnameLength).join('');
} else {
//
lastNamePart = pinyinArray[0];
firstNamePart = pinyinArray.slice(1).join('');
}
//
const formattedLastName = capitalizeFirst(lastNamePart);
const formattedFirstName = firstNamePart
.split(' ')
.map(word => capitalizeFirst(word))
.join(' ');
//
form.value.englishName = `${formattedLastName} ${formattedFirstName}`;
//
// form.value.englishName = `${capitalizeFirst(formattedFirstName)} ${capitalizeFirst(formattedLastName)}`;
} catch (error) {
console.error('转换错误:', error);
form.value.englishName = '转换失败,请检查输入';
}
//
if (!isCompound && name.length > 0) {
surnameParts = [name[0]];
name = name.slice(1);
}
//
const givenNameParts = name.split('');
// ()
const engSurname = surnameParts.join('').toUpperCase();
// ()
const engGivenName = givenNameParts
.map(char => char.charAt(0).toUpperCase() + char.slice(1).toLowerCase())
.join('');
//
form.value.englishName = `${engSurname} ${engGivenName}`;
};
onMounted(() => {