uniapp——项目day03

商品列表

分支创建

定义请求参数对象 

获取商品列表数据

渲染商品列表结构

1. 在页面中,通过 v-for 指令,循环渲染出商品的 UI 结构:

<template>
  <view>
    <view class="goods-list">
      <block v-for="(goods, i) in goodsList" :key="i">
        <view class="goods-item">
          <!-- 商品左侧图片区域 -->
          <view class="goods-item-left">
            <image :src="goods.goods_small_logo || defaultPic" class="goods-pic"></image>
          </view>
          <!-- 商品右侧信息区域 -->
          <view class="goods-item-right">
            <!-- 商品标题 -->
            <view class="goods-name">{{goods.goods_name}}</view>
            <view class="goods-info-box">
              <!-- 商品价格 -->
              <view class="goods-price">¥{{goods.goods_price}}</view>
            </view>
          </view>
        </view>
      </block>
    </view>
  </view>
</template>

2. 为了防止某些商品的图片不存在,需要在 data 中定义一个默认的图片:

// 默认的空图片
        defaultPic: 'https://img3.doubanio.com/f/movie/8dd0c794499fe925ae2ae89ee30cd225750457b4/pics/movie/celebrity-default-medium.png'

3. 美化商品列表的 UI 结构:

 .goods-item {
    display: flex;
    padding: 10px 5px;
    border-bottom: 1px solid #f0f0f0;

    .goods-item-left {
      margin-right: 5px;

      .goods-pic {
        width: 100px;
        height: 100px;
        display: block;
      }
    }

    .goods-item-right {
      display: flex;
      flex-direction: column;
      justify-content: space-between;

      .goods-name {
        font-size: 13px;
      }

      .goods-price {
        font-size: 16px;
        color: #c00000;
      }
    }
  }

把商品 item 项封装为自定义组件

1. 在 components 目录上鼠标右键,选择 新建组件 :

2. 将 goods_list 页面中,关于商品 item 项相关的 UI 结构、样式、data 数据,封装到 my-goods 组件中:

<template>
  <view class="goods-item">
    <!-- 商品左侧图片区域 -->
    <view class="goods-item-left">
      <image :src="goods.goods_small_logo || defaultPic" class="goodspic"></image>
    </view>
    <!-- 商品右侧信息区域 -->
    <view class="goods-item-right">
      <!-- 商品标题 -->
      <view class="goods-name">{{goods.goods_name}}</view>
      <view class="goods-info-box">
        <!-- 商品价格 -->
        <view class="goods-price">¥{{goods.goods_price}}</view>
      </view>
    </view>
  </view>
</template>

<script>
  export default {
    name: "my-goods",
    // 定义 props 属性,用来接收外界传递到当前组件的数据
    props: {
      // 商品的信息对象
      goods: {
        type: Object,
        defaul: {},
      },
    },
    data() {
      return {
        // 默认的空图片
        defaultPic: 'https://img3.doubanio.com/f/movie/8dd0c794499fe925ae2ae89ee30cd225750457b4/pics/movie/celebrity-default-medium.png',
      };
    }
  }
</script>

