用户提问功能模块的多语言;

国际化文件结构层级整理
This commit is contained in:
linxd
2025-06-18 15:21:40 +08:00
parent 5fff687782
commit cc6706b409
21 changed files with 918 additions and 671 deletions

View File

@ -1,4 +1,5 @@
// 用户问题管理字典
import { getLocale, getIntl } from 'umi';
// 问题回答状态枚举
export enum AnswerStatus {
@ -9,9 +10,9 @@ export enum AnswerStatus {
// 问题回答状态文本映射
export const AnswerStatusText = {
[AnswerStatus.UNREAD]: '未阅',
[AnswerStatus.READ]: '已阅',
[AnswerStatus.ANSWERED]: '已回答',
[AnswerStatus.UNREAD]: () => getIntl().formatMessage({ id: 'userQuestion.unread' }),
[AnswerStatus.READ]: () => getIntl().formatMessage({ id: 'userQuestion.read' }),
[AnswerStatus.ANSWERED]: () => getIntl().formatMessage({ id: 'userQuestion.answered' }),
};
// 问题回答状态标签颜色
@ -29,8 +30,8 @@ export enum PublishStatus {
// 发布状态文本映射
export const PublishStatusText = {
[PublishStatus.NO]: '未发布',
[PublishStatus.YES]: '已发布',
[PublishStatus.NO]: () => getIntl().formatMessage({ id: 'userQuestion.unpublished' }),
[PublishStatus.YES]: () => getIntl().formatMessage({ id: 'userQuestion.published' }),
};
// 发布状态标签颜色
@ -47,8 +48,8 @@ export enum TopStatus {
// 置顶状态文本映射
export const TopStatusText = {
[TopStatus.NO]: '未置顶',
[TopStatus.YES]: '已置顶',
[TopStatus.NO]: () => getIntl().formatMessage({ id: 'userQuestion.untop' }),
[TopStatus.YES]: () => getIntl().formatMessage({ id: 'userQuestion.top' }),
};
// 置顶状态标签颜色
@ -66,9 +67,9 @@ export enum ModalType {
// 问题分类选项
export const QuestionCategoryOptions = [
{ value: '招标流程', label: '招标流程' },
{ value: '投标指南', label: '投标指南' },
{ value: '注册指南', label: '注册指南' },
{ value: '系统操作', label: '系统操作' },
{ value: '其他问题', label: '其他问题' },
{ value: '招标流程', label: () => getIntl().formatMessage({ id: 'questionCategory.biddingProcess' }) },
{ value: '投标指南', label: () => getIntl().formatMessage({ id: 'questionCategory.biddingGuide' }) },
{ value: '注册指南', label: () => getIntl().formatMessage({ id: 'questionCategory.registrationGuide' }) },
{ value: '系统操作', label: () => getIntl().formatMessage({ id: 'questionCategory.systemOperation' }) },
{ value: '其他问题', label: () => getIntl().formatMessage({ id: 'questionCategory.otherIssues' }) },
];

View File

@ -1,215 +1,17 @@
import userQuestion from './en-US/userQuestion';
import register from './en-US/register';
import login from './en-US/login';
import helpCenter from './en-US/helpCenter';
import friendLink from './en-US/friendLink';
import about from './en-US/about';
import common from './en-US/common';
export default {
'menu.首页': 'Home',
'menu.管理员管理': 'Admin Management',
'menu.下载中心管理': 'Download Center Management',
'menu.通知中心管理': 'Notice Center Management',
'menu.政策法规管理': 'Policy Management',
'menu.关于我们管理': 'About Us Management',
'menu.帮助中心管理': 'Help Center Management',
'menu.用户提问管理': 'User Questions Management',
'menu.已阅问题': 'Read Questions',
'menu.未阅问题': 'Unread Questions',
'menu.友情链接管理': 'Friendly Links Management',
'menu.友情链接分类': 'Friendly Links Category',
'menu.友情链接列表': 'Friendly Links List',
// About page
'about.title': 'About Us',
'about.company.title': 'Company Profile',
'about.advantages.title': 'Platform Advantages',
'about.history.title': 'Development History',
'about.contact.title': 'Contact Us',
'about.address': 'Headquarters Address',
'about.phone': 'Phone',
'about.hotline': 'Service Hotline',
'about.email': 'Email',
'about.worktime': 'Working Hours',
'about.copyright': '© 2024 COSCO SHIPPING E-Bidding Platform. All Rights Reserved.',
"查看":"Info",
"采购需求公示":"Procurement Demand Announcement",
"招标采购公告":"Bidding Procurement Announcement",
"非招标采购公告":"Non-bidding Procurement Announcement",
"资格预审公告":"Pre-qualification Announcement",
"招募公告":"Recruitment Announcement",
"变更公告":"Change Announcement",
"中标(中选)候选人公示":"Bid Winner Candidate Announcement",
"中标(中选)结果公示":"Bid Result Announcement",
"采购失败(流标)公告":"Failed Procurement Announcement",
"加载更多":"Load More",
"登录/注册":"Login/Register",
// Login page
"login.title": "E-Bidding Platform",
"login.tab.supplier": "Supplier",
"login.tab.expert": "Expert",
"login.tab.agent": "Bidding Agent",
"login.username.placeholder": "Please enter username",
"login.password.placeholder": "Please enter password",
"login.remember": "Remember me",
"login.forgot": "Forgot password?",
"login.button": "Login",
"login.register.tip": "Don't have an account?",
"login.register.action": "Register now",
"login.back.home": "Back to home",
// Registration common text
"register.submit": "Complete Registration",
"register.hasAccount": "Already have an account?",
"register.login": "Login now",
// Username and password common text
"register.username.label": "Username",
"register.username.placeholder": "Please enter username",
"register.username.required": "Please enter username",
"register.username.min": "Username must be at least 4 characters",
"register.password.label": "Password",
"register.password.placeholder": "Please enter password (6-16 characters with letters and numbers)",
"register.password.required": "Please enter password",
"register.password.min": "Password must be at least 6 characters",
"register.password.pattern": "Password must be 6-16 characters with letters and numbers",
"register.confirmPassword.label": "Confirm Password",
"register.confirmPassword.placeholder": "Please confirm password, must match the password above",
"register.confirmPassword.required": "Please confirm password",
"register.confirmPassword.notMatch": "The two passwords do not match",
"register.phone.label": "Phone Number",
"register.phone.placeholder": "Please enter phone number",
"register.phone.required": "Please enter phone number",
"register.phone.invalid": "Please enter a valid phone number",
"register.email.label": "Email",
"register.email.placeholder": "Please enter email",
"register.email.required": "Please enter email",
"register.email.invalid": "Please enter a valid email",
"register.captcha.label": "SMS Verification Code",
"register.captcha.placeholder": "Please enter verification code",
"register.captcha.required": "Please enter verification code",
"register.captcha.get": "Get Code",
// Supplier registration text
"register.supplier.title": "Supplier Registration",
"register.supplier.companyName.label": "Company Name",
"register.supplier.companyName.placeholder": "Please enter company name",
"register.supplier.companyName.required": "Please enter company name",
"register.supplier.contactPerson.label": "Contact Person",
"register.supplier.contactPerson.placeholder": "Please enter contact person",
"register.supplier.contactPerson.required": "Please enter contact person",
// Expert registration text
"register.expert.title": "Expert Registration",
"register.expert.idType.label": "ID Type",
"register.expert.idType.placeholder": "Please select ID type",
"register.expert.idType.required": "Please select ID type",
"register.expert.idCard.label": "ID Number",
"register.expert.idCard.placeholder": "Please enter ID number",
"register.expert.idCard.required": "Please enter ID number",
// Help Center Management
'helpCenter.title': 'Help Center Management',
'helpCenter.question': 'Question',
'helpCenter.category': 'Category',
'helpCenter.createTime': 'Create Time',
'helpCenter.updateTime': 'Update Time',
'helpCenter.status': 'Status',
'helpCenter.operation': 'Operation',
'helpCenter.edit': 'Edit',
'helpCenter.delete': 'Delete',
'helpCenter.add': 'Add',
'helpCenter.search': 'Search',
'helpCenter.all': 'All',
'helpCenter.published': 'Published',
'helpCenter.unpublished': 'Unpublished',
'helpCenter.draft': 'Draft',
'helpCenter.publish': 'Publish',
'helpCenter.unpublish': 'Unpublish',
'helpCenter.confirmDelete': 'Are you sure you want to delete this help item?',
'helpCenter.batchDelete': 'Are you sure you want to delete selected help items?',
// User Questions Management page
'userQuestion.title': 'User Questions Management',
'userQuestion.user': 'User',
'userQuestion.question': 'Question',
'userQuestion.answer': 'Answer',
'userQuestion.createTime': 'Asked At',
'userQuestion.status': 'Status',
'userQuestion.operation': 'Operation',
'userQuestion.unanswered': 'Unanswered',
'userQuestion.answered': 'Answered',
'userQuestion.reply': 'Reply',
'userQuestion.view': 'View',
'userQuestion.viewAll': 'View All',
'userQuestion.confirmDelete': 'Are you sure you want to delete this question?',
'userQuestion.batchDelete': 'Are you sure you want to delete the selected questions?',
'userQuestion.description': 'User Questions Management Instructions',
'userQuestion.descriptionText': 'The User Questions Management module is used to process questions submitted by users on the platform. Read questions are questions that have been replied to, and unread questions are questions waiting to be replied to. You can click on the respective card to enter the corresponding management page.',
'userQuestion.deleteSuccess': 'Successfully deleted',
'userQuestion.deleteFailed': 'Failed to delete',
'userQuestion.replySuccess': 'Successfully replied',
'userQuestion.replyFailed': 'Failed to reply',
'userQuestion.selectRequired': 'Please select at least one item',
'userQuestion.batchDeleteConfirm': 'This action cannot be undone. Are you sure you want to continue?',
// Read Questions page
'readQuestion.title': 'Read Questions Management',
'readQuestion.user': 'Username',
'readQuestion.question': 'Question Content',
'readQuestion.answer': 'Reply Content',
'readQuestion.createTime': 'Asked Time',
'readQuestion.answerTime': 'Reply Time',
'readQuestion.status': 'Status',
'readQuestion.operation': 'Operation',
'readQuestion.view': 'View Details',
'readQuestion.delete': 'Delete',
'readQuestion.search': 'Search',
'readQuestion.reset': 'Reset',
'readQuestion.confirmDelete': 'Are you sure you want to delete this question?',
'readQuestion.batchDelete': 'Are you sure you want to delete the selected questions?',
'readQuestion.viewDetails': 'View Question Details',
'readQuestion.questionDetails': 'Question Details',
'readQuestion.answerDetails': 'Reply Details',
'readQuestion.close': 'Close',
'readQuestion.deleteSuccess': 'Successfully deleted',
'readQuestion.deleteFailed': 'Failed to delete',
'readQuestion.selectRequired': 'Please select at least one item',
'readQuestion.batchDeleteConfirm': 'This action cannot be undone. Are you sure you want to continue?',
'readQuestion.questionPlaceholder': 'Please enter question keywords',
'readQuestion.fetchFailed': 'Failed to fetch answered questions',
// Unread Questions page
'unreadQuestion.title': 'Unread Questions Management',
'unreadQuestion.user': 'Username',
'unreadQuestion.question': 'Question Content',
'unreadQuestion.createTime': 'Asked Time',
'unreadQuestion.status': 'Status',
'unreadQuestion.operation': 'Operation',
'unreadQuestion.reply': 'Reply',
'unreadQuestion.delete': 'Delete',
'unreadQuestion.search': 'Search',
'unreadQuestion.reset': 'Reset',
'unreadQuestion.confirmDelete': 'Are you sure you want to delete this question?',
'unreadQuestion.batchDelete': 'Are you sure you want to delete the selected questions?',
'unreadQuestion.replyModal': 'Reply to Question',
'unreadQuestion.questionContent': 'Question Content',
'unreadQuestion.answerContent': 'Reply Content',
'unreadQuestion.answerPlaceholder': 'Please enter your reply...',
'unreadQuestion.submit': 'Submit',
'unreadQuestion.cancel': 'Cancel',
'unreadQuestion.answerRequired': 'Please enter reply content',
'unreadQuestion.selectRequired': 'Please select at least one item',
'unreadQuestion.batchDeleteConfirm': 'This action cannot be undone. Are you sure you want to continue?',
'unreadQuestion.questionPlaceholder': 'Please enter question keywords',
'unreadQuestion.fetchFailed': 'Failed to fetch unanswered questions',
// Friendly Links Management page
'friendLink.title': 'Friendly Links Management',
'friendLink.name': 'Name',
'friendLink.url': 'URL',
'friendLink.logo': 'Logo',
'friendLink.sort': 'Sort Order',
'friendLink.status': 'Status',
'friendLink.operation': 'Operation',
'friendLink.add': 'Add Link',
'friendLink.edit': 'Edit Link',
'friendLink.delete': 'Delete Link',
'friendLink.enabled': 'Enabled',
'friendLink.disabled': 'Disabled'
...common,
...userQuestion,
...register,
...login,
...helpCenter,
...friendLink,
...about,
};

View File

@ -0,0 +1,14 @@
export default {
// About page
'about.title': 'About Us',
'about.company.title': 'Company Profile',
'about.advantages.title': 'Platform Advantages',
'about.history.title': 'Development History',
'about.contact.title': 'Contact Us',
'about.address': 'Headquarters Address',
'about.phone': 'Phone',
'about.hotline': 'Service Hotline',
'about.email': 'Email',
'about.worktime': 'Working Hours',
'about.copyright': '© 2024 COSCO SHIPPING E-Bidding Platform. All Rights Reserved.',
};

View File

@ -0,0 +1,30 @@
export default {
// Menu
'menu.首页': 'Home',
'menu.管理员管理': 'Admin Management',
'menu.下载中心管理': 'Download Center Management',
'menu.通知中心管理': 'Notice Center Management',
'menu.政策法规管理': 'Policy Management',
'menu.关于我们管理': 'About Us Management',
'menu.帮助中心管理': 'Help Center Management',
'menu.用户提问管理': 'User Questions Management',
'menu.已阅问题': 'Read Questions',
'menu.未阅问题': 'Unread Questions',
'menu.友情链接管理': 'Friendly Links Management',
'menu.友情链接分类': 'Friendly Links Category',
'menu.友情链接列表': 'Friendly Links List',
// Common Text
"查看": "Info",
"采购需求公示": "Procurement Demand Announcement",
"招标采购公告": "Bidding Procurement Announcement",
"非招标采购公告": "Non-bidding Procurement Announcement",
"资格预审公告": "Pre-qualification Announcement",
"招募公告": "Recruitment Announcement",
"变更公告": "Change Announcement",
"中标(中选)候选人公示": "Bid Winner Candidate Announcement",
"中标(中选)结果公示": "Bid Result Announcement",
"采购失败(流标)公告": "Failed Procurement Announcement",
"加载更多": "Load More",
"登录/注册": "Login/Register",
};

View File

@ -0,0 +1,15 @@
export default {
// Friendly Links Management page
'friendLink.title': 'Friendly Links Management',
'friendLink.name': 'Name',
'friendLink.url': 'URL',
'friendLink.logo': 'Logo',
'friendLink.sort': 'Sort Order',
'friendLink.status': 'Status',
'friendLink.operation': 'Operation',
'friendLink.add': 'Add Link',
'friendLink.edit': 'Edit Link',
'friendLink.delete': 'Delete Link',
'friendLink.enabled': 'Enabled',
'friendLink.disabled': 'Disabled',
};

View File

@ -0,0 +1,22 @@
export default {
// Help Center Management
'helpCenter.title': 'Help Center Management',
'helpCenter.question': 'Question',
'helpCenter.category': 'Category',
'helpCenter.createTime': 'Create Time',
'helpCenter.updateTime': 'Update Time',
'helpCenter.status': 'Status',
'helpCenter.operation': 'Operation',
'helpCenter.edit': 'Edit',
'helpCenter.delete': 'Delete',
'helpCenter.add': 'Add',
'helpCenter.search': 'Search',
'helpCenter.all': 'All',
'helpCenter.published': 'Published',
'helpCenter.unpublished': 'Unpublished',
'helpCenter.draft': 'Draft',
'helpCenter.publish': 'Publish',
'helpCenter.unpublish': 'Unpublish',
'helpCenter.confirmDelete': 'Are you sure you want to delete this help item?',
'helpCenter.batchDelete': 'Are you sure you want to delete selected help items?',
};

View File

@ -0,0 +1,15 @@
export default {
// Login page
"login.title": "E-Bidding Platform",
"login.tab.supplier": "Supplier",
"login.tab.expert": "Expert",
"login.tab.agent": "Bidding Agent",
"login.username.placeholder": "Please enter username",
"login.password.placeholder": "Please enter password",
"login.remember": "Remember me",
"login.forgot": "Forgot password?",
"login.button": "Login",
"login.register.tip": "Don't have an account?",
"login.register.action": "Register now",
"login.back.home": "Back to home",
};

View File

@ -0,0 +1,51 @@
export default {
// Registration common text
"register.submit": "Complete Registration",
"register.hasAccount": "Already have an account?",
"register.login": "Login now",
// Username and password common text
"register.username.label": "Username",
"register.username.placeholder": "Please enter username",
"register.username.required": "Please enter username",
"register.username.min": "Username must be at least 4 characters",
"register.password.label": "Password",
"register.password.placeholder": "Please enter password (6-16 characters with letters and numbers)",
"register.password.required": "Please enter password",
"register.password.min": "Password must be at least 6 characters",
"register.password.pattern": "Password must be 6-16 characters with letters and numbers",
"register.confirmPassword.label": "Confirm Password",
"register.confirmPassword.placeholder": "Please confirm password, must match the password above",
"register.confirmPassword.required": "Please confirm password",
"register.confirmPassword.notMatch": "The two passwords do not match",
"register.phone.label": "Phone Number",
"register.phone.placeholder": "Please enter phone number",
"register.phone.required": "Please enter phone number",
"register.phone.invalid": "Please enter a valid phone number",
"register.email.label": "Email",
"register.email.placeholder": "Please enter email",
"register.email.required": "Please enter email",
"register.email.invalid": "Please enter a valid email",
"register.captcha.label": "SMS Verification Code",
"register.captcha.placeholder": "Please enter verification code",
"register.captcha.required": "Please enter verification code",
"register.captcha.get": "Get Code",
// Supplier registration text
"register.supplier.title": "Supplier Registration",
"register.supplier.companyName.label": "Company Name",
"register.supplier.companyName.placeholder": "Please enter company name",
"register.supplier.companyName.required": "Please enter company name",
"register.supplier.contactPerson.label": "Contact Person",
"register.supplier.contactPerson.placeholder": "Please enter contact person",
"register.supplier.contactPerson.required": "Please enter contact person",
// Expert registration text
"register.expert.title": "Expert Registration",
"register.expert.idType.label": "ID Type",
"register.expert.idType.placeholder": "Please select ID type",
"register.expert.idType.required": "Please select ID type",
"register.expert.idCard.label": "ID Number",
"register.expert.idCard.placeholder": "Please enter ID number",
"register.expert.idCard.required": "Please enter ID number",
};

View File

@ -0,0 +1,161 @@
export default {
// User Questions Management page
'userQuestion.title': 'User Questions Management',
'userQuestion.user': 'User',
'userQuestion.question': 'Question',
'userQuestion.answer': 'Answer',
'userQuestion.createTime': 'Asked At',
'userQuestion.status': 'Status',
'userQuestion.operation': 'Operation',
'userQuestion.unanswered': 'Unanswered',
'userQuestion.answered': 'Answered',
'userQuestion.reply': 'Reply',
'userQuestion.view': 'View',
'userQuestion.viewAll': 'View All',
'userQuestion.confirmDelete': 'Are you sure you want to delete this question?',
'userQuestion.batchDelete': 'Are you sure you want to delete the selected questions?',
'userQuestion.description': 'User Questions Management Instructions',
'userQuestion.descriptionText': 'The User Questions Management module is used to process questions submitted by users on the platform. Read questions are questions that have been replied to, and unread questions are questions waiting to be replied to. You can click on the respective card to enter the corresponding management page.',
'userQuestion.deleteSuccess': 'Successfully deleted',
'userQuestion.deleteFailed': 'Failed to delete',
'userQuestion.replySuccess': 'Successfully replied',
'userQuestion.replyFailed': 'Failed to reply',
'userQuestion.selectRequired': 'Please select at least one item',
'userQuestion.batchDeleteConfirm': 'This action cannot be undone. Are you sure you want to continue?',
'userQuestion.unread': 'Unread',
'userQuestion.read': 'Read',
'userQuestion.delete': 'Delete',
'userQuestion.edit': 'Edit Answer',
'userQuestion.editSuccess': 'Successfully edited',
'userQuestion.editFailed': 'Failed to edit',
'userQuestion.publishStatus': 'Publish Status',
'userQuestion.topStatus': 'Top Status',
'userQuestion.published': 'Published',
'userQuestion.unpublished': 'Unpublished',
'userQuestion.top': 'Topped',
'userQuestion.untop': 'Not Topped',
'userQuestion.submitAnswer': 'Submit Answer',
'userQuestion.saveEdit': 'Save Changes',
'userQuestion.confirmSubmit': 'Confirm Submit Answer',
'userQuestion.confirmEdit': 'Confirm Save Changes',
'userQuestion.submitConfirmText': 'Are you sure you want to submit this answer? After submission, the status will change to answered.',
'userQuestion.editConfirmText': 'Are you sure you want to save changes to this answer?',
// Question Categories
'questionCategory.biddingProcess': 'Bidding Process',
'questionCategory.biddingGuide': 'Bidding Guide',
'questionCategory.registrationGuide': 'Registration Guide',
'questionCategory.systemOperation': 'System Operation',
'questionCategory.otherIssues': 'Other Issues',
// Read Questions page
'readQuestion.title': 'Read Questions Management',
'readQuestion.user': 'Username',
'readQuestion.question': 'Question Content',
'readQuestion.answer': 'Reply Content',
'readQuestion.createTime': 'Asked Time',
'readQuestion.answerTime': 'Reply Time',
'readQuestion.status': 'Status',
'readQuestion.operation': 'Operation',
'readQuestion.view': 'View Details',
'readQuestion.delete': 'Delete',
'readQuestion.search': 'Search',
'readQuestion.reset': 'Reset',
'readQuestion.confirmDelete': 'Are you sure you want to delete this question?',
'readQuestion.batchDelete': 'Delete Selected',
'readQuestion.viewDetails': 'View Question Details',
'readQuestion.questionDetails': 'Question Details',
'readQuestion.answerDetails': 'Reply Details',
'readQuestion.close': 'Close',
'readQuestion.deleteSuccess': 'Successfully deleted',
'readQuestion.deleteFailed': 'Failed to delete',
'readQuestion.selectRequired': 'Please select at least one item',
'readQuestion.batchDeleteConfirm': 'This action cannot be undone. Are you sure you want to continue?',
'readQuestion.questionPlaceholder': 'Please enter question keywords',
'readQuestion.fetchFailed': 'Failed to fetch answered questions',
'readQuestion.edit': 'Edit Answer',
'readQuestion.serialNumber': 'No.',
'readQuestion.questionTitle': 'Question Title',
'readQuestion.category': 'Category',
'readQuestion.asker': 'Asker',
'readQuestion.company': 'Company',
'readQuestion.account': 'Account',
'readQuestion.contact': 'Contact',
'readQuestion.email': 'Email',
'readQuestion.askTime': 'Asked At',
'readQuestion.respondent': 'Respondent',
'readQuestion.answerStatus': 'Answer Status',
'readQuestion.confirm': 'Confirm',
'readQuestion.cancel': 'Cancel',
'readQuestion.batchDeleteSuccess': 'Batch delete successful',
'readQuestion.batchDeleteFailed': 'Batch delete failed',
'readQuestion.selectedCount': 'Selected {count} items',
// Unread Questions page
'unreadQuestion.title': 'Unread Questions Management',
'unreadQuestion.user': 'Username',
'unreadQuestion.question': 'Question Content',
'unreadQuestion.createTime': 'Asked Time',
'unreadQuestion.status': 'Status',
'unreadQuestion.operation': 'Operation',
'unreadQuestion.reply': 'Answer',
'unreadQuestion.delete': 'Delete',
'unreadQuestion.search': 'Search',
'unreadQuestion.reset': 'Reset',
'unreadQuestion.confirmDelete': 'Are you sure you want to delete this question?',
'unreadQuestion.batchDelete': 'Delete Selected',
'unreadQuestion.replyModal': 'Reply to Question',
'unreadQuestion.questionContent': 'Question Content',
'unreadQuestion.answerContent': 'Reply Content',
'unreadQuestion.answerPlaceholder': 'Please enter your reply...',
'unreadQuestion.submit': 'Submit',
'unreadQuestion.cancel': 'Cancel',
'unreadQuestion.answerRequired': 'Please enter reply content',
'unreadQuestion.selectRequired': 'Please select at least one item',
'unreadQuestion.batchDeleteConfirm': 'This action cannot be undone. Are you sure you want to continue?',
'unreadQuestion.questionPlaceholder': 'Please enter question keywords',
'unreadQuestion.fetchFailed': 'Failed to fetch unanswered questions',
'unreadQuestion.serialNumber': 'No.',
'unreadQuestion.questionTitle': 'Question Title',
'unreadQuestion.category': 'Category',
'unreadQuestion.asker': 'Asker',
'unreadQuestion.company': 'Company',
'unreadQuestion.account': 'Account',
'unreadQuestion.contact': 'Contact',
'unreadQuestion.email': 'Email',
'unreadQuestion.askTime': 'Asked At',
'unreadQuestion.batchDeleteSuccess': 'Batch delete successful',
'unreadQuestion.batchDeleteFailed': 'Batch delete failed',
'unreadQuestion.selectedCount': 'Selected {count} items',
// Question Detail Component
'questionDetail.title': 'Title',
'questionDetail.category': 'Category',
'questionDetail.askTime': 'Asked Time',
'questionDetail.asker': 'Asker',
'questionDetail.company': 'Company Name',
'questionDetail.account': 'Account',
'questionDetail.contact': 'Contact',
'questionDetail.email': 'Email',
'questionDetail.publishStatus': 'Publish Status',
'questionDetail.topStatus': 'Top Status',
'questionDetail.answerTime': 'Answer Time',
'questionDetail.respondent': 'Respondent',
'questionDetail.questionContent': 'Question Content',
'questionDetail.answerContent': 'Answer Content',
// Question Modal Component
'questionModal.answer': 'Answer Question',
'questionModal.edit': 'Edit Answer',
'questionModal.view': 'Question Details',
'questionModal.publishSwitch': 'Publish',
'questionModal.topSwitch': 'Top',
'questionModal.confirmSubmit': 'Confirm Submit',
'questionModal.confirmEdit': 'Confirm Edit',
'questionModal.close': 'Close',
'questionModal.answerRequired': 'Please enter answer content',
'questionModal.answerSuccess': 'Answer submitted successfully',
'questionModal.answerFailed': 'Failed to submit answer',
'questionModal.editSuccess': 'Edit successful',
'questionModal.editFailed': 'Edit failed',
};

View File

@ -1,216 +1,17 @@
import userQuestion from './zh-CN/userQuestion';
import register from './zh-CN/register';
import login from './zh-CN/login';
import helpCenter from './zh-CN/helpCenter';
import friendLink from './zh-CN/friendLink';
import about from './zh-CN/about';
import common from './zh-CN/common';
export default {
'menu.首页': '首页',
'menu.管理员管理': '管理员管理',
'menu.下载中心管理': '下载中心管理',
'menu.通知中心管理': '通知中心管理',
'menu.政策法规管理': '政策法规管理',
'menu.关于我们管理': '关于我们管理',
'menu.帮助中心管理': '帮助中心管理',
'menu.用户提问管理': '用户提问管理',
'menu.已阅问题': '已阅问题',
'menu.未阅问题': '未阅问题',
'menu.友情链接管理': '友情链接管理',
'menu.友情链接分类': '友情链接分类',
'menu.友情链接列表': '友情链接列表',
// 帮助中心页面
'helpCenter.title': '帮助中心管理',
'helpCenter.question': '问题',
'helpCenter.category': '问题类型',
'helpCenter.createTime': '创建时间',
'helpCenter.updateTime': '更新时间',
'helpCenter.status': '状态',
'helpCenter.operation': '操作',
'helpCenter.edit': '编辑',
'helpCenter.delete': '删除',
'helpCenter.add': '新增',
'helpCenter.search': '搜索',
'helpCenter.all': '全部',
'helpCenter.published': '已发布',
'helpCenter.unpublished': '未发布',
'helpCenter.draft': '草稿',
'helpCenter.publish': '发布',
'helpCenter.unpublish': '下架',
'helpCenter.confirmDelete': '确定要删除该帮助吗?',
'helpCenter.batchDelete': '确定要批量删除选中的帮助吗?',
// 用户提问管理页面
'userQuestion.title': '用户提问管理',
'userQuestion.user': '用户',
'userQuestion.question': '问题',
'userQuestion.answer': '回答',
'userQuestion.createTime': '提问时间',
'userQuestion.status': '状态',
'userQuestion.operation': '操作',
'userQuestion.unanswered': '未回答',
'userQuestion.answered': '已回答',
'userQuestion.reply': '回复',
'userQuestion.view': '查看',
'userQuestion.viewAll': '查看全部',
'userQuestion.confirmDelete': '确定要删除该问题吗?',
'userQuestion.batchDelete': '确定要批量删除选中的问题吗?',
'userQuestion.description': '用户提问管理说明',
'userQuestion.descriptionText': '用户提问管理模块用于处理用户在平台上提交的问题。已阅问题为已回复的问题,未阅问题为待回复的问题。您可以点击相应的卡片进入对应的管理页面。',
'userQuestion.deleteSuccess': '删除成功',
'userQuestion.deleteFailed': '删除失败',
'userQuestion.replySuccess': '回复成功',
'userQuestion.replyFailed': '回复失败',
'userQuestion.selectRequired': '请至少选择一项',
'userQuestion.batchDeleteConfirm': '删除后无法恢复,确定要继续吗?',
// 已阅问题页面
'readQuestion.title': '已阅问题管理',
'readQuestion.user': '用户名',
'readQuestion.question': '问题内容',
'readQuestion.answer': '回复内容',
'readQuestion.createTime': '提问时间',
'readQuestion.answerTime': '回复时间',
'readQuestion.status': '状态',
'readQuestion.operation': '操作',
'readQuestion.view': '查看详情',
'readQuestion.delete': '删除',
'readQuestion.search': '搜索',
'readQuestion.reset': '重置',
'readQuestion.confirmDelete': '确定要删除该问题吗?',
'readQuestion.batchDelete': '确定要批量删除选中的问题吗?',
'readQuestion.viewDetails': '查看问题详情',
'readQuestion.questionDetails': '问题详情',
'readQuestion.answerDetails': '回复详情',
'readQuestion.close': '关闭',
'readQuestion.deleteSuccess': '删除成功',
'readQuestion.deleteFailed': '删除失败',
'readQuestion.selectRequired': '请至少选择一项',
'readQuestion.batchDeleteConfirm': '删除后无法恢复,确定要继续吗?',
'readQuestion.questionPlaceholder': '请输入问题关键词',
'readQuestion.fetchFailed': '获取已回答问题列表失败',
// 未阅问题页面
'unreadQuestion.title': '未阅问题管理',
'unreadQuestion.user': '用户名',
'unreadQuestion.question': '问题内容',
'unreadQuestion.createTime': '提问时间',
'unreadQuestion.status': '状态',
'unreadQuestion.operation': '操作',
'unreadQuestion.reply': '回复',
'unreadQuestion.delete': '删除',
'unreadQuestion.search': '搜索',
'unreadQuestion.reset': '重置',
'unreadQuestion.confirmDelete': '确定要删除该问题吗?',
'unreadQuestion.batchDelete': '确定要批量删除选中的问题吗?',
'unreadQuestion.replyModal': '回复问题',
'unreadQuestion.questionContent': '问题内容',
'unreadQuestion.answerContent': '回复内容',
'unreadQuestion.answerPlaceholder': '请输入回复内容...',
'unreadQuestion.submit': '提交',
'unreadQuestion.cancel': '取消',
'unreadQuestion.answerRequired': '请输入回复内容',
'unreadQuestion.selectRequired': '请至少选择一项',
'unreadQuestion.batchDeleteConfirm': '删除后无法恢复,确定要继续吗?',
'unreadQuestion.questionPlaceholder': '请输入问题关键词',
'unreadQuestion.fetchFailed': '获取未回答问题列表失败',
// 友情链接管理页面
'friendLink.title': '友情链接管理',
'friendLink.name': '名称',
'friendLink.url': '链接地址',
'friendLink.logo': '图标',
'friendLink.sort': '排序',
'friendLink.status': '状态',
'friendLink.operation': '操作',
'friendLink.add': '新增链接',
'friendLink.edit': '编辑链接',
'friendLink.delete': '删除链接',
'friendLink.enabled': '已启用',
'friendLink.disabled': '已禁用',
// 关于我们页面
'about.title': '关于我们',
'about.company.title': '公司简介',
'about.advantages.title': '平台优势',
'about.history.title': '发展历程',
'about.contact.title': '联系我们',
'about.address': '总部地址',
'about.phone': '联系电话',
'about.hotline': '服务热线',
'about.email': '电子邮箱',
'about.worktime': '工作时间',
'about.copyright': '© 2024 中远海运电子招投标平台 版权所有',
"查看":"查看",
"采购需求公示":"采购需求公示",
"招标采购公告":"招标采购公告",
"非招标采购公告":"非招标采购公告",
"资格预审公告":"资格预审公告",
"招募公告":"招募公告",
"变更公告":"变更公告",
"中标(中选)候选人公示":"中标(中选)候选人公示",
"中标(中选)结果公示":"中标(中选)结果公示",
"采购失败(流标)公告":"采购失败(流标)公告",
"加载更多":"加载更多",
"登录/注册":"登录/注册",
// 登录页文案
"login.title": "电子招投标平台",
"login.tab.supplier": "供应商",
"login.tab.expert": "专家",
"login.tab.agent": "招标代理",
"login.username.placeholder": "请输入用户名",
"login.password.placeholder": "请输入密码",
"login.remember": "记住密码",
"login.forgot": "忘记密码?",
"login.button": "登录",
"login.register.tip": "还没有账号?",
"login.register.action": "立即注册",
"login.back.home": "返回首页",
// 注册页通用文案
"register.submit": "注册完成",
"register.hasAccount": "已有账号?",
"register.login": "立即登录",
// 用户名密码通用文案
"register.username.label": "用户名",
"register.username.placeholder": "请输入用户名",
"register.username.required": "请输入用户名",
"register.username.min": "用户名至少4个字符",
"register.password.label": "输入密码",
"register.password.placeholder": "请输入密码应为6-16位的英文加数字组合",
"register.password.required": "请输入密码",
"register.password.min": "密码至少6个字符",
"register.password.pattern": "密码应为6-16位的英文加数字组合",
"register.confirmPassword.label": "确认密码",
"register.confirmPassword.placeholder": "请再次输入密码,两次输入保持一致",
"register.confirmPassword.required": "请确认密码",
"register.confirmPassword.notMatch": "两次输入的密码不一致",
"register.phone.label": "手机号",
"register.phone.placeholder": "请输入手机号",
"register.phone.required": "请输入手机号",
"register.phone.invalid": "请输入有效的手机号",
"register.email.label": "电子邮箱",
"register.email.placeholder": "请输入电子邮箱",
"register.email.required": "请输入电子邮箱",
"register.email.invalid": "请输入有效的电子邮箱",
"register.captcha.label": "短信验证码",
"register.captcha.placeholder": "请输入短信验证码",
"register.captcha.required": "请输入短信验证码",
"register.captcha.get": "获取验证码",
// 供应商注册文案
"register.supplier.title": "供应商注册",
"register.supplier.companyName.label": "公司名称",
"register.supplier.companyName.placeholder": "请输入公司名称",
"register.supplier.companyName.required": "请输入公司名称",
"register.supplier.contactPerson.label": "联系人",
"register.supplier.contactPerson.placeholder": "请输入联系人姓名",
"register.supplier.contactPerson.required": "请输入联系人姓名",
// 专家注册文案
"register.expert.title": "专家注册",
"register.expert.idType.label": "证件类型",
"register.expert.idType.placeholder": "请选择证件类型",
"register.expert.idType.required": "请选择证件类型",
"register.expert.idCard.label": "证件号",
"register.expert.idCard.placeholder": "请输入证件号",
"register.expert.idCard.required": "请输入证件号"
...common,
...userQuestion,
...register,
...login,
...helpCenter,
...friendLink,
...about,
};

View File

@ -0,0 +1,14 @@
export default {
// 关于我们页面
'about.title': '关于我们',
'about.company.title': '公司简介',
'about.advantages.title': '平台优势',
'about.history.title': '发展历程',
'about.contact.title': '联系我们',
'about.address': '总部地址',
'about.phone': '联系电话',
'about.hotline': '服务热线',
'about.email': '电子邮箱',
'about.worktime': '工作时间',
'about.copyright': '© 2024 中远海运电子招投标平台 版权所有',
};

View File

@ -0,0 +1,30 @@
export default {
// 菜单
'menu.首页': '首页',
'menu.管理员管理': '管理员管理',
'menu.下载中心管理': '下载中心管理',
'menu.通知中心管理': '通知中心管理',
'menu.政策法规管理': '政策法规管理',
'menu.关于我们管理': '关于我们管理',
'menu.帮助中心管理': '帮助中心管理',
'menu.用户提问管理': '用户提问管理',
'menu.已阅问题': '已阅问题',
'menu.未阅问题': '未阅问题',
'menu.友情链接管理': '友情链接管理',
'menu.友情链接分类': '友情链接分类',
'menu.友情链接列表': '友情链接列表',
// 通用文本
"查看": "查看",
"采购需求公示": "采购需求公示",
"招标采购公告": "招标采购公告",
"非招标采购公告": "非招标采购公告",
"资格预审公告": "资格预审公告",
"招募公告": "招募公告",
"变更公告": "变更公告",
"中标(中选)候选人公示": "中标(中选)候选人公示",
"中标(中选)结果公示": "中标(中选)结果公示",
"采购失败(流标)公告": "采购失败(流标)公告",
"加载更多": "加载更多",
"登录/注册": "登录/注册",
};

View File

@ -0,0 +1,15 @@
export default {
// 友情链接管理页面
'friendLink.title': '友情链接管理',
'friendLink.name': '名称',
'friendLink.url': '链接地址',
'friendLink.logo': '图标',
'friendLink.sort': '排序',
'friendLink.status': '状态',
'friendLink.operation': '操作',
'friendLink.add': '新增链接',
'friendLink.edit': '编辑链接',
'friendLink.delete': '删除链接',
'friendLink.enabled': '已启用',
'friendLink.disabled': '已禁用',
};

View File

@ -0,0 +1,22 @@
export default {
// 帮助中心页面
'helpCenter.title': '帮助中心管理',
'helpCenter.question': '问题',
'helpCenter.category': '问题类型',
'helpCenter.createTime': '创建时间',
'helpCenter.updateTime': '更新时间',
'helpCenter.status': '状态',
'helpCenter.operation': '操作',
'helpCenter.edit': '编辑',
'helpCenter.delete': '删除',
'helpCenter.add': '新增',
'helpCenter.search': '搜索',
'helpCenter.all': '全部',
'helpCenter.published': '已发布',
'helpCenter.unpublished': '未发布',
'helpCenter.draft': '草稿',
'helpCenter.publish': '发布',
'helpCenter.unpublish': '下架',
'helpCenter.confirmDelete': '确定要删除该帮助吗?',
'helpCenter.batchDelete': '确定要批量删除选中的帮助吗?',
};

View File

@ -0,0 +1,15 @@
export default {
// 登录页文案
"login.title": "电子招投标平台",
"login.tab.supplier": "供应商",
"login.tab.expert": "专家",
"login.tab.agent": "招标代理",
"login.username.placeholder": "请输入用户名",
"login.password.placeholder": "请输入密码",
"login.remember": "记住密码",
"login.forgot": "忘记密码?",
"login.button": "登录",
"login.register.tip": "还没有账号?",
"login.register.action": "立即注册",
"login.back.home": "返回首页",
};

View File

@ -0,0 +1,51 @@
export default {
// 注册页通用文案
"register.submit": "注册完成",
"register.hasAccount": "已有账号?",
"register.login": "立即登录",
// 用户名密码通用文案
"register.username.label": "用户名",
"register.username.placeholder": "请输入用户名",
"register.username.required": "请输入用户名",
"register.username.min": "用户名至少4个字符",
"register.password.label": "输入密码",
"register.password.placeholder": "请输入密码应为6-16位的英文加数字组合",
"register.password.required": "请输入密码",
"register.password.min": "密码至少6个字符",
"register.password.pattern": "密码应为6-16位的英文加数字组合",
"register.confirmPassword.label": "确认密码",
"register.confirmPassword.placeholder": "请再次输入密码,两次输入保持一致",
"register.confirmPassword.required": "请确认密码",
"register.confirmPassword.notMatch": "两次输入的密码不一致",
"register.phone.label": "手机号",
"register.phone.placeholder": "请输入手机号",
"register.phone.required": "请输入手机号",
"register.phone.invalid": "请输入有效的手机号",
"register.email.label": "电子邮箱",
"register.email.placeholder": "请输入电子邮箱",
"register.email.required": "请输入电子邮箱",
"register.email.invalid": "请输入有效的电子邮箱",
"register.captcha.label": "短信验证码",
"register.captcha.placeholder": "请输入短信验证码",
"register.captcha.required": "请输入短信验证码",
"register.captcha.get": "获取验证码",
// 供应商注册文案
"register.supplier.title": "供应商注册",
"register.supplier.companyName.label": "公司名称",
"register.supplier.companyName.placeholder": "请输入公司名称",
"register.supplier.companyName.required": "请输入公司名称",
"register.supplier.contactPerson.label": "联系人",
"register.supplier.contactPerson.placeholder": "请输入联系人姓名",
"register.supplier.contactPerson.required": "请输入联系人姓名",
// 专家注册文案
"register.expert.title": "专家注册",
"register.expert.idType.label": "证件类型",
"register.expert.idType.placeholder": "请选择证件类型",
"register.expert.idType.required": "请选择证件类型",
"register.expert.idCard.label": "证件号",
"register.expert.idCard.placeholder": "请输入证件号",
"register.expert.idCard.required": "请输入证件号",
};

View File

@ -0,0 +1,161 @@
export default {
// 用户提问管理页面
'userQuestion.title': '用户提问管理',
'userQuestion.user': '用户',
'userQuestion.question': '问题',
'userQuestion.answer': '回答',
'userQuestion.createTime': '提问时间',
'userQuestion.status': '状态',
'userQuestion.operation': '操作',
'userQuestion.unanswered': '未回答',
'userQuestion.answered': '已回答',
'userQuestion.reply': '回复',
'userQuestion.view': '查看',
'userQuestion.viewAll': '查看全部',
'userQuestion.confirmDelete': '确定要删除该问题吗?',
'userQuestion.batchDelete': '确定要批量删除选中的问题吗?',
'userQuestion.description': '用户提问管理说明',
'userQuestion.descriptionText': '用户提问管理模块用于处理用户在平台上提交的问题。已阅问题为已回复的问题,未阅问题为待回复的问题。您可以点击相应的卡片进入对应的管理页面。',
'userQuestion.deleteSuccess': '删除成功',
'userQuestion.deleteFailed': '删除失败',
'userQuestion.replySuccess': '回复成功',
'userQuestion.replyFailed': '回复失败',
'userQuestion.selectRequired': '请至少选择一项',
'userQuestion.batchDeleteConfirm': '删除后无法恢复,确定要继续吗?',
'userQuestion.unread': '未阅',
'userQuestion.read': '已阅',
'userQuestion.delete': '删除',
'userQuestion.edit': '编辑回答',
'userQuestion.editSuccess': '编辑成功',
'userQuestion.editFailed': '编辑失败',
'userQuestion.publishStatus': '发布状态',
'userQuestion.topStatus': '置顶状态',
'userQuestion.published': '已发布',
'userQuestion.unpublished': '未发布',
'userQuestion.top': '已置顶',
'userQuestion.untop': '未置顶',
'userQuestion.submitAnswer': '提交回答',
'userQuestion.saveEdit': '保存修改',
'userQuestion.confirmSubmit': '确认提交回答',
'userQuestion.confirmEdit': '确认保存修改',
'userQuestion.submitConfirmText': '确定要提交这个回答吗?提交后将变为已回答状态。',
'userQuestion.editConfirmText': '确定要保存对此回答的修改吗?',
// 问题分类选项
'questionCategory.biddingProcess': '招标流程',
'questionCategory.biddingGuide': '投标指南',
'questionCategory.registrationGuide': '注册指南',
'questionCategory.systemOperation': '系统操作',
'questionCategory.otherIssues': '其他问题',
// 已阅问题页面
'readQuestion.title': '已阅问题管理',
'readQuestion.user': '用户名',
'readQuestion.question': '问题内容',
'readQuestion.answer': '回复内容',
'readQuestion.createTime': '提问时间',
'readQuestion.answerTime': '回复时间',
'readQuestion.status': '状态',
'readQuestion.operation': '操作',
'readQuestion.view': '查看详情',
'readQuestion.delete': '删除',
'readQuestion.search': '搜索',
'readQuestion.reset': '重置',
'readQuestion.confirmDelete': '确定要删除该问题吗?',
'readQuestion.batchDelete': '批量删除',
'readQuestion.viewDetails': '查看问题详情',
'readQuestion.questionDetails': '问题详情',
'readQuestion.answerDetails': '回复详情',
'readQuestion.close': '关闭',
'readQuestion.deleteSuccess': '删除成功',
'readQuestion.deleteFailed': '删除失败',
'readQuestion.selectRequired': '请至少选择一项',
'readQuestion.batchDeleteConfirm': '删除后无法恢复,确定要继续吗?',
'readQuestion.questionPlaceholder': '请输入问题关键词',
'readQuestion.fetchFailed': '获取已回答问题列表失败',
'readQuestion.edit': '编辑回答',
'readQuestion.serialNumber': '序号',
'readQuestion.questionTitle': '问题标题',
'readQuestion.category': '问题分类',
'readQuestion.asker': '提问人',
'readQuestion.company': '公司',
'readQuestion.account': '账号',
'readQuestion.contact': '联系方式',
'readQuestion.email': '邮箱',
'readQuestion.askTime': '提问时间',
'readQuestion.respondent': '回答人',
'readQuestion.answerStatus': '回答状态',
'readQuestion.confirm': '确认',
'readQuestion.cancel': '取消',
'readQuestion.batchDeleteSuccess': '批量删除成功',
'readQuestion.batchDeleteFailed': '批量删除失败',
'readQuestion.selectedCount': '已选择 {count} 项',
// 未阅问题页面
'unreadQuestion.title': '未阅问题管理',
'unreadQuestion.user': '用户名',
'unreadQuestion.question': '问题内容',
'unreadQuestion.createTime': '提问时间',
'unreadQuestion.status': '状态',
'unreadQuestion.operation': '操作',
'unreadQuestion.reply': '回答',
'unreadQuestion.delete': '删除',
'unreadQuestion.search': '搜索',
'unreadQuestion.reset': '重置',
'unreadQuestion.confirmDelete': '确定要删除该问题吗?',
'unreadQuestion.batchDelete': '批量删除',
'unreadQuestion.replyModal': '回复问题',
'unreadQuestion.questionContent': '问题内容',
'unreadQuestion.answerContent': '回复内容',
'unreadQuestion.answerPlaceholder': '请输入回复内容...',
'unreadQuestion.submit': '提交',
'unreadQuestion.cancel': '取消',
'unreadQuestion.answerRequired': '请输入回复内容',
'unreadQuestion.selectRequired': '请至少选择一项',
'unreadQuestion.batchDeleteConfirm': '删除后无法恢复,确定要继续吗?',
'unreadQuestion.questionPlaceholder': '请输入问题关键词',
'unreadQuestion.fetchFailed': '获取未回答问题列表失败',
'unreadQuestion.serialNumber': '序号',
'unreadQuestion.questionTitle': '问题标题',
'unreadQuestion.category': '问题分类',
'unreadQuestion.asker': '提问人',
'unreadQuestion.company': '公司',
'unreadQuestion.account': '账号',
'unreadQuestion.contact': '联系方式',
'unreadQuestion.email': '邮箱',
'unreadQuestion.askTime': '提问时间',
'unreadQuestion.batchDeleteSuccess': '批量删除成功',
'unreadQuestion.batchDeleteFailed': '批量删除失败',
'unreadQuestion.selectedCount': '已选择 {count} 项',
// 问题详情组件
'questionDetail.title': '标题',
'questionDetail.category': '问题分类',
'questionDetail.askTime': '提问时间',
'questionDetail.asker': '提问人',
'questionDetail.company': '公司名称',
'questionDetail.account': '账号',
'questionDetail.contact': '联系方式',
'questionDetail.email': '邮箱',
'questionDetail.publishStatus': '是否发布',
'questionDetail.topStatus': '是否置顶',
'questionDetail.answerTime': '回答时间',
'questionDetail.respondent': '回答人',
'questionDetail.questionContent': '问题内容',
'questionDetail.answerContent': '回答内容',
// 问题模态框组件
'questionModal.answer': '回答问题',
'questionModal.edit': '编辑回答',
'questionModal.view': '问题详情',
'questionModal.publishSwitch': '发布',
'questionModal.topSwitch': '置顶',
'questionModal.confirmSubmit': '确认提交',
'questionModal.confirmEdit': '确认修改',
'questionModal.close': '关闭',
'questionModal.answerRequired': '请输入回答内容',
'questionModal.answerSuccess': '回答成功',
'questionModal.answerFailed': '回答失败',
'questionModal.editSuccess': '修改成功',
'questionModal.editFailed': '修改失败',
};

View File

@ -1,6 +1,7 @@
import React, { useState, useEffect } from 'react';
import { Modal, Button, Form, Input, Switch, message, Descriptions, Divider, Card, Tag } from 'antd';
import { ExclamationCircleOutlined } from '@ant-design/icons';
import { useIntl, FormattedMessage } from 'umi';
import { answerQuestion } from '@/servers/api/userQuestion';
// 引入字典
import {
@ -35,6 +36,7 @@ const QuestionModal: React.FC<QuestionModalProps> = ({
mode,
onSuccess
}) => {
const intl = useIntl();
const [form] = Form.useForm();
const [answerContent, setAnswerContent] = useState<string>('');
const [loading, setLoading] = useState<boolean>(false);
@ -57,37 +59,37 @@ const QuestionModal: React.FC<QuestionModalProps> = ({
const getModalTitle = () => {
switch (mode) {
case 'answer':
return '回答问题';
return intl.formatMessage({ id: 'questionModal.answer' });
case 'edit':
return '编辑回答';
return intl.formatMessage({ id: 'questionModal.edit' });
case 'view':
default:
return '问题详情';
return intl.formatMessage({ id: 'questionModal.view' });
}
};
// 获取发布状态标签
const getPublishTag = (isPublished: number) => {
return isPublished === 1 ?
<Tag color="green"></Tag> :
<Tag color="orange"></Tag>;
<Tag color="green">{PublishStatusText[PublishStatus.YES]()}</Tag> :
<Tag color="orange">{PublishStatusText[PublishStatus.NO]()}</Tag>;
};
// 获取置顶状态标签
const getTopTag = (isTop: number) => {
return isTop === 1 ?
<Tag color="red"></Tag> :
<Tag color="default"></Tag>;
<Tag color="red">{TopStatusText[TopStatus.YES]()}</Tag> :
<Tag color="default">{TopStatusText[TopStatus.NO]()}</Tag>;
};
// 获取回答状态标签
const getAnswerStatusTag = (questionData: any) => {
if (questionData.answerContent && questionData.answerContent.trim() !== '') {
return <Tag color="green"></Tag>;
return <Tag color="green">{AnswerStatusText[AnswerStatus.ANSWERED]()}</Tag>;
} else if (questionData.isAnswer === '1') {
return <Tag color="blue"></Tag>;
return <Tag color="blue">{AnswerStatusText[AnswerStatus.READ]()}</Tag>;
} else {
return <Tag color="orange"></Tag>;
return <Tag color="orange">{AnswerStatusText[AnswerStatus.UNREAD]()}</Tag>;
}
};
@ -95,20 +97,24 @@ const QuestionModal: React.FC<QuestionModalProps> = ({
const handleSubmit = () => {
form.validateFields().then(values => {
if (!answerContent || answerContent.trim() === '') {
message.error('请输入回答内容');
message.error(intl.formatMessage({ id: 'questionModal.answerRequired' }));
return;
}
const actionText = mode === 'answer' ? '提交回答' : '保存修改';
const actionText = mode === 'answer' ?
intl.formatMessage({ id: 'userQuestion.submitAnswer' }) :
intl.formatMessage({ id: 'userQuestion.saveEdit' });
Modal.confirm({
title: `确认${actionText}`,
title: mode === 'answer' ?
intl.formatMessage({ id: 'userQuestion.confirmSubmit' }) :
intl.formatMessage({ id: 'userQuestion.confirmEdit' }),
icon: <ExclamationCircleOutlined />,
content: mode === 'answer'
? '确定要提交这个回答吗?提交后将变为已回答状态。'
: '确定要保存对此回答的修改吗?',
okText: '确定',
cancelText: '取消',
? intl.formatMessage({ id: 'userQuestion.submitConfirmText' })
: intl.formatMessage({ id: 'userQuestion.editConfirmText' }),
okText: intl.formatMessage({ id: 'readQuestion.confirm' }),
cancelText: intl.formatMessage({ id: 'readQuestion.cancel' }),
onOk: async () => {
setLoading(true);
try {
@ -121,15 +127,27 @@ const QuestionModal: React.FC<QuestionModalProps> = ({
});
if (response && response.success) {
message.success(mode === 'answer' ? '回答提交成功' : '回答修改成功');
if (mode === 'answer') {
message.success(intl.formatMessage({ id: 'questionModal.answerSuccess' }));
} else {
message.success(intl.formatMessage({ id: 'questionModal.editSuccess' }));
}
onSuccess();
onCancel();
} else {
message.error(response.message || `${actionText}失败`);
if (mode === 'answer') {
message.error(response.message || intl.formatMessage({ id: 'questionModal.answerFailed' }));
} else {
message.error(response.message || intl.formatMessage({ id: 'questionModal.editFailed' }));
}
}
} catch (error) {
console.error(`${actionText}失败:`, error);
message.error(`${actionText}失败`);
if (mode === 'answer') {
message.error(intl.formatMessage({ id: 'questionModal.answerFailed' }));
} else {
message.error(intl.formatMessage({ id: 'questionModal.editFailed' }));
}
} finally {
setLoading(false);
}
@ -147,60 +165,60 @@ const QuestionModal: React.FC<QuestionModalProps> = ({
return (
<div className="question-detail-view">
<Descriptions bordered column={2} size="small">
<Descriptions.Item label="标题" span={2}>
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.title' })} span={2}>
{question.title}
</Descriptions.Item>
<Descriptions.Item label="问题分类">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.category' })}>
{question.type}
</Descriptions.Item>
<Descriptions.Item label="提问时间">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.askTime' })}>
{question.askTime}
</Descriptions.Item>
<Descriptions.Item label="提问人">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.asker' })}>
{question.userName}
</Descriptions.Item>
<Descriptions.Item label="公司名称">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.company' })}>
{question.companyName || '-'}
</Descriptions.Item>
<Descriptions.Item label="账号">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.account' })}>
{question.fullName || '-'}
</Descriptions.Item>
<Descriptions.Item label="联系方式">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.contact' })}>
{question.contactDetails || '-'}
</Descriptions.Item>
<Descriptions.Item label="邮箱">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.email' })}>
{question.email || '-'}
</Descriptions.Item>
{/* 只有已回答的问题才会显示以下字段 */}
{question.isAnswer === '1' && (
<>
<Descriptions.Item label="状态">
<Descriptions.Item label={intl.formatMessage({ id: 'readQuestion.status' })}>
{getAnswerStatusTag(question)}
</Descriptions.Item>
<Descriptions.Item label="是否发布">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.publishStatus' })}>
{getPublishTag(question.isPublished)}
</Descriptions.Item>
<Descriptions.Item label="是否置顶">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.topStatus' })}>
{getTopTag(question.isTop)}
</Descriptions.Item>
<Descriptions.Item label="回答时间">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.answerTime' })}>
{question.answerTime || '-'}
</Descriptions.Item>
<Descriptions.Item label="回答人">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.respondent' })}>
{question.answerBy || '-'}
</Descriptions.Item>
</>
)}
{/* 未回答的问题显示状态 */}
{question.isAnswer !== '1' && (
<Descriptions.Item label="状态" span={2}>
<Descriptions.Item label={intl.formatMessage({ id: 'readQuestion.status' })} span={2}>
{getAnswerStatusTag(question)}
</Descriptions.Item>
)}
</Descriptions>
<Divider orientation="left"></Divider>
<Divider orientation="left">{intl.formatMessage({ id: 'questionDetail.questionContent' })}</Divider>
<Card size="small" bordered={false} className="content-card">
<div className="question-content">
{question.content}
@ -209,7 +227,7 @@ const QuestionModal: React.FC<QuestionModalProps> = ({
{question.answerContent && (
<>
<Divider orientation="left"></Divider>
<Divider orientation="left">{intl.formatMessage({ id: 'questionDetail.answerContent' })}</Divider>
<Card size="small" bordered={false} className="content-card">
<div className="answer-content">
{question.answerContent}
@ -229,102 +247,110 @@ const QuestionModal: React.FC<QuestionModalProps> = ({
<Form form={form} layout="vertical">
<div className="question-info-section">
<Descriptions bordered column={2} size="small">
<Descriptions.Item label="标题" span={2}>
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.title' })} span={2}>
{question.title}
</Descriptions.Item>
<Descriptions.Item label="问题分类">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.category' })}>
{question.type}
</Descriptions.Item>
<Descriptions.Item label="提问时间">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.askTime' })}>
{question.askTime}
</Descriptions.Item>
<Descriptions.Item label="提问人">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.asker' })}>
{question.userName}
</Descriptions.Item>
<Descriptions.Item label="公司名称">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.company' })}>
{question.companyName || '-'}
</Descriptions.Item>
<Descriptions.Item label="账号">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.account' })}>
{question.fullName || '-'}
</Descriptions.Item>
<Descriptions.Item label="联系方式">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.contact' })}>
{question.contactDetails || '-'}
</Descriptions.Item>
<Descriptions.Item label="邮箱">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.email' })}>
{question.email || '-'}
</Descriptions.Item>
</Descriptions>
<Divider orientation="left"></Divider>
<Card size="small" bordered={false} className="content-card">
<div className="question-content">
{question.content}
</div>
</Card>
</div>
<Divider orientation="left"></Divider>
<Divider orientation="left">{intl.formatMessage({ id: 'questionDetail.questionContent' })}</Divider>
<Card size="small" bordered={false} className="content-card">
<div className="question-content">
{question.content}
</div>
</Card>
<Divider orientation="left">{intl.formatMessage({ id: 'questionDetail.answerContent' })}</Divider>
<Form.Item
name="answer"
rules={[{ required: true, message: '请输入回答内容' }]}
rules={[
{
required: true,
message: intl.formatMessage({ id: 'questionModal.answerRequired' }),
},
]}
>
<TextArea
rows={8}
placeholder="请输入回答内容"
value={answerContent}
onChange={(e) => setAnswerContent(e.target.value)}
/>
</Form.Item>
<div className="question-settings">
<Form.Item name="isPublished" label="是否发布" valuePropName="checked">
<Switch />
<div className="form-options">
<Form.Item name="isPublished" valuePropName="checked">
<Switch checkedChildren={intl.formatMessage({ id: 'questionModal.publishSwitch' })} />
</Form.Item>
<Form.Item name="isTop" label="是否置顶" valuePropName="checked">
<Switch />
<Form.Item name="isTop" valuePropName="checked">
<Switch checkedChildren={intl.formatMessage({ id: 'questionModal.topSwitch' })} />
</Form.Item>
</div>
</Form>
);
};
// 渲染内容
// 根据模式渲染不同内容
const renderContent = () => {
if (!question) return null;
// 查看模式
if (mode === 'view') {
return renderViewContent();
switch (mode) {
case 'answer':
case 'edit':
return renderEditContent();
case 'view':
default:
return renderViewContent();
}
// 回答或编辑模式
return renderEditContent();
};
// 渲染底部按钮
const renderFooter = () => {
if (mode === 'view') {
return [
<Button key="close" onClick={onCancel}>
</Button>
];
switch (mode) {
case 'answer':
case 'edit':
return [
<Button key="cancel" onClick={onCancel}>
{intl.formatMessage({ id: 'readQuestion.cancel' })}
</Button>,
<Button
key="submit"
type="primary"
loading={loading}
onClick={handleSubmit}
>
{mode === 'answer'
? intl.formatMessage({ id: 'questionModal.confirmSubmit' })
: intl.formatMessage({ id: 'questionModal.confirmEdit' })}
</Button>,
];
case 'view':
default:
return [
<Button key="close" type="primary" onClick={onCancel}>
{intl.formatMessage({ id: 'questionModal.close' })}
</Button>,
];
}
// 回答或编辑模式的底部按钮
return [
<Button key="cancel" onClick={onCancel}>
</Button>,
<Button
key="submit"
type="primary"
onClick={handleSubmit}
loading={loading}
>
{mode === 'answer' ? '提交回答' : '保存修改'}
</Button>
];
};
return (
@ -332,8 +358,8 @@ const QuestionModal: React.FC<QuestionModalProps> = ({
title={getModalTitle()}
visible={visible}
onCancel={onCancel}
footer={renderFooter()}
width={800}
footer={renderFooter()}
maskClosable={false}
destroyOnClose
>

View File

@ -1,5 +1,14 @@
import React from 'react';
import { Descriptions, Divider, Card, Tag } from 'antd';
import { useIntl, FormattedMessage } from 'umi';
import {
PublishStatus,
PublishStatusText,
PublishStatusColor,
TopStatus,
TopStatusText,
TopStatusColor
} from '@/dicts/userQuestionDict';
interface QuestionDetailProps {
question: any; // 可以改为具体的类型
@ -9,70 +18,72 @@ interface QuestionDetailProps {
* 问题详情查看组件
*/
const QuestionViewDetail: React.FC<QuestionDetailProps> = ({ question }) => {
const intl = useIntl();
if (!question) return null;
// 获取发布状态标签
const getPublishTag = (isPublished: number) => {
return isPublished === 1 ?
<Tag color="green"></Tag> :
<Tag color="orange"></Tag>;
<Tag color="green">{PublishStatusText[PublishStatus.YES]()}</Tag> :
<Tag color="orange">{PublishStatusText[PublishStatus.NO]()}</Tag>;
};
// 获取置顶状态标签
const getTopTag = (isTop: number) => {
return isTop === 1 ?
<Tag color="red"></Tag> :
<Tag color="default"></Tag>;
<Tag color="red">{TopStatusText[TopStatus.YES]()}</Tag> :
<Tag color="default">{TopStatusText[TopStatus.NO]()}</Tag>;
};
return (
<div className="question-detail-view">
<Descriptions bordered column={2} size="small">
<Descriptions.Item label="标题" span={2}>
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.title' })} span={2}>
{question.title}
</Descriptions.Item>
<Descriptions.Item label="问题分类">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.category' })}>
{question.type}
</Descriptions.Item>
<Descriptions.Item label="提问时间">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.askTime' })}>
{question.askTime}
</Descriptions.Item>
<Descriptions.Item label="提问人">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.asker' })}>
{question.userName}
</Descriptions.Item>
<Descriptions.Item label="公司名称">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.company' })}>
{question.companyName}
</Descriptions.Item>
<Descriptions.Item label="账号">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.account' })}>
{question.fullName}
</Descriptions.Item>
<Descriptions.Item label="联系方式">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.contact' })}>
{question.contactDetails}
</Descriptions.Item>
<Descriptions.Item label="邮箱">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.email' })}>
{question.email}
</Descriptions.Item>
{/* 只有已回答的问题才会显示以下字段 */}
{question.isAnswer === '1' && (
<>
<Descriptions.Item label="是否发布">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.publishStatus' })}>
{getPublishTag(question.isPublished)}
</Descriptions.Item>
<Descriptions.Item label="是否置顶">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.topStatus' })}>
{getTopTag(question.isTop)}
</Descriptions.Item>
<Descriptions.Item label="回答时间">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.answerTime' })}>
{question.answerTime}
</Descriptions.Item>
<Descriptions.Item label="回答人">
<Descriptions.Item label={intl.formatMessage({ id: 'questionDetail.respondent' })}>
{question.answerBy || '-'}
</Descriptions.Item>
</>
)}
</Descriptions>
<Divider orientation="left"></Divider>
<Divider orientation="left">{intl.formatMessage({ id: 'questionDetail.questionContent' })}</Divider>
<Card size="small" bordered={false} className="content-card">
<div className="question-content">
{question.content}
@ -81,7 +92,7 @@ const QuestionViewDetail: React.FC<QuestionDetailProps> = ({ question }) => {
{question.answerContent && (
<>
<Divider orientation="left"></Divider>
<Divider orientation="left">{intl.formatMessage({ id: 'questionDetail.answerContent' })}</Divider>
<Card size="small" bordered={false} className="content-card">
<div className="answer-content">
{question.answerContent}

View File

@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { useIntl } from 'umi';
import { useIntl, FormattedMessage } from 'umi';
import { Button, Table, Modal, message, Input, Form, Tooltip, Tag, Space, Switch, TablePaginationConfig, Select } from 'antd';
import {
DeleteOutlined,
@ -21,8 +21,7 @@ import {
QuestionCategoryOptions,
AnswerStatus,
AnswerStatusText,
AnswerStatusColor,
PublishStatus
AnswerStatusColor
} from '@/dicts/userQuestionDict';
const { confirm } = Modal;
@ -103,11 +102,11 @@ const ReadQuestionManage: React.FC = () => {
total,
});
} else {
message.error(response.message || '获取问题列表失败');
message.error(response.message || intl.formatMessage({ id: 'readQuestion.fetchFailed' }));
}
} catch (error) {
console.error('获取问题列表失败:', error);
message.error('获取问题列表失败');
message.error(intl.formatMessage({ id: 'readQuestion.fetchFailed' }));
} finally {
setLoading(false);
}
@ -144,11 +143,11 @@ const ReadQuestionManage: React.FC = () => {
setModalMode(mode);
setModalVisible(true);
} else {
message.error(response.message || '获取问题详情失败');
message.error(response.message || intl.formatMessage({ id: 'readQuestion.fetchFailed' }));
}
} catch (error) {
console.error('获取问题详情失败:', error);
message.error('获取问题详情失败');
message.error(intl.formatMessage({ id: 'readQuestion.fetchFailed' }));
}
};
@ -165,25 +164,25 @@ const ReadQuestionManage: React.FC = () => {
// 处理删除
const showDeleteConfirm = (record: QuestionItemType) => {
confirm({
title: '确认删除',
title: intl.formatMessage({ id: 'readQuestion.confirmDelete' }),
icon: <ExclamationCircleOutlined />,
content: `确定要删除标题为"${record.title}"的问题吗?`,
okText: '删除',
content: `${intl.formatMessage({ id: 'readQuestion.confirmDelete' })} "${record.title}"?`,
okText: intl.formatMessage({ id: 'readQuestion.delete' }),
okType: 'danger',
cancelText: '取消',
cancelText: intl.formatMessage({ id: 'readQuestion.cancel' }),
maskClosable: false,
onOk: async () => {
try {
const response = await deleteQuestion(record.id);
if (response && response.success) {
message.success('删除成功');
message.success(intl.formatMessage({ id: 'readQuestion.deleteSuccess' }));
fetchQuestionList(pagination.current, pagination.pageSize, searchParams); // 重新加载数据
} else {
message.error(response.message || '删除失败');
message.error(response.message || intl.formatMessage({ id: 'readQuestion.deleteFailed' }));
}
} catch (error) {
console.error('删除问题失败:', error);
message.error('删除失败');
message.error(intl.formatMessage({ id: 'readQuestion.deleteFailed' }));
}
},
});
@ -197,31 +196,31 @@ const ReadQuestionManage: React.FC = () => {
// 处理批量删除
const handleBatchDelete = () => {
if (selectedRowKeys.length === 0) {
message.warning('请至少选择一条记录');
message.warning(intl.formatMessage({ id: 'readQuestion.selectRequired' }));
return;
}
confirm({
title: '批量删除',
title: intl.formatMessage({ id: 'readQuestion.batchDelete' }),
icon: <ExclamationCircleOutlined />,
content: `确定要删除选中的 ${selectedRowKeys.length} 条记录吗?`,
okText: '删除',
content: intl.formatMessage({ id: 'readQuestion.batchDeleteConfirm' }),
okText: intl.formatMessage({ id: 'readQuestion.delete' }),
okType: 'danger',
cancelText: '取消',
cancelText: intl.formatMessage({ id: 'readQuestion.cancel' }),
maskClosable: false,
onOk: async () => {
try {
const response = await batchDeleteQuestion(selectedRowKeys as string[]);
if (response && response.success) {
setSelectedRowKeys([]);
message.success('批量删除成功');
message.success(intl.formatMessage({ id: 'readQuestion.batchDeleteSuccess' }));
fetchQuestionList(pagination.current, pagination.pageSize, searchParams);
} else {
message.error(response.message || '批量删除失败');
message.error(response.message || intl.formatMessage({ id: 'readQuestion.batchDeleteFailed' }));
}
} catch (error) {
console.error('批量删除失败:', error);
message.error('批量删除失败');
message.error(intl.formatMessage({ id: 'readQuestion.batchDeleteFailed' }));
}
},
});
@ -239,37 +238,32 @@ const ReadQuestionManage: React.FC = () => {
const hasSelected = selectedRowKeys.length > 0;
// 问题分类选项
const categoryOptions = QuestionCategoryOptions;
// 获取回答状态标签
const getAnswerTag = (record: QuestionItemType) => {
if (record.answerContent && record.answerContent.trim() !== '') {
return <Tag color={AnswerStatusColor[AnswerStatus.ANSWERED]}>{AnswerStatusText[AnswerStatus.ANSWERED]}</Tag>;
return <Tag color={AnswerStatusColor[AnswerStatus.ANSWERED]}>{AnswerStatusText[AnswerStatus.ANSWERED]()}</Tag>;
} else {
return <Tag color={AnswerStatusColor[AnswerStatus.READ]}>{AnswerStatusText[AnswerStatus.READ]}</Tag>;
return <Tag color={AnswerStatusColor[AnswerStatus.READ]}>{AnswerStatusText[AnswerStatus.READ]()}</Tag>;
}
};
// 获取置顶状态标签
const getTopTag = (isTop: number) => {
return isTop === 1 ?
<Tag color="red"></Tag> :
<Tag color="red">{intl.formatMessage({ id: 'userQuestion.top' })}</Tag> :
null;
};
// 表格列定义
const columns = [
{
title: '序号',
title: intl.formatMessage({ id: 'readQuestion.serialNumber' }),
render: (_: any, __: any, index: number) => index + 1,
width: 80,
align: 'center' as const,
},
{
title: '问题标题',
title: intl.formatMessage({ id: 'readQuestion.questionTitle' }),
dataIndex: 'title',
key: 'title',
ellipsis: {
@ -285,24 +279,21 @@ const ReadQuestionManage: React.FC = () => {
),
},
{
title: '问题分类',
title: intl.formatMessage({ id: 'readQuestion.category' }),
dataIndex: 'type',
key: 'type',
width: 100,
align: 'center' as const,
},
{
title: '提问人',
title: intl.formatMessage({ id: 'readQuestion.asker' }),
dataIndex: 'userName',
key: 'userName',
width: 100,
align: 'center' as const,
},
{
title: '公司',
title: intl.formatMessage({ id: 'readQuestion.company' }),
dataIndex: 'companyName',
key: 'companyName',
width: 150,
ellipsis: {
showTitle: false,
},
@ -313,24 +304,21 @@ const ReadQuestionManage: React.FC = () => {
),
},
{
title: '账号',
title: intl.formatMessage({ id: 'readQuestion.account' }),
dataIndex: 'fullName',
key: 'fullName',
width: 120,
align: 'center' as const,
},
{
title: '联系方式',
title: intl.formatMessage({ id: 'readQuestion.contact' }),
dataIndex: 'contactDetails',
key: 'contactDetails',
width: 120,
align: 'center' as const,
},
{
title: '邮箱',
title: intl.formatMessage({ id: 'readQuestion.email' }),
dataIndex: 'email',
key: 'email',
width: 150,
ellipsis: {
showTitle: false,
},
@ -341,59 +329,64 @@ const ReadQuestionManage: React.FC = () => {
),
},
{
title: '提问时间',
title: intl.formatMessage({ id: 'readQuestion.askTime' }),
dataIndex: 'askTime',
key: 'askTime',
width: 150,
align: 'center' as const,
},
{
title: '回答时间',
title: intl.formatMessage({ id: 'readQuestion.answerTime' }),
dataIndex: 'answerTime',
key: 'answerTime',
width: 150,
align: 'center' as const,
},
{
title: '回答人',
title: intl.formatMessage({ id: 'readQuestion.respondent' }),
dataIndex: 'answerBy',
key: 'answerBy',
width: 100,
align: 'center' as const,
},
{
title: '状态',
title: intl.formatMessage({ id: 'readQuestion.status' }),
key: 'status',
width: 100,
align: 'center' as const,
render: (_: unknown, record: QuestionItemType) => (
<Space>
{getAnswerTag(record)}
{record.isPublished === 1 && <Tag color="green"></Tag>}
{record.isPublished === 1 && <Tag color="green">{intl.formatMessage({ id: 'userQuestion.published' })}</Tag>}
</Space>
),
},
{
title: '操作',
title: intl.formatMessage({ id: 'readQuestion.operation' }),
key: 'action',
width: 200,
width: 260,
align: 'center' as const,
render: (_: unknown, record: QuestionItemType) => (
<Space>
<Button type="link" onClick={() => handleView(record)}>
{intl.formatMessage({ id: 'userQuestion.view' })}
</Button>
<Button type="link" onClick={() => handleEdit(record)}>
{intl.formatMessage({ id: 'readQuestion.edit' })}
</Button>
<Button type="link" onClick={() => showDeleteConfirm(record)}>
{intl.formatMessage({ id: 'readQuestion.delete' })}
</Button>
</Space>
),
},
];
// 获取分类选项,处理为下拉框选项
const getCategoryOptions = () => {
return QuestionCategoryOptions.map(option => (
<Option key={option.value} value={option.value}>
{typeof option.label === 'function' ? option.label() : option.label}
</Option>
));
};
return (
<div className="common-container">
<div className="filter-action-row">
@ -404,27 +397,23 @@ const ReadQuestionManage: React.FC = () => {
layout="inline"
className="filter-form"
>
<Form.Item name="title" label="问题标题">
<Input placeholder="请输入问题标题关键词" allowClear />
<Form.Item name="title" label={intl.formatMessage({ id: 'readQuestion.questionTitle' })}>
<Input placeholder={intl.formatMessage({ id: 'readQuestion.questionPlaceholder' })} allowClear />
</Form.Item>
<Form.Item name="type" label="问题分类">
<Select placeholder="请选择问题分类" allowClear style={{ width: 150 }}>
{categoryOptions.map(option => (
<Option key={option.value} value={option.value}>
{option.label}
</Option>
))}
<Form.Item name="type" label={intl.formatMessage({ id: 'readQuestion.category' })}>
<Select placeholder={intl.formatMessage({ id: 'helpCenter.all' })} allowClear style={{ width: 150 }}>
{getCategoryOptions()}
</Select>
</Form.Item>
<Form.Item name="answerStatus" label="回答状态">
<Select placeholder="请选择状态" allowClear style={{ width: 120 }}>
<Option value={AnswerStatus.READ}>{AnswerStatusText[AnswerStatus.READ]}</Option>
<Option value={AnswerStatus.ANSWERED}>{AnswerStatusText[AnswerStatus.ANSWERED]}</Option>
<Form.Item name="answerStatus" label={intl.formatMessage({ id: 'readQuestion.answerStatus' })}>
<Select placeholder={intl.formatMessage({ id: 'helpCenter.all' })} allowClear style={{ width: 120 }}>
<Option value={AnswerStatus.READ}>{AnswerStatusText[AnswerStatus.READ]()}</Option>
<Option value={AnswerStatus.ANSWERED}>{AnswerStatusText[AnswerStatus.ANSWERED]()}</Option>
</Select>
</Form.Item>
<Form.Item className="filter-btns">
<Button type="primary" htmlType="submit" icon={<SearchOutlined />}>
{intl.formatMessage({ id: 'readQuestion.search' })}
</Button>
<Button
type="primary"
@ -435,7 +424,7 @@ const ReadQuestionManage: React.FC = () => {
fetchQuestionList(1, pagination.pageSize, { isAnswer: 1 });
}}
>
{intl.formatMessage({ id: 'readQuestion.reset' })}
</Button>
</Form.Item>
</Form>
@ -447,11 +436,11 @@ const ReadQuestionManage: React.FC = () => {
disabled={!hasSelected}
loading={loading}
>
{intl.formatMessage({ id: 'readQuestion.batchDelete' })}
</Button>
{hasSelected && (
<span className="selected-count">
{selectedRowKeys.length}
{intl.formatMessage({ id: 'readQuestion.selectedCount' }, { count: selectedRowKeys.length })}
</span>
)}
</div>
@ -466,7 +455,6 @@ const ReadQuestionManage: React.FC = () => {
loading={loading}
onChange={handleTableChange}
rowKey="id"
scroll={{ x: 1300 }}
/>
</div>

View File

@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { useIntl } from 'umi';
import { useIntl, FormattedMessage } from 'umi';
import { Button, Table, Modal, message, Input, Form, Tooltip, Tag, Space, TablePaginationConfig } from 'antd';
import {
DeleteOutlined,
@ -96,11 +96,11 @@ const UnreadQuestionManage: React.FC = () => {
total,
});
} else {
message.error(response.message || '获取问题列表失败');
message.error(response.message || intl.formatMessage({ id: 'unreadQuestion.fetchFailed' }));
}
} catch (error) {
console.error('获取问题列表失败:', error);
message.error('获取问题列表失败');
message.error(intl.formatMessage({ id: 'unreadQuestion.fetchFailed' }));
} finally {
setLoading(false);
}
@ -123,7 +123,7 @@ const UnreadQuestionManage: React.FC = () => {
// 先标记为已阅
const response = await markQuestionSeeEdit(record.id);
if (!response || !response.success) {
message.error(response?.message || '标记已阅失败');
message.error(response?.message || intl.formatMessage({ id: 'userQuestion.replyFailed' }));
return;
}
@ -139,36 +139,36 @@ const UnreadQuestionManage: React.FC = () => {
setCurrentQuestion(formattedDetail);
setAnswerModalVisible(true);
} else {
message.error(detailResponse.message || '获取问题详情失败');
message.error(detailResponse.message || intl.formatMessage({ id: 'userQuestion.replyFailed' }));
}
} catch (error) {
console.error('处理问题失败:', error);
message.error('操作失败,请稍后重试');
message.error(intl.formatMessage({ id: 'userQuestion.replyFailed' }));
}
};
// 处理删除
const showDeleteConfirm = (record: QuestionItemType) => {
confirm({
title: '确认删除',
title: intl.formatMessage({ id: 'unreadQuestion.confirmDelete' }),
icon: <ExclamationCircleOutlined />,
content: `确定要删除标题为"${record.title}"的问题吗?`,
okText: '删除',
content: `${intl.formatMessage({ id: 'unreadQuestion.confirmDelete' })} "${record.title}"?`,
okText: intl.formatMessage({ id: 'readQuestion.delete' }),
okType: 'danger',
cancelText: '取消',
cancelText: intl.formatMessage({ id: 'readQuestion.cancel' }),
maskClosable: false,
onOk: async () => {
try {
const response = await deleteQuestion(record.id);
if (response && response.success) {
message.success('删除成功');
message.success(intl.formatMessage({ id: 'userQuestion.deleteSuccess' }));
fetchQuestionList(pagination.current, pagination.pageSize, searchParams); // 重新加载数据
} else {
message.error(response.message || '删除失败');
message.error(response.message || intl.formatMessage({ id: 'userQuestion.deleteFailed' }));
}
} catch (error) {
console.error('删除问题失败:', error);
message.error('删除失败');
message.error(intl.formatMessage({ id: 'userQuestion.deleteFailed' }));
}
},
});
@ -182,31 +182,31 @@ const UnreadQuestionManage: React.FC = () => {
// 处理批量删除
const handleBatchDelete = () => {
if (selectedRowKeys.length === 0) {
message.warning('请至少选择一条记录');
message.warning(intl.formatMessage({ id: 'userQuestion.selectRequired' }));
return;
}
confirm({
title: '批量删除',
title: intl.formatMessage({ id: 'unreadQuestion.batchDelete' }),
icon: <ExclamationCircleOutlined />,
content: `确定要删除选中的 ${selectedRowKeys.length} 条记录吗?`,
okText: '删除',
content: intl.formatMessage({ id: 'userQuestion.batchDeleteConfirm' }),
okText: intl.formatMessage({ id: 'readQuestion.delete' }),
okType: 'danger',
cancelText: '取消',
cancelText: intl.formatMessage({ id: 'readQuestion.cancel' }),
maskClosable: false,
onOk: async () => {
try {
const response = await batchDeleteQuestion(selectedRowKeys as string[]);
if (response && response.success) {
setSelectedRowKeys([]);
message.success('批量删除成功');
message.success(intl.formatMessage({ id: 'unreadQuestion.batchDeleteSuccess' }));
fetchQuestionList(pagination.current, pagination.pageSize, searchParams);
} else {
message.error(response.message || '批量删除失败');
message.error(response.message || intl.formatMessage({ id: 'unreadQuestion.batchDeleteFailed' }));
}
} catch (error) {
console.error('批量删除失败:', error);
message.error('批量删除失败');
message.error(intl.formatMessage({ id: 'unreadQuestion.batchDeleteFailed' }));
}
},
});
@ -224,19 +224,25 @@ const UnreadQuestionManage: React.FC = () => {
const hasSelected = selectedRowKeys.length > 0;
// 问题分类选项
const categoryOptions = QuestionCategoryOptions;
// 获取分类选项,处理为下拉框选项
const getCategoryOptions = () => {
return QuestionCategoryOptions.map(option => (
<option key={option.value} value={option.value}>
{typeof option.label === 'function' ? option.label() : option.label}
</option>
));
};
// 表格列定义
const columns = [
{
title: '序号',
title: intl.formatMessage({ id: 'unreadQuestion.serialNumber' }),
render: (_: any, __: any, index: number) => index + 1,
width: 80,
align: 'center' as const,
},
{
title: '问题标题',
title: intl.formatMessage({ id: 'unreadQuestion.questionTitle' }),
dataIndex: 'title',
key: 'title',
ellipsis: {
@ -249,21 +255,21 @@ const UnreadQuestionManage: React.FC = () => {
),
},
{
title: '问题分类',
title: intl.formatMessage({ id: 'unreadQuestion.category' }),
dataIndex: 'type',
key: 'type',
width: 120,
align: 'center' as const,
},
{
title: '提问人',
title: intl.formatMessage({ id: 'unreadQuestion.asker' }),
dataIndex: 'userName',
key: 'userName',
width: 100,
align: 'center' as const,
},
{
title: '公司',
title: intl.formatMessage({ id: 'unreadQuestion.company' }),
dataIndex: 'companyName',
key: 'companyName',
width: 150,
@ -277,21 +283,21 @@ const UnreadQuestionManage: React.FC = () => {
),
},
{
title: '账号',
title: intl.formatMessage({ id: 'unreadQuestion.account' }),
dataIndex: 'fullName',
key: 'fullName',
width: 120,
align: 'center' as const,
},
{
title: '联系方式',
title: intl.formatMessage({ id: 'unreadQuestion.contact' }),
dataIndex: 'contactDetails',
key: 'contactDetails',
width: 120,
align: 'center' as const,
},
{
title: '邮箱',
title: intl.formatMessage({ id: 'unreadQuestion.email' }),
dataIndex: 'email',
key: 'email',
width: 150,
@ -305,7 +311,7 @@ const UnreadQuestionManage: React.FC = () => {
),
},
{
title: '提问时间',
title: intl.formatMessage({ id: 'unreadQuestion.askTime' }),
dataIndex: 'askTime',
key: 'askTime',
width: 150,
@ -313,17 +319,17 @@ const UnreadQuestionManage: React.FC = () => {
},
{
title: '操作',
title: intl.formatMessage({ id: 'unreadQuestion.operation' }),
key: 'action',
width: 150,
align: 'center' as const,
render: (_: unknown, record: QuestionItemType) => (
<Space>
<Button type="link" onClick={() => handleAnswer(record)}>
{intl.formatMessage({ id: 'unreadQuestion.reply' })}
</Button>
<Button type="link" onClick={() => showDeleteConfirm(record)}>
{intl.formatMessage({ id: 'unreadQuestion.delete' })}
</Button>
</Space>
),
@ -340,22 +346,18 @@ const UnreadQuestionManage: React.FC = () => {
layout="inline"
className="filter-form"
>
<Form.Item name="title" label="问题标题">
<Input placeholder="请输入问题标题关键词" allowClear />
<Form.Item name="title" label={intl.formatMessage({ id: 'unreadQuestion.questionTitle' })}>
<Input placeholder={intl.formatMessage({ id: 'unreadQuestion.questionPlaceholder' })} allowClear />
</Form.Item>
<Form.Item name="type" label="问题分类">
<Form.Item name="type" label={intl.formatMessage({ id: 'unreadQuestion.category' })}>
<select className="ant-select" style={{ width: 150, height: 32, borderRadius: 2 }}>
<option value=""></option>
{categoryOptions.map(option => (
<option key={option.value} value={option.value}>
{option.label}
</option>
))}
<option value="">{intl.formatMessage({ id: 'helpCenter.all' })}</option>
{getCategoryOptions()}
</select>
</Form.Item>
<Form.Item className="filter-btns">
<Button type="primary" htmlType="submit" icon={<SearchOutlined />}>
{intl.formatMessage({ id: 'unreadQuestion.search' })}
</Button>
<Button
type="primary"
@ -366,7 +368,7 @@ const UnreadQuestionManage: React.FC = () => {
fetchQuestionList(1, pagination.pageSize, { isAnswer: 0 });
}}
>
{intl.formatMessage({ id: 'unreadQuestion.reset' })}
</Button>
</Form.Item>
</Form>
@ -378,11 +380,11 @@ const UnreadQuestionManage: React.FC = () => {
disabled={!hasSelected}
loading={loading}
>
{intl.formatMessage({ id: 'unreadQuestion.batchDelete' })}
</Button>
{hasSelected && (
<span className="selected-count">
{selectedRowKeys.length}
{intl.formatMessage({ id: 'unreadQuestion.selectedCount' }, { count: selectedRowKeys.length })}
</span>
)}
</div>