小程序-購物車-基于SKU電商規格組件實現

SKU 概念: 存貨單位( Stock Keeping Unit ), 庫存 管理的最小可用單元,通常稱為“單品”。
SKU 常見于電商領域,對于前端工程師而言,更多關注 SKU 算法 ,基于后端的 SKU 數據 渲染頁面 實現交互

SKU 模塊 - 下載 SKU 插件

DCloud 插件市場? 是 uni-app?官方插件生態集中地,有數千款插件

使用SKU插件:

組件安裝到自己的項目

注意事項:項目進行 git 提交時會校驗文件,可添加?/* eslint-disable */? 禁用檢查

<script>
/* eslint-disable */
// 省略組件源代碼
</script>

打開購物車彈框,渲染商品信息? ?goods.vue

<!-- SKU 彈窗組件 -->

? <vk-data-goods-sku-popup v-model="isShowSku" :localdata="localdata" />

// 是否顯示 SKU 組件

const isShowSku = ref(false)

// 商品信息

const localdata = ref({} as SkuPopupLocaldata)

//? 渲染商品信息

// 獲取商品詳情信息

const goods = ref<GoodsResult>()

const getGoodsByIdData = async () => {

? const res = await getGoodsByIdAPI(query.id)

? goods.value = res.result

? // SKU 組件所需格式

? localdata.value = {

? ? _id: res.result.id,

? ? name: res.result.name,

? ? goods_thumb: res.result.mainPictures[0],

? ? spec_list: res.result.specs.map((v) => {

? ? ? return {

? ? ? ? name: v.name,

? ? ? ? list: v.values,

? ? ? }

? ? }),

? ? sku_list: res.result.skus.map((v) => {

? ? ? return {

? ? ? ? _id: v.id,

? ? ? ? goods_id: res.result.id,

? ? ? ? goods_name: res.result.name,

? ? ? ? image: v.picture,

? ? ? ? price: v.price * 100, // 注意:需要乘以 100

? ? ? ? stock: v.inventory,

? ? ? ? sku_name_arr: v.specs.map((vv) => vv.valueName),

? ? ? }

? ? }),

? }

}

打開sku 彈窗? ? ? ?渲染商品

打開SKU彈窗? =》 設置按鈕模式? ? =》 微調組件樣式

<!-- SKU 彈窗組件 -->

? <vk-data-goods-sku-popup

? ? v-model="isShowSku"

? ? :localdata="localdata"

? ? :mode="mode"

? ? add-cart-background-color="#ffa868"

? ? buy-now-background-color="#27ba98"

? ? :active-style="{

? ? ? color: '#27ba9b',

? ? ? borderColor: '#27ba9b',

? ? ? backgroundCColor: '#e9f8f5',

? ? }"

? />

// mode? 設置按鈕模式

//?add-cart-background-color? ?設置即入購物車按鈕背景色

//?buy-now-background-color? ?設置立即購買按鈕背景色

//?:active-style? 選擇商品規格時的激活樣式

// 按鈕模式? ? ? ?枚舉

enum SkuMode {

? Both = 1, // 購物車和立即購買都顯示

? Cart = 2, // 只顯示購物車

? Buy = 3, // 只顯示立即購買

}

const mode = ref<SkuMode>(SkuMode.Both)

// 打開sku 彈窗 修改按鈕模式

const openSkuPopup = (val: SkuMode) => {

? // 顯示sku組件

? isShowSku.value = true

? // 修改按鈕模式

? mode.value = val

}

<view class="item arrow" @tap="openSkuPopup(SkuMode.Both)">

? ? ? ? ? <text class="label">選擇</text>

? ? ? ? ? <text class="text ellipsis"> 請選擇商品規格 </text>

</view>

<view class="buttons">

? ? ? <view class="addcart" @tap="openSkuPopup(SkuMode.Cart)"> 加入購物車 </view>

? ? ? <view class="buynow" @tap="openSkuPopup(SkuMode.Buy)"> 立即購買 </view>

</view>

加入購物車事件? ? ? ? 加入購物車在商品詳情頁面? ? ? ?goods.vue

<!-- SKU 彈窗組件 -->

? <vk-data-goods-sku-popup

? ? v-model="isShowSku"

