苍穹外卖项目前端DAY03

news2024/9/21 2:42:34

前端DAY03

1、套餐管理

1.1、套餐分页查询

1.1.1、需求分析和接口设计

产品原型:

业务规则:

  • 根据页码展示套餐信息
  • 每页展示10条数据
  • 分页查询时可以根据需要,输入套餐名称、套餐分类、售卖状态进行查询

接口设计:

  • 套餐分页查询接口

  • 分类查询接口

1.1.2、代码开发
  • 从路由文件router.ts中找到套餐管理页面(组件)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 制作页面头部效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 注意:

    • 输入框、按钮、下拉框都是使用ElementUI提供的组件

    • 对于前端的组件只需要参考ElementUI提供的文档,进行修改即可

  • 导入查询套餐分类的Js方法,动态填充套餐分类下拉框

  • 页面组件和数据模型进行相应调整

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 为查询按钮绑定事件,发送Ajax请求获取分页数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

完整代码

<template>
  <div class="dashboard-container">
    <div class="container">
      <div class="tableBar">
        <label style="margin-right: 5px;">
        套餐名称:
        </label>
        <el-input v-model="name" placeholder="请输入套餐名称" style="width: 15%"/>

        <label style="margin-right: 5px;">
        套餐分类:
        </label>
        <el-select v-model="categoryId" placeholder="请选择">
          <el-option
            v-for="item in options"
            :key="item.id"
            :label="item.name"
            :value="item.id">
          </el-option>
        </el-select>
        <label style="margin-right: 5px;">
        售卖状态:
        </label>
        <el-select v-model="saleStatus" placeholder="请选择">
          <el-option
            v-for="item in saleStatusArr"
            :key="item.value"
            :label="item.label"
            :value="item.value">
          </el-option>
        </el-select>
        
        <el-button type = "primary" style="margin-left: 20px" @click="pageQuery()">查询</el-button>
        <div style="float: right">
          <el-button type="danger">批量删除</el-button>
          <el-button type="info">+ 新建套餐</el-button>
        </div>
      </div>
    </div>
      <el-table :data="records" stripe class="tableBox" @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="25" />
        <el-table-column prop="name" label="套餐名称" />
        <el-table-column label="图片">
          <template slot-scope="scope">
            <el-image style="width: 80px; height: 40px; border: none" :src="scope.row.image"></el-image>
          </template>
        </el-table-column>
        <el-table-column prop="categoryName" label="套餐分类" />
        <el-table-column prop="price" label="套餐价"/>
        <el-table-column label="售卖状态">
          <template slot-scope="scope">
            <div class="tableColumn-status" :class="{ 'stop-use': scope.row.status === 0 }">
              {{ scope.row.status === 0 ? '停售' : '启售' }}
            </div>
          </template>
        </el-table-column>
        <el-table-column prop="updateTime" label="最后操作时间" />
        <el-table-column label="操作" align="center" width="250px">
          <template slot-scope="scope">
            <el-button type="text" size="small"> 修改 </el-button>
            <el-button type="text" size="small" @click="handleStartOrStop(scope.row)">
              {{ scope.row.status == '1' ? '停售' : '启售' }}
            </el-button>
            <el-button type="text" size="small" @click="handleDelete('S',scope.row.id)"> 删除 </el-button>
          </template>
        </el-table-column>
      </el-table>
      <el-pagination class="pageList"
                     :page-sizes="[10, 20, 30, 40]"
                     :page-size="pageSize"
                     layout="total, sizes, prev, pager, next, jumper"
                     :total="total"
                     @size-change="handleSizeChange"
                     @current-change="handleCurrentChange" />
    </div>
    </div>
  </div>
</template>

