微信小程序使用echarts

在这里插入图片描述

思路

  • 五个tab公用一个柱状图组件
  • 切换tab以及切换时间改变数据,传入子组件,子组件监听数据重新更新
  • 点击柱状图显示具体数值
  • 每个时间点有两个柱子(高压和低压),柱状图显示高压的最大值到最小值的范围
  • 除了血压其余只有一条柱子
  • 步数比较特殊,不是范围,而是一个具体的步数数值
  • 根据tab设置不同的最小值
  • 假如最大值==最小值,显示一个点
  • 所有横坐标全部显示,不滚动

下载wx-echarts

image.png

堆叠柱状图子组件

image.png

  • bar.json
{
  "component": true,
  "usingComponents": {
    "ec-canvas": "../../../ec-canvas/ec-canvas"
  }
}
  • bar.wxml
<view class="w100 h100">
  <ec-canvas id="mychart-bar" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>
</view>
  • bar.js
import * as echarts from '../../../ec-canvas/echarts';
Component({
  options: {
    addGlobalClass: true,
  },
  data: {
    ec: {
      lazyLoad: true // 懒加载
    },
    time: [],
    low1: [],
    high1: [],
    low2: [],
    high2: [],
    step: []
  },
  properties: {
    list: {
      type: Array,
      observer: function (newVal, oldVal) {
        if (newVal.length || oldVal.length) {
          console.log(newVal, oldVal, 88)
          let time = newVal.map(item => item.date)
          let low1 = newVal.map(item => item.firstLowIndicators * 1)
          let high1 = newVal.map(item => item.firstHighIndicators && item.firstHighIndicators == item.firstLowIndicators ? 'solo' : item.firstHighIndicators * 1 - item.firstLowIndicators * 1)
          // let high1 = newVal.map(item => (item.firstHighIndicators * 1 - item.firstLowIndicators * 1 == 0) ? 1 : item.firstHighIndicators * 1 - item.firstLowIndicators * 1)
          let low2 = newVal.map(item => item.secondLowIndicators * 1)
          let high2 = newVal.map(item => item.secondHighIndicators && item.secondHighIndicators == item.secondLowIndicators ? 'solo' : item.secondHighIndicators * 1 - item.secondLowIndicators * 1)
          // let high2 = newVal.map(item => (item.secondHighIndicators * 1 - item.secondLowIndicators * 1 == 0) ? 1 : item.secondHighIndicators * 1 - item.secondLowIndicators * 1)
          let step = newVal.map(item => item.firstHighIndicators)
          this.setData({
            time,
            low1,
            high1,
            low2,
            high2,
            step
          })
          this.initChart(); // 数据变化时重新初始化图表
        }
      }
    },
    tab: {
      type: Number,
      value: 1
    }
  },
  methods: {
    initChart() {
      // 绑定组件
      this.barComponent = this.selectComponent("#mychart-bar");
      // 初始化柱状图
      this.barComponent.init((canvas, width, height, dpr) => {
        // 初始化图表
        const chart = echarts.init(canvas, null, {
          width: width,
          height: height,
          devicePixelRatio: dpr // 解决模糊显示问题
        })
        // 开发中根据从后端获取barData数据,动态更新图表
        chart.setOption(this.getOption())
        return chart
      })
    },
    getOption() {
      var option = {
        tooltip: {
          trigger: "axis",
          axisPointer: {
            type: "shadow",
          },
          formatter: (params) => {
            // console.log(params)
            if (this.data.tab == 5) {
              return (
                params[0].axisValue +
                "\n" +
                params[0].marker +
                params[1].seriesName +
                ":" +
                (params[0].value || 0)
              )
            } else if (this.data.tab == 1) {
              return (
                params[0].axisValue +
                "\n" +
                params[1].marker +
                params[0].seriesName +
                ":" +
                params[0].value +
                "~" +
                (params[0].value + ((params[1].value + '').slice(-6) == '521125' ? 0 : params[1].value)) +
                "\n" +
                params[3].marker +
                params[2].seriesName +
                ":" +
                params[2].value +
                "~" +
                (params[2].value * 1 + ((params[3].value + '').slice(-6) == '521125' ? 0 : params[3].value * 1))
              );
            } else {
              return (
                params[0].axisValue +
                "\n" +
                params[1].marker +
                params[0].seriesName +
                ":" +
                params[0].value +
                "~" +
                (params[0].value + ((params[1].value + '').slice(-6) == '521125' ? 0 : params[1].value))
              )
            }
          },
        },
        grid: {
          top: '8%',
          left: '5%',
          right: '5%',
          bottom: '3%',
          containLabel: true
        },
        // dataZoom: [{
        //   type: 'inside', // 内置型数据区域缩放
        //   show: true,
        //   startValue: 0,
        //   endValue: 5,
        // }],
        xAxis: {
          type: 'category',
          splitLine: {
            show: false
          },
          data: this.data.time
        },
        yAxis: {
          type: 'value',
          min: [40, 80, 50, 34, 0][this.data.tab * 1 - 1],
        },
        series: [{
            name: ['舒张压范围', '血氧范围', '心率范围', '体温范围', '步数'][this.data.tab * 1 - 1],
            type: 'bar',
            stack: 'Total',
            barWidth: 4,
            itemStyle: {
              borderColor: 'transparent',
              color: 'transparent'
            },
            data: this.data.tab == 5 ? 0 : this.data.low1
          },
          {
            name: '',
            type: 'bar',
            stack: 'Total',
            barWidth: 4,
            label: {
              // show: true,
              position: 'inside'
            },
            itemStyle: {
              color: '#2bdc70', // 设置整个系列柱子的颜色为蓝色
              barBorderRadius: 10 // 设置所有柱子的圆角半径为10px
            },
            data: this.data.tab == 5 ? this.data.step : this.data.high1.map(item => item == 'solo' ? [2.0521125, 0.3521125, 1.0521125, 0.12521125, 0][this.data.tab * 1 - 1] : item)
          },
          {
            name: ['舒张压范围', '血氧范围', '心率范围', '体温范围', '步数'][this.data.tab * 1 - 1],
            type: 'bar',
            stack: 'Total1',
            barWidth: 4,
            itemStyle: {
              borderColor: 'transparent',
              color: 'transparent',
            },
            data: this.data.low2
          },
          {
            name: '',
            type: 'bar',
            stack: 'Total1',
            barWidth: 4,
            label: {
              // show: true,
              position: 'inside'
            },
            itemStyle: {
              color: '#fa5151', // 设置整个系列柱子的颜色为蓝色
              barBorderRadius: 10 // 设置所有柱子的圆角半径为10px
            },
            data: this.data.high2.map(item => item == 'solo' ? [2.0521125, 0.3521125, 0.521125, 0.0521125, 0][this.data.tab * 1 - 1] : item)
          }
        ]
      };
      return option
    }
  }
})

