running小程序重要技术流程文档

news2025/2/22 20:46:08

一、项目文件说明:

(注:getMyMoney无用已删除)
在这里插入图片描述

二、重要文件介绍

1.reinfo.js:位于utils文件下,该文件封装有统一的请求URL,和请求API同意封装供页面调用;调用时候需要在页面上先引入该文件,如下(index/index.js为例):

//先引入
import API from "../../utils/reinfo.js";

// 后使用的时候如下
wx.request({
  url: API.getSysConfig,//这里的API就是上面引入时候的名字,getSysConfig就是我们reinfo.js文件里封装的
  method:"get",
  success: function (res) {
  	// 调用接口成功后执行的
  }
})

2.app.js:这个是小程序的启动文件,每次小程序启动的话,必定会执行这个文件里的方法。

//onLaunch 小程序生命周期,启动就会执行
onLaunch: function () {
  var that=this;
  // 展示本地存储能力
  var openId = wx.getStorageSync('openId') || null
  // 获取用户openid、使用 Promise 
  // 这里的获取用户openid使用Promise 因为需要让index.js可以调用他来获取openid,因为index作为第一个小程序页面,也具有优先执行权,有时候会在app.js执行之前先执行,有时候会在app.js执行之后执行,所以这里使用Promise做一个异步请求,来供index.js页面调用回调获取用户数据
  const getUserOpenId = new Promise((resolve, reject) => {
    if(openId){
      console.log('缓存openid',openId)
      resolve(openId); // resolve Promise
    }else{
      // 登录code获取openid
      wx.login({
        success: function (res) {
          var code = res.code;//发送给服务器的code
            if (code) {
              wx.request({
                url: API.getSessinOpenid,
                method:"post",
                data: {
                  code: code,
                },
                header: {
                  'content-tpe': 'application/json'
                },
                success: function (res) {
                  console.log('获取到的用户openid为:',res)
                  //可以把openid保存到本地缓存,方便以后调用
                  wx.setStorageSync('openId', res.data.data);
                  // that.getUserInfoFun(res.data.data)
                  resolve(res.data.data); // resolve Promise
                },
                fail:function(res){
                  reject(err); // reject Promise
                  console.log(res)
                }
              })
            }
            else {
              console.log("获取用户登录态失败!");
            }
        },
        fail: function (error) {
        }
      })
    }
  });
   // 将 Promise 对象存储到全局数据对象中
   this.globalData.getUserOpenId = getUserOpenId;

  //  获取用户信息
  //这个获取用户信息同上意思
  const getUserInfo = new Promise((resolve, reject) => {
    wx.request({
      url: API.getUserInfo,
      method:"post",
      data: {
        openId: wx.getStorageSync('openId') || null,
      },
      success: function (res) {
        console.log('openid获取用户信息:',res)
        wx.setStorageSync('userInfo', res.data.data);
        resolve(res.data.data); // resolve Promise
      }
    })
  })
  // 将 Promise 对象存储到全局数据对象中
  this.globalData.getUserInfo = getUserInfo;
  
},

这个页面底部有个changeTabBar方法这个是自定义底部导航组件用来切换页面的公共方法
小程序组件的使用方法如下:
1.封装组件如comment\tabbar\tabbar.wxml这里就是封装了一个底部导航组件:
在这里插入图片描述
其他需要使用的页面进行引入(index/index):
wxml:


<import src="../../comment/tabbar/tabbar.wxml" />
<template is="tabbar" data="{{tabbar}}"/>

js:

//获取应用实例
const app = getApp();
Page({
/**
   * 页面的初始数据
   */
  data: {
    //底部导航栏
    tabbar: {},
  },
  //在onshow或者onload调用app下的changeTabBar方法来进行点击切换页面
  onload(){
    //调用app中的函数
    app.changeTabBar(); 
 } 
})

3.postOrder:发布订单是一个大麻烦:这里需要使用一个点击切换和滑动切换(同用户订单列表页和跑腿订单列表页)。
wxml:

<view class="navbar">
  <text wx:for="{{navbar}}" data-idx="{{index}}" class="item {{currentTab==index ? 'active' : ''}}" wx:key="unique" bindtap="navbarTap">{{item}}</text>