? ? :localdata="localdata"

? ? :mode="mode"

? ? add-cart-background-color="#ffa868"

? ? buy-now-background-color="#27ba9b"

? ? ref="skuPopupRef"

? ? :actived-style="{

? ? ? color: '#27BA9B',

? ? ? borderColor: '#27BA9B',

? ? ? backgroundColor: '#E9F8F5',

? ? }"

? ? @add-cart="onAddCart"

? />

// 加入購物車事件

const onAddCart = (e: SkuPopupEvent) => {

? console.log(e)

}

控制臺打印數據

封裝購物車接口:cart.ts

1、加入購物車接口封裝

import { http } from "@/utils/http"

/**

?* 加入購物車

?* @param data 請求體參數

?* @returns

?*/

export const postMemberCartAPI = (data: { skuId: string; count: number}) => {

? return http({

? ? method: 'POST',

? ? url: '/member/cart',

? ? data,

? })

}

完善商品詳情頁面的加入購物車功能

// 加入購物車事件

const onAddCart = async (e: SkuPopupEvent) => {

? console.log(e)

? await postMemberCartAPI({ skuId: e._id, count: e.buy_num })

? uni.showToast({ icon: 'success', title: '已加入購物車' })

? // 關閉彈窗

? isShowSku.value = false

}

完整的商品詳情頁面代碼:goods.vue