父组件

<view style="width: 100%; height: 260px;">
    <my-bar list="{{barList}}"></my-bar>
</view>

"usingComponents": {
    "my-bar": "./components/bar/bar",
    "solo-table": "./components/table/table"
  },
  
  
  barList: [{
         time: this.data.active,
         low1: 50,
         high1: 80,
         low2: 80,
         high2: 140
       }, {
         time: this.data.active,
         low1: 50,
         high1: 90,
         low2: 90,
         high2: 150
       }, {
         time: this.data.active,
         low1: 50,
         high1: 80,
         low2: 70,
         high2: 100
       }, {
         time: this.data.active,
         low1: 50,
         high1: 80,
         low2: 60,
         high2: 140
       }, {
         time: this.data.active,
         low1: 70,
         high1: 100,
         low2: 100,
         high2: 140
       }, ]

定制echarts.min.js

image.png

完整父组件

<view class="w100 min100">
  <van-sticky offset-top="{{ 0 }}">
    <van-tabs style="z-index: 99;" sticky animated class="gray-2 bold bg-white" active="{{ tab }}" bind:change="onChangeTab" color="#217EF7" line-width="{{20}}" line-height="{{4}}">
      <van-tab title="血压" name="1"></van-tab>
      <van-tab title="血氧" name="2"></van-tab>
      <van-tab title="心率" name="3"></van-tab>
      <van-tab title="体温" name="4"></van-tab>
      <van-tab title="步数" name="5"></van-tab>
    </van-tabs>
  </van-sticky>
  <time bindchangeTab="onChangeTime" bindchangeDay="onChangeDay"></time>

  <view class="flex w100 pl-30 ptb-20">
    <view class="bold size-32 flex-1">{{title}}统计分析</view>
    <!-- <van-tabs animated type="card" class="gray-2 flex-1" active="{{ active }}" bind:change="onChangeTime" color="#217EF7">
      <van-tab title="日" name="1"></van-tab>
      <van-tab title="周" name="2"></van-tab>
      <van-tab title="月" name="3"></van-tab>
    </van-tabs> -->
  </view>
  <view style="width: 100%; height: 250px;">
    <my-bar list="{{barList}}" tab="{{tab*1}}"></my-bar>
  </view>
  <view class="pd-30">
    <table1 head="{{head}}" list="{{tableList}}" tab="{{tab*1}}">
    </table1>
  </view>
  <view wx:if="{{tab==1}}">
    <view class="bold size-32 flex-1 plr-30 mt-30 mb-30">30天血压趋势情况</view>
    <view style="width: 100%; height: 320px;">
      <my-scatter list="{{scatterList}}"></my-scatter>
    </view>
    <view class="pd-30">
      <solo-table total="{{total}}" list="{{soloTable}}"></solo-table>
    </view>
  </view>
