feat: 部署到服务器+移动端适配+帮助系统RAG集成+网页图标

- 部署脚本 deploy.sh:一键部署到 154.8.162.18,端口3400,Nginx conf.d
- 应用名改为「企业用工专家」(登录/注册/侧边栏/员工端等6处)
- 移动端适配修复:Attendance/Dashboard/Settings/Contracts 6处grid响应式
- 帮助系统:HelpModal 组件 + TopNav 帮助图标 + RAG语义搜索集成
  - 后端 rag.service.ts 新增23条帮助种子数据 + searchHelp()
  - 前端搜索调用 /ai/rag/help-search,RAG不可用时回退关键词匹配
- 网页图标 favicon.svg(indigo主色+建筑人形图案)
- index.html 标题改为「企业用工专家」
This commit is contained in:
selfrelease
2026-07-27 10:10:07 +08:00
parent 71e2bb2412
commit 3f39c56f4b
16 changed files with 1014 additions and 15 deletions
+1 -1
View File
@@ -56,7 +56,7 @@ export default function Attendance() {
{/* 统计卡片 */}
{stats && (
<div className="grid grid-cols-4 gap-2">
<div className="grid grid-cols-2 sm:grid-cols-4 gap-2">
{[
{ label: '总计', value: stats.total, color: 'text-gray-700' },
{ label: '待确认', value: stats.pending, color: 'text-amber-600' },
+1 -1
View File
@@ -318,7 +318,7 @@ function AddEmployeeModal({ open, onClose, onSubmit, loading, error }: {
</div>
{form.contractType === 'FIXED' && (
<div className="grid grid-cols-3 gap-3">
<div className="grid grid-cols-1 sm:grid-cols-3 gap-3">
<div>
<Label></Label>
<Input type="date" value={form.endDate} onChange={(e) => setForm({ ...form, endDate: e.target.value })} />
+1 -1
View File
@@ -727,7 +727,7 @@ export default function Dashboard() {
{/* 企业成本 */}
<div className="border-t pt-2 space-y-2">
<div className="text-xs font-medium text-gray-600 mb-1"></div>
<div className="grid grid-cols-3 gap-2">
<div className="grid grid-cols-1 sm:grid-cols-3 gap-2">
<div className="flex items-center justify-between p-2 rounded-md bg-blue-50">
<span className="text-xs text-gray-500 flex items-center gap-1"><Building2 className="w-3 h-3" /></span>
<span className="text-xs font-medium text-blue-700">{fmt(payroll.socialOrg)}</span>
+2 -2
View File
@@ -174,7 +174,7 @@ function RetirementSection({ enabled, onToggle }: { enabled: boolean; onToggle:
const renderPolicyRules = () => (
<div className="space-y-2">
<div className="text-xs font-medium text-gray-600">退 退</div>
<div className="grid grid-cols-3 gap-2">
<div className="grid grid-cols-1 sm:grid-cols-3 gap-2">
<div className="bg-white rounded-md p-2 text-center border border-gray-200">
<div className="text-xs text-gray-500"></div>
<div className="text-sm font-semibold text-gray-700">60 63</div>
@@ -562,7 +562,7 @@ function PlanSettings({ orgData }: { orgData: any }) {
{usageData && (
<Card>
<h3 className="text-xs font-medium text-gray-700 mb-3"></h3>
<div className="grid grid-cols-3 gap-4 text-xs">
<div className="grid grid-cols-1 sm:grid-cols-3 gap-4 text-xs">
<div>
<div className="text-gray-500"></div>
<div className="font-medium text-base">{usageData.employeeCount}<span className="text-gray-500 text-xs">/{usageData.maxEmployees}</span></div>
+1 -1
View File
@@ -60,7 +60,7 @@ export default function ForgotPassword() {
<div className="w-full max-w-sm">
<div className="flex items-center justify-center gap-2 mb-8">
<Building2 className="w-8 h-8 text-primary" />
<span className="text-xl font-bold"></span>
<span className="text-xl font-bold"></span>
</div>
<div className="card">
+1 -1
View File
@@ -50,7 +50,7 @@ export default function Login() {
<div className="w-full max-w-sm">
<div className="flex items-center justify-center gap-2 mb-8">
<Building2 className="w-8 h-8 text-primary" />
<span className="text-xl font-bold"></span>
<span className="text-xl font-bold"></span>
</div>
<div className="card">
+1 -1
View File
@@ -51,7 +51,7 @@ export default function Register() {
<div className="w-full max-w-sm">
<div className="flex items-center justify-center gap-2 mb-8">
<Building2 className="w-8 h-8 text-primary" />
<span className="text-xl font-bold"></span>
<span className="text-xl font-bold"></span>
</div>
<div className="card">
+1 -1
View File
@@ -64,7 +64,7 @@ export default function PortalLogin() {
<div className="w-full max-w-sm">
<div className="flex items-center justify-center gap-2 mb-8">
<Building2 className="w-8 h-8 text-primary" />
<span className="text-base font-bold"> </span>
<span className="text-base font-bold"> </span>
</div>
<div className="card">