Vue接口平臺學習十一——業務流測試

效果圖及簡單說明

在這里插入圖片描述
與之前的用例列表相似布局,也分左右,左邊用于顯示測試流程的名稱,右邊用于顯示流程相關信息。
左側點擊添加,直接增加一個新的業務流。
右側是點擊的業務流詳情,展示名稱,名稱的編輯保存,業務流的運行。
右側下方是業務流中的用例詳情,可以添加,編輯和刪除。還可以拖拽進行排序

內容實現

前置準備

  • 新建文件,
    新建一個TestFlow文件夾用戶存放相關代碼,一個View主體文件
  • 設置路由
    在router的index文件里,配置路徑和組件
    在這里插入圖片描述
  • 修改Home頁面的菜單內容
    將路徑,名稱修改為對應內容
    在這里插入圖片描述
    最好前置準備,就可以開始頁面內容編碼了。

整體左右布局

  <div class="main_box"><div class="left_box card"><div class="title_box"></div></div><div class="right_box card"></div></div>
.main_box{height: calc(100% - 42px);display: flex;.left_box{width: 200px;}.right_box{flex: 1;padding: 10px;}}

在這里插入圖片描述

左側元素及功能

title展示

圖標 + 名稱 + 添加按鈕

<div class="title_box"><img src="@/assets/icons/liucheng.png" width="25" alt=""><div class="name">測試業務流</div><el-button type="primary" plain @click="clickAddFlow" size="small" icon="CirclePlus">添加</el-button>
</div>
  .left_box{width: 200px;.title_box{display: flex;height: 40px;//padding: 0 3px;align-items: center;justify-content: center;border-bottom: solid 1px #6a6a6a;.name{font-weight: bold;font-size: 15px;margin: 0 15px 0 5px;}}}

在這里插入圖片描述

循環數據展示

api封裝
  1. 在api/module創建測試業務流的接口封裝FlowApi.js
    在這里插入圖片描述
import request from "@/api/request";
export default {//創建測試業務流createFlowApi(params){return request.post('/api/TestFlow/flows/',params)},//獲取測試業務流getFlowListApi(pro_id){return request.get('/api/TestFlow/flows/',{params: {project: pro_id}})},
}
  1. 在index里增加映射
    在這里插入圖片描述
獲取業務流數據
import {ProjectStore} from '@/stores/module/ProStore'
import http from '@/api/index'
import {ElNotification} from "element-plus";
import {onMounted, ref} from "vue";const pStore = ProjectStore()onMounted(()=>{getFlowList()
})let activeFlow = ref({id: "",name: "",
})const flowList = ref([])//獲取測試業務流
async function getFlowList() {const response = await http.flow.getFlowListApi(pStore.pro.id)if (response.status === 200) {flowList.value = response.data}// console.log(response.data)
}

使用onMounted,當組件掛載完成后,會立即調用 getFlowList() 方法來獲取測試業務流列表數據。用于進入頁面,加在完成,就填充數據。

<el-menu :default-active="activeFlow.id+''"><el-menu-item @click="selectFlow(item)" :index="item.id.toString()" v-for="item in flowList"key="item.id"><img src="@/assets/icons/liucheng.png" width="20" alt=""><span style="margin-left: 5px">{{ item.name }}</span></el-menu-item>
</el-menu>
.el-menu{border: none;.el-menu-item{height: 45px;line-height: 45px;}}

通過v-for循環遍歷flowList數據,獲取每一個測試業務流數據,用于展示。
在這里插入圖片描述

創建新的業務流

后端實現邏輯,創建只需要傳名字和項目id,具體內容,可以創建成功后再編輯,名字可以固定為 “新建業務流”

// 創建測試業務流
async function clickAddFlow() {let params = {name: '新建業務流',project: pStore.pro.id}const response = await http.flow.createFlowApi(params)if (response.status === 201) {ElNotification({title: '業務流創建成功',type: 'success',})await getFlowList()}
}

右側元素及功能

頂部名稱展示

 <!--右側頂部--><el-card style="background: none;"><el-divider content-position="left">業務流信息</el-divider><div class="name_edit"><el-input v-model="activeFlow.name" placeholder="請輸入業務流名稱"><template #prepend>業務流名稱</template></el-input><div class="btns"><el-button type="primary"  @click="" icon="CopyDocument">保存</el-button><el-button type="primary"  @click="" icon="Promotion">運行</el-button><el-button type="primary"  @click="" icon="Delete">刪除</el-button></div></div></el-card>
.right_box {flex: 1;padding: 10px;.name_edit{display: flex;.btns{width: 400px;text-align: center;}}}

在這里插入圖片描述
數據綁定,在選中業務流時,將選擇的值賦值給激活的業務樓,用于顯示名稱

//選中業務流
function selectFlow(item) {activeFlow.value = item
}
刪除業務流

一個確認彈窗,確認后調刪除接口,刪除成功,重新獲取業務流數據刷新頁面顯示。

//刪除業務流
async function deleteFlow() {ElMessageBox.confirm('刪除操作不可恢復,請確認是否要刪除該業務流?','警告', {type: 'warning',confirmButtonText: '確認',cancelButtonText: '取消'}).then(async () => {const response = await http.flow.deleteFlowApi(activeFlow.value.id)if (response.status === 204) {ElNotification({title: '刪除成功',type: 'success'})// 刷新頁面數據await getFlowList()}})
}
修改業務流

排序,用例什么的都是單獨的,這里修改更多是指修改一下業務流的名字。
給保存按鈕綁定事件saveFlow,再寫事件函數就行了。

// 保存業務流
async function saveFlow() {// console.log({...activeFlow.value})const response = await http.flow.updateFlowApi(activeFlow.value.id, {...activeFlow.value})if (response.status === 200) {ElNotification({title: '保存成功',type: 'success'})}
}

下方展示業務流包含的用例

獲取業務流中所有用例展示

由于需要排序,選擇使用拖拽組件來實現。介紹及使用鏈接放在下面了

拖拽組件使用

<!--右側下方--><el-card style="background: none;margin-top: 5px;"><el-divider content-position="left">業務流中用例步驟</el-divider><draggable v-model="flowCaseList" item-key="id"chosen-class="dragging"class="item-list"ghost-class="ghost"><template #item="{ element }"><div class="drag-item"><div style="display: flex; align-items: center;"><img src="@/assets/icons/case.png" width="20" style="margin-right: 5px;" alt=""><span style="color: #00aaff;font-weight: bold;margin-right: 5px;">步驟{{ element.sort }}: </span><span>{{ element.icase.title }}</span></div><div style="margin-left: auto;margin-right: 20px"><el-button type="primary" plain @click="" size="small" icon="Edit"></el-button><el-button type="danger" plain @click="" size="small" icon="Delete"></el-button></div></div></template></draggable><el-button type="primary" plain @click="" size="small" icon="Plus" style="margin-top: 10px;">添加步驟</el-button></el-card>
// 業務流中用例數據
const flowCaseList = ref([])
......	
//選中業務流
function selectFlow(item) {activeFlow.value = itemgetFlowCase()
}//獲取業務流中的測試用例
async function getFlowCase() {const response = await http.flow.getFlowCaseListApi(activeFlow.value.id)if (response.status === 200) {flowCaseList.value = response.data}
}
.right_box {flex: 1;padding: 10px;.name_edit {display: flex;.btns {width: 400px;text-align: center;}}.dragging {background-color: #cccccc;border: 2px solid #F3BA48;border-radius: 5px;z-index: 1000; /* 提升拖拽元素的層級 */}.drag-item {margin-bottom: 5px;cursor: move;text-align: center;display: flex;align-items: center;}.item-list {padding: 10px;border-radius: 4px;}.ghost {background-color: #cccccc;border: 2px dashed #00acc1;border-radius: 5px;}}

在這里插入圖片描述
獲取數據,以及展示功能實現了。下面需要實添加,編輯用例,拖拽修改用例執行順序,以及刪除的功能。

向業務流添加用例

點擊添加步驟,彈出所有用例彈窗,然后選擇用例添加。
這里使用抽屜組件從側邊彈出,里面的內容額外新建一個組件來展示。

新建AddTestFlow.vue文件來寫展示用例的那塊內容。
在這里插入圖片描述

 <el-drawer v-model="addStepDlg" size="20%" style="padding: 0"><AddTestFlow :cases="flowCaseList" :flow="activeFlow" @refreshCase="getFlowCase(activeFlow.id)"></AddTestFlow></el-drawer>....

引用

import AddTestFlow from "@/views/TestFlow/components/AddTestFlow.vue";

這里傳遞了3塊內容,是后面需要用到的。一個是選擇的業務流(在新頁面中接口請求需要用到id),一個是業務流中的用例數據(新頁面中需要獲取現有用例數量,添加時來確定排序),還有傳遞了一個方法,用來刷新業務流中的用例(新頁面中添加成功,重新請求數據展示)。

<!-- AddTestFlow.vue -->
<template><el-tabs :stretch="true"><el-tab-pane label="項目接口"><el-scrollbar height="calc(100vh - 200px)"><el-tree ref="tree1" :data="interfaces1" show-checkbox node-key="id" :props="{children:'cases'}"highlight-current><template #default="{ node, data }"><div class="custom-tree-node"><div v-if="data.name" class="case_line"><img src="@/assets/icons/icon-api-a.png" :height="20" alt=""><b style="color: #00aaff;margin-left: 5px">{{ data.name }}</b></div><div v-if="data.title" class="case_line"><img src="@/assets/icons/case.png" alt="" :height="20"><span :title="data.title" class="truncate-text">{{ data.title }}</span></div></div></template></el-tree></el-scrollbar></el-tab-pane><el-tab-pane label="第三方接口">...<!-- 與第三方接口一樣 --></el-tab-pane></el-tabs><div class="add-btns"><el-tooltip class="item" effect="dark" content="將選擇的用例加入到業務流中" placement="top-start"><el-button type="primary" size="small" plain @click="addToFlow">確認添加</el-button></el-tooltip></div>
</template>
<script setup>
import {ProjectStore} from '@/stores/module/ProStore'
import {storeToRefs} from 'pinia'
import http from '@/api/index';
import {ref} from "vue";
import {ElNotification} from "element-plus";const proStore = ProjectStore()
const proStoreRef = storeToRefs(proStore)
const interfaces1 = proStoreRef.interfaces1
const interfaces2 = proStoreRef.interfaces2const tree1 = ref({})
const tree2 = ref({})function get_checked_nodes() {const checkedNodes1 = tree1.value.getCheckedNodes()const checkedNodes2 = tree2.value.getCheckedNodes()const Nodes = [...checkedNodes1, ...checkedNodes2]// console.log(Nodes)//過濾選中的接口const result = Nodes.filter(item => {return item.title;})return result
}const props = defineProps(['cases', 'flow'])
const emit = defineEmits(['refreshCase'])async function addToFlow() {const checkedCase = get_checked_nodes();let orders = props.cases.length;for (let i = 0; i < checkedCase.length; i++) {const item = checkedCase[i];orders += 1;const data = {icase: item.id,scene: props.flow.id,sort: orders}const response = await http.flow.addFlowCaseApi(data)if (response.status === 201) {ElNotification({type: 'success',title: '添加成功',message: `用例-${item.title} 添加成功`,duration:2000})emit('refreshCase')}else{ElNotification({type: 'error',title: '添加失敗',message: `用例-${item.title} 添加失敗`,duration:2000})}}
}
</script>
<style scoped lang="scss">
.case_line {display: flex;align-items: center;
}.truncate-text {display: inline-block;max-width: 80%; /* 根據實際情況調整最大寬度 */white-space: nowrap;overflow: hidden;text-overflow: ellipsis;
}
</style>

簡單說明下代碼。使用el-tabs顯示選擇項目接口和三方接口,stretch="true"可以撐開占滿整個寬度
在這里插入圖片描述
里面內容使用el-tree來展示

el-tree文檔

需要展示的interface的格式如下在這里插入圖片描述
所以將tree props的children參數設置成了cases。
然后就是勾選用例,添加到業務流。
特殊情況:當一個接口下只有一個用例時,選擇了該用例,這個接口也被勾選上了,所以需要進行排除。
在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述
然后就將過濾后的數據循環傳給向業務流添加用例的接口進行添加。用例的順序就用到了組件傳遞orders = props.cases.length; 業務流的id也是props.flow.id,然后添加成功,就刷新一下業務流的用例,也用到了組件傳遞過來的方法emit('refreshCase')。到這,添加用例就成功了。

從業務流中刪除用例

回到TestFlowView.vue中,對刪除按鈕進行事件綁定,然后傳id,調用接口就行。

 <el-button type="danger" plain @click="deleteFlowCase(element.id)" size="small" icon="Delete"></el-button>
// 刪除業務流中的測試用例
async function deleteFlowCase(id) {const response = await http.flow.deleteFlowCaseApi(id)if (response.status === 204) {ElNotification({title: '刪除成功',type: 'success'})await getFlowCase()}
}
編輯業務流中的用例

復用之前的測試用例組件,沒有什么新東西。

<!--  編輯測試用例的彈窗--><el-drawer v-model="editStepDlg" size="40%" style="padding: 0"><CaseEditor :case_id="editCaseid"></CaseEditor></el-drawer>
// 編輯測試用例
const editCaseid = ref(null)
const editStepDlg = ref(false)async function clickEditCase(case_id) {// console.log(case_id)editCaseid.value = case_ideditStepDlg.value = true
}

然后給編輯用例按鈕綁定事件

<el-button type="primary" plain @click="clickEditCase(element.icase.id)" size="small" icon="Edit"></el-button>
編輯業務流中用例執行順序

這塊內容比較復雜。在這之前,先做個小優化。
修改一下拖拽生效區域,使得只有在用例名那里才能拖拽。避免每次點擊編輯/刪除 按鈕時都出發拖拽功能
在這里插入圖片描述
調整排序觸發的操作,可以使用拖拽組件的sort方法
在這里插入圖片描述

  1. 綁定sort函數
<draggable v-model="flowCaseList" item-key="id"chosen-class="dragging"class="item-list"ghost-class="ghost"handle=".step_name"@sort="updateSort">
  1. 定義函數
async function updateSort() {}
  1. 調整順序后需要獲取最新的順序,按照接口需要的list[{id,sort}]格式請求接口
  const newflowCaseList = flowCaseList.value.map((item, index) => {return {...item, sort: index + 1};});//console.log(newflowCaseList)const updatedList = newflowCaseList.map((item) => ({id: item.id,sort: item.sort}));//console.log(updatedList)//得到數據如下//[{"id": 21,"sort": 1},{"id": 20,"sort": 2},{"id": 19,"sort": 3}]

這就得到了最新的用例順序了。然后發起請求

  1. 請求更改順序的接口
const response = await http.flow.updateFlowCaseOrderApi(updatedList)if (response.status === 200) {ElNotification({title: '排序更新成功',type: 'success',duration: 2000})await getFlowCase()}

完整功能:

async function updateSort() {const newflowCaseList = flowCaseList.value.map((item, index) => {return {...item, sort: index + 1};});console.log(newflowCaseList)const updatedList = newflowCaseList.map((item) => ({id: item.id,sort: item.sort}));console.log(updatedList)const response = await http.flow.updateFlowCaseOrderApi(updatedList)if (response.status === 200) {ElNotification({title: '排序更新成功',type: 'success',duration: 2000})await getFlowCase()}
}

到此排序功能也就完成了。

運行測試業務流

代碼及簡單說明

  <!--  顯示運行結果的組件--><el-drawer v-model="resultDlg" title="運行結果" size="40%"><RunFlowResult :results="runResult"></RunFlowResult></el-drawer>

同樣,使用抽屜組件彈窗展示結果。里面內容創建新的組件來展示。

const runResult = ref([])
const resultDlg = ref(false)// 運行業務流
async function runFlow() {const loadingInstance = ElLoading.service({fullscreen: true, text: '正在運行中...'})if (pStore.env) {const params = {env: pStore.env,scene: activeFlow.value.id}console.log(params)const response = await http.run.runFlowApi(params)if (response.status === 200) {ElNotification({title: '業務流運行完成',type: 'success',duration: 2000})runResult.value = response.dataresultDlg.value = true}}else{ElMessage.error('請選擇執行的測試環境')}loadingInstance.close()
}

簡單說明:點擊運行后,先loading提示,禁止其他操作。然后判斷選擇了測試環境,再調用接口。否則提示選擇環境。調用成功后,將組件彈出。并把結果傳給RunFlowResult這個組件。

<!--RunFlowResult.vue-->
<template><el-descriptions  border :column="4"><el-descriptions-item label="總數">{{ props.results.all }}</el-descriptions-item><el-descriptions-item label="通過" label-class-name="success">{{ props.results.success }}</el-descriptions-item><el-descriptions-item label="失敗" label-class-name="fail">{{ props.results.fail }}</el-descriptions-item><el-descriptions-item label="錯誤" label-class-name="error">{{ props.results.error }}</el-descriptions-item></el-descriptions><el-table :data="props.results.cases" style="width: 100%"><el-table-column type="expand"><template #default="props"><Result :result='props.row'></Result></template></el-table-column><el-table-column label="用例名稱" prop="name"></el-table-column><el-table-column label="請求方法" prop="method"></el-table-column><el-table-column label="響應狀態嗎" prop="status_code"></el-table-column><el-table-column label="執行結果" prop="status"></el-table-column></el-table></template><script setup>
import {defineProps} from 'vue'
import Result from "@/components/Result.vue";const props = defineProps({results: {}
})console.log(props.results)</script><style scoped lang="scss">
:deep(.success) {background: var(--el-color-success-light-9) !important;
}
:deep(.fail) {background: var(--el-color-danger-light-9) !important;
}
:deep(.error) {background: var(--el-color-error-dark-2) !important;
}
</style>

這個組件對之前的 Result 做了二次封裝。增加了一些內容,與之前單用例不同的是,業務流含有多個用例。所以使用table依次傳入

 <!-- 測試用例運行的結果 --><el-drawer v-model="isShowDrawer" size="50%"><template #header><b>運行結果</b></template><template #default><Result :result='responseData'></Result></template></el-drawer>
<el-table :data="props.results.cases" style="width: 100%"><el-table-column type="expand"><template #default="props"><Result :result='props.row'></Result></template></el-table-column><el-table-column label="用例名稱" prop="name"></el-table-column><el-table-column label="請求方法" prop="method"></el-table-column><el-table-column label="響應狀態嗎" prop="status_code"></el-table-column><el-table-column label="執行結果" prop="status"></el-table-column></el-table>

運行結果截圖

在這里插入圖片描述

總結

到此,比較復雜的業務流前端邏輯終于完了///
主要在于用例添加及排序這塊。

拖拽組件使用

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

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

相關文章

碳化硅缺陷分類與原因

01一、碳化硅晶體材料中的缺陷到底是什么&#xff1f;碳化硅晶體材料中的缺陷是指在晶體生長、加工或使用過程中出現的不完美結構。這些缺陷可能表現為晶體內部的裂紋、表面的凹坑、原子排列的錯誤等。雖然缺陷看起來微不足道&#xff0c;但它們卻可能對晶體的電學、熱學和機械…

Jenkins 實現項目的構建和發布

作者&#xff1a;小凱 沉淀、分享、成長&#xff0c;讓自己和他人都能有所收獲&#xff01; 本文的宗旨在于通過簡單干凈實踐的方式教會讀者&#xff0c;如何在 Docker 中部署 Jenkins&#xff0c;并通過 Jenkins 完成對項目的打包構建并在 Docker 容器中部署。 Jenkins 的主要…

Django接口自動化平臺實現(三)

3.2 后臺 admin 添加數據 1&#xff09;注冊模型類到 admin&#xff1a; 1 from django.contrib import admin2 from . import models3 4 5 class ProjectAdmin(admin.ModelAdmin):6 list_display ("id", "name", "proj_owner", "tes…

CentOS 7 配置環境變量常見的4種方式

?博客主頁&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客內容》&#xff1a;.NET、Java.測試開發、Python、Android、Go、Node、Android前端小程序等相關領域知識 &#x1f4e2;博客專欄&#xff1a; https://blog.csdn.net/m0_63815035/cat…

k8s:手動創建PV,解決postgis數據庫本地永久存儲

1.離線環境CPU:Hygon C86 7285 32-core Processor 操作系統&#xff1a;麒麟操作系統 containerd&#xff1a;1.7.27 Kubernetes:1.26.12 KubeSphere:4.1.2 kubekey&#xff1a;3.1.10 Harbor:2.13.1 Postgis:17-3.52創建StorageClass2.1創建 apiVersion: storage.k8s.io/v1kin…

谷歌瀏覽器Chrome的多用戶配置文件功能

谷歌瀏覽器Chrome的多用戶配置文件功能允許在同一設備上創建多個獨立賬戶,每個賬戶擁有完全隔離的瀏覽數據(如書簽、歷史記錄、擴展、Cookies等),非常適合工作/生活賬戶分離、家庭共享或臨時多賬號登錄場景。 如何使用Chrome的多用戶配置文件功能? 一、創建與切換用戶 1.…

傲軟錄屏 專業高清錄屏軟件 ApowerREC Pro 下載與保姆級安裝教程!!

小編今天分享一款強大的電腦屏幕錄像軟件 傲軟錄屏 ApowerREC&#xff0c;能夠幫助用戶錄制中電腦桌面屏幕上的所有內容&#xff0c;包括畫面和聲音&#xff0c;支持全屏錄制、區域錄制、畫中畫以及攝像頭錄制等多種視頻錄制模式&#xff0c;此外&#xff0c;還支持計劃任務錄制…

【計算機網絡】MAC地址與IP地址:網絡通信的雙重身份標識

在計算機網絡領域&#xff0c;MAC地址與IP地址是兩個核心概念&#xff0c;它們共同構成了數據傳輸的基礎。理解二者的區別與聯系&#xff0c;對于網絡配置、故障排查及安全管理至關重要。 一、基本概念 1. MAC地址&#xff08;物理地址&#xff09; 定義&#xff1a;固化在網絡…

如何用keepAlive實現標簽頁緩存

什么是KeepAlive首先&#xff0c;要明確所說的是TCP的 KeepAlive 還是HTTP的 Keep-Alive。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念&#xff0c;不能混為一談。實際上HTTP的KeepAlive寫法是Keep-Alive&#xff0c;跟TCP的KeepAlive寫法上也有不同。TCP的KeepAliveTCP…

數據庫隔離級別

隔離級別決定了事務之間的可見性規則&#xff0c;直接影響數據庫的并發性能和數據一致性。SQL 標準定義了 4 種隔離級別&#xff0c;從低到高依次為&#xff1a;讀未提交→讀已提交→可重復讀→串行化。隔離級別越高&#xff0c;對并發問題的解決能力越強&#xff0c;但對性能的…

基于Python flask的電影數據分析及可視化系統的設計與實現,可視化內容很豐富

摘要&#xff1a;基于Python的電影數據分析及可視化系統是一個應用于電影市場的數據分析平臺&#xff0c;旨在為廣大電影愛好者提供更準確、更詳細、更實用的電影數據。數據分析部分主要是對來自貓眼電影網站上的數據進行清洗、分類處理、存儲等步驟&#xff0c;數據可視化則是…

TCP通訊開發注意事項及常見問題解析

文章目錄一、TCP協議特性與開發挑戰二、粘包與拆包問題深度解析1. 成因原理2. 典型場景與實例驗證3. 系統化解決方案接收方每次讀取10字節2. 丟包檢測與驗證工具3. 工程化解決方案四、連接管理關鍵實踐1. 超時機制設計2. TIME_WAIT狀態優化3. 異常處理最佳實踐五、高性能TCP開發…

2021 RoboCom 世界機器人開發者大賽-本科組(復賽)解題報告 | 珂學家

前言 題解 睿抗機器人開發者大賽CAIP-編程技能賽-歷年真題 匯總 2021 RoboCom 世界機器人開發者大賽-本科組&#xff08;復賽&#xff09;解題報告 感覺這個T1特別有意思&#xff0c;非典型題&#xff0c;著重推演下結論。 T2是一道玄學題&#xff0c;但是涉及一些優化技巧…

《計算機“十萬個為什么”》之 MQ

《計算機“十萬個為什么”》之 MQ &#x1f4e8; 歡迎來到消息隊列的奇妙世界&#xff01; 在這篇文章中&#xff0c;我們將探索 MQ 的奧秘&#xff0c;從基礎概念到實際應用&#xff0c;讓你徹底搞懂這個分布式系統中不可或缺的重要組件&#xff01;&#x1f680; 作者&#x…

Django母嬰商城項目實踐(七)- 首頁數據業務視圖

7、首頁數據業務視圖 1、介紹 視圖(View)是Django的MTV架構模式的V部分,主要負責處理用戶請求和生成相應的響應內容,然后在頁面或其他類型文檔中顯示。 也可以理解為視圖是MVC架構里面的C部分(控制器),主要處理功能和業務上的邏輯。我們習慣使用視圖函數處理HTTP請求,…

android 12 的 aidl for HAL 開發示例

說明&#xff1a;aidl for HAL 這種機制&#xff0c;可以自動生成java代碼&#xff0c;app調用可以獲取中間過程的jar包&#xff0c;結合反射調用 ServiceManager.getService 方法&#xff0c;直接獲取 HAL 服務&#xff0c;不再需要費力在framework層添加代碼&#xff0c;方便…

網絡安全滲透攻擊案例實戰:某公司內網為目標的滲透測試全過程

目錄一、案例背景二、目標分析&#xff08;信息收集階段&#xff09;&#x1f310; 外部信息搜集&#x1f9e0; 指紋識別和端口掃描三、攻擊流程&#xff08;滲透測試全過程&#xff09;&#x1f3af; 步驟1&#xff1a;Web漏洞利用 —— 泛微OA遠程命令執行漏洞&#xff08;CV…

AI視頻-劇本篇學習筆記

1.提示詞萬能框架是什么:ai扮演的角色做什么&#xff1a;解決什么問題怎么做&#xff1a;標準2、劇本模版假設你是一位擁有30年電影拍攝經驗的世界頂級導演&#xff0c;擁有豐富的電影拍攝經驗和高超的電影拍攝技術&#xff0c;同時也擅長各種影片的劇本創作。我需要你仔細閱讀…

A316-HF-DAC-V1:專業USB HiFi音頻解碼器評估板技術解析

引言 隨著高解析度音頻的普及&#xff0c;對高品質音頻解碼設備的需求日益增長。本文將介紹一款專為USB HiFi音頻解碼器設計的專業評估板——A316-HF-DAC-V1&#xff0c;這是一款基于XMOS XU316技術的高性能音頻解碼評估平臺。產品概述 A316-HF-DAC-V1是一款專業的USB HiFi音頻…

超低延遲RTSP播放器在工業機器人遠程控制中的應用探索

技術背景 在智能制造高速發展的今天&#xff0c;工業機器人已經從單一的生產作業工具&#xff0c;轉變為協作化、智能化的生產伙伴。無論是高精度的多關節機械臂、自主導航的移動機器人&#xff0c;還是與人協同工作的協作機器人&#xff0c;都越來越多地被應用于智能工廠、倉…