使用html和JavaScript实现一个简易的物业管理系统

news2024/12/16 17:13:11

码实现了一个简易的物业管理系统,主要使用了以下技术和功能:

1.主要技术

使用的技术:

  1. HTML:

    • 用于构建网页的基本结构。
    • 包括表单、表格、按钮等元素。
  2. CSS:

    • 用于美化网页的外观和布局。
    • 设置字体、颜色、边距、对齐方式等样式。
  3. JavaScript:

    • 用于处理用户交互和动态更新页面内容。
    • 实现了新增住户、查询住户、编辑住户、删除住户等功能。
    • 处理表单提交事件,验证输入数据,并更新表格显示。
  4. DOM操作:

    • 使用 JavaScript 直接操作 HTML DOM 元素。
    • 动态生成和更新表格内容,根据用户操作实时反映数据变化。
  5. 模态框(Modal):

    • 使用自定义的模态框来实现编辑住户信息的功能。
    • 提供一个弹出窗口让用户可以编辑住户详细信息,并保存更改。

2.主要功能说明

实现的主要系统功能:

  1. 菜单导航:

    • 用户可以通过侧边栏中的按钮切换不同的管理模块,包括住户管理和物业费缴纳。
  2. 住户管理:

    • 新增住户: 提供表单让用户输入住户姓名、性别、电话和楼层单元号,并将其添加到住户列表中。
    • 查询用户: 显示所有住户的信息,并支持按姓名或单元号搜索特定住户。
    • 编辑住户: 通过模态框允许用户编辑已存在的住户信息。
    • 删除住户: 提供删除按钮让用户从住户列表中移除某个住户。
  3. 物业费缴纳:

    • 提供一个表单让用户选择住户并输入缴纳的物业费金额。
    • 记录每次缴纳的费用,并显示在表格中。
  4. 表单清空:

    • 在成功添加住户后,自动清空表单中的所有输入字段,以便用户可以立即开始新的输入。

这个系统的目的是简化物业管理过程,提高工作效率,并方便地管理和跟踪住户信息及物业费缴纳情况。

3.完整代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>物业管理系统</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
            display: flex;
        }
        .sidebar {
            width: 200px;
            padding: 10px;
            border-right: 1px solid #ddd;
        }
        .content {
            flex-grow: 1;
            padding: 10px;
        }
        form {
            display: flex;
            flex-direction: column;
            gap: 10px;
            margin-bottom: 20px;
        }
        label {
            display: block;
        }
        input, select, button {
            width: 100%;
            padding: 8px;
        }
        table {
            width: 100%;
            border-collapse: collapse;
        }
        th, td {
            border: 1px solid #ddd;
            padding: 8px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
        button {
            margin-top: 10px;
        }
        .submenu {
            margin-left: 20px;
        }
        #editModal {
            display: none;
            position: fixed;
            z-index: 1;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            overflow: auto;
            background-color: rgba(0,0,0,0.4);
        }
        .edit-modal-content {
            background-color: #fefefe;
            margin: 15% auto;
            padding: 20px;
            border: 1px solid #888;
            width: 300px;
        }
        .close {
            color: #aaa;
            float: right;
            font-size: 28px;
            font-weight: bold;
        }
        .close:hover,
        .close:focus {
            color: black;
            text-decoration: none;
            cursor: pointer;
        }
    </style>
</head>
<body>
<div class="sidebar">
    <h2>菜单</h2>
    <button onclick="showResidentsMenu()">住户管理</button>
    <div id="residentsSubmenu" class="submenu" style="display:none;">
        <button onclick="showAddResidentForm()">新增住户</button>
        <button onclick="showQueryResidents()">查询用户</button>
    </div>
    <button onclick="showPayments()">物业费缴纳</button>
</div>
<div class="content" id="contentArea">
    <!-- 默认显示欢迎信息 -->
    <h2>欢迎登录不靠谱物业管理系统</h2>
</div>

<!-- Edit Modal -->
<div id="editModal" class="modal">
    <div class="edit-modal-content">
        <span class="close" onclick="closeEditModal()">&times;</span>
        <form onsubmit="event.preventDefault(); saveEditedResident()">
            <label for="editName">住户姓名:</label>
            <input type="text" id="editName" required>
            
            <label for="editGender">性别:</label>
            <select id="editGender" required>
                <option value="" disabled selected>请选择性别</option>
                <option value=""></option>
                <option value=""></option>
            </select>
            
            <label for="editPhone">电话:</label>
            <input type="tel" id="editPhone" required>
            
            <label for="editUnit">楼层单元号:</label>
            <input type="text" id="editUnit" required>
            
            <button type="submit">保存</button>
        </form>
    </div>
</div>

