Web应用实现在手机端访问和使用方案

1. 背景 当前的后台管理系统主要负责云平台和云服务器的管理,并且是以Web应用的形式在使用。但是,当出现服务器紧急情况或需要进行平台注册审核时,如果这些任务发生在非工作时间,例如在通勤路上,我们就无法使用PC浏览器进行访问和操作,这显然是不方便的。另外,由于后台管理系统仅供内部人员使用,我们只需要它能满足基本的查看和配置需求,对于便利性和美观性并没有太高要求。因此,将Web端的所有功能移植到手机端并开发一个App,显然很不划算。毕竟,每当Web端功能迭代时,App端也需要同步更新,这意味着同一功能需要实现两次,所以,开发App的方案就不考虑了。 2. 方案 2.1 方案一:使用手机Edge、Firefox浏览器访问使用【推荐】 使用手机通过Edge或Firefox浏览器访问时,设置为“查看桌面网站”(Firefox中称为桌面版网站开关),即可浏览平台的完整布局,并通过手势放大和缩小来居中展示所需内容,操作便捷。 可将后台管理系统的管理平台添加到手机主屏幕,实现快速访问。 以TDesign页面模板演示效果。 2.2 方案二:当前页面 + 全屏 创建一个专为手机端使用的手机端菜单,仅显示关注页面,手机端访问时读取该菜单显示。 利用@media媒体查询调整各页面布局,例如筛选条件等,以避免布局错乱。 默认情况下,只能在手机横屏模式下使用,提供一个全屏按钮,点击后将当前页面全屏化,以争取更多展示空间。 2.3 方案三:远程软件控制电脑访问使用 使用远程软件(如向日葵)访问电脑,然后在手机端通过手势放大和缩小进行操作。效果与方案一相似,但存在以下不足: 输入时需要手动打开键盘。 页面有滚动条时操作繁琐。 连接可能不稳定,画质不佳。 3. 结论 方案一无需额外开发成本,只需在指定手机浏览器上使用即可。 方案二需要额外开发,且最终呈现效果可能不如方案一。 方案三存在上述提到的缺点。 综合考虑,推荐采用方案一。

2024-11-01 · 1 分钟 · 29 字

VuePress文档初始化请求过多问题探讨