<style lang="scss">
  .goods-item {
    display: flex;
    padding: 10px 5px;
    border-bottom: 1px solid #f0f0f0;

    .goods-item-left {
      margin-right: 5px;

      .goods-pic {
        width: 100px;<template>
  <view class="goods-item">
    <!-- 商品左侧图片区域 -->
    <view class="goods-item-left">
      <image :src="goods.goods_small_logo || defaultPic" class="goodspic"></image>
    </view>
    <!-- 商品右侧信息区域 -->
    <view class="goods-item-right">
      <!-- 商品标题 -->
      <view class="goods-name">{{goods.goods_name}}</view>
      <view class="goods-info-box">
        <!-- 商品价格 -->
        <view class="goods-price">¥{{goods.goods_price}}</view>
      </view>
    </view>
  </view>
</template>

<script>
  export default {
    name: "my-goods",
    // 定义 props 属性,用来接收外界传递到当前组件的数据
    props: {
      // 商品的信息对象
      goods: {
        type: Object,
        defaul: {},
      },
    },
    data() {
      return {
        // 默认的空图片
        defaultPic: 'https://img3.doubanio.com/f/movie/8dd0c794499fe925ae2ae89ee30cd225750457b4/pics/movie/celebrity-default-medium.png',
      };
    }
  }
</script>

<style lang="scss">
  .goods-item {
    display: flex;
    padding: 10px 5px;
    border-bottom: 1px solid #f0f0f0;

    .goods-item-left {
      margin-right: 5px;

      .goods-pic {
        width: 100px;
        height: 100px;
        display: block;
      }
    }

    .goods-item-right {
      display: flex;
      flex-direction: column;
      justify-content: space-between;

      .goods-name {
        font-size: 13px;
      }

      .goods-price {
        font-size: 16px;
        color: #c00000;
      }
    }
  }
</style>
        height: 100px;
        display: block;
      }
    }

    .goods-item-right {
      display: flex;
      flex-direction: column;
      justify-content: space-between;

      .goods-name {
        font-size: 13px;
      }

      .goods-price {
        font-size: 16px;
        color: #c00000;
      }
    }
  }
</style>

使用过滤器处理商品价格

1. 在 my-goods 组件中,和 data 节点平级,声明 filters 过滤器节点如下:

    filters: {
      // 把数字处理为带两位小数点的数字
      tofixed(num) {
        return Number(num).toFixed(2)
      }
    }

2. 在渲染商品价格的时候,通过管道符 | 调用过滤器:

<!-- 商品价格 -->
<view class="goods-price">¥{{goods.goods_price | tofixed}}</view>

上拉加载更多

初步实现上拉加载更多

1. 打开项目根目录中的 pages.json 配置文件,为 subPackages 分包中的 goods_list 页面 配置上拉触底的距离:

在style中配置如下属性

"onReachBottomDistance": 150

2. 在 goods_list 页面中,和 methods 节点平级,声明 onReachBottom 事件处理函数,用 来监听页面的上拉触底行为:

    onReachBottom() {
      // 让页码值自增 +1
      this.queryObj.pagenum += 1
      // 重新获取列表数据
      this.getGoodsList()
    }

3. 改造 methods 中的 getGoodsList 函数,当列表数据请求成功之后,进行新旧数据的拼接处 理:

      async getGoodsList() {
        // 发起请求
        const {
          data: res
        } = await
        uni.$http.get('/api/public/v1/goods/search', this.queryObj)
        if (res.meta.status !== 200) return uni.$showMsg()
        // 为数据赋值:通过展开运算符的形式,进行新旧数据的拼接
        this.goodsList = [...this.goodsList, ...res.message.goods]
        this.total = res.message.total
      }

通过节流阀防止发起额外的请求

1. 在 data 中定义 isloading 节流阀如下:

// 是否正在请求数据
isloading: false

判断数据是否加载完毕

2. 修改 onReachBottom 事件处理函数如下:

    onReachBottom() {
      // 判断是否还有下一页数据
      if (this.queryObj.pagenum * this.queryObj.pagesize >= this.total)
        return uni.$showMsg('数据加载完毕!')
      // 判断是否正在请求其它数据,如果是,则不发起额外的请求
      if (this.isloading) return
      this.queryObj.pagenum += 1
      this.getGoodsList()
    }

下拉刷新

3. 修改 getGoodsList 函数,接收 cb 回调函数并按需进行调用:

      async getGoodsList(cb) {
        // ** 打开节流阀
        this.isloading = true
        // 发起请求
        const {
          data: res
        } = await
        uni.$http.get('/api/public/v1/goods/search', this.queryObj)
        this.isloading = false
        // 只要数据请求完毕,就立即按需调用 cb 回调函数
        cb && cb()
        if (res.meta.status !== 200) return uni.$showMsg()
        // 为数据赋值:通过展开运算符的形式,进行新旧数据的拼接
        this.goodsList = [...this.goodsList, ...res.message.goods]
        this.total = res.message.total
      }

