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

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

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,页面展示

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware虚拟机 Ubuntu没有共享文件夹的问题

在虚拟机的Ubuntu系统中&#xff0c;共享文件目录存放在 mnt/hgfs 下面&#xff0c;但是我安装完系统并添加共享文件后发现&#xff0c;在mnt下连/hgfs目录都没有。 注意&#xff1a;使用共享文件目录需要已安装VMtools工具。 添加共享文件目录 一&#xff1a;在超级用户下 可…

云开发实战教程:手把手教你高效开发应用

声明&#xff1a;本文仅供实践教学使用&#xff0c;没有任何打广告成分 目录 1.引言 2.云开发 Copilot介绍 云开发 Copilot 的功能与特点 3.环境准备 步骤一登录账号 步骤二新建环境 4.开发实践 4.1AI 生成低代码应用 4.2AI 生成低代码页面/区块 4.3AI 优化低代码组件…

聊聊Oracle自适应查询优化

成也AQO败也AQO 因为工作的原因&#xff0c;我们接触到的客户大部分是金融和运营商行业&#xff0c;这些客户有个最大的特点是追求稳定&#xff0c;对于使用数据库新特性持保守的态度&#xff0c;不会轻易尝试某些可能会导致生产系统不稳定的新特性。上线前通常都会将一些新特…

纯CSS实现文本或表格特效(连续滚动与首尾相连)

纯CSS实现文本连续向左滚动首尾相连 1.效果图&#xff1a; 2.实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, init…

深度学习物体检测之YOLOV5源码解读

V5比前面版本偏工程化,项目化,更贴合实战 一.V5版本项目配置 (1)整体项目概述 首先github直接查找yolov5&#xff0c;下载下来即可。在训练时&#xff0c;数据是怎么处理的&#xff1f;网络模型架构是怎么设计的(如各层的设计)&#xff1f;yolov5要求是大于python3.8与大于等…

uniapp h5 js设置监听:超时未操作返回首页(全局只监听一次,可设置监听事件+检查时间+超时时长)

功能实现: 可自定义超时时长,检查时间超时后跳转首页(/pages/home/index/index); 如果在首页,则不进行跳转监控状态下, 用户有任意操作(包括但不限于点击,滑动,跳转页面等),则重置监听,重新开始算时间超时方法及逻辑封装到单独的js文件中 全局只需在app.vue创建监听,其他页面无…

MAC M3电脑在idea上搭建Spark环境并跑通第一个程序

我的电脑是Macbook Pro&#xff0c;最近在学习Spark&#xff0c;想要在idea里搭建Spark环境&#xff0c;为之后的Spark编程作准备。下面是在MAC版本的idea里配置Spark环境。 1. 准备工作 1.安装 JDK 确保Mac 上已经安装了 JDK 8 或更高版本。 可通过 java -version 查看是否…

展柜设计公司平面布置小程序的分析与设计springboot+论文源码调试讲解

3系统的需求分析 需求分析的任务是通过详细调查展柜设计公司平面布置小程序软件所需的对象&#xff0c;充分了解系统的工作概况&#xff0c;明确功能实现的各种需求&#xff0c;然后在此基础上确定系统的功能。系统必须充分考虑今后可能的扩充和改变。 3.1可行性分析 通过对…

用人话讲计算机:Python篇!(十二)正则运算+re模块

目录 一、正则表达式 &#xff08;1&#xff09;什么是正则表达式 &#xff08;2&#xff09;它的结构及使用 示例&#xff1a; 1.字符 . &#xff08;←这里有个小点哦&#xff09; 2.字符 | 3.字符 [ ] 4.字符^ 5.字符\d &#xff08;3&#xff09;补充&#xff…

C# 与PLC数据交互

点击跳转下载地址 点击跳转胡工科技官网

康佳Android面试题及参考答案(多张原理图)