</view>
{
  "usingComponents": {
    "my-bar": "./components/bar/bar",
    "bar1": "./components/bar1/bar",
    "my-scatter": "./components/scatter/scatter",
    "solo-table": "./components/solo-table/table",
    "table1": "./components/table/table",
    "time": "./components-time/time/time"
  },
  "navigationBarTitleText": "健康监测"
}
 Page({
   data: {
     tab: 1, // 大分类
     title: '血压',
     timeRange: 'day', //时间切换
     queryDate: '', //时间切换
     //  bar
     barList: [],
     stepList: [],
     scatterList: [],
     total: 0,
     soloTable: [],
     //  表格
     head: [{
         text: '指标',
         prop: 'name'
       },
       {
         text: '最高',
         prop: 'max'
       },
       {
         text: '最低',
         prop: 'min'
       },
       {
         text: '参考值',
         prop: 'range'
       }
     ],
     tableList: []
   },
   onLoad(option) {
     let now = this.getNowData(new Date(), 'day')
     this.setData({
       timeRange: 'day',
       queryDate: now.content
     })
     this.getList()
     this.getList30()
   },
   getList() {
     let {
       timeRange,
       queryDate,
       tab
     } = this.data
     console.log(timeRange, queryDate, 8888888888888, timeRange == 'weeks' ? queryDate.split(' 至 ').join(',') : timeRange == 'day' ? queryDate : queryDate.split(' 至 ')[0].split('-')[0] + '-' + queryDate.split(' 至 ')[0].split('-')[1])
     wx.http('occupant/health-records/chartList', Object.assign({
       dataSource: 1, //0 手动录入   1智能手表   2、健康检测
       userId: wx.getStorageSync('userInfo').userId,
       timeRange: timeRange == 'weeks' ? 'week' : timeRange,
       queryDate: timeRange == 'weeks' ? queryDate.split(' 至 ').join(',') : timeRange == 'day' ? queryDate : queryDate.split(' 至 ')[0].split('-')[0] + '-' + queryDate.split(' 至 ')[0].split('-')[1],
       firstIndicator: ['diastolic_blood_pressure', 'blood_oxygen', 'heart_rate', 'temperature', 'step_count'][tab * 1 - 1],
     }, tab == 1 ? {
       secondIndicator: ['systolic_blood_pressure'][tab * 1 - 1]
     } : {})).then(res => {
       if (res.data.table && res.data.table.length) {
         if (tab == 1) {
           res.data.table[0].name = '舒张压'
           res.data.table[0].range = '60-90'
           res.data.table[1].range = '90-140'
           res.data.table[1].name = '收缩压'
         } else if (tab == 2) {
           res.data.table[0].name = '血氧'
           res.data.table[0].range = '95-100%'
         } else if (tab == 3) {
           res.data.table[0].name = '心率'
           res.data.table[0].range = '60-100'
         } else if (tab == 4) {
           res.data.table[0].name = '体温'
           res.data.table[0].range = '35.3-37.3℃'
         } else if (tab == 5) {
           res.data.table[0].name = '步数'
           res.data.table[0].range = '5000-10000步'
         }
       }
       //  if (tab == 5) {
       //    this.setData({
       //      stepList: res.data.charts || [],
       //      tableList: res.data.table
       //    })
       //  } else {

       //  }
       this.setData({
         barList: res.data.charts || [],
         tableList: res.data.table
       })
     })
   },
   getList30() {
     wx.http('occupant/health-records/bloodPressureTrend', {
       dataSource: 1, //0 手动录入   1智能手表   2、健康检测
       userId: wx.getStorageSync('userInfo').userId,
     }).then(res => {
       this.setData({
         scatterList: res.data.charts,
         total: res.data.total,
         soloTable: res.data.table,
       })
     })
   },
   onChangeTab(e) {
     this.setData({
       tab: e.detail.name,
       title: e.detail.title
     })
     this.getList()
     if (this.data.tab == 1) {
       this.getList30()
     }
   },
   //  onChangeTime(e) { 
   //    this.setData({
   //      timeRange: e.detail.id, 
   //    }) 
   //  },
   // 点击切换获取默认时间
   getNowData(date, dateType, direction) {
     let updateData = {};
     let content = "";
     let year = date.getFullYear();
     let month = date.getMonth() + 1;
     let day = date.getDate();
     let weeksDay = date.getDay();
     switch (dateType) {
       case 'day': {
         year = date.getFullYear();
         month = date.getMonth() + 1;
         day = date.getDate();
         content = year + "-" + month + "-" + day;
         break;
       }
       case 'weeks': {

         //获取当天在这一周是属于第几天,然后计算这一周的起始天日期和结束的日期
         weeksDay = date.getDay();

         let starDate = new Date(date.getTime());
         starDate.setDate(date.getDate() - weeksDay + 1);
         let startYear = starDate.getFullYear();
         let startMonth = starDate.getMonth() + 1;
         let startDay = starDate.getDate();

         let endDate = new Date(date.getTime());
         let endYear = endDate.getFullYear();
         let endMonth = endDate.getMonth() + 1;
         let endDay = endDate.getDate();
         //  let weeksDay = date.getDay(); // 获取今天是周几,注意:0代表周日,1代表周一

         //  // 计算本周第一天(周一)
         //  let startDate = new Date(date.getTime());
         //  if (weeksDay !== 0) { // 如果不是周日
         //    startDate.setDate(date.getDate() - weeksDay + 1); // 减去当前是周几再加1,得到周一
         //  } else {
         //    // 如果是周日,直接使用当前日期即可,因为已经是新的一周的开始
         //  }
         //  let startYear = startDate.getFullYear();
         //  let startMonth = startDate.getMonth() + 1; // 月份需要加1
         //  let startDay = startDate.getDate();

         //  // 计算本周最后一天(周日)
         //  let endDate = new Date(startDate.getTime());
         //  endDate.setDate(startDate.getDate() + 6); // 从周一基础上加6天到达周日
         //  let endYear = endDate.getFullYear();
         //  let endMonth = endDate.getMonth() + 1;
         //  let endDay = endDate.getDate();

         content = startYear + "-" + startMonth + "-" + startDay + ' 至 ' + endYear + "-" + endMonth + "-" + endDay;
         break;
       }
       case 'month': {
         let starDate = new Date(date.getTime());
         //计算当月的第一天日期
         starDate.setDate(1);
         let startYear = starDate.getFullYear();
         let startMonth = starDate.getMonth() + 1;
         let startDay = starDate.getDate();

         let endDate = new Date(date.getTime());
         let endYear = endDate.getFullYear();
         let endMonth = endDate.getMonth() + 1;
         let endDay = endDate.getDate();

         content = startYear + "-" + startMonth + "-" + startDay + ' 至 ' + endYear + "-" + endMonth + "-" + endDay;
         break;
       }
     }
     updateData.content = content;
     return updateData;
   },
   onChangeDay(e) {
     console.log(e.detail.id, 999999)
     this.setData({
       queryDate: e.detail.id.date.curDate,
     })
     if (e.detail.id.type) {
       this.setData({
         timeRange: e.detail.id.type,
       })
     }
     this.getList()
   },
 });

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

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

