移动端加入购物车界面设计

news2024/11/17 21:35:07

效果图

 

 源码如下

页面设计

<template>
  <div class="container">
    <!--商品详情 start-->
    <van-image class="goods-item-image" :src="goods.goodsHeadImg"></van-image>
    <div class="goods-price">
      ¥<span>{{ goods.goodsPrice }}</span>.00起
    </div>
    <div class="goods-name">
      <el-button round size="small">{{ goods.goodsBrand.goodsBrandName }}</el-button>
      <span>{{ goods.goodsName }}</span>
      <span>{{ goods.goodsCaption }}</span>
    </div>
    <div class="goods-introduction">
      <el-input style="width: 100%;" type="textarea" autosize v-model="goods.goodsIntroduction"></el-input>
      <!--      <el-text>{{ goods.goodsIntroduction }}</el-text>-->
    </div>
    <div class="goods-images" v-for="(img,imgIndex) in goods.images" :key="imgIndex">
      <van-image class="goods-item-image" :src="img.goodsImageUrl"></van-image>
    </div>
    <!--商品详情 end-->

    <!--底部导航 start-->
    <van-action-bar style="margin-bottom: 50px ">
      <van-action-bar-icon icon="chat-o" text="客服" badge="12"/>
      <van-action-bar-icon icon="cart-o" text="购物车" badge="6" @click="onCartShow"/>
      <van-action-bar-icon icon="shop-o" text="店铺" badge="5"/>
      <van-action-bar-button type="warning" text="加入购物车" @click="onAddCartShow"/>
      <van-action-bar-button type="danger" text="立即购买"/>
    </van-action-bar>
    <!--底部导航 end-->

    <!--加入购物车弹出框 end-->
    <van-popup v-model:show="showCart" position="bottom" closeable>
      <div class="add-cart-show">
        <!--顶部 start-->
        <div class="add-header">
          <van-image class="add-goods-img" radius="10" :src="goods.goodsHeadImg"></van-image>
          <div class="add-goods-price">
            ¥<span>{{ goods.goodsPrice }}</span>
          </div>
        </div>
        <!--顶部 end-->
        <!--地址 start-->
        <AddressList class="add-address"/>
        <!--地址 end-->

        <!--规格 start-->
        <div class="add-goods-specification">
          <span class="goodsSpecificationName">{{ goods.specifications[0].goodsSpecificationName }}</span>
          <el-radio-group v-for="(o,index2) in goods.specifications[0].goodsSpecificationOptions" :key="index2"
                          direction="horizontal"
                          v-model="radio1" fill="#018cel" text-color="#ffffff">
            <el-radio-button class="goodsSpecificationOption"
                             :label="o.goodsSpecificationOptionName"></el-radio-button>
          </el-radio-group>
          <span v-if="goods.specifications[1]"
                class="goodsSpecificationName">{{ goods.specifications[1].goodsSpecificationName }}</span>
          <el-radio-group v-if="goods.specifications[1]"
                          v-for="(o,index2) in goods.specifications[1].goodsSpecificationOptions" :key="index2"
                          direction="horizontal"
                          v-model="radio2" fill="#018cel" text-color="#ffffff">
            <el-radio-button class="goodsSpecificationOption"
                             :label="o.goodsSpecificationOptionName"></el-radio-button>
          </el-radio-group>
          <span v-if="goods.specifications[2]"
                class="goodsSpecificationName">{{ goods.specifications[2].goodsSpecificationName }}</span>
          <el-radio-group v-if="goods.specifications[2]"
                          v-for="(o,index2) in goods.specifications[2].goodsSpecificationOptions" :key="index2"
                          direction="horizontal"
                          v-model="radio3" fill="#018cel" text-color="#ffffff">
            <el-radio-button class="goodsSpecificationOption"
                             :label="o.goodsSpecificationOptionName"></el-radio-button>
          </el-radio-group>
          <span v-if="goods.specifications[3]"
                class="goodsSpecificationName">{{ goods.specifications[3].goodsSpecificationName }}</span>
          <el-radio-group v-if="goods.specifications[3]"
                          v-for="(o,index2) in goods.specifications[3].goodsSpecificationOptions" :key="index2"
                          direction="horizontal"
                          v-model="radio4" fill="#018cel" text-color="#ffffff">
            <el-radio-button class="goodsSpecificationOption"
                             :label="o.goodsSpecificationOptionName"></el-radio-button>
          </el-radio-group>
          <span v-if="goods.specifications[4]"
                class="goodsSpecificationName">{{ goods.specifications[4].goodsSpecificationName }}</span>
          <el-radio-group v-if="goods.specifications[4]"
                          v-for="(o,index2) in goods.specifications[4].goodsSpecificationOptions" :key="index2"
                          direction="horizontal"
                          v-model="radio5" fill="#018cel" text-color="#ffffff">
            <el-radio-button class="goodsSpecificationOption"
                             :label="o.goodsSpecificationOptionName"></el-radio-button>
          </el-radio-group>
          <span v-if="goods.specifications[5]"
                class="goodsSpecificationName">{{ goods.specifications[5].goodsSpecificationName }}</span>
          <el-radio-group v-if="goods.specifications[5]"
                          v-for="(o,index2) in goods.specifications[5].goodsSpecificationOptions" :key="index2"
                          direction="horizontal"
                          v-model="radio6" fill="#018cel" text-color="#ffffff">
            <el-radio-button class="goodsSpecificationOption"
                             :label="o.goodsSpecificationOptionName"></el-radio-button>
          </el-radio-group>
        </div>
        <!--规格 end-->

        <!--底部 start-->
        <el-button class="add-goods-button" size="large" color="#ff9003" round @click="onAddCart">加入购物车</el-button>
        <!--底部 end-->
      </div>
    </van-popup>
    <!--加入购物车弹出框 end-->

  </div>