<script lang="ts">
import { getCategoryByType } from "@/api/category";
import { getSetmealPage } from "@/api/setMeal"
export default {
    //模型数据
    data(){
    return {
      name: '', //员工姓名,对应上面的输入框 
      page: 1, //页码
      pageSize: 10, //每页记录数
      total: 0, //总记录数
      records: [], //当前页面要展示的数据集合
      options: [],
        categoryId: '', //分类id
        saleStatusArr:[
          {
            value: '0',
            label: '停售'
          },
          {
            value: '1',
            label: '起售'
          }
        ]
    }
 },
 created() {
  //查询套餐分类,用于填充查询页面的下拉框
  getCategoryByType({type:2})
    .then((res) => {
     if (res.data.code === 1) {
      this.options = res.data.data
     } 
    })
    //页面加载完成后查询套餐数据
    this.pageQuery()
 },
 methods: {
  //分页查询
  pageQuery(){
    //封装分页查询参数
    const params = {
      Page: this.page,
      pageSize: this.pageSize,
      name: this.name,
      status: this.status,
      categoryId: this.categoryId
    }
    getSetmealPage(params).then((res) => {
      if(res.data.code === 1){
        this.total = res.data.data.total
        this.records = res.data.data.records
      }
    }).catch((err) => {
      
    });
  },
  
  handleSizeChange(pageSize){
    this.pageSize = pageSize
    this.pageQuery()
  },
  handleCurrentChange(page){
    this.page = page
    this.pageQuery()
  }
 },
}
</script>
<style lang="scss">
.el-table-column--selection .cell {
  padding-left: 10px;
}
</style>
<style lang="scss" scoped>
.dashboard {
  &-container {
    margin: 30px;

    .container {
      background: #fff;
      position: relative;
      z-index: 1;
      padding: 30px 28px;
      border-radius: 4px;

      .tableBar {
        margin-bottom: 20px;
        .tableLab {
          float: right;
          span {
            cursor: pointer;
            display: inline-block;
            font-size: 14px;
            padding: 0 20px;
            color: $gray-2;
          }
        }
      }

      .tableBox {
        width: 100%;
        border: 1px solid $gray-5;
        border-bottom: 0;
      }

      .pageList {
        text-align: center;
        margin-top: 30px;
      }
      //查询黑色按钮样式
      .normal-btn {
        background: #333333;
        color: white;
        margin-left: 20px;
      }
    }
  }
}
</style>

1.1.3、功能测试

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.2、起售停售套餐

1.2.1、需求分析和接口设计

业务规则:

  • 可以对状态为“启售”的套餐进行“停售”操作
  • 可以对状态为“停售”的套餐进行“启售”操作

接口设计:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.2.2、代码开发

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

完整代码

<template>
  <div class="dashboard-container">
    <div class="container">
      <div class="tableBar">
        <label style="margin-right: 5px;">
        套餐名称:
        </label>
        <el-input v-model="name" placeholder="请输入套餐名称" style="width: 15%"/>

        <label style="margin-right: 5px;">
        套餐分类:
        </label>
        <el-select v-model="categoryId" placeholder="请选择">
          <el-option
            v-for="item in options"
            :key="item.id"
            :label="item.name"
            :value="item.id">
          </el-option>
        </el-select>
        <label style="margin-right: 5px;">
        售卖状态:
        </label>
        <el-select v-model="saleStatus" placeholder="请选择">
          <el-option
            v-for="item in saleStatusArr"
            :key="item.value"
            :label="item.label"
            :value="item.value">
          </el-option>
        </el-select>
        
        <el-button type = "primary" style="margin-left: 20px" @click="pageQuery()">查询</el-button>
        <div style="float: right">
          <el-button type="danger">批量删除</el-button>
          <el-button type="info">+ 新建套餐</el-button>
        </div>
      </div>
    </div>
      <el-table :data="records" stripe class="tableBox" @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="25" />
        <el-table-column prop="name" label="套餐名称" />
        <el-table-column label="图片">
          <template slot-scope="scope">
            <el-image style="width: 80px; height: 40px; border: none" :src="scope.row.image"></el-image>
          </template>
        </el-table-column>
        <el-table-column prop="categoryName" label="套餐分类" />
        <el-table-column prop="price" label="套餐价"/>
        <el-table-column label="售卖状态">
          <template slot-scope="scope">
            <div class="tableColumn-status" :class="{ 'stop-use': scope.row.status === 0 }">
              {{ scope.row.status === 0 ? '停售' : '启售' }}
            </div>
          </template>
        </el-table-column>
        <el-table-column prop="updateTime" label="最后操作时间" />
        <el-table-column label="操作" align="center" width="250px">
          <template slot-scope="scope">
            <el-button type="text" size="small"> 修改 </el-button>
            <el-button type="text" size="small" @click="handleStartOrStop(scope.row)">
              {{ scope.row.status == '1' ? '停售' : '启售' }}
            </el-button>
            <el-button type="text" size="small" @click="handleDelete('S',scope.row.id)"> 删除 </el-button>
          </template>
        </el-table-column>
      </el-table>
      <el-pagination class="pageList"
                     :page-sizes="[10, 20, 30, 40]"
                     :page-size="pageSize"
                     layout="total, sizes, prev, pager, next, jumper"
                     :total="total"
                     @size-change="handleSizeChange"
                     @current-change="handleCurrentChange" />
    </div>
    </div>
  </div>
