当前位置: 首页 > news >正文

校园物业报修小程序开发笔记一

背景

  • 校园规模和复杂性: 大型学校和校园通常拥有众多的建筑物、设施和设备,需要有效的维护和报修系统,以满足学生、教职员工和校园管理人员的需求。

  • 学生和员工需求: 学生和员工在校园内可能遇到各种维修问题,如故障的电灯、漏水、损坏的设备等。他们需要一种便捷的方式来报修问题并追踪报修进度。

  • 校园安全和卫生: 校园管理方需要确保校园内的设施和设备处于良好状态,以提供安全和卫生的学习和工作环境。因此,他们需要一个系统来管理和处理报修请求。

  • 工作效率提升: 传统的报修方式可能涉及电话、邮件或纸质报修单,这可能会导致信息不准确或丢失。校园需要一种更高效的方式来收集和处理报修请求。

  • 数据管理和分析: 校园管理方需要能够记录和分析报修数据,以便了解常见的问题、维修成本和维修工作的效率。

  • 可持续性和资源分配: 通过维护设施和设备,校园可以延长其使用寿命,降低维修成本,减少资源浪费,有助于可持续性管理。

功能设计

基于这些需求和背景,校园物业报修小程序的开发变得重要。这样的小程序可以提供以下功能:

  • 报修请求提交: 学生和员工可以使用小程序提交报修请求,包括问题的描述、照片等信息。

  • 报修进度追踪: 用户可以随时追踪其报修请求的进度,以了解何时将解决问题。

  • 工单分配和管理: 校园管理人员可以使用小程序来分配工单给维修人员,确保问题得到及时解决。

  • 维修资源管理: 系统可以帮助管理方有效地分配维修资源,提高维修效率。

开发校园物业报修小程序有助于提高校园的效率、安
全性和可持续性,同时提供更好的用户体验。此外,小程序还可以降低沟通成本,减少信息丢失的可能性,为校园管理提供有力的工具。

概要设计

在这里插入图片描述

数据库设计

TaskModel.DB_STRUCTURE = {
_pid: ‘string|true’,
TASK_ID: ‘string|true’,

TASK_TYPE: 'int|true|default=0|comment=类型 0=用户创建,1=系统创建',TASK_USER_ID: 'string|false|comment=用户ID',TASK_STATUS: 'int|true|default=0|comment=状态 0=待派工,1=已派工,2=待处理, 9=已完成',TASK_FORMS: 'array|true|default=[]', 
TASK_OBJ: 'object|true|default={}', TASK_MEMBER_ID: 'string|false|comment=工作人员ID', 
TASK_MEMBER_NAME: 'string|false',
TASK_MEMBER_PHONE: 'string|false',
TASK_MEMBER_CATE_NAME: 'string|false|comment=工作人员分类',
TASK_MEMBER_CATE_ID: 'string|false|comment=工作人员分类ID',
TASK_MEMBER_TIME: 'int|true|default=0|comment=工作人员派工时间',TASK_RUN_FORMS: 'array|true|default=[]',
TASK_RUN_OBJ: 'object|true|default={}',
TASK_RUN_TIME: 'int|true|default=0',TASK_OVER_FORMS: 'array|true|default=[]',
TASK_OVER_OBJ: 'object|true|default={}',
TASK_OVER_TIME: 'int|true|default=0',TASK_COMMENT_FORMS: 'array|true|default=[]',
TASK_COMMENT_OBJ: 'object|true|default={}',
TASK_COMMENT_TIME: 'int|true|default=0',
TASK_COMMENT_STATUS: 'int|true|default=0',TASK_MEMBER_ADMIN_ID: 'string|false',
TASK_MEMBER_ADMIN_NAME: 'string|false',TASK_ADD_TIME: 'int|true',
TASK_EDIT_TIME: 'int|true',
TASK_ADD_IP: 'string|false',
TASK_EDIT_IP: 'string|false',

};

// 字段前缀
TaskModel.FIELD_PREFIX = “TASK_”;

