三国志14信息查询小程序(历史武将信息一览)制作更新过程03-主要页面的设计

1,小程序的默认显示

在这里插入图片描述
分为三部分,头部的标题、中间的内容区和底部的标签栏。点击标签可以切换不同页面,这是在app.json文件中配置的。代码如下:

//所有用到的页面都需要在 pages 数组中列出,否则小程序可能会出现错误或无法正确加载。
//首页的页面路径放在这个数组的第一个位置。例如,将 pages/index/index 设置为首页。
{
  "pages": [
    "pages/index/index",
    "pages/details/details",
    "pages/my/details",
    "pages/about/about"
  ],
  "subpackages": [
  ],
  //标题文本设置
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#461311",
    "navigationBarTitleText": "三国志14",
    "navigationBarTextStyle": "white"
  },
  //标签,表示小程序的主要功能或页面,用户可以点击切换。
  "tabBar": {
    "color": "#bfc1ab",
    "selectedColor": "#13b11c",
    "backgroundColor": "#381B25",
    "list": [
      {
        "pagePath": "pages/index/index",
        "iconPath": "image/icon_component.png",
        "selectedIconPath": "image/icon_component_HL.png",
        "text": "武将数据"
      },
      {
        "pagePath": "pages/my/details",
        "iconPath": "image/icon_map.png",
        "selectedIconPath": "image/icon_map_HL.png",
        "text": "综合信息"
      },
      {
        "pagePath": "pages/about/about",
        "iconPath": "image/icon_about.png",
        "selectedIconPath": "image/icon_about_HL.png",
        "text": "关于"
      }
    ]
  },
  "sitemapLocation": "sitemap.json",
  "permission": {
    "scope.userLocation": {
      "desc": "获取位置,方便按区域分配 "
    }
  }
}

2,武将信息页

在这里插入图片描述
分为三部分,查询工具栏、表头及数据列表
这是数据列表的代码:

 <!-- 数据列表 -->
  <view wx:for="{{goodsList}}" wx:key="index" class="table">
    <view class="tr bg-g" bindtap="onGoodsDetail" data-all="{{item}}" data-name="{{item.name}}">
      <view class="td">{{item.name}}</view>
      <view class="td">{{item.tongshuai}}</view>
      <view class="td">{{item.wuli}}</view>
      <view class="td">{{item.zhili}}</view>
      <view class="td">{{item.zhengzhi}}</view>
      <view class="td">{{item.meili}}</view>
    </view>
  </view>

可以看到,数据goodsList以循环的形式显示,每行数据上加入了点击事件onGoodsDetail,即跳转到人物详情页。
再看一下js里的方法:

(1)在页面加载时获取数据
 onLoad: function (options) {
    // 调用获取列表数据的方法
    this.getGoodsList(true)
  },
(2)获取数据方法:
  //获取列表数据并赋值给goodsList
  getGoodsList(reachBottom) {
      ...
      wx.request({
      url: url_get,//你的后台url地址
      data: {
        order: this.data.order,
        key: this.data.key,
        page: this.data.queryObj.pagenum,
        intPageSize: this.data.queryObj.pagesize,
      },
      header: {
        'content-type': 'application/x-www-form-urlencoded'
      },
      method: "GET",
      success(result) {
        if (reachBottom) {
          that.setData({
            goodsList: [...that.data.goodsList, ...result.data.response.data],
            total: result.data.response.dataCount,
          })
        }
      },
      fail(error) {
        console.log('request fail', error);
      },
      // 无论获取数据是否成功都会执行该方法
      complete: () => {
        wx.hideLoading() // 关闭loading
        this.setData({
          isLoading: false
        })
      }
    })
  }

查询,排序也是在改变条件后执行getGoodsList方法。

(3)稍微需要说明的是页面上拉获取数据的方法:
 /**
  * 页面上拉触底事件的处理函数
  */
  onReachBottom: function () {
    // 判断是否还有下一页数据
    if (this.data.queryObj.pagenum * this.data.queryObj.pagesize >= this.data.total) {
      wx.showLoading({
        title: '数据加载完毕!',
      })
      wx.hideLoading() // 关闭loading
      return
    }
    // 判断是否正在请求其它数据,如果是,则不发起额外的请求
    if (this.data.isLoading) return
    let pagenum = this.data.queryObj.pagenum
    this.setData({
      queryObj: {
        pagenum: pagenum += 1// 让页码值自增 +1
      }
    })
    this.getGoodsList(true)// 重新获取列表数据
  },