<script setup lang="ts">
import { onLoad } from '@dcloudio/uni-app'
import { ref, computed } from 'vue'
import { getGoodsByIdAPI } from '@/services/goods'
import { postMemberCartAPI } from '@/services/cart'
import type { GoodsResult } from '@/types/goods'
import AddressPanel from './components/AddressPanel.vue'
import ServicePanel from './components/ServicePanel.vue'
import PageSkeleton from './components/PageSkeleton.vue'
import type {SkuPopupEvent,SkuPopupInstanceType,SkuPopupLocaldata,
} from '@/components/vk-data-goods-sku-popup/vk-data-goods-sku-popup'// 獲取屏幕邊界到安全區域距離
const { safeAreaInsets } = uni.getSystemInfoSync()// 接收頁面參數
const query = defineProps<{id: string
}>()// 獲取商品詳情信息
const goods = ref<GoodsResult>()
const getGoodsByIdData = async () => {const res = await getGoodsByIdAPI(query.id)goods.value = res.result// SKU 組件所需格式localdata.value = {_id: res.result.id,name: res.result.name,goods_thumb: res.result.mainPictures[0],spec_list: res.result.specs.map((v) => {return {name: v.name,list: v.values,}}),sku_list: res.result.skus.map((v) => {return {_id: v.id,goods_id: res.result.id,goods_name: res.result.name,image: v.picture,price: v.price * 100, // 注意:需要乘以 100stock: v.inventory,sku_name_arr: v.specs.map((vv) => vv.valueName),}}),}
}// 是否數據加載完成
const isFinish = ref(false)// 頁面加載
onLoad(async () => {await getGoodsByIdData()isFinish.value = true
})// 輪播圖變化時
const currentIndex = ref(0)
const onChange: UniHelper.SwiperOnChange = (e) => {currentIndex.value = e.detail!.current
}// 點擊圖片時
const onTapImage = (url: string) => {// 大圖預覽uni.previewImage({current: url, // 當前顯示圖片的鏈接urls: goods.value!.mainPictures, // 需要預覽的圖片鏈接列表  數組})
}
// uni-ui  彈出層組件 ref
const popup = ref<{open: (type?: UniHelper.UniPopupType) => voidclose: (type?: UniHelper.UniPopupType) => void
}>()// 彈出層渲染
const popupName = ref<'address' | 'service'>()
const openPopup = (name: typeof popupName.value) => {// 修改彈出層名稱popupName.value = namepopup.value?.open()
}// 是否顯示 SKU 組件
const isShowSku = ref(false)
// 商品信息
const localdata = ref({} as SkuPopupLocaldata)
// 按鈕模式
enum SkuMode {Both = 1, // 購物車和立即購買都顯示Cart = 2, // 只顯示購物車Buy = 3, // 只顯示立即購買
}
const mode = ref<SkuMode>(SkuMode.Both)
// 打開sku 彈窗 修改按鈕模式
const openSkuPopup = (val: SkuMode) => {// 顯示sku組件isShowSku.value = true// 修改按鈕模式mode.value = val
}
// SKU組件實例
const skuPopupRef = ref<SkuPopupInstanceType>()// 計算被選中的值
const selectArrText = computed(() => {return skuPopupRef.value?.selectArr?.join(' ').trim() || '請選擇商品規格'
})
// 加入購物車事件
const onAddCart = async (e: SkuPopupEvent) => {console.log(e)await postMemberCartAPI({ skuId: e._id, count: e.buy_num })uni.showToast({ icon: 'success', title: '已加入購物車' })// 關閉彈窗isShowSku.value = false
}
</script><template><!-- SKU 彈窗組件 --><vk-data-goods-sku-popupv-model="isShowSku":localdata="localdata":mode="mode"add-cart-background-color="#ffa868"buy-now-background-color="#27ba9b"ref="skuPopupRef":actived-style="{color: '#27BA9B',borderColor: '#27BA9B',backgroundColor: '#E9F8F5',}"@add-cart="onAddCart"/><scroll-view scroll-y class="viewport" v-if="isFinish"><!-- 基本信息 --><view class="goods"><!-- 商品主圖 --><view class="preview"><swiper circular @change="onChange"><swiper-item v-for="item in goods?.mainPictures" :key="item"><image @tap="onTapImage(item)" mode="aspectFill" :src="item" /></swiper-item></swiper><view class="indicator"><text class="current">{{ currentIndex + 1 }}</text><text class="split">/</text><text class="total">{{ goods?.mainPictures.length }}</text></view></view><!-- 商品簡介 --><view class="meta"><view class="price"><text class="symbol">¥</text><text class="number">{{ goods?.price }}</text></view><view class="name ellipsis">{{ goods?.name }} </view><view class="desc"> {{ goods?.desc }} </view></view><!-- 操作面板 --><view class="action"><view class="item arrow" @tap="openSkuPopup(SkuMode.Both)"><text class="label">選擇</text><text class="text ellipsis"> {{ selectArrText }} </text></view><view class="item arrow" @tap="openPopup('address')"><text class="label">送至</text><text class="text ellipsis"> 請選擇收獲地址 </text></view><view class="item arrow" @tap="openPopup('service')"><text class="label">服務</text><text class="text ellipsis"> 無憂退 快速退款 免費包郵 </text></view></view></view><!-- 商品詳情 --><view class="detail panel"><view class="title"><text>詳情</text></view><view class="content"><view class="properties"><!-- 屬性詳情 --><view class="item" v-for="item in goods?.details.properties" :key="item.name"><text class="label">{{ item.name }}</text><text class="value">{{ item.value }}</text></view></view><!-- 圖片詳情 --><imagev-for="item in goods?.details.pictures":key="item"mode="widthFix":src="item"></image></view></view><!-- 同類推薦 --><view class="similar panel"><view class="title"><text>同類推薦</text></view><view class="content"><navigatorv-for="item in goods?.similarProducts":key="item"class="goods"hover-class="none":url="`/pages/goods/goods?id=${item.id}`"><image class="image" mode="aspectFill" :src="item.picture"></image><view class="name ellipsis">{{ item.name }}</view><view class="price"><text class="symbol">¥</text><text class="number">{{ item.price }}</text></view></navigator></view></view></scroll-view><PageSkeleton v-else /><!-- 用戶操作 --><view class="toolbar" :style="{ paddingBottom: safeAreaInsets?.bottom + 'px' }"><view class="icons"><button class="icons-button"><text class="icon-heart"></text>收藏</button><button class="icons-button" open-type="contact"><text class="icon-handset"></text>客服</button><navigator class="icons-button" url="/pages/cart/cart" open-type="switchTab"><text class="icon-cart"></text>購物車</navigator></view><view class="buttons"><view class="addcart" @tap="openSkuPopup(SkuMode.Cart)"> 加入購物車 </view><view class="buynow" @tap="openSkuPopup(SkuMode.Buy)"> 立即購買 </view></view></view><!-- uni-ui 彈出層 --><uni-popup ref="popup" type="bottom"><AddressPanel v-if="popupName === 'address'" @close="popup?.close()" /><ServicePanel v-if="popupName === 'service'" @close="popup?.close()" /></uni-popup>
</template>

