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

背景

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

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

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

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

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

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

功能设计

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

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

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

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

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

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

概要设计

在这里插入图片描述

数据库设计

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下载

下载

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

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

相关文章

ESP8266,手机与电脑之间的TCP通讯

电脑端运行通讯猫调试助手,作为服务端: 电脑端 电脑的IP地址是: 192.168.2.232 手机与电脑之间的TCP通讯 手机端运行网络调试精灵,作为客户端: 手机端 如果从手机端点击"发送"按钮,则也会将"ghhh东方红广场"几个字发送到电脑上(服务端). ESP8266作为客户…

elasticsearch一些重要的配置参数

先看一下官网给我们提供的全部的参数配置项 官网地址 官方文档链接:注意版本是8.1Configuring Elasticsearch | Elasticsearch Guide [8.1] | Elastic​编辑https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html 重要(基本…

【2023Mathorcup大数据】B题 电商零售商家需求预测及库存优化问题 python代码解析

【2023Mathorcup大数据】B题 电商零售商家需求预测及库存优化问题 python代码解析 1 题目 2023 年MathorCup 高校数学建模挑战赛——大数据竞赛赛道B:电商零售商家需求预测及库存优化问题电商平台存在着上千个商家,他们会将商品货物放在电商配套的仓库…

通道洗牌的思想神了

大家好啊,我是董董灿。 昨天写了一篇关于分组卷积的文章:分组卷积的思想神了,然后有同学希望多了解下通道洗牌。 我个人感觉,通道洗牌这个算法,或者说这个思想,可以称之为小而精,并且是实际解…

rust 创建多线程web server

创建一个 http server,处理 http 请求。 创建一个单线程的 web 服务 web server 中主要的两个协议是 http 和 tcp。tcp 是底层协议,http 是构建在 tcp 之上的。 通过std::net库创建一个 tcp 连接的监听对象,监听地址为127.0.0.1:8080. us…

NEFU数字图像处理(三)图像分割

一、图像分割的基本概念 1.1专有名词 前景和背景 在图像分割中,我们通常需要将图像分为前景和背景两个部分。前景是指图像中我们感兴趣、要分割出来的部分,背景是指和前景不相关的部分。例如,对于一张人物照片,人物就是前景&…

python把ChestX-Det-Dataset的json样本转为COCO数据集的json格式

ChestX-Det-Dataset数据集网址:https://github.com/Deepwise-AILab/ChestX-Det-Dataset/tree/main 数据集JSON内容: [{"file_name": "36199.png","syms": [],"boxes": [],"polygons": []},{"f…

Hadoop学习总结(搭建Hadoop集群(伪分布式模式))

如果前面有搭建过Hadoop集群完全分布式模式,现在搭建Hadoop伪分布式模式可以选择直接克隆完全分布式模式中的主节点(hadoop001)。以下是在搭建过完全分布式模式下的Hadoop集群的情况进行 伪分布式模式下的Hadoop功能与完全分布式模式下的Hadoop功能相同。 一、克隆…

DAY38 动态规划 + 509. 斐波那契数 + 70. 爬楼梯 + 746. 使用最小花费爬楼梯

动态规划理论 动态规划,Dynamic Programming, DP, 如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导…

buuctf_练[GYCTF2020]FlaskApp

[GYCTF2020]FlaskApp 文章目录 [GYCTF2020]FlaskApp常用绕过方法掌握知识解题思路解题一 -- 计算pin码解题二 -- 拼接绕过 执行命令 关键paylaod 常用绕过方法 ssti详解与例题以及绕过payload大全_ssti绕过空格_HoAd’s blog的博客-CSDN博客 CTF 对SSTI的一些总结 - FreeBuf网…

Spark UI中Shuffle dataSize 和shuffle bytes written 指标区别

背景 本文基于Spark 3.1.1 目前在做一些知识回顾的时候,发现了一些很有意思的事情,就是Spark UI中ShuffleExchangeExec 的dataSize和shuffle bytes written指标是不一样的, 那么在AQE阶段的时候,是以哪个指标来作为每个Task分区大…

了解单域名证书和通配符证书的区别,选择合适的SSL证书解决方案

随着互联网的不断发展,网站安全性问题一直备受关注,在保护网站数据安全的过程中,SSL证书一直发挥着至关重要的作用。而在选择SSL证书时,单域名证书和通配符证书是两种常见的选择。本文将详细介绍单域名证书和通配符证书的区别&…

Cocos Creator 中使用装饰器进行自动绑定

推荐一个偷懒的方式,使用装饰器自动绑定节点到脚本的属性 背景 用 Cocos Creator 写脚本组件的时候,有时需要场景中一个节点作为这个脚本的属性值。 按照官方文档推荐的方法,需要以下两步 添加一个 property 属性,在场景中拖入这个…

案例分析大汇总

案例分析心得 2018-2022年的案例分析考试内容汇总(近五年) 架构设计题型 软件系统建模 数据库 Web 系统设计 2018年 胖/瘦客户端 C/S 架构非功能性需求 数据流图DFDE-R图Essential Use Cases(抽象用例),Real Use Cases(基础用例)信息工…

双目视觉计算三维坐标

一、原理 双目视觉的基本原理,以及公式推导,我参考的b站上的视频,链接如下: 2-线性相机模型-Linear Camera Model-Camera Calibration_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Q34y1n7ot/?p2&spm_id_from333.…

Android底层摸索改BUG(二):Android系统移除预置APP

首先我先提供以下博主博文,对相关知识点可以提供理解、解决、思考的 Android 系统如何预装第三方应用以及常见问题汇集android Android.mk属性说明及预置系统app操作说明系Android 中去除系统原生apk的方法 取消预置APK方法一: 其实就是上面的链接3&a…

03、SpringCloud -- 动态倒计时 及 当前用户的获取(用户未登录提示其登录)

目录 动态倒计时需求思路代码效果优化获取当前登录用户思路代码前端后端controllerservice接口impl实现效果问题修改动态倒计时 需求 根据不同时间展示不同状态,动态显示时间,如原型图: 思

Lua脚本语言

1. 概念 Lua(发音为"loo-ah",葡萄牙语中的"lua"意为月亮)是一种轻量级的、高效的、可嵌入的脚本编程语言。官网Lua最初由巴西计算机科学家Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo于1993年开…

【JVM】字节码文件的组成部分

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 JVM 一、字节码文件的组成部分1.1 iconst_0…

idea 提升效率的常用快捷键 汇总

点击File --> Settings --> keymap便可进入看到 IDEA 提供的快捷键。我们也可以搜索和自定义所有快捷键 下面13个事我常用的快捷键,后面还有全部,可以当做字典来查 1.当前文件下查找:CtrlF 当前文件下替换:CtrlR 2.当前…