所需E币: 0
时间: 2023-12-18 10:38
大小: 3.46KB
今天给大家讲讲关于SpringBoot2仿B站的一个项目,大家都知道,如今短视频成为了风口中的风口,但市场上极度缺乏视频业务开发的相关技术人才。本文将结合SpringCloud微服务架构+Springboot+JDK+Maven+VUE等技术,实现B站核心功能(视频流、弹幕流)+百万量级的高性能优化,从而帮助大家提升前端加后端技术水平,掌握架构设计思维及丰富解决方案。实现步骤使用Vue3提供的Provide/Inject组合,通过provide在App.vue中提供当前语言环境localeLanguage,代码片段如下所示://App.vue <scriptsetuplang="ts"> importzhCnfrom'element-plus/lib/locale/lang/zh-cn' importenfrom'element-plus/lib/locale/lang/en' import{ref,provide}from'vue' //显示引入provide constlocale=ref(zhCn) constlocaleLanguage=ref('') functionchangeLang(language:any){ locale.value=language localeLanguage.value=language.name } //提供当前语言环境localeLanguage provide('localeLanguage',localeLanguage) </script>然后再通过inject将其注入到home页面,将获取到的localeLanguage传入自定义的t函数中,代码片段如下所示://home/index.vue <scriptsetuplang="ts"> import{useRoute}from'vue-router' import{inject}from'vue' //显示引入inject import{t}from'../../utils/internationalization' //通过inject将localeLanguage注入,作为t函数的参数 constlocaleLanguage:string=inject('localeLanguage')||'' constroute=useRoute() console.log(route.params) constvalue1='' </script> <template> <div>{{t(localeLanguage).home}}---{{t(localeLanguage).mine}}</div> <el-date-pickerv-model="value1"type="date"placeholder="Pickaday"></el-date-picker> </template>封装一个openStore(),使用indexedDB.open()方法返回一个IDBRequest对象,接着将这个对象上的三个事件分别放置进入:onsuccess、onerror、onupgradeneeded。onsuccess表示打开数据库成功的事件。onerror表示打开数据库失败的事件。onupgradeneeded是数据库升级事件,如果版本号更新,并且大于之前的版本号则进行数据库升级,该事件回调里面,会创建我们所需要的对象仓库,类似于关系型数据库中的表的概念。exportdefaultclassDB{ privatedbName:string//数据库名称 constructor(dbName:string){ this.dbName=dbName } //打开数据库 publicopenStore(storeName:string,keyPath:string,indexs?:Array<string>){ constrequest=window.indexedDB.open(this.dbName,2) request.onsuccess=(event)=>{ console.log('数据库打开成功') console.log(event) } request.onerror=(event)=>{ console.log('数据库打开失败') console.log(event) } request.onupgradeneeded=(event)=>{ console.log('数据库升级成功') const{result}:any=event.target conststore=result.createObjectStore(storeName,{autoIncrement:true,keyPath}) if(indexs&&indexs.length>0){ indexs.map((v:string)=>{ store.createIndex(v,v,{unique:true}) }) } store.transaction.oncomplete=(event:any)=>{ console.log('创建对象仓库成功') } console.log(event) } }}Promise包装异步事务为了更好的获取indexedD事务中的返回结果,我们使用promise来包装一下上一小节indexedDB.ts中定义的几个方法:openStore、updateItem、deleteItem、getList、getItem。下面代码片段为getList() //查询所有数据 getList(storeName:string){ conststore=this.db.transaction(storeName).objectStore(storeName) constrequest=store.getAll() returnnewPromise((resolve,reject)=>{ request.onsuccess=(event:any)=>{ console.log('查询所有数据成功') console.log(event.target.result) resolve(event.target.result) } request.onerror=(event:any)=>{ console.log('查询所有数据失败') console.log(event) reject(event) } }) }使用@include指令来引入定义好的样式函数,该函数的三个参数可以根据传入的值来对flex布局进行自定义,默认值为:column、center、right,在footerCommon.scss中我们重新自定义了该样式函数,分别传入row、space-between、flex-start,代码片段如下://footerCommon.scss.common-footer{ border-top:1pxsolidrgb(235,235,235); .footer{ @includemain-wrapper; @includelayout(row,space-between,flex-start); padding:20px0; li{ @includelayout; h4{ font-weight:bold; } a{ margin-bottom:10px; color:rgb(72,72,72); text-decoration:none; &:hover{ text-decoration:underline; } } } }}getter类似与Vue中的computed计算属性,它的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算getters里可以处理一些array、object的查询、过滤、遍历、重构或者做一些字符拼接的操作,方便直接生成一些可以直接使用的数据。如下代码片段展示了如何在getter中进行过滤查询:exportconststore=createStore({ state:{ todos:[ //定义一个对象数组 { id:1, done:true }, { id:2, done:false } ] } getters:{ doneTodosCount(){ //查询已完成的个数 returnstore.state.todos.filter(todo=>todo.done).length //返回值:1 } } })通过环境变量区分server.js中的一些代码片段,因为有些代码需要运行在开发环境,而有些代码需要运行在生产环境。本小节在server.js中一共对3个地方进行了环境区分,代码片段如下//server.jsif(!isProd){ //1.读取index.html template=fs.readFileSync( path.resolve(__dirname,'index.html'), 'utf-8' ) //2.应用ViteHTML转换。这将会注入ViteHMR客户端, // 同时也会从Vite插件应用HTML转换。 // 例如:@vitejs/plugin-react-refresh中的globalpreambles template=awaitvite.transformIndexHtml(url,template) //3.加载服务器入口。vite.ssrLoadModule将自动转换 // 你的ESM源码使之可以在Node.js中运行!无需打包 // 并提供类似HMR的根据情况随时失效。 render=(awaitvite.ssrLoadModule('/src/entry-server.ts')).render}else{ //1.读取index.html template=fs.readFileSync( path.resolve(__dirname,'dist/client/index.html'), 'utf-8' ) //3.加载服务器入口 render=require('./dist/server/entry-server.ts').render}