</template>

逻辑编写

<script setup>
import {onMounted, reactive, ref} from "vue";
import axios from "@/utils/request"
import {useRoute, useRouter} from "vue-router"
import {useDataStore} from "../../stores/dataStore"
import AddressList from "../../components/AddressList/Index.vue"
import {showSuccessToast} from 'vant';

const router = useRouter()
const dataStore = useDataStore()

const route = useRoute()
//单选框选中的规格数据
const radio1 = ref("")
const radio2 = ref("")
const radio3 = ref("")
const radio4 = ref("")
const radio5 = ref("")
const radio6 = ref("")
//加入购物车弹出框控制器
const showCart = ref(false)
//商品id
const goodsId = route.params.name
//商品数据
const goods = reactive({
  goodsId: "",
  goodsHeadImg: "",
  goodsName: "",
  goodsCaption: "",
  goodsPrice: "",
  goodsIntroduction: "",
  goodsUse: "",
  goodsBrand: "",
  goodsType1: "",
  goodsType2: "",
  goodsType3: "",
  images: "",
  specifications: ""
})
onMounted(() => {
  axios.get("front/goods/findDesc", {
    params: {
      goodsId: goodsId
    }
  }).then(res => {
    if (res.data.code == 200) {
      goods.goodsId = res.data.data.goodsId
      goods.goodsHeadImg = res.data.data.goodsHeadImg
      goods.goodsName = res.data.data.goodsName
      goods.goodsCaption = res.data.data.goodsCaption
      goods.goodsPrice = res.data.data.goodsPrice
      goods.goodsIntroduction = res.data.data.goodsIntroduction
      goods.goodsUse = res.data.data.goodsUse
      goods.goodsBrand = res.data.data.goodsBrand
      goods.goodsType1 = res.data.data.goodsType1
      goods.goodsType2 = res.data.data.goodsType2
      goods.goodsType3 = res.data.data.goodsType3
      goods.images = res.data.data.images
      goods.specifications = res.data.data.specifications
    }
  })
})
/**
 * 加入购物车弹出框
 */
const onAddCartShow = () => {
  if (!dataStore.isLogin) {
    router.push("/home/login")
  } else {
    showCart.value = true
  }
}
/**
 * 加入购物车
 */