購物車列表頁面:cart.vue

獲取登錄的用戶信息? -->? 條件渲染(是否登錄)? -->? 初始化調用? -->? 列表渲染

?

封裝購物車列表類型數據:cart.d.ts

/** 購物車類型 */

export type CartItem = {

? /** 商品 ID */

? id: string

? /** SKU ID */

? skuId: string

? /** 商品名稱 */

? name: string

? /** 圖片 */

? picture: string

? /** 數量 */

? count: number

? /** 加入時價格 */

? price: number

? /** 當前的價格 */

? nowPrice: number

? /** 庫存 */

? stock: number

? /** 是否選中 */

? selected: boolean

? /** 屬性文字 */

? attrsText: string

? /** 是否為有效商品 */

? isEffective: boolean

}

封裝購物車列表接口:cart.ts

import type { CartItem } from '@/types/cart';

import { http } from '@/utils/http'

/**

?* 獲取購物車列表數據

?* @returns

?*/

export const getMemberCartAPI = () => {

? return http<CartItem[]>({

? ? method: 'GET',

? ? url: '/member/cart',

? })

}

初始化調用:cart.vue

// 獲取購物車列表數據

const cartList = ref<CartItem>([])

const getMemberCartData = async () => {

? const res = await getMemberCartAPI()

? cartList.value = res.result

}

// onShow:頁面顯示就觸發 ? ? 頁面初始化調用 ?因為加入購物車不是在這個頁面的,所以用onShow調用更合適

onShow(() => {

? // 判斷用戶是否已經登錄了

? if (memberStore.profile) {

? ? getMemberCartData()

? }

})

刪除購物車列表中的商品:封裝API、按鈕綁定事件、彈窗二次確認、調用API、重新獲取列表

封裝購物車刪除API 接口:

/**

?* 刪除/清空購物車單品

?* @param data 請求體參數 ids SKUID 集合

?*/

export const deleteMemberCartAPI = (data: { ids: string[] }) => {

? return http({

? ? method: 'DELETE',

? ? url: '/member/cart',

? ? data,

? })

}

點擊刪除按鈕 - 刪除購物車商品? ?cart.vue

// 點擊刪除按鈕 - 刪除購物車

const onDeleteCart = (skuId: string) => {

? // 彈窗二次確認

? uni.showModal({

? ? content: '是否確定刪除?',

? ? success: async (res) => {

? ? ? if (res.confirm) {

? ? ? ? await deleteMemberCartAPI({ ids: [skuId] })

? ? ? ? // 更新購物車列表

? ? ? ? getMemberCartData()

? ? ? }

? ? },

? })

}

刪除成功

修改商品數量:步進器組件

<view class="count"><!-- <text class="text">-</text><input class="input" type="number" :value="item.count.toString()" /><text class="text">+</text> --><vk-data-input-number-boxv-model="item.count":min="1":max="item.stock":index="item.skuId"@change="onChangeCount"/></view>

封裝修改API

/**

?* 修改購物車單品

?* @param skuId SKUID

?* @param data selected 選中狀態 count 商品數量

?*/

export const putMemberCartBySkuIdAPI = ( skuId: string, data: { selected?: boolean; count?: number }) => {

? return http({

? ? method: 'PUT',

? ? url: `/member/cart/${skuId}`,

? ? data,

? })

}

修改方法:

// 修改商品數量

const onChangeCount = (e) => {

? console.log(e)

? putMemberCartBySkuIdAPI(e.index, { count: e.value })

}

修改商品的選中狀態,即單選和全選功能實現

            <!-- 選中狀態 --><text@tap="onChangeSelected(item)"class="checkbox":class="{ checked: item.selected }"></text>

封裝全選 / 取消全選API

/**

?* 購物車全選/取消全選

?* @param data selected 是否選中

?*/

export const putMemberCartSelectedAPI = (data: { selected: boolean }) => {

? return http({

? ? method: 'PUT',

? ? url: '/member/cart/selected',

? ? data,

? })

}

// 修改選中狀態? - 單選修改