相关文章

【Epoch,Batch,Iteration】深度学习模型训练相关基础概念光速理解!

&#x1f525;模型训练相关基础概念&#xff01; Epoch: 一次 epoch 代表整个训练数据集已经被完整地送入神经网络进行了一轮训练。通常&#xff0c;模型需要多次 epoch 才能充分学习数据集中的模式。Batch: 由于数据集可能过大&#xff0c;无法一次性全部加载到内存中进行训练…

【前端】Mac安装node14教程

在macOS上安装Node.js版本14.x的步骤如下&#xff1a; 打开终端。 使用Node Version Manager (nvm)安装Node.js。如果你还没有安装nvm&#xff0c;可以使用以下命令安装&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 然后关…

LAMP分布式安全方案搭建网页 (LinuxCentOS7+Apache+Mariadb+PHP)包括服务端口及防火墙规则配置

目录 一、实验目的 二、设计方案及规划 三、实验内容及步骤 &#xff08;1&#xff09;实验前基础配置 &#xff08;2&#xff09;Test配置&#xff0c;安装Firefox浏览器和图形界面 &#xff08;3&#xff09;Web安装Apache &#xff08;4&#xff09;Database安装Mari…

2.4 Docker部署JDK

2.4 Docker部署JDK jdk17部署&#xff08;自定义镜像&#xff09; 1.在官网上下载jdk-17_linux-x64_bin.tar.gz&#xff0c;并安装到/usr/local目录下 cd /usr/local2.创建Dockerfile vim Dockerfile# 基于官方的Ubuntu 20.04镜像作为基础镜像 FROM ubuntu:20.04# 设置环境…

