You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

409 lines
10 KiB

---
theme: seriph
background: https://source.unsplash.com/collection/94734566/1920x1080
highlighter: shiki
lineNumbers: true
transition: slide-left
mdc: true
---
# Fast Iot Web
工业互联网前端开源平台模版介绍
---
layout: center
---
# 1. 模版基础
---
layout: image-right
image: /vben.png
backgroundSize: contain
---
# 模版介绍
<a href='https://gitee.com/yudaocode/yudao-ui-admin-vben'>yudao-ui-admin-vben</a> <carbon-direction-straight-right /> <a href='https://github.com/vbenjs/vue-vben-admin'>vue-vben-admin</a>
Vue Vben Admin 是一个免费开源的中后台模版。使用了最新的 vue3、vite4、TypeScript 等主流技术开发,开箱即用的中后台前端解决方案,也可用于学习参考。
- 最新技术栈: 使用 Vue3/vite2 等前端前沿技术开发
- TypeScript: 应用程序级 JavaScript 的语言
- 主题: 可配置的主题
- 国际化: 内置完善的国际化方案
- 权限: 内置完善的动态路由权限生成方案
- 组件: 二次封装了多个常用的组件
<!--
1. Vben 在 Vue3 刚推出时就出现了,一直迭代至今,目前最新版本是 v2.10.0, 而 yudao-ui-admin-vben fork 了 Vben, 大约是在 v.2.7.0 版本之前,所以目前的模版是基于 Vben 的,但是有一定的差距,其次 Vben 原维护者已经停止维护,目前由社区人员维护,目前有点过重了
-->
---
layout: image-right
image: /fast-iot-web.png
backgroundSize: contain
---
# 模版技术栈
<div><a href='http://223.99.228.240:33000/liukai/fast-iot-web'><carbon:logo-github /> Fast iot web</a></div>
<br/>
- vue@3.3.8 -> 最新 vue@3.4.19
- vite@4.5.1 -> 最新 vite@5.1.4
- ant-design-vue@4.0.8 -> 最新 ant-design-vue@4.1.2
- typescript@5.3.3
- unocss@0.58.3
- @antfu/eslint-config@2.6.2
- node>=18.12.0
- pnpm>=8.10.0
<!--
1. 目前仓库在 gitea,还没有放在 git 或 gitee 上
2. vite 为什么不用最新版?后面会提及,这里暂时不介绍,vue、ant-design-vue 不用最新版的原因是 Slot 插槽 TS 类型有问题
3. 强制 TS 类型安全,在提交时会执行 type:check
4. 没有 prettier,只需用 Eslint(因为个人原因,antfu 生态)
5. 这里主要列举了一些核心包,其他包看下 package.json
6. 目前仓库 git 提交比较混乱,因为改动较大,最后会整合一下 git 提交记录
7. 强制使用 pnpm,基于 npx only-allow pnpm 这个命令
-->
---
layout: image-right
image: /command.png
backgroundSize: contain
---
# 项目命令
<br />
- dev -> 开发环境
- build -> 构建生产环境
- type:check -> 执行 TS 检查
- lint -> 执行 Eslint 检查
- changelog -> 生成版本日志
- release -> 版本发布
<!--
1. changelog: 基于约定式提交规范生成版本日志 (git 提交记录要更细)
2. release: 集成了一个第三方库 bumpp ,自动发布版本,包含:修改版本号、执行 changelog 命令、创建版本提交记录、创建 Tag、推送提交记录和 Tag 到 Git 仓库,一般来说发版时直接执行 release 就可以了
3. 后面有文章介绍这两个命令的集成
4. 顺便讨论一个 Git 工作流的应用,git rebase + marge(fast forward) 与 git rebase + git merge --squash (/skwɒʃ/)
-->
---
layout: image-right
image: /dir.png
backgroundSize: contain
---
# 项目目录
- /build -> 构建项目代码,例如:vite config、plugin
- /api -> 后端请求交互
```plain
|-- user
-- index.ts
-- types.ts
```
- /views -> 页面
```plain{1,2,3,4}
|-- user
-- index.vue
-- data.ts
-- UserFormModal.vue
-- ?form.vue
```
<!--
1. 多语言支持,但是没有怎么去使用
2. css 使用 unocss
3. 下面的 types 目录是公共的类型
4. data.ts 用法后面介绍
5. components 目录下存放的是公共组件(与业务无关),如果是与业务有关的公共组件,可以新建 /views/components
6. 如果新建、编辑、详情是页面的话,可以增加 form.vue / detail.vue 小写开头的 .vue 文件(或者有更好的命名方式?)
-->
---
# 菜单路由
路由使用的 `BACK` (后端路由模式),移除了 `ROLE` (角色权限) 和 `ROUTE_MAPPING` (路由映射) 两种模式。
新增路由在 系统管理 -> 菜单管理 页面动态增加:
<div flex='~ gap-10px items-center' class='gap-[10px]'>
<img src='/menu-1.png' class='flex-1 w-0 shadow-lg'/>
<img src='/menu-2.png' class='flex-1 w-0 shadow-lg'/>
<img src='/menu-3.png' class='flex-1 w-0 shadow-lg'/>
</div>
<!--
1. 路由路径和组件路径一般是相同的
2. 当开启 keep-alive 时,组件名称是必须且唯一
3. 是否在菜单栏显示,用于添加不再菜单栏展示的页面(如:新增、编辑、详情或其他)
4. 路由遵从嵌套路由规则
5. 所有子路由默认都会转为二级路由,所以不能存在二层以上的内嵌路由
-->
---
# 按钮权限
项目中存在三种权限判断方式,分别为:
1. 函数
2. 组件
3. 指令
```ts{1|3-5|7}
<button v-if="hasPermission(codes)">Create</button>
<Authority :value="codes">
<button>Create</button>
</Authority>
<button v-auth="codes">Create</button>
```
推荐使用函数方式
---
layout: center
---
# 2. 常用组件介绍
---
# BasicTable
```ts{2|3|4,7-11|12-14|5,19-23}
<script setup lang='ts'>
import { BasicTable, TableAction, useTable } from '@/components/Table'
import { columns, searchFormSchema } from './data'
import { getUserList } from '@/api/user'
import type { SystemUser } from '@/api/user/types'
const [registerTable, { reload }] = useTable({
api(params) {
return getUserList({ ...params, deptId: selectionDept.value })
},
columns,
formConfig: {
schemas: searchFormSchema,
},
})
</script>
<template>
<BasicTable :api="async () => ([] as SystemUser[])" @register="registerTable">
<template #bodyCell="{ record }">
...
</template>
</BasicTable>
</template>
```
<!--
1. 使用 hooks 方式
2. useTable 支持泛型,但不用手动传递,会根据 api 的返回值自动推断
3. Vue 泛型组件不能传递泛型,只能通过 Props 推断,但是我们使用 useTable 时,使用 register 传递的 props,所以就无法推断出来了 (这样可以获取到 slot 泛型支持)
4. 更多的使用,参考 Vben 和 ant-design Table 文档
-->
---
# BasicForm
```ts{2-3|5-11|15}
<script setup lang='ts'>
import { BasicForm, useForm } from '@/components/Form'
import { formSchema } from './data'
const [registerForm, { setFieldsValue, validate }] = useForm({
labelWidth: 120,
baseColProps: { span: 24 },
schemas: formSchema,
showActionButtonGroup: false,
actionColOptions: { span: 23 },
})
</script>
<template>
<BasicForm @register="registerForm" />
</template>
```
<!--
1. 使用 hooks 方式
2. 目前 useForm 不支持泛型 (之前没加,但是加上最好,谁有兴趣的话可以做一下)
-->
---
# BasicModal
BasicModal 用法使用两个 `Hook` 实现,`useModal` 和 `useModalInner`
useModal
```ts{2,3|5,9|none}
<script setup lang='ts'>
import { useModal } from '@/components/Modal'
import UserFormModal from './UserFormModal.vue'
const [registerModal, { openModal }] = useModal<string>()
</script>
<template>
<UserFormModal @register="registerModal" />
</template>
```
<!--
1. useModal 在父组件中使用 (如:user.vue)
2. useModal 支持泛型,可以约束 openModal 函数调用参数类型
-->
---
# BasicModal
useInnerModal
```ts{2|4-6|10}
<script setup lang='ts'>
import { BasicModal, useModalInner } from '@/components/Modal'
const [registerModal] = useModalInner(async (id: string) => {
...
})
</script>
<template>
<BasicModal v-bind="$attrs" @register="registerModal" />
</template>
```
<br/>
<v-click>
```ts
const [ModalComponent, { openModal }] = useModal(Component)
const { openModal } = useModal(Component)
openModal(state)
```
</v-click>
<!--
1. $attrs 是必须的,它会将父组件的 register 传递下去
2. 这种用法怎么样(探讨 Modal 新形势)
-->
---
# Icon
移除了之前的 `<Icon />` 组件,使用 unocss presetIcon 代替, 图标集:<a href='https://icones.js.org/' target='__blank'>Icones</a>
```html
<span class='i-ant-design:edit-outlined'></span>
```
项目集成了 Icones 中所有的图标集,但下面这些会更常用:
- Ant Design Icons
- IonIcons
- Material Design Icons
- Carbon
<br/>
VsCode Plugins:
- UnoCSS
- Iconify IntelliSense
<!--
1. Icon 是按需引入的(除了 Ant Design Icons)
2. 项目引入了 Ant Design Icons 所有的图标,用于 IconPicker 组件
3. 其他的组件查看代码或者 Vben 文档
-->
---
layout: center
---
# 3. 其他
---
1 year ago
# 项目规范
项目使用 git hooks 强制约束代码规范与提交规范:
1 year ago
1. 使用 Eslint,不使用 Prettier
2. 项目用一个简单的正则来约束 CommitLint
```ts
const commitRE
= /^(revert: )?(feat|fix|docs|style|refactor|perf|test|build|ci|chore|types|wip|release)(\(.+\))?: .{1,50}/
```
1 year ago
3. 移除了 Stylelint
4. 使用 `type:check` 校验 TS 类型正确性 (执行时间会稍微有点长)
---
layout: image-right
image: https://source.unsplash.com/collection/94734565/1920x1080
---
# 开源分享
- [ ] GitHub CICD 流程介绍
- [ ] Git 提交规范与 changelog 生成
- [ ] BasicForm TS 类型优化
- [ ] BasicTable 与 UseTable 泛型支持
- [ ] 更多
<br>
<br>
<br>
<a href='https://www.yuque.com/g/yuqueyonghurkd3lk/lfm6ik/collaborator/join?token=QlhaZiT6IAREiGWC&source=book_collaborator# 邀请你共同编辑知识库《开源知识点总结》' target='__blank'>
语雀 - 开源知识点总结
</a>
---
# 下一步需要做的
1. 升级 Vue、Ant-design 版本 (等待 ant-design 更新)
2. 解决循序引用问题(复杂度较高)
3. 树形 Table 不支持异步加载
4. BasicTree 组件异步加载不生效(BUG)
5. 重复组件问题(BasicTree / ApiTree)
6. 完善系统管理、新增产品、设备、监控页面
7. 样式调整?
<!--
1. 目前 Table 异步加载,依靠 onExpand 事件实现
2. PR 提交,与 review
-->
1 year ago
---
layout: end
---
# End