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

相关推荐
萌萌哒草头将军4 小时前
⚡⚡⚡尤雨溪宣布开发 Vite Devtools,这两个很哇塞 🚀 Vite 的插件,你一定要知道!
前端·vue.js·vite
游离状态的猫14 小时前
JavaScript性能优化实战:从瓶颈定位到极致提速
开发语言·javascript·性能优化
小彭努力中4 小时前
7.Three.js 中 CubeCamera详解与实战示例
开发语言·前端·javascript·vue.js·ecmascript
why1515 小时前
腾讯(QQ浏览器)后端开发
开发语言·后端·golang
浪裡遊5 小时前
跨域问题(Cross-Origin Problem)
linux·前端·vue.js·后端·https·sprint
滿5 小时前
Vue3 Element Plus el-tabs数据刷新方法
javascript·vue.js·elementui
LinDaiuuj5 小时前
判断符号??,?. ,! ,!! ,|| ,&&,?: 意思以及举例
开发语言·前端·javascript
声声codeGrandMaster5 小时前
django之优化分页功能(利用参数共存及封装来实现)
数据库·后端·python·django
敲厉害的燕宝5 小时前
Pinia——Vue的Store状态管理库
前端·javascript·vue.js
Aphasia3116 小时前
react必备JavaScript知识点(二)——类
前端·javascript