设计风格:极简主义,附加描述:<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>智慧财务报销系统</title> <script src="https://cdn.tailwindcss.com"></script> <link href="https://cdn.jsdelivr.net/npm/[email protected]/css/font-awesome.min.css" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/chart.umd.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/xlsx.full.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/JsBarcode.all.min.js"></script> <!-- Tailwind配置 --> <script> tailwind.config = { theme: { extend: { colors: { primary: '#165DFF', secondary: '#0FC6C2', accent: '#722ED1', success: '#00B42A', warning: '#FF7D00', danger: '#F53F3F', info: '#86909C', light: '#F2F3F5', dark: '#1D2129', 'primary-light': '#E8F3FF', }, fontFamily: { inter: ['Inter', 'system-ui', 'sans-serif'], }, }, } } </script> <style type="text/tailwindcss"> @layer utilities { .content-auto { content-visibility: auto; } .shadow-card { box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); } .transition-all-300 { transition: all 0.3s ease; } .hover-scale { transition: transform 0.2s ease; } .hover-scale:hover { transform: scale(1.02); } .scrollbar-hide::-webkit-scrollbar { display: none; } .scrollbar-hide { -ms-overflow-style: none; scrollbar-width: none; } } </style> </head> <body class="font-inter bg-gray-50 text-dark"> <!-- 侧边栏 --> <div class="fixed inset-y-0 left-0 z-50 w-64 transform transition-transform duration-300 ease-in-out bg-white shadow-lg lg:translate-x-0" id="sidebar"> <div class="flex items-center justify-between h-16 px-4 border-b"> <div class="flex items-center space-x-2"> <i class="fa fa-line-chart text-primary text-2xl"></i> <span class="text-xl font-bold text-primary">智慧财务报销系统</span> </div> <button class="lg:hidden text-gray-500 hover:text-gray-700" id="closeSidebar"> <i class="fa fa-times"></i> </button> </div> <div class="flex flex-col h-[calc(100vh-4rem)] overflow-y-auto scrollbar-hide"> <nav class="flex-1 px-4 py-6 space-y-1"> <a href="#dashboard" class="flex items-center px-3 py-2 text-sm font-medium rounded-md bg-primary-light text-primary"> <i class="fa fa-dashboard w-5 h-5 mr-3"></i> <span>控制面板</span> </a> <div class="mt-4"> <h3 class="px-3 text-xs font-semibold text-gray-500 uppercase tracking-wider"> 模板管理 </h3> <a href="#template-upload" class="flex items-center px-3 py-2 mt-1 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-100 hover:text-primary"> <i class="fa fa-upload w-5 h-5 mr-3"></i> <span>模板上传</span> </a> <a href="#template-list" class="flex items-center px-3 py-2 mt-1 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-100 hover:text-primary"> <i class="fa fa-list w-5 h-5 mr-3"></i> <span>模板列表</span> </a> </div> <div class="mt-4"> <h3 class="px-3 text-xs font-semibold text-gray-500 uppercase tracking-wider"> 报销管理 </h3> <a href="#expense-create" class="flex items-center px-3 py-2 mt-1 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-100 hover:text-primary"> <i class="fa fa-plus-circle w-5 h-5 mr-3"></i> <span>新建报销</span> </a> <a href="#expense-list" class="flex items-center px-3 py-2 mt-1 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-100 hover:text-primary"> <i class="fa fa-table w-5 h-5 mr-3"></i> <span>报销列表</span> </a> <a href="#expense-batch" class="flex items-center px-3 py-2 mt-1 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-100 hover:text-primary"> <i class="fa fa-clone w-5 h-5 mr-3"></i> <span>批量导入</span> </a> </div> <div class="mt-4"> <h3 class="px-3 text-xs font-semibold text-gray-500 uppercase tracking-wider"> 发票管理 </h3> <a href="#invoice-upload" class="flex items-center px-3 py-2 mt-1 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-100 hover:text-primary"> <i class="fa fa-camera w-5 h-5 mr-3"></i> <span>发票上传</span> </a> <a href="#invoice-list" class="flex items-center px-3 py-2 mt-1 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-100 hover:text-primary"> <i class="fa fa-file-text w-5 h-5 mr-3"></i> <span>发票列表</span> </a> </div> <div class="mt-4"> <h3 class="px-3 text-xs font-semibold text-gray-500 uppercase tracking-wider"> 系统管理 </h3> <a href="#user-management" class="flex items-center px-3 py-2 mt-1 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-100 hover:text-primary"> <i class="fa fa-users w-5 h-5 mr-3"></i> <span>用户管理</span> </a> <a href="#audit-logs" class="flex items-center px-3 py-2 mt-1 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-100 hover:text-primary"> <i class="fa fa-history w-5 h-5 mr-3"></i> <span>操作日志</span> </a> <a href="#system-settings" class="flex items-center px-3 py-2 mt-1 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-100 hover:text-primary"> <i class="fa fa-cog w-5 h-5 mr-3"></i> <span>系统设置</span> </a> </div> </nav> <div class="p-4 border-t"> <div class="flex items-center"> <img src="https://picsum.photos/id/1005/40/40" alt="用户头像" class="w-10 h-10 rounded-full"> <div class="ml-3"> <p class="text-sm font-medium text-gray-700">张财务</p> <p class="text-xs text-gray-500">财务主管</p> </div> </div> </div> </div> </div> <!-- 主内容区 --> <div class="min-h-screen lg:pl-64"> <!-- 顶部导航栏 --> <header class="fixed top-0 right-0 left-0 lg:left-64 z-40 h-16 bg-white shadow-sm"> <div class="flex items-center justify-between h-full px-4 lg:px-6"> <div class="flex items-center"> <button class="lg:hidden text-gray-500 hover:text-gray-700" id="openSidebar"> <i class="fa fa-bars"></i> </button> <div class="relative ml-4 lg:ml-0"> <span class="absolute inset-y-0 left-0 flex items-center pl-3"> <i class="fa fa-search text-gray-400"></i> </span> <input type="text" placeholder="搜索..." class="block w-full pl-10 pr-3 py-2 text-sm bg-gray-100 border-transparent rounded-md focus:bg-white focus:border-gray-300 focus:ring-0"> </div> </div> <div class="flex items-center space-x-4"> <button class="p-2 text-gray-500 hover:text-gray-700 hover:bg-gray-100 rounded-full"> <i class="fa fa-bell"></i> </button> <button class="p-2 text-gray-500 hover:text-gray-700 hover:bg-gray-100 rounded-full"> <i class="fa fa-question-circle"></i> </button> <div class="relative"> <button class="flex items-center space-x-2 focus:outline-none" id="userMenuButton"> <img src="https://picsum.photos/id/1005/32/32" alt="用户头像" class="w-8 h-8 rounded-full"> <span class="hidden md:block text-sm font-medium">张财务</span> <i class="fa fa-angle-down text-gray-400"></i> </button> <div class="hidden absolute right-0 mt-2 w-48 py-2 bg-white rounded-md shadow-lg z-50" id="userMenu"> <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100"> <i class="fa fa-user mr-2"></i>个人信息 </a> <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100"> <i class="fa fa-cog mr-2"></i>账户设置 </a> <div class="border-t border-gray-100 my-1"></div> <a href="#" class="block px-4 py-2 text-sm text-red-600 hover:bg-gray-100"> <i class="fa fa-sign-out mr-2"></i>退出登录 </a> </div> </div> </div> </div> </header> <!-- 页面内容 --> <main class="pt-16 pb-6 px-4 lg:px-6"> <!-- 控制面板 --> <section id="dashboard" class="py-6"> <div class="mb-6"> <h1 class="text-[clamp(1.5rem,3vw,2.5rem)] font-bold text-gray-900">控制面板</h1> <p class="mt-1 text-gray-600">欢迎使用智慧财务报销系统,今天是 <span id="currentDate"></span></p> </div> <!-- 统计卡片 --> <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8"> <div class="bg-white rounded-xl shadow-card p-6 hover-scale"> <div class="flex items-center justify-between"> <div> <p class="text-sm font-medium text-gray-500">今日报销</p> <h3 class="text-2xl font-bold mt-1">¥12,850.00</h3> <p class="text-xs mt-2 text-success"> <i class="fa fa-arrow-up"></i> 12.5% <span class="text-gray-500">较昨日</span> </p> </div> <div class="p-3 bg-primary-light rounded-lg"> <i class="fa fa-credit-card text-primary text-xl"></i> </div> </div> </div> <div class="bg-white rounded-xl shadow-card p-6 hover-scale"> <div class="flex items-center justify-between"> <div> <p class="text-sm font-medium text-gray-500">待审批</p> <h3 class="text-2xl font-bold mt-1">24</h3> <p class="text-xs mt-2 text-danger"> <i class="fa fa-arrow-up"></i> 8.3% <span class="text-gray-500">较昨日</span> </p> </div> <div class="p-3 bg-warning/10 rounded-lg"> <i class="fa fa-clock-o text-warning text-xl"></i> </div> </div> </div> <div class="bg-white rounded-xl shadow-card p-6 hover-scale"> <div class="flex items-center justify-between"> <div> <p class="text-sm font-medium text-gray-500">本月报销总额</p> <h3 class="text-2xl font-bold mt-1">¥186,245.00</h3> <p class="text-xs mt-2 text-success"> <i class="fa fa-arrow-up"></i> 5.2% <span class="text-gray-500">较上月</span> </p> </div> <div class="p-3 bg-success/10 rounded-lg"> <i class="fa fa-line-chart text-success text-xl"></i> </div> </div> </div> <div class="bg-white rounded-xl shadow-card p-6 hover-scale"> <div class="flex items-center justify-between"> <div> <p class="text-sm font-medium text-gray-500">已完成报销</p> <h3 class="text-2xl font-bold mt-1">187</h3> <p class="text-xs mt-2 text-success"> <i class="fa fa-arrow-up"></i> 15.3% <span class="text-gray-500">较上月</span> </p> </div> <div class="p-3 bg-secondary/10 rounded-lg"> <i class="fa fa-check-circle text-secondary text-xl"></i> </div> </div> </div> </div> <!-- 图表区域 --> <div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8"> <div class="bg-white rounded-xl shadow-card p-6 lg:col-span-2"> <div class="flex items-center justify-between mb-6"> <h3 class="font-semibold text-lg">报销趋势</h3> <div class="flex space-x-2"> <button class="px-3 py-1 text-xs bg-primary-light text-primary rounded-md">周</button> <button class="px-3 py-1 text-xs bg-gray-100 text-gray-500 rounded-md">月</button> <button class="px-3 py-1 text-xs bg-gray-100 text-gray-500 rounded-md">年</button> </div> </div> <div class="h-80"> <canvas id="expenseTrendChart"></canvas> </div> </div> <div class="bg-white rounded-xl shadow-card p-6"> <div class="flex items-center justify-between mb-6"> <h3 class="font-semibold text-lg">报销类型分布</h3> <button class="text-gray-400 hover:text-gray-600"> <i class="fa fa-ellipsis-v"></i> </button> </div> <div class="h-80"> <canvas id="expenseTypeChart"></canvas> </div> </div> </div> <!-- 最近报销和待办事项 --> <div class="grid grid-cols-1 lg:grid-cols-3 gap-6"> <div class="bg-white rounded-xl shadow-card p-6 lg:col-span-2"> <div class="flex items-center justify-between mb-6"> <h3 class="font-semibold text-lg">最近报销记录</h3> <a href="#expense-list" class="text-primary text-sm hover:underline">查看全部</a> </div> <div class="overflow-x-auto"> <table class="min-w-full"> <thead> <tr class="border-b"> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">报销单号</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">申请人</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">类型</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">金额</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">日期</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">状态</th> </tr> </thead> <tbody> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">BX20250715001</td> <td class="px-4 py-3 whitespace-nowrap text-sm">李小明</td> <td class="px-4 py-3 whitespace-nowrap text-sm">差旅费</td> <td class="px-4 py-3 whitespace-nowrap text-sm font-medium">¥3,250.00</td> <td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">2025-07-15</td> <td class="px-4 py-3 whitespace-nowrap"> <span class="px-2 py-1 text-xs font-medium bg-success/10 text-success rounded-full">已完成</span> </td> </tr> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">BX20250716002</td> <td class="px-4 py-3 whitespace-nowrap text-sm">王芳</td> <td class="px-4 py-3 whitespace-nowrap text-sm">办公用品</td> <td class="px-4 py-3 whitespace-nowrap text-sm font-medium">¥1,860.00</td> <td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">2025-07-16</td> <td class="px-4 py-3 whitespace-nowrap"> <span class="px-2 py-1 text-xs font-medium bg-warning/10 text-warning rounded-full">审批中</span> </td> </tr> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">BX20250716003</td> <td class="px-4 py-3 whitespace-nowrap text-sm">张伟</td> <td class="px-4 py-3 whitespace-nowrap text-sm">会议费</td> <td class="px-4 py-3 whitespace-nowrap text-sm font-medium">¥5,620.00</td> <td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">2025-07-16</td> <td class="px-4 py-3 whitespace-nowrap"> <span class="px-2 py-1 text-xs font-medium bg-danger/10 text-danger rounded-full">待修改</span> </td> </tr> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">BX20250717004</td> <td class="px-4 py-3 whitespace-nowrap text-sm">赵强</td> <td class="px-4 py-3 whitespace-nowrap text-sm">差旅费</td> <td class="px-4 py-3 whitespace-nowrap text-sm font-medium">¥2,180.00</td> <td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">2025-07-17</td> <td class="px-4 py-3 whitespace-nowrap"> <span class="px-2 py-1 text-xs font-medium bg-primary/10 text-primary rounded-full">已提交</span> </td> </tr> <tr class="hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">BX20250717005</td> <td class="px-4 py-3 whitespace-nowrap text-sm">陈丽</td> <td class="px-4 py-3 whitespace-nowrap text-sm">业务招待费</td> <td class="px-4 py-3 whitespace-nowrap text-sm font-medium">¥4,980.00</td> <td class="px-4 py-3 whitespace-nowrap text-sm text-gray-500">2025-07-17</td> <td class="px-4 py-3 whitespace-nowrap"> <span class="px-2 py-1 text-xs font-medium bg-success/10 text-success rounded-full">已完成</span> </td> </tr> </tbody> </table> </div> </div> <div class="bg-white rounded-xl shadow-card p-6"> <div class="flex items-center justify-between mb-6"> <h3 class="font-semibold text-lg">待办事项</h3> <button class="text-primary text-sm hover:underline">添加</button> </div> <div class="space-y-4"> <div class="flex items-start"> <div class="flex items-center h-5"> <input id="todo-1" type="checkbox" class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded"> </div> <div class="ml-3 text-sm"> <label for="todo-1" class="font-medium text-gray-700">审核差旅费报销单 BX20250716002</label> <p class="text-gray-500">王芳 · 2小时前</p> </div> </div> <div class="flex items-start"> <div class="flex items-center h-5"> <input id="todo-2" type="checkbox" class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded"> </div> <div class="ml-3 text-sm"> <label for="todo-2" class="font-medium text-gray-700">处理待修改报销单 BX20250716003</label> <p class="text-gray-500">张伟 · 3小时前</p> </div> </div> <div class="flex items-start"> <div class="flex items-center h-5"> <input id="todo-3" type="checkbox" class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded"> </div> <div class="ml-3 text-sm"> <label for="todo-3" class="font-medium text-gray-700">核对6月部门预算</label> <p class="text-gray-500">今日截止</p> </div> </div> <div class="flex items-start"> <div class="flex items-center h-5"> <input id="todo-4" type="checkbox" class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded" checked> </div> <div class="ml-3 text-sm"> <label for="todo-4" class="font-medium text-gray-500 line-through">更新报销系统版本</label> <p class="text-gray-500">已完成 · 昨天</p> </div> </div> <div class="flex items-start"> <div class="flex items-center h-5"> <input id="todo-5" type="checkbox" class="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded"> </div> <div class="ml-3 text-sm"> <label for="todo-5" class="font-medium text-gray-700">提交季度财务报表</label> <p class="text-gray-500">7月20日前</p> </div> </div> </div> </div> </div> </section> <!-- 模板上传页面 --> <section id="template-upload" class="py-6 hidden"> <div class="mb-6"> <h1 class="text-[clamp(1.5rem,3vw,2.5rem)] font-bold text-gray-900">Excel模板上传</h1> <p class="mt-1 text-gray-600">上传Excel报销模板,系统将自动识别表格结构</p> </div> <div class="bg-white rounded-xl shadow-card p-6 mb-8"> <div class="border-2 border-dashed border-gray-300 rounded-lg p-8 text-center hover:border-primary transition-all-300" id="dropZone"> <i class="fa fa-cloud-upload text-gray-400 text-4xl mb-4"></i> <h3 class="text-lg font-medium text-gray-700 mb-2">拖放Excel文件到此处,或点击选择文件</h3> <p class="text-sm text-gray-500 mb-6">支持 .xlsx, .xls 格式文件</p> <input type="file" id="templateFile" accept=".xlsx,.xls" class="hidden"> <button class="px-6 py-2 bg-primary text-white rounded-md hover:bg-primary/90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary" onclick="document.getElementById('templateFile').click()"> 选择文件 </button> </div> </div> <div id="templatePreview" class="hidden"> <div class="bg-white rounded-xl shadow-card p-6 mb-8"> <h3 class="font-semibold text-lg mb-4">模板预览</h3> <div class="mb-6"> <div class="flex items-center justify-between mb-3"> <h4 class="font-medium">员工差旅报销单.xlsx</h4> <div class="flex space-x-2"> <button class="text-primary hover:text-primary/80"> <i class="fa fa-download mr-1"></i> 下载 </button> <button class="text-gray-500 hover:text-gray-700"> <i class="fa fa-trash mr-1"></i> 删除 </button> </div> </div> <div class="border rounded-lg overflow-hidden"> <img src="https://picsum.photos/id/180/800/400" alt="Excel模板预览" class="w-full h-auto"> </div> </div> <h3 class="font-semibold text-lg mb-4">模板信息</h3> <div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-6"> <div> <label class="block text-sm font-medium text-gray-700 mb-1">模板名称</label> <input type="text" value="员工差旅报销单" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">模板类型</label> <select class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> <option>差旅费</option> <option>办公用品</option> <option>业务招待费</option> <option>会议费</option> <option>其他</option> </select> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">适用部门</label> <select class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent" multiple> <option selected>财务部</option> <option selected>人力资源部</option> <option>市场部</option> <option>技术部</option> <option>销售部</option> </select> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">创建人</label> <input type="text" value="张财务" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent" readonly> </div> </div> <h3 class="font-semibold text-lg mb-4">表格结构识别</h3> <div class="overflow-x-auto mb-6"> <table class="min-w-full"> <thead> <tr class="border-b"> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">字段名称</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">数据类型</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">是否必填</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">操作</th> </tr> </thead> <tbody> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">员工姓名</td> <td class="px-4 py-3 whitespace-nowrap text-sm">文本</td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <span class="px-2 py-1 text-xs font-medium bg-danger/10 text-danger rounded-full">是</span> </td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <button class="text-primary hover:text-primary/80">编辑</button> </td> </tr> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">部门</td> <td class="px-4 py-3 whitespace-nowrap text-sm">文本</td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <span class="px-2 py-1 text-xs font-medium bg-danger/10 text-danger rounded-full">是</span> </td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <button class="text-primary hover:text-primary/80">编辑</button> </td> </tr> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">职位</td> <td class="px-4 py-3 whitespace-nowrap text-sm">文本</td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <span class="px-2 py-1 text-xs font-medium bg-success/10 text-success rounded-full">否</span> </td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <button class="text-primary hover:text-primary/80">编辑</button> </td> </tr> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">出差日期</td> <td class="px-4 py-3 whitespace-nowrap text-sm">日期</td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <span class="px-2 py-1 text-xs font-medium bg-danger/10 text-danger rounded-full">是</span> </td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <button class="text-primary hover:text-primary/80">编辑</button> </td> </tr> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">返回日期</td> <td class="px-4 py-3 whitespace-nowrap text-sm">日期</td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <span class="px-2 py-1 text-xs font-medium bg-danger/10 text-danger rounded-full">是</span> </td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <button class="text-primary hover:text-primary/80">编辑</button> </td> </tr> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">出差地点</td> <td class="px-4 py-3 whitespace-nowrap text-sm">文本</td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <span class="px-2 py-1 text-xs font-medium bg-danger/10 text-danger rounded-full">是</span> </td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <button class="text-primary hover:text-primary/80">编辑</button> </td> </tr> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">交通工具</td> <td class="px-4 py-3 whitespace-nowrap text-sm">文本</td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <span class="px-2 py-1 text-xs font-medium bg-success/10 text-success rounded-full">否</span> </td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <button class="text-primary hover:text-primary/80">编辑</button> </td> </tr> <tr class="hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap text-sm">住宿费</td> <td class="px-4 py-3 whitespace-nowrap text-sm">数字</td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <span class="px-2 py-1 text-xs font-medium bg-success/10 text-success rounded-full">否</span> </td> <td class="px-4 py-3 whitespace-nowrap text-sm"> <button class="text-primary hover:text-primary/80">编辑</button> </td> </tr> </tbody> </table> </div> <div class="flex justify-end space-x-3"> <button class="px-4 py-2 border border-gray-300 rounded-md text-gray-700 hover:bg-gray-50"> 取消 </button> <button class="px-4 py-2 bg-primary text-white rounded-md hover:bg-primary/90"> 保存模板 </button> </div> </div> </div> </section> <!-- 发票上传页面 --> <section id="invoice-upload" class="py-6 hidden"> <div class="mb-6"> <h1 class="text-[clamp(1.5rem,3vw,2.5rem)] font-bold text-gray-900">发票上传</h1> <p class="mt-1 text-gray-600">上传发票照片或PDF,系统将自动识别发票信息</p> </div> <div class="grid grid-cols-1 lg:grid-cols-3 gap-6"> <div class="bg-white rounded-xl shadow-card p-6 lg:col-span-2"> <div class="border-2 border-dashed border-gray-300 rounded-lg p-8 text-center hover:border-primary transition-all-300" id="invoiceDropZone"> <i class="fa fa-file-image-o text-gray-400 text-4xl mb-4"></i> <h3 class="text-lg font-medium text-gray-700 mb-2">拖放发票文件到此处,或点击选择文件</h3> <p class="text-sm text-gray-500 mb-6">支持 JPG, PNG, PDF 格式文件</p> <input type="file" id="invoiceFile" accept="image/*,.pdf" class="hidden" multiple> <button class="px-6 py-2 bg-primary text-white rounded-md hover:bg-primary/90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary" onclick="document.getElementById('invoiceFile').click()"> 选择文件 </button> </div> <div id="invoicePreview" class="mt-6 grid grid-cols-1 md:grid-cols-2 gap-4 hidden"> <div class="border rounded-lg overflow-hidden"> <img src="https://picsum.photos/id/1/300/400" alt="发票预览" class="w-full h-auto"> <div class="p-3 bg-gray-50"> <div class="flex items-center justify-between"> <span class="text-sm font-medium">住宿费发票.jpg</span> <button class="text-gray-500 hover:text-gray-700"> <i class="fa fa-trash"></i> </button> </div> </div> </div> <div class="border rounded-lg overflow-hidden"> <img src="https://picsum.photos/id/2/300/400" alt="发票预览" class="w-full h-auto"> <div class="p-3 bg-gray-50"> <div class="flex items-center justify-between"> <span class="text-sm font-medium">交通费发票.jpg</span> <button class="text-gray-500 hover:text-gray-700"> <i class="fa fa-trash"></i> </button> </div> </div> </div> </div> </div> <div class="bg-white rounded-xl shadow-card p-6"> <h3 class="font-semibold text-lg mb-4">发票信息</h3> <div class="space-y-4"> <div> <label class="block text-sm font-medium text-gray-700 mb-1">发票类型</label> <select class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> <option>增值税专用发票</option> <option selected>增值税普通发票</option> <option>通用机打发票</option> <option>其他</option> </select> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">发票代码</label> <input type="text" value="1100251320" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">发票号码</label> <input type="text" value="01234567" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">开票日期</label> <input type="date" value="2025-07-15" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">购买方名称</label> <input type="text" value="北京智慧科技有限公司" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">金额</label> <input type="text" value="3,250.00" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">税额</label> <input type="text" value="390.00" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">价税合计</label> <input type="text" value="3,640.00" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">发票状态</label> <select class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> <option selected>正常</option> <option>作废</option> <option>红冲</option> </select> </div> <div class="flex justify-end space-x-3 pt-4"> <button class="px-4 py-2 border border-gray-300 rounded-md text-gray-700 hover:bg-gray-50"> 取消 </button> <button class="px-4 py-2 bg-primary text-white rounded-md hover:bg-primary/90"> 保存发票 </button> </div> </div> </div> </div> </section> <!-- 新建报销页面 --> <section id="expense-create" class="py-6 hidden"> <div class="mb-6"> <h1 class="text-[clamp(1.5rem,3vw,2.5rem)] font-bold text-gray-900">新建报销</h1> <p class="mt-1 text-gray-600">根据已有的模板创建报销单</p> </div> <div class="bg-white rounded-xl shadow-card p-6 mb-8"> <h3 class="font-semibold text-lg mb-4">选择模板</h3> <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"> <div class="border rounded-lg overflow-hidden hover-scale cursor-pointer"> <img src="https://picsum.photos/id/180/400/200" alt="员工差旅报销单" class="w-full h-40 object-cover"> <div class="p-4"> <h4 class="font-medium text-gray-900">员工差旅报销单</h4> <p class="text-sm text-gray-500 mt-1">适用于员工出差费用报销</p> <div class="mt-3 flex items-center justify-between"> <span class="text-xs text-gray-500">创建于 2025-06-15</span> <button class="px-3 py-1 text-xs bg-primary text-white rounded-md"> 选择 </button> </div> </div> </div> <div class="border rounded-lg overflow-hidden hover-scale cursor-pointer"> <img src="https://picsum.photos/id/181/400/200" alt="办公用品申请表" class="w-full h-40 object-cover"> <div class="p-4"> <h4 class="font-medium text-gray-900">办公用品申请表</h4> <p class="text-sm text-gray-500 mt-1">适用于申请购买办公用品</p> <div class="mt-3 flex items-center justify-between"> <span class="text-xs text-gray-500">创建于 2025-06-20</span> <button class="px-3 py-1 text-xs bg-primary text-white rounded-md"> 选择 </button> </div> </div> </div> <div class="border rounded-lg overflow-hidden hover-scale cursor-pointer"> <img src="https://picsum.photos/id/182/400/200" alt="业务招待费申请表" class="w-full h-40 object-cover"> <div class="p-4"> <h4 class="font-medium text-gray-900">业务招待费申请表</h4> <p class="text-sm text-gray-500 mt-1">适用于业务招待费用报销</p> <div class="mt-3 flex items-center justify-between"> <span class="text-xs text-gray-500">创建于 2025-07-05</span> <button class="px-3 py-1 text-xs bg-primary text-white rounded-md"> 选择 </button> </div> </div> </div> </div> </div> <div id="expenseForm" class="hidden"> <div class="bg-white rounded-xl shadow-card p-6 mb-8"> <h3 class="font-semibold text-lg mb-4">员工差旅报销单</h3> <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6"> <div> <label class="block text-sm font-medium text-gray-700 mb-1">员工姓名</label> <input type="text" value="李小明" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">部门</label> <input type="text" value="技术部" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">职位</label> <input type="text" value="高级工程师" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">报销日期</label> <input type="date" value="2025-07-17" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">出差日期</label> <input type="date" value="2025-07-10" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">返回日期</label> <input type="date" value="2025-07-12" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">出差地点</label> <input type="text" value="上海" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">交通工具</label> <select class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> <option>飞机</option> <option selected>高铁</option> <option>动车</option> <option>汽车</option> <option>其他</option> </select> </div> </div> <h3 class="font-semibold text-lg mb-4">费用明细</h3> <div class="overflow-x-auto mb-6"> <table class="min-w-full"> <thead> <tr class="border-b"> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">费用类型</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">金额</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">日期</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">发票号</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">备注</th> <th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">操作</th> </tr> </thead> <tbody> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap"> <select class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> <option selected>交通费</option> <option>住宿费</option> <option>餐饮费</option> <option>其他</option> </select> </td> <td class="px-4 py-3 whitespace-nowrap"> <input type="text" value="850.00" class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </td> <td class="px-4 py-3 whitespace-nowrap"> <input type="date" value="2025-07-10" class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </td> <td class="px-4 py-3 whitespace-nowrap"> <input type="text" value="01234567" class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </td> <td class="px-4 py-3 whitespace-nowrap"> <input type="text" value="高铁二等座" class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </td> <td class="px-4 py-3 whitespace-nowrap"> <button class="text-gray-500 hover:text-gray-700"> <i class="fa fa-trash"></i> </button> </td> </tr> <tr class="border-b hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap"> <select class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> <option>交通费</option> <option selected>住宿费</option> <option>餐饮费</option> <option>其他</option> </select> </td> <td class="px-4 py-3 whitespace-nowrap"> <input type="text" value="1,860.00" class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </td> <td class="px-4 py-3 whitespace-nowrap"> <input type="date" value="2025-07-10" class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </td> <td class="px-4 py-3 whitespace-nowrap"> <input type="text" value="01234568" class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </td> <td class="px-4 py-3 whitespace-nowrap"> <input type="text" value="两晚住宿费" class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </td> <td class="px-4 py-3 whitespace-nowrap"> <button class="text-gray-500 hover:text-gray-700"> <i class="fa fa-trash"></i> </button> </td> </tr> <tr class="hover:bg-gray-50"> <td class="px-4 py-3 whitespace-nowrap"> <select class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> <option>交通费</option> <option>住宿费</option> <option selected>餐饮费</option> <option>其他</option> </select> </td> <td class="px-4 py-3 whitespace-nowrap"> <input type="text" value="540.00" class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </td> <td class="px-4 py-3 whitespace-nowrap"> <input type="date" value="2025-07-11" class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </td> <td class="px-4 py-3 whitespace-nowrap"> <input type="text" value="01234569" class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </td> <td class="px-4 py-3 whitespace-nowrap"> <input type="text" value="商务宴请" class="px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> </td> <td class="px-4 py-3 whitespace-nowrap"> <button class="text-gray-500 hover:text-gray-700"> <i class="fa fa-trash"></i> </button> </td> </tr> </tbody> </table> </div> <div class="flex justify-end mb-6"> <button class="px-4 py-2 bg-primary text-white rounded-md hover:bg-primary/90"> <i class="fa fa-plus mr-1"></i> 添加费用 </button> </div> <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6"> <div> <label class="block text-sm font-medium text-gray-700 mb-1">报销总额</label> <input type="text" value="3,250.00" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent" readonly> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">报销原因</label> <textarea rows="3" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent">参加上海技术研讨会</textarea> </div> </div> <h3 class="font-semibold text-lg mb-4">上传发票</h3> <div class="border-2 border-dashed border-gray-300 rounded-lg p-6 text-center hover:border-primary transition-all-300 mb-6"> <i class="fa fa-paperclip text-gray-400 text-2xl mb-2"></i> <p class="text-sm text-gray-500">点击上传相关发票或附件</p> <input type="file" accept="image/*,.pdf" class="hidden" id="expenseInvoiceFile"> <button class="mt-2 px-4 py-1.5 bg-primary text-white rounded-md hover:bg-primary/90 text-sm" onclick="document.getElementById('expenseInvoiceFile').click()"> 选择文件 </button> </div> <div class="flex justify-end space-x-3"> <button class="px-4 py-2 border border-gray-300 rounded-md text-gray-700 hover:bg-gray-50"> 保存草稿 </button> <button class="px-4 py-2 bg-primary text-white rounded-md hover:bg-primary/90"> 提交审批 </button> </div> </div> </div> </section> </main> </div> <!-- 脚本 --> <script> // 设置当前日期 document.getElementById('currentDate').textContent = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long' }); // 侧边栏切换 document.getElementById('openSidebar').addEventListener('click', function() { document.getElementById('sidebar').classList.remove('transform', '-translate-x-full'); }); document.getElementById('closeSidebar').addEventListener('click', function() { document.getElementById('sidebar').classList.add('transform', '-translate-x-full'); }); // 用户菜单切换 document.getElementById('userMenuButton').addEventListener('click', function() { document.getElementById('userMenu').classList.toggle('hidden'); }); // 点击其他区域关闭用户菜单 document.addEventListener('click', function(event) { const userMenuButton = document.getElementById('userMenuButton'); const userMenu = document.getElementById('userMenu'); if (!userMenuButton.contains(event.target) && !userMenu.contains(event.target)) { userMenu.classList.add('hidden'); } }); // 页面切换 document.querySelectorAll('#sidebar a').forEach(link => { link.addEventListener('click', function(e) { e.preventDefault(); // 获取目标页面ID const targetId = this.getAttribute('href').substring(1); // 隐藏所有页面 document.querySelectorAll('main > section').forEach(section => { section.classList.add('hidden'); }); // 显示目标页面 document.getElementById(targetId).classList.remove('hidden'); // 移动端关闭侧边栏 if (window.innerWidth < 1024) { document.getElementById('sidebar').classList.add('transform', '-translate-x-full'); } }); }); // 文件上传功能 document.getElementById('templateFile').addEventListener('change', function() { if (this.files.length > 0) { document.getElementById('templatePreview').classList.remove('hidden'); } }); document.getElementById('invoiceFile').addEventListener('change', function() { if (this.files.length > 0) { document.getElementById('invoicePreview').classList.remove('hidden'); } }); document.getElementById('expenseInvoiceFile').addEventListener('change', function() { if (this.files.length > 0) { alert('文件已上传'); } }); // 选择模板后显示表单 document.querySelectorAll('#expense-create .grid button').forEach(button => { button.addEventListener('click', function() { document.getElementById('expenseForm').classList.remove('hidden'); }); }); // 图表初始化 window.addEventListener('load', function() { // 报销趋势图表 const trendCtx = document.getElementById('expenseTrendChart').getContext('2d'); new Chart(trendCtx, { type: 'line', data: { labels: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'], datasets: [{ label: '报销金额', data: [8500, 12400, 9800, 15600, 11200, 7800, 12850], borderColor: '#165DFF', backgroundColor: 'rgba(22, 93, 255, 0.1)', fill: true, tension: 0.4 }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { y: { beginAtZero: true, ticks: { callback: function(value) { return '¥' + value.toLocaleString(); } } } } } }); // 报销类型分布图表 const typeCtx = document.getElementById('expenseTypeChart').getContext('2d'); new Chart(typeCtx, { type: 'doughnut', data: { labels: ['差旅费', '办公用品', '业务招待费', '会议费', '其他'], datasets: [{ data: [45, 20, 15, 10, 10], backgroundColor: [ '#165DFF', '#0FC6C2', '#722ED1', '#FF7D00', '#86909C' ], borderWidth: 0 }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: 'bottom' } }, cutout: '70%' } }); }); </script> </body> </html>