const onChangeSelected = (good: CartItem) => {

? console.log(good)

// 前端數據更新 ?- 是否選中 取反

? good.selected = !good.selected

? // 后端數據更新? ? 與修改數量接口是同一條接口? 傳遞的參數不同

? putMemberCartBySkuIdAPI(good.skuId, { selected: good.selected })

}

// 計算全選狀態

const isSelectedAll = computed(() => {

? return cartList.value.length && cartList.value.every((v) => v.selected)

})

// 修改選中狀態-全選修改

const onChangeSelectedAll = () => {

? // 全選狀態取法

? const _isSelectedAll = !isSelectedAll.value

? // 前端數據更新

? cartList.value.forEach((item) => {

? ? item.selected = _isSelectedAll

? })

? // 后端更新

? putMemberCartSelectedAPI({ selected: _isSelectedAll })

}

購物車頁面 - 底部結算信息

<!-- 底部結算 -->

? ? ? <view class="toolbar">

? ? ? ? <text class="all" @tap="onChangeSelectedAll" :class="{ checked: isSelectedAll }">全選</text>

? ? ? ? <text class="text">合計:</text>

? ? ? ? <text class="amount">{{ selectedCartListMoney }}</text>

? ? ? ? <view class="button-grounp">

? ? ? ? ? <view

? ? ? ? ? ? @tap="gotoPayment"

? ? ? ? ? ? class="button payment-button"

? ? ? ? ? ? :class="{ disabled: selectedCartListCount === 0 }"

? ? ? ? ? >

? ? ? ? ? ? 去結算({{ selectedCartListCount }})

? ? ? ? ? </view>

? ? ? ? </view>

? ? ? </view>

邏輯實現:

// 計算選中的商品列表

const selectedCartList = computed(() => {

? return cartList.value.filter((v) => v.selected)

})

// 計算選中商品的總件數

const selectedCartListCount = computed(() => {

? return selectedCartList.value.reduce((sum, item) => sum + item.count, 0)

})

// 計算選中商品的總金額

const selectedCartListMoney = computed(() => {

? return selectedCartList.value

? ? .reduce((sum, item) => sum + item.count * item.nowPrice, 0)

? ? .toFixed(2)

})

// 去結算按鈕

const gotoPayment = () => {

? // 判斷用戶是否選擇了商品 ? ?即商品數量不能為 0

? if (selectedCartListCount.value === 0) {

? ? return uni.showToast({ icon: 'none', title: '請選擇商品' })

? }

? // 跳轉到計算頁面

? uni.showToast({ title: '此功能還未寫' })

}

完整的購物車列表頁面組件代碼:cart.vue

