开源Java 邮箱 基于SpringBoot+Vue前后端分离的电子邮件

https://github.com/risesoft-y9/Email

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>
    <script src="https://cdn.tailwindcss.com"></script>
    <link href="https://cdn.jsdelivr.net/npm/remixicon@3.5.0/fonts/remixicon.css" rel="stylesheet">
    <script>
        tailwind.config = {
            theme: {
                extend: {
                    colors: {
                        primary: '#4072EE',
                        sideBg: '#F5F7FA',
                        borderColor: '#E5E9F2',
                        textDark: '#1F2937',
                        textGray: '#6B7280'
                    }
                }
            }
        }
    </script>
    <style>
        *{margin:0;padding:0;box-sizing:border-box;}
        html,body{height:100%;overflow:hidden;}
        .side-active{background:#fff;border-left:3px solid #4072EE;color:#4072EE;}
        .page-hide{display:none !important;}
        ::-webkit-scrollbar{width:6px;height:6px;}
        ::-webkit-scrollbar-thumb{background:#ccc;border-radius:3px;}
    </style>
</head>
<body class="bg-gray-100">
<div class="flex h-screen w-full">
    <!-- 左侧侧边栏 -->
    <aside class="w-56 bg-sideBg border-r border-borderColor flex flex-col">
        <div class="h-14 border-b border-borderColor flex items-center px-4 text-lg font-bold">
            内部邮件系统
        </div>
        <nav class="flex-1 py-2">
            <ul class="text-sm">
                <li class="mb-1">
                    <a onclick="switchPage('writeMail')" class="flex items-center px-5 py-2.5 hover:bg-white cursor-pointer">
                        <i class="ri-edit-line mr-3 text-textGray"></i>写信
                    </a>
                </li>
                <li class="mb-1">
                    <a onclick="switchPage('inboxPage')" class="flex items-center px-5 py-2.5 side-active cursor-pointer">
                        <i class="ri-inbox-line mr-3"></i>收件箱
                    </a>
                </li>
                <li class="mb-1">
                    <a class="flex items-center px-5 py-2.5 hover:bg-white cursor-pointer">
                        <i class="ri-file-text-line mr-3 text-textGray"></i>草稿箱
                    </a>
                </li>
                <li class="mb-1">
                    <a class="flex items-center px-5 py-2.5 hover:bg-white cursor-pointer">
                        <i class="ri-send-plane-line mr-3 text-textGray"></i>已发送
                    </a>
                </li>
                <li class="mb-1">
                    <a class="flex items-center px-5 py-2.5 hover:bg-white cursor-pointer">
                        <i class="ri-delete-bin-line mr-3 text-textGray"></i>垃圾箱
                    </a>
                </li>
                <li class="mb-1">
                    <a class="flex items-center px-5 py-2.5 hover:bg-white cursor-pointer">
                        <i class="ri-star-line mr-3 text-textGray"></i>收藏邮件
                    </a>
                </li>
                <li class="mb-1">
                    <a onclick="switchPage('addressPage')" class="flex items-center px-5 py-2.5 hover:bg-white cursor-pointer">
                        <i class="ri-contacts-book-line mr-3 text-textGray"></i>通讯录
                    </a>
                </li>
                <li class="mb-1">
                    <a class="flex items-center px-5 py-2.5 hover:bg-white cursor-pointer">
                        <i class="ri-search-line mr-3 text-textGray"></i>邮件查询
                    </a>
                </li>
            </ul>
        </nav>
    </aside>

    <!-- 主内容区域 -->
    <main class="flex-1 flex flex-col overflow-hidden">
        <!-- 顶部导航栏 -->
        <header class="h-14 bg-white border-b border-borderColor flex items-center justify-between px-6">
            <div></div>
            <div class="flex items-center gap-5 text-sm">
                <span class="text-textGray">刷新</span>
                <span class="text-textGray">全屏</span>
                <span class="text-textGray">系统设置</span>
                <span>部门:北方第五事业部</span>
                <div class="flex items-center gap-2">
                    <i class="ri-user-line"></i>
                    <span>王洪哲</span>
                </div>
            </div>
        </header>

        <!-- 内容容器 -->
        <div class="flex-1 p-4 overflow-auto">

            <!-- 1.收件箱页面 -->
            <div id="inboxPage" class="w-full h-full">
                <div class="bg-white rounded shadow-sm border border-borderColor h-full flex flex-col">
                    <div class="p-4 border-b border-borderColor flex justify-between items-center">
                        <h2 class="text-base font-medium">收件箱</h2>
                        <div class="flex items-center gap-2">
                            <input type="text" placeholder="搜索邮件" class="border border-borderColor rounded px-3 py-1.5 text-sm w-52">
                        </div>
                    </div>
                    <div class="p-3 border-b border-borderColor flex gap-3">
                        <button class="px-3 py-1 bg-primary text-white rounded text-sm">移动至</button>
                        <button class="px-3 py-1 border border-borderColor rounded text-sm">标记已读</button>
                        <button class="px-3 py-1 border border-borderColor rounded text-sm">删除</button>
                        <button class="px-3 py-1 border border-borderColor rounded text-sm">刷新列表</button>
                    </div>
                    <div class="flex-1 overflow-auto">
                        <table class="w-full text-sm">
                            <thead class="bg-gray-50 sticky top-0">
                                <tr>
                                    <th class="w-10 py-3 text-center"><input type="checkbox"></th>
                                    <th class="w-12 text-center">状态</th>
                                    <th class="w-12 text-center">收藏</th>
                                    <th class="w-32 text-left pl-3">发件人</th>
                                    <th class="w-32 text-left">收件人</th>
                                    <th class="text-left">邮件主题</th>
                                    <th class="w-16 text-center">附件</th>
                                    <th class="w-40 text-center">发送时间</th>
                                    <th class="w-20 text-center">大小</th>
                                </tr>
                            </thead>
                            <tbody id="mailTableBody">
                                <!-- JSON渲染邮件列表 -->
                            </tbody>
                        </table>
                    </div>
                    <div class="p-4 border-t border-borderColor flex justify-between items-center">
                        <span class="text-textGray text-sm">共 <span id="mailTotal">0</span> 条邮件</span>
                        <div class="flex items-center gap-2">
                            <button class="w-7 h-7 border rounded flex items-center justify-center">&lt;</button>
                            <button class="w-7 h-7 bg-primary text-white rounded flex items-center justify-center">1</button>
                            <button class="w-7 h-7 border rounded flex items-center justify-center">2</button>
                            <button class="w-7 h-7 border rounded flex items-center justify-center">3</button>
                            <span>...</span>
                            <button class="w-7 h-7 border rounded flex items-center justify-center">19</button>
                            <button class="w-7 h-7 border rounded flex items-center justify-center">&gt;</button>
                            <select class="border border-borderColor rounded px-2 py-1 text-sm">
                                <option>20条/页</option>
                                <option>50条/页</option>
                            </select>
                        </div>
                    </div>
                </div>
            </div>

            <!-- 2.邮件详情页面 -->
            <div id="detailPage" class="w-full h-full page-hide">
                <div class="bg-white rounded shadow-sm border border-borderColor h-full flex flex-col">
                    <div class="p-4 border-b border-borderColor flex gap-3">
                        <button onclick="backInbox()" class="px-3 py-1 border border-primary text-primary rounded text-sm">
                            <i class="ri-arrow-left-line"></i> 返回
                        </button>
                        <button class="px-3 py-1 border border-borderColor rounded text-sm">回复</button>
                        <button class="px-3 py-1 border border-borderColor rounded text-sm">全部回复</button>
                        <button class="px-3 py-1 border border-borderColor rounded text-sm">转发</button>
                        <button class="px-3 py-1 border border-borderColor rounded text-sm">收藏</button>
                        <button class="px-3 py-1 border border-borderColor rounded text-sm">打印</button>
                    </div>
                    <div class="px-6 py-5 bg-gray-50 border-b border-borderColor">
                        <h3 class="text-lg font-medium mb-3" id="detailTitle"></h3>
                        <div class="text-sm text-textGray space-y-1">
                            <p>发件人:<span id="detailSender"></span></p>
                            <p>收件人:<span id="detailReceiver"></span></p>
                            <p>发送时间:<span id="detailTime"></span></p>
                        </div>
                    </div>
                    <div class="flex-1 p-6 overflow-auto">
                        <div id="detailContent" class="text-sm leading-relaxed"></div>
                        <div class="mt-6 pt-4 border-t border-borderColor">
                            <p class="text-sm mb-3">附件列表</p>
                            <div id="detailFileList" class="flex flex-wrap gap-3"></div>
                        </div>
                    </div>
                    <div class="p-4 border-t border-borderColor flex items-center gap-3">
                        <input type="text" class="flex-1 border border-borderColor rounded px-3 py-2 text-sm" placeholder="快速回复">
                        <button class="px-4 py-2 bg-primary text-white rounded text-sm">发送回复</button>
                    </div>
                </div>
            </div>

            <!-- 3.写信页面 -->
            <div id="writeMail" class="w-full h-full page-hide">
                <div class="bg-white rounded shadow-sm border border-borderColor h-full flex flex-col">
                    <div class="p-4 border-b border-borderColor flex justify-between items-center">
                        <h2 class="text-base font-medium">撰写新邮件</h2>
                        <div class="flex gap-3">
                            <button class="px-4 py-1 bg-primary text-white rounded text-sm">立即发送</button>
                            <button class="px-4 py-1 border border-borderColor rounded text-sm">保存草稿</button>
                            <button class="px-4 py-1 border border-borderColor rounded text-sm">关闭</button>
                        </div>
                    </div>
                    <div class="p-5 space-y-4">
                        <div class="flex items-center">
                            <label class="w-16 text-sm">收件人:</label>
                            <input type="text" class="flex-1 border border-borderColor rounded px-3 py-2 text-sm" placeholder="请输入邮箱/选择联系人">
                        </div>
                        <div class="flex items-center">
                            <label class="w-16 text-sm">邮件主题:</label>
                            <input type="text" class="flex-1 border border-borderColor rounded px-3 py-2 text-sm" placeholder="请填写邮件主题">
                        </div>
                        <div class="flex items-center">
                            <label class="w-16 text-sm">抄送人:</label>
                            <input type="text" class="flex-1 border border-borderColor rounded px-3 py-2 text-sm" placeholder="选填">
                        </div>
                        <div class="flex items-center">
                            <label class="w-16 text-sm">密送人:</label>
                            <input type="text" class="flex-1 border border-borderColor rounded px-3 py-2 text-sm" placeholder="选填">
                        </div>
                        <div>
                            <p class="text-sm mb-2">添加附件:<span class="text-primary cursor-pointer">点击上传文件</span></p>
                            <div class="flex flex-wrap gap-3"></div>
                        </div>
                    </div>
                    <div class="flex-1 px-5 pb-5">
                        <div class="border border-borderColor rounded h-full flex flex-col">
                            <div class="border-b border-borderColor p-2 flex items-center gap-3 flex-wrap">
                                <button class="p-1 hover:bg-gray-100 rounded"><i class="ri-bold"></i></button>
                                <button class="p-1 hover:bg-gray-100 rounded"><i class="ri-italic"></i></button>
                                <button class="p-1 hover:bg-gray-100 rounded"><i class="ri-underline"></i></button>
                                <span class="w-px h-4 bg-gray-300"></span>
                                <button class="p-1 hover:bg-gray-100 rounded"><i class="ri-align-left"></i></button>
                                <button class="p-1 hover:bg-gray-100 rounded"><i class="ri-align-center"></i></button>
                                <button class="p-1 hover:bg-gray-100 rounded"><i class="ri-align-right"></i></button>
                                <span class="w-px h-4 bg-gray-300"></span>
                                <button class="p-1 hover:bg-gray-100 rounded"><i class="ri-list-ordered"></i></button>
                                <button class="p-1 hover:bg-gray-100 rounded"><i class="ri-font-color"></i></button>
                                <button class="p-1 hover:bg-gray-100 rounded"><i class="ri-image-line"></i></button>
                            </div>
                            <textarea class="flex-1 w-full border-0 outline-none p-3 resize-none text-sm" placeholder="请输入邮件正文内容..."></textarea>
                        </div>
                    </div>
                </div>
            </div>

            <!-- 4.通讯录页面 -->
            <div id="addressPage" class="w-full h-full page-hide">
                <div class="bg-white rounded shadow-sm border border-borderColor h-full flex flex-col">
                    <div class="p-4 border-b border-borderColor">
                        <h2 class="text-base font-medium">企业通讯录</h2>
                    </div>
                    <div class="flex-1 flex overflow-hidden">
                        <!-- 左侧部门树 -->
                        <div class="w-1/3 border-r border-borderColor p-4 overflow-auto">
                            <div class="flex gap-2 mb-4">
                                <input type="text" placeholder="搜索联系人" class="flex-1 border border-borderColor rounded px-2 py-1.5 text-sm">
                                <button class="px-3 py-1 bg-primary text-white rounded text-sm">搜索</button>
                            </div>
                            <div class="text-sm">
                                <div class="py-2 flex items-center">
                                    <i class="ri-arrow-down-s-line mr-1"></i>
                                    <span>有生集团总公司</span>
                                </div>
                                <div class="pl-4">
                                    <div class="py-2 hover:bg-gray-50 rounded px-2 cursor-pointer">总经理办公室</div>
                                    <div class="py-2 hover:bg-gray-50 rounded px-2 cursor-pointer">人力资源部</div>
                                    <div class="py-2 hover:bg-gray-50 rounded px-2 cursor-pointer">财务部</div>
                                    <div class="py-2 hover:bg-gray-50 rounded px-2 cursor-pointer">保密管理办公室</div>
                                    <div class="py-2 bg-primary/10 rounded px-2 cursor-pointer text-primary">信息管理中心</div>
                                    <div class="py-2 hover:bg-gray-50 rounded px-2 cursor-pointer">项目研发中心</div>
                                    <div class="py-2 hover:bg-gray-50 rounded px-2 cursor-pointer">北方第五事业部</div>
                                    <div class="py-2 hover:bg-gray-50 rounded px-2 cursor-pointer">深圳分公司</div>
                                    <div class="py-2 hover:bg-gray-50 rounded px-2 cursor-pointer">山西分公司</div>
                                    <div class="py-2 hover:bg-gray-50 rounded px-2 cursor-pointer">内蒙古分公司</div>
                                </div>
                            </div>
                        </div>
                        <!-- 右侧联系人列表 -->
                        <div class="flex-1 p-5 overflow-auto">
                            <div class="grid grid-cols-4 gap-5" id="userContactList">
                                <!-- JSON渲染联系人 -->
                            </div>
                        </div>
                    </div>
                </div>
            </div>

        </div>
    </main>
</div>

<script>
// ====================== 模拟JSON邮件数据 ======================
const mailJsonData = [
    {
        id:1,
        title:"大连云服务器统计表8月更新",
        sender:"曲金凤",
        receiver:"王洪哲、范鸿飞、张郁雯、张艳雪",
        time:"2024-08-13 14:42:21",
        size:"129KB",
        hasFile:true,
        content:"各位领导同事大家好:<br><br>2024年8月云服务器成本核算表已统计完成,本月整体支出已核算完毕,各环境费用明细已整理完成。<br><br>DZ正式环境月支出:7407.86元<br>VUE云环境月支出:5479.56元<br><br>所有明细全部在附件表格内,请各位查收核对,如有疑问及时沟通!",
        files:[
            {name:"大连云服务器统计表.xlsx",size:"129KB",type:"excel"}
        ]
    },
    {
        id:2,
        title:"7月份财务报表汇总",
        sender:"李超",
        receiver:"王洪哲、张郁雯、王克照",
        time:"2024-08-12 10:15:19",
        size:"180KB",
        hasFile:true,
        content:"各位负责人:<br>现将2024年7月全公司财务报表、各项经营指标数据统一发送,请各部门负责人查阅留存,做好部门成本管控工作。",
        files:[
            {name:"7月财务总表.xlsx",size:"156KB",type:"excel"},
            {name:"经营指标说明.docx",size:"24KB",type:"word"}
        ]
    },
    {
        id:3,
        title:"员工考勤数据同步通知",
        sender:"苏奥",
        receiver:"全体事业部人员",
        time:"2024-08-14 00:05:33",
        size:"25KB",
        hasFile:false,
        content:"人事部门已完成8月上半月员工考勤统计,异常考勤已标注完毕,各位如有考勤异议,3日内提交人事复核。",
        files:[]
    },
    {
        id:4,
        title:"项目进度同步汇报",
        sender:"汤红玲",
        receiver:"王洪哲、苑鸿飞",
        time:"2024-08-12 15:04:35",
        size:"63KB",
        hasFile:true,
        content:"现将联通数科项目本月执行进度整理完毕,附件为进度台账与下周工作计划,请领导审阅批示。",
        files:[
            {name:"项目进度台账.xlsx",size:"63KB",type:"excel"}
        ]
    }
];

// 模拟联系人JSON数据
const contactJsonData = [
    {name:"苑鸿飞",dept:"财务部",avatar:"苑"},
    {name:"张郁雯",dept:"财务部",avatar:"张"},
    {name:"范鸿飞",dept:"北方第五事业部",avatar:"范"},
    {name:"李超",dept:"财务部",avatar:"李"},
    {name:"黄明",dept:"深圳分公司",avatar:"黄"},
    {name:"马腾",dept:"深圳分公司",avatar:"马"},
    {name:"苏奥",dept:"财务部",avatar:"苏"},
    {name:"汤红玲",dept:"项目中心",avatar:"汤"}
];

// 页面切换
function switchPage(pageName){
    document.getElementById('inboxPage').classList.add('page-hide');
    document.getElementById('detailPage').classList.add('page-hide');
    document.getElementById('writeMail').classList.add('page-hide');
    document.getElementById('addressPage').classList.add('page-hide');
    document.getElementById(pageName).classList.remove('page-hide');
}

// 返回收件箱
function backInbox(){
    switchPage('inboxPage');
}

// 渲染邮件列表
function renderMailList(){
    let html = '';
    mailJsonData.forEach(item=>{
        html += `
        <tr class="border-b border-borderColor hover:bg-gray-50 cursor-pointer" onclick="openMailDetail(${item.id})">
            <td class="py-3 text-center"><input type="checkbox"></td>
            <td class="text-center"><i class="ri-mail-unread-line text-orange-500"></i></td>
            <td class="text-center"><i class="ri-star-line text-textGray"></i></td>
            <td class="pl-3">${item.sender}</td>
            <td>${item.receiver}</td>
            <td class="truncate max-w-xl">${item.title}</td>
            <td class="text-center">${item.hasFile ? '<i class="ri-attachment-line"></i>' : ''}</td>
            <td class="text-center">${item.time}</td>
            <td class="text-center">${item.size}</td>
        </tr>
        `
    });
    document.getElementById('mailTableBody').innerHTML = html;
    document.getElementById('mailTotal').innerText = mailJsonData.length;
}

// 打开邮件详情
function openMailDetail(id){
    let info = mailJsonData.find(v=>v.id === id);
    if(!info)return;
    document.getElementById('detailTitle').innerText = info.title;
    document.getElementById('detailSender').innerText = info.sender;
    document.getElementById('detailReceiver').innerText = info.receiver;
    document.getElementById('detailTime').innerText = info.time;
    document.getElementById('detailContent').innerHTML = info.content;

    // 渲染附件
    let fileHtml = '';
    info.files.forEach(f=>{
        fileHtml += `
        <div class="flex items-center border border-borderColor rounded p-2 w-52 bg-gray-50">
            <i class="ri-file-${f.type==='excel'?'excel':'text'}-line text-primary text-xl mr-2"></i>
            <div>
                <p class="text-xs truncate">${f.name}</p>
                <p class="text-xs text-textGray">${f.size}</p>
            </div>
        </div>
        `
    })
    document.getElementById('detailFileList').innerHTML = fileHtml;
    switchPage('detailPage');
}

// 渲染通讯录联系人
function renderContactList(){
    let html = '';
    contactJsonData.forEach(item=>{
        html += `
        <div class="flex flex-col items-center">
            <div class="w-20 h-20 rounded-full bg-primary/20 flex items-center justify-center text-2xl text-primary mb-2">${item.avatar}</div>
            <p class="text-sm font-medium">${item.name}</p>
            <p class="text-xs text-textGray mb-2">${item.dept}</p>
            <button class="text-xs px-3 py-1 bg-gray-100 rounded hover:bg-gray-200">发送邮件</button>
        </div>
        `
    })
    document.getElementById('userContactList').innerHTML = html;
}

// 初始化加载
window.onload = function(){
    renderMailList();
    renderContactList();
}
</script>
</body>
</html>
相关推荐
C+++Python4 小时前
C++ 进阶学习完整指南
java·c++·学习
sparEE4 小时前
c++值类别、右值引用和移动语义
开发语言·c++
zhangjw344 小时前
第11篇:Java Map集合详解,HashMap底层原理、哈希冲突、JDK1.8优化、遍历方式彻底吃透
java·开发语言·哈希算法
还得是你大哥4 小时前
Java互联网医院管理系统源码SpringBoot
java·spring boot·vue
阿维的博客日记5 小时前
怎么用ThreadLocal解决用户的登录上下文
java·juc
Dicky-_-zhang5 小时前
容器编排实战:Docker与Kubernetes对比选型与落地实践
java·jvm
benpaodeDD6 小时前
视频10,11,12,13——java程序的加载与执行,安装jdk
java·开发语言
一颗牙牙6 小时前
安装mmcv
开发语言·python·深度学习