中前台项目 开发
项目架构
开发使用到的技术及开发插件
vite
以速度运行制胜 webpack. 兼容 rollup 几乎所有插件,生态已经支持企业项目开发
创建项目:
1 | npm init vite@latest |
没有安装vite@latest会提示勾选安装
vue3
vue 最新版,搭配 vite 使用更佳
tailwindcss
前端 css 四种模式
- 行内样式,自由度极高但复用性极差
- 通用组件库,风格固定,自定义性差
- 原子样式, tailwindcss 众多类名,每个类名都对应一个 css 样式,类似于boostrap
- 经典模式, class 类名方式,但是媒体查询需要重写
安装
1 | yarn add tailwindcss postcss@8.4.8 autoprefixer@10.4.2 -D |
报错缺少依赖 sass
1 | yarn add sass -D |
生成配置文件 tailwind.config.js
1 | npx tailwindcss init -p |
配置文件
1 | // purge: [], purge在3.0 更改为 content |
在src下新建styles文件夹, 增加 index.scss
1 | /* ./your-css-folder/styles.css */ |
然后在mian.js中引用这个index.scss.tailwind CSS就引入成功了,
1 | import '@/styles/index.scss' |
tailwind CSS 依赖scss,可能需要手动安装
1 | yarn add sass@1.54.4 -D |
vscode 插件
prettier-code formater
对代码做格式化,统一代码风格
在根目录之下创建 .prettierrc, 配置如下
1 | { |
配置默认使用
vscode 中 右键代码格式化,配置默认值为 prettier
设置保存自动生效
到 设置 中搜索 save,找到 Edit:Format OnSave选项 勾选保存时自动格式化文件
Tailwind CSS intelliSense
进行 Tailwind 类名提示, 在class 中按空格可提示类名
Vue language Featrues
vue3官方推荐的插件
使用 vueuse 中的 useWindowSize 判断 当前PC端还是手机端
它为 Vue 开发人员提供了大量适用于 Vue 2 和 Vue 3 的基本 Composition API 实用程序函数。
它为常见的开发人员用例提供了数十种解决方案,例如,跟踪引用更改、检测元素可见性、简化常见的 Vue 模式、键盘/鼠标输入等。这是真正节省开发时间的好方法,因为你不必自己添加所有这些标准功能。
1 | import { computed } from "vue"; |
通过 上述 判断 动态切换 PC 端 合手机端 路由
在 router 的 index.js 中
1 | const routes = [ |
安装axios 挂载全局并在子组件引用
挂载
1 | import axios from '@/utils/request' |
使用
1 | // 方法一 start |
环境变量设置
通过创建 .env.[mode] 文件, 可设置变量。在不同mode 下运行将读取不同的文件
开发环境
.env.developmenet
1 | VITE_BASE_API = /api/ |
生产环境
.env.production
1 | VITE_BASE_API = /prod-api/ |
读取变量
1 | import.meta.env.VITE_BASE_API |
开发代理设置
1 | server: { |
vite中将 svg 注册成全局组件
vite 通过 使用 vite-plugin-svg-icons 插件使用 svg 图片
1 | yarn add vite-plugin-svg-icons -D |
在main.js 中
1 | import 'virtual:svg-icons-register' |
配置 vite.config.js
1 |
|
新增组件 icon-svg
1 | <template> |
全局注册 组件, 使用
1 | import { defineAsyncComponent } from 'vue' |
1 | <m-svg-icon class="w-1.5 h-1.5" name="hamburger"></m-svg-icon> |
vue-cli 中将 svg 注册成全局组件
编写组件
src/components/SvgIcon/index.vue
1 | <template> |
svg icon资源
在 assets/icons 文件夹下,新建 svg 储存svg资源,新建index.js注册组件
1 | import Vue from 'vue' |
引用
main.js
1 | import './assets/icons' // icon |
处理svg打包配置,vue.config.js
1 | yarn add svg-sprite-loader -D |
1 | chainWebpack(config) { |
使用
1 | <svg-icon icon-class="sys-config" class-name="disabled" /> |
全局指令注册
文件目录结构
-directives
–modules
—lazy.js
–index.js
1 | // index.js |
第三方平台登录
QQ,微信。通过扫码授权等方式,用户同意之后会获取到第三方的用户信息。然后就需要在本平台进行判定
该第三方用户是否在本平台注册?因为我们拿到的第三方数据没有关键的用户名,密码,手机号。
1、当前用户已注册,就直接登录
2、当前用户未注册,执行注册。获取用户唯一标识,如手机号,不重复的用户名等
核心步骤:
1、对接第三方平台,获取第三方平台用户信息
2、利用该童虎信息,完成本应用的注册
qq互联 需要qq登录认证开发者,创建应用。两者都需要认证。扫码登录时后跳转至一个新的页面,这个页面获取到用户数据后要传回之前的页面。要使用跨页面传输方式。 为保证兼容性使用 BroadcastChannel + localStroage + window.onstorage 两种方式兼容写法
Broadcast.js
1 | // 频道名 |
从 第三方数据获取:
完整代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 // QQ 登录的 URL
const QQ_LOGIN_URL =
'https://graph.qq.com/oauth2.0/authorize?client_id=101998494&response_type=token&scope=all&redirect_uri=https%3A%2F%2Fimooc-front.lgdsunday.club%2Flogin'
/**
* 处理 QQ 登录视窗
*/
const openQQWindow = async () => {
window.open(
QQ_LOGIN_URL,
'oauth2Login_10609',
'height=525,width=585, toolbar=no, menubar=no, scrollbars=no, status=no, location=yes, resizable=yes'
)
// 打开视窗之后开始等待
brodacast.wait().then(async (oauthObj) => {
// 登录成功,关闭通知
brodacast.clear()
// 执行登录操作
oauthLogin(LOGIN_TYPE_QQ, oauthObj)
})
}
/**
* 登录按钮事件
*/
const onQQLogin = () => {
openQQWindow()
}
// QQ 登录挂起
onMounted(() => {
QC.Login(
{
btnId: 'qqLoginBtn' //插入按钮的节点id
},
// 登录成功之后的回调,但是需要注意,这个回调只会在《登录回调页面中被执行》
// 登录存在缓存,登录成功一次之后,下次进入会自动重新登录(即:触发该方法,所以我们应该在离开登录页面时,注销登录)
(data, opts) => {
console.log('QQ登录成功')
// 1. 注销登录,否则在后续登录中会直接触发该回调
QC.Login.signOut()
// 2. 获取当前用户唯一标识,作为判断用户是否已注册的依据
const accessToken = /access_token=((.*))&expires_in/.exec(
window.location.hash
)[1]
// 3. 拼接请求对象
const oauthObj = {
nickname: data.nickname,
figureurl_qq_2: data.figureurl_qq_2,
accessToken
}
// 4. 完成跨页面传输
brodacast.send(oauthObj)
// 针对于 移动端而言:通过移动端触发 QQ 登录会展示三个页面,原页面、QQ 吊起页面、回调页面。并且移动端一个页面展示整屏内容,且无法直接通过 window.close() 关闭,所以在移动端中,我们需要在当前页面继续进行后续操作。
oauthLogin(LOGIN_TYPE_QQ, oauthObj)
// 5. 在 PC 端下,关闭第三方窗口
window.close()
}
)
})要获取的数据
1
2
3
4
5 const oauthObj = {
nickname: data.nickname,// 昵称
figureurl_qq_2: data.figureurl_qq_2,// 头像
accessToken // accessToken qq登录返回的唯一标识
}继而访问登录接口,接口返回值返回状态标识用户是否注册。没注册则跳转至注册页面
移动端没有窗口的概念,所以我们直接在回调页面执行登录
针对于 移动端而言:通过移动端触发 QQ 登录会展示三个页面,原页面、QQ 吊起页面、回调页面。并且移动端一个页面展示整屏内容,且无法直接通过 window.close() 关闭,所以在移动端中,我们需要在当前页面继续进行后续操作。
微信
。。。
用户反馈平台
前台系统中很常见。构建反馈平台的两种方式
- 自研 一般大厂都会自研
- 第三方平台 小公司首选方案
腾讯兔小巢
- 本文作者: 王不留行
- 本文链接: https://wyf195075595.github.io/2022/06/17/programming/vue/vitevue3项目/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!