</template>

<script lang="ts">
import { getCategoryByType } from "@/api/category";
import { getSetmealPage,enableOrDisableSetmeal } from "@/api/setMeal"
export default {
    //模型数据
    data(){
    return {
      name: '', //员工姓名,对应上面的输入框 
      page: 1, //页码
      pageSize: 10, //每页记录数
      total: 0, //总记录数
      records: [], //当前页面要展示的数据集合
      options: [],
        categoryId: '', //分类id
        saleStatusArr:[
          {
            value: '0',
            label: '停售'
          },
          {
            value: '1',
            label: '起售'
          }
        ]
    }
 },
 created() {
  //查询套餐分类,用于填充查询页面的下拉框
  getCategoryByType({type:2})
    .then((res) => {
     if (res.data.code === 1) {
      this.options = res.data.data
     } 
    })
    //页面加载完成后查询套餐数据
    this.pageQuery()
 },
 methods: {
  //分页查询
  pageQuery(){
    //封装分页查询参数
    const params = {
      Page: this.page,
      pageSize: this.pageSize,
      name: this.name,
      status: this.status,
      categoryId: this.categoryId
    }
    getSetmealPage(params).then((res) => {
      if(res.data.code === 1){
        this.total = res.data.data.total
        this.records = res.data.data.records
      }
    }).catch((err) => {
      
    });
  },
  handleSizeChange(pageSize){
    this.pageSize = pageSize
    this.pageQuery()
  },
  handleCurrentChange(page){
    this.page = page
    this.pageQuery()
  },
  //套餐起售停售操作
  handleStartOrStop(row){
    const p ={
      id: row.id,
      status: !row.status ? 1:0
    }
    this.$confirm('此操作将会修改套餐的状态,是否继续?','提示',{
      confirmButtonText:'确定',
      cancelButtonText:'取消',
      type:'warning'
    }).then((res) => {
        enableOrDisableSetmeal(p).then(res =>{
        if(res.data.code ===1){
          this.$message.success('套餐售卖状态修改成功')
          this.pageQuery()
        }
      })
    }).catch((err) => {
      
    });

   
  }

 }
}
</script>
<style lang="scss">
.el-table-column--selection .cell {
  padding-left: 10px;
}
</style>
<style lang="scss" scoped>
.dashboard {
  &-container {
    margin: 30px;

    .container {
      background: #fff;
      position: relative;
      z-index: 1;
      padding: 30px 28px;
      border-radius: 4px;

      .tableBar {
        margin-bottom: 20px;
        .tableLab {
          float: right;
          span {
            cursor: pointer;
            display: inline-block;
            font-size: 14px;
            padding: 0 20px;
            color: $gray-2;
          }
        }
      }

      .tableBox {
        width: 100%;
        border: 1px solid $gray-5;
        border-bottom: 0;
      }

      .pageList {
        text-align: center;
        margin-top: 30px;
      }
      //查询黑色按钮样式
      .normal-btn {
        background: #333333;
        color: white;
        margin-left: 20px;
      }
    }
  }
}
</style>