const onAddCart = () => {
  axios.post("front/cart/addGoodsCart", {
    userId: dataStore.userId,
    goodsId: goodsId,
    goodsHeadImg: goods.goodsHeadImg,
    goodsName: goods.goodsName,
    goodsPrice: goods.goodsPrice,
    specificationContent: radio1.value + " " + radio2.value + " " + radio3.value + " " + radio4.value + " " + radio5.value + " " + radio6.value,
    num: 1,
  }).then(res => {
    if (res.data.code == 200) {
      showSuccessToast('加入成功');
      showCart.value = false
    }
  })
}
/**
 * 查看购物车
 */
const onCartShow = () => {
  router.push("/home/cart")
}
</script>

样式设计

<style scoped>
.container {
  background-color: #ffffff;
}

/**
商品数据样式
 */
.goods-price {
  margin-top: 10px;
  color: #ff4142;
}

.goods-price span {
  font-style: normal;
  font-family: JDZH-Regular, sans-serif;
  display: inline-block;
  font-size: 22px;
  font-weight: 500;
  line-height: normal;
  color: #f44d0b;
}

.goods-name {
  font-size: 21px;
  color: #181818;
  font-family: JDZH-Regular, sans-serif;
}

.goods-name button {
  margin: 4px;
  display: inline;
  color: #fdfdff;
  font-weight: 400;
  background-color: #fe012d;
}

.goods-introduction {
  background-color: #f9f9f9;
  font-size: 12px;
  margin-top: 10px;
  margin-bottom: 10px;
}


.goods-name span {
  margin-left: 5px;
  font-size: 16px;
  font-weight: bold;
}

/*
  加入购物车弹出框样式
*/
.add-cart-show {
  height: 600px;
}

.add-header {
  display: flex;
  left: 10px;
  background-color: #ffffff;

}

.add-goods-img {
  margin: 10px;
  width: 80px;
}

.add-goods-price {
  margin-left: 20px;
  margin-top: 35px;
  color: #ff4142;
  font-size: 15px;
}

.add-goods-price span {
  font-style: normal;
  font-family: JDZH-Regular, sans-serif;
  display: inline-block;
  font-size: 32px;
  font-weight: 500;
  line-height: normal;
  color: #f44d0b;
}

/**
地址
 */
.add-address {
  margin-top: 10px;
}

/**
规格
 */
.add-goods-specification {
  margin: 20px;
}

.goodsSpecificationName {
  display: block;
  line-height: 37px;
  color: #121212;
  font-size: 14px;
  font-weight: 700;
}

.goodsSpecificationOption {
  margin: 2px;
}

/**
底部
 */
.add-goods-button {
  position: fixed;
  bottom: 10px;
  left: 10px;
  width: 350px;
  color: #faf7e7;
  font-weight: 700;
}
</style>

全部代码