<script>
    let residents = [];
    let payments = [];

    function showResidentsMenu() {
        const submenu = document.getElementById('residentsSubmenu');
        if (submenu.style.display === 'none') {
            submenu.style.display = 'block';
        } else {
            submenu.style.display = 'none';
        }
    }

    function showAddResidentForm() {
        const contentArea = document.getElementById('contentArea');
        contentArea.innerHTML = `
            <h2>住户管理 - 新增住户</h2>
            <form οnsubmit="event.preventDefault(); addResidentDirectly()">
                <label for="residentName">住户姓名:</label>
                <input type="text" id="residentName" placeholder="住户姓名" required>
                
                <label for="residentGender">性别:</label>
                <select id="residentGender" required>
                    <option value="" disabled selected>请选择性别</option>
                    <option value="男">男</option>
                    <option value="女">女</option>
                </select>
                
                <label for="residentPhone">电话:</label>
                <input type="tel" id="residentPhone" placeholder="电话" required>
                
                <label for="residentUnit">楼层单元号:</label>
                <input type="text" id="residentUnit" placeholder="楼层单元号" required>
                
                <button type="submit">添加住户</button>
            </form>
        `;
    }

    function showQueryResidents() {
        const contentArea = document.getElementById('contentArea');
        contentArea.innerHTML = `
            <h2>住户管理 - 查询用户</h2>
            <input type="text" id="searchInput" placeholder="按姓名或单元号搜索..." οnkeyup="filterResidents()">
            <table id="residentsTable">
                <thead>
                    <tr>
                        <th>住户姓名</th>
                        <th>性别</th>
                        <th>电话</th>
                        <th>楼层单元号</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <tbody>
                </tbody>
            </table>
        `;
        updateResidentsTable();
    }

    function addResidentDirectly() {
        const name = document.getElementById('residentName').value.trim();
        const gender = document.getElementById('residentGender').value;
        const phone = document.getElementById('residentPhone').value.trim();
        const unit = document.getElementById('residentUnit').value.trim();

        if (name && gender && phone && unit) {
            residents.push({ name, gender, phone, unit });
            updateResidentsTable();
            clearFormFields();
        }
    }

    function removeResident(index) {
        residents.splice(index, 1);
        updateResidentsTable();
    }

    function editResident(index) {
        const resident = residents[index];
        document.getElementById('editName').value = resident.name;
        document.getElementById('editGender').value = resident.gender;
        document.getElementById('editPhone').value = resident.phone;
        document.getElementById('editUnit').value = resident.unit;
        openEditModal(index);
    }

    function saveEditedResident() {
        const index = parseInt(document.getElementById('editModal').getAttribute('data-index'), 10);
        const editedName = document.getElementById('editName').value.trim();
        const editedGender = document.getElementById('editGender').value;
        const editedPhone = document.getElementById('editPhone').value.trim();
        const editedUnit = document.getElementById('editUnit').value.trim();

        if (editedName && editedGender && editedPhone && editedUnit) {
            residents[index] = { name: editedName, gender: editedGender, phone: editedPhone, unit: editedUnit };
            updateResidentsTable();
            closeEditModal();
        }
    }

    function openEditModal(index) {
        document.getElementById('editModal').setAttribute('data-index', index);
        document.getElementById('editModal').style.display = 'block';
    }

    function closeEditModal() {
        document.getElementById('editModal').style.display = 'none';
    }

    function updateResidentsTable() {
        const tbody = document.querySelector('#residentsTable tbody');
        tbody.innerHTML = '';
        residents.forEach((resident, index) => {
            const row = document.createElement('tr');
            row.innerHTML = `
                <td>${resident.name}</td>
                <td>${resident.gender}</td>
                <td>${resident.phone}</td>
                <td>${resident.unit}</td>
                <td>
                    <button οnclick="removeResident(${index})">删除</button>
                    <button οnclick="editResident(${index})">编辑</button>
                </td>
            `;
            tbody.appendChild(row);
        });
    }

    function filterResidents() {
        const input = document.getElementById('searchInput').value.toLowerCase();
        const rows = document.querySelectorAll('#residentsTable tbody tr');

        rows.forEach(row => {
            const cells = row.getElementsByTagName('td');
            const name = cells[0].textContent || cells[0].innerText;
            const unit = cells[3].textContent || cells[3].innerText;

            if (name.toLowerCase().includes(input) || unit.toLowerCase().includes(input)) {
                row.style.display = '';
            } else {
                row.style.display = 'none';
            }
        });
    }

    function makePayment() {
        const residentIndex = document.getElementById('paymentSelect').selectedIndex - 1;
        const amount = parseFloat(document.getElementById('amount').value);
        if (residentIndex >= 0 && !isNaN(amount)) {
            const payment = {
                resident: residents[residentIndex].name,
                amount: amount,
                date: new Date().toLocaleDateString()
            };
            payments.push(payment);
            updatePaymentsTable();
            document.getElementById('amount').value = '';
        }
    }

    function updatePaymentSelect() {
        const select = document.getElementById('paymentSelect');
        select.innerHTML = '<option disabled selected>请选择住户</option>';
        residents.forEach(resident => {
            const option = document.createElement('option');
            option.textContent = resident.name;
            select.appendChild(option);
        });
    }

    function updatePaymentsTable() {
        const tbody = document.querySelector('#paymentsTable tbody');
        tbody.innerHTML = '';
        payments.forEach(payment => {
            const row = document.createElement('tr');
            row.innerHTML = `
                <td>${payment.resident}</td>
                <td>${payment.amount.toFixed(2)}</td>
                <td>${payment.date}</td>
            `;
            tbody.appendChild(row);
        });
    }

    function showPayments() {
        const contentArea = document.getElementById('contentArea');
        contentArea.innerHTML = `
            <h2>物业费缴纳</h2>
            <form οnsubmit="event.preventDefault(); makePayment()">
                <label for="paymentSelect">选择住户:</label>
                <select id="paymentSelect" required>
                    <!-- 动态填充住户选项 -->
                </select>
                
                <label for="amount">金额:</label>
                <input type="number" id="amount" placeholder="金额" required>
                
                <button type="submit">缴纳费用</button>
            </form>
            <table id="paymentsTable">
                <thead>
                    <tr>
                        <th>住户姓名</th>
                        <th>金额</th>
                        <th>日期</th>
                    </tr>
                </thead>
                <tbody>
                </tbody>
            </table>
        `;
        updatePaymentSelect();
        updatePaymentsTable();
    }

    function clearFormFields() {
        document.getElementById('residentName').value = '';
        document.getElementById('residentGender').value = '';
        document.getElementById('residentPhone').value = '';
        document.getElementById('residentUnit').value = '';
    }

    // 初始化页面
    window.onload = function() {
        document.getElementById('contentArea').innerHTML = '<h2>欢迎登录不靠谱物业管理系统</h2>';
    };