<script setup lang="ts">
import { onShow } from '@dcloudio/uni-app'
import { ref, computed } from 'vue'
import {deleteMemberCartAPI,getMemberCartAPI,putMemberCartBySkuIdAPI,putMemberCartSelectedAPI,
} from '@/services/cart'
import { useMemberStore } from '@/stores/index'
import type { CartItem } from '@/types/cart'
import type { InputNumberBoxEvent } from '@/components/vk-data-input-number-box/vk-data-input-number-box'// 獲取會員 Store
const memberStore = useMemberStore()// 獲取購物車列表數據
const cartList = ref<CartItem>([])
const getMemberCartData = async () => {const res = await getMemberCartAPI()cartList.value = res.result
}// onShow:頁面顯示就觸發      頁面初始化調用  因為加入購物車不是在這個頁面的,所以用onShow調用更合適
onShow(() => {// 判斷用戶是否已經登錄了if (memberStore.profile) {getMemberCartData()}
})// 點擊刪除按鈕 - 刪除購物車
const onDeleteCart = (skuId: string) => {// 彈窗二次確認uni.showModal({content: '是否確定刪除?',success: async (res) => {if (res.confirm) {await deleteMemberCartAPI({ ids: [skuId] })// 更新購物車列表getMemberCartData()}},})
}// 修改商品數量
const onChangeCount = (e: InputNumberBoxEvent) => {console.log(e)putMemberCartBySkuIdAPI(e.index, { count: e.value })
}// 修改選中狀態 - 單品修改
const onChangeSelected = (good: CartItem) => {console.log(good)// 前端數據更新  - 是否選中 取反good.selected = !good.selected// 后端數據更新putMemberCartBySkuIdAPI(good.skuId, { selected: good.selected })
}// 計算全選狀態
const isSelectedAll = computed(() => {return cartList.value.length && cartList.value.every((v) => v.selected)
})// 修改選中狀態-全選修改
const onChangeSelectedAll = () => {// 全選狀態取法const _isSelectedAll = !isSelectedAll.value// 前端數據更新cartList.value.forEach((item) => {item.selected = _isSelectedAll})// 后端更新putMemberCartSelectedAPI({ selected: _isSelectedAll })
}// 計算選中的商品列表
const selectedCartList = computed(() => {return cartList.value.filter((v) => v.selected)
})// 計算選中商品的總件數
const selectedCartListCount = computed(() => {return selectedCartList.value.reduce((sum, item) => sum + item.count, 0)
})// 計算選中商品的總金額
const selectedCartListMoney = computed(() => {return selectedCartList.value.reduce((sum, item) => sum + item.count * item.nowPrice, 0).toFixed(2)
})// 去結算按鈕
const gotoPayment = () => {// 判斷用戶是否選擇了商品    即商品數量不能為 0if (selectedCartListCount.value === 0) {return uni.showToast({ icon: 'none', title: '請選擇商品' })}// 跳轉到計算頁面uni.showToast({ title: '此功能還未寫' })
}
</script><template><scroll-view scroll-y class="scroll-view"><!-- 已登錄: 顯示購物車 --><template v-if="memberStore.profile.token"><!-- 購物車列表 --><view class="cart-list" v-if="cartList.length"><!-- 優惠提示 --><view class="tips"><text class="label">滿減</text><text class="desc">滿1件, 即可享受9折優惠</text></view><!-- 滑動操作分區 --><uni-swipe-action><!-- 滑動操作項 --><uni-swipe-action-item v-for="item in cartList" :key="item.skuId" class="cart-swipe"><!-- 商品信息 --><view class="goods"><!-- 選中狀態 --><text@tap="onChangeSelected(item)"class="checkbox":class="{ checked: item.selected }"></text><navigator:url="`/pages/goods/goods?id=${item.id}`"hover-class="none"class="navigator"><image mode="aspectFill" class="picture" :src="item.picture"></image><view class="meta"><view class="name ellipsis">{{ item.name }}</view><view class="attrsText ellipsis">{{ item.attrsText }}</view><view class="price">{{ item.nowPrice }}</view></view></navigator><!-- 商品數量 --><view class="count"><!-- <text class="text">-</text><input class="input" type="number" :value="item.count.toString()" /><text class="text">+</text> --><vk-data-input-number-boxv-model="item.count":min="1":max="item.stock":index="item.skuId"@change="onChangeCount"/></view></view><!-- 右側刪除按鈕 --><template #right><view class="cart-swipe-right"><button @tap="onDeleteCart(item.skuId)" class="button delete-button">刪除</button></view></template></uni-swipe-action-item></uni-swipe-action></view><!-- 購物車空狀態 --><view class="cart-blank" v-else><image src="/static/images/blank_cart.png" class="image" /><text class="text">購物車還是空的,快來挑選好貨吧</text><navigator open-type="switchTab" url="/pages/index/index" hover-class="none"><button class="button">去首頁看看</button></navigator></view><!-- 吸底工具欄 --><view class="toolbar"><text class="all" @tap="onChangeSelectedAll" :class="{ checked: isSelectedAll }">全選</text><text class="text">合計:</text><text class="amount">{{ selectedCartListMoney }}</text><view class="button-grounp"><view@tap="gotoPayment"class="button payment-button":class="{ disabled: selectedCartListCount === 0 }">去結算({{ selectedCartListCount }})</view></view></view></template><!-- 未登錄: 提示登錄 --><view class="login-blank" v-else><text class="text">登錄后可查看購物車中的商品</text><navigator url="/pages/login/login" hover-class="none"><button class="button">去登錄</button></navigator></view><!-- 猜你喜歡 --><Guess ref="guessRef"></XtxGuess><!-- 底部占位空盒子 --><view class="toolbar-height"></view></scroll-view>
</template>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15578.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(二)vForm 動態表單設計器之下拉、選擇

