uniapp+node.js前后端获取小区的活动列表、活动详情以及报名活动(社区管理平台的小程序)

@TOC


👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!


0前提

温馨提示:我做的思路可能是复杂化了或者说代码写的不规范,如果你觉得可以更加简便的话欢迎分享到评论区或者自己改写一下我的代码,我的后端是写的很简单的没有什么路由分发是直接写的,你可以自由优化,以及在需要验证用户是否登录和验证用户token是否正确的我没有进行验证,你们可以自行添加 小程序的其他部分你可以看看我往期的文章

1.一些准备

1.1表

活动表activty

字段名称 类型(长度) 允许空 主键 外键 自增 唯一 说明
id int 活动id
title varchar(20) 标题
content varchar(20) 内容
coverImage varchar(50) 封面表
images varchar(200) 详情表
starTime datetime 活动开始时间
endTime datetime 活动结束时间
maxPeople int 活动最大人数
address varchar(20) 活动地址
classification varchar(20) 活动分类
adminId int 管理员id
communityId int 小区id
creatTime timestamp 创建时间
updateTime timestamp 更新时间

活动报名表activtyRegistration

字段名称 类型(长度) 允许空 主键 外键 自增 唯一 说明
id int 活动报名id
name varchar(20) 姓名
gender int 性别
phone varchar(20) 手机号
state int 审核状态
userId int 用户id
activtyId int 活动 id
creatTime timestamp 创建时间
updateTime timestamp 更新时间

1.2总体思路

描述:在平台上有多个小区,每个小区都有自己的小区活动,小区管理可以在管理端进行发布小区活动,用户可以在平台上的小区的活动列表页上看到发布出来的小区活动,并且针对于这个小区活动用户可以进行一个报名。所以这里的小区活动模块存在着三个页面,一个是小区活动列表页,一个是小区活动详情页,一个是小区活动报名页。

实现:当用户进入小区活动列表页时,自动获取这个小区的活动列表,当用户点击活动卡片时会跳转到小区活动详情页,如果这个活动的报名截止时间与现在的时间对比,没有过期那就显示报名按钮,还有进入页面时判断一下当前用户是否报名参与了这个活动,还有活动人数,如果活动报名人数超过了活动上限也是不能给用户进行报名的,还有小区活动应该具有活动分类,用户可以选择活动分类查看自己想看的活动,以及活动列表页可以加一个筛选搜索

2.前端

前端:获取活动列表在页面加载时获取(是获取当前小区id对应的小区活动列表,小区id去vuex里面拿),获取活动详情先去接受上一个页面传入的活动id去获取活动详情,报名活动的时候让用户填写对应信息之后传入后端用户id好活动id进行报名

代码实现:

cpp 复制代码
      // 获取活动列表
    async activityList() {
      try {
        const res = await this.$myRequest({
          method: 'get',
          url: '/activityList?communityId=' + this.$store.state.communityId
        });
        console.log(res.data.data);
        // 假设后端返回错误时包含一个名为 'error' 的字段
        if (res.error) {
          this.$message.error(res.error);
        } else {
          //提取属性
          this.huodonList = res.data.data;
        }
      } catch (error) {
        // 捕获异常,显示通用错误消息或者其他处理
        console.error('请求发生错误:', error);
      }
    }
cpp 复制代码
 // 获取小区活动详情
   async activityDetails(activityId) {
      try {
        const res = await this.$myRequest({
          method: 'get',
          url: `/activityDetails?activityId=${activityId}`
        });
        console.log(res.data.data);
        if (res.error) {
          this.$message.error(res.error);
        } else {
          this.activity = res.data.data;
        }
      } catch (error) {
        console.error('请求发生错误:', error);
      }
    },