</script>
</body>
</html>




4,页面展示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSM 垃圾分类系统——高效分类的科技保障

第五章 系统功能实现 5.1管理员登录 管理员登录&#xff0c;通过填写用户名、密码、角色等信息&#xff0c;输入完成后选择登录即可进入垃圾分类系统&#xff0c;如图5-1所示。 图5-1管理员登录界面图 5.2管理员功能实现 5.2.1 用户管理 管理员对用户管理进行填写账号、姓名、…

ip_done

文章目录 路由结论 IP分片 数据链路层重谈Mac地址MAC帧报头局域网的通信原理MSS&#xff0c;以及MAC帧对上层的影响ARP协议 1.公司是不是这样呢? 类似的要给运营商交钱&#xff0c;构建公司的子网&#xff0c;具有公司级别的入口路由器 2&#xff0e;为什么要这样呢?? IP地…

排序算法(5):归并排序

问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 归并排序 归并排序采用分治法&#xff0c;将序列分成若干子序列&#xff0c;每个子序列有序后再合并成有序的完整序列。 在数组排序中&#xff0c;如果只有一个数&#xff0c;那么它本身就是有序的。如果有两个数&#xff0…

uniapp打包apk教程

文章目录 一、uniapp是什么&#xff1f;二、使用步骤1.需要有Java环境&#xff0c;安装jdk2.安装hbuilderx开发工具3.自签证书4.使用云打包 总结 一、uniapp是什么&#xff1f; ‌uni-app是一个基于Vue.js的跨平台应用开发框架&#xff0c;允许开发者使用一套代码同时构建iOS、…

Titanic - Machine Learning from Disaster————泰坦尼克号幸存者预测————逻辑回归、随机森林和梯度提升树(XGBoost、LightGBM)

目录 1. 引言 2. 理解 Titanic 数据集 目标变量 数据的初步探索 3. 数据预处理 3.1 处理缺失值 3.2 处理类别型特征 3.3 创建新特征 3.4 删除无关特征 3.5 确保所有特征都是数值型 4. 模型选择与训练 4.1 数据集拆分 4.2 选择和训练模型 4.2.1 逻辑回归模型 4.2…

MySQL笔记--多表查询

1--多表关系 多表关系基本上分为三种&#xff1a; 一对多&#xff08;多对一&#xff09;&#xff1b; 多对多&#xff1b; 一对一&#xff1b; 1-1--多对一 在多的一方建立外键&#xff0c;指向一的一方的主键&#xff1b; 1-2--多对多 建立第三张中间表&#xff0c;中间表至少…

利用git上传项目到GitHub

GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了&#xff0c;非常受欢迎&#xff0c;比之svn更好。 GitHub可以免费使用&#xff0c;并且快速稳定。 利用GitHub&#xff0c;你可以将项目存档&#xff0c;与其他人分享交流&#xff0c;并让其他开发者帮助你一…