系列文章目錄 &#xff08;一&#xff09;vForm 動態表單設計器之使用 目錄 系列文章目錄 前言 一、后端需提供接口 二、組件配置 總結 前言 動態表單下拉、選擇等組件&#xff0c;大概率要使用數據庫中的數據&#xff0c;那么vForm如何拿到數據庫中的數據呢&#xff1f;跟隨…

僵尸進程、孤兒進程、守護進程

【一】僵尸進程和孤兒進程 【1】引入 我們知道在unix/linux中&#xff0c;正常情況下&#xff0c;子進程是通過父進程創建的&#xff0c;子進程在創建新的進程。 子進程的結束和父進程的運行是一個異步過程,即父進程永遠無法預測子進程 到底什么時候結束。 當一個 進程完成它…

動物合并消除休閑游戲源碼 Animal Merge 益智游戲

一款動物合并消除休閑游戲源碼&#xff0c;Animal Merge是一款引人入勝的益智游戲&#xff0c;玩家的任務是合并方塊&#xff0c;創造出可愛的動物&#xff0c;這些動物的體型會逐漸變大。游戲玩法包括將方塊放到網格上&#xff0c;并戰略性地將它們合并以形成更大的動物形狀。…

作文筆記9 描寫方法

動態描寫&#xff1a; 威尼斯小艇&#xff0c;窗外的風景飛快的后退。 靜態描寫&#xff1a; 牧場之國&#xff0c;牛不再哞哞&#xff0c;馬忘記了踢馬房的擋板。 動靜結合&#xff1a; 火車進站&#xff0c;人聲鼎沸&#xff0c;叫賣聲&#xff0c;廣播聲&#xff0c;人…

【408精華知識】主存相關解題套路大揭秘!

講完了Cache&#xff0c;再來講講主存是怎么考察的&#xff0c;我始終認為&#xff0c;一圖勝千言&#xff0c;所以對于很多部件&#xff0c;我都是通過畫圖進行形象的記憶&#xff0c;那么接下來我們對主存也畫個圖&#xff0c;然后再來詳細解讀其考察套路~ 文章目錄 零、主存…

機器人正逆運動學、動力學概念

1.基本概念 建立機器人的正逆運動學和正逆動力學模型是為了解決不同類型的控制和規劃問題。這些模型幫助工程師和研究人員理解和預測機器人的行為&#xff0c;從而設計出更有效的控制策略和運動規劃。以下是建立這些模型的主要原因和一些應用實例&#xff1a; 正運動學模型 正…

python-pytorch 下批量seq2seq+Bahdanau Attention實現問答1.0.000

python-pytorch 下批量seq2seq+Bahdanau Attention實現簡單問答1.0.000 前言原理看圖數據準備分詞、index2word、word2index、vocab_size輸入模型的數據構造注意力模型decoder的編寫關于損失函數和優化器在預測時完整代碼參考前言 前面實現了 luong的dot 、general、concat注意…

【話題】我眼神的IT行業現狀與未來趨勢

目錄 一、挑戰 教學資源的重新分配 教師角色的轉變 學生學習方式的改變 教育評價體系的挑戰 二、機遇 個性化學習 跨學科學習 國際合作與交流 創新教育模式 三、如何培養下一代IT專業人才 更新教育理念 加強基礎設施建設 整合課程資源 加強實踐教學 培養跨學科…

easy-es EsAutoConfiguration RestHighLevelClient 沒有自動注入配置

我用的easy-es.version 是 2.0.0-beta1&#xff0c;是基于springboot2開發的&#xff0c;自動注入配置的目錄掃描的是META-INF/spring.factories文件&#xff1b;而我使用的框架是springboot3&#xff0c;springboot3掃描的是META-INF/spring/org.springframework.boot.autocon…

【算法刷題day57】Leetcode:739. 每日溫度、496.下一個更大元素 I

文章目錄 Leetcode 739. 每日溫度解題思路代碼總結 Leetcode 496.下一個更大元素 I解題思路代碼總結 草稿圖網站 java的Deque Leetcode 739. 每日溫度 題目&#xff1a;739. 每日溫度 解析&#xff1a;代碼隨想錄解析 解題思路 維護一個單調棧&#xff0c;當新元素大于棧頂&a…

