vue3+element-plus+pinia完整搭建好看简洁的管理后台
目录
一、项目介绍
二、项目结构
1.vscode的项目截图
2.项目依赖
三、项目截图
1.登录页
2.首页
3.汽车管理
4.汽车信息
5.系统管理
6.订单管理
7.数据统计
8.个人中心
四、源码分析
1.数据存储与同步
2.汽车信息
3.框架布局
五、总结
一、项目介绍
项目使用vue3+vite+element-plus+pinia+router+axios等搭建,每个页面已经完成了对后端api请求的编码,各种交互已经写好,同时通过pinia实现数据同步与通讯,在此基础上实现页面历史导航栏功能,增加了支持多层级顶级菜单联动左侧菜单,左侧菜单由顶部菜单控制,导航栏实现对顶级菜单和左侧菜单的样式同步。
其中菜单可支持动态配置,菜单icon也支持组件化动态配置,这大大提高了框架的灵活度和便捷性。
项目同时采用组件来布局整个框架,左侧+顶部+导航栏+具体页面功能展示容器。
element-plus官方文档:
Overview 组件总览 | Element Plus
二、项目结构
1.vscode的项目截图
2.项目依赖
三、项目截图
1.登录页
输入账密登录,登录成功,跳转首页。
2.首页
首页的导航栏是默认的,不可取消。
3.汽车管理
选择顶部菜单,左侧菜单对应展示,同时历史导航栏增加当前页面。
4.汽车信息
各种脚本校验都通过vue3实现,文件上传等,其他页面类似
5.系统管理
系统管理主要作为管理员日常使用的功能,可归纳在此。
6.订单管理
订单管理可作为一个主要的功能模块,可单独分离出来,方便管理。
7.数据统计
数据统计,一般管理系统都会有此类似模块,可单独归为一个菜单专门管理。
8.个人中心
可进行个人信息修改和密码修改。
四、源码分析
1.数据存储与同步
主要包含用户登录信息和历史导航栏等数据的存储与同步。历史导航栏的增删改查都有对应的方法,用户登录后,信息也会暂寄存于此,即变量:nowUser
import {defineStore} from 'pinia'
import {CarStatus} from "@/type/dataDefinition";
// @ts-ignore
import {diff} from '@/util/util'export const useStore = defineStore('main', () => {const chosenCarType = ref({nowCarType: "",nowCarTypeId: "",});const chosenCar = ref({id: "",carConfigs: [],});const lastPage = ref(1);const firstPage = ref("/home");const nowUser = reactive({form: {} as any} as any);const search = reactive({form: {} as any} as any);const tagSet = reactive({form: {tagList:[], tag:{label:"首页",value:"/home"}} as any } as any);const subMenu = reactive({form: [] as any} as any);const getLastPage = () => {return lastPage.value;};const setLastPage = (item: number) => {lastPage.value = item;};const addTag = (tag: any) => {if(tag.value === '/'){tag.value = "/home";tag.label = "首页";}if(tagSet.form.tagList.length === 0){tagSet.form.tagList.push({label:"首页",value:"/home"});}tagSet.form.tag = tag;if (tagSet.form.tagList.some((ele:any) => diff(ele, tag))) return;let saveTag = {};Object.assign(saveTag, tag);tagSet.form.tagList.push(saveTag);};const delTag = (tag:any)=>{tagSet.form.tagList = tagSet.form.tagList.filter((item:any) => {return !diff(item, tag) || item.value === firstPage.value;});};const delOtherTag = ()=>{tagSet.form.tagList = tagSet.form.tagList.filter((item:any) => {if (item.value === tagSet.form.tag.value) {return true;} else if (item.value === firstPage.value) {return true;}});};const delAllTag = ()=>{tagSet.form.tagList = tagSet.form.tagList.filter((item:any) => {if (item.value === firstPage.value) {return true;}});};const clearTag = ()=>{tagSet.form.tagList = [];};return {chosenCarType, chosenCar, lastPage,firstPage, subMenu, getLastPage, setLastPage, nowUser, search,tagSet,addTag,delTag,delOtherTag,delAllTag,clearTag};
}, {persist: true,
})
2.汽车信息
<template><div class="contain-box"><div style="margin: 20px 35px;display: inline-block;"><el-select v-model="searchForm.carTypeId" placeholder="请选择汽车类型" style="margin-left: 15px" clearable><el-option v-for="item in carTypeList" :key="item.id" :label="item.type" :value="item.id"></el-option></el-select><el-select v-model="searchForm.carNameId" placeholder="请选择汽车品牌" style="margin-left: 15px" clearable><el-option v-for="item in carNameList" :key="item.id" :label="item.name" :value="item.id"></el-option></el-select><el-inputstyle="width: 200px; margin-left: 15px":suffix-icon="CollectionTag"placeholder="请输入具体名称"v-model="searchForm.carSpecificName"></el-input><el-inputstyle="width: 200px; margin-left: 15px":suffix-icon="TakeawayBox"placeholder="请输入标志"v-model="searchForm.carTag"></el-input><el-inputstyle="width: 200px; margin-left: 15px":suffix-icon="CreditCard"placeholder="请输入车牌"v-model="searchForm.licensePlate"></el-input><el-select v-model="searchForm.rented" placeholder="请选择租用情况" style="margin-left: 15px" clearable><el-option label="已租用" value="true"></el-option><el-option label="未被租用" value="false"></el-option></el-select><el-select v-model="searchForm.statusLabel" placeholder="请选择汽车状态" style="margin-left: 15px" clearable><el-option label="正常" value="Normal"></el-option><el-option label="维修中" value="Maintenance"></el-option><el-option label="年检中" value="Annual_Inspection"></el-option></el-select><div style="margin-left: 20px;margin-top: 10px;"><el-button type="primary" @click="search">搜索<el-icon class="el-icon--right"><Search /></el-icon></el-button><el-button type="warning" @click="reset">重置<el-icon class="el-icon--right"><Refresh /></el-icon></el-button></div></div><div style="margin: 10px 20px"><el-button type="primary" @click="preInsert">新增<el-icon class="el-icon--right"><CirclePlus /></el-icon></el-button><el-popconfirmconfirm-button-text="确定"cancel-button-text="取消"icon-color="red"title="是否确定删除?"@confirm="del(hasSelected)"><template #reference><el-button type="danger" slot="reference" style="margin-left: 10px">批量删除<el-icon class="el-icon--right"><DocumentDelete /></el-icon></el-button></template></el-popconfirm><el-button type="primary" @click="exp">下载<el-icon class="el-icon--right"><Download /></el-icon></el-button></div><div style="margin: 20px"><el-table :data="tableData"stripeborder@selection-change="handleSelectionChange":header-cell-style="{backgroundColor: 'aliceblue', fontSize: '16px', color: 'grey'}"@expand-change="getCarConfigList"row-key="id":expand-row-keys="expands"><el-table-column type="selection" width="55" /><el-table-column type="expand"><template #default="scope"><div><div style="margin: 0 300px"><el-tagclass="mx-1":key="item"v-for="item in scope.row.carConfigs"closable:disable-transitions="false"@close="handleClose(scope.row.carConfigs, item)"style="margin: 10px 50px" type="warning">{{item.detail}}</el-tag><el-inputv-if="inputVisible"ref="InputRef"v-model="inputValue"class="ml-1 w-20"size="small"@keyup.enter="handleInputConfirm(scope.row.carConfigs)"@blur="handleInputConfirm(scope.row.carConfigs)"style="width: 115px"/><el-button v-else size="small" @click="showInput" style="width: 115px">添加一个汽车配置</el-button></div></div></template></el-table-column><el-table-column prop="url" label="图片" width="100"><template #default="scope"><el-image:preview-src-list="(scope.row.url?scope.row.url.split(','):[])":src="scope.row.url"style="width: 80px; height: 80px; margin: 5px; cursor: pointer"alt=""/></template></el-table-column><el-table-column prop="carType" label="类型" width="150" /><el-table-column prop="carName" label="品牌" width="150" /><el-table-column prop="carSpecificName" label="具体名称" width="150" /><el-table-column prop="carTag" label="标志" width="120" /><el-table-column prop="licensePlate" label="车牌" width="120" /><el-table-column prop="dailyRent" label="日租金/元" width="120" /><el-table-column prop="rented" label="租用" width="80" ><template #default="scope"><el-switch v-model="scope.row.rented" disabled/></template></el-table-column><el-table-column prop="statusLabel" label="状态" width="80" /><el-table-column prop="createBy" label="创建人" width="80" /><el-table-column prop="createTime" label="创建时间" width="180" :formatter="dateFormat" /><el-table-column prop="operation" label="操作" width="180"><template #default="scope"><el-button type="text" @click="preEdit(scope.row)">编辑<el-icon class="el-icon--right"><Edit /></el-icon></el-button><el-popconfirmconfirm-button-text="确定"cancel-button-text="取消"icon-color="red"title="是否确定删除?"@confirm="del([scope.row])"><template #reference><el-buttontype="text"style="margin-left: 10px;color: red;">删除<el-icon class="el-icon--right"><Delete /></el-icon></el-button></template></el-popconfirm></template></el-table-column></el-table></div><div class="demo-pagination-block" style="margin: 5px 35px; float: right"><el-paginationv-model:current-page="currentPage"v-model:page-size="pageSize":page-sizes="[10, 20, 50]"layout="total, sizes, prev, pager, next, jumper":total="total"@size-change="handleSizeChange"@current-change="handleCurrentChange"/></div><el-dialogtitle="车辆信息"v-model="dialogVisible"width="30%"top="50px"><el-uploadclass="avatar-uploader"action="http://localhost:8090/image/upload":show-file-list="false":on-success="handleAvatarSuccess":before-upload="beforeAvatarUpload"style="margin: 20px 150px"><img v-if="newOrEditForm.form.url" :src="newOrEditForm.form.url" class="avatar" alt="" /><el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon></el-upload><el-form :rules="rules" :model="newOrEditForm.form" label-width="100px" ref="ruleFormRef"><el-form-item label="类型" prop="carTypeId"><el-select v-model="newOrEditForm.form.carTypeId" placeholder="请选择汽车类型" clearable><el-option v-for="item in carTypeList" :key="item.id" :label="item.type" :value="item.id"></el-option></el-select></el-form-item><el-form-item label="品牌" prop="carNameId"><el-select v-model="newOrEditForm.form.carNameId" placeholder="请选择汽车品牌" clearable><el-option v-for="item in carNameList" :key="item.id" :label="item.name" :value="item.id"></el-option></el-select></el-form-item><el-form-item label="日租金/元" prop="dailyRent"><el-inputstyle="width: 300px; margin: 3px 0"v-model="newOrEditForm.form.dailyRent"autocomplete="off"></el-input></el-form-item><el-form-item label="具体名称" prop="carSpecificName"><el-inputstyle="width: 300px; margin: 3px 0"v-model="newOrEditForm.form.carSpecificName"autocomplete="off"></el-input></el-form-item><el-form-item label="标志" prop="catTag"><el-inputstyle="width: 300px; margin: 3px 0"v-model="newOrEditForm.form.carTag"autocomplete="off"></el-input></el-form-item><el-form-item label="车牌" prop="licensePlate"><el-inputstyle="width: 300px; margin: 3px 0"v-model="newOrEditForm.form.licensePlate"autocomplete="off"></el-input></el-form-item><el-form-item label="是否租用" prop="rented"><el-select v-model="newOrEditForm.form.rented" placeholder="请选择租用情况" clearable disabled><el-option label="已租用" :value="true"></el-option><el-option label="未被租用" :value="false"></el-option></el-select></el-form-item><el-form-item label="汽车状态" prop="status"><el-select v-model="newOrEditForm.form.status" placeholder="请选择汽车状态" clearable disabled><el-option label="正常" value="Normal"></el-option><el-option label="维修中" value="Maintenance"></el-option><el-option label="年检中" value="Annual_Inspection"></el-option></el-select></el-form-item></el-form><template #footer><div class="dialog-footer"><el-button @click="dialogCancel">取 消</el-button><el-button type="primary" @click="submitNewOrEdit(ruleFormRef)">确 定</el-button></div></template></el-dialog></div>
</template><script lang="ts" setup>
import {CirclePlus, Delete, DocumentDelete, Download, Edit, Refresh, Search, CreditCard, CollectionTag, TakeawayBox, Plus} from "@element-plus/icons";
import request from "@/request/request";
import moment from "moment";
import type {FormInstance, FormRules, UploadProps} from 'element-plus';
import {ElInput, ElMessage} from "element-plus";
import {CarStatus} from "@/type/dataDefinition";const searchItem = () => ({carTypeId: "",carNameId: "",carSpecificName: "",carTag: "",licensePlate: "",rented: "",status: CarStatus.Wrong,statusLabel: "",
})const newOrEditItem = () => ({form: {carTypeId: "",carNameId: "",imageId: "",dailyRent: "",carSpecificName: "",carTag: "",licensePlate: "",rented: false,status: "",statusLabel: "",url: "",}
})const rules = reactive<FormRules>({carTypeId: [{required: true,message: '请选择类型',trigger: 'change',},],carNameId: [{required: true,message: '请选择品牌',trigger: 'change',},],dailyRent: [{required: true,message: '请输入日租金',trigger: 'change',},],carSpecificName: [{required: true,message: '请输入具体名称',trigger: 'change',},],licensePlate: [{required: true,message: '请输入车牌',trigger: 'change',},],
})const ruleFormRef = ref<FormInstance>()
const dialogVisible = ref(false);
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(0);
const tableData = ref([]);
const searchForm = reactive(searchItem());
const newOrEditForm = reactive(newOrEditItem());
const isEdit = ref(false);
const hasSelected = ref([]);
const carTypeList = ref([]);
const carNameList = ref([]);
const expands = ref([] as any);
const inputValue = ref('');
const inputVisible = ref(false)
const InputRef = ref<InstanceType<typeof ElInput>>()// 表格切换每页展示数据数
const handleSizeChange = (size: number) => {pageSize.value = size;getData();
}// 表格切换到第几页
const handleCurrentChange = (current: number) => {currentPage.value = current;getData();
}// 时间格式化
const dateFormat = (e: any) => {return moment(e.createTime).format("YYYY-MM-DD HH:mm:ss");
}// 控制添加汽车配置的按钮与输入框转换
const showInput = () => {inputVisible.value = true;nextTick(() => {InputRef.value!.input!.focus()})
}// 汽车配置的添加
const handleInputConfirm = (carConfigs: any) => {if (inputValue.value) {let insertConfigForm = {carId: expands.value[0],detail: inputValue.value,};request.post("/carConfig/insertOne", insertConfigForm).then((res: any) => {if (res.code === 200) {ElMessage.success("添加汽车配置成功");carConfigs.push(res.data);} else {ElMessage.error(res.msg);}inputVisible.value = falseinputValue.value = ""});}inputVisible.value = falseinputValue.value = ""
}// 汽车配置的删除
const handleClose = (carConfigs: any, item: any) => {request.post("/carConfig/deleteOne", item).then((res: any) => {if (res.code === 200) {ElMessage.success("删除汽车配置成功");carConfigs.splice(carConfigs.indexOf(item), 1)} else {ElMessage.error(res.msg);}});
}// 获取单个汽车的配置信息,且每次只能打开一项
const getCarConfigList = (row: any) => {if (row.id === expands.value[0]) {expands.value = [];return;}expands.value = [];expands.value.push(row.id);if (!row.carConfigs) {request.get("/carConfig/getCarConfigList", {params: {carId: row.id}}).then((res: any) => {if (res.code === 200) {row.carConfigs = res.data} else {ElMessage.error(res.msg);}})}
}// 图片上传成功后赋值
const handleAvatarSuccess: UploadProps['onSuccess'] = (res, row) => {if (res.code === 200) {newOrEditForm.form.url = res.data.url;newOrEditForm.form.imageId = res.data.id;} else {ElMessage.error(res.msg);}
}// 图片上传条件
const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {let types = ["image/jpg", "image/jpeg", "image/png"];if (!types.includes(rawFile.type)) {ElMessage.error("上传头像图片只能是 JPG 格式或 PNG 格式!");return false;} else if (rawFile.size / 1024 / 1024 > 10) {ElMessage.error("上传头像图片大小不能超过 10MB!");return false;}return true;
}// 条件搜索
const search = () => {searchForm.status = searchForm.statusLabel as CarStatus;if (searchForm.statusLabel === "") {searchForm.status = CarStatus.Wrong;}getData();
}// 重置条件
const reset = () => {Object.assign(searchForm, searchItem());getData();
}// 新建前
const preInsert = () => {isEdit.value = false;Object.assign(newOrEditForm, newOrEditItem());newOrEditForm.form.rented = false;newOrEditForm.form.status = "Normal";dialogVisible.value = true;
}// 清空表const clearForm = (formEl: FormInstance | undefined) => {if (!formEl) {return;}formEl.resetFields();}// 编辑前
const preEdit = (row: any) => {isEdit.value = true;newOrEditForm.form = JSON.parse(JSON.stringify(row));dialogVisible.value = true;
}// 提交表单const submitNewOrEdit = async (formEl: FormInstance | undefined) => {if (!formEl) returnawait formEl.validate((valid, fields) => {if (valid) {if (isEdit.value) {request.post("/car/chgCar", newOrEditForm.form).then((res: any) => {if (res.code === 200) {ElMessage.success("修改成功");dialogCancel();} else {ElMessage.error(res.msg);}getData();});} else {request.post("/car/insertOne", newOrEditForm.form).then((res: any) => {if (res.code === 200) {ElMessage.success("添加成功");dialogCancel();} else {ElMessage.error(res.msg);}getData();});}} else {console.log('error submit!', fields)}})}// 关闭新建或编辑弹窗
const dialogCancel = () => {clearForm(ruleFormRef.value);dialogVisible.value = false;
}// 删除
const del = (ids: []) => {ids = ids.filter((e: any) => {// @ts-ignorereturn e.rented === false && CarStatus[e.status] === CarStatus.Normal}) as [];if (ids.length === 0) {ElMessage.error("未有空闲车辆");return;}ids = ids.map((e: any) => {return e.id;}) as [];request.post("/car/delMore", ids).then((res: any) => {if (res.code === 200) {ElMessage.success("删除空闲车辆成功");} else {ElMessage.error(res.msg);}dialogCancel();getData();});
}// 多选
const handleSelectionChange = (row: any) => {hasSelected.value = row;
}// 获取carType 所有汽车类型列表
const getCarTypeList = () => {request.get("/carType/getCarTypeList").then((res: any) => {if (res.code === 200) {carTypeList.value = res.data;} else {ElMessage.error("汽车类型获取失败,请联系管理员!");}})
}
getCarTypeList();// 获取carName 所有汽车品牌列表
const getCarNameList = () => {request.get("/carName/getCarNameList").then((res: any) => {if (res.code === 200) {carNameList.value = res.data;} else {ElMessage.error("汽车品牌获取失败,请联系管理员!");}})
}
getCarNameList();// 获取数据
const getData = () => {request.get("/car/getPages", {params: {...searchForm,current: currentPage.value,size: pageSize.value}}).then((res: any) => {if (res.code === 200) {tableData.value = res.data.page?.records;total.value = res.data.page?.total;tableData.value.forEach((e: any) => {// @ts-ignoree.statusLabel = CarStatus[e.status];});} else {ElMessage.error(res.msg);}})
}
getData();
</script><style>
.layout-container-demo .el-main {padding: 0;
}
.layout-container-demo .toolbar {display: inline-flex;align-items: center;justify-content: center;height: 100%;right: 20px;
}.avatar-uploader .avatar {width: 178px;height: 178px;display: block;
}
.avatar-uploader .el-upload {border: 1px dashed var(--el-border-color);border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;transition: var(--el-transition-duration-fast);
}.avatar-uploader .el-upload:hover {border-color: var(--el-color-primary);
}.el-icon.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 178px;height: 178px;text-align: center;
}
</style>
3.框架布局
<template><div style="width: 100%;height: 100%;overflow: hidden;display: flex;"><ManagementAside :isCollapse="isCollapse"></ManagementAside><div :style="'width: calc(100% - '+(isCollapse?'65px':'200px')+');background-color: #f0f2f5;'"><ManagerHeader @changeIsCollapse="changeIsCollapse" /><tags/><!-- 页面展示容器 --><router-view class="vue-view" style="height: calc(100% - 112px);"/></div></div>
</template><script lang="ts" setup>
import {ref} from 'vue';
import ManagementAside from "../../components/manager/ManagerAside.vue";
import ManagerHeader from "@/components/manager/ManagerHeader.vue";
import Tags from "@/components/manager/tags.vue";const isCollapse = ref(false);const changeIsCollapse = (v: any) => {isCollapse.value = v;
}
</script><style scoped>
.layout-container-demo .el-header {position: relative;color: var(--el-text-color-primary);border-bottom: 1px solid grey;
}
.layout-container-demo .el-menu {border-right: none;
}
.layout-container-demo .el-main {padding: 0;
}
.layout-container-demo .toolbar {display: inline-flex;align-items: center;justify-content: center;height: 100%;right: 20px;
}
.el-menu-vertical-demo:not(.el-menu--collapse) {width: 200px;min-height: 400px;
}.managerStruct{width: 100%;min-height: 100%;}
</style>
五、总结
项目页面完整,后续可能将不断升级,完善其他页面。
关注作者,及时了解更多好项目!
更多优质项目请看作者主页!
获取源码或如需帮助,可通过博客后面名片+作者即可!
相关文章:
vue3+element-plus+pinia完整搭建好看简洁的管理后台
目录 一、项目介绍 二、项目结构 1.vscode的项目截图 2.项目依赖 三、项目截图 1.登录页 2.首页 3.汽车管理 4.汽车信息 5.系统管理 6.订单管理 7.数据统计 8.个人中心 四、源码分析 1.数据存储与同步 2.汽车信息 3.框架布局 五、总结 一、项目介绍 项目使用…...
新手到资深的Java开发编码规范
新手到资深的开发编码规范 一、前言二、命名规范:代码的 “第一印象”2.1 标识符命名原则2.2 命名的 “自描述性” 原则2.3 避免魔法值 三、代码格式规范:结构清晰的视觉美学3.1 缩进与空格3.2 代码块规范3.3 换行与断行 四、注释规范:代码的…...
Docker架构详解
一,Docker的四大要素:Dockerfile、镜像(image)、容器(container)、仓库(repository) 1.dockerfile:在dockerfile文件中写构建docker的命令,通过dockerbuild构建image 2.镜像:就是一个只读的模板,镜像可以用来创建docker容器&…...
VS Code中Maven未能正确读取`settings.xml`中配置的新路径
在VS Code中Maven未能正确读取settings.xml中配置的新路径,通常是由于以下原因导致的: 一、VS Code未使用你修改的settings.xml文件 VS Code的Maven插件可能使用了默认配置或指向其他settings.xml文件。解决方法: 手动指定settings.xml路径…...
Spring Boot 注解 @ConditionalOnMissingBean是什么
一句话总结: ConditionalOnMissingBean 是 Spring Boot 提供的一个 条件注解(Conditional Annotation),意思是: 只有当 Spring 容器中 不存在 某个 Bean 时,当前的 Bean 或配置才会被加载。 这是一种典型的…...
labview实现LED流水灯的第二种方法
LED流水灯的描述:写一个跑马灯程序,7个灯从左到右不停的轮流点亮,闪烁间隔由滑动条调节,并尝试拓展到任意个LED灯。 在前面的文章中,我们提到了使用labview实现LED流水灯的第一种方法。这篇文章来介绍一下实现LED流水灯的第二种方…...
Katoolin3 项目介绍:在 Ubuntu 上轻松安装 Kali Linux 工具
引言 在网络安全和渗透测试领域,Kali Linux 以其丰富的工具集成为首选操作系统。然而,Kali Linux 作为一个专为安全研究设计的系统,可能不适合日常使用或服务器环境(如 Ubuntu VPS)。Katoolin3 是一个强大的 Python 脚…...
labview设计一个虚拟信号发生器
目标:设计一个虚拟信号发生器,通过功能键的设置可以产生正弦波、三角波、方波和锯齿波,并可以通过输入控件设置采集信号的频率、幅值、相位等参数。 一、正弦波 (1)创建一个枚举 (2)点击属性后…...
java I/O
文件字符流 字符流不同于字节,字符流是以一个具体的字符进行读取,因此它只适合读纯文本的文件,如果是其他类型的文件不适用。 字节流;英文1个字节,中文3个字节。 字符流:中英文都是2个字节 public static…...
机器学习第二十三讲:CNN → 用放大镜局部观察图片特征层层传递
机器学习第二十三讲:CNN → 用放大镜局部观察图片特征层层传递 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:超详细手把手指南 CNN详…...
webpack构建速度和打包体积优化方案
一、分析工具 1.1 webpack-bundle-analyzer 生成 stats.json 文件 打包命令webpack --config webpack.config.js --json > stats.json使用 webpack-bundle-analyzer 插件const BundleAnalyzerPlugin = require(webpack-bundle-analyzer).BundleAnalyzerPlugin; plugins: […...
RabbitMQ可靠传输——持久性、发送方确认
一、持久性 前面学习消息确认机制时,是为了保证Broker到消费者直接的可靠传输的,但是如果是Broker出现问题(如停止服务),如何保证消息可靠性?对此,RabbitMQ提供了持久化功能: 持久…...
《深度掌控Linux:openEuler、CentOS、Debian、Ubuntu的全方位运维指南》
《深度掌控Linux:openEuler、CentOS、Debian、Ubuntu的全方位运维指南》 一、引言 在当今数字化的时代背景下,Linux操作系统凭借其卓越的性能、可靠性和开源的优势,在服务器、云计算、嵌入式系统等众多领域占据着举足轻重的地位。对于IT运维…...
关于大语言模型的问答?
1.Why is prompt(提示词) engineering necessary when working with large language models (LLMs)? 答:Despite LLMs are powerful and versatile, they could still generate texts that are too generic, hallucinated, irrelevant, or …...
大模型应对大风等极端天气的卓越效果及其在能源预测中的特殊价值
引言 近年来,全球气候变化加剧,极端天气事件频发,尤其是大风天气的强度和频率显著增加。这不仅对电网安全运行带来挑战,也对风电场的发电效率、设备安全和收益稳定性造成影响。传统的气象预测和能源管理方法已难以满足高精度、实时响应的需求。而基于人工智能(AI)的大模…...
【web应用】vue3前端框架怎么修改logo?
菜单栏logo修改:src/assets/logo中的图片替换 浏览器栏目logo修改:public文件夹中的icon文件替换...
【Windows】FFmpeg安装教程
FFmpeg 下载与安装指南 下载 FFmpeg 访问 FFmpeg 官网点击页面上的 “Download” 按钮进入下载页面 配置环境变量 将 FFmpeg 的 bin 目录添加到系统环境变量 PATH 中 验证安装 打开 PowerShell输入命令 ffmpeg -version若显示版本信息,则表明安装成功 视频格式检…...
阿里巴巴 MCP 分布式落地实践:快速转换 HSF 到 MCP server
MCP 为资源访问和 Multi Agent 互操作提供了标准化的可能。开源社区目前对 MCP 的生态建设非常火热,mcp.so 已经提供了近 1 万的 mcp server ,其他各种 MCP 生态组件更是层出不穷。AI 大厂们积极拥抱 MCP ,并纷纷提供了自己的 MCP server。对…...
基于阿里云DashScope API构建智能对话指南
背景 公司想对接AI智能体,用于客服系统,经过调研和实施,觉得DashScope 符合需求。 阿里云推出的DashScope灵积模型服务为开发者提供了便捷高效的大模型接入方案。本文将详细介绍如何基于DashScope API构建一个功能完善的智能对话系统&#x…...
RK3588 RGA 测试
RK3588 RGA 测试 一、数据分析总结【由LLM生成】二、考链接三、测试数据四、测试过程4.1 编译librga SDK4.2 运行自带的测试4.3 生成`Resize`测试程序4.4 运行`Resize`测试4.5 遇到的错误一、数据分析总结【由LLM生成】 本次测试针对不同的源图像尺寸、目标图像尺寸和缩放算法…...
【机器学习】集成学习算法及实现过程
一、学习目标 了解什么是集成学习了解机器学习中的两个核⼼任务理解Bagging集成原理理解随机森林构造过程掌握RandomForestClassifier的使⽤掌握boosting集成原理和实现过程理解bagging和boosting集成的区别理解AdaBoost集成原理理解GBDT的算法原理 二、集成学习算法简介 2.…...
Vue:axios(GET请求)
基础 GET 请求 axios.get(https://api.example.com/data).then(response > {console.log(响应数据:, response.data);}).catch(error > {console.error(请求失败:, error);});参数传递方式 axios.get(/api/search, {params: {keyword: vue,page: 1,sort: desc} });// 实…...
iOS工厂模式
iOS工厂模式 文章目录 iOS工厂模式简单工厂模式(Simple Factory)工厂方法模式(Factory Method)抽象工厂模式(Abstract Factory)三种模式对比 简单工厂模式(Simple Factory) 定义&am…...
GitHub 趋势日报 (2025年05月21日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1microsoft/WSLLinux的Windows子系统⭐ 1731⭐ 25184C2virattt/ai-hedge-fundA…...
iOS 直播弹幕功能的实现
实现iOS直播弹幕功能需要考虑多个方面,包括弹幕的显示、管理、动画效果以及与直播流的同步。 核心实现方案 1. 弹幕显示视图 class BarrageView: UIView {// 弹道(轨道)数组private var tracks: [CALayer] []// 正在显示的弹幕数组 private var displayingBarra…...
借助Azure AI Foundry 如何打造语音交互新体验
在刚刚落幕的微软创想未来峰会上,Contoso 智能家居的现场演示引发了热议。许多观众在会后留言询问如何回看这场精彩演示。今天,微软为您揭秘 Contoso 如何借助微软最新技术实现智能家居的飞跃式创新。 当语音遇上智能体:用户体验焕然一新 如…...
Spring开发系统时如何实现上传和下载文件
代码如下 值得注意的是上传时候不需要参数servletRequest而下载时候却需要servletResponse,这是为什么呢? 这是因为文件上传时,客户端通过 HTTP POST 请求将文件数据放在 请求体(Body) 中。Spring MVC 对上传过程进行…...
CyberSecAsia专访CertiK首席安全官:区块链行业亟需“安全优先”开发范式
近日,权威网络安全媒体CyberSecAsia发布了对CertiK首席安全官Wang Tielei博士的专访,双方围绕企业在进军区块链领域时所面临的关键安全风险与防御策略展开深入探讨。 Wang博士在采访中指出,跨链桥攻击、智能合约漏洞以及私钥管理不当&#x…...
Android 直播播放器FFmpeg静态库编译实战指南(NDK r21b)
一、环境准备与验证 1.1 必要组件安装 # Ubuntu环境依赖 sudo apt update sudo apt install -y git make automake autoconf libtool pkg-config curl unzip# NDK r21b下载 mkdir -p ~/android && cd ~/android wget https://dl.google.com/android/repository/andro…...
Linux中 I/O 多路复用机制的边缘触发与水平触发
边缘触发(Edge Triggered, ET)与水平触发(Level Triggered, LT) Linux中I/O复用机制epoll -CSDN博客 Linux中的 I/O 复用机制 select-CSDN博客 在 epoll 或其他 I/O 多路复用机制中,触发模式是指如何触发文件描述符…...
01-jenkins学习之旅-window-下载-安装
1 jenkins简介 百度百科介绍:Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。 [1] Jenkins官网地址 翻译&…...
实战:Dify智能体+Java=自动化运营工具!
我们在运营某个圈子的时候,可能每天都要将这个圈子的“热门新闻”发送到朋友圈或聊天群里,但依靠传统的实现手段非常耗时耗力,我们通常要先收集热门新闻,再组装要新闻内容,再根据内容设计海报等。 那怎么才能简化并高…...
LInux—shell编程
一、Shell 编程核心特性 解释型语言 无需编译,直接由 bash、sh 等解释器逐行执行。 类似 PHP 的解释执行,不同于 C 的编译型。 系统命令集成 可直接调用 Linux 命令(如 ls、grep、awk),实现系统管理自动化。 与 C/…...
C++028(变量的作用域)
变量的作用域 作用域就是程序中变量的作用范围。局部变量的作用域是局部的,如函数体内;全局变量的作用域则是整个程序。 我们前面接触过的变量基本都是局部变量,这些变量在函数体内声明,无法被其他函数所使用。函数的形参也属于…...
计算机三级数据库免费题库
1.免费题库链接 链接: https://pan.baidu.com/s/1oNpgWmkFePUrCS6G7tfpUQ?pwdb1hg 提取码: b1hg 2.安装教程...
Unity Shader入门(更新中)
参考书籍:UnityShader入门精要(冯乐乐著) 参考视频:Bilibili《Unity Shader 入门精要》 写在前面:前置知识需要一些计算机组成原理、线性代数、Unity的基础 这篇记录一些学历过程中的理解和笔记(更新中&…...
NSSCTF-[陇剑杯 2021]webshell(问6)
下载得到pcap文件 放到Wireshark进行分析 先过滤http contains "1.php"&&http.request.method"POST" 追踪HTTP流 将后面的进行解码 得到flag NSSCTF{192.168.239.123}...
vscode git push 记录
1.先在git上建一个仓库 2.在vscode上登录同一账号 配置好ssh 直接使用 git remote add origin gitgithub.com:18053923230/aiRecipe.git (base) PS D:\gitee\cookbook> git push -u origin master Enter passphrase for key /c/Users/Administrator/.ssh/id_ed25519: …...
前端性能优化方案
一、HTML优化策略 1、减少DOM层级 <!-- 避免 --><div><div><div><p>内容</p></div></div></div><!-- 推荐 --><div class"content">内容</div> 原因:嵌套过深会增加渲染…...
前端vscode学习
1.安装python 打开Python官网:Welcome to Python.org 一定要点PATH,要不然要自己设 点击install now,就自动安装了 键盘winR 输入cmd 点击确定 输入python,回车 显示这样就是安装成功了 2.安装vscode 2.1下载软件 2.2安装中文 2.2.1当安…...
python实现web请求与回复
一、作为客户端发送请求(使用requests库) import requests # 发送GET请求 response requests.get("https://api.example.com/data") print("GET响应状态码:", response.status_code) print("GET响应内容:", response.…...
Python实现Web请求与响应
目录 一、Web 请求与响应基础 (一)Web 请求与响应的定义与组成 (二)HTTP 协议概述 (三)常见的 HTTP 状态码 二、Python 的 requests 库 (一)安装 requests 库 (二…...
AI与.NET技术实操系列(六):实现图像分类模型的部署与调用
引言 人工智能(AI)技术的迅猛发展推动了各行各业的数字化转型。图像分类,作为计算机视觉领域的核心技术之一,能够让机器自动识别图像中的物体、场景或特征,已广泛应用于医疗诊断、安防监控、自动驾驶和电子商务等领域…...
PP-YOLOE-SOD学习笔记1
项目:基于PP-YOLOE-SOD的无人机航拍图像检测案例全流程实操 - 飞桨AI Studio星河社区 一、安装环境 先准备新环境py>3.9 1.先cd到源代码的根目录下 2.pip install -r requirements.txt 3.python setup.py install 这一步需要看自己的GPU情况,去飞浆…...
Axure系统原型设计列表版方案
列表页面是众多系统的核心组成部分,承担着数据呈现与基础交互的重要任务。一个优秀的列表版设计,能够极大提升用户获取信息的效率,优化操作体验。下面,我们将结合一系列精心设计的列表版方案图片,深入探讨如何打造出实…...
腾讯音乐二面
ReentrantLock 的源码及实现 ReentrantLock 是 Java 中的一种可重入的互斥锁。它通过 AQS(AbstractQueuedSynchronizer)框架来实现。AQS 使用一个 FIFO 队列来管理获取锁的线程。ReentrantLock 有公平锁和非公平锁两种模式。非公平锁:当线程尝…...
服务器操作系统调优内核参数(方便查询)
fs.aio-max-nr1048576 #此参数限制并发未完成的异步请求数目,应该设置避免I/O子系统故障 fs.file-max1048575 #该参数决定了系统中所允许的文件句柄最大数目,文件句柄设置代表linux系统中可以打开的文件的数量 fs.inotify.max_user_watches8192000 #表…...
MySQL5.7导入MySQL8.0的文件不成功
文章目录 问题检查原因及解决方法原因解决办法 问题 检查 检查自己的mysql版本自己检查,搜索“0900_ai_ci”,如果能搜索到,说明这个sql文件是从8的版本导出的 原因及解决方法 原因 MySQL 8.0默认使用utf8mb4字符集和utf8mb4_0900_ai_ci排…...
vscode连接WSL卡住
原因:打开防火墙 解决: 使用sudo ufw disable关闭防火墙...
springAI调用deepseek模型使用硅基流动api的配置信息
查看springai的官方文档,调用deepseek的格式如下: spring.ai.deepseek.api-key${your-api-key} spring.ai.deepseek.chat.options.modeldeepseek-chat spring.ai.deepseek.chat.options.temperature0.8 但是硅基流动的格式不是这样,这个伞兵…...