/**

  • 状态 0=待处理,1=处理中 9=已完成
    */
    TaskModel.STATUS = {
    WAIT: 0,
    APPT: 1,
    RUN: 2,
    OVER: 9
    };

TaskModel.STATUS_DESC = {
WAIT: ‘待派工’,
APPT: ‘已派工’,
RUN: ‘处理中’,
OVER: ‘已完成’,
};

难点攻关

// 取得处理流程
getTaskLogList(task) {
let taskLogList = [];
if (task.TASK_TYPE == 0) {
taskLogList.push(
{
desc: ‘用户提交’,
time: timeUtil.timestamp2Time(task.TASK_ADD_TIME, ‘Y-M-D h:m’)
}
);
}
else {
taskLogList.push(
{
desc: ‘后台录入’,
time: timeUtil.timestamp2Time(task.TASK_ADD_TIME, ‘Y-M-D h:m’)
}
);
}

	if (task.TASK_STATUS >= TaskModel.STATUS.APPT) {let desc = '已派工给 [' + task.TASK_MEMBER_CATE_NAME + '] ' + task.TASK_MEMBER_NAME + ',正在等待处理';if (task.TASK_MEMBER_PHONE) desc += ' ,电话' + task.TASK_MEMBER_PHONE + ' ';taskLogList.push({desc,time: timeUtil.timestamp2Time(task.TASK_MEMBER_TIME, 'Y-M-D h:m')});}if (task.TASK_STATUS >= TaskModel.STATUS.RUN)taskLogList.push({desc: '[' + task.TASK_MEMBER_CATE_NAME + '] ' + task.TASK_MEMBER_NAME + ' 开始处理',time: timeUtil.timestamp2Time(task.TASK_RUN_TIME, 'Y-M-D h:m'),content: task.TASK_RUN_OBJ.content,img: task.TASK_RUN_OBJ.img,});if (task.TASK_STATUS >= TaskModel.STATUS.OVER)taskLogList.push({desc: '[' + task.TASK_MEMBER_CATE_NAME + '] ' + task.TASK_MEMBER_NAME + ' 已完成',time: timeUtil.timestamp2Time(task.TASK_OVER_TIME, 'Y-M-D h:m'),content: task.TASK_OVER_OBJ.content,img: task.TASK_OVER_OBJ.img,});return taskLogList;
}async getTaskCountByType(userId) {let status0Cnt = await TaskModel.count({ TASK_STATUS: 0, TASK_USER_ID: userId });let status1Cnt = await TaskModel.count({ TASK_STATUS: 1, TASK_USER_ID: userId });let status2Cnt = await TaskModel.count({ TASK_STATUS: 2, TASK_USER_ID: userId });let status9Cnt = await TaskModel.count({ TASK_STATUS: 9, TASK_USER_ID: userId });let task = {status0Cnt,status1Cnt,status2Cnt,status9Cnt}return task;
}async getTaskDetail(userId, id, isAdmin = false) {let where = {_id: id}if (!isAdmin) where.TASK_USER_ID = userId;let task = await TaskModel.getOne(where);task.taskLogList = this.getTaskLogList(task);return task;
}/**添加 */
async insertTask(userId, {forms
}) {this.AppError('[校园报修]该功能暂不开放,如有需要请加作者微信:cclinux0730');
}/**修改 */
async editTask({id,forms
}, formsName = 'TASK_FORMS', objName = 'TASK_OBJ') {this.AppError('[校园报修]该功能暂不开放,如有需要请加作者微信:cclinux0730');
}// 更新forms信息
async updateTaskForms({id,hasImageForms
}, formsName = 'TASK_FORMS', objName = 'TASK_OBJ') {await TaskModel.editForms(id, formsName, objName, hasImageForms);
}/**删除数据 */
async delTask(userId, id, isAdmin) {this.AppError('[校园报修]该功能暂不开放,如有需要请加作者微信:cclinux0730');}async commentTask(id, forms) {this.AppError('[校园报修]该功能暂不开放,如有需要请加作者微信:cclinux0730');
}/** 取得我的 */
async getMyTaskList(userId, {search, // 搜索条件sortType, // 搜索菜单sortVal, // 搜索菜单orderBy, // 排序 page,size,isTotal = true,oldTotal
}) {orderBy = orderBy || {'TASK_ADD_TIME': 'desc'};let fields = '*';let where = {};where.and = {_pid: this.getProjectId(), //复杂的查询在此处标注PID TASK_USER_ID: userId};if (util.isDefined(search) && search) {where.or = [{ ['TASK_OBJ.type']: ['like', search] },{ ['TASK_OBJ.address']: ['like', search] },{ ['TASK_OBJ.person']: ['like', search] }];} else if (sortType && sortVal !== '') {// 搜索菜单switch (sortType) {case 'type': {where.and['TASK_OBJ.type'] = sortVal;break;}case 'status': {where.and.TASK_STATUS = Number(sortVal);break;}case 'sort': {orderBy = this.fmtOrderBySort(sortVal, 'TASK_ADD_TIME');break;}}}let result = await TaskModel.getList(where, fields, orderBy, page, size, isTotal, oldTotal);return result;
}async getTaskList({search, // 搜索条件sortType, // 搜索菜单sortVal, // 搜索菜单orderBy, // 排序 page,size,isTotal = true,oldTotal
}) {orderBy = orderBy || {'TASK_ADD_TIME': 'desc'};let fields = '*';let where = {};where.and = {_pid: this.getProjectId(), //复杂的查询在此处标注PID  };if (util.isDefined(search) && search) {where.or = [{ ['TASK_OBJ.title']: ['like', search] },{ ['TASK_OBJ.building']: ['like', search] },];} else if (sortType && sortVal !== '') {// 搜索菜单switch (sortType) {case 'type': {where.and['TASK_OBJ.type'] = sortVal;break;}case 'status': {where.and.TASK_STATUS = Number(sortVal);break;}case 'sort': {orderBy = this.fmtOrderBySort(sortVal, 'TASK_ADD_TIME');break;}}}let result = await TaskModel.getList(where, fields, orderBy, page, size, isTotal, oldTotal);return result;
}

用户UI设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

维修工作人员UI设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

管理人员UI设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

git下载

下载

相关文章:

校园物业报修小程序开发笔记一

背景 校园规模和复杂性: 大型学校和校园通常拥有众多的建筑物、设施和设备,需要有效的维护和报修系统,以满足学生、教职员工和校园管理人员的需求。 学生和员工需求: 学生和员工在校园内可能遇到各种维修问题,如故障的…...

用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程

🧸注:不要看我的文件多,那是我的其他项目,这个项目所用的文件我会全部用红框框起来,没框的部分不用管,前端两个文件,后端一个文件 📜 目录 首先,定义前后端交互接口 然…...

FFmpeg5.1.3编译动态库踩坑之旅(基于Linux虚拟机)

准备工作 环境准备 1.Windows安装Oracle VM VirtualBox 7.0.10,安装ubuntu-22.04.3。 坑一:无法往虚拟机里拖放复制文件,解决办法:登录Ubuntu虚拟机时切换到xorg方式登录,参考地址:Ubuntu Desktop 22.04…...

【语义分割】语义分割概念及算法介绍

文章目录 一、基本概念二、研究现状2.1 传统算法2.2 深度学习方法 三、数据集及评价指标3.1 常用数据集3.2 常用指标 四、经典模型参考资料 一、基本概念 语义分割是计算机视觉中很重要的一个方向。不同于目标检测和识别,语义分割实现了图像像素级的分类。它能够将…...

基于RK3568高性价比全国产EMS储能解决方案(一)概述

储能产业链框架 储能产业链可分为上游“原材料及生产设备”、中游“储能系统”、下游“储能场景应用及后市场服务”。 图1 储能产业链框架图 产业链中游的“储能电池系统”主要包括“能量管理系统(EMS)”、“电池管理系统(BMS)”、“储能逆变器(PCS)”、“电池组”四个部分。…...

3 Go的基础语法

概述 在上一节的内容中,我们介绍了第一个Go程序,包括:安装Go环境、编写第一个Go程序、编译并运行程序等。在本节中,我们将介绍Go的基础语法。Go是一门简洁和优雅的语言,有自己特殊的一些语法规则。因此,在介…...

Redis之Lua脚本讲解

这里写自定义目录标题 1 Lua1.1 简介1.1.1 注释1.1.2 变量1.1.3 数据类型1.1.4 控制结构1.1.5 函数1.1.6 模块1.1.7 字符串操作1.1.8 错误处理1.1.9 标准库 1.2 Redis和Lua脚本结合优点1.3 Lua脚本应用和调试1.3.1 缓存更新1.3.2 原子操作1.3.3 数据处理1.3.4 分布式锁1.3.5 Re…...

redis archive github

https://github.com/redis/redis/releases/tag/7.2.2https://github.com/redis/redis/releases/tag/7.2.2...

3台Centos7快速部署Kafka集群

首先,我要说,Kafka 是强依赖于 ZooKeeper 的,所以在设置 Kafka 集群之前,我们首先需要设置一个 ZooKeeper 集群。 部署ZooKeeper需要安装jdk yum install java-1.8.0-openjdk 安装完以后 下面是详细的步骤: 1. 安装和…...

最小栈(C++解法)

题目 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。i…...

Python 算法高级篇:堆排序的优化与应用

Python 算法高级篇:堆排序的优化与应用 引言 1. 什么是堆?2. 堆的性质3. 堆排序的基本原理4. 堆排序的 Python 实现5. 堆排序的性能和优化6. 堆排序的实际应用7. 总结 引言 堆排序是一种高效的排序算法,它基于数据结构中的堆这一概念。堆排序…...

视频下载软件 Downie4 mac中文介绍

Downie mac是一款Mac平台上非常实用的视频下载工具。它支持下载各种视频网站上的视频,并且具有快速、稳定、易于使用的特点。 Downie支持下载各种视频网站上的视频,包括YouTube、Vimeo、Netflix、Hulu、Amazon等等。它具有快速、稳定的下载速度&#xff…...

计算机操作系统重点概念整理-第一章 计算机系统概述【期末复习|考研复习】

第一章 计算机系统概述 【期末复习|考研复习】 计算机操作系统系列文章传送门: 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第一章 计算机系统概述 【期末复习|考研复习】前言一、计…...

树莓派基金会近日发布了新版基于 Debian 的树莓派操作系统

树莓派基金会(Raspberry Pi Foundation)近日发布了新版基于 Debian 的树莓派操作系统(Raspberry Pi OS),为树莓派单板电脑带来了新的书虫基础和一些重大变化。 新版 Raspberry Pi OS 的最大变化是它现在基于最新的 Deb…...

Web项目如何做单元测试

你可能会用单元测试框架,python的unittest、pytest,Java的Junit、testNG等。 那么你会做单元测试么!当然了,这有什么难的? test_demo.py def inc(x):return x 1def test_answer():assert inc(3) 4 inc() 是定义的…...

MySQL主从复制(基于GTID--事务ID方式)

目录 一、GTID相关概念1.GTID 是什么?2.GTID主从复制方式概念3.GTID的优缺点 二、GTID工作原理三、部署主从复制四、测试同步1.主库上新建数据库2.从库上查看是否同步成功 五、重设从库六、常见故障七、故障切换八、GTID的一些疑问1.为什么基于GTID的同步也要打开bi…...

3.72 Command Buffer及URP概述

一、Command Buffer 1.概念 CommandBuffer携带一系列的渲染命令,依赖相机,用来拓展渲染管线的渲染效果。而且可以指定在相机渲染的某个点执行本身的拓展渲染。Command buffers也可以结合屏幕后期效果使用。 简单来说就是可以在渲染流程中插入一些自定…...

分布式理论和分布式锁知识点总结

文章目录 (一) 分布式理论算法和协议1)CAP理论总结 2)BASE理论BASE 理论的核心思想基本可用软状态最终一致性 3)Paxos算法Basic Paxos 算法4) Raft算法1 拜占庭将军 5)Gossip协议 (二) 分布式锁分布式锁应该具备哪些条…...