JVM 内存分布和分代回收机制是什么? JVM 内存主要分为以下几个区域。 堆(Heap)是 JVM 管理的最大的一块内存区域,主要用于存放对象实例。所有线程共享堆内存,在堆中又分为年轻代(Young Generation)和老年代(Old Generation)。年轻代又分为 Eden 区和两个 Survivor 区(…

家校通小程序实战教程10部门管理前后端连接

目录 1 加载后端的数据2 为什么不直接给变量赋值3 保存部门信息4 最终的效果5 总结 现在部门管理已经完成了后端功能和前端开发&#xff0c;就需要在前端调用后端的数据完成界面的展示&#xff0c;而且在录入部门信息后需要提交到数据库里&#xff0c;本篇我们介绍一下前后端如…

【Java】链接数据库简介

JDBC基本原理 JDBC 提供了一套通用的接口&#xff0c;允许 Java 程序与不同类型的数据库进行交互。 JDBC 是 Java 提供的一种用于与数据库通信的 API&#xff08;应用程序编程接口&#xff09;&#xff0c;定义了 Java 程序如何与数据库进行连接、执行查询、操作数据等。JDBC…

企业级包管理器之 monorepomultirepo (8)

在企业级项目开发中&#xff0c;面对多个项目的管理&#xff0c;monorepo 和 multirepo 是两种常见的代码管理方案&#xff0c;它们各有特点与优劣&#xff0c;下面我们来详细了解一下。 一、基本概念 monorepo&#xff1a;“mono”在英语中有“单一的、单独的”之意&#xf…

SQLite 数据库学习

0.引言 SQL, 全名是 Structured Query Language, 中文翻译是"结构化查询语言"。它是一种专门用来与数据库交互的语言。简单来说&#xff0c;SQL就是跟数据库"对话"的一种语言。 1.install sudo apt update sudo apt install sqlitebrowser这是一个开源的…

电子科技大学考研,计算机与软件专业怎么选择?

电子科技大学在计算机与软件领域具备卓越实力&#xff0c;其毕业生就业前景及薪资水平均颇为可观。因此&#xff0c;学生应依据个人课程专长来选定专业。若各项课程均表现出色&#xff0c;推荐25届考生优先考虑软件专业&#xff0c;因其上岸难度相对较低。 接下来&#xff0c;C…

智能客户服务:科技赋能下的新体验

在当今这个数字化时代&#xff0c;客户服务已经不仅仅是简单的售后服务&#xff0c;它已竞争的关键要素之一。随着人工智能、大数据、云计算等技术的飞速发展&#xff0c;智能客户服务正逐步改变着传统的服务模式&#xff0c;为企业和消费者带来了前所未有的新体验。 一、智能客…

HCIA-Access V2.5_2_3_网络通信基础_以太网概述

什么是以太网 以太网是由IEEE定义的局域网技术&#xff0c;也是目前应用最普遍的技术&#xff0c;早期的令牌环网&#xff0c;FDDI等局域网技术都被它取代了&#xff0c;以太网主要分为两类&#xff0c;共享型以太网和交换型以太网。共享式以太网主要采用总线型的拓扑结构&…

Unix 传奇 | 谁写了 Linux | Unix birthmark

注&#xff1a;本文为 “左耳听风”陈皓的 unix 相关文章合辑。 皓侠已走远&#xff0c;文章有点“年头”&#xff0c;但值得一阅。 文中部分超链已沉寂。 Unix 传奇 (上篇) 2010 年 04 月 09 日 陈皓 了解过去&#xff0c;我们才能知其然&#xff0c;更知所以然。总结过去…

【嵌入式软件】跑开发板的前置服务配置

在嵌入式开发中,通常需要在 开发板和主机之间共享、传输和挂载文件。 这篇文章是关于如何在 Ubuntu 中配置 Samba、TFTP 和 NFS 协议的详细步骤。这些协议分别用于远程文件共享、文件传输和内核挂载文件系统。 如何安装协议: 参考:ubuntu18配置:详细的内容我手写了一份文档。…