从0到1:商场导览小程序开发笔记一

背景

购物中心与商场小程序:旨在提供便捷的购物、导航、活动报名、服务查询等功能,让用户更好地体验购物和享受服务。通过提供便捷的购物、信息查询和互动预约等功能,提升了商场的服务水平和用户体验,帮助商场与消费者建立更紧密的联系,促进消费和提升品牌形象。

功能规划

其主要功能如下: 提供商场的基本信息,包括位置、营业时间、商户组成等,让用户了解商场的概况和特色

  • 品牌模块:按业态,楼层或者首字母提供商户列表指引,帮助用户快速找到目标店铺
  • 排行榜:品牌商铺可按评论,浏览数,点赞数,收藏数进行排行
  • 资讯模块:展示商户的优惠活动、打折信息等,让用户了解最新的优惠信息,促进消费
  • 活动模块:展示商场内举办的活动、展览、讲座等信息,吸引用户参与和了解商场文化。
  • 投诉建议:提供用户反馈通道,收集用户对商场服务和体验的意见建议,帮助商场改进服务质量
  • 会员系统:可修改个人资料,查看自己的活动报名,点赞,浏览,收藏,评论,投诉建议记录等。

概要设计

在这里插入图片描述

数据设计

ProductModel.DB_STRUCTURE = {_pid: 'string|true',PRODUCT_ID: 'string|true',PRODUCT_TITLE: 'string|false|comment=标题',PRODUCT_STATUS: 'int|true|default=1|comment=状态 0/1',PRODUCT_CATE_ID: 'array|true|comment=分类编号',PRODUCT_CATE_NAME: 'array|true|comment=分类冗余',PRODUCT_FIRST: 'string|false',PRODUCT_ORDER: 'int|true|default=9999',PRODUCT_VOUCH: 'int|true|default=0',PRODUCT_COMMENT_CNT: 'int|true|default=0',PRODUCT_QR: 'string|false',PRODUCT_VIEW_CNT: 'int|true|default=0|comment=访问次数',PRODUCT_COMMENT_CNT: 'int|true|default=0|comment=评价数',PRODUCT_FAV_CNT: 'int|true|default=0|comment=收藏数',PRODUCT_LIKE_CNT: 'int|true|default=0|comment=点赞数',PRODUCT_LIKE_LIST: 'array|true|default=[]|comment=点赞记录',PRODUCT_FORMS: 'array|true|default=[]',PRODUCT_OBJ: 'object|true|default={}',PRODUCT_ADD_TIME: 'int|true',PRODUCT_EDIT_TIME: 'int|true',PRODUCT_ADD_IP: 'string|false',PRODUCT_EDIT_IP: 'string|false',
};ActivityModel.DB_STRUCTURE = {_pid: 'string|true',ACTIVITY_ID: 'string|true',ACTIVITY_TITLE: 'string|true|comment=标题',ACTIVITY_STATUS: 'int|true|default=1|comment=状态 0=未启用,1=使用中',ACTIVITY_CATE_ID: 'string|true|default=0|comment=分类',ACTIVITY_CATE_NAME: 'string|false|comment=分类冗余',ACTIVITY_CANCEL_SET: 'int|true|default=1|comment=取消设置 0=不允,1=允许,2=仅截止前可取消',ACTIVITY_CHECK_SET: 'int|true|default=0|comment=审核 0=不需要审核,1=需要审核', ACTIVITY_IS_MENU: 'int|true|default=1|comment=是否公开展示名单',ACTIVITY_MAX_CNT: 'int|true|default=20|comment=人数上限 0=不限',ACTIVITY_START: 'int|false|comment=活动开始时间',ACTIVITY_END: 'int|false|comment=活动截止时间',ACTIVITY_STOP: 'int|true|default=0|comment=报名截止时间 0=永不过期',ACTIVITY_ORDER: 'int|true|default=9999',ACTIVITY_VOUCH: 'int|true|default=0',ACTIVITY_FORMS: 'array|true|default=[]',ACTIVITY_OBJ: 'object|true|default={}',ACTIVITY_JOIN_FORMS: 'array|true|default=[]',ACTIVITY_ADDRESS: 'string|false|comment=详细地址',ACTIVITY_ADDRESS_GEO: 'object|false|comment=详细地址坐标参数',ACTIVITY_QR: 'string|false',ACTIVITY_VIEW_CNT: 'int|true|default=0',ACTIVITY_JOIN_CNT: 'int|true|default=0',ACTIVITY_COMMENT_CNT: 'int|true|default=0',ACTIVITY_ADD_TIME: 'int|true',ACTIVITY_EDIT_TIME: 'int|true',ACTIVITY_ADD_IP: 'string|false',ACTIVITY_EDIT_IP: 'string|false',
};

