个人财务记录应用

1. 整体结构

头部区域:显示应用名称和用户信息

侧边栏导航:提供主要功能入口

主内容区:包含财务概览、交易记录和图表分析

2. 设计特点

色彩方案:

使用柔和的蓝色(#6C9BCF)作为主色调

粉色(#FFB6B6)作为强调色

绿色(#A0D8B3)表示收入/正面数据

橙色(#FFD3B6)表示警告/中性信息

整体背景使用浅灰色(#F8F9FA)提高可读性

视觉元素:

圆角设计(12px)让界面更友好

柔和的阴影效果增强层次感

卡片式布局区分不同功能区域

响应式设计适配不同屏幕尺寸

3. 功能实现

财务概览卡片:

显示本月收入、支出和结余

使用不同颜色区分正负值

包含直观的图标

交易记录表格:

显示最近的交易记录

分类使用彩色标签区分

收入和支出使用不同颜色显示

悬停效果提高可操作性

添加交易表单:

支持添加收入和支出

包含类型、金额、分类、日期和描述字段

表单验证和提交处理

图表分析:

使用Chart.js创建环形图

显示支出分类占比

支持不同时间范围切换(通过标签)

导航菜单:

清晰的图标和文字组合

悬停和激活状态反馈

覆盖所有主要功能入口

4. 交互功能

添加交易:点击"添加交易"按钮显示表单,填写后可以提交

图表切换:点击不同的时间标签可以切换数据显示范围

表单操作:支持取消和保存交易记录

5. 响应式设计

在小屏幕上自动调整为单列布局

概览卡片在小屏幕上堆叠显示

侧边栏在小屏幕上可能隐藏或调整

6.截图展示

7.代码重现

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>轻记账 - 个人财务记录应用</title>
    <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <style>
        /* 全局样式 - 使用柔和的配色方案 */
        :root {
            --primary-color: #6C9BCF;  /* 主色调 - 柔和的蓝色 */
            --secondary-color: #A5C0DD; /* 次要色调 - 更浅的蓝色 */
            --accent-color: #FFB6B6;   /* 强调色 - 柔和的粉色 */
            --success-color: #A0D8B3;  /* 成功色 - 柔和的绿色 */
            --warning-color: #FFD3B6;  /* 警告色 - 柔和的橙色 */
            --text-color: #4A4A4A;     /* 主要文字颜色 */
            --light-text: #888888;     /* 浅色文字 */
            --bg-color: #F8F9FA;       /* 背景色 */
            --card-bg: #FFFFFF;        /* 卡片背景 */
            --shadow: 0 4px 12px rgba(0, 0, 0, 0.05); /* 柔和的阴影 */
        }

        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: 'Noto Sans SC', sans-serif;
            background-color: var(--bg-color);
            color: var(--text-color);
            line-height: 1.6;
        }

        .container {
            max-width: 1200px;
            margin: 0 auto;
            padding: 20px;
        }

        /* 头部样式 */
        header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 20px 0;
            margin-bottom: 30px;
        }

        .logo {
            font-size: 28px;
            font-weight: 700;
            color: var(--primary-color);
        }

        .logo span {
            color: var(--accent-color);
        }

        .user-profile {
            display: flex;
            align-items: center;
        }

        .user-avatar {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            background-color: var(--secondary-color);
            display: flex;
            align-items: center;
            justify-content: center;
            color: white;
            font-weight: bold;
            margin-left: 10px;
        }

        /* 主布局 */
        .main-layout {
            display: grid;
            grid-template-columns: 250px 1fr;
            gap: 20px;
        }

        /* 侧边栏 */
        .sidebar {
            background-color: var(--card-bg);
            border-radius: 12px;
            padding: 20px;
            box-shadow: var(--shadow);
        }

        .nav-menu {
            list-style: none;
        }

        .nav-item {
            margin-bottom: 15px;
        }

        .nav-link {
            display: flex;
            align-items: center;
            padding: 10px;
            border-radius: 8px;
            color: var(--text-color);
            text-decoration: none;
            transition: all 0.3s ease;
        }

        .nav-link:hover, .nav-link.active {
            background-color: var(--secondary-color);
            color: white;
        }

        .nav-link i {
            margin-right: 10px;
            font-size: 18px;
        }

        /* 主内容区 */
        .main-content {
            display: grid;
            grid-template-rows: auto 1fr;
            gap: 20px;
        }

        /* 概览卡片 */
        .overview-cards {
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            gap: 20px;
            margin-bottom: 20px;
        }

        .card {
            background-color: var(--card-bg);
            border-radius: 12px;
            padding: 20px;
            box-shadow: var(--shadow);
        }

        .card-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 15px;
        }

        .card-title {
            font-size: 16px;
            font-weight: 500;
            color: var(--light-text);
        }

        .card-value {
            font-size: 24px;
            font-weight: 700;
        }

        .income .card-value {
            color: var(--success-color);
        }

        .expense .card-value {
            color: var(--accent-color);
        }

        .balance .card-value {
            color: var(--primary-color);
        }

        /* 交易记录部分 */
        .transactions {
            background-color: var(--card-bg);
            border-radius: 12px;
            padding: 20px;
            box-shadow: var(--shadow);
        }

        .section-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 20px;
        }

        .section-title {
            font-size: 20px;
            font-weight: 600;
        }

        .btn {
            padding: 8px 16px;
            border-radius: 6px;
            border: none;
            background-color: var(--primary-color);
            color: white;
            font-weight: 500;
            cursor: pointer;
            transition: all 0.3s ease;
        }

        .btn:hover {
            background-color: #5a8bc7;
            transform: translateY(-2px);
        }

        .btn-outline {
            background-color: transparent;
            border: 1px solid var(--primary-color);
            color: var(--primary-color);
        }

        .btn-outline:hover {
            background-color: var(--primary-color);
            color: white;
        }

        /* 交易表格 */
        .transaction-table {
            width: 100%;
            border-collapse: collapse;
        }

        .transaction-table th {
            text-align: left;
            padding: 12px 15px;
            font-weight: 500;
            color: var(--light-text);
            border-bottom: 1px solid #eee;
        }

        .transaction-table td {
            padding: 15px;
            border-bottom: 1px solid #eee;
        }

        .transaction-row:hover {
            background-color: #f5f7fa;
        }

        .transaction-category {
            display: inline-block;
            padding: 4px 8px;
            border-radius: 4px;
            font-size: 12px;
            font-weight: 500;
        }

        .category-food {
            background-color: #FFE8E8;
            color: #FF6B6B;
        }

        .category-transport {
            background-color: #E3F2FD;
            color: #42A5F5;
        }

        .category-shopping {
            background-color: #FFF3E0;
            color: #FFA726;
        }

        .category-housing {
            background-color: #E8F5E9;
            color: #66BB6A;
        }

        .category-entertainment {
            background-color: #F3E5F5;
            color: #AB47BC;
        }

        .transaction-amount.income {
            color: var(--success-color);
            font-weight: 600;
        }

        .transaction-amount.expense {
            color: var(--accent-color);
            font-weight: 600;
        }

        /* 图表容器 */
        .chart-container {
            background-color: var(--card-bg);
            border-radius: 12px;
            padding: 20px;
            box-shadow: var(--shadow);
            margin-top: 20px;
        }

        .chart-header {
            margin-bottom: 20px;
        }

        .tabs {
            display: flex;
            border-bottom: 1px solid #eee;
            margin-bottom: 20px;
        }

        .tab {
            padding: 10px 20px;
            cursor: pointer;
            border-bottom: 2px solid transparent;
        }

        .tab.active {
            border-bottom: 2px solid var(--primary-color);
            color: var(--primary-color);
            font-weight: 500;
        }

        /* 添加交易表单 */
        .add-transaction-form {
            display: none;
            background-color: var(--card-bg);
            border-radius: 12px;
            padding: 20px;
            box-shadow: var(--shadow);
            margin-top: 20px;
        }

        .form-group {
            margin-bottom: 15px;
        }

        .form-label {
            display: block;
            margin-bottom: 8px;
            font-weight: 500;
        }

        .form-control {
            width: 100%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 6px;
            font-family: inherit;
        }

        .form-actions {
            display: flex;
            justify-content: flex-end;
            gap: 10px;
            margin-top: 20px;
        }

        /* 响应式设计 */
        @media (max-width: 768px) {
            .main-layout {
                grid-template-columns: 1fr;
            }
            
            .overview-cards {
                grid-template-columns: 1fr;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <!-- 头部区域 -->
        <header>
            <div class="logo">轻<span>记账</span></div>
            <div class="user-profile">
                <span>欢迎回来,用户</span>
                <div class="user-avatar">U</div>
            </div>
        </header>

        <!-- 主布局 -->
        <div class="main-layout">
            <!-- 侧边栏导航 -->
            <aside class="sidebar">
                <ul class="nav-menu">
                    <li class="nav-item">
                        <a href="#" class="nav-link active">
                            <i>📊</i> 仪表盘
                        </a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link">
                            <i>💰</i> 交易记录
                        </a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link">
                            <i>📈</i> 统计分析
                        </a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link">
                            <i>📅</i> 预算规划
                        </a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link">
                            <i>🏷️</i> 分类管理
                        </a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link">
                            <i>⚙️</i> 设置
                        </a>
                    </li>
                </ul>
            </aside>

            <!-- 主内容区 -->
            <main class="main-content">
                <!-- 概览卡片 -->
                <div class="overview-cards">
                    <div class="card income">
                        <div class="card-header">
                            <div class="card-title">本月收入</div>
                            <i>⬆️</i>
                        </div>
                        <div class="card-value">¥8,500.00</div>
                    </div>
                    <div class="card expense">
                        <div class="card-header">
                            <div class="card-title">本月支出</div>
                            <i>⬇️</i>
                        </div>
                        <div class="card-value">¥4,200.00</div>
                    </div>
                    <div class="card balance">
                        <div class="card-header">
                            <div class="card-title">结余</div>
                            <i>💰</i>
                        </div>
                        <div class="card-value">¥4,300.00</div>
                    </div>
                </div>

                <!-- 交易记录部分 -->
                <div class="transactions">
                    <div class="section-header">
                        <h2 class="section-title">最近交易</h2>
                        <div>
                            <button class="btn" id="addTransactionBtn">添加交易</button>
                        </div>
                    </div>
                    
                    <table class="transaction-table">
                        <thead>
                            <tr>
                                <th>日期</th>
                                <th>描述</th>
                                <th>分类</th>
                                <th>金额</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr class="transaction-row">
                                <td>2023-05-15</td>
                                <td>工资收入</td>
                                <td><span class="transaction-category category-housing">工资</span></td>
                                <td class="transaction-amount income">+¥8,500.00</td>
                            </tr>
                            <tr class="transaction-row">
                                <td>2023-05-14</td>
                                <td>超市购物</td>
                                <td><span class="transaction-category category-shopping">购物</span></td>
                                <td class="transaction-amount expense">-¥256.80</td>
                            </tr>
                            <tr class="transaction-row">
                                <td>2023-05-12</td>
                                <td>餐厅用餐</td>
                                <td><span class="transaction-category category-food">餐饮</span></td>
                                <td class="transaction-amount expense">-¥128.00</td>
                            </tr>
                            <tr class="transaction-row">
                                <td>2023-05-10</td>
                                <td>地铁交通</td>
                                <td><span class="transaction-category category-transport">交通</span></td>
                                <td class="transaction-amount expense">-¥15.00</td>
                            </tr>
                            <tr class="transaction-row">
                                <td>2023-05-08</td>
                                <td>电影票</td>
                                <td><span class="transaction-category category-entertainment">娱乐</span></td>
                                <td class="transaction-amount expense">-¥85.00</td>
                            </tr>
                        </tbody>
                    </table>
                </div>

                <!-- 添加交易表单 (默认隐藏) -->
                <div class="add-transaction-form" id="addTransactionForm">
                    <h3>添加新交易</h3>
                    <form id="transactionForm">
                        <div class="form-group">
                            <label for="transactionType" class="form-label">类型</label>
                            <select id="transactionType" class="form-control">
                                <option value="income">收入</option>
                                <option value="expense">支出</option>
                            </select>
                        </div>
                        <div class="form-group">
                            <label for="transactionAmount" class="form-label">金额</label>
                            <input type="number" id="transactionAmount" class="form-control" placeholder="0.00">
                        </div>
                        <div class="form-group">
                            <label for="transactionCategory" class="form-label">分类</label>
                            <select id="transactionCategory" class="form-control">
                                <option value="food">餐饮</option>
                                <option value="transport">交通</option>
                                <option value="shopping">购物</option>
                                <option value="housing">住房</option>
                                <option value="entertainment">娱乐</option>
                                <option value="salary">工资</option>
                                <option value="other">其他</option>
                            </select>
                        </div>
                        <div class="form-group">
                            <label for="transactionDate" class="form-label">日期</label>
                            <input type="date" id="transactionDate" class="form-control">
                        </div>
                        <div class="form-group">
                            <label for="transactionDescription" class="form-label">描述</label>
                            <input type="text" id="transactionDescription" class="form-control" placeholder="交易描述">
                        </div>
                        <div class="form-actions">
                            <button type="button" class="btn btn-outline" id="cancelTransactionBtn">取消</button>
                            <button type="submit" class="btn">保存</button>
                        </div>
                    </form>
                </div>

                <!-- 图表部分 -->
                <div class="chart-container">
                    <div class="chart-header">
                        <h3>支出分析</h3>
                        <div class="tabs">
                            <div class="tab active">本月</div>
                            <div class="tab">本季度</div>
                            <div class="tab">本年</div>
                        </div>
                    </div>
                    <canvas id="expenseChart"></canvas>
                </div>
            </main>
        </div>
    </div>

    <script>
        // 显示/隐藏添加交易表单
        document.getElementById('addTransactionBtn').addEventListener('click', function() {
            document.getElementById('addTransactionForm').style.display = 'block';
        });

        document.getElementById('cancelTransactionBtn').addEventListener('click', function() {
            document.getElementById('addTransactionForm').style.display = 'none';
        });

        // 表单提交处理
        document.getElementById('transactionForm').addEventListener('submit', function(e) {
            e.preventDefault();
            alert('交易已添加!');
            document.getElementById('addTransactionForm').style.display = 'none';
            // 这里可以添加实际的数据处理逻辑
        });

        // 初始化图表
        const ctx = document.getElementById('expenseChart').getContext('2d');
        const expenseChart = new Chart(ctx, {
            type: 'doughnut',
            data: {
                labels: ['餐饮', '交通', '购物', '住房', '娱乐', '其他'],
                datasets: [{
                    data: [1200, 500, 1800, 2500, 800, 400],
                    backgroundColor: [
                        '#FFB6B6',
                        '#A5C0DD',
                        '#FFD3B6',
                        '#A0D8B3',
                        '#E3B7F5',
                        '#D1D1D1'
                    ],
                    borderWidth: 0
                }]
            },
            options: {
                responsive: true,
                plugins: {
                    legend: {
                        position: 'right',
                    },
                    tooltip: {
                        callbacks: {
                            label: function(context) {
                                const label = context.label || '';
                                const value = context.raw || 0;
                                const total = context.dataset.data.reduce((a, b) => a + b, 0);
                                const percentage = Math.round((value / total) * 100);
                                return `${label}: ¥${value} (${percentage}%)`;
                            }
                        }
                    }
                },
                cutout: '70%'
            }
        });

        // 标签切换功能
        const tabs = document.querySelectorAll('.tab');
        tabs.forEach(tab => {
            tab.addEventListener('click', function() {
                tabs.forEach(t => t.classList.remove('active'));
                this.classList.add('active');
                // 这里可以添加根据标签切换数据的逻辑
            });
        });
    </script>
</body>
</html>
相关推荐
Amodoro14 分钟前
nuxt更改页面渲染的html,去除自定义属性、
前端·html·nuxt3·nuxt2·nuxtjs
Wcowin22 分钟前
Mkdocs相关插件推荐(原创+合作)
前端·mkdocs
伍哥的传说1 小时前
CSS+JavaScript 禁用浏览器复制功能的几种方法
前端·javascript·css·vue.js·vue·css3·禁用浏览器复制
lichenyang4531 小时前
Axios封装以及添加拦截器
前端·javascript·react.js·typescript
Trust yourself2431 小时前
想把一个easyui的表格<th>改成下拉怎么做
前端·深度学习·easyui
三口吃掉你1 小时前
Web服务器(Tomcat、项目部署)
服务器·前端·tomcat
Trust yourself2431 小时前
在easyui中如何设置自带的弹窗,有输入框
前端·javascript·easyui
烛阴2 小时前
Tile Pattern
前端·webgl
前端工作日常2 小时前
前端基建的幸存者偏差
前端·vue.js·前端框架
Electrolux2 小时前
你敢信,不会点算法没准你赛尔号都玩不明白
前端·后端·算法