</view>

js:

/**
 * 页面的初始数据
 */
data: {
  navbar: ['帮我买', '帮我送', '帮我取'],
  currentTab: 0,
}


  //电机头部切换bar
  navbarTap: function (e) {
    console.log( e.currentTarget.dataset.idx)
    let initPrice = app.globalData.sysConfig.minDeliveryPrice
    // 切换的时候需要将数据清空,让用户重新输入
    let postData = {
      "commodity": "",
      "commodityCost": 0,
      "commodityWeight": 1,
      "deliveryAddress": "",
      "deliveryConcat": "",
      "deliveryPhone": "",
      "deliveryTime": "",
      "openId": "",
      "orderType": e.currentTarget.dataset.idx*1,
      "pickUpAddress": "",
      "pickUpContact": "",
      "pickUpPhone": "",
      "pickUpTime": "",
      "remark": "",
      "tipCost": 0,
      "totalCost": 0
    }
    // 设置取货时间、配送时间
    postData.deliveryTime = this.calculateFutureTime()
    if(postData.orderType == 1||postData.orderType == 2){
      postData.pickUpTime = this.calculateFutureTime()
    }
    var userInfo = wx.getStorageSync('userInfo') || {}
    postData.deliveryPhone = userInfo.phone
    // postData.orderType = e.currentTarget.dataset.idx
    this.setData({
      currentTab: e.currentTarget.dataset.idx,
      postData,
      
      multiIndex1: [0, 0], // 默认选择当天和第一个时间段
      multiIndex2: [0, 0], // 默认选择当天和第一个时间段
      multiIndex3: [0, 0], // 默认选择当天和第一个时间段
      multiIndex4: [0, 0], // 默认选择当天和第一个时间段

      price: initPrice
    })
    //全局变量
    app.globalData.currentTab = e.currentTarget.dataset.idx;
  },
  // 轮播切换,即左右滑动切换
  swiperChange: function (e) {
    let initPrice = app.globalData.sysConfig.minDeliveryPrice
    // 切换类型的话清空
    let postData = {
      "commodity": "",
      "commodityCost": 0,
      "commodityWeight": 1,
      "deliveryAddress": "",
      "deliveryConcat": "",
      "deliveryPhone": "",
      "deliveryTime": "",
      "openId": "",
      "orderType": e.detail.current*1,
      "pickUpAddress": "",
      "pickUpContact": "",
      "pickUpPhone": "",
      "pickUpTime": "",
      "remark": "",
      "tipCost": 0,
      "totalCost": 0
    }
    // 设置取货时间、配送时间
    postData.deliveryTime = this.calculateFutureTime()
    if(postData.orderType == 1||postData.orderType == 2){
      postData.pickUpTime = this.calculateFutureTime()
    }
    var userInfo = wx.getStorageSync('userInfo') || {}
    postData.deliveryPhone = userInfo.phone
    this.setData({
      currentTab: e.detail.current,
      postData,
      
      multiIndex1: [0, 0], // 默认选择当天和第一个时间段
      multiIndex2: [0, 0], // 默认选择当天和第一个时间段
      multiIndex3: [0, 0], // 默认选择当天和第一个时间段
      multiIndex4: [0, 0], // 默认选择当天和第一个时间段
      price: initPrice
    })
    //全局变量
    app.globalData.postOrderCurrentTab = e.detail.current;
  },

来实现顶部以及点击切换:在这里插入图片描述
配送时间的选择,进行一个立即配送和之后的每隔30分钟可供选择,有当天和次日,
在这里插入图片描述
wxml:

<view class="v1-item">
  <view>预计送达时间</view>
  <picker mode="multiSelector" bindcolumnchange="bindMultiPickerColumnChange" range="{{[dateRange, timeRange]}}" value="{{multiIndex1}}" data-id="1" bindchange="bindMultiPickerChange">
    <view class="picker">
      {{dateRange[multiIndex1[0]]}} {{timeRange[multiIndex1[1]]}}
    </view>
  </picker>
</view>

js:

data:{
    dateRange: ['今天', '明天'],
    timeRange: [], // 存储时间段的数组
    multiIndex1: [0, 0], // 默认选择当天和第一个时间段  帮我买:预计送达时间
    multiIndex2: [0, 0], // 默认选择当天和第一个时间段  帮我送:预计取货时间
    multiIndex3: [0, 0], // 默认选择当天和第一个时间段  帮我送:预计送达时间
    multiIndex4: [0, 0], // 默认选择当天和第一个时间段  帮我取:预计送达时间
}

  // 配送时间选择列表发生改变时候监听
  bindMultiPickerColumnChange(e){
    console.log('修改的列为', e.detail.column, ',值为', e.detail.value,e);
    if(e.detail.column == 0 && e.detail.value == 1){
      var startOfDay = new Date();
      startOfDay.setHours(0, 0, 0, 0);
      dayType = 1
      this.generateTimeRange(startOfDay)
    }
    else if(e.detail.column == 0 && e.detail.value == 0){
      dayType = 0
      this.generateTimeRange(new Date())
    }
  },
  // 计算时间选择列表
  generateTimeRange: function(now) {
    // var now = new Date();
    var hours = now.getHours();
    var minutes = now.getMinutes();
    var timeRange = [];
    
    // 生成时间段,每半个小时为一个时间段,共24小时
    for (var i = 0; i < 48; i++) {
      var hour = Math.floor(i / 2);
      var minute = (i % 2) * 30;
      
      // 格式化时间,补零操作
      var hourStr = hour < 10 ? '0' + hour : '' + hour;
      var minuteStr = minute === 0 ? '00' : '' + minute;
      
      if (hour > hours || (hour == hours && minute >= minutes)) {
        timeRange.push(hourStr + ':' + minuteStr);
      }
    }
    if(dayType == 0){
      timeRange[0] = '立即配送'
    }
    
    this.setData({
      timeRange: timeRange
    });
  },
  // 根据当前时间自动计算30分钟后的时间,并在遇到23:40时能正确计算到次日
  calculateFutureTime() {
    var currentDate = new Date();
    var futureDate = new Date(currentDate.getTime() + 30 * 60000); // 加上30分钟的毫秒数
  
    // 如果超过了当天的23:59:59,就设置到次日的00:30
    if (futureDate.getDate() > currentDate.getDate()) {
      futureDate = new Date(futureDate.getFullYear(), futureDate.getMonth(), futureDate.getDate(), 0, 30, 0);
      
      var originalDate = new Date(futureDate);
      var hour = originalDate.getHours()<10?'0'+originalDate.getHours():originalDate.getHours();
      // var minute = originalDate.getMinutes();
      var minute = originalDate.getMinutes()<10?'0'+originalDate.getMinutes():originalDate.getMinutes();
      var formattedTime = hour + ':' + minute;
      // var formattedTime = hour<10?0+hour:hour + ':' + minute;
      console.log("当前时间0000:" , currentDate);
      console.log("30分钟后的时间000:" , futureDate,formattedTime);
      return '次日 '+formattedTime;
    }
    var originalDate = new Date(futureDate);
    var hour = originalDate.getHours()<10?'0'+originalDate.getHours():originalDate.getHours();
    var minute = originalDate.getMinutes()<10?'0'+originalDate.getMinutes():originalDate.getMinutes();
    // var minute = originalDate.getMinutes();
    var formattedTime = hour + ':' + minute;
    // var formattedTime = hour<10?0+hour:hour + ':' + minute;

    console.log("当前时间111:" , currentDate);
    console.log("30分钟后的时间1111:" , futureDate,formattedTime);
    return '今天 '+formattedTime;
  },
  // 选择
  bindMultiPickerChange: function(e) {
    console.log('选择',e)
    let postData = this.data.postData
    let type = e.currentTarget.dataset.id
    console.log('这样可以吗?',this.data['multiIndex'+type])
    // 如果是立即配送自动匹配现在的30分钟后
    if(this.data.timeRange[e.detail.value[1]] == '立即配送'){
      postData.deliveryTime = this.calculateFutureTime()
    }
    if(type == 1){
      postData.deliveryTime = this.data.dateRange[this.data['multiIndex'+type][0]] +' '+ this.data.timeRange[this.data['multiIndex'+type][1]]
    }
    if(type == 2){
      postData.pickUpTime = this.data.dateRange[this.data['multiIndex'+type][0]] +' '+ this.data.timeRange[this.data['multiIndex'+type][1]]
    }
    if(type == 3){
      postData.deliveryTime = this.data.dateRange[this.data['multiIndex'+type][0]] +' '+ this.data.timeRange[this.data['multiIndex'+type][1]]
    }
    if(type == 4){
      postData.deliveryTime = this.data.dateRange[this.data['multiIndex'+type][0]] +' '+ this.data.timeRange[this.data['multiIndex'+type][1]]
    }
    
    this.setData({
      ['multiIndex'+type]: e.detail.value,
      postData,
    });
    console.log('结果》》》?',this.data['multiIndex'+type])
  },

