# gi-demo **Repository Path**: springfivepig/gi-demo ## Basic Information - **Project Name**: gi-demo - **Description**: Gi Admin Pro 是一个基于 Vue3、Vite、TypeScript、Arco Design UI、Pinia、VueUse 的免费中后台模版,它使用了最新的前端技术栈,内置丰富的主题配置,有着极高的代码规范,基于mock实现的动态数据展示,开箱即用的模板,也可用于学习参考。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 433 - **Created**: 2025-01-13 - **Last Updated**: 2025-01-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
[](./LICENSE) ## 简介 **Gi Admin Pro** 是一个基于 Vue3、Vite、TypeScript、Arco Design Vue、Pinia、VueUse 等的免费中后台模版,它使用了最新的前端技术栈,内置丰富的主题配置,有着极高的代码规范,基于 mock 实现的动态数据展示,开箱即用的模板,也可用于学习参考。 > **Gi 前缀含义:** G:代表全局 i:代表我的 > > Gi 用来定义全局组件前缀,如 GiNavBar、GiTitle、GiLoading ## 特性 - **最新技术栈**:使用 Vue3 / Vite 等前端前沿技术开发,使用高效率的 npm 包管理器 - **TypeScript**:应用程序级 JavaScript 的语言 - **主题**:丰富可配置的主题、暗黑模式 - **代码规范**:丰富的规范插件及极高的代码规范 ## 预览 | 平台 | 预览地址 | | ----------------- | ---------------------------------------------------------- | | **gitee**(码云) | [Gi Admin Pro 预览地址](http://lin0716.gitee.io/gi-demo) | | **github** | [Gi Admin Pro 预览地址](https://lin-97.github.io/gi-demo/) | | | 账号 | 密码 | | ------ | ----- | ------ | | 管理员 | admin | 123456 | | 用户 | user | 123456 | ## 代码仓库 | 平台 | 预览地址 | 仓库地址 | | ----------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | **gitee**(码云) | Gi Admin Pro 预览地址 | Gitee 仓库地址 | | **github** | Gi Admin Pro 预览地址 | Github 仓库地址 | ## 项目示例图
## 安装使用
- 安装依赖
```bash
npm install
```
- 运行
```bash
npm run dev
```
- 打包
```bash
npm run build
```
## vs code 插件安装
```bash
1. Prettier - Code formatter
2. Vue - Official
3. Vue 3 Snippets
```
## 注意
```bash
由于升级了vite3,根据官方规定,node版本必须是14.18.0以上
```
**`注:现在已更新到了 Vite5.x,node的版本要求请参考官网要求`**
**vite 官网地址:** https://cn.vitejs.dev/
## 开源作者
**Lin**
## 常见问题
**为什么安装依赖不成功?**
检查`node`版本,最好使用原生镜像`npm`
还原镜像
```
npm config set registry https://registry.npmjs.org/
```
**为什么选择 Arco 组件库,而不是 Element Plus?**
[Element Plus 对比 Arco design](https://juejin.cn/post/7294219581894705190)
**为什么全局组件使用前缀 Gi?**
全局组件设置了按需引入,使用前缀,方便和局部组件做区分
**为什么组件使用单词大写开头 (PascalCase)命名写法?**
本项目`.vue`文件名以及在模板使用中,均采用大写`开头 (PascalCase)`命名方式
参考 Vue2 官网-风格指南: https://v2.cn.vuejs.org/v2/style-guide/
组件命名:`单文件组件的文件名应该要么始终是单词大写开头 (PascalCase),要么始终是横线连接 (kebab-case)`
其他优点:方便搜索(横线连接 (kebab-case)对搜索没那么方便)
**为什么 css 类名推荐横线连接 (kebab-case)**
参考大部分大网站,都是这个命名规则,别整: `.myClass`这种
**页面显示异常?**
**`页面必须要保留一个根元素!!!`**
**Vue3 权限管理对路由进行排序和格式化处理方式**
使用 **xe-utils** 这个 js 库,简化数据处理
[文章地址](https://juejin.cn/post/7301260557222805567)
**页面无法缓存?**
请检查页面是否配置了`name`,且名称是否与数据一致
```js
defineOptions({ name: 'AboutIndex' })
```
```js
{
path: '/about/index',
name: 'AboutIndex', // 检查name是否一致
component: () => import('@/views/about/index.vue')
}
```
## 项目规范
#### .vue 文件行数规范
一般来说,一个 .vue 文件行数建议不超过 **`400`** 行,超过建议组件化拆分
#### 变量命名
```vue
```
```vue
```
**常用前缀**
| 前缀 | 前缀 + 命名 | 大意 |
| ---------- | ---------------------------- | --------------------------- |
| get | getUserInfo | 获取用户信息 |
| del/delete | delUserInfo | 删除用户信息 |
| update/add | updateUserInfo / addUserInfo | 修改用户信息 / 增加用户信息 |
| is | isTimeout | 是否超时 |
| has | hasUserInfo | 有没有用户信息 |
| handle | handleLogin | 处理登录 |
| calc | calcAverageSpeed | 计算平均速度 |
**一些通用缩写**
| 源单词 | 缩写 |
| ----------- | ---- |
| message | msg |
| information | info |
| button | btn |
| background | bg |
| response | res |
| request | req |
| image | img |
| utility | util |
| property | prop |
| source | src |
| boolean | bool |
| error | err |
| settings | set |
#### vue 相关的命名
```vue
```
```vue
```
```vue
```
```vue
```
#### 写法技巧
尽量使用三元表达式
```js
// 优化前
let isEdit = true
let title = ''
if (isEdit) {
title = '编辑'
} else {
title = '新增'
}
// 优化后
let title = isEdit ? '编辑' : '新增'
```
善用 includes 方法
```js
// 优化前
if (type === 1 || type === 2 || type === 3) {
}
// 优化后,此种方式在vue模板也可使用
if ([1, 2, 3].includes(type)) {
}
```
使用箭头函数简化函数
```js
// 优化前
function add(num1, num2) {
return num1 + num2
}
// 优化后
const add = (num1, num2) => num1 + num2
```
尽量减少 if else if
```vue
```
```js
// 优化前
const status = 200
const message = ''
if (status === 200) {
message = '请求成功'
} else if (status === 404) {
message = '请求出错'
} else if (status === 500) {
message = '服务器错误'
}
// 优化后
const status = 200
const messageMap = {
200: '请求成功',
404: '请求出错',
500: '服务器错误'
}
const message = messageMap[status]
```
如果函数参数超过两个,建议优化
```vue
```
#### 接口 api 的命名
**方案一**
如果你后端的接口命名相对简约,那么可以采用以下命名规则(注意ts类型的命名规则)
命名规范: 操作名 + 后端模块名 + 功能名
前缀为(操作名)动词,动词 eg:`add / update / delete / get / save` 等
~~~ts
import type * as T from './type'
import http from '@/utils/http'
/** 获取用户列表 */
export function getUserList() {
return http.get
**新版文档**
**options配置**
| 属性 | 说明 |
| -------- | ------------------------------------------------------------ |
| form | 直接继承a-form的所有props |
| grid | grid包裹层,直接继承a-grip的所有props |
| gridItem | 默认每个表单项的包裹层,直接继承a-grid-item的所有props |
| btns | 尾部按钮的配置
#### GiTable 使用示例
**GiTable继承了a-table的所有属性和配置,只是多了一些插槽,以及prop属性,具体看源码**
#### Hooks 目录结构
**hooks 下默认存放公共的,非接口请求的 hooks**
```vue
```
**hooks/app 下主要存放通用接口的 hooks**
/hooks/app/useDept.ts
```typescript
import { ref } from 'vue'
import { getSystemDeptList } from '@/apis'
import type { SystemDeptItem } from '@/apis'
/** 部门模块 */
export function useDept() {
const loading = ref(false)
const deptList = ref
#### usePagination(hooks) 的使用
文件位置:@/hooks/modules/usePagination.ts
**旧版:**
```ts
import { ref } from 'vue'
type Callback = () => void
type Options = {
defaultPageSize: number
}
export default function usePagination(callback: Callback, options: Options = { defaultPageSize: 10 }) {
const current = ref(1)
const pageSize = ref(options.defaultPageSize)
const total = ref(0)
function changeCurrent(size: number) {
current.value = size
callback && callback()
}
function changePageSize(size: number) {
current.value = 1
pageSize.value = size
callback && callback()
}
function setTotal(value: number) {
total.value = value
}
const pagination = computed(() => {
return {
showPageSize: true,
// ...其他配置
total: total.value,
current: current.value,
pageSize: pageSize.value,
onChange: changeCurrent,
onPageSizeChange: changePageSize
}
})
return {
current,
pageSize,
total,
pagination,
changeCurrent,
changePageSize,
setTotal
}
}
```
**`上面这种方案已经废弃`**,最新方案如下
**改良版(兼容旧版):**
```js
import { reactive, toRefs } from 'vue'
import type { PaginationProps } from '@arco-design/web-vue'
type Callback = () => void
type Options = {
defaultPageSize: number
}
export default function usePagination(callback: Callback, options: Options = { defaultPageSize: 10 }) {
const pagination = reactive({
showPageSize: true,
current: 1,
pageSize: options.defaultPageSize,
total: 0,
onChange: (size: number) => {
pagination.current = size
callback && callback()
},
onPageSizeChange: (size: number) => {
pagination.current = 1
pagination.pageSize = size
callback && callback()
}
})
const changeCurrent = pagination.onChange
const changePageSize = pagination.onPageSizeChange
function setTotal(value: number) {
pagination.total = value
}
const { current, pageSize, total } = toRefs(pagination)
return {
current,
pageSize,
total,
pagination,
changeCurrent,
changePageSize,
setTotal
}
}
```
使用方式 1
```vue
使用
**提示**
使用 useTable 的时候不传入类型,tableData 也会根据入参自动推导出类型
**`最后提示`**
在最新版的`useTable`中, `selectKeys`已经改为`selectedKeys`,同时加了其他新功能,具体查看源码
#### useResetReactive(hooks) 的使用
作用:有时候需要`重置表单数据`,这个`hooks`提供很大便捷性
代码:`useResetReactive.ts`
```js
import { reactive } from 'vue'
import { cloneDeep } from 'lodash-es'
export function useResetReactive
使用
##### 方式 2
AddUserForm.vue
使用
##### 方式 3
#### 组件使用建议
能使用组件尽量使用组件实现页面布局
flex 布局尽量使用 **Row** 组件
```vue
#### CSS 的命名词汇
```css
前一个 prev
后一个 next
当前的 current
显示的 show
隐藏的 hide
打开的 open
关闭的 close
选中的 selected
有效的 active
默认的 default
反转的 toggle
禁用的 disabled
危险的 danger
主要的 primary
成功的 success
提醒的 info
警告的 warning
出错的 error
大型的 lg
小型的 sm
超小的 xs
```
```css
文档 doc
头部 header(hd)
主体 body
尾部 footer(ft)
主栏 main
侧栏 side
容器 box/container
```
```css
列表 list
列表项 item
表格 table
表单 form
链接 link
标题 caption/heading/title
菜单 menu
集合 group
条 bar
内容 content
结果 result
```
```css
按钮 button(btn)
下拉菜单 dropdown
工具栏 toolbar
分页 page
缩略图 thumbnail
警告框 alert
进度条 progress
导航条 navbar
导航 nav
子导航 subnav
面包屑 breadcrumb(crumb)
标签 label
徽章 badge
巨幕 jumbotron
面板 panel
洼地 well
标签页 tab
提示框 tooltip
弹出框 popover
轮播图 carousel
手风琴 collapse
定位浮标 affix
```
```css
品牌 brand
标志 logo
额外部件 addon
版权 copyright
注册 regist(reg)
登录 login
搜索 search
热点 hot
帮助 help
信息 info
提示 tips
开关 toggle
新闻 news
广告 advertise(ad)
排行 top
下载 download
```
```css
左浮动 fl
右浮动 fr
清浮动 clear
```
#### 其他规范
可参考 Vue2 官网-风格指南: https://v2.cn.vuejs.org/v2/style-guide/ , 其中一些规范也可借鉴
可参考 **Gi Admin Pro** 源码,如有更好的规范建议,可以联系作者本人
## Vue 相关
Vue3 官网
Vue-Router
Vite
Pinia
## 插件推荐
Arco Design 组件库
Day.js 一个极简的 JavaScript 库,可以为现代浏览器解析、验证、操作和显示日期和时间 2K 大小
Lodash 一个一致性、模块化、高性能的 JavaScript 实用工具库
Xe-utils 一个 JavaScript 函数库、工具类
VueUse 一个 Vue3 Hooks 库
VueRequest 一个 Vue 请求库
V-Viewer 基于 viewer.js 的 vue 图像查看器组件,支持旋转、缩放等操作
Vue-Color-Kit 一个 vue3 颜色选择器组件
Vxe-Table
**其他**
VCalendar 日历组件
Vue Cal 日历组件
VueDraggablePlus 支持 Vue2 和 Vue3 的拖拽组件
## 推荐书籍
Vue 入门指南与实战案例
深入理解 TypeScript
前端宝典
Web 开发人员需要知道的 CSS 技巧
阮一峰 ES6
阮一峰 flex 布局
## 开源项目集合
Vue3 开源项目集合
React 开源项目集合
## 工具
菜鸟工具
代码生成图片
JSON-TO-ANY 对象转 ts 类型
在线三角形样式生成器
iTab
## 捐赠
