开发案例-Vue Cli项目动态引入图片资源、Fastapi+PG库搭建web服务、自定义video元素控件
Vue CliVue3项目使用v-bind动态控制img的src属性值踩坑记录之前自己写项目都是用ViteVue3突然接了个需要维护的项目使用Vue CliVue3构建的因为本人之前很少接触webpack流所以对其特性不是很了解导致踩了一些坑。踩坑记录-webpack项目img标签:src“urlPath“拿不到图片吐槽都2025年了怎么还有项目没用Vite呢简直比webpack流好用几十倍啊不论是启动还是热更新都遥遥领先。回到正题踩坑点使用img :srcimgs.img居然无法正常获取到图片。不使用v-bing绑定正常写入imgs.img的值时又可以正常显示图片。分析因为个人实在不想去了解过时的框架特性在C站上简单搜了下相关案例发现是脚手架的机制问题因为在Vite中就不会出现这种问题于是只能通过require动态导入资源。案例代码template!-- 一个3行2列的虚拟表格 --divclasstable_boxdivv-foritem in data:keyitem.keyclasscolimg:srcitem.imgaltclasscol_left_icondivclasscol_name{{ item.label }}/divdivclasscol_num{{ item.num item.unit }}/div/div/div/templatescriptsetuplangtsimport{ref}fromvueconstdataref([{img:require(../../assets/img/ck-icon1.png),key:key1,label:标签1,num:0,unit:个},{img:require(../../assets/img/ck-icon2.png),key:key2,label:标签2,num:0,unit:个},{img:require(../../assets/img/ck-icon3.png),key:key3,label:标签3,num:0,unit:条},// ... 共6条再次吐槽如果是Vite构建的项目此处无需使用require动态导入资源直接写相对路径即可。])/scriptstylelangscssscoped.table_box { height: 100%; width: 100%; display: flex; flex-wrap: wrap; //这个属性可以让弹性盒在适当的时候一般是宽度达到100%自动换行 justify-content: space-between; //结合上一条属性可以实现类似表格的效果 margin-top: 0.5vh; .col { height: 29%; width: 47%; margin: 0.4vh 0.5vh; display: flex; align-items: center; text-align: left; .col_left_icon { height: 60%; } .col_name { width: 38%; margin-left: 0.5vh; color: #fff; font-size: 0.7vw; white-space: nowrap; //强制不换行 } .col_num { width: 38%; margin-right: 0.5vh; color: aqua; font-size: 1vw; font-weight: 500; text-align: right; } } }使用FastApiPostgreSQL开发一个web服务端主要使用技术fastapi创建web服务器psycopg2连接数据库工具第三方库安装pip install fastapi搭建服务器pip install fastapi_cdn_host接口文档本地化部署pip install psycopg2连接pg数据库用pip install uvicorn启动服务器源码importosimporttimeimportjsonimportfastapi_cdn_host# 自动文档cdnimportconfigparser# 读取配置importpsycopg2# pg库工具fromdatetimeimportdatetime# 系统时间fromfastapiimportFastAPI,HTTPExceptionfrompydanticimportBaseModel,ConfigDictfromcontextlibimportasynccontextmanager# 创建一个读取配置文件的对象configconfigparser.ConfigParser()config.read(config.ini)# 获取配置信息db_hostconfig.get(pgdb,host)db_nameconfig.get(pgdb,database)db_userconfig.get(pgdb,user)db_passconfig.get(pgdb,password)db_portconfig.get(pgdb,port)# 创建连接对象connpsycopg2.connect(databasedb_name,userdb_user,passworddb_pass,hostdb_host,portdb_port)# print(Connected to PostgreSQL)curconn.cursor()# 获取游标# 使用asynccontextmanager装饰器来定义一个异步上下文管理器这将作为你的生命周期事件处理器asynccontextmanagerasyncdeflifespan(app:FastAPI):# 应用启动时执行的代码print(fFastAPI server started:{datetime.now()})yield# 应用关闭时执行的代码用于清理未关闭连接conn.close()print(fFastAPI server stopped:{datetime.now()})# 创建API接口appFastAPI(lifespanlifespan)# 引入本地cdn资源fastapi_cdn_host.patch_docs(app)# 参数类classQuery(BaseModel):# 借助 Pydantic 的BaseModel方法来使用标准的 Python 类型声明请求体sql:str# sql语句传参前端提供详细语句后端负责连接数据库执行dataSource:str# 数据源传参根据原始表的所属租户填写app.post(/pyapi/test/openQuery)deftest_open_query(query:Query):try:ifquery.dataSourcenotNone:print(query.dataSource,query.toJson)cur.execute(query.sql)return{status:200,msg:Operations Success!,data:cur.fetchall()}exceptExceptionase:raiseHTTPException(status_code500,detaile)classAnyParam(BaseModel):model_configConfigDict(extraallow)# 允许接收额外的字段app.post(/pyapi/test/pushPageVisits)deftest_push_page_visits(param:AnyParam):try:# 执行数据库插入数据操作cur.execute(INSERT INTO public.t_a_test_visits (username, employeeId, pageName, pageRoute, startTime, endTime, loginId) VALUES (%s, %s, %s, %s, %s, %s, %s),(param.username,param.employeeId,param.pageName,param.pageRoute,param.startTime,param.endTime,param.loginId))conn.commit()# 提交事务return{status:200,msg:Operations Success!}exceptExceptionase:conn.rollback()# 回滚事务raiseHTTPException(status_code500,detaile)app.post(/pyapi/test/getPageVisits)deftest_get_page_visits(param:AnyParam):# 执行数据库查询操作try:cur.execute(SELECT * FROM public.t_a_test_visits WHERE username coalesce(%s, username),(param.username,))return{status:200,msg:Operations Success!,data:cur.fetchall()}exceptExceptionase:raiseHTTPException(status_code500,detaile)# 启动服务器if__name____main__:os.system(chcp cls)importuvicorn uvicorn.run(main:app,host127.0.0.1,port8000,reloadTrue)# reload在开发时可设置为True在修改代码后会自动重启项目但打包时必须设置为False否则会导致应用被重复启动的问题原生video元素自定义控件背景项目需要对video元素做一些样式定义原生的很难修改于是借助video标签的事件进行自定义控件改造。本文内容基于网上大神分享的vue2方案改写为适配vue3的方案。原文链接掘金_原生video元素自定义播放控件controls开发环境Vue3 3.2Nodejs 18ElementPlus 2.3基础功能播放、暂停按钮当前播放时长/视频总时长进度条点击或拖动滑块可跳转进度并续播音量控制控件显隐源码templatedivclasscustomer_video_wrapmouseleavehideControlsmouseovershowControlsvideorefvideoPlayersrchttp://vjs.zencdn.net/v/oceans.mp4width100%:class[answerVideo, isMirror]preloadautotimeupdateupdateProgressBarloadedmetadatagetDurationendedonVideoEndedclicktogglePlay/video!-- 自定义视频控件 --transitionnameel-fade-in-lineardivclassvideo_controlv-showisShowingControlsstyletransition:opacity .5s;divclassvideo_control_topdivel-iconv-ifisPlayingclicktogglePlayVideoPause//el-iconel-iconv-elseclicktogglePlayVideoPlay//el-iconspanclassvideo_time{{ formatTime(currentTime) }}span/ {{ formatTime(duration) }}/span/span/divspanclassvideo_volume_wrapel-sliderclassvideo_volumev-modelvolumechangechangeVolume/el-slider音量/span/divel-sliderrefprogressSliderclassvideo_control_progressv-modelcurrentTime:show-tooltipfalse:maxdurationmousedownhandleDragStarttouchstarthandleDragStartchangechangeProgress/el-slider/div/transition/div/templatescriptsetupimport{VideoPause,VideoPlay}fromelement-plus/icons-vueimport{ref}fromvue// 自定义视频控件功能逻辑constisPlayingref(false)constcurrentTimeref(0)constdurationref(1)constvolumeref(30)constisShowingControlsref(true)constisDragingref(false)constvideoPlayerref(null)letvideo/** 视频播放/暂停 */consttogglePlay(){videovideoPlayer.valueif(video.paused){video.play()isPlaying.valuetrue}else{video.pause()isPlaying.valuefalse}}/** 视频播放结束 */constonVideoEnded(){isPlaying.valuefalse}/** 获取视频时长 */constgetDuration(){videovideoPlayer.valueif(video){duration.valueNumber.isFinite(video.duration)?video.duration:5}}/** 更新进度条 */constupdateProgressBar(){getDuration()if(isDraging.value){return}if(video){currentTime.valuevideo.currentTime}}/** 拖拽进度条结束时 */constchangeProgress(value){isDraging.valuefalsevideo.currentTimevalue video.play()isPlaying.valuetrue}/** 拖拽进度条开始与进行中时 */consthandleDragStart(){isDraging.valuetruevideo.pause()}/** 音量变化 */constchangeVolume(value){video.volumevalue/100}/** 格式化时间 */constformatTime(seconds){constformatval0${Math.floor(val)}.slice(-2)consthoursseconds/3600constminutes(seconds%3600)/60secondsseconds%60if(hours1){return[minutes,seconds].map(format).join(:)}return[hours,minutes,seconds].map(format).join(:)}/** 显示控制组件 */constshowControls(){isShowingControls.valuetrue}/** 隐藏控制组件 */consthideControls(){isShowingControls.valuefalse}/scriptstylescopedlangless.customer_video_wrap{position:relative;width:100%;}.answerVideo{z-index:1;}video.isMirror{transform:scale(-1,1);}// 自定义视频控件 .video_control{position:absolute;bottom:0;left:0;right:0;padding:8px 20px;background:linear-gradient(0deg,#000000 5%,#00000073,transparent);.video_control_top{display:flex;justify-content:space-between;align-items:center;color:#fff;i{font-size:20px;color:#fff;}.video_time{transform:translateY(-2px);display:inline-block;margin-left:8px;}.video_volume_wrap{display:flex;align-items:center;font-size:13px;}.video_volume{width:70px;margin-right:8px;}}:deep(.el-slider){.el-slider__runway{background-color:#cbcbcb;height:4px;margin:4px 0;}.el-slider__bar{height:4px;background-color:#fff;}.el-slider__button-wrapper{top:-16px;}.el-slider__button{width:10px;height:10px;border:none;}}}/style最终效果

相关新闻

Unity中Projection节点的原理与应用实战

Unity中Projection节点的原理与应用实战

1. Projection节点在Unity中的核心作用解析在Unity的Shader Graph和URP渲染管线中,Projection节点是一个经常被忽视但极其重要的基础构件。这个节点的本质功能是将三维空间中的坐标转换到屏幕投影空间,相当于完成了从世界坐标系到屏幕坐标系的数学映射。…

2026/8/9 19:47:05 阅读更多 →
Claude Code多模型配置实战:灵活切换国内外大模型,提升开发效率

Claude Code多模型配置实战:灵活切换国内外大模型,提升开发效率

1. 项目概述:为什么我们需要一个“多模型”的Claude Code方案?如果你最近在折腾AI编程助手,Claude Code这个名字大概率已经出现在你的视野里了。它作为Anthropic推出的官方编程工具,以其强大的代码理解和生成能力,迅速…

2026/8/9 19:47:05 阅读更多 →
虚拟电厂多时间尺度储能优化调度与MATLAB实现

虚拟电厂多时间尺度储能优化调度与MATLAB实现

1. 项目背景与核心挑战 在能源转型的大背景下,高比例可再生能源并网已成为电力系统发展的必然趋势。根据国际能源署(IEA)统计,2023年全球可再生能源发电量占比已突破30%,其中风电和光伏的波动性特征给电网运行带来了前所未有的挑战。这种波动…

2026/8/9 19:47:05 阅读更多 →

最新新闻

快速集成DSR功能:通过智能合约与Python API实现Dai收益优化

快速集成DSR功能:通过智能合约与Python API实现Dai收益优化

快速集成DSR功能:通过智能合约与Python API实现Dai收益优化 【免费下载链接】developerguides Developer guides to integrate with MakerDAOs smart contracts, SDKs, APIs, products, and partners 项目地址: https://gitcode.com/gh_mirrors/de/developerguide…

2026/8/9 20:34:24 阅读更多 →
如何快速集成Pickerview?5分钟上手Android时间选择器

如何快速集成Pickerview?5分钟上手Android时间选择器

如何快速集成Pickerview?5分钟上手Android时间选择器 【免费下载链接】pickerview One very very user-friendly Picker library(内部提供两种常用类型的Picker:时间选择器(支持聚合)和联动选择器(支持不联…

2026/8/9 20:34:24 阅读更多 →
gh_mirrors/ts/similarity核心算法解密:TSED如何实现99%精准的代码结构比对

gh_mirrors/ts/similarity核心算法解密:TSED如何实现99%精准的代码结构比对

gh_mirrors/ts/similarity核心算法解密:TSED如何实现99%精准的代码结构比对 【免费下载链接】similarity 项目地址: https://gitcode.com/gh_mirrors/ts/similarity gh_mirrors/ts/similarity是一个高性能的代码相似度计算工具,它采用基于Rust的…

2026/8/9 20:34:24 阅读更多 →
Draino进阶配置:Pod保护策略与高级节点过滤规则

Draino进阶配置:Pod保护策略与高级节点过滤规则

Draino进阶配置:Pod保护策略与高级节点过滤规则 【免费下载链接】draino Automatically cordon and drain Kubernetes nodes based on node conditions 项目地址: https://gitcode.com/gh_mirrors/dr/draino Draino是一款强大的Kubernetes节点自动维护工具&a…

2026/8/9 20:34:24 阅读更多 →
HTML+JS实现智能风扇控制界面开发指南

HTML+JS实现智能风扇控制界面开发指南

1. 项目概述:HTML智慧风扇控制界面开发最近在帮朋友改造传统电风扇时,发现用HTMLCSSJS构建控制界面是个非常实用的方案。这个"智慧风扇"项目核心是通过网页技术实现远程控制、风速调节和定时功能,完全基于前端技术栈,不…

2026/8/9 20:34:24 阅读更多 →
你写的叫“工作内容流水账”,HR想看的叫“工程产出”——一字之差,面试机会差十倍

你写的叫“工作内容流水账”,HR想看的叫“工程产出”——一字之差,面试机会差十倍

关注 「软件测试就业联盟」公众号,陪你走好校招求职的每一步 一、简历石沉大海,问题出在那个被你用烂的动词上 前段时间帮一个业务线招人,HR推来二十份简历,我花了不到二十分钟全部筛完。不是效率高,是大多数简历划三秒…

2026/8/9 20:33:24 阅读更多 →

日新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/9 17:05:02 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/9 0:45:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/9 17:05:02 阅读更多 →