瑞吉外卖项目学习笔记(二)后台系统的员工管理业务开发

一、完善登录功能 1.1 问题分析 1.2 代码实现 package com.itheima.reggie.filter;//这是一个过滤器类 //登录检查过滤器import com.alibaba.fastjson.JSON; import com.itheima.reggie.common.R; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf…

探索k8s集群的存储卷 emptyDir hostPath nfs

目录 一 含义 查看支持的存储卷类型 emptyDir存储卷 1.1 特点 1.2 用途 1.3部署 二、hostPath存储卷 一 含义 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重…

磁盘配额的具体操作

磁盘配额&#xff1a; linux的磁盘空间有两个方面&#xff1a;第一个是物理空间&#xff0c;也就是磁盘的容量 第二个inode号耗尽&#xff0c;也无法写入 linux根分区&#xff1a;根分区的空间完全耗尽&#xff0c;服务程序崩溃&#xff0c;系统也无法启动了。 为了防止有人…

师彼长技以助己(2)产品思维

师彼长技以助己&#xff08;2&#xff09;产品思维 前言 我把产品思维称之为&#xff1a;人生底层的能力以及蹉跎别人还蹉跎自己的能力&#xff0c;前者说明你应该具备良好产品思维原因&#xff0c;后者是你没有好的产品思维去做产品带来的灾难。 人欲即天理 请大家谈谈看到这…

错误 0x80070570:文件或目录损坏且无法读取/无法访问[拒绝访问]-解决方法