<template>
  <div class="container">
    <!--商品详情 start-->
    <van-image class="goods-item-image" :src="goods.goodsHeadImg"></van-image>
    <div class="goods-price">
      ¥<span>{{ goods.goodsPrice }}</span>.00起
    </div>
    <div class="goods-name">
      <el-button round size="small">{{ goods.goodsBrand.goodsBrandName }}</el-button>
      <span>{{ goods.goodsName }}</span>
      <span>{{ goods.goodsCaption }}</span>
    </div>
    <div class="goods-introduction">
      <el-input style="width: 100%;" type="textarea" autosize v-model="goods.goodsIntroduction"></el-input>
      <!--      <el-text>{{ goods.goodsIntroduction }}</el-text>-->
    </div>
    <div class="goods-images" v-for="(img,imgIndex) in goods.images" :key="imgIndex">
      <van-image class="goods-item-image" :src="img.goodsImageUrl"></van-image>
    </div>
    <!--商品详情 end-->

    <!--底部导航 start-->
    <van-action-bar style="margin-bottom: 50px ">
      <van-action-bar-icon icon="chat-o" text="客服" badge="12"/>
      <van-action-bar-icon icon="cart-o" text="购物车" badge="6" @click="onCartShow"/>
      <van-action-bar-icon icon="shop-o" text="店铺" badge="5"/>
      <van-action-bar-button type="warning" text="加入购物车" @click="onAddCartShow"/>
      <van-action-bar-button type="danger" text="立即购买"/>
    </van-action-bar>
    <!--底部导航 end-->

    <!--加入购物车弹出框 end-->
    <van-popup v-model:show="showCart" position="bottom" closeable>
      <div class="add-cart-show">
        <!--顶部 start-->
        <div class="add-header">
          <van-image class="add-goods-img" radius="10" :src="goods.goodsHeadImg"></van-image>
          <div class="add-goods-price">
            ¥<span>{{ goods.goodsPrice }}</span>
          </div>
        </div>
        <!--顶部 end-->
        <!--地址 start-->
        <AddressList class="add-address"/>
        <!--地址 end-->

        <!--规格 start-->
        <div class="add-goods-specification">
          <span class="goodsSpecificationName">{{ goods.specifications[0].goodsSpecificationName }}</span>
          <el-radio-group v-for="(o,index2) in goods.specifications[0].goodsSpecificationOptions" :key="index2"
                          direction="horizontal"
                          v-model="radio1" fill="#018cel" text-color="#ffffff">
            <el-radio-button class="goodsSpecificationOption"
                             :label="o.goodsSpecificationOptionName"></el-radio-button>
          </el-radio-group>
          <span v-if="goods.specifications[1]"
                class="goodsSpecificationName">{{ goods.specifications[1].goodsSpecificationName }}</span>
          <el-radio-group v-if="goods.specifications[1]"
                          v-for="(o,index2) in goods.specifications[1].goodsSpecificationOptions" :key="index2"
                          direction="horizontal"
                          v-model="radio2" fill="#018cel" text-color="#ffffff">
            <el-radio-button class="goodsSpecificationOption"
                             :label="o.goodsSpecificationOptionName"></el-radio-button>
          </el-radio-group>
          <span v-if="goods.specifications[2]"
                class="goodsSpecificationName">{{ goods.specifications[2].goodsSpecificationName }}</span>
          <el-radio-group v-if="goods.specifications[2]"
                          v-for="(o,index2) in goods.specifications[2].goodsSpecificationOptions" :key="index2"
                          direction="horizontal"
                          v-model="radio3" fill="#018cel" text-color="#ffffff">
            <el-radio-button class="goodsSpecificationOption"
                             :label="o.goodsSpecificationOptionName"></el-radio-button>
          </el-radio-group>
          <span v-if="goods.specifications[3]"
                class="goodsSpecificationName">{{ goods.specifications[3].goodsSpecificationName }}</span>
          <el-radio-group v-if="goods.specifications[3]"
                          v-for="(o,index2) in goods.specifications[3].goodsSpecificationOptions" :key="index2"
                          direction="horizontal"
                          v-model="radio4" fill="#018cel" text-color="#ffffff">
            <el-radio-button class="goodsSpecificationOption"
                             :label="o.goodsSpecificationOptionName"></el-radio-button>
          </el-radio-group>
          <span v-if="goods.specifications[4]"
                class="goodsSpecificationName">{{ goods.specifications[4].goodsSpecificationName }}</span>
          <el-radio-group v-if="goods.specifications[4]"
                          v-for="(o,index2) in goods.specifications[4].goodsSpecificationOptions" :key="index2"
                          direction="horizontal"
                          v-model="radio5" fill="#018cel" text-color="#ffffff">
            <el-radio-button class="goodsSpecificationOption"
                             :label="o.goodsSpecificationOptionName"></el-radio-button>
          </el-radio-group>
          <span v-if="goods.specifications[5]"
                class="goodsSpecificationName">{{ goods.specifications[5].goodsSpecificationName }}</span>
          <el-radio-group v-if="goods.specifications[5]"
                          v-for="(o,index2) in goods.specifications[5].goodsSpecificationOptions" :key="index2"
                          direction="horizontal"
                          v-model="radio6" fill="#018cel" text-color="#ffffff">
            <el-radio-button class="goodsSpecificationOption"
                             :label="o.goodsSpecificationOptionName"></el-radio-button>
          </el-radio-group>
        </div>
        <!--规格 end-->

        <!--底部 start-->
        <el-button class="add-goods-button" size="large" color="#ff9003" round @click="onAddCart">加入购物车</el-button>
        <!--底部 end-->
      </div>
    </van-popup>
    <!--加入购物车弹出框 end-->

  </div>