IOC课程整理-17 Spring事件

1. Java 事件/监听器编程模型 2. 面向接口的事件/监听器设计模式 3. 面向注解的事件/监听器设计模式 4. Spring 标准事件-ApplicationEvent 5. 基于接口的 Spring 事件监听器 6. 基于注解的 Spring 事件监听器 7. 注册 Spring ApplicationListener 8. Spring 事件发布器 9. Spr…...

大数据Flink(一百零五):SQL性能调优

文章目录 SQL性能调优 一、 ​​​​​​​MiniBatch 聚合...

终极网盘下载加速工具:告别限速,享受高速下载自由

终极网盘下载加速工具:告别限速,享受高速下载自由 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘…...

终极密码恢复指南:如何使用ArchivePasswordTestTool轻松破解加密压缩包

终极密码恢复指南:如何使用ArchivePasswordTestTool轻松破解加密压缩包 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 你是否曾…...

3分钟搞定B站评论分析:这个开源工具让你秒懂评论区用户身份

3分钟搞定B站评论分析:这个开源工具让你秒懂评论区用户身份 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分,支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-checker …...

AI Scientist-v2论文撰写流程:从实验结果到ICLR格式论文的自动化转换

AI Scientist-v2论文撰写流程:从实验结果到ICLR格式论文的自动化转换 【免费下载链接】AI-Scientist-v2 The AI Scientist-v2: Workshop-Level Automated Scientific Discovery via Agentic Tree Search 项目地址: https://gitcode.com/GitHub_Trending/ai/AI-Sci…...

