最近因为工作需要,封装了一个饼图组件。
vue3实现权限管理
页面权限
思路
- 用户可以访问的页面权限都放在了用户信息
userInfo/permission/menu
中 - 左侧菜单是根据
routes
自动生成的 - 为每个权限路由创建一个
name
属性,每个name
对应一个页面权限 - 在
router/index.js
定义私有路由表privateRoutes
和公开路由表publicRoutes
- 在
store/modules
目录下新建一个permission
文件,用来创建权限相关的操作 - 通过
filterRoutes
这个动作来根据name
与页面权限相匹配的方式筛选出权限路由,并返回出去 - 在
src/permission.js
中我们通过router.beforeach
拦截路由,获取用户信息,获取筛选后的私有路由表,利用router.addRoute
来动态添加路由表 - 退出用户登录的时候记得删除路由表,也就是用
removeRoute
这个方法
实现vue3后台管理系统中的一键换肤功能
动态换肤实现原理
今天被问到了一个动态换肤的问题,我只回答了动态修改scss
中代表色值的变量就可以实现,回答的有些笼统,过于简单了,所以回来以后查找资料、动手实践,将这一过程记录下来。
想要实现动态换肤的一个前置条件就是:色值不可以写死!
在scss
中,我们可以通过$变量名:变量值
的方式定义css
变量,然后通过该css变量
来指定某一块DOM
对应的颜色。如果我改变了该css
变量的值,那么是不是对应的DOM
颜色也会同步发生变化?
当大量的DOM
都依赖于这个css
变量设置颜色时,我们是不是只需要修改这个css变量
,那么所有的DOM
颜色也会发生变化,那么动态换肤这个功能是不是就实现了?
这就是动态换肤的实现原理。
动态换肤实现方案分析
明确了上面的实现原理以后我们可以得出一个结论,那就是在实现动态换肤的时候要兼顾两个方面:
动态换肤的关键是修改
css
变量的值换肤需要同时兼顾
element-plus
和非element-plus
那么根据以上关键信息,我们可以得出对应的解决方案:
创建一个组件
ThemeSelect
用来处理修改之后的css变量
的值根据新值修改
element-plus
的主题颜色根据新值修改非
element-plus
的主题颜色
uniapp朝夕社区——全局配置
全局配置
1 | { |
uniapp朝夕社区——登录
loginFlow
登录界面支持两种登录方式,一种是手机号+验证码登录;第二种是账号+密码登录。用户可以在这两种登录方式之间进行切换。登录成功以后会获取用户信息存储在 vuex 中并使用 localStorage 做一个持久化存储;同时也会打开 websocket 的链接,并且跳回上一级页面,提示用户登录成功。
checkLogin
1 | <view |
disabledButton
在用户信息没有填写完整之前,我们应该将登录按钮设置为禁用状态。如下代码所示:
1 | <view class="py-2 px-3"> |
1 | computed: { |
getPhoneCode
获取验证码登录是很常见的一种方式,一般都是通过获取验证码的接口发短信到用户的手机上,用户填入对应的验证码,进行比对以后就可以正常登录。
验证手机号格式
用户如果采用手机号+验证码的方式登录,那么我们应该校验手机号格式。如下代码所示:
1 | <!-- 省去其他代码... --> |
1 | // 表单验证 |
如上代码所示,在验证手机号以后,访问接口拿到验证码,同时倒计时 60 秒开始计时。
loginAction
当用户填入表单信息以后,点击登录按钮就会触发登录操作。在这里要注意的是要先判断一下是用的哪种登录方式,从而改变对应的后台 url 和表单信息。如下代码所示:
1 | <view class="py-2 px-3"> |
1 | submit() { |
setStorage
登录成功以后,会获取用户的信息,并且放在前端的vuex
状态中,同时呢使用了uni.setStorageSync
将信息做一个持久化存储。如代码所示:
1 | // pages/login/login.vue |
openSocket
用户在登录成功以后,除了要将用户信息保存在前端供其他页面使用以外,还要开启socket
,连接上 socket 以后就等于说是上线了,可以跟其他用户进行实时通讯,比如私信。这里用到了uni.connectSocket
如代码所示:
1 | // pages/login/login.vue 触发名为openSocket的action |
loginSuccess
用户登录成功以后要给用户一个成功的弹窗提示,并且跳回到之前的页面中去。这里跳转用到了uni.navigateBack
和uni.showToast
这两个 API。如下代码所示:
1 | // 提示和跳转 |
uniApi
uni.navigateBack
关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages()
获取当前的页面栈,决定需要返回几层。
示例:
1 | // 注意:调用 navigateTo 跳转时,调用该方法的页面会被加入堆栈,而 redirectTo 方法则不会。见下方示例代码 |
uni.showToast
显示消息提示框。
示例
1 | uni.showToast({ |
uni.setStorageSync
将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口。
示例代码
1 | try { |
uni.connectSocket
创建一个 WebSocket 连接。
示例代码
1 | uni.connectSocket({ |
返回值
如果希望返回一个socketTask
对象,需要至少传入 success
/ fail
/ complete
参数中的一个。例如:
1 | var socketTask = uni.connectSocket({ |
api doc
登录页面用到的几个接口,以下是文档说明。
sendCode
简介:发送验证码的接口。
- url:
http://localhost:8081/api/user/sendcode
- method: ‘POST’
请求参数
1 | { |
phoneLogin
简介:使用验证码登录的接口。
- url:
http://localhost:8081/api/user/phonelogin
- method: ‘POST’
请求参数
1 | { |
userLogin
简介:使用账户密码登录的接口。
- url:
http://localhost:8081/api/user/login
- method: ‘POST’
请求参数
1 | { |
tab页聊天室
实现多Tab页聊天
1 | <!DOCTYPE html> |
1 | // 监听 localStorage 变化 |
在这个例子中,我们监听storage
事件来捕获其他标签页中localStorage
的变化。当用户在某个标签页中输入消息并点击“发送”按钮时,消息会被存储到localStorage
中,并且触发storage
事件。所有监听这个事件的标签页都会接收到这个事件,并从localStorage中
读取新的消息,然后显示在聊天日志中。
请注意,由于localStorage
的更新是异步的,并且不同的浏览器可能有不同的行为,因此在实际应用中可能需要添加一些额外的逻辑来处理可能出现的竞态条件或数据不一致问题。此外,这个例子没有处理用户身份验证和消息历史记录管理,这些都是在实际聊天室应用中需要考虑的重要方面。
谈谈对Promise的理解
文字理解
首先,Promise 是 JavaScript 中用于处理异步操作的一种对象,它代表了异步操作最终完成(或失败)及其结果值的状态。Promise 对象有三种状态:pending
(进行中)、fulfilled
(已成功)和rejected
(已失败),并且状态一旦改变就不会再变。
Promise 的主要优点在于它能够帮助我们更好地组织异步代码,避免回调地狱(Callback Hell)的问题。通过链式调用.then()
和.catch()
方法,我们可以将异步操作的结果传递给后续的处理函数,从而形成一个清晰、可预测的执行流程。
在 Promise 中,.then()方法用于指定当 Promise 成功(fulfilled)时执行的回调函数,而.catch()方法则用于指定当 Promise 失败(rejected)时执行的回调函数。这样,我们就可以将错误处理和正常流程分开,使得代码更加整洁和易于维护。
此外,Promise 还支持链式操作,即在一个.then()或.catch()方法内部返回一个新的 Promise 对象,从而实现多个异步操作的串联。这种链式调用方式使得代码逻辑更加清晰,也更容易理解和调试。
在实际开发中,Promise 广泛应用于各种异步场景,如网络请求、定时器、文件读写等。通过使用 Promise,我们可以更好地控制异步操作的执行顺序和结果处理,提高代码的可读性和可维护性。
需要注意的是,虽然 Promise 提供了很多便利,但它并不是万能的。在一些复杂的异步场景中,我们可能需要结合其他技术(如 async/await、generators 等)来更好地处理异步操作。因此,作为一名前端开发工程师,我们需要不断学习和掌握新的技术,以便更好地应对各种挑战和需求。
总之,Promise 是 JavaScript 中处理异步操作的重要工具之一,它能够帮助我们更好地组织代码、避免回调地狱问题,并提高代码的可读性和可维护性。在实际开发中,我们应该根据具体需求选择合适的异步处理技术,并结合其他技术来构建高效、可靠的 Web 应用。
实际使用场景
调试vue项目
使用 vscode 调试 vue 项目
调试 vue2 项目
第一步我们先在 vscode 中创建一个调试项目,然后对launch.json
进行配置:
1 | { |
第二步,我们在项目中打个断点。
第三步,在 vscode 中点击启动调试。