</template>

<script setup>
import {onMounted, reactive, ref} from "vue";
import axios from "@/utils/request"
import {useRoute, useRouter} from "vue-router"
import {useDataStore} from "../../stores/dataStore"
import AddressList from "../../components/AddressList/Index.vue"
import {showSuccessToast} from 'vant';

const router = useRouter()
const dataStore = useDataStore()

const route = useRoute()
//单选框选中的规格数据
const radio1 = ref("")
const radio2 = ref("")
const radio3 = ref("")
const radio4 = ref("")
const radio5 = ref("")
const radio6 = ref("")
//加入购物车弹出框控制器
const showCart = ref(false)
//商品id
const goodsId = route.params.name
//商品数据
const goods = reactive({
  goodsId: "",
  goodsHeadImg: "",
  goodsName: "",
  goodsCaption: "",
  goodsPrice: "",
  goodsIntroduction: "",
  goodsUse: "",
  goodsBrand: "",
  goodsType1: "",
  goodsType2: "",
  goodsType3: "",
  images: "",
  specifications: ""
})
onMounted(() => {
  axios.get("front/goods/findDesc", {
    params: {
      goodsId: goodsId
    }
  }).then(res => {
    if (res.data.code == 200) {
      goods.goodsId = res.data.data.goodsId
      goods.goodsHeadImg = res.data.data.goodsHeadImg
      goods.goodsName = res.data.data.goodsName
      goods.goodsCaption = res.data.data.goodsCaption
      goods.goodsPrice = res.data.data.goodsPrice
      goods.goodsIntroduction = res.data.data.goodsIntroduction
      goods.goodsUse = res.data.data.goodsUse
      goods.goodsBrand = res.data.data.goodsBrand
      goods.goodsType1 = res.data.data.goodsType1
      goods.goodsType2 = res.data.data.goodsType2
      goods.goodsType3 = res.data.data.goodsType3
      goods.images = res.data.data.images
      goods.specifications = res.data.data.specifications
    }
  })
})
/**
 * 加入购物车弹出框
 */
const onAddCartShow = () => {
  if (!dataStore.isLogin) {
    router.push("/home/login")
  } else {
    showCart.value = true
  }
}
/**
 * 加入购物车
 */
const onAddCart = () => {
  axios.post("front/cart/addGoodsCart", {
    userId: dataStore.userId,
    goodsId: goodsId,
    goodsHeadImg: goods.goodsHeadImg,
    goodsName: goods.goodsName,
    goodsPrice: goods.goodsPrice,
    specificationContent: radio1.value + " " + radio2.value + " " + radio3.value + " " + radio4.value + " " + radio5.value + " " + radio6.value,
    num: 1,
  }).then(res => {
    if (res.data.code == 200) {
      showSuccessToast('加入成功');
      showCart.value = false
    }
  })
}
/**
 * 查看购物车
 */
const onCartShow = () => {
  router.push("/home/cart")
}
</script>

<style scoped>
.container {
  background-color: #ffffff;
}

/**
商品数据样式
 */
.goods-price {
  margin-top: 10px;
  color: #ff4142;
}

.goods-price span {
  font-style: normal;
  font-family: JDZH-Regular, sans-serif;
  display: inline-block;
  font-size: 22px;
  font-weight: 500;
  line-height: normal;
  color: #f44d0b;
}

.goods-name {
  font-size: 21px;
  color: #181818;
  font-family: JDZH-Regular, sans-serif;
}

.goods-name button {
  margin: 4px;
  display: inline;
  color: #fdfdff;
  font-weight: 400;
  background-color: #fe012d;
}