cpp 复制代码
 // 报名活动
    async applyActivity() {
      console.log(this.gender);
      if (!this.name || !this.phone || !this.idCard || !this.gender) {
        uni.showToast({
          title: '请填写完整信息',
          icon: 'none'
        });
        return;
      }
      try {
        const res = await this.$myRequest({
          method: 'post',
          url: '/applyActivity',
          data: {
            name: this.name,
            phone: this.phone,
            idCard: this.idCard,
            gender: this.gender,
            activityId: this.activityId,
            userId: this.$store.state.user.id
          }
        });
        uni.showToast({
          title: '报名成功',
          icon: 'success'
        });
        setTimeout(() => {
          uni.navigateBack();
        }, 1000); // 延迟1秒(1000毫秒)后执行navigateBack
      } catch (error) {
        console.error('报名失败:', error);
        uni.showToast({
          title: '报名失败,请稍后再试',
          icon: 'none'
        });
      }
    },

3.后端

后端:报名活动,获取小区活动列表,获取小区活动详情(接口编写逻辑:接口名字-接收前端传值-sql语句-sql操作-返回信息) 代码实现:

cpp 复制代码
// 报名活动接口
app.post('/applyActivity', (req, res) => {
  const {
    name,
    phone,
    idCard,
    gender,
    userId,
    activityId
  } = req.body;

  // 在这里编写将报名信息保存到数据库的逻辑,以下是一个示例
  const query =
    'INSERT INTO activityregistration (name, phone, idCard,gender, userId,activityId)  VALUES (?, ?, ?, ?, ?, ?)';
  connection.query(query, [name, phone, idCard, gender, userId, activityId], (err, results) => {
    if (err) {
      console.error('报名活动失败:', err);
      return res.json({
        error: '报名活动失败,请稍后再试'
      });
    }

    res.json({
      message: '报名活动成功'
    });
  });
});
// 获取活动信息列表  
app.get('/activityList', (req, res) => {
  const communityId = req.query.communityId
  console.log(communityId);
  const query = `SELECT * from activity where communityId=? ORDER BY createTime DESC`; // 根据创建时间降序排序  
  connection.query(query, [communityId], (err, results) => {
    if (err) {
      console.log(err);
      return res.json({
        error: '获取热点列表失败请稍后重试',
      });
    }

    // 遍历结果集,仅修改创建时间字段  
    results.forEach(activity => {
      activity.createTime = formatTime(activity.createTime);
    });

    // 返回处理后的结果集  
    res.json({
      data: results,
    });
  });
});
// 获取活动详情
app.get('/activityDetails', (req, res) => {
  console.log(req.query);
  const activityId = req.query.activityId
  const query = `SELECT * from  activity where id=? ORDER BY createTime DESC`; // 根据创建时间降序排序  
  connection.query(query, [activityId], (err, results) => {
    if (err) {
      console.log(err);
      return res.json({
        error: '获取热点信息失败请稍后重试',
      });
    }
    results[0].createTime = formatTime(results[0].createTime);
    results[0].starTime = formatTime(results[0].starTime);
    results[0].endTime = formatTime(results[0].endTime);
    results[0].images = convertImagesToArray(results[0].images);
    // 返回处理后的结果集  
    res.json({
      data: results[0],
    });
  });
});

4.验证结果

相关推荐
XDU小迷弟3 分钟前
第2天:Web应用&架构类别&源码类别&镜像容器&建站模版&编译封装&前后端分离
服务器·前端·安全·web安全·架构·安全架构
pchmi9 分钟前
C# OpenCV机器视觉:背景减除与前景分离
javascript·opencv·c#
热情仔30 分钟前
win10 npm login 登陆失败
前端·npm·node.js
_.Switch35 分钟前
FastAPI 响应模型与自定义响应
开发语言·前端·数据库·python·fastapi·命令模式
三天不学习36 分钟前
Vue Router v3.x 路由进阶【路由篇】
前端·vue.js·路由·router·vue router
dowhileprogramming41 分钟前
Python 中常见的数据结构之一嵌套字典
前端·数据结构·python
ryipei1 小时前
把vue项目或者vue组件发布成npm包或者打包成lib库文件本地使用
前端·vue.js·npm
鹿屿二向箔1 小时前
【论文+源码】创建一个基于Spring Boot的体育场管理系统
java·spring boot·后端
幸运小圣1 小时前
LeetCode热题100-相交链表【JavaScript讲解】
javascript·leetcode·链表
赵大仁1 小时前
Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能
前端·javascript·微信小程序·uni-app