图片上传列表
wxml:

<view class="v1">
     <!-- 图片列表 -->
     <view class="image-list">
       <block wx:for="{{images}}" wx:key="index">
         <view class="image-item">
           <image src="{{item}}" mode="aspectFill" data-src="{{item}}" bindtap="previewImage"></image>
           <view class="delete-btn" bindtap="deleteImage" data-index="{{index}}">×</view>
         </view>
       </block>
       <!-- 添加图片按钮 -->
       <view class="add-image" bindtap="chooseImage">
         <text>+</text>
       </view>
     </view>
   </view>

js:

data:{
    images: [], // 存储已选择的图片列表
}

 // 选择图片
  chooseImage() {
    let that = this;
    wx.chooseImage({
      count: 1,
      sizeType: ['original', 'compressed'],
      sourceType: ['album', 'camera'],
      success: (res) => {
        console.log('选择图片',res)
        wx.uploadFile({
          url: API.uploadImg,
          filePath: res.tempFilePaths[0],
          name: 'file',
          header: {
            "Content-Type": "multipart/form-data"
          },
          formData: {
            'type': 4 //1-表示头像,2-表示身份证,4-订单图片
          },
          success (resFile){
            let fileData = JSON.parse(resFile.data)
            console.log("文件上传接口",JSON.parse(resFile.data))
            if(fileData.code == 0){
              // 上传成功时候插入原有的数据中
              const newImages = that.data.images.concat(fileData.data);
              that.setData({
                images: newImages,
              });
            }else{
              wx.showToast({
                title: fileData.msg,
                icon: 'error'
              })
            }
          }
        })
        
      },
    });
  },

  // 预览图片
  previewImage(e) {
    const current = e.target.dataset.src;
    wx.previewImage({
      current: current,
      urls: this.data.images,
    });
  },

  // 删除图片
  deleteImage(e) {
    const index = e.target.dataset.index;
    const newImages = this.data.images;
    // 删除指定位置index的图片
    newImages.splice(index, 1);
    this.setData({
      images: newImages,
    });
  },

4.index:抢单大厅样式

//<!-- class使用三元运算符,动态设置class名称,用遍历数据,判断奇偶数来实现左右不同样式 -->
<view class="{{index%2 == 0?'v2-body-v1':'v2-body-v2'}}" wx:for="{{orderHallList}}"  bindtap="gotoOrderDetail" data-paymentStatus="{{item.paymentStatus}}" data-orderStatus="{{item.orderStatus}}" data-id="{{item.id}}" data-type="orderHall">
  <view class="{{index%2 == 0?'v2-body-v1-price':'v2-body-v2-price'}}">{{item.totalCost}}</view>
  <view class="{{index%2 == 0?'v2-body-v1-text':'v2-body-v2-text'}}">
    <image src="{{index%2 == 0?'/images/zuo.png':'/images/you.png'}}"></image>
    <text>{{item.orderType == 'BUY'?'帮我买':item.orderType == 'SEND'?'帮我送':item.orderType == 'TAKE'?'帮我取':''}}</text>
  </view>
  <view class="{{index%2 == 0?'v2-body-v1-img':'v2-body-v2-img'}}">
    <view>{{item.deliveryAddress}}</view>
    <view>{{item.deliveryTime}}</view>
  </view>
