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
@@ -0,0 +1,40 @@
.apply {
padding: 16px;
}
.form {
background: #fff;
border-radius: 8px;
padding: 16px;
}
.group {
margin-bottom: 16px;
}
.group label {
display: block;
margin-bottom: 8px;
font-size: 14px;
color: #333;
}
.group input {
width: 100%;
padding: 10px 12px;
border: 1px solid #e5e5e5;
border-radius: 4px;
font-size: 14px;
}
.submitBtn {
width: 100%;
padding: 12px;
border: none;
border-radius: 6px;
background: #1677ff;
color: #fff;
font-size: 16px;
font-weight: 500;
cursor: pointer;
}
@@ -0,0 +1,23 @@
import styles from './apply.module.css'
export default function BusinessTripApply() {
return (
<div className={styles.apply}>
<form className={styles.form}>
<div className={styles.group}>
<label>出差事由</label>
<input type="text" placeholder="请输入出差事由" />
</div>
<div className={styles.group}>
<label>出差时间</label>
<input type="text" placeholder="请选择出差时间" />
</div>
<div className={styles.group}>
<label>出差地点</label>
<input type="text" placeholder="请输入出差地点" />
</div>
<button type="button" className={styles.submitBtn}>提交申请</button>
</form>
</div>
)
}
@@ -0,0 +1,39 @@
.detail {
padding: 16px;
}
.card {
background: #fff;
border-radius: 8px;
padding: 16px;
margin-bottom: 16px;
}
.card h2 {
margin: 0 0 12px 0;
font-size: 16px;
}
.actions {
display: flex;
gap: 12px;
}
.actions button {
flex: 1;
padding: 12px;
border: none;
border-radius: 6px;
font-size: 16px;
cursor: pointer;
}
.approveBtn {
background: #52c41a;
color: #fff;
}
.rejectBtn {
background: #ff4d4f;
color: #fff;
}
@@ -0,0 +1,16 @@
import styles from './detail.module.css'
export default function BusinessTripDetail() {
return (
<div className={styles.detail}>
<div className={styles.card}>
<h2>出差申请详情</h2>
<p>详情内容...</p>
</div>
<div className={styles.actions}>
<button className={styles.approveBtn}>通过</button>
<button className={styles.rejectBtn}>拒绝</button>
</div>
</div>
)
}
@@ -0,0 +1,32 @@
.list {
padding: 16px;
}
.tabs {
display: flex;
gap: 8px;
margin-bottom: 16px;
}
.tab {
flex: 1;
padding: 8px 12px;
border: none;
background: #f5f5f5;
border-radius: 6px;
font-size: 14px;
color: #666;
cursor: pointer;
}
.tab.active {
background: #1677ff;
color: #fff;
}
.empty {
padding: 60px 0;
text-align: center;
color: #999;
font-size: 14px;
}
+14
View File
@@ -0,0 +1,14 @@
import styles from './list.module.css'
export default function BusinessTripList() {
return (
<div className={styles.list}>
<div className={styles.tabs}>
<button className={`${styles.tab} ${styles.active}`}>我发起的</button>
<button className={styles.tab}>待我审批</button>
<button className={styles.tab}>我已审批</button>
</div>
<div className={styles.empty}>暂无出差申请</div>
</div>
)
}