点击商品 item 项跳转到详情页面

1. 将循环时的 block 组件修改为 view 组件,并绑定 click 点击事件处理函数:

<view class="goods-list">
<view v-for="(item, i) in goodsList" :key="i" @click="gotoDetail(item)">
<!-- 为 my-goods 组件动态绑定 goods 属性的值 -->
<my-goods :goods="item"></my-goods>
</view>
</view>

分支的合并与提交

商品详情

创建分支

git checkout -b goodsdetail

获取商品详情数据

渲染商品详情页的 UI 结构

渲染轮播图区域

实现轮播图预览效果

1. 为轮播图中的 image 图片绑定 click 事件处理函数:

        <!-- 把当前点击的图片的索引,传递到 preview() 处理函数中 -->
        <image :src="item.pics_big" @click="preview(i)"></image>

2. 在 methods 中定义 preview 事件处理函数:

// 实现轮播图的预览效果
      preview(i) {
        // 调用 uni.previewImage() 方法预览图片
        uni.previewImage({
          // 预览时,默认显示图片的索引
          current: i,
          // 所有图片 url 地址的数组
          urls: this.goods_info.pics.map(x => x.pics_big)
        })
      }

渲染商品信息区域

1. 定义商品信息区域的 UI 结构如下:

    <!-- 商品信息区域 -->
    <view class="goods-info-box">
      <!-- 商品价格 -->
      <view class="price">¥{{goods_info.goods_price}}</view>
      <!-- 信息主体区域 -->
      <view class="goods-info-body">
        <!-- 商品名称 -->
        <view class="goods-name">{{goods_info.goods_name}}</view>
        <!-- 收藏 -->
        <view class="favi">
          <uni-icons type="star" size="18" color="gray"></uni-icons>
          <text>收藏</text>
        </view>
      </view>
      <!-- 运费 -->
      <view class="yf">快递:免运费</view>
    </view>

2. 美化商品信息区域的样式:


  // 商品信息区域的样式
  .goods-info-box {
    padding: 10px;
    padding-right: 0;

    .price {
      color: #c00000;
      font-size: 18px;
      margin: 10px 0;
    }

    .goods-info-body {
      display: flex;
      justify-content: space-between;

      .goods-name {
        font-size: 13px;
        padding-right: 10px;
      }

      // 收藏区域
      .favi {
        width: 120px;
        font-size: 12px;
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        border-left: 1px solid #efefef;
        color: gray;
      }
    }

    // 运费
    .yf {
      margin: 10px 0;
      font-size: 12px;
      color: gray;
    }
  }

渲染商品详情信息

 3. 解决 .webp 格式图片在 ios 设备上无法正常显示的问题:

// 定义请求商品详情数据的方法
      async getGoodsDetail(goods_id) {
        const {
          data: res
        } = await uni.$http.get('/api/public/v1/goods/detail', {
          goods_id
        })
        if (res.meta.status !== 200) return uni.$showMsg()
        // 使用字符串的 replace() 方法,将 webp 的后缀名替换为 jpg 的后缀名
        res.message.goods_introduce = res.message.goods_introduce.replace(/<img/g, '<img style="display:block;" ')
          .replace(/webp/g, 'jpg')
        this.goods_info = res.message
      }

解决商品价格闪烁的问题

1. 导致问题的原因:在商品详情数据请求回来之前,data 中 goods_info 的值为 {} ,因此初次 渲染页面时,会导致 商品价格、商品名称 等闪烁的问题。

2. 解决方案:判断 goods_info.goods_name 属性的值是否存在,从而使用 v-if 指令控制页面 的显示与隐藏:

渲染详情页底部的商品导航区域

渲染商品导航区域的 UI 结构