</view>

5.订单完成的评价打分
wxml:

<view class="v1-item">
  // <!-- 星星打分实现 -->
    <view style="width: 100%;line-height: 60rpx;">
      <view style="width: unset;margin-left: unset;" class='starLen' bindtap="myStarChoose">
        <block wx:for="{{starMap}}">
          <image wx:if="{{star>=index+1}}" class='star' data-star="{{index+1}}" src="../../images/start-2.png" /> 
          <image wx:if="{{star<index+1}}" class='star' data-star="{{index+1}}" src="../../images/start-1.png" />    
        </block>
      </view>
      <view class="scoreContent" style="width: unset;margin-left: unset;">{{starMap[star-1]}}</view>
    </view>
  </view>

js:

/**
   * 页面的初始数据
   */
  data: {
    star: 0,  //默认0分
    starMap: [
      '非常差',
      '差',
      '一般',
      '好',
      '非常好',
    ],
  },
  
  // 选星
  myStarChoose(e) {
    let star = parseInt(e.target.dataset.star) || 0;
    // 获取打的分
    this.setData({
      star: star,
    });
  },

这里列举这几个比较难的流程,如果后面对哪些模块的流程有不明白的可以再提出来

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法Day26 数位统计

数位统计 Description 给你一个整数n&#xff0c;统计并返回各位数字都不同的数字x的个数&#xff0c;其中0 ≤ x < 10^n。 Input 输入整数n 0≤n≤13 Output 输出整数个数 Sample 代码 import java.util.Scanner;public class Main {public static void main(String[] ar…

鸿蒙方舟开发框架ArkUI简介

语雀知识库地址&#xff1a;语雀HarmonyOS知识库 飞书知识库地址&#xff1a;飞书HarmonyOS知识库 嗨&#xff0c;各位别来无恙呐&#xff0c;我是小白 众所周知&#xff0c;华为在今年推出了 HarmonyOS 4.0 版本&#xff0c;而在此之前的版本中&#xff0c;HarmonyOS 应用的 …

TCP一对一聊天

客户端 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io…

【web安全】文件读取与下载漏洞

前言 菜某整理仅供学习&#xff0c;有误请赐教。 概念 个人理解&#xff1a;就是我们下载一个文件会传入一个参数&#xff0c;但是我们可以修改参数&#xff0c;让他下载其他的文件。因为是下载文件&#xff0c;所以我们可以看到文件里面的源码&#xff0c;内容。 文件读取…

MindOpt APL:一款适合优化问题数学建模的编程语言

什么是建模语言 建模语言是一种描述信息或模型的编程语言&#xff0c;在运筹优化领域&#xff0c;一般是指代数建模语言。 比如要写一个线性规划问题的建模和求解&#xff0c;可以采用C、Python、Java等通用编程语言来实现计算机编程&#xff08;码代码&#xff09;&#xff0…

JavaScript常用技巧专题一

文章目录 一、前言二、生成随机颜色的两种方式2.1、生成RandomHexColor2.2、生成随机RGBA 三、复制内容到剪贴板的两种方式3.1、方式13.2、方式2 四、获取URL中的查询参数五、打乱数组六、深拷贝一个对象七、确保元素在可见区域内八、获取当前选中的文本九、浏览器cookie9.1、获…

深入了解数据库锁:类型、应用和最佳实践

目录 1. 引言 2. 数据库锁的基本概念 2.1 悲观锁和乐观锁 2.2 排他锁和共享锁 3. 悲观锁的应用场景 3.1 长事务和大事务 3.2 并发修改 3.3 数据库死锁 4. 悲观锁的最佳实践 4.1 精细控制锁的粒度 4.2 避免死锁 4.3 考虑乐观锁 5. 案例分析 5.1 银行系统的转账操作…

搭乘“低代码”快车,引领食品行业数字化转型全新升级

数字化技术作为重塑传统行业重要的力量&#xff0c;正以不可逆转的趋势改变着企业经营与客户消费的方式。 在近些年的企业数字化服务与交流过程中&#xff0c;织信团队切实感受到大多数企业经营者们从怀疑到犹豫再到焦虑最终转为坚定的态度转变。 在这场数字化转型的竞赛中&a…