1.2.3、功能测试

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.3、删除套餐

1.3.1、需求分析和接口设计

产品原型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

业务规则:

  • 点击删除按钮,删除指定的一个套餐
  • 勾选需要删除的套餐,点击批量删除按钮,删除选中的一个或多个套餐

接口设计:一个接口,兼容两种删除方式

1.3.2、代码开发
  • 在setMeal.ts中封装删除套餐方法,发送Ajax请求

完整代码

<template>
  <div class="dashboard-container">
    <div class="container">
      <div class="tableBar">
        <label style="margin-right: 5px;">
        套餐名称:
        </label>
        <el-input v-model="name" placeholder="请输入套餐名称" style="width: 15%"/>

        <label style="margin-right: 5px;">
        套餐分类:
        </label>
        <el-select v-model="categoryId" placeholder="请选择">
          <el-option
            v-for="item in options"
            :key="item.id"
            :label="item.name"
            :value="item.id">
          </el-option>
        </el-select>
        <label style="margin-right: 5px;">
        售卖状态:
        </label>
        <el-select v-model="saleStatus" placeholder="请选择">
          <el-option
            v-for="item in saleStatusArr"
            :key="item.value"
            :label="item.label"
            :value="item.value">
          </el-option>
        </el-select>
        
        <el-button type = "primary" style="margin-left: 20px" @click="pageQuery()">查询</el-button>
        <div style="float: right">
          <el-button type="danger" @click="handleDelete('B')">批量删除</el-button>
          <el-button type="info">+ 新建套餐</el-button>
        </div>
      </div>
    </div>
      <el-table :data="records" stripe class="tableBox" @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="25" />
        <el-table-column prop="name" label="套餐名称" />
        <el-table-column label="图片">
          <template slot-scope="scope">
            <el-image style="width: 80px; height: 40px; border: none" :src="scope.row.image"></el-image>
          </template>
        </el-table-column>
        <el-table-column prop="categoryName" label="套餐分类" />
        <el-table-column prop="price" label="套餐价"/>
        <el-table-column label="售卖状态">
          <template slot-scope="scope">
            <div class="tableColumn-status" :class="{ 'stop-use': scope.row.status === 0 }">
              {{ scope.row.status === 0 ? '停售' : '启售' }}
            </div>
          </template>
        </el-table-column>
        <el-table-column prop="updateTime" label="最后操作时间" />
        <el-table-column label="操作" align="center" width="250px">
          <template slot-scope="scope">
            <el-button type="text" size="small"> 修改 </el-button>
            <el-button type="text" size="small" @click="handleStartOrStop(scope.row)">
              {{ scope.row.status == '1' ? '停售' : '启售' }}
            </el-button>
            <el-button type="text" size="small" @click="handleDelete('S',scope.row.id)"> 删除 </el-button>
          </template>
        </el-table-column>
      </el-table>
      <el-pagination class="pageList"
                     :page-sizes="[10, 20, 30, 40]"
                     :page-size="pageSize"
                     layout="total, sizes, prev, pager, next, jumper"
                     :total="total"
                     @size-change="handleSizeChange"
                     @current-change="handleCurrentChange" />
    </div>
</template>