基于 uni-ui 提供的 GoodsNav 组件来实现商品导航区域的效果

 1. 在 data 中,通过 options 和 buttonGroup 两个数组,来声明商品导航组件的按钮配置对 象:

// 左侧按钮组的配置对象
        options: [{
          icon: 'shop',
          text: '店铺'
        }, {
          icon: 'cart',
          text: '购物车',
          info: 2
        }],
        // 右侧按钮组的配置对象
        buttonGroup: [{
            text: '加入购物车',
            backgroundColor: '#ff0000',
            color: '#fff'
          },
          {
            text: '立即购买',
            backgroundColor: '#ffa200',
            color: '#fff'
          }
        ]

2. 在页面中使用 uni-goods-nav 商品导航组件:

    <view class="goods_nav">
      <!-- fill 控制右侧按钮的样式 -->
      <!-- options 左侧按钮的配置项 -->
      <!-- buttonGroup 右侧按钮的配置项 -->
      <!-- click 左侧按钮的点击事件处理函数 -->
      <!-- buttonClick 右侧按钮的点击事件处理函数 -->
      <uni-goods-nav :fill="true" :options="options" :buttonGroup="buttonGroup" @click="onClick"
        @buttonClick="buttonClick" />
    </view>

3. 美化商品导航组件,使之固定在页面最底部:

  .goods-detail-container {
    // 给页面外层的容器,添加 50px 的内padding,
    // 防止页面内容被底部的商品导航组件遮盖
    padding-bottom: 50px;
  }

  .goods_nav {
    // 为商品导航组件添加固定定位
    position: fixed;
    bottom: 0;
    left: 0;
    width: 100%;
  }

点击跳转到购物车页面

 2. 根据 e.content.text 的值,来决定进一步的操作:

// 左侧按钮的点击事件处理函数
      onClick(e) {
        if (e.content.text === '购物车') {
          // 切换到购物车页面
          uni.switchTab({
            url: '/pages/cart/cart'
          })
        }
      }

分支的合并与提交

加入购物车

分支创建

git checkout -b cart

配置vuex

1.在项目根目录中创建store文件夹,专门存放vuex相关的模块.

2.在store目录上鼠标右键,选择新建js文件,新建store.js文件.

3. 在 store.js 中按照如下 4 个步骤初始化 Store 的实例对象:

这里是vue2的初始化方法

// 1. 导入 Vue 和 Vuex
import Vue from 'vue'
import Vuex from 'vuex'
// 2. 将 Vuex 安装为 Vue 的插件
Vue.use(Vuex)
// 3. 创建 Store 的实例对象
const store = new Vuex.Store({
  // TODO:挂载 store 模块
  modules: {},
})
// 4. 向外共享 Store 的实例对象
export default store

这里是vue3的初始化方法, byd,这里不同的初始化方法是真的麻烦,差点就重新创建项目了

// 1. 导入 Vue 和 Vuex
import { createStore } from 'vuex'
import moduleCart from './cart.js'

// 2. 创建 Store 的实例对象
const store = createStore({
  modules: {
    m_cart: moduleCart,
  },
})

// 3. 向外共享 Store 的实例对象
export default store

4. 在 main.js 中导入 store 实例对象并挂载到 Vue 的实例上:

下面是uniapp中提供的两种初始化,,所以我也加上了在vue3中的挂载方式。

// #ifndef VUE3 
import store from './store/store.js'
import Vue from 'vue'
import App from './App'
Vue.config.productionTip = false

App.mpType = 'app'

const app = new Vue({
  store
  ...App,
})
app.$mount()
// #endif



//_______________________________________________


// #ifdef VUE3
import {
  createSSRApp
} from 'vue'
import App from './App.vue'
import store from './store/store.js'
export function createApp() {
  const app = createSSRApp(App)
  app.use(store)
  return {
    app,
  }
}
// #endif

创建购物车的store模块