(4)及点击跳转到武将武将详情页的方法
 // 点击详情
  onGoodsDetail: function (e) {
    var name = e.currentTarget.dataset.name
    var data = JSON.stringify(e.currentTarget.dataset)
    wx.navigateTo({
      url: '../details/details?name=' + name + '&data=' + data
    })
  },

3,综合信息页

在这里插入图片描述
这个页面没有什么好说的,一个个内容摆下来就是了,很多不知道放在哪里的东西都先放在这里了。
在这里插入图片描述
在这里插入图片描述

4,关于页

与综合信息页结构相同
在这里插入图片描述

5,人物详情页

在这里插入图片描述

(1)基本详情

在这里插入图片描述

(2)更多详情

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

(3)评论评分

在这里插入图片描述
评论评分的页面代码:
wxml文件:

<!-- components/star-rating/star-rating.wxml -->
<view >
<!-- 人物总评分 -->
  <view class="star-rating-center">
  {{initialName}}<block wx:for="{{stars_total}}" wx:key="index">
    <text class="star {{item.selected ? 'selected' : ''}}" data-index="{{index}}">{{item.type}}</text>
  </block>
  [{{goal}}]
</view>
<!-- 评分&评论 -->
  <view class="reviews-container">
  <block wx:for="{{ratingsAndComments}}" wx:key="index" >
    <view class="single-review">
      <!-- 这里添加显示单个评分的代码 -->
      <view class="star-container">
        <block wx:for="{{item.stars}}" wx:key="index">
      <text class="star {{item.selected ? 'selected' : ''}}" data-index="{{index}}">{{item.type}}</text>
    </block>
    <!-- <view style=" justify-content: center;align-items: center;margin-left;20rpx;margin-top:15rpx">{{item.createTime}}</view> -->
      </view>
      <!-- 评论 -->
      <text class="comment">{{item.comment}}</text>
    </view>
  </block>
  </view>
</view>
<!-- 评分提交 -->
<view class="rating-editor">
 <!-- 评分 -->
<view class="flex-container">
  <text class="label">评分:</text>
  <view class="star-container-editor">
    <block wx:for="{{stars}}" wx:key="index">
      <text class="star {{item.selected ? 'selected' : ''}}" bindtap="onStarClick" data-index="{{index}}">{{item.type}}</text>
    </block>
  </view>
</view>

<!-- 评论 -->
<view class="flex-container">
  <text class="label">评论:</text>
  <view class="textarea-container">
    <textarea style="height:100rpx" type="text" name="biography" value="{{biography}}" placeholder="" maxlength="5000" bindinput="onTextareaInput"></textarea>
  </view>
</view>

  <button class="submit-button" bindtap="onSubmitRating">提交评分</button>
</view>

js文件:

// components/star-rating/star-rating.js
import { BASE_URL2 } from '../../component/config.js';
Component({
  properties: {
    // 初始星级
    initialRating: {
      type: Number,
      value: 0
    },
    initialId: {
      type: String,
      value: ''
    },
    lastClickedTime:0,
    initialName: {
      type: String,
      value: ''
    },
  },
  data: {
    stars: [],
    stars_total: [],
    goal: '暂无评',
    name: '',
    ratingsAndComments: [],
    biography: ''
  },
  observers: {
    'initialRating': function (newVal) {
      this.setStars(newVal);
    },
  },
  lifetimes: {
    attached() {
      // 在组件实例进入页面节点树时执行
      console.log('组件实例进入页面节点树');
    },
    ready() {
      var that = this
      let id = this.data.initialId
      // 在组件在视图层布局完成后执行
      wx.request({
        url: BASE_URL2 + 'GetAllGoal',  //你的后台url地址
        data: {
          key: id
        },
        header: {
          'content-type': 'application/x-www-form-urlencoded'
        },
        method: "GET",
        success(result) {
          let dataList = result.data.response;
          let num = 0;
          if (dataList.length > 0) {
            for (let i = 0; i < dataList.length; i++) {
              let stars = [];
              num += dataList[i].goal
              for (let j = 1; j <= 5; j++) {
                stars.push({
                  type: j <= dataList[i].goal ? '★' : '☆',
                  selected: j <= dataList[i].goal
                });
              }
              const currentRatingsAndComments = that.data.ratingsAndComments;
              that.data.ratingsAndComments.push({
                stars: stars,
                createTime: dataList[i].createTime,
                comment: dataList[i].comment
              })
              // 更新数组中特定元素的值
              currentRatingsAndComments[i].stars = stars;
              currentRatingsAndComments[i].comment = dataList[i].comment != null ? dataList[i].comment : ""
              // 使用 setData 更新数据并重新渲染
              that.setData({
                ratingsAndComments: currentRatingsAndComments
              });
            }
            num = num / dataList.length
            //人物评星
            let star = [];
            for (let j = 1; j <= 5; j++) {
              star.push({
                type: j <= num ? '★' : '☆',
                selected: j <= num
              });
            }
            //人物得分
            num = parseFloat(num.toFixed(2));
            console.log(num)
            that.setData({
              stars_total: star,
              goal: num
            })
          }
        },
        fail(error) {
          console.log('request fail', error);
        },
      })
    },
  },
  methods: {
    //评分显示
    setStars(rating) {
      let stars = [];
      for (let i = 1; i <= 5; i++) {
        stars.push({
          type: i <= rating ? '★' : '☆',
          selected: i <= rating
        });
      }
      this.setData({ stars });
    },
    //修改评分
    onStarClick(e) {
      const index = e.currentTarget.dataset.index;
      const rating = index + 1;
      this.setStars(rating);

      this.triggerEvent('ratingChanged', { rating });
    },
    //评论
    onTextareaInput: function (e) {
      this.setData({
        biography: e.detail.value
      });
    },
    //提交评分
    onSubmitRating() {
      var that = this
      let goal = 0;
      for (let i = 0; i < 5; i++) {
        if (this.data.stars[i].selected) {
          goal += 1
        }
      }
      wx.showModal({
        title: '确认提交', // 确认框标题
        content: '您确定要提交吗?', // 确认框内容
        success(res) {
          const now = new Date().getTime();
          if (now - that.data.lastClickedTime < 5000) { // 5秒内不允许重复点击
            wx.showToast({
              title: '操作过于频繁',
              icon: 'none'
            });
            return;
          }
          if (res.confirm) { // 用户点击了确定按钮
            wx.request({
              url: BASE_URL2 + 'PostGoal',//你的后台url地址
              data: {
                Id: that.data.initialId,
                goal: goal,
                comment: that.data.biography,
              },
              header: {
                'content-type': 'application/x-www-form-urlencoded'
              },
              method: "GET",
              success(result) {
                that.setStars(5);
                that.setData({
                  ratingsAndComments: [],
                  biography: "",
                  lastClickedTime:now
                });
                let id = that.data.initialId
                // 在组件在视图层布局完成后执行
                wx.request({
                  url: BASE_URL2 + 'GetAllGoal',//你的后台url地址
                  data: {
                    key: id
                  },
                  header: {
                    'content-type': 'application/x-www-form-urlencoded'
                  },
                  method: "GET",
                  success(result) {
                    let dataList = result.data.response;
                    let num = 0;
                    if (dataList.length > 0) {
                      for (let i = 0; i < dataList.length; i++) {
                        let stars = [];
                        num += dataList[i].goal
                        for (let j = 1; j <= 5; j++) {
                          stars.push({
                            type: j <= dataList[i].goal ? '★' : '☆',
                            selected: j <= dataList[i].goal
                          });
                        }
                        const currentRatingsAndComments = that.data.ratingsAndComments;
                        that.data.ratingsAndComments.push({
                          stars: stars,
                          createTime: dataList[i].createTime,
                          comment: dataList[i].comment
                        })
                        // 更新数组中特定元素的值
                        currentRatingsAndComments[i].stars = stars;
                        currentRatingsAndComments[i].comment = dataList[i].comment != null ? dataList[i].comment : ""
                        // 使用 setData 更新数据并重新渲染
                        that.setData({
                          ratingsAndComments: currentRatingsAndComments
                        });
                      }
                      num = num / dataList.length
                      //人物评星
                      let star = [];
                      for (let j = 1; j <= 5; j++) {
                        star.push({
                          type: j <= num ? '★' : '☆',
                          selected: j <= num
                        });
                      }
                      //人物得分
                      num = parseFloat(num.toFixed(2));
                      that.setData({
                        stars_total: star,
                        goal: num
                      })
                    }
                  },
                  fail(error) {
                    console.log('request fail', error);
                  },
                })
              }
            })
          } else if (res.cancel) {
            console.log('用户点击取消')
          }
        }
      })
    },
  }
})

css文件:

/* components/star-rating/star-rating.wxss */
.star-container {
  display: flex;
}

.star {
  font-size: 32rpx;
  color: #ccc;
  margin-right: 8rpx;
  cursor: pointer;
}

.star.selected {
  color: yellow;
}
/* 容纳所有评论的容器 */
.reviews-container {
  display: flex;
  flex-direction: column;
}

/* 单个评论的容器 */
.single-review {
  display: flex;
  flex-direction: column;
  border-bottom: 1px solid #ccc; /* 添加边界分隔每个评论 */
  margin-bottom: 10rpx;
  padding: 10rpx;
}

/* 星级评分的容器 */
.star-container {
  display: flex;
  margin-bottom: 5rpx;
}

/* 星星的样式 */
.star {
  font-size: 50rpx;
  margin-right: 5rpx;
}

.star.selected {
  color: gold;
}

/* 评论文本的样式 */
.comment {
  font-size: 32rpx;
  color: #333;
}
/* 用于编辑和提交评分的固定容器 */
.rating-editor {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  background-color: #fff;
  padding: 10rpx;
  border-top: 1px solid #ccc;
  z-index: 999;
}

/* 评分编辑器的星级容器 */
.star-container-editor {
  display: flex;
  margin-bottom: 10rpx;
  align-items: center;
  justify-content: center;
}

/* 提交按钮 */
.submit-button {
  padding: 10rpx;
  background-color: #007bff;
  color: white;
  border: none;
  border-radius: 4rpx;
  text-align: center;
}
.reviews-container {
  padding-bottom: 350rpx; /* 根据 .rating-editor 的高度来调整这个值 */
}
.star-rating-center {
  display: flex;
  justify-content: center;
  align-items: center;
}
.textarea-container {
  border: 1px solid #ccc; 
  margin-bottom:15rpx;
  border-radius: 4px;
  padding: 5rpx;
  flex: 1; /* 增加 flex 属性 */
}

/* 定义一个 flex 容器并垂直居中其内容 */
.flex-container {
  display: flex;
  align-items: center; /* 垂直居中 */
}

/* 为“评分:”和“评论:”文本设置样式 */
.label {
  margin-right: 5px; /* 右侧外边距 */
}



6,自定义武将页

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Wnmp服务安装并结合内网穿透实现公网远程访问——“cpolar内网穿透”

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

【神经网络】【GoogleNet】

1、引言 卷积神经网络是当前最热门的技术&#xff0c;我想深入地学习这门技术&#xff0c;从他的发展历史开始&#xff0c;了解神经网络算法的兴衰起伏&#xff1b;同时了解他在发展过程中的**里程碑式算法**&#xff0c;能更好的把握神经网络发展的未来趋势&#xff0c;了解神…

技术分享 | web自动化测试-PageObject 设计模式

为 UI 页面写测试用例时&#xff08;比如 web 页面&#xff0c;移动端页面&#xff09;&#xff0c;测试用例会存在大量元素和操作细节。当 UI 变化时&#xff0c;测试用例也要跟着变化&#xff0c; PageObject 很好的解决了这个问题。 使用 UI 自动化测试工具时&#xff08;包…

Microsoft Edge浏览器不兼容解决办法

找到 Edge 的安装位置&#xff0c;一般在 C:\Program Files (x86)Microsoft Edge\Application\ 这个目录&#xff0c;把 edge.exe 或msedge.exe 修改为 chrome.exe 再重启电脑。

Rust核心功能之一(所有权)

目录 1、什么是所有权&#xff1f; 1.1 所有权规则 1.2 变量作用域 1.3 String 类型 1.4 内存与分配 变量与数据交互的方式&#xff08;一&#xff09;&#xff1a;移动 变量与数据交互的方式&#xff08;二&#xff09;&#xff1a;克隆 只在栈上的数据&#xff1a;拷贝…

Verilog使用vscode

使用vscode打开.v文件 Tools setting texteditor vscode文件路径 [line number]:[file name] &#xff08;可能会出错&#xff0c;可以去vscode确认打开的文件路径&#xff0c;后经调整后改为 vscode文件路径 [file name]&#xff09; 安装插件 搜索Verilog 添加使用最多的 …

3D视觉引导纸箱拆码垛,助力物流行业转型升级