<script lang="ts">
import { getCategoryByType } from "@/api/category";
import { getSetmealPage,enableOrDisableSetmeal,deleteSetmeal } from "@/api/setMeal"
export default {
    //模型数据
    data(){
    return {
      name: '', //员工姓名,对应上面的输入框 
      page: 1, //页码
      pageSize: 10, //每页记录数
      total: 0, //总记录数
      records: [], //当前页面要展示的数据集合
      options: [],
        categoryId: '', //分类id
        saleStatusArr:[
          {
            value: '0',
            label: '停售'
          },
          {
            value: '1',
            label: '起售'
          }
        ],
        status:'', //售卖状态
        multipleSelection: '' //当前表格选中的多个元素
    }
 },
 created() {
  //查询套餐分类,用于填充查询页面的下拉框
  getCategoryByType({type:2})
    .then((res) => {
     if (res.data.code === 1) {
      this.options = res.data.data
     } 
    })
    //页面加载完成后查询套餐数据
    this.pageQuery()
 },
 methods: {
  //分页查询
  pageQuery(){
    //封装分页查询参数
    const params = {
      Page: this.page,
      pageSize: this.pageSize,
      name: this.name,
      status: this.status,
      categoryId: this.categoryId
    }
    getSetmealPage(params).then((res) => {
      if(res.data.code === 1){
        this.total = res.data.data.total
        this.records = res.data.data.records
      }
    }).catch((err) => {
      
    });
  },
  handleSizeChange(pageSize){
    this.pageSize = pageSize
    this.pageQuery()
  },
  handleCurrentChange(page){
    this.page = page
    this.pageQuery()
  },
  //套餐起售停售操作
  handleStartOrStop(row){
    const p ={
      id: row.id,
      status: !row.status ? 1:0
    }
    this.$confirm('此操作将会修改套餐的状态,是否继续?','提示',{
      confirmButtonText:'确定',
      cancelButtonText:'取消',
      type:'warning'
    }).then((res) => {
        enableOrDisableSetmeal(p).then(res =>{
        if(res.data.code ===1){
          this.$message.success('套餐售卖状态修改成功')
          this.pageQuery()
        }
      })
    }).catch((err) => {
      
    });

   
  },
  //删除套餐
  handleDelete(type: string,id: string){

    this.$confirm('确定删除当前指定的套餐,是否继续?','提示',{
      confirmButtonText:'确定',
      cancelButtonText:'取消',
      type:'warning'
    }).then(() => {
      let param = ''
      if(type == 'B'){ //批量删除
        const arr = new Array
        this.multipleSelection.forEach(element => {
          arr.push(element.id)
        })
        param = arr.join(',')
      }else{ //单一删除
        param = id
      }

      deleteSetmeal(id).then(res =>{
        if(res.data.code ===1){
          this.$message.success('删除成功')
          this.pageQuery()
        }else{
          this.$message.error(res.data.msg)
       }
        })
      })


  },
  //复选框
  handleSelectionChange(val){
    this.multipleSelection = val
  }


 }
}
</script>
<style lang="scss">
.el-table-column--selection .cell {
  padding-left: 10px;
}
</style>
<style lang="scss" scoped>
.dashboard {
  &-container {
    margin: 30px;

    .container {
      background: #fff;
      position: relative;
      z-index: 1;
      padding: 30px 28px;
      border-radius: 4px;

      .tableBar {
        margin-bottom: 20px;
        .tableLab {
          float: right;
          span {
            cursor: pointer;
            display: inline-block;
            font-size: 14px;
            padding: 0 20px;
            color: $gray-2;
          }
        }
      }

      .tableBox {
        width: 100%;
        border: 1px solid $gray-5;
        border-bottom: 0;
      }

      .pageList {
        text-align: center;
        margin-top: 30px;
      }
      //查询黑色按钮样式
      .normal-btn {
        background: #333333;
        color: white;
        margin-left: 20px;
      }
    }
  }
}
</style>

ve;
z-index: 1;
padding: 30px 28px;
border-radius: 4px;

  .tableBar {
    margin-bottom: 20px;
    .tableLab {
      float: right;
      span {
        cursor: pointer;
        display: inline-block;
        font-size: 14px;
        padding: 0 20px;
        color: $gray-2;
      }
    }
  }

  .tableBox {
    width: 100%;
    border: 1px solid $gray-5;
    border-bottom: 0;
  }

  .pageList {
    text-align: center;
    margin-top: 30px;
  }
  //查询黑色按钮样式
  .normal-btn {
    background: #333333;
    color: white;
    margin-left: 20px;
  }
}

}
}