如何用代码思维轻松绘制专业图表:Mermaid Live Editor 终极指南

如何用代码思维轻松绘制专业图表:Mermaid Live Editor 终极指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-li…...

Blender-Armatures

导航 (返回顶部) 1. Blender-Armatures 1.1 骨架位置1.2 分类1.3 骨骼结构 2. 编辑 2.1 骨骼扭转2.2 拆分 split2.3 分离骨骼 separate2.4 切换方向 3. 镜像编辑 3.1 镜像挤出3.2 命名惯例3.3 对称 4. 属性 4.1 属性结构表4.2 柔性骨骼 Bendy Bones4.3 姿态4.4 关系 5. 骨骼约束…...

终极碧蓝航线自动化脚本:Alas智能辅助工具完整指南

终极碧蓝航线自动化脚本:Alas智能辅助工具完整指南 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript AzurLaneAuto…...

基于智能体的企业级自主决策与业务运营平台解决方案:AI智能管理驾驶舱、智能管理驾驶舱的四大功能定位、总体方案蓝图、总体规划方案

该方案提出以AI大模型与智能体为核心的“智能管理驾驶舱”,通过整合企业私有数据及业务系统,实现从信息呈现、自主决策到自动执行的业务闭环。平台支持事件驱动、可视化编排与多智能体调度,覆盖生产、供应链等典型场景,旨在降低运…...

第二章:达梦数据库基础操作入门——从零搭建与核心操作

想要熟练运用达梦数据库,基础操作是关键。本章将聚焦达梦数据库(以主流的DM8版本为例)的基础操作,包括环境准备、数据库安装、核心工具使用、基础SQL操作等,全程贴合实操场景,新手也能快速上手,…...

RK3576开发板AP6275S无线模块调试:从驱动到应用实战

1. 项目概述:从零上手RK3576的无线模块调试最近在折腾一块基于瑞芯微RK3576的国产工业评估板——眺望电子的EVM-RK3576。这块板子接口资源相当丰富,双千兆网口、CAN、RS485、USB3.0等一应俱全,对于做工业网关、边缘计算盒子或者多媒体终端的开…...