1. 背景 公司有部门使用VuePress 1.0搭建平台的帮助文档,前期文档不是很多,所以没有暴露出特别明显的问题。但随着文档的逐步迭代和内容的增多,出现了大量的并发请求,总共有218个请求,导致服务器带宽耗尽、响应速度下降,进而影响了文档的使用。 2. 问题分析 VuePress 1.0是基于Vue 2和webpack实现的,其模块化方式使用的是CommonJS。这意味着,当项目打包部署在服务器并进行访问时,需要将源码全部加载完成后才能进行渲染,即同步加载。随着项目持续迭代,内容增多,性能问题逐渐显现。 3. 解决方案 考虑到向服务器发起了200多个请求,但查看那些.js文件,整个js文件夹大小才10.3MB,是否可以将10.3MB分为10个.js文件,减少请求至10次呢? 3.1 方案一:替换成showDoc 使用showDoc在线文档系统,相比vuepress基于vue.js的静态站点生成器,除了操作便利,对于解决并发请求200次这个问题,还是有帮助的,毕竟showDoc初始化的时候,是从服务器获取文档目录,再通过文档ID,去请求文档详情,通常来说,不会有那么多文档目录,不太可能出现并发请求200次这个问题,只是将vuepress迁移至showDoc,花费的成本很高,文档格式需要调整,图片需要上传,想想这个工作量就头大,再者,作为平台的帮助文档,本身带有宣传的作用,很难醒目地在showDoc中体现平台的公司名和Logo,所以这个方案不推荐。 3.2 方案二:研究webpack如何合并打包 如果请求过多是因为文件太分散导致的,那么,能够在当前基础上,也就是webpack里,找到,当打包时,将各个文件合并,减少请求次数呢? VuePress 1.0 支持通过 webpack-chain 链式操作来修改内部的 webpack 配置,如下所示: module.exports = { chainWebpack (config, isServer) { // config 是一个 ChainableConfig 的实例 } } 那在 webpack 中,如何对打包的体积、文件等进行处理呢?在 webpack 官方文档中,有推荐使用 SplitChunksPlugin 插件,是为了代码分割,减少包的体积,然后优化加载效率,感觉和自己的初衷背道而驰,最终没达到自己想要的效果。还有就是研究了下 ModuleConcatenationPlugin 插件,其作用是将所有模块的作用域“提升”或合并到一个闭包中,从而使得代码在浏览器中执行速度更快。但是因为要在使用 webpack-chain 去调研 webpack 的配置,尝试使用后也没达到预期,加上再花精力投入到 VuePress 1.0 和 webpack-chain 感觉有点不值。所以,就再想想其他方案。 3.3 方案三:替换成VitePress【推荐】 说到减少并发请求次数,实际上,Vite就在做这样的工作。Vite采用的JavaScript模块化方式是ESM(ECMAScript Modules)。与CommonJS相比,ESM支持按需加载,并且是异步执行的,不会阻塞浏览器的其他事件处理。这意味着在首次加载时,我们无需加载所有资源,仅需加载首页所需的资源即可。这样就能减少了并发请求次数,解决当前遇到的问题。 而VitePress,正是基于Vue 3和Vite构建的。 5. 方案验证 以下是两个文档框架的对比,内容基本为空,可忽略不计。可以看到VuePress 1.0初始化请求的就有26个请求,大部分都是.js文件,而VitePress 1.0只有9个请求,.js文件的请求才4个。 5.1 VuePress 1.0 5.2 VitePress 1.0 ...

2024-10-31 · 1 分钟 · 77 字

Vue3 + Vite + TypeScript + Bootstrap5 开发指南

前言 因为之前只是用Vue来开发IaaS平台项目,其使用场景通常都是PC,所以没怎么涉及到Web响应式设计开发相关知识。最近项目刚好是应用在PC和平板,甚至是手机上的,所以就需要考虑响应式的问题。 1. 技术选型 Web响应式开发,主要是基于CSS里@media媒体查询实现,允许不同视图尺寸使用不同的布局。 1.1 方案一:Vue 3 + Vite + Bootstrap5 1.1.1 优点 容易上手:只要对 HTML 和 CSS 有基本了解的人都可以很快速的使用 Bootstrap。 响应式设计:Bootstrap 可以根据不同平台(手机、平板电脑和台式机)进行调整。 移动优先:在 Bootstrap 中,自适应移动端是框架的核心部分。 浏览器兼容性:Bootstrap5 兼容所有主流浏览器(Chrome、Firefox、Edge、Safari 和 Opera)。 如果您需要支持 IE11 及以下版本,请使用 Bootstrap4 或 Bootstrap3。 github 星数 164k Bootstrap5 效果演示:https://www.bootstrap-admin.top/ 1.1.2 缺点 没办法使用我们积累的vue next组件库 Bootstrap5 需要学习成本,但不会很难 相对紧急的项目,通常不应该引入新技术去开发实现,而是以快速交付为主。 1.2 方案二:Vue 3 + Vite + Element Plus + @media 1.2.1 优点 基于前端现有技术积累,可快速开发项目功能 1.2.2 缺点 前端封装组件库,并没考虑过响应式设计,潜在未知样式问题,如开发此项目,各组件需考虑各平台(电脑、平板、手机)屏幕适配的同时,还要考虑已引用该库开发的项目兼容性问题。 @media媒体查询需每个页面、每个平台去适配(Bootstrap5做的事情),工作量相对较大,因无更多平台设备去验证,潜在未知的样式问题。 1.3 结论 简单来说,可以理解为方案一Bootstrap5帮我们处理好了屏幕适配的问题,我们只需要关注功能开发即可,方案二则是功能也要开发,样式也要关注。长远来看,倾向于方案一开发。 2. 快速搭建 Bootstrap5官方文档有提供Vite基于开发的指南《Bootstrap & Vite》,我们虽然是基于Vue3开发的,但是相关配置基本都一样的,只是有一点点差异而已。 ...

2023-06-09 · 4 分钟 · 798 字

部门静态导航页设计

前言 每一个公司或者团队有会有相关的项目网址,考虑到团队共用的东西,所以计划是开发一个静态导航页,这样就不需要每个人自己维护了,使用同一套即可,当时在Github上面找了一些开源的静态导航页项目,使用的是开源库static-nav,它是使用HTML+CSS+JQ简单实现的,代码里面网址都是直接写死的,我只要将其替换就可以。 1. 遇到问题 static-nav虽然可以正常应对当前的需求,但是使用一段时间之后发现,如果我要替换或者新增一些网址,每次都需要在.html文件中修改,然后再重新部署。一两次还好,次数多了,就有点受不了了,再加上一个模块的网址多了之后,好几个模块所占用的空间不一致的话,那布局就容易错乱,为了解决这个问题,我每次都需要使用占位符解决。 2. 解决方案 考虑到维护、后期拓展难的问题,就打算重构这个项目,并命名为dst-static-nav,基于vue next + vite + element-plus 实现,通过一个navLists.ts文件动态配置,后期只需要将这个文件存放在服务器,如有任何需求,只需要改动这个navLists.ts文件即可,不需要改动项目界面,然后又要重新部署一遍,因为最近百度捣鼓了一个开发者搜索,所以也加了一下,项目效果图,如下所示: 功能主要是以下几点,分别是: 左边菜单栏快速定位,右边静态导航页动态渲染 通过 navList.ts 配置,无需改动前端页面 支持百度开发者搜索 当前只是这些功能,后期可能考虑部署线上,然后怎么可以做到通用一点。 3. 技术要点 项目虽然很小,但是有一些细节点还是可以梳理记录一下的,技术没有高低之分,只要能解决了问题就是好技术。 3.1 基于el-scrollbar实现左右联动定位到标题栏 项目开发过程中,主要解决的问题是,左侧菜单栏和右边导航布局页面的联动,需求就是左侧菜单栏选中,右边导航页对应的标题栏滚动到顶部显示,在实现中主要使用document.getElementsByName()这个函数,当上定义了name属性,就可以通过这个函数获取到它与顶部的距离offsetTop,以此可以将滚动条滚动到指定的位置,如下所示: const handleSelect = (key: string, keyPath: string[]) => { let offsetTop = document.getElementsByName(key)[0].offsetTop scrollbarRef.value!.setScrollTop(offsetTop - 20) } 3.2 实现左侧菜单栏最后几个菜单的标题置顶 在项目使用过程中,发现左侧菜单栏最后几个菜单,来回切换,导航标题没有置顶,原因很简单,因为布局不够,为了解决这个问题,就需要在最后一个导航模块增加布局,但是应该要增加多少呢?每个导航模块的高度都是不定的,所以要新增的布局高度只能通过计算,动态设置。 首先,需要知道最后一个导航模块的名称,如下所示: // 获取左侧菜单最后一项,基于它加上需补充的空间高度(浏览器内高度-卡片整个高度) let lastNavName = navLists.at(-1)?.chindren.at(-1)?.label 然后,需要获取当前浏览器页面的高度,减去这个导航模块的高度,就可以知道需要新增多高的布局了,如下所示: const handleSelect = (key: string, keyPath: string[]) => { let offsetTop = document.getElementsByName(key)[0].offsetTop scrollbarRef.value!.setScrollTop(offsetTop - 20) } 总结 dst-static-nav项目还有蛮多东西需要完善的,也是在逐步新增需求,虽然不是什么了不起的项目,但是项目开发整个流程规范是一样的,争取培养起来用心做事情的感觉,从中体验到丝丝成就感。

2023-02-11 · 1 分钟 · 74 字

Vuepress 2.X + Element-Plus 的基本使用

1. 前言 计划使用Vupress2.X加上Element-plus实现封装的组件库说明。 2. Vuepress项目初始化 2.1 准备工作 新建一个Vuepress2.X项目文件夹,命名为VuepressTest,并下载依赖: npm install -D vuepress@next npm install 2.2 配置 在package.json中添加scripts: { "scripts": { "dev": "vuepress dev docs", "build": "vuepress build docs" } } 2.3 示例 在VuepressTest项目中新建doc/README.md,并写下如下内容: --- home: true heroImage: https://artice-code-1258339218.cos.ap-beijing.myqcloud.com/vuepress/element-index.png heroText: Element features: - title: 一致性 Consistency details: 与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念 - title: 反馈 Feedback details: 通过界面样式和交互动效让用户可以清晰的感知自己的操作 - title: 效率 Efficiency details: 界面简单直白,让用户快速识别而非回忆,减少用户记忆负担。 footer: by饿了么 --- 运行npm run dev之后,效果如下所示: 3. 使用Element-Plus 3.1 安装 npm install element-plus --save 3.2 配置 在.vuepress中新建文件clientAppEnhance.ts,引入element-plus: ...

2021-12-22 · 2 分钟 · 304 字