1. 在 store 目录上鼠标右键,选择 新建 -> js文件 ,创建购物车的 store 模块,命名为 cart.js :

2. 在 cart.js 中,初始化如下的 vuex 模块:

export default {
  // 为当前模块开启命名空间
  namespaced: true,
  // 模块的 state 数据
  state: () => ({
      // 购物车的数组,用来存储购物车中每个商品的信息对象
      // 每个商品的信息对象,都包含如下 6 个属性:
      // { goods_id, goods_name, goods_price, goods_count,
      goods_small_logo,
      goods_state
    }
    cart: [],
  }),
// 模块的 mutations 方法
mutations: {},
  // 模块的 getters 属性
  getters: {},
}

3. 在 store/store.js 模块中,导入并挂载购物车的 vuex 模块,示例代码如下:

import Vue from 'vue'
import Vuex from 'vuex'
// 1. 导入购物车的 vuex 模块
import moduleCart from './cart.js'
Vue.use(Vuex)
const store = new Vuex.Store({
// TODO:挂载 store 模块
modules: {
// 2. 挂载购物车的 vuex 模块,模块内成员的访问路径被调整为 m_cart,例如:
// 购物车模块中 cart 数组的访问路径是 m_cart/cart
m_cart: moduleCart,
},
})
export default store

在商品详情页中使用 Store 中的数据

1. 在 goods_detail.vue 页面中,修改 标签中的代码如下:

    // 从 vuex 中按需导出 mapState 辅助方法
    import {
      mapState
    } from 'vuex'
    export default {
      computed: {
        // 调用 mapState 方法,把 m_cart 模块中的 cart 数组映射到当前页面中,作为计算
        属性来使用
        // ...mapState('模块的名称', ['要映射的数据名称1', '要映射的数据名称2'])
        ...mapState('m_cart', ['cart']),
      },
      // 省略其它代码...
    }

实现加入购物车的功能

1. 在 store 目录下的 cart.js 模块中,封装一个将商品信息加入购物车的 mutations 方法,命名 为 addToCart 。示例代码如下:

export default {
  // 为当前模块开启命名空间
  namespaced: true,
  // 模块的 state 数据
  state: () => ({
      // 购物车的数组,用来存储购物车中每个商品的信息对象
      // 每个商品的信息对象,都包含如下 6 个属性:
      // { goods_id, goods_name, goods_price, goods_count,
      goods_small_logo,
      goods_state
    }
    cart: [],
  }),
// 模块的 mutations 方法
mutations: {
    addToCart(state, goods) {
      // 根据提交的商品的Id,查询购物车中是否存在这件商品
      // 如果不存在,则 findResult 为 undefined;否则,为查找到的商品信息对象
      const findResult = state.cart.find((x) => x.goods_id ===
        goods.goods_id)
      if (!findResult) {
        // 如果购物车中没有这件商品,则直接 push
        state.cart.push(goods)
      } else {
        // 如果购物车中有这件商品,则只更新数量即可
        findResult.goods_count++
      }
    },
  },
  // 模块的 getters 属性
  getters: {},
}

2. 在商品详情页面中,通过 mapMutations 这个辅助方法,把 vuex 中 m_cart 模块下的 addToCart 方法映射到当前页面:

  // 按需导入 mapMutations 这个辅助方法
  import {
    mapMutations
  } from 'vuex'
  export default {
    methods: {
      // 把 m_cart 模块中的 addToCart 方法映射到当前页面使用
      ...mapMutations('m_cart', ['addToCart']),
    },
  }

3. 为商品导航组件 uni-goods-nav 绑定 @buttonClick="buttonClick" 事件处理函数:

// 右侧按钮的点击事件处理函数
      buttonClick(e) {
        // 1. 判断是否点击了 加入购物车 按钮
        if (e.content.text === '加入购物车') { // 2. 组织一个商品的信息对象
          const goods = {
            goods_id: this.goods_info.goods_id, // 商品的Id
            goods_name: this.goods_info.goods_name, // 商品的名称
            goods_price: this.goods_info.goods_price, // 商品的价格
            goods_count: 1, // 商品的数量
            goods_small_logo: this.goods_info.goods_small_logo, // 商品的图片
            goods_state: true // 商品的勾选状态
          }
          console.log(goods)
          // 3. 通过 this 调用映射过来的 addToCart 方法,把商品信息对象存储到购物车中
          this.addToCart(goods)
        }
      },

动态统计购物车中商品的总数量

1. 在 cart.js 模块中,在 getters 节点下定义一个 total 方法,用来统计购物车中商品的 总数量:

  // 模块的 getters 属性
  getters: {
    // 统计购物车中商品的总数量
    total(state) {
      let c = 0
      // 循环统计商品的数量,累加到变量 c 中
      state.cart.forEach(goods => c += goods.goods_count)
      return c
    }
  },

2. 在商品详情页面的 script 标签中,按需导入 mapGetters 方法并进行使用:

  // 按需导入 mapGetters 这个辅助方法
  import {
    mapGetters
  } from 'vuex'
  export default {
    computed: {
      // 把 m_cart 模块中名称为 total 的 getter 映射到当前页面中使用
      ...mapGetters('m_cart', ['total']),
    },
  }

3. 通过 watch 侦听器,监听计算属性 total 值的变化,从而动态为购物车按钮的徽标赋值:

    watch: {
      // 1. 监听 total 值的变化,通过第一个形参得到变化后的新值
      total(newVal) {
        // 2. 通过数组的 find() 方法,找到购物车按钮的配置对象
        const findResult = this.options.find((x) => x.text === '购物车')
        if (findResult) {
          // 3. 动态为购物车按钮的 info 属性赋值
          findResult.info = newVal
        }
      },
    },

持久化存储购物车中的商品

2. 修改 mutations 节点中的 addToCart 方法,在处理完商品信息后,调用步骤 1 中定义的 saveToStorage 方法:

    addToCart(state, goods) {
      // 根据提交的商品的Id,查询购物车中是否存在这件商品
      // 如果不存在,则 findResult 为 undefined;否则,为查找到的商品信息对象
      const findResult = state.cart.find((x) => x.goods_id ===
        goods.goods_id)
      if (!findResult) {
        // 如果购物车中没有这件商品,则直接 push
        state.cart.push(goods)
        console.log(state.cart)
      } else {
        // 如果购物车中有这件商品,则只更新数量即可
        findResult.goods_count++
      }
      // 通过 commit 方法,调用 m_cart 命名空间下的 saveToStorage 方法
      this.commit('m_cart/saveToStorage')
    },

优化商品详情页的 total 侦听器

1. 使用普通函数的形式定义的 watch 侦听器,在页面首次加载后不会被调用。因此导致了商品详情 页在首次加载完毕之后,不会将商品的总数量显示到商品导航区域:

2. 为了防止这个上述问题,可以使用对象的形式来定义 watch 侦听器(详细文档请参考 Vue 官方的 watch 侦听器教程),示例代码如下:

    watch: {
      // 定义 total 侦听器,指向一个配置对象
      total: {
        // handler 属性用来定义侦听器的 function 处理函数
        handler(newVal) {
          const findResult = this.options.find(x => x.text === '购物车')
          if (findResult) {
            findResult.info = newVal
          }
        },
        // immediate 属性用来声明此侦听器,是否在页面初次加载完毕后立即调用
        immediate: true
      }
    },

动态为 tabBar 页面设置数字徽标

需求描述:从商品详情页面导航到购物车页面之后,需要为 tabBar 中的购物车动态设置数字徽 标。

将设置 tabBar 徽标的代码抽离为 mixins

注意:除了要在 cart.vue 页面中设置购物车的数字徽标,还需要在其它 3 个 tabBar 页面中,为购 物车设置数字徽标。

此时可以使用 Vue 提供的 mixins 特性,提高代码的可维护性。