1.起因&#xff1a;在挪动&#xff35;盘文件时&#xff0c;出现无法移动的报错提示&#xff1a; and无法访问[拒绝访问]: 2.原因&#xff3b;大多是胡乱拔出&#xff35;盘&#xff3d; &#xff3b;来自0x80070570 文件或目录损坏且无法读取 CHKDSK 修复方法-CSDN博客&#…

【介绍下SCSS的基本使用】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【AI应用开发框架】应用phidata快速构建你的智能体(如个人知识库、自动选股等)

1.phidata是什么&#xff1f; AI APP开发框架&#xff0c;基于此框架可快速搭建智能体或智能助手以实现记忆、知识库及工具使用等功能。 2.框架是怎样的&#xff1f; 3.为什么选择phidata&#xff1f; 问题&#xff1a;LLMs 的上下文有限&#xff0c;无法执行具体动作 解决…

[数据集][目标检测]猫狗检测数据集VOC+YOLO格式8291张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8291 标注数量(xml文件个数)&#xff1a;8291 标注数量(txt文件个数)&#xff1a;8291 标注…

LeetCode-131 分割回文串

LeetCode-131 分割回文串 题目描述解题思路C 代码 题目描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串。返回 s 所有可能的分割方案。 示例 1&#xff1a; 输入&#xff1a;s “aab” 输出&#xff1a;[[“a”,“a”,“b”],…

1.8k Star!RAGApp:在任何企业中使用 Agentic RAG 的最简单方法!

原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 1.8k Star&#xff01;RAGApp&#xff1a;在任何企业中使用 Agentic RAG 的最简单方法&#xff01; &#x1f31f;在任何企业中使用 Agent…

大数据信用报告分析和评估有什么意义

大数据信用这个词在现在已经是很常见的了&#xff0c;只要是申贷的朋友对它就不陌生&#xff0c;在明面上的信用资质刚刚满足审核要求&#xff0c;但又要把控风险的时候&#xff0c;这个时候大数据信用就会作为风控机构交叉核查的重要依据。那你知道大数据信用报告分析和评估有…

二、线性回归模型

目录 一、线性回归 1.模型示例 2.代码实验&#xff08;C1_W1_Lab03_Model_Representation&#xff09; (1).工具使用 (2).问题描述-房价预测 (3).输入数据 (4).绘制数据集坐标点 (5).建模构造函数 二、代价函数&#xff08;Cost function&#xff09; 1.解释一下概念…

上架 Google Play 的那些辛酸泪

一、注册 Google 账号 首先你要有个账号&#xff0c;地址如下&#xff1a; accounts.google.com/signup/v2/w… 按照 Google 爸爸要求&#xff0c;该填写的都填了&#xff0c;随后点击下一步。 验证手机号&#xff1a; 输入验证码验证当前手机号&#xff1a; 其他信息填写&a…

废品回收小程序怎么做?有哪些核心功能?

废品回收行业正逐步走向高质量发展的道路。在国家政策的推动下&#xff0c;再生资源市场需求旺盛&#xff0c;行业内部竞争格局逐渐明朗。 随着互联网技术的发展&#xff0c;"互联网回收"成为废品回收行业的一个新趋势。通过微信小程序这种线上平台&#xff0c;用户…

Linux--EXT2文件系统

参考资料&#xff1a; linux之EXT2文件系统--理解block/block group/索引结点inode/索引位图_一个块组中索引节点表和数据块区最多占用字节-CSDN博客 linux环境&#xff1a; Linux version 5.15.146.1-microsoft-standard-WSL2 (root65c757a075e2) (gcc (GCC) 11.2.0, GNU ld…

Wpf 使用 Prism 实战开发Day30

登录界面设计 一.准备登录界面图片素材&#xff08;透明背景图片&#xff09; 1.把准备好的图片放在Images 文件夹下面&#xff0c;格式分别是.png和.ico 2.选中 login.png图片鼠标右键&#xff0c;选择属性。生成的操作选择>资源 3.MyTodo 应用程序右键&#xff0c;属性&a…