【Linux】TCP協議【中】{確認應答機制/超時重傳機制/連接管理機制}

文章目錄 1.確認應答機制2.超時重傳機制&#xff1a;超時不一定是真超時了3.連接管理機制 1.確認應答機制 TCP協議中的確認應答機制是確保數據可靠傳輸的關鍵部分。以下是該機制的主要步驟和特點的詳細解釋&#xff1a; 數據分段與發送&#xff1a; 發送方將要發送的數據分成一…

vue深度選擇器(:deep?)

處于 scoped 樣式中的選擇器如果想要做更“深度”的選擇&#xff0c;也即&#xff1a;影響到子組件&#xff0c;可以使用 :deep() 這個偽類&#xff1a; <style lang"scss" scoped> .evaluation-situation-details :deep .cl-icon-arrow-right {display: none…

【Python 對接QQ的接口(二)】簡單用接口查詢【等級/昵稱/頭像/Q齡/當天在線時長/下一個等級升級需多少天】

文章日期&#xff1a;2024.05.25 使用工具&#xff1a;Python 類型&#xff1a;QQ接口 文章全程已做去敏處理&#xff01;&#xff01;&#xff01; 【需要做的可聯系我】 AES解密處理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 標準算法&#xff09;&…

JS根據所選ID數組在源數據中取出對象

let selectIds [1, 3] // 選中id數組let allData [{ id: 1, name: 123 },{ id: 2, name: 234 },{ id: 3, name: 345 },{ id: 4, name: 456 },] // 源數據let newList [] // 最終數據selectIds.map((i) > {allData.filter((item) > {item.id i && newList.pus…

websocket的壓縮和wireshark如何解碼tls

1. websocket的壓縮 見Compression EXPERIMENTAL那一節。 官方文檔&#xff1a;gorilla/websocket 2. 如何wireshark如何解碼tls 下文中代碼中去掉sudo。正常執行 Mac電腦安裝配置Wireshark 抓包工具&#xff0c;解決Https無法抓包問題_mac winshark抓不到-CSDN博客 如果…

aws sqs基礎概念和隊列參數解析

分布式隊列的組成部分 生產者&#xff0c;向隊列發送消息的組件消費者&#xff0c;接受隊列消息隊列&#xff0c;多個sqs服務器存儲冗余存儲消息 sqs自動刪除超過最大留存時間的消息&#xff08;默認4天&#xff09;&#xff0c;可以通過SetQueueAttributes調整為&#xff08…

【408真題】2009-13

“接”是針對題目進行必要的分析&#xff0c;比較簡略&#xff1b; “化”是對題目中所涉及到的知識點進行詳細解釋&#xff1b; “發”是對此題型的解題套路總結&#xff0c;并結合歷年真題或者典型例題進行運用。 涉及到的知識全部來源于王道各科教材&#xff08;2025版&…

JMH 微基準測試(性能測試)

寫本文主要是簡單記錄一下JMH的使用方式。JMH全名是Java Microbenchmark Harness&#xff0c;主要為在jvm上運行的程序進行基準測試的工具。作為一個開發人員&#xff0c;在重構代碼&#xff0c;或者確認功能的性能時&#xff0c;可以選中這個工具。 本文場景&#xff1a;代碼重…

VBA即用型代碼手冊:刪除Excel中空白行Delete Blank Rows in Excel

我給VBA下的定義&#xff1a;VBA是個人小型自動化處理的有效工具。可以大大提高自己的勞動效率&#xff0c;而且可以提高數據的準確性。我這里專注VBA,將我多年的經驗匯集在VBA系列九套教程中。 作為我的學員要利用我的積木編程思想&#xff0c;積木編程最重要的是積木如何搭建…

IDEA中好用的插件

IDEA中好用的插件 CodeGeeXMybatis Smart Code Help ProAlibaba Java Coding Guidelines?(XenoAmess TPM)?通義靈碼常用操作 TranslationStatistic CodeGeeX 官網地址&#xff1a;https://codegeex.cn/ 使用手冊&#xff1a;https://zhipu-ai.feishu.cn/wiki/CuvxwUDDqiErQU…