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.验证结果

相关推荐
NiNg_1_23415 分钟前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
王哈哈^_^1 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
Chrikk2 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*2 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue2 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man2 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
cs_dn_Jie2 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic2 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js
有梦想的刺儿3 小时前
webWorker基本用法
前端·javascript·vue.js
cy玩具3 小时前
点击评论详情,跳到评论页面,携带对象参数写法:
前端