1. 在项目根目录中新建 mixins 文件夹,并在 mixins 文件夹之下新建 tabbar-badge.js 文 件,用来把设置 tabBar 徽标的代码封装为一个 mixin 文件:

import {
  mapGetters
} from 'vuex'
// 导出一个 mixin 对象
export default {
  computed: {
    ...mapGetters('m_cart', ['total']),
  },
  onShow() {
    // 在页面刚展示的时候,设置数字徽标
    this.setBadge()
  },
  methods: {
    setBadge() {
      // 调用 uni.setTabBarBadge() 方法,为购物车设置右上角的徽标
      uni.setTabBarBadge({
        index: 2,
        text: this.total + '', // 注意:text 的值必须是字符串,不能是数字
      })
    },
  },
}

2. 修改 home.vue , cate.vue , cart.vue , my.vue 这 4 个 tabBar 页面的源代码,分别导 入 @/mixins/tabbar-badge.js 模块并进行使用: 

<script>
import tabbarBadge from '@/mixins/tabbar-badge.js';

export default {
  // 组件定义
  mixins: [tabbarBadge],
  // ...
}
</script>

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

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

相关文章

【Proteus仿真】【51单片机】多路温度控制系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用按键、LED、蜂鸣器、LCD1602、DS18B20温度传感器、HC05蓝牙模块等。 主要功能&#xff1a; 系统运行后&#xff0c;默认LCD1602显示前4路采集的温…

计算机msvcp140.dll重新安装的四个解决方法,专门解决dll文件丢失问题的方法

在我多年的电脑使用经历中&#xff0c;曾经遇到过一个非常棘手的问题&#xff0c;那就是电脑提示找不到msvcp140.dll文件。这个问题让我苦恼了很久&#xff0c;但最终还是找到了解决方法。今天&#xff0c;我就来分享一下我解决这个问题的四种方法&#xff0c;希望对大家有所帮…

Verilog 之 wire与reg 类型的变量

文章目录 reg 类型wire 类型总结默认情况下的input ,output 变量 在 Verilog 中&#xff0c;reg 和 wire 是用来声明变量或信号的关键字&#xff0c;它们有不同的特征和用途。 reg 类型 reg 类型用于表示寄存器变量。在 Verilog 中&#xff0c;reg 用于存储状态或时序逻辑&am…

dos命令bat结合任务计划程序自动执行py文件

效果 bat文件 run.bat @echo off call C:\ProgramData\Anaconda3\Scripts\activate.bat pytorch C:\ProgramData\Anaconda3\envs\pytorch\python.exe E:\Gerapy_py\gerapy\projects\xmtv\xmtv\start_urls.py下面这个bat文件可以用来判断py文件是否执行成功 @echo off call C…

代码随想录算法训练营|动态规划三十八天~四十三天

动态规划五部曲&#xff1a; 1、确定dp数组以及下标的含义 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、举例推导dp数组 三十八天 斐波那契数 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; public class Solution {public int MonotoneIncre…

基于Java+SpringBoot+Vue3+TypeScript前后端分离商城后台管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

Technology Strategy Patterns 学习笔记6-Communicating the Strategy-Approach Patterns

1 30-Second Answer 1.1 类似麦肯锡电梯谈话 Map an outline of three bullet points in your head, and then give the executives the simple, declarative, definitive answerAdd your three reasons or characterizations with your three bullet points also as high-le…

详解数据仓库之拉链表(原理、设计以及在Hive中的实现)

最近发现一本好书&#xff0c;读完感觉讲的非常好&#xff0c;首先安利给大家&#xff0c;国内第一本系统讲解数据血缘的书&#xff01;点赞&#xff01;近几天也会安排朋友圈点赞赠书活动(ง•̀_•́)ง 0x00 前言 本文将会谈一谈在数据仓库中拉链表相关的内容&#xff0c;包…

文件基础IO