.goods-introduction {
  background-color: #f9f9f9;
  font-size: 12px;
  margin-top: 10px;
  margin-bottom: 10px;
}


.goods-name span {
  margin-left: 5px;
  font-size: 16px;
  font-weight: bold;
}

/*
  加入购物车弹出框样式
*/
.add-cart-show {
  height: 600px;
}

.add-header {
  display: flex;
  left: 10px;
  background-color: #ffffff;

}

.add-goods-img {
  margin: 10px;
  width: 80px;
}

.add-goods-price {
  margin-left: 20px;
  margin-top: 35px;
  color: #ff4142;
  font-size: 15px;
}

.add-goods-price span {
  font-style: normal;
  font-family: JDZH-Regular, sans-serif;
  display: inline-block;
  font-size: 32px;
  font-weight: 500;
  line-height: normal;
  color: #f44d0b;
}

/**
地址
 */
.add-address {
  margin-top: 10px;
}

/**
规格
 */
.add-goods-specification {
  margin: 20px;
}

.goodsSpecificationName {
  display: block;
  line-height: 37px;
  color: #121212;
  font-size: 14px;
  font-weight: 700;
}

.goodsSpecificationOption {
  margin: 2px;
}

/**
底部
 */
.add-goods-button {
  position: fixed;
  bottom: 10px;
  left: 10px;
  width: 350px;
  color: #faf7e7;
  font-weight: 700;
}
</style>

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

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

相关文章

【安装vue脚手架报错:npm install -g @vue-cli pm ERR! code EINVALIDTAGNAME 】

当我们执行npm install -g vue-cli时候会报错&#xff1a; npm ERR! Invalid tag name “vue-cli” of package “vue-cli”: Tags may not have any characters that encodeURIComponent encodes. npm ERR! A complete log of this run can be found in: /Users/wuwenlu/.npm/…

【MySQL】MySQL索引、事务、用户管理

20岁的男生穷困潦倒&#xff0c;20岁的女生风华正茂&#xff0c;没有人会一直风华正茂&#xff0c;也没有人会一直穷困潦倒… 文章目录 一、MySQL索引特性&#xff08;重点&#xff09;1.磁盘、OS、MySQL&#xff0c;在进行数据IO时三者的关系2.索引的理解3.聚簇索引&#xff0…

仿找靓机链接生成 独立后台管理

教程&#xff1a;修改数据库账号密码直接使用。 源码带有教程! 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

软考A计划-系统集成项目管理工程师-项目采购管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

《Java面向对象程序设计》学习笔记

最近因考研专业课&#xff0c;在学习耿祥义老师的《Java面向对象程序设计&#xff08;第3版&#xff09;-微课视频版》 就打算放一些自己的学习笔记&#xff0c;可能不会及时更新&#xff0c;见谅。 计划弄个专栏&#xff0c;书上的每章对应专栏里的一篇文章。 专栏&#xf…

【并发专题】深入理解并发可见性、有序性、原子性与JMM内存模型

目录 课程内容一、JMM模型1.什么是JMM模型2.JMM内存区域模型3.JMM内存模型与硬件内存架构的关系4.JMM存在的必要性5.数据同步八大原子操作6.指令重排现象与并发编程的可见性&#xff0c;原子性与有序性问题 学习总结 课程内容 一、JMM模型 1.什么是JMM模型 Java内存模型&…

eda、gnm、anm究竟是个啥?

安装prody pip install prody -i https://pypi.tuna.tsinghua.edu.cn/simpleeda、anm、gnm eda(essential dynamics analysis) 另一个名字PCA(Principal Component Analysis) 或 NMA(Normal Mode Analysis)。 eda分析可以帮助人们理解生物大分子基本的运动模式和构象变化。…

【JavaSE】Java方法的使用

【本节目标】 1. 掌握方法的定义以及使用 2. 掌握方法传参 3. 掌握方法重载 4. 掌握递归 目录 1.方法概念及使用 1.1什么是方法(method) 1.2 方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系 2. 方法重载 2.1 为什么需要方法重载 2.2 方法重载概念 3. 递归 3.…

