admin.md 14.1 KB
Newer Older
inkwalk's avatar
inkwalk 已提交
1
# uniCloud admin 基础框架
inkwalk's avatar
inkwalk 已提交
2

inkwalk's avatar
update  
inkwalk 已提交
3
### 什么是 uniCloud Admin
inkwalk's avatar
inkwalk 已提交
4

inkwalk's avatar
update  
inkwalk 已提交
5
uniCloud admin 基础框架,是基于 uni-app 和 uniCloud 的应用后台管理框架。HBuilder X 2.9.5+ 支持,请更新到最新版本使用。
inkwalk's avatar
inkwalk 已提交
6

inkwalk's avatar
update  
inkwalk 已提交
7 8 9
- 它使用 uni-app 的宽屏适配,可自动适配 PC 宽屏和手机各端。了解[宽屏适配](https://uniapp.dcloud.io/adapt)
- 它基于 uniCloud,是 serverless 的云开发。了解[uniCloud](https://uniapp.dcloud.io/uniCloud/README)
- 它基于 uni-id,admin 框架使用的是 uni-id 的用户账户、权限系统。了解[uni-id](https://uniapp.dcloud.io/uniCloud/uni-id)
inkwalk's avatar
inkwalk 已提交
10

inkwalk's avatar
inkwalk 已提交
11
### 内置的功能
inkwalk's avatar
inkwalk 已提交
12 13

- 管理员账户初始化、登录、修改密码
inkwalk's avatar
update  
inkwalk 已提交
14
- 顶部 topWindow 的设置:比如 logo 更换、右上角部分链接更换。详见项目根目录的`admin.config.js`文件
inkwalk's avatar
inkwalk 已提交
15
- 左侧 leftWindow 的菜单设置:菜单包括两类,一类是动态菜单,具备业务和权限功能;另一类是静态菜单,不会根据登录用户角色变化
inkwalk's avatar
inkwalk 已提交
16
- 开发模式下的 debug 功能,帮助开发者及时发现报错和搜索错误信息,可在`admin.config.js`文件中配置
inkwalk's avatar
inkwalk 已提交
17

inkwalk's avatar
inkwalk 已提交
18 19 20
> uniCloud Admin 是一个框架,具体业务需要开发者自己开发或从插件市场导入相关插件

### PC 和移动端上的 UI 表现
inkwalk's avatar
inkwalk 已提交
21 22 23 24

<div class="flex-img-group-view" style="padding-right: 30px">
    <div class="clear-style barcode-view">
        <div class="barcode-img-box">
inkwalk's avatar
inkwalk 已提交
25
            <img src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/9303c360-11f1-11eb-b680-7980c8a877b8.png" width="75%" />
inkwalk's avatar
inkwalk 已提交
26
        </div>
inkwalk's avatar
inkwalk 已提交
27
        <p style="text-algin: center; width: 75%">PC端</p>
inkwalk's avatar
inkwalk 已提交
28 29 30
    </div>
    <div class="clear-style barcode-view">
        <div class="barcode-img-box">
inkwalk's avatar
inkwalk 已提交
31
            <img src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/2766a010-11d7-11eb-8bd0-2998ac5bbf7e.png" width="375" />
inkwalk's avatar
inkwalk 已提交
32 33 34 35
        </div>
        <p>移动端</P>
    </div>
</div>
inkwalk's avatar
inkwalk 已提交
36 37 38 39 40

### 使用

#### 创建

inkwalk's avatar
inkwalk 已提交
41
[HBuilderX](https://www.dcloud.io/hbuilderx.html) 2.9.5+版本新建 uni-app 项目,选择 uniCloud admin 项目模板,如下图
inkwalk's avatar
inkwalk 已提交
42 43 44

![download-admin](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/d5fdccf0-11f2-11eb-b244-a9f5e5565f30.png)

inkwalk's avatar
update  
inkwalk 已提交
45
创建完成后,可以跟随`云服务空间初始化向导`初始化项目,创建并绑定云服务空间
inkwalk's avatar
inkwalk 已提交
46 47

![download-admin](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/2baaddd0-11f5-11eb-81ea-f115fe74321c.png)
inkwalk's avatar
inkwalk 已提交
48 49 50 51 52 53 54 55 56 57 58 59 60

#### 运行

1. 进入 admin 项目
2. 右键 cloudfuntions 运行云服务空间初始化向导(如已创建并绑定云服务空间,则跳过此步)
3. 点击工具栏的运行 -> 运行到浏览器
4. 登录页面底部进入创建管理员页面(仅允许注册一次管理员账号)

### 目录结构

```bash
├── cloudfunctions              # 云函数
├── common
inkwalk's avatar
inkwalk 已提交
61 62
│   │── uni.css                 # 公共样式
│   └── uni-icons.css           # icon样式
inkwalk's avatar
inkwalk 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
├── components                  # 自定义组件
├── js_sdk                      # js sdk
├── pages                       # 页面
│   │── index                   # 首页
│   └── login                   # 登录页
├── static
├── store                       # vuex
├── windows
│   └── leftWindow.vue          # 左侧窗口(菜单栏)
│   └── topWindow.vue           # 顶部窗口(导航栏)
├── admin.config.js             # 系统配置(配置导航,菜单等)
├── App.vue
├── main.js
├── mainfest.json
├── pages.json
├── postcss.config.js           # postcss 配置(浏览器兼容性)
└── uni.scss
```

inkwalk's avatar
inkwalk 已提交
82
### 登录页
inkwalk's avatar
inkwalk 已提交
83

inkwalk's avatar
inkwalk 已提交
84
首次使用,可以通过登录页面底部链接创建一个超级管理员(仅允许创建一次),注册完毕后,建议从登录页面移除该链接
inkwalk's avatar
inkwalk 已提交
85

inkwalk's avatar
inkwalk 已提交
86 87 88 89 90
![login](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/69674be0-1501-11eb-81ea-f115fe74321c.png)

### admin 窗体结构介绍

登录后我们会看到如下窗体, 窗体分为三个部分,topWindow 顶部窗口(导航栏),leftwindow 左侧窗口(菜单栏),右侧的内容主窗体
inkwalk's avatar
inkwalk 已提交
91

inkwalk's avatar
inkwalk 已提交
92 93 94
![index](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/27f0ae00-1500-11eb-880a-0db19f4f74bb.image)

#### 顶部窗口(导航栏)
inkwalk's avatar
inkwalk 已提交
95 96 97 98 99

1. 通过 [admin.config.js](https://github.com/dcloudio/uni-template-admin/blob/master/admin.config.js) 配置导航栏内容

```js
export default {
inkwalk's avatar
update  
inkwalk 已提交
100 101
  // 导航栏
  navBar: {
inkwalk's avatar
inkwalk 已提交
102 103 104
    // 如上图 topWindow 左侧 Logo
    logo:
      "https://img.cdn.aliyun.dcloud.net.cn/uni-app/uniCloud/unicloudlogo.png",
inkwalk's avatar
update  
inkwalk 已提交
105 106 107
    // 右侧链接
    links: [
      {
inkwalk's avatar
inkwalk 已提交
108 109 110 111 112 113
        text: "Admin框架文档",
        url: "https://uniapp.dcloud.net.cn/uniCloud/admin"
      },
      {
        text: "浏览更多Admin插件",
        url: "https://ext.dcloud.net.cn/?cat1=7&cat2=74"
inkwalk's avatar
update  
inkwalk 已提交
114 115 116
      }
    ]
  }
inkwalk's avatar
inkwalk 已提交
117 118 119 120 121 122 123 124 125 126
};
```

2. 通过 [uni.scss](https://github.com/dcloudio/uni-template-admin/blob/master/uni.scss) 配置导航栏样式

```css
$top-window-bg-color: #fff; /* 背景色 */
$top-window-text-color: #999; /* 文字颜色 */
```

inkwalk's avatar
inkwalk 已提交
127
#### 左侧窗口(菜单栏)
inkwalk's avatar
inkwalk 已提交
128

inkwalk's avatar
inkwalk 已提交
129
左侧窗口内主要是菜单,菜单包含静态菜单和动态菜单,支持无限层级嵌套,但建议层级不要超过三级
inkwalk's avatar
inkwalk 已提交
130

inkwalk's avatar
inkwalk 已提交
131 132
- 静态菜单: 所有登录用户角色都能看到
- 动态菜单: 根据角色的权限自动生成
inkwalk's avatar
update  
inkwalk 已提交
133

inkwalk's avatar
inkwalk 已提交
134
  > 用户登录时,会根据用户的 _角色_ 去查找其拥有的 _权限_ ,再根据 _权限_ 去查找对应的 _菜单_
inkwalk's avatar
inkwalk 已提交
135

inkwalk's avatar
inkwalk 已提交
136
##### 管理静态菜单
inkwalk's avatar
inkwalk 已提交
137

inkwalk's avatar
inkwalk 已提交
138
通过 [admin.config.js](https://github.com/dcloudio/uni-template-admin/blob/master/admin.config.js) 配置侧边栏内容,所有用户都能看到静态菜单。
inkwalk's avatar
inkwalk 已提交
139

inkwalk's avatar
inkwalk 已提交
140 141
```js
export default {
inkwalk's avatar
update  
inkwalk 已提交
142 143 144 145 146 147
  // 侧边栏
  sideBar: {
    // 配置静态菜单列表(放置在用户被授权的菜单列表下边)
    staticMenu: [
      {
        _id: "demo",
inkwalk's avatar
inkwalk 已提交
148 149
        name: "静态功能演示",
        icon: "uni-icons-list",
inkwalk's avatar
update  
inkwalk 已提交
150 151
        children: [
          {
inkwalk's avatar
inkwalk 已提交
152 153 154 155
            _id: "icons",
            name: "图标",
            url: "/pages/demo/icons/icons"
          },
inkwalk's avatar
update  
inkwalk 已提交
156 157 158 159 160 161 162 163 164
          {
            _id: "table",
            name: "表格",
            url: "/pages/demo/table/table"
          }
        ]
      }
    ]
  }
inkwalk's avatar
inkwalk 已提交
165 166 167
};
```

inkwalk's avatar
inkwalk 已提交
168
##### 管理动态菜单
inkwalk's avatar
inkwalk 已提交
169 170 171

在云后台数据库的 `opendb-admin-menu` 表中管理菜单, 对菜单增删改查。如下图:

inkwalk's avatar
inkwalk 已提交
172
![add-menu](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/aa7adb00-152a-11eb-81ea-f115fe74321c.png)
inkwalk's avatar
inkwalk 已提交
173

inkwalk's avatar
inkwalk 已提交
174
例如,如需增加如下菜单:
inkwalk's avatar
inkwalk 已提交
175 176 177

```bash
订单管理 (_id: order)                  # 父菜单
inkwalk's avatar
inkwalk 已提交
178
└── 手机 (_id: phone)                  # 子菜单
inkwalk's avatar
inkwalk 已提交
179 180 181 182 183 184 185 186 187 188
```

1. 添加父菜单

菜单的 `parent_id` 字段为空, 即为一级菜单

> tips: 如无子菜单,或子菜单`url` 字段为空,则不能在页面显示

```json
{
inkwalk's avatar
update  
inkwalk 已提交
189 190
  "_id": "order",
  "name": "订单管理",
inkwalk's avatar
inkwalk 已提交
191
  "icon": "uni-icons-cart-filled",
inkwalk's avatar
update  
inkwalk 已提交
192 193 194 195 196
  "url": "",
  "sort": 1000,
  "parent_id": "",
  "permission": [],
  "status": 1
inkwalk's avatar
inkwalk 已提交
197 198 199 200 201 202 203 204 205 206 207
}
```

2. 添加子菜单

将子菜单的 `parent_id` 指向父菜单的 `_id`即可,孙菜单就是将子菜单的 `_id` 当做父菜单

> tips: 子菜单下没有子孙菜单,必须配置 `url` 字段,否则不能在页面显示

```json
{
inkwalk's avatar
update  
inkwalk 已提交
208 209
  "_id": "phone",
  "name": "手机",
inkwalk's avatar
inkwalk 已提交
210
  "icon": "uni-icons-phone",
inkwalk's avatar
update  
inkwalk 已提交
211 212 213 214 215
  "url": "/phone",
  "sort": 1001,
  "parent_id": "order",
  "permission": [],
  "status": 1
inkwalk's avatar
inkwalk 已提交
216 217 218
}
```

inkwalk's avatar
inkwalk 已提交
219
##### 侧边栏样式管理
inkwalk's avatar
inkwalk 已提交
220 221

通过 [uni.scss](https://github.com/dcloudio/uni-template-admin/blob/master/uni.scss) 配置侧边栏样式
inkwalk's avatar
inkwalk 已提交
222

inkwalk's avatar
update  
inkwalk 已提交
223
> 调整菜单颜色时,只需设置菜单背景色 `$menu-bg-color`,自行搭配文字前景色即可
inkwalk's avatar
inkwalk 已提交
224 225 226 227 228 229 230 231 232 233

```css
$left-window-bg-color: #fff; /* 左侧窗口背景色 */
$menu-bg-color: #fff; /* 一级菜单背景色 */
$sub-menu-bg-color: darken($menu-bg-color, 8%); /* 二级以下菜单背景色 */
$menu-bg-color-hover: darken($menu-bg-color, 15%); /* 菜单 hover 背景颜色 */
$menu-text-color: #333; /* 菜单前景色 */
$menu-text-color-actived: #409eff; /* 菜单激活前景色 */
```

inkwalk's avatar
inkwalk 已提交
234
#### 右侧窗口(内容主窗体)
inkwalk's avatar
inkwalk 已提交
235

inkwalk's avatar
inkwalk 已提交
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
右侧窗口是内容主窗体,和 uni-app 保持一致,用户登录后看到的第一个页面,默认是 pages 数组中第一项表示应用启动页,可在 page.json 调整启动页。

### icon 图标的使用

admin 内置了一套图标以供使用,开发者也可以使用第三方图标

#### 使用内置 icon

前往静态功能演示-图标菜单中,点击图标即可复制图标代码

> `<view class="uni-icons-gear"></view>`

或直接在标签上使用图标的 class 名称,即:

> `class='uni-icons-gear'`

#### 使用第三方 icon
inkwalk's avatar
inkwalk 已提交
253

inkwalk's avatar
inkwalk 已提交
254
以使用 elementUI 的图标为例,在 `app.vue` 中应用图标库的样式文件:
inkwalk's avatar
inkwalk 已提交
255

inkwalk's avatar
inkwalk 已提交
256 257 258 259 260 261 262 263 264 265 266 267 268 269
```javascript
<style>
  /* 注意此处仅为 icon 使用示例,建议引入纯净图标库,避免增加不必要的 css */
  @import 'https://unpkg.com/element-ui/lib/theme-chalk/index.css';
</style>
```

在标签上使用图标的 class 名称,即:

> `<view class="el-icon-s-tools"></view>`

### 用户系统

> 基于 [uni-id](https://uniapp.dcloud.io/uniCloud/uni-id) 用户登录
inkwalk's avatar
inkwalk 已提交
270 271 272

### 权限系统

inkwalk's avatar
update  
inkwalk 已提交
273
> 基于 [uni-id](https://uniapp.dcloud.io/uniCloud/uni-id?id=rbac-api) 角色权限, uni-id 是 uniCloud 之上的用户账户、权限系统
inkwalk's avatar
inkwalk 已提交
274

inkwalk's avatar
inkwalk 已提交
275
1. 角色表 `uni-id-roles`
inkwalk's avatar
update  
inkwalk 已提交
276
   > [详情](https://uniapp.dcloud.io/uniCloud/uni-id?id=%e8%a7%92%e8%89%b2%e8%a1%a8)
inkwalk's avatar
inkwalk 已提交
277
2. 权限表 `uni-id-permissions`
inkwalk's avatar
update  
inkwalk 已提交
278
   > [详情](https://uniapp.dcloud.io/uniCloud/uni-id?id=%e6%9d%83%e9%99%90%e8%a1%a8)
inkwalk's avatar
inkwalk 已提交
279
3. 菜单表 `opendb-admin-menu`
inkwalk's avatar
update  
inkwalk 已提交
280

inkwalk's avatar
inkwalk 已提交
281
   | 字段         | 类型      | 必填 | 描述                                                 |
inkwalk's avatar
update  
inkwalk 已提交
282
   | :----------- | :-------- | :--- | :--------------------------------------------------- |
inkwalk's avatar
inkwalk 已提交
283 284 285 286 287 288 289 290 291
   | \_id         | Object ID | 是   | 系统自动生成的 Id                                    |
   | name         | String    | 是   | 菜单文字                                             |
   | icon         | String    | 否   | 菜单图标                                             |
   | url          | String    | 否   | 菜单对应的页面链接(只有没有子菜单的菜单项可以配置) |
   | sort         | Integer   | 否   | 在同级菜单中的排序,数组越大越靠后                   |
   | parent_id    | String    | 否   | 父级菜单 Id                                          |
   | permission   | Array     | 否   | 菜单权限(只有没有子菜单的菜单项可以配置)           |
   | status       | Integer   | 是   | 菜单状态:0 禁用 1 启用                              |
   | created_date | Timestamp | 是   | 创建时间                                             |
inkwalk's avatar
update  
inkwalk 已提交
292

inkwalk's avatar
inkwalk 已提交
293
4. 用户表 `uni-id-users`
inkwalk's avatar
update  
inkwalk 已提交
294
   > [详情](https://uniapp.dcloud.io/uniCloud/uni-id?id=%e7%94%a8%e6%88%b7%e8%a1%a8)
inkwalk's avatar
update  
inkwalk 已提交
295
5. 验证码表 `uni-verify`
inkwalk's avatar
update  
inkwalk 已提交
296
   > [详情](https://uniapp.dcloud.io/uniCloud/uni-id?id=%e7%94%a8%e6%88%b7%e8%a1%a8)
inkwalk's avatar
inkwalk 已提交
297
6. 权限验证
inkwalk's avatar
inkwalk 已提交
298

inkwalk's avatar
inkwalk 已提交
299
admin 提供了两个内置方法,方便在页面中鉴定登录用户权限和角色:
inkwalk's avatar
inkwalk 已提交
300

inkwalk's avatar
inkwalk 已提交
301 302 303 304
| 方法             | 作用                       | 入参   | 返回值  |
| :--------------- | :------------------------- | :----- | :------ |
| `$hasPermission` | 鉴定登录用户是否具有某权限 | String | Boolean |
| `$hasRole`       | 鉴定登录用户是否具有某角色 | String | Boolean |
inkwalk's avatar
inkwalk 已提交
305 306 307

```html
<template>
inkwalk's avatar
inkwalk 已提交
308 309 310 311 312
  <view>
    <!-- 包含 user/add 权限的用户可以看到新增按钮 -->
    <button v-if="$hasPermission('user/add')">新增</button>
    <!-- 包含 admin 角色的用户可以看到删除按钮 -->
    <button v-if="$hasRole('admin')">删除</button>
inkwalk's avatar
update  
inkwalk 已提交
313
  </view>
inkwalk's avatar
inkwalk 已提交
314 315 316
</template>
```

inkwalk's avatar
inkwalk 已提交
317
### 新增页面
inkwalk's avatar
inkwalk 已提交
318

inkwalk's avatar
inkwalk 已提交
319
新增页面可以自己开发页面,也可以从插件市场下载插件。页面如需添加菜单,参见上文的[菜单管理](#静态菜单和动态菜单)
inkwalk's avatar
inkwalk 已提交
320

inkwalk's avatar
inkwalk 已提交
321 322 323
- 可以新增普通的页面,在前端 callfunction,后台搭配云函数操作
- 可以使用 uni-clientdb,在前端直接操作数据库,后台配置 db schema 进行权限和格式校验
- 可以使用云函数单文件路由,在项目中默认包含了一个[uni-cloud-router](https://uniapp.dcloud.io/uniCloud/uni-cloud-router) 的单文件路由,也可以使用插件市场的其他单文件路由
inkwalk's avatar
inkwalk 已提交
324

inkwalk's avatar
inkwalk 已提交
325
#### 自己开发页面
inkwalk's avatar
inkwalk 已提交
326

inkwalk's avatar
inkwalk 已提交
327
admin 中开发页面,和 uni-app 开发 vue 页面是一致的。
inkwalk's avatar
inkwalk 已提交
328

inkwalk's avatar
inkwalk 已提交
329 330
#### 从插件市场下载插件,怎么注册菜单进去

inkwalk's avatar
update  
inkwalk 已提交
331
[uniCloud admin 管理项目-权限管理插件](https://ext.dcloud.net.cn/plugin?id=3269)
inkwalk's avatar
inkwalk 已提交
332

inkwalk's avatar
update  
inkwalk 已提交
333
_使用步骤:_
inkwalk's avatar
inkwalk 已提交
334

inkwalk's avatar
inkwalk 已提交
335
1.[插件市场](https://ext.dcloud.net.cn/)导入插件
inkwalk's avatar
inkwalk 已提交
336 337 338 339 340
2. 在 HBuilder X 2.9.5 中选择添加插件的项目
3. 覆盖项目的 db_init.json 文件, 点击“确定覆盖”
4. 在 db_init.json 文件上右键,点击“初始化云数据库”
5. 刷新 admin 即可在菜单栏看到新增的菜单

inkwalk's avatar
inkwalk 已提交
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
### 插件开发

我们不仅是插件的使用者,也可以是插件的开发者,那么如何开发一款插件呢?

#### 如何开发插件

插件就是项目中的一项功能,例如[uniCloud admin 管理项目-权限管理插件](https://ext.dcloud.net.cn/plugin?id=3269),对于 admin 项目来说,可以项目中开发完成功能,再将这项功能剥离成一个插件。其他开发者使用插件的过程,就是将插件还原成项目中一项功能。

_插件的目录结构:_

```bash
├── cloudfunctions
│   └── db_init.json            # 云函数
├── js_sdk                      # js sdk
├── pages                       # 页面
│   └── index                   # 你的页面
└── pages.json
```



#### 如何发布插件
inkwalk's avatar
update  
inkwalk 已提交
363

inkwalk's avatar
inkwalk 已提交
364
将插件发布到[插件市场](https://ext.dcloud.net.cn/), 登录后看到如下界面:
inkwalk's avatar
update  
inkwalk 已提交
365

inkwalk's avatar
inkwalk 已提交
366
![publish-plugin](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/abd19160-152a-11eb-81ea-f115fe74321c.png)
inkwalk's avatar
inkwalk 已提交
367

inkwalk's avatar
inkwalk 已提交
368
admin 相关的插件必须发到,``uniCloud`` 分类的 ``Admin 插件`` 下:
inkwalk's avatar
inkwalk 已提交
369

inkwalk's avatar
inkwalk 已提交
370
![plugin-class](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/ab2e7390-152a-11eb-880a-0db19f4f74bb.png)
inkwalk's avatar
inkwalk 已提交
371 372 373

### 使用三方组件库

inkwalk's avatar
update  
inkwalk 已提交
374
uniCloud Admin 支持所有三方的 Vue UI 库,包括 elementUI 等非 uni-app 的 UI 库,但注意这些 for h5 的 ui 库只能在浏览器中使用,无法适配 App 和小程序,按如下操作。
inkwalk's avatar
inkwalk 已提交
375

inkwalk's avatar
inkwalk 已提交
376
以使用 element-ui 框架为例:
inkwalk's avatar
inkwalk 已提交
377 378 379

1. 安装 UI 框架

inkwalk's avatar
update  
inkwalk 已提交
380
   > npm i element-ui -S
inkwalk's avatar
inkwalk 已提交
381 382 383

2. 在 main.js 中引用

inkwalk's avatar
update  
inkwalk 已提交
384 385 386
   ```javascript
   import elementUI from "element-ui";
   import "element-ui/lib/theme-chalk/index.css";
inkwalk's avatar
inkwalk 已提交
387

inkwalk's avatar
update  
inkwalk 已提交
388 389
   Vue.use(elementUI);
   ```