#### 1.3.3、功能测试

![\[外链图片转存中...(img-RjvVBZgA-1725427732990)\]](https://i-blog.csdnimg.cn/direct/b1ea397e7a7e4c21ae4d8ea308f08f45.png)


![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://i-blog.csdnimg.cn/direct/73025364626949a3910ce268a97ccbbf.png)


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

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

相关文章

如何使用电商API接口?(淘宝|京东商品详情数据接口)

一、了解电商API接口&#xff1a; 如今&#xff0c;在电商市场中&#xff0c;电商API接口的广泛应用极大地提高了电商行业的工作效率&#xff0c;使得商家能够灵活集成多种服务&#xff0c;高效优化业务流程。 当前&#xff0c;电商平台中的多种业务都可以通过使用API接口来做…

Tomato靶场渗透测试

1.扫描靶机地址 可以使用nmap进行扫描 由于我这已经知道靶机地址 这里就不扫描了 2.打开网站 3.进行目录扫描 dirb http&#xff1a;//172.16.1.113 发现有一个antibot_image目录 4.访问这个目录 可以看到有一个info.php 5.查看页面源代码 可以发现可以进行get传参 6.…

脉脉高聘:大模型算法岗平均月薪近7万元,位居高薪榜第一

9月5日&#xff0c;脉脉高聘人才智库数据显示&#xff0c;大模型领域整体供需比1.76&#xff0c;整体供大于求。同时&#xff0c;高技术岗位人才稀缺&#xff0c;云计算人才供需比仅为0.33&#xff0c;相当于3个岗位争夺1个人才。大模型算法岗位平均月薪最高&#xff0c;超过6.…

【STM32+HAL库】---- 驱动MAX30102心率血氧传感器

硬件开发板&#xff1a;STM32F407VET6 软件平台&#xff1a;cubemaxkeilVScode1 MAX30102心率血氧传感器工作原理 MAX30102传感器是一种集成了红外光源、光电检测器和信号处理电路的高度集成传感器&#xff0c;主要用于心率和血氧饱和度的测量。以下是MAX30102传感器的主要特点…

草料二维码功能上新!可以跨分区移动或复制内容了!

支持将 分区 下的内容移动或复制到其他分区。适用于将原初始分区下的内容按业务划分&#xff0c;移动到其他分区。或者当物品流转或业务变更时&#xff0c;可以及时将码及数据移动到对应分区&#xff0c;移动后&#xff0c;二维码图案不会发生变化。 目前仅表单、活码、批量模…

在修改文件 /ect/hosts时无法保存 can‘t open file for writing

输入&#xff1a;q! 即可 情境&#xff1a; 在Master节点中执行如下命令打开并修改Master节点中的“/etc/hosts”文件&#xff1a; sudo vim /etc/hosts 可以在hosts文件中增加如下两条IP和主机名映射关系&#xff1a; 192.168.1.121 Master 192.168.1.122 Slave1

解决App推广痛点:一键获取下载数据的秘诀

在App推广的过程中&#xff0c;获取准确的下载数据一直是一个令人头疼的问题。你知道吗&#xff1f;无法精确追踪用户来源和下载量&#xff0c;就像是在黑暗中摸索&#xff0c;让推广效果大打折扣。今天&#xff0c;我们就来揭秘如何轻松获取App下载数据&#xff0c;优化你的推…

BaseThreadStart代码分析

BaseThreadStart代码分析 第一部分&#xff1a; ​​​​​​​ 在调用CreateThead创建线程的时候&#xff0c;操作系统会为新线程创建线程内核对想象&#xff0c; 线程内核对象包含了线程的上下文&#xff08;是一个C O N T E X T结构&#xff09;以及一些其他属性和统计信息&…

计算机毕业设计 | SSM停车场管理系统(附源码)

1&#xff0c; 概述 1.1 课题背景 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们的生活水平不断提高&#xff0c;日常生活中用户对停车场管理系统方面的要求也在不断提高&#xff0c;需要的人数更是不断增加&#xff0c;使得停车场管理系统的开发成为必需…

【HarmonyOS】安装包报错,code:9568282 error: install releaseType target not same.

【HarmonyOS】安装包报错&#xff0c;code:9568282 error: install releaseType target not same. 报错信息 Install Failed: error: failed to install bundle. code:9568282 error: install releaseType target not same. You can also uninstall and reinstall the module…

使用Python读取Excel数据

目录 使用Python读取Excel数据 安装必要的库 读取Excel文件 基本步骤 代码案例 解释 其他常用操作 选择特定列 筛选数据 数据清洗 总结 使用Python读取Excel数据 在日常的数据处理工作中&#xff0c;Excel文件是非常常见的一种数据格式。Python提供了多种库来读取和…

SprinBoot+Vue新生报到微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

java重点学习-mybatis

4.1 MyBatis执行流程 ① 读取MyBatis配置文件:mybatis-config.xml加载运行环境和映射文件② 构造会话工厂SqlSessionFactory③ 会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法)④ 操作数据库的接口&#xff0c;Executor执行器&#xff0c;同时负责查询缓存的维护⑤E…

人、货、场巨变,5G人工智能时代新的创业机会在哪?

随着5G元年的开启&#xff0c;人工智能的潜力被进一步激发&#xff0c;"人工智能"广泛应用于教育、无人驾驶、金融、银行、医疗、工业等领域&#xff0c;成为中国新的经济增长引擎&#xff0c;促进中国经济火爆增长。不仅促进了中国消费者的购买力&#xff0c;更萌发…

亚马逊卖家测评为什么要自己养账号呢?不懂快进来看看

亚马逊上的卖家为啥要自己养账号呢&#xff1f;咱们来聊聊这个事儿。 亚马逊特别看重用户的体验&#xff0c;所以买家的评论和打分对店铺的排名影响很大。平台对评论的审核很严格&#xff0c;这些评论直接关系到商品在平台上的表现和销量。 在亚马逊上&#xff0c;买家的评分和…

汽车制造商设备运维案例

汽车产线有很多传动设备需要长期在线运行&#xff0c;会出现老化、疲劳、磨损等问题&#xff0c;为了避免意外停机造成损失&#xff0c;需要加装一些健康监测设备&#xff0c;监测设备运行状态。天津三石峰科技采用无线温振传感器汇聚网关方案&#xff0c;将现场设备数据数据上…

springboot项目实现分库

本文是根据仓库编码 和 仓库id进行按仓库进行分库处理,可以根据例子自行按照业务需要进行分库 1.核心是实现 Spring 的 AbstractRoutingDataSource 抽象类,重写 determineCurrentLookupKey 方法,实现动态数据源的目的 @Slf4j public class DynamicDataSource extends Abst…

佳明运动相机SD存储卡被格式化?教你有效恢复数据的方法

在日常使用佳明运动相机的过程中&#xff0c;‌我们可能会不小心将SD存储卡格式化&#xff0c;‌导致珍贵的照片和视频数据丢失。‌面对这种情况&#xff0c;‌很多用户都感到十分焦虑和无助。‌但幸运的是&#xff0c;‌通过一些有效的方法&#xff0c;‌我们仍然有可能恢复这…

如何在Centos7构建调试“Jmeter-InfluxDB-Grafana“?

一、数据源配置 1、在"Grafana"首页&#xff0c;添加数据源 2、点击添加 3、选择"InfluxDB" 4、填写主机 5、填写"Database&#xff1a;jmeter"和"HTTP Method&#xff1a;GET" 6、点击"Save & test" 7、查看 二、配置…

串口与Labview通讯的调试

在学习Labview和串口的通讯和调试的时候。首先必须先了解一些Labview的基础知识&#xff0c;然后就是了解串口&#xff0c;在调试的过程中&#xff0c;我们需要下位机来辅助我们的程序编写与调试&#xff0c;也就是我们平时使用的单片机&#xff0c;如果没有单片机也不要紧&…