Could not resolve all dependencies for configuration ‘:app:androidApis‘.

android studio出现Could not resolve all dependencies for configuration ‘:app:androidApis’. 试过很多种方法&#xff0c;但是都不好使&#xff0c;不管怎么样都是提示如下报错&#xff1a; Using insecure protocols with repositories, without explicit opt-in, is un…

Unity中Batching优化的GPU实例化整理总结

文章目录 前言一、GPU Instancing的支持1、硬件支持2、Shader支持3、脚本支持 二、我们来顺着理一下GPU实例化的使用步骤1、GPU实例化前的C#代码准备2、在 appdata 和 v2f 中定义GPU实例化ID3、在顶点着色 和 片元着色器 设置GPU Instance ID&#xff0c;使实例化对象顶点位置正…

RK3588平台开发系列讲解(hardware)reference-ril源码分析

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、reference-ril目录介绍二、支持的功能三、Android RIL 框架沉淀、分享、成长,让自己和他人都能有所收获!😄 一、reference-ril目录介绍 目录:3588-android12/hardware/ril/reference-ril

做数据分析为何要学统计学(5)——什么问题适合使用t检验?

t检验&#xff08;Students t test&#xff09;&#xff0c;主要依靠总体正态分布的小样本&#xff08;例如n < 30&#xff09;对总体均值水平进行差异性判断。 t检验要求样本不能超过两组&#xff0c;且每组样本总体服从正态分布&#xff08;对于三组以上样本的&#xff0…

降维技术——PCA、LCA 和 SVD

一、说明 降维在数据分析和机器学习中发挥着关键作用&#xff0c;为高维数据集带来的挑战提供了战略解决方案。随着数据集规模和复杂性的增长&#xff0c;特征或维度的数量通常变得难以处理&#xff0c;导致计算需求增加、潜在的过度拟合和模型可解释性降低。降维技术通过捕获数…

Docker, Docker-compose部署Sonarqube

参考文档 镜像地址: https://hub.docker.com/_/sonarqube/tags Docker部署文档地址 Installing from Docker | SonarQube Docs Docker-compose文档部署地址&#xff1a; Installing from Docker | SonarQube Docs 部署镜像 2.1 docker部署 # 宿主机执行 $. vi /etc/sysctl.conf…

log4j(日志的配置)

日志一般配置在resources的config下面的&#xff0c;并且Util当中的initLogRecord中的initLog&#xff08;&#xff09;方法就是加载这个log4j.properties的. 首先先看log4j.properties的配置文件 log4j.rootLoggerdebug, stdout, Rlog4j.appender.stdoutorg.apache.log4j.Co…

麒麟系统系统添加路由

系统添加路由 一、路由的解释&#xff1a; 路由工作在OSI参考模型第三层——网络层的数据包转发设备&#xff08;TCP/IP&#xff09;路由器根据收到数据包中的网络层地址以及路由器内部维护的路由表决定输出端口以及下一跳地址&#xff0c;并且重写链路层数据包头实现转发数据…

response应用及重定向和request转发

请求和转发&#xff1a; response说明一、response文件下载二、response验证码实现1.前置知识&#xff1a;2.具体实现&#xff1a;3.知识总结 三、response重定向四、request转发五、重定向和转发的区别 response说明 response是指HttpServletResponse,该响应有很多的应用&…

探索人工智能领域——每日20个名词详解【day12】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

如何将腾讯混元大模型AI接入自己的项目里(中国版本ChatGPT)

如何将腾讯混元大模型AI接入自己的项目里 一、腾讯混元大模型API二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、腾讯混元大模型API 基于腾讯混元大模型AI的智能文本对话AI机器人…

MBD Introduction

介绍 MATLAB是MathWorks公司的商业数学软件&#xff0c;应用于科学计算、可视化以及交互式程序设计等高科技计算环境。Simulink是MATLAB中的一种可视化仿真工具。 Simulink是一个模块图环境&#xff0c;用于多域仿真以及基于模型的设计。它支持系统设计、仿真、自动代码生成以…