1.先回忆一下c语言的文件接口&#xff1a; fopen,fwrite: 对应的代码如下&#xff1a; 注意fopen和fwrite的用法&#xff1a; 代码结果&#xff1a; 对应的strlen不需要1吗&#xff0c;不需要\0对应的是c语言的存储方式&#xff0c;和操作系统无关。 可以看到已经在对应的文…

使用3D Touch,让你左右逢源,操作更自然

本文介绍了如何在苹果设备上使用3D Touch&#xff0c;以及哪些应用程序支持该工具。3D Touch在Apple Watch上也称为Force Touch&#xff0c;在iPhone XR上也称为Haptic Touch。 如何改变3D触摸的灵敏度 按照以下步骤调整3D Touch的灵敏度&#xff1a; 1、打开“设置”应用程…

HTML5+CSS3+Vue小实例:输入框打字放大特效

实例:输入框打字放大特效 技术栈:HTML+CSSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&…

使用Nodejs搭建简单的Web网页并实现公网访问

目录 前言 1. 安装Node.js环境 2. 创建Node.js应用 3. 安装Cpolar内网穿透实现公网访问Nodejs服务 3.1 注册cpolar账号 3.2 下载cpolar客户端 3.3 创建隧道映射本地端口 4. 固定公网远程地址 前言 Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架…

翻译环境(编译和链接)(简单讲解,理解图就行)

前言 这是我们学习代码的最重要的一个知识点之一&#xff0c;因为我们要去运行一个代码并不是简单的去直接出结果&#xff0c;而是经过了很多我们看不到的步骤&#xff0c;我们在这里以C语言为例子在Linux的环境下讲解&#xff0c;大家没有学过Linux的不用担心&#xff0c;最后…

Maya 2024 for Mac(3D建模软件)

Maya 2024是一款三维计算机图形软件&#xff0c;具有强大的建模、动画、渲染、特效等功能&#xff0c;广泛应用于影视、游戏、广告等行业。以下是Maya 2024软件的主要功能介绍&#xff1a; 建模&#xff1a;Maya 2024具有强大的建模工具&#xff0c;包括多边形建模、曲面建模、…

功能强大的制作电子杂志网站,小白也可轻松上手

现在&#xff0c;越来越多的人开始关注电子杂志的制作&#xff0c;因为它不仅时尚&#xff0c;而且方便快捷。如果你是一个新手&#xff0c;想要制作一本属于自己的电子杂志&#xff0c;那么今天这个网站一定不能错过。它不仅功能强大&#xff0c;而且操作简单&#xff0c;小白…

Windows系统安装Redis、配置环境变量

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

【C++基础 】类和对象(上)

C基础 类和对象&#xff08;上&#xff09; 1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1 访问限定符4.2 封装 5.类的作用域6.类的实例化7.类对象模型7.1 如何计算类对象的大小7.2 类对象的存储方式猜测7.3 结构体内存对齐规则 8.this指针8.1 t…

非遗文化展示预约小程序的效果如何

漫漫历史长河&#xff0c;我国积累的各种非遗文化广而多&#xff0c;也有相应的机构整理展示和收录&#xff0c;区域限制下&#xff0c;传统非遗文化内容传播度并不高&#xff0c;实际线下查看了解的人也并不是很多&#xff0c;在实际展示方面也面临着一些难题&#xff1a; 线…

【Java面向对象编程(中)】- 探索封装的秘密

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:Java学习系列专栏&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 回顾 封装​编辑 为什么进行封装 ​​编辑​ 如何调用私有的变量 ​​编辑​ 1.get set方法(当形参和成员变量不同名时)​…

游戏平台采集数据

首先&#xff0c;你需要在你的项目中添加Kotlin的网络库&#xff0c;例如OkHttp。你可以在你的build.gradle文件中添加以下依赖&#xff1a; dependencies {implementation com.squareup.okhttp3:okhttp:4.9.0 }然后&#xff0c;你可以使用以下代码来创建一个基本的网络爬虫&a…