Gate学习(7)引入体素源

一、从GitHub下载体素源模型源码 下载地址&#xff1a;BenAuer2021/Phantoms-for-Nuclear-Medicine-Imaging-Simulation&#xff1a;用于核医学成像应用的模型&#xff08;闪烁显像、SPECT 和 PET&#xff09; --- BenAuer2021/Phantoms-For-Nuclear-Medicine-Imaging-Simulat…

快速启动Go-Admin(Gin + Vue3 + Element UI)脚手架管理系统

Go-Admin 是一个基于 Gin Vue Element UI & Arco Design & Ant Design 的前后端分离权限管理系统脚手架。它包含了多租户支持、基础用户管理功能、JWT 鉴权、代码生成器、RBAC 资源控制、表单构建、定时任务等功能。该项目的主要编程语言是 Go 和 JavaScript。 ps&a…

epoll反应堆模型

epoll反应堆模型 基于该视频所做笔记&#xff0c;视频里面讲的也挺难的&#xff0c;最好先让chat给你梳理一遍整体的代码再去看视频吧 15-epoll反应堆模型总述_bilibili_哔哩哔哩_bilibili 文章目录 epoll反应堆模型1.epoll反应堆模型概述2.具体讲解1.myevent_s结构体2.超时检…

F-Cooper论文精读(未完成)

F-Cooper 文章目录 背景有关边缘计算基于单目激光雷达数据的3D目标检测 创新点与以前比创新之处1&#xff1a;引入基于特征的协同感知&#xff08;F-Cooper&#xff09;框架创新2&#xff1a;所需数据量减少 2. 基于特征融合的车辆数据处理2.1 卷积特征图2.2 融合特征2.2.1 融…

Z240004基于Java+ssm+maven+mysql的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…

嵌入式软考学习笔记(1)超详细!!!

目录 第一章计算机系统基础知识 1、逻辑运算 2、数的表示 3、总线系统 5、流水线 6、存储器 7、可靠性、校验码 第一章计算机系统基础知识 1、逻辑运算 与&#xff1a;有0则0&#xff0c;全1才1 或&#xff1a;有1则1&#xff0c;全0才0 异或&#xff1a;相同为0…

C# 探险之旅:第二十五节 - 类型class之字段Fields大冒险

嘿&#xff0c;探险家们&#xff01;欢迎再次搭乘C#的魔法列车&#xff0c;今天我们要深入探索class里的宝藏——字段&#xff08;Fields&#xff09;&#xff01;想象一下&#xff0c;字段就像是类里的秘密小房间&#xff0c;里面藏着对象的小秘密和宝藏。我们不仅要看看这些小…

时序论文31|NIPS24自注意力机制真的对时序预测任务有效吗?

论文标题&#xff1a;Are Self-Attentions Effective for Time Series Forecasting? 论文链接&#xff1a;https://arxiv.org/pdf/2409.18696 代码链接&#xff1a;https://github.com/dongbeank/CATS 前言 本文将重点转向探究自注意力机制在其中的有效性&#xff0c;提出…

Linux中openEuler 系统 配置mail.rc给邮箱发送邮件

这里用这个实验判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。 查看当前磁盘剩余空间[rootserver ~]# df -h | grep "\/$" | cut -d" " -f4 | cut -d"G" -…

【51单片机】矩阵按键快速上手

51单片机矩阵按键是一种在单片机应用系统中广泛使用的按键排列方式&#xff0c;特别适用于需要多个按键但I/O口资源有限的情况。以下是对51单片机矩阵按键的详细介绍&#xff1a; 一、矩阵按键的基本概念 ‌定义‌&#xff1a;矩阵按键&#xff0c;又称行列键盘&#xff0c;是…

clearvoice 语音降噪、语音分离库

参看: https://github.com/modelscope/ClearerVoice-Studio/tree/main ClearVoice 提供了一个统一的推理平台,用于语音增强、语音分离以及视听目标说话人提取。 代码参看: https://github.com/modelscope/ClearerVoice-Studio/tree/main/clearvoice https://github.com/mode…

外观模式的理解和实践

外观模式&#xff08;Facade Pattern&#xff09;是一种常用的软件设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口。该模式定义了一个高层的接口&#xff0c;使得子系统更容易使用。简单来说&#xff0c;外观模式就是通过引入一个外观角色…

【Email】基于SpringBoot3.4.x集成发送邮件功能

【Email】基于SpringBoot3.4.x集成发送邮件功能 摘要本地开发环境说明pom.xml启动类application.yaml写一个邮件模板定义模板引擎工具类定义一个邮件发送对象封装一个邮件发送器单元测试邮件模板单元测试发送邮件单元测试 邮件效果参考资料 摘要 在业务系统开发过程中&#xf…