关键实现

async getAllProduct(floorOptions) {// 所有记录let orderBy = {PRODUCT_ORDER: 'asc',PRODUCT_ADD_TIME: 'desc'}let fields = 'PRODUCT_TITLE,PRODUCT_CATE_NAME,PRODUCT_CATE_ID,PRODUCT_FIRST,PRODUCT_CATE_ID,PRODUCT_CATE_NAME,PRODUCT_OBJ.floor,PRODUCT_OBJ.logo,PRODUCT_OBJ.address';let where = { PRODUCT_STATUS: 1 };let productList = await ProductModel.getAll(where, fields, orderBy, 1000);for (let k = 0; k < productList.length; k++) {productList[k].PRODUCT_CATE_NAME = productList[k].PRODUCT_CATE_NAME.join(' - ');}//### 按楼层 let floorList = [];for (let k = 0; k < floorOptions.length; k++) {let name = floorOptions[k];let list = [];for (let j = 0; j < productList.length; j++) {if (productList[j].PRODUCT_OBJ.floor == name) {list.push({id: productList[j]._id,img: productList[j].PRODUCT_OBJ.logo[0],name: productList[j].PRODUCT_TITLE,cate: productList[j].PRODUCT_CATE_NAME ,detail: productList[j].PRODUCT_OBJ.address,floor: productList[j].PRODUCT_OBJ.floor,});}}let node = {name,list}floorList.push(node);}//### 按字母let charList = [];for (let k = 65; k <= 90; k++) {let name = String.fromCharCode(k);let list = [];for (let j = 0; j < productList.length; j++) {if (productList[j].PRODUCT_FIRST == name) {list.push({id: productList[j]._id,img: productList[j].PRODUCT_OBJ.logo[0],name: productList[j].PRODUCT_TITLE,cate: productList[j].PRODUCT_CATE_NAME ,detail: productList[j].PRODUCT_OBJ.address,floor: productList[j].PRODUCT_OBJ.floor,});}}let node = {name,list}charList.push(node);}// 其他字符let otherList = [];for (let j = 0; j < productList.length; j++) {let first = productList[j].PRODUCT_FIRST;first = first.charCodeAt(0);if (first < 65 || first > 90) {otherList.push({id: productList[j]._id,img: productList[j].PRODUCT_OBJ.logo[0],name: productList[j].PRODUCT_TITLE,cate: productList[j].PRODUCT_CATE_NAME ,detail: productList[j].PRODUCT_OBJ.address,floor: productList[j].PRODUCT_OBJ.floor,});}}charList.push({ name: '其他', list: otherList });//### 按分类let cateList = [];let cate1Options = await Cate1Model.getAll({ CATE1_STATUS: 1 }, 'CATE1_TITLE', { 'CATE1_ORDER': 'asc', 'CATE1_ADD_TIME': 'desc' });for (let k = 0; k < cate1Options.length; k++) {let name = cate1Options[k].CATE1_TITLE;let list = [];for (let j = 0; j < productList.length; j++) {if (productList[j].PRODUCT_CATE_ID.includes(cate1Options[k]._id)) {list.push({id: productList[j]._id,img: productList[j].PRODUCT_OBJ.logo[0],name: productList[j].PRODUCT_TITLE,cate: productList[j].PRODUCT_CATE_NAME ,detail: productList[j].PRODUCT_OBJ.address,floor: productList[j].PRODUCT_OBJ.floor,});}}let node = {name,list}cateList.push(node);}return { productList, floorList, charList, cateList }}async likeProduct(userId, id) {// 是否点赞let product = await ProductModel.getOne(id, 'PRODUCT_LIKE_LIST');if (!product) this.AppError('记录不存在');let arr = product.PRODUCT_LIKE_LIST;let flag = false;if (arr.includes(userId)) {arr = arr.filter(item => item != userId);flag = false;}else {arr.push(userId);flag = true;}await ProductModel.edit(id, {PRODUCT_LIKE_LIST: arr,PRODUCT_LIKE_CNT: arr.length});return flag;}/** 浏览资讯信息 */async viewProduct(userId, id) {let fields = '*';let where = {_id: id,PRODUCT_STATUS: 1}let product = await ProductModel.getOne(where, fields);if (!product) return null;product.like = product.PRODUCT_LIKE_LIST.includes(userId) ? true : false;delete product.PRODUCT_LIKE_LIST;ProductModel.inc(id, 'PRODUCT_VIEW_CNT', 1);return product;}/** 取得分页列表 */async getProductList({cateId,search, // 搜索条件sortType, // 搜索菜单sortVal, // 搜索菜单orderBy, // 排序 page,size,isTotal = true,oldTotal}) {orderBy = orderBy || {'PRODUCT_ORDER': 'asc','PRODUCT_ADD_TIME': 'desc'};let fields = 'PRODUCT_LIKE_CNT,PRODUCT_FAV_CNT,PRODUCT_COMMENT_CNT,PRODUCT_VIEW_CNT,PRODUCT_TITLE,PRODUCT_CATE_ID,PRODUCT_ADD_TIME,PRODUCT_ORDER,PRODUCT_STATUS,PRODUCT_CATE_NAME,PRODUCT_OBJ';let where = {};where.and = {_pid: this.getProjectId() //复杂的查询在此处标注PID};where.and.PRODUCT_STATUS = 1; // 状态 if (cateId && cateId !== '0') where.and.PRODUCT_CATE_ID = cateId;if (util.isDefined(search) && search) {where.or = [{ PRODUCT_TITLE: ['like', search] },];} else if (sortType && util.isDefined(sortVal)) {// 搜索菜单switch (sortType) {case 'sort': {orderBy = this.fmtOrderBySort(sortVal, 'PRODUCT_ADD_TIME');break;}case 'cateId': {if (sortVal) where.and.PRODUCT_CATE_ID = String(sortVal);break;}}}return await ProductModel.getList(where, fields, orderBy, page, size, isTotal, oldTotal);}async getMyLikeProductList(userId, {search, // 搜索条件sortType, // 搜索菜单sortVal, // 搜索菜单orderBy, // 排序 page,size,isTotal = true,oldTotal}) {orderBy = orderBy || {'PRODUCT_ORDER': 'asc','PRODUCT_ADD_TIME': 'desc'};let fields = 'PRODUCT_LIKE_CNT,PRODUCT_FAV_CNT,PRODUCT_COMMENT_CNT,PRODUCT_VIEW_CNT,PRODUCT_TITLE,PRODUCT_CATE_ID,PRODUCT_ADD_TIME,PRODUCT_ORDER,PRODUCT_STATUS,PRODUCT_CATE_NAME,PRODUCT_OBJ';let where = {};where.and = {_pid: this.getProjectId() //复杂的查询在此处标注PID};where.and.PRODUCT_LIKE_LIST = userId;if (util.isDefined(search) && search) {where.or = [{ PRODUCT_TITLE: ['like', search] },];} else if (sortType && util.isDefined(sortVal)) {// 搜索菜单switch (sortType) {case 'sort': {orderBy = this.fmtOrderBySort(sortVal, 'PRODUCT_ADD_TIME');break;}}}return await ProductModel.getList(where, fields, orderBy, page, size, isTotal, oldTotal);}

UI设计

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

后台管理系统

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

代码分享

git下载

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

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

相关文章

YOLOv5入门(四)训练自己的目标检测模型

前言 通过前面几篇文章&#xff0c;已经完成数据集制作和环境配置&#xff08;服务器&#xff09;&#xff0c;接下来将继续实践如何开始训练自己数据集~ 往期回顾 YOLOv5入门&#xff08;一&#xff09;利用Labelimg标注自己数据集 YOLOv5入门&#xff08;二&#xff09;处…

Android 14 init进程解析

前言 当bootloader启动后&#xff0c;启动kernel&#xff0c;kernel启动完后&#xff0c;在用户空间启动init进程&#xff0c;再通过init进程&#xff0c;来读取init.rc中的相关配置&#xff0c;从而来启动其他相关进程以及其他操作。 init进程启动主要分为两个阶段&#xff1…

jsPDF + html2canvas + Vue3 + ts项目内,分页导出当前页面为PDF、A 页面内导出 B 页面的内容为PDF,隐藏导出按钮等多余元素

jsPDF html2canvas Vue3 ts Arco Design项目&#xff0c;分页导出当前页面为PDF、A 页面内导出 B 页面的内容为PDF&#xff0c;隐藏导出按钮等多余元素… 1.下载所需依赖 pnpm install --save html2canvaspnpm install --save jspdf引入依赖 <script setup lang"…

OpenCV 库来捕获和处理视频输入和相似度测量(73)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV的周期性噪声去除滤波器(70) 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; ​ 目标 如今&#xff0c;拥有数字视频录制系统供您使用是很常见的。因此&#xff0c;您…

FreeBSD RISCV 在QEME中实践-网络配置

在前一篇文章中&#xff0c;我们一起进行了FreeBSD RISCV 在QEME中实践 现在&#xff0c;让我们配置好网络吧&#xff01; 先上结论&#xff1a;用默认配置启动即可&#xff0c;网络就加载好了&#xff0c;只是不能ping罢了。因为不能ping&#xff0c;以为网络没通&#xff0…

opencv图片的平移-------c++

图片平移 cv::Mat opencvTool::translateImage(const cv::Mat& img, int dx, int dy) {// 获取图像尺寸int rows img.rows;int cols img.cols;// 定义仿射变换矩阵cv::Mat M (cv::Mat_<float>(2, 3) << 1, 0, dx, 0, 1, dy);// 进行仿射变换cv::Mat dst;cv…

[附源码+视频教程]暗黑纪元H5手游_架设搭建_畅玩三网全通西方3D世界_带GM

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 一. 演示视频 暗黑纪…

目标检测——水下垃圾数据集DeepTrash

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

[图解]不变式的构造和化简

1 00:00:02,420 --> 00:00:03,380 下面这个&#xff0c;我们来看 2 00:00:03,390 --> 00:00:09,940 X→select&#xff08;Y&#xff09;&#xff0c;用Y这个条件来筛选 3 00:00:09,950 --> 00:00:11,340 之后得到的集合 4 00:00:12,400 --> 00:00:14,390 forAl…

SD-WAN介绍,为何成为主推。

1、SD-WAN&#xff08;Software Defined Wide Area Network&#xff0c; 软件定义的广域网&#xff09; 将企业的分支、总部和多云之间互联起来&#xff0c;应用在不同混合链路&#xff08;MPLS&#xff0c;Internet&#xff0c;5G&#xff0c;LTE等&#xff09;之间选择最优的…

EmotionBench—— 基于 LLM 情绪的量化框架

介绍 大型语言模型&#xff08;LLM&#xff09;在近年来取得了显著的进展&#xff0c;这在计算机科学领域被视为一个重要的里程碑。像ChatGPT和Claude这样的综合性软件已经不再仅仅是用于句子校正、文本翻译和编程的工具&#xff0c;它们已经演进成为类似于人类的助手。因此&a…

Linux 操作系统IPC

目录 1、IPC简介 1.1、共享内存 1.1.1 创建/访问共享内存 1.1.2 映射 1.1.3 解除映射 1.1.4 删除/修改共享内存 1.2 信号量集 1.2.1 创建信号量集合 1.2.2 信号量的初始化 1.2.3 信号量的还原和消耗 1.3 消息队列 1.3.1 概念 1.3.3 添加消息队列 1.3.4 读取消息…

社区养老服务|基于Springboot+vue的社区养老服务平台设计与实现(源码+数据库+文档)

社区养老服务平台 目录 基于Java的社区养老服务平台设计与实现 一、前言 二、系统设计 三、系统功能设计 1用户信息管理 2 服务信息管理 3服务申请管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#…

【Linux系统化学习】网络套接字(编写简单的UDP服务端和客户端)

目录 理解源IP地址和目的IP地址 认识端口号 端口号和进程ID的区别 源端口号和目的端口号 认识TCP和UDP协议 TCP协议 UDP协议 网络字节序 socket编程接口 socket常见API sockaddr结构 简单的UDP网络程序 UDP服务端 创建套接字 填充本地网络信息 绑定 收取消息 …

Amine-PEG-Amine,956496-54-1在生物成像、生物传感器等领域具有广泛的应用

【试剂详情】 英文名称 Amine-PEG-Amine&#xff0c;NH2-PEG-NH2 中文名称 氨基-聚乙二醇-氨基&#xff0c;氨基PEG氨基&#xff0c; 双端氨基聚乙二醇 CAS号 956496-54-1 外观性状 由分子量决定&#xff0c;液体或者固体 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&…

千古一帝秦始皇的一生

在中国历史上&#xff0c;秦始皇绝对是最有资格被称之为‘千古一帝’的皇帝。 这不光是因为&#xff0c;他是中国的第一个皇帝&#xff0c;更是因为他奠定了中国两千多年的政治格局&#xff0c;让中国从此有了大一统的意识。 1、赵国生涯 公元前259年&#xff0c;秦始皇嬴政…

利用PS中Lab颜色模式进行简单调色?

【原图】 详细步骤如下&#xff1a; Step 1 : 打开PS&#xff0c;打开素材&#xff0c;点菜单栏&#xff0c;【图像】-【模式】-【Lab颜色】&#xff0c;效果如下图 Step2&#xff1a;ctrl(或command)m打开曲线工具&#xff0c;选择a通道&#xff0c;效果如下图。 Step3: 把标…

SpringBoot---------Swagger

第一步&#xff1a;引入依赖 <!-- swagger--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId></dependency> 第二步&#xff1a;配置文件 import com.sky.intercept…

【刷题】代码随想录算法训练营第二十九天|491、递增子序列,46、全排列,47、全排列II

目录 491、递增子序列46、全排列47、全排列II 491、递增子序列 讲解&#xff1a;https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html class Solution { private:vector<vector<int>> result;vector<int> path;void backt…