Initial commit: X-Server Mobile enterprise tool system

- Frontend: React 18 + TypeScript + Vite + Ant Design Mobile
- Backend: PHP 8.5 + Webman 2.x + MySQL + Redis
- i18n support: Chinese, English, Russian, Spanish, French
- Approval workflow engine
- Docker development environment
- Feishu integration

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-02-24 17:57:25 +08:00
commit 8d78e18267
121 changed files with 18563 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
/**
* 国际化配置
* 支持:中文(zh)、英文(en)、俄语(ru)、西语(es)、法语(fr)
*/
import i18n from 'i18next'
import { initReactI18next } from 'react-i18next'
import LanguageDetector from 'i18next-browser-languagedetector'
import zh from './locales/zh.json'
import en from './locales/en.json'
import ru from './locales/ru.json'
import es from './locales/es.json'
import fr from './locales/fr.json'
const resources = {
zh: { translation: zh },
en: { translation: en },
ru: { translation: ru },
es: { translation: es },
fr: { translation: fr },
}
i18n
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources,
fallbackLng: 'zh',
lng: 'zh',
debug: import.meta.env.DEV,
interpolation: {
escapeValue: false,
},
detection: {
order: ['localStorage', 'navigator'],
caches: ['localStorage'],
},
})
export default i18n
+150
View File
@@ -0,0 +1,150 @@
{
"app": {
"name": "Enterprise Tool System",
"title": "Enterprise Internal Tool Platform"
},
"tab": {
"home": "Home",
"apps": "Apps",
"profile": "Profile"
},
"common": {
"loading": "Loading...",
"confirm": "Confirm",
"cancel": "Cancel",
"submit": "Submit",
"save": "Save",
"delete": "Delete",
"edit": "Edit",
"search": "Search",
"refresh": "Refresh",
"back": "Back",
"close": "Close",
"select": "Select",
"all": "All",
"more": "More",
"total": "{{count}} items in total",
"noData": "No data",
"operation": "Operation",
"status": "Status",
"remark": "Remark",
"createTime": "Create Time",
"updateTime": "Update Time"
},
"dashboard": {
"welcome": "Welcome Back",
"greeting": "Hello, {{name}}",
"quickActions": "Quick Actions",
"myTodos": "My Todos",
"myApprovals": "My Approvals",
"notifications": "Notifications",
"recentlyUsed": "Recently Used"
},
"apps": {
"title": "App Center",
"businessTrip": "Business Trip",
"reimbursement": "Reimbursement",
"leave": "Leave Request",
"overtime": "Overtime",
"purchase": "Purchase Request",
"approval": "Approval",
"report": "Reports",
"settings": "Settings",
"addressBook": "Address Book",
"notice": "Notices",
"calendar": "Calendar",
"file": "Files"
},
"businessTrip": {
"title": "Business Trip",
"apply": "Apply",
"myTrips": "My Trips",
"pendingApproval": "Pending",
"approved": "Approved",
"rejected": "Rejected",
"cancelled": "Cancelled",
"tripTitle": "Trip Title",
"destination": "Destination",
"startDate": "Start Date",
"endDate": "End Date",
"duration": "Duration",
"reason": "Reason",
"budget": "Budget",
"submitter": "Applicant",
"submitTime": "Submit Time",
"approver": "Approver",
"approvalStatus": "Status",
"approvalComment": "Comment",
"confirmSubmit": "Confirm to submit?",
"confirmCancel": "Confirm to cancel?",
"submitSuccess": "Submitted successfully",
"cancelSuccess": "Cancelled successfully"
},
"approval": {
"title": "Approval",
"myApproval": "My Approval",
"pending": "Pending",
"approved": "Approved",
"rejected": "Rejected",
"detail": "Detail",
"approve": "Approve",
"reject": "Reject",
"comment": "Comment",
"submitComment": "Submit",
"confirmApprove": "Confirm to approve?",
"confirmReject": "Confirm to reject?",
"approveSuccess": "Approved",
"rejectSuccess": "Rejected",
"noPending": "No pending approvals",
"status": {
"pending": "Pending",
"approved": "Approved",
"rejected": "Rejected",
"cancelled": "Cancelled"
}
},
"profile": {
"title": "Profile",
"myInfo": "My Info",
"myMessages": "Messages",
"settings": "Settings",
"about": "About",
"logout": "Logout",
"language": "Language",
"switchCompany": "Switch Company",
"notifications": "Notifications",
"security": "Security"
},
"login": {
"title": "Login",
"username": "Username",
"password": "Password",
"loginBtn": "Login",
"feishuLogin": "Feishu Login",
"loginSuccess": "Login successful",
"loginFailed": "Login failed"
},
"settings": {
"language": "Language",
"theme": "Theme",
"notifications": "Notifications"
},
"error": {
"networkError": "Network error, please try again later",
"serverError": "Server error",
"unauthorized": "Unauthorized, please login first",
"forbidden": "Forbidden",
"notFound": "Page not found",
"unknownError": "Unknown error"
},
"time": {
"today": "Today",
"yesterday": "Yesterday",
"thisWeek": "This Week",
"lastWeek": "Last Week",
"thisMonth": "This Month",
"lastMonth": "Last Month",
"thisYear": "This Year",
"lastYear": "Last Year"
}
}
+150
View File
@@ -0,0 +1,150 @@
{
"app": {
"name": "Sistema Empresarial",
"title": "Plataforma de Herramientas Empresariales"
},
"tab": {
"home": "Inicio",
"apps": "Aplicaciones",
"profile": "Perfil"
},
"common": {
"loading": "Cargando...",
"confirm": "Confirmar",
"cancel": "Cancelar",
"submit": "Enviar",
"save": "Guardar",
"delete": "Eliminar",
"edit": "Editar",
"search": "Buscar",
"refresh": "Actualizar",
"back": "Atrás",
"close": "Cerrar",
"select": "Seleccionar",
"all": "Todos",
"more": "Más",
"total": "{{count}} en total",
"noData": "Sin datos",
"operation": "Operación",
"status": "Estado",
"remark": "Observación",
"createTime": "Fecha de creación",
"updateTime": "Fecha de actualización"
},
"dashboard": {
"welcome": "Bienvenido de nuevo",
"greeting": "Hola, {{name}}",
"quickActions": "Acciones rápidas",
"myTodos": "Mis pendientes",
"myApprovals": "Mis aprobaciones",
"notifications": "Notificaciones",
"recentlyUsed": "Usados recientemente"
},
"apps": {
"title": "Centro de Aplicaciones",
"businessTrip": "Viaje de Negocios",
"reimbursement": "Reembolso",
"leave": "Solicitud de Permiso",
"overtime": "Horas Extra",
"purchase": "Solicitud de Compra",
"approval": "Aprobaciones",
"report": "Reportes",
"settings": "Configuración",
"addressBook": "Directorio",
"notice": "Avisos",
"calendar": "Calendario",
"file": "Archivos"
},
"businessTrip": {
"title": "Viaje de Negocios",
"apply": "Solicitar",
"myTrips": "Mis Viajes",
"pendingApproval": "Pendiente",
"approved": "Aprobado",
"rejected": "Rechazado",
"cancelled": "Cancelado",
"tripTitle": "Título del Viaje",
"destination": "Destino",
"startDate": "Fecha de Inicio",
"endDate": "Fecha de Fin",
"duration": "Duración",
"reason": "Motivo",
"budget": "Presupuesto",
"submitter": "Solicitante",
"submitTime": "Fecha de Solicitud",
"approver": "Aprobador",
"approvalStatus": "Estado de Aprobación",
"approvalComment": "Comentario",
"confirmSubmit": "¿Confirmar envío?",
"confirmCancel": "¿Confirmar cancelación?",
"submitSuccess": "Enviado exitosamente",
"cancelSuccess": "Cancelado exitosamente"
},
"approval": {
"title": "Aprobaciones",
"myApproval": "Mis Aprobaciones",
"pending": "Pendiente",
"approved": "Aprobado",
"rejected": "Rechazado",
"detail": "Detalle",
"approve": "Aprobar",
"reject": "Rechazar",
"comment": "Comentario",
"submitComment": "Enviar",
"confirmApprove": "¿Confirmar aprobación?",
"confirmReject": "¿Confirmar rechazo?",
"approveSuccess": "Aprobado",
"rejectSuccess": "Rechazado",
"noPending": "Sin aprobaciones pendientes",
"status": {
"pending": "Pendiente",
"approved": "Aprobado",
"rejected": "Rechazado",
"cancelled": "Cancelado"
}
},
"profile": {
"title": "Mi Perfil",
"myInfo": "Mi Información",
"myMessages": "Mis Mensajes",
"settings": "Configuración",
"about": "Acerca de",
"logout": "Cerrar Sesión",
"language": "Idioma",
"switchCompany": "Cambiar Empresa",
"notifications": "Notificaciones",
"security": "Seguridad"
},
"login": {
"title": "Iniciar Sesión",
"username": "Usuario",
"password": "Contraseña",
"loginBtn": "Entrar",
"feishuLogin": "Entrar con Feishu",
"loginSuccess": "Inicio de sesión exitoso",
"loginFailed": "Error de inicio de sesión"
},
"settings": {
"language": "Idioma",
"theme": "Tema",
"notifications": "Notificaciones"
},
"error": {
"networkError": "Error de red, inténtelo más tarde",
"serverError": "Error del servidor",
"unauthorized": "No autorizado, inicie sesión primero",
"forbidden": "Acceso prohibido",
"notFound": "Página no encontrada",
"unknownError": "Error desconocido"
},
"time": {
"today": "Hoy",
"yesterday": "Ayer",
"thisWeek": "Esta Semana",
"lastWeek": "Semana Pasada",
"thisMonth": "Este Mes",
"lastMonth": "Mes Pasado",
"thisYear": "Este Año",
"lastYear": "Año Pasado"
}
}
+150
View File
@@ -0,0 +1,150 @@
{
"app": {
"name": "Système d'Entreprise",
"title": "Plateforme d'Outils Entreprise"
},
"tab": {
"home": "Accueil",
"apps": "Applications",
"profile": "Profil"
},
"common": {
"loading": "Chargement...",
"confirm": "Confirmer",
"cancel": "Annuler",
"submit": "Soumettre",
"save": "Enregistrer",
"delete": "Supprimer",
"edit": "Modifier",
"search": "Rechercher",
"refresh": "Actualiser",
"back": "Retour",
"close": "Fermer",
"select": "Sélectionner",
"all": "Tous",
"more": "Plus",
"total": "{{count}} au total",
"noData": "Aucune donnée",
"operation": "Opération",
"status": "Statut",
"remark": "Remarque",
"createTime": "Date de création",
"updateTime": "Date de mise à jour"
},
"dashboard": {
"welcome": "Bienvenue",
"greeting": "Bonjour, {{name}}",
"quickActions": "Actions Rapides",
"myTodos": "Mes Tâches",
"myApprovals": "Mes Approbations",
"notifications": "Notifications",
"recentlyUsed": "Récemment Utilisés"
},
"apps": {
"title": "Centre d'Applications",
"businessTrip": "Déplacement",
"reimbursement": "Remboursement",
"leave": "Demande de Congé",
"overtime": "Heures Supplémentaires",
"purchase": "Demande d'Achat",
"approval": "Approbations",
"report": "Rapports",
"settings": "Paramètres",
"addressBook": "Contacts",
"notice": "Annonces",
"calendar": "Calendrier",
"file": "Fichiers"
},
"businessTrip": {
"title": "Déplacement Professionnel",
"apply": "Demander",
"myTrips": "Mes Déplacements",
"pendingApproval": "En Attente",
"approved": "Approuvé",
"rejected": "Rejeté",
"cancelled": "Annulé",
"tripTitle": "Titre du Déplacement",
"destination": "Destination",
"startDate": "Date de Début",
"endDate": "Date de Fin",
"duration": "Durée",
"reason": "Motif",
"budget": "Budget",
"submitter": "Demandeur",
"submitTime": "Date de Soumission",
"approver": "Approbateur",
"approvalStatus": "Statut d'Approbation",
"approvalComment": "Commentaire",
"confirmSubmit": "Confirmer la soumission?",
"confirmCancel": "Confirmer l'annulation?",
"submitSuccess": "Soumis avec succès",
"cancelSuccess": "Annulé avec succès"
},
"approval": {
"title": "Approbations",
"myApproval": "Mes Approbations",
"pending": "En Attente",
"approved": "Approuvé",
"rejected": "Rejeté",
"detail": "Détail",
"approve": "Approuver",
"reject": "Rejeter",
"comment": "Commentaire",
"submitComment": "Soumettre",
"confirmApprove": "Confirmer l'approbation?",
"confirmReject": "Confirmer le rejet?",
"approveSuccess": "Approuvé",
"rejectSuccess": "Rejeté",
"noPending": "Aucune approbation en attente",
"status": {
"pending": "En Attente",
"approved": "Approuvé",
"rejected": "Rejeté",
"cancelled": "Annulé"
}
},
"profile": {
"title": "Mon Profil",
"myInfo": "Mes Informations",
"myMessages": "Mes Messages",
"settings": "Paramètres",
"about": "À Propos",
"logout": "Déconnexion",
"language": "Langue",
"switchCompany": "Changer d'Entreprise",
"notifications": "Notifications",
"security": "Sécurité"
},
"login": {
"title": "Connexion",
"username": "Nom d'utilisateur",
"password": "Mot de passe",
"loginBtn": "Se Connecter",
"feishuLogin": "Connexion Feishu",
"loginSuccess": "Connexion réussie",
"loginFailed": "Échec de la connexion"
},
"settings": {
"language": "Langue",
"theme": "Thème",
"notifications": "Notifications"
},
"error": {
"networkError": "Erreur réseau, veuillez réessayer plus tard",
"serverError": "Erreur du serveur",
"unauthorized": "Non autorisé, veuillez vous connecter d'abord",
"forbidden": "Accès interdit",
"notFound": "Page non trouvée",
"unknownError": "Erreur inconnue"
},
"time": {
"today": "Aujourd'hui",
"yesterday": "Hier",
"thisWeek": "Cette Semaine",
"lastWeek": "Semaine Dernière",
"thisMonth": "Ce Mois",
"lastMonth": "Mois Dernier",
"thisYear": "Cette Année",
"lastYear": "Année Dernière"
}
}
+150
View File
@@ -0,0 +1,150 @@
{
"app": {
"name": "Корпоративная система",
"title": "Корпоративная платформа инструментов"
},
"tab": {
"home": "Главная",
"apps": "Приложения",
"profile": "Профиль"
},
"common": {
"loading": "Загрузка...",
"confirm": "Подтвердить",
"cancel": "Отмена",
"submit": "Отправить",
"save": "Сохранить",
"delete": "Удалить",
"edit": "Редактировать",
"search": "Поиск",
"refresh": "Обновить",
"back": "Назад",
"close": "Закрыть",
"select": "Выбрать",
"all": "Все",
"more": "Больше",
"total": "Всего {{count}}",
"noData": "Нет данных",
"operation": "Операция",
"status": "Статус",
"remark": "Примечание",
"createTime": "Время создания",
"updateTime": "Время обновления"
},
"dashboard": {
"welcome": "Добро пожаловать",
"greeting": "Здравствуйте, {{name}}",
"quickActions": "Быстрые действия",
"myTodos": "Мои задачи",
"myApprovals": "Мои согласования",
"notifications": "Уведомления",
"recentlyUsed": "Недавно использованные"
},
"apps": {
"title": "Центр приложений",
"businessTrip": "Командировка",
"reimbursement": "Возмещение расходов",
"leave": "Отпуск",
"overtime": "Сверхурочные",
"purchase": "Заявка на покупку",
"approval": "Согласование",
"report": "Отчеты",
"settings": "Настройки",
"addressBook": "Адресная книга",
"notice": "Объявления",
"calendar": "Календарь",
"file": "Файлы"
},
"businessTrip": {
"title": "Командировка",
"apply": "Подать заявку",
"myTrips": "Мои командировки",
"pendingApproval": "Ожидает согласования",
"approved": "Согласовано",
"rejected": "Отклонено",
"cancelled": "Отменено",
"tripTitle": "Название командировки",
"destination": "Место назначения",
"startDate": "Дата начала",
"endDate": "Дата окончания",
"duration": "Продолжительность",
"reason": "Причина",
"budget": "Бюджет",
"submitter": "Заявитель",
"submitTime": "Время подачи",
"approver": "Согласующий",
"approvalStatus": "Статус согласования",
"approvalComment": "Комментарий",
"confirmSubmit": "Подтвердить отправку?",
"confirmCancel": "Подтвердить отмену?",
"submitSuccess": "Успешно отправлено",
"cancelSuccess": "Успешно отменено"
},
"approval": {
"title": "Согласование",
"myApproval": "Мои согласования",
"pending": "Ожидает",
"approved": "Согласовано",
"rejected": "Отклонено",
"detail": "Детали",
"approve": "Согласовать",
"reject": "Отклонить",
"comment": "Комментарий",
"submitComment": "Отправить",
"confirmApprove": "Подтвердить согласование?",
"confirmReject": "Подтвердить отклонение?",
"approveSuccess": "Согласовано",
"rejectSuccess": "Отклонено",
"noPending": "Нет ожидающих согласований",
"status": {
"pending": "Ожидает",
"approved": "Согласовано",
"rejected": "Отклонено",
"cancelled": "Отменено"
}
},
"profile": {
"title": "Профиль",
"myInfo": "Моя информация",
"myMessages": "Мои сообщения",
"settings": "Настройки",
"about": "О программе",
"logout": "Выйти",
"language": "Язык",
"switchCompany": "Сменить компанию",
"notifications": "Уведомления",
"security": "Безопасность"
},
"login": {
"title": "Вход",
"username": "Имя пользователя",
"password": "Пароль",
"loginBtn": "Войти",
"feishuLogin": "Войти через Feishu",
"loginSuccess": "Успешный вход",
"loginFailed": "Ошибка входа"
},
"settings": {
"language": "Язык",
"theme": "Тема",
"notifications": "Уведомления"
},
"error": {
"networkError": "Ошибка сети, попробуйте позже",
"serverError": "Ошибка сервера",
"unauthorized": "Не авторизован, войдите сначала",
"forbidden": "Доступ запрещен",
"notFound": "Страница не найдена",
"unknownError": "Неизвестная ошибка"
},
"time": {
"today": "Сегодня",
"yesterday": "Вчера",
"thisWeek": "На этой неделе",
"lastWeek": "На прошлой неделе",
"thisMonth": "В этом месяце",
"lastMonth": "В прошлом месяце",
"thisYear": "В этом году",
"lastYear": "В прошлом году"
}
}
+150
View File
@@ -0,0 +1,150 @@
{
"app": {
"name": "企业工具系统",
"title": "企业内部工具平台"
},
"tab": {
"home": "首页",
"apps": "应用",
"profile": "我的"
},
"common": {
"loading": "加载中...",
"confirm": "确认",
"cancel": "取消",
"submit": "提交",
"save": "保存",
"delete": "删除",
"edit": "编辑",
"search": "搜索",
"refresh": "刷新",
"back": "返回",
"close": "关闭",
"select": "请选择",
"all": "全部",
"more": "更多",
"total": "共 {{count}} 条",
"noData": "暂无数据",
"operation": "操作",
"status": "状态",
"remark": "备注",
"createTime": "创建时间",
"updateTime": "更新时间"
},
"dashboard": {
"welcome": "欢迎回来",
"greeting": "你好,{{name}}",
"quickActions": "快捷操作",
"myTodos": "我的待办",
"myApprovals": "我的审批",
"notifications": "通知消息",
"recentlyUsed": "最近使用"
},
"apps": {
"title": "应用中心",
"businessTrip": "出差申请",
"reimbursement": "费用报销",
"leave": "请假申请",
"overtime": "加班申请",
"purchase": "采购申请",
"approval": "审批管理",
"report": "数据报表",
"settings": "系统设置",
"addressBook": "通讯录",
"notice": "通知公告",
"calendar": "日程安排",
"file": "文件管理"
},
"businessTrip": {
"title": "出差申请",
"apply": "申请出差",
"myTrips": "我的出差",
"pendingApproval": "待审批",
"approved": "已批准",
"rejected": "已拒绝",
"cancelled": "已撤销",
"tripTitle": "出差标题",
"destination": "目的地",
"startDate": "开始日期",
"endDate": "结束日期",
"duration": "出差天数",
"reason": "出差事由",
"budget": "预算金额",
"submitter": "申请人",
"submitTime": "申请时间",
"approver": "审批人",
"approvalStatus": "审批状态",
"approvalComment": "审批意见",
"confirmSubmit": "确认提交出差申请?",
"confirmCancel": "确认撤销此申请?",
"submitSuccess": "提交成功",
"cancelSuccess": "撤销成功"
},
"approval": {
"title": "审批管理",
"myApproval": "我的审批",
"pending": "待审批",
"approved": "已通过",
"rejected": "已拒绝",
"detail": "审批详情",
"approve": "通过",
"reject": "拒绝",
"comment": "审批意见",
"submitComment": "提交意见",
"confirmApprove": "确认通过此申请?",
"confirmReject": "确认拒绝此申请?",
"approveSuccess": "审批通过",
"rejectSuccess": "已拒绝",
"noPending": "暂无待审批事项",
"status": {
"pending": "待审批",
"approved": "已通过",
"rejected": "已拒绝",
"cancelled": "已撤销"
}
},
"profile": {
"title": "个人中心",
"myInfo": "我的信息",
"myMessages": "我的消息",
"settings": "设置",
"about": "关于",
"logout": "退出登录",
"language": "语言设置",
"switchCompany": "切换公司",
"notifications": "消息通知",
"security": "账号安全"
},
"login": {
"title": "登录",
"username": "用户名",
"password": "密码",
"loginBtn": "登录",
"feishuLogin": "飞书快捷登录",
"loginSuccess": "登录成功",
"loginFailed": "登录失败"
},
"settings": {
"language": "语言",
"theme": "主题",
"notifications": "通知设置"
},
"error": {
"networkError": "网络错误,请稍后重试",
"serverError": "服务器错误",
"unauthorized": "未授权,请先登录",
"forbidden": "无权访问",
"notFound": "页面不存在",
"unknownError": "未知错误"
},
"time": {
"today": "今天",
"yesterday": "昨天",
"thisWeek": "本周",
"lastWeek": "上周",
"thisMonth": "本月",
"lastMonth": "上月",
"thisYear": "今年",
"lastYear": "去年"
}
}