近年来&#xff0c;自动化和智能化技术在各行业的应用越来越广泛&#xff0c;特别是在物流和仓储领域。纸箱拆码垛是物流仓储中的一个重要环节。 人工分拣效率低、错误率高、成本高&#xff0c;传统的拆码垛设备存在兼容性差&#xff0c;对纸箱的识别率不高、操作不灵活等问题…

Centos7下搭建H3C log服务器

一、rsyslogH3C 安装rsyslog服务器 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld关闭selinux sed -i s/enforcing/disabled/ /etc/selinux/config && setenforce 0centos7服务器&#xff0c;通过yum安装rsyslog yum -y install r…

vr地铁消防虚拟逃生自救系统降低财产及人员伤害

无论是在公共场所还是在家中&#xff0c;火灾都是一种常见的突发事件。这往往会严重影响到人们的财产和生命安全。因此&#xff0c;如何预防火灾和安全逃生就成为了非常重要的话题。这款VR模拟火灾疏散逃生系统&#xff0c;帮助人们了解火灾逃生的技巧以及正确的应对方法。 以传…

Leetcode刷题详解——子集

1. 题目链接&#xff1a;78. 子集 2. 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xf…

day05_Java中的运算符

在Java中提供了丰富的运算符 其按照功能分&#xff1a;算术运算符、赋值运算符、比较运算符、逻辑运算、条件运算符按照操作数个数分&#xff1a;一元运算符&#xff08;单目运算符&#xff09;、二元运算符&#xff08;双目运算符&#xff09;、三元运算符 &#xff08;三目…

zabbix监控安装-linux

zabbix6.4中文文档1. 简介 (zabbix.com) Zabbix 是一个企业级的开源分布式监控解决方案。 1.zabbix结构体系 Server&#xff1a; server 是存储所有配置、统计和操作数据的中央存储库。 Proxy&#xff1a; zabbix proxy可以代替 Zabbix server 收集性能和可用性数据。p…

AI芯片架构体系综述:芯片类型CPU\GPU\FPGA\ASIC以及指令集CSIS\RISC介绍

大模型的发展意味着算力变的越发重要&#xff0c;因为大国间科技竞争的关系&#xff0c;国内AI从业方在未来的一段时间存在着算力不确定性的问题&#xff0c;与之而来的是许多新型算力替代方案的产生。如何从架构关系上很好的理解计算芯片的种类&#xff0c;并且从计算类型、生…

Java附件和base64相互转换

1 文件转base64 声明&#xff1a;我用的是Hutool的Base64下的api package cn.hutool.core.codec; 首先找一张图片 很简单&#xff0c;直接使用Base64的encode方法就可以拿到文件的base64码&#xff1a; File file new File("D:\\Tools\\Images\\北极熊.jpg");String…

Feign服务调用

Feign服务调用 使用Feign&#xff0c;在服务消费者中&#xff0c;调用服务提供者的接口。 注册中心 此处使用 Nacos&#xff0c;详情见&#xff1a; https://www.cnblogs.com/expiator/p/17392549.html Feign依赖 <properties><java.version>1.8</java.vers…

OJ中常用平衡树,Treap树堆详解

文章目录 Treap定义Treap的可行性Treap的构建节点定义旋转左单旋右单旋旋转的代码实现 插入插入的代码实现 删除遍历查找Treap对权值的扩展Treap对size的扩展扩展size域后的节点定义和旋转&#xff0c;插入&#xff0c;删除操作查询第k小的元素求元素的排名 查询后继、前驱Trea…

虚幻引擎:RPC:远端调用

1.如何区当前是服务器还是在客服端 2.如何修改一个actor的所有权 修改所有权必须 在服务器上进行修改,不允许在客户端进行修改

大数据商城人流数据分析与可视化 - python 大数据分析 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的基站数据分析与可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度…

220v插座led指示灯维修

由于220v是交流电&#xff0c;有反向电压的情况&#xff0c;而led反向通电的时候电阻无穷大&#xff0c;所以分压也无穷大&#xff0c;220v一导通就击穿&#xff0c;即使加了很大的电阻也没用&#xff0c;串联电阻只能作用于二极管正向的时候。 目前有两种方案&#xff1a; 方…

远程运维用什么软件?可以保障更安全?

远程运维顾名思义就是通过远程的方式IT设备等运行、维护。远程运维适用场景包含因疫情居家办公&#xff0c;包含放假期间出现运维故障远程解决&#xff0c;包含项目太远需要远程操作等等。但远程运维过程存在一定风险&#xff0c;安全性无法保障&#xff0c;所以一定要选择靠谱…