Beyond Compare和git merge、git rebase

文章目录 各个分支线将dev1 rebase进 dev2将dev1 merge进dev2 各个分支线 将dev1 rebase进 dev2 gitTest (dev2)]$ git rebase dev1local: 是rebase的分支dev1remote&#xff1a;是当前的分支dev2base&#xff1a;两个分支的最近一个父节点 将dev1 merge进dev2 gitTest (dev…

SpringBootAdmin介绍

一、SpringBootAdmin 简介 1.1 概述 SpringBootAdmin 是一个非常好用的监控和管理的开源组件&#xff0c;该组件能够将 Actuator 中的信息进行界面化的展示&#xff0c;也可以监控所有 Spring Boot 应用的健康状况&#xff0c;提供实时警报功能。 1.2 功能特性 显示应用程序…

初识DBT以及搭建第一个DBT工程

DBT是什么&#xff1a; 按照官方的说法&#xff0c;DBT 是一个数据转换流编排工具。个人理解就是&#xff0c;DBT是帮你编排SQL用的&#xff0c;你可以按照DBT的结构&#xff0c;构建好一个SQL的pipeline&#xff0c;然后让DBT帮你执行这个pipeline。我这里说的SQL pipeline的意…

Android 面试题 应用程序结构 十

&#x1f525; Intent 传递数据 &#x1f525; Activity、Service、BroadcastReceiver之间的通信载体 Intent 来传递数据。而ContentProvider则是共享文件。 Intent可传递的数据类型&#xff1a; a. 8种基本数据类型&#xff08;boolean byte char short int long float double…

【雕爷学编程】MicroPython动手做(21)——掌控板之磁场传感器

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

hooks复杂前端业务解题之道

hooks 大势所趋 2019年年初&#xff0c;react 在 16.8.x 版本正式具备了 hooks 能力&#xff0c;同年6月&#xff1b;尤雨溪在 vue/github-issues 里提出了关于 vue3 Component API 的提案&#xff08;vue hooks的基础&#xff09;。在Vue3的组合式API出现后&#xff0c;githu…

session反序列化+SoapClientSSRF+CRLF

文章目录 session反序列化SoapClientSSRFCRLF前言bestphps revengecall_user_func()方法的特性SSRFCRLF组合拳session反序列化 解题步骤总结 session反序列化SoapClientSSRFCRLF 前言 从一道题分析通过session反序列化出发SoapClientSSRF利用CRLF解题 bestphp’s revenge 首…

计算机毕设 深度学习人体语义分割在弹幕防遮挡上的实现 - python

文章目录 1 课题背景2 技术原理和方法2.1基本原理2.2 技术选型和方法 3 实例分割4 实现效果5 最后 # 1 前言 &#x1f6a9; 深度学习人体语义分割在弹幕防遮挡上的应用 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分…

ChatGPT在教育领域的应用:改变学习方式的前沿技术

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Flutter Add to App 问题记录

前一阵应用中接入了Flutter&#xff0c;使用的是官方的Multiple FlutterEngine管理方案&#xff0c;目前线上运行良好&#xff0c;这里整理一下遇到的问题。 将 Flutter 集成到现有应用整体来说没有什么问题&#xff0c;按照文档的说明结合demo操作就行。接入后多语言&#xf…

【应用层】Http协议总结

文章目录 一、续->Http协议的学习 1.http请求中的get方法和post方法 2.http的状态码 3.http的报头 4.长链接 5.cookie&#xff08;会话保持&#xff09;总结 继续上一篇的内容&#xff1a; 上一篇的最后我们讲到了web根目录&#xff0c;知道…

Git的.gitignore文件、标签管理以及给命令起别名

文章目录 1. 前言2. .gitignore文件3. 标签管理4. 给命令起别名 1. 前言 本文主要讲解Git中容易被忽略但比较重要一些知识:.gitignore文件、标签管理以及给命令起别名. 2. .gitignore文件 在新建仓库时,有一个添加.gitignore 模板: .gitignore 是一个用于指定 Git 忽略特定文…