提交 069fe9fb 编写于 作者: hbcui1984's avatar hbcui1984
......@@ -114,6 +114,9 @@ const config = {
.end()
.plugin('add-base-to-md')
.use(require('./markdown/add-base-to-md'), [{ base }])
.end()
.plugin('subtable')
.use(require('./markdown/markdown-it-subtable').markdownIt, [{ flags: ['->'] }])
}
},
chainWebpack (config, isServer) {
......
function normalizeMD (md) {
if (typeof md === 'string') {
return md
.replace(/(?<!\\)</g, '\\<')
.replace(/]([^(])|(?<!\\)]$/g, '\\]$1')
.replace(/(?<!\\)\|/g, '\\|')
}
return md
}
function resolveSubtable(md, tokens = [], tokenIndexes = [], flags) {
if (tokens.length && tokenIndexes.length) {
tokenIndexes.forEach(tokenIndex => {
if (Array.isArray(tokenIndex) && tokenIndex.length > 2) {
const tableOpenIndex = tokenIndex.shift();
const tableCloseIndex = tokenIndex.pop();
let deleteOffset = 0;
tokenIndex.forEach(subtableIndexes => {
const subtableOpenIndex = subtableIndexes.shift() + deleteOffset;
const subtableColumnCount = (subtableIndexes[0] + deleteOffset - subtableOpenIndex - 2) / 3 - 1;
const subtableCloseIndex = subtableIndexes.pop() + deleteOffset + subtableColumnCount * 3;
const subtableTokens = tokens.slice(subtableOpenIndex - 1, subtableCloseIndex + 1);
// 2 table token 新行开始时固定的 tr_open td_open 数量
// 3 每个 inline 都会伴随一个 td_close、td_open(行最后一列 inline 会伴随 td_close tr_close)
// 1 为 flag ->(标识符) 的列,需要去掉
let tableColumnCount = 0;
for (let i = 0; i < tableCloseIndex; i++) {
const token = tokens[i];
if (i < subtableOpenIndex) {
if (token.type === 'th_open') {
tableColumnCount++;
} else if (token.type === 'thead_close') {
break;
}
}
}
let subtableMD = subtableTokens
.map(token => {
if (token.type === 'inline' && !flags.includes(token.content)) {
return normalizeMD(token.content);
} else if (token.type === 'tr_close') {
return '\n';
}
})
.filter(Boolean);
const subtableLevel = subtableTokens[0].level;
const newTokens = md.parse(`|${subtableMD.join('|')}|`);
newTokens.forEach(token => {
token.content = ''; // 和 children 内容重复
token.level = token.level + subtableLevel;
});
newTokens[0].attrJoin('style', 'overflow-x: visible;margin: auto;');
const childrenTableTokenIndex = subtableOpenIndex - 2;
const subtablePrevTrOpenIndex = childrenTableTokenIndex - tableColumnCount * 3 - 2;
tokens[tableOpenIndex].attrJoin('class', 'have-children-table'); // table
tokens[subtablePrevTrOpenIndex].attrJoin('class', 'have-children-tr'); // table tr_open
// table td_open
const haveChildrenTrTdToken = tokens[subtablePrevTrOpenIndex + 1];
haveChildrenTrTdToken.attrJoin('class', 'have-children-tr-td');
haveChildrenTrTdToken.attrJoin('style', ';text-wrap: nowrap');
tokens[childrenTableTokenIndex].attrJoin('class', 'children-table'); // subtable tr_open
tokens[childrenTableTokenIndex].attrJoin('hidden', ''); // subtable tr_open
tokens[subtableOpenIndex - 1].attrJoin('colspan', tableColumnCount); // subtable td_open
const deleteCount = subtableCloseIndex - subtableOpenIndex + 1;
tokens.splice(subtableOpenIndex, deleteCount, ...newTokens);
deleteOffset = deleteOffset + newTokens.length - deleteCount;
});
}
});
}
}
function process(md, tokens, flags = ['->']) {
const subtableMinTokenCount = 3;
if (
Array.isArray(tokens) &&
tokens.length &&
tokens.some(token => token.content.includes('->') && token.type === 'inline')
) {
const tableOpenTokenIndex = tokens.findIndex(token => token.type === 'table_open');
if (tableOpenTokenIndex > -1) {
/**
* [
* table_open index,
* [] // subtable indexes,
* table_close index
* ]
*/
let tableTokensIndexes = [[]];
let tableIndex = 0;
let subtableIndex = 1;
tokens.forEach((token, index) => {
if (token.type === 'table_open' && tableTokensIndexes[tableIndex].length === 0) {
tableTokensIndexes[tableIndex].push(index);
}
if (tableTokensIndexes[tableIndex] && typeof tableTokensIndexes[tableIndex][0] !== 'undefined') {
if (token.type === 'inline') {
if (flags.find(flag => new RegExp(`^\\s*${flag}\\s*$`).test(token.content))) {
(
tableTokensIndexes[tableIndex][subtableIndex] || (tableTokensIndexes[tableIndex][subtableIndex] = [])
).push(index);
} else if (tokens[index - 2].type === 'tr_open') {
tableTokensIndexes[tableIndex][++subtableIndex] = [];
}
}
}
if (token.type === 'table_close') {
subtableIndex = 1;
tableTokensIndexes[tableIndex].push(index);
tableTokensIndexes[++tableIndex] = [];
}
});
tableTokensIndexes.forEach((subtableTokensIndex, index) => {
tableTokensIndexes[index] = subtableTokensIndex.filter(
i => typeof i === 'number' || (Array.isArray(i) && i.length >= subtableMinTokenCount)
);
});
tableTokensIndexes = tableTokensIndexes.filter(i => i.length);
if (tableTokensIndexes.length) {
resolveSubtable(md, tokens, tableTokensIndexes, flags);
}
}
}
}
module.exports = {
process,
markdownIt: function subTablePlugin(md, { flags = ['->'] } = {}) {
md.core.ruler.after(
'inline',
'subtable',
(state, startLine, endLine, silent) => {
process(md, state.tokens, flags);
},
{
alt: ['paragraph', 'reference'],
}
);
},
};
......@@ -127,15 +127,21 @@ uni-admin的`一键部署`,会自动上传云函数、创建数据库,并将
![download-admin](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/cloud-init.png)
<!-- 除了可视化向导外,也可以从[https://github.com/dcloudio/uni-admin](https://github.com/dcloudio/uni-admin)获取代码。 -->
#### 运行
1. 进入 admin 项目
2.`uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json` 文件中填写自己的 `passwordSecret` 字段 (用于加密密码入库的密钥) 和 `tokenSecret` 字段 (为生成 token 需要的密钥,测试期间跳过本条也可以)
3. 右键 uniCloud目录 运行云服务空间初始化向导,初始化数据库和上传部署云函数(如已创建并绑定云服务空间,则跳过此步)
4. 点击HBuilderX工具栏的运行【Ctrl+r / cmd+r】 -> 运行到浏览器。如果是连接本地云函数调试环境,上一步可以不上传云函数,但数据库仍需初始化。
5. 从启动后的登录页面的底部,进入创建管理员页面(仅允许注册一次管理员账号)
2. 右键 `uniCloud` 目录关联空间(如果已经关联则跳过第2步)
3.`uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json` 文件中填写自己的 `passwordSecret` 字段 (用于加密密码入库的密钥) 和 `tokenSecret` 字段 (为生成 token 需要的密钥,测试期间跳过本条也可以)
4. 右键 `uniCloud/cloudfunctions` 目录 上传部署云函数、公共模块
![download-admin](https://web-ext-storage.dcloud.net.cn/unicloud/uni-admin/514.png)
5. 右键 `uniCloud/database` 目录 初始化数据库(HBX的版本需要≥3.9,同时自HBX4.2版本起,执行初始化向导时就会初始化数据库,故如果数据库里已有数据,则不需要再执行数据库初始化)
![download-admin](https://web-ext-storage.dcloud.net.cn/unicloud/uni-admin/513.png)
6. 点击HBuilderX工具栏的运行【Ctrl+r / cmd+r】 -> 运行到浏览器。
7. 从启动后的登录页面的底部,进入创建管理员页面(仅允许注册一次管理员账号)
**注意**
......@@ -703,7 +709,7 @@ _使用步骤:_
1.[插件市场](https://ext.dcloud.net.cn/)导入插件
2. 在 HBuilder X 3.1+ 中选择添加插件的项目
3. 在插件的 db_init.json 文件上右键,点击“初始化云数据库”
3. 右键项目根目录的 database 目录,点击“初始化云数据库”(HBX的版本需要≥3.9)
4. 在菜单管理中的添加【待添加菜单】
5. 刷新 admin 即可在菜单栏看到新增的菜单
......@@ -726,8 +732,7 @@ _admin 插件的目录结构:_
├── uniCloud
│ ├── cloudfunctions # 云函数
│ └── database
│ ├── xxx.schema.json # 数据库schema文件
│ └── db_init.json # 数据库初始化文件
│ └── xxx.schema.json # 数据库schema文件
├── js_sdk # js sdk
├── pages # 页面
│ └── your-page # 你的页面
......@@ -765,7 +770,7 @@ pluginId 为你上传插件市场时填的插件id(插件市场每个插件都
包含%pluginId%-menu.json的插件导入项目后,运行起来uni-admin,菜单管理模块会自动读取这个json文件中的菜单配置,生成【待添加菜单】,配置与 admin【管理动态菜单】同理。插件作者可以在界面上可视化的点击确认添加,即可把菜单加入到他的项目下。
虽然也可以通过`db_init.json`来进行菜单初始化,但不建议这么操作。很容易发生和用户的数据库的冲突。仍然推荐使用%pluginId%-menu.json方式。
虽然也可以通过`database`目录来进行菜单初始化,但不建议这么操作。很容易发生和用户的数据库的冲突。仍然推荐使用%pluginId%-menu.json方式。
**关于uni-admin和uni-cloud-router公共模块**
uni-admin自带了一个单路由框架,uni-cloud-router,然后自带了一个uni-admin云函数使用了这个uni-cloud-router。但插件作者的插件,不能写在uni-admin的目录下。插件的云函数,要有插件id前缀,如果你想把你的插件的所有云函数合并成一个云函数,可以新建一个你自己的云函数,在里面引用uni-cloud-router公共模块。
......@@ -811,7 +816,7 @@ uni-admin框架运行的基础路径默认为`/admin/`,部署到前端网页
## 常见问题
### 使用uni-admin新建用户无法登录,会提示“该账号暂无权限登录” ?
### 使用uni-admin新建用户无法登录,会提示“该账号暂无权限登录” ?@q1
用户登录逻辑:登录时系统检测没有菜单会提示“暂无权限登录”,需要给新账号绑定角色,角色有菜单方可登录
......@@ -831,7 +836,20 @@ uni-admin框架运行的基础路径默认为`/admin/`,部署到前端网页
2. 前往uniCloud web控制台 - 云数据库 - 打开uni-id-users表 - 找到刚注册的test账号,复制其password字段的值,修改admin账号的password跟test账号的password一致。
3. 此时admin账号的密码就已经重置为123456了
### uni-admin创建超级管理员报错 Invalid uni-id config file@q3
请查看 `/uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/` 目录下是否有这些目录和文件,如果没有,请先尝试下载 uni-config-center 模块
![](https://web-ext-storage.dcloud.net.cn/unicloud/uni-admin/515.png)
确保下载后的目录是下图这样的,如果下载后还是没有,则需要下载最新版uni-admin,然后从下载的项目中复制过来
![](https://web-ext-storage.dcloud.net.cn/unicloud/uni-admin/511.png)
最后再重新上传 uni-config-center 模块
![](https://web-ext-storage.dcloud.net.cn/unicloud/uni-admin/516.png)
注意:uni-id 配置文件为标准的 json 文件,里面不可以写注释。
......@@ -89,7 +89,9 @@ module.exports = {
| --- | --- | --- | --- |
| token | String | 是 |客户端callFunction带上的token |
| options | object | 否 |checkToken方法的选项 |
| &nbsp;&#124;-&nbsp;autoRefresh| boolean | 否 |是否需要自动判断刷新token,默认true |
->|参数名称|类型|必填|说明|
->| ---| ---| --- | ---|
->| autoRefresh| boolean | 否 |是否需要自动判断刷新token,默认true |
**说明**
......
......@@ -13,29 +13,55 @@ uniCloud 私有化环境基于 Linux 物理机来构建的,在部署时需要
### 环境包下载
下载私有云环境包(zip文件)后,上传至服务器,并解压到指定的目录
请先联系`DCloud`工作人员申请私有云环境,待工作人员创建完私有云环境后
环境包可联系`DCloud`工作人员获取
您可在 uniCloud 控制台切换到“私有云环境”页面,查看您的私有云环境
### 生成 license
![](https://web-ext-storage.dcloud.net.cn/unicloud/docs202403051519770.png)
下载获取硬件ID工具到服务器
按图示下载私有云环境包(.tar.gz文件)后,上传至服务器并解压至合适的目录下。
`https://web-ext-storage.dcloud.net.cn/unicloud/private/tools/get-hardware-id`
```
mkdir unicloud-private
tar -zxvf [version].tar.gz -C unicloud-private
```
![](https://web-ext-storage.dcloud.net.cn/unicloud/docs202403051530127.png)
### 获取环境Key (必须)
> 环境 Key 是 uniCloud 私有化环境运行的必要文件
>
> 请确保环境 Key 与 环境一一对应,请勿复制错误
在 uniCloud 控制台找到对应环境,点击“复制环境Key,在私有化服务根目录下新建文件,
将复制的环境 Key 保存为 “key.txt”。
![](https://web-ext-storage.dcloud.net.cn/unicloud/docs202403051539516.png)
### 获取 license (必须)
> license 授权将与服务器进行绑定,一台服务器仅可以绑定一个 license 授权
>
> 如您有分布式部署需求请联系`DCloud`工作人员
1. 下载获取硬件ID工具到服务器
`wget https://web-ext-storage.dcloud.net.cn/unicloud/private/tools/get-hardware-id`
执行`./get-hardware-id`, 获取到硬件ID
将获取到的硬件ID发送给 DCloud 生成 license 文件
将获取到的硬件ID发送给 `DCloud` 生成 license 文件
将生成后的 license.txt 文件放置私有云环境根目录下即可
待 license 生成后,可在 uniCloud 控制台,点击“查看服务器凭证”查看。
### 环境包下载和解压
![](https://web-ext-storage.dcloud.net.cn/unicloud/docs202403051554539.png)
下载私有云环境包后,上传至服务器,并解压到指定的目录。环境包可联系`DCloud`工作人员获取
复制凭证后,在私有化服务根目录下新建文件,将复制的凭证保存为 license.txt”
### 私有化环境启动/停止
> 在私有云环境根目录运行以下命令
> 所有命令请在私有云环境根目录运行
启动
......@@ -45,12 +71,12 @@ uniCloud 私有化环境基于 Linux 物理机来构建的,在部署时需要
`./unicloud stop -s [服务空间ID]`
### 创建及配置服务空间
#### 创建服务空间目录
`私有云环境根目录/spaces`目录下创建目录,并将目录命名为SpaceId。spaceId可在[uniCloud控制台](https://unicloud.dcloud.net.cn/)查看。
`私有云环境根目录/spaces`目录下创建目录,并将目录命名为SpaceId。
spaceId可在[uniCloud控制台](https://unicloud.dcloud.net.cn/)查看。
#### 上传云函数及数据库schema文件
......@@ -60,11 +86,12 @@ uniCloud 私有化环境基于 Linux 物理机来构建的,在部署时需要
在服务空间目录下新增`config.json`配置文件。配置文件内容如下:
```json
```js
//下方为配置示例,如拷贝此内容切记去除注释
{
"default": true, //是否为默认服务空间,一套私有云环境下,只能有一个默认服务空间
"spaceId": "pvt-xxx",//私有云服务空间编号,可在uniCloud控制台查看
"startAsDaemon": true, // 是否在后台运行; 默认 true
"port": 7001, //端口号,可自定义,同一台服务器下,各服务空间的端口号不可重复
"clientSecret": "ba461799-fde8-429f-8cc4-4b6d306e2339",//客户端通讯密钥
"mongodb": { //mongo数据库连接配置
......
......@@ -9288,10 +9288,10 @@ vuepress-plugin-zooming@^1.1.8:
dependencies:
zooming "^2.1.1"
vuepress-theme-uni-app-test@^1.4.5:
version "1.4.5"
resolved "https://registry.npmmirror.com/vuepress-theme-uni-app-test/-/vuepress-theme-uni-app-test-1.4.5.tgz#c996fcf2baef6e6610e065671d6f0d29328ce97f"
integrity sha512-Zo8T2lH6d3TCf9Dghkz0NrzWbdOB0czisdbFqnB0P4H9K/qkM7SBDJCxeF9tVvS+p4GB49jwHAH24CTfDKYY9Q==
vuepress-theme-uni-app-test@^1.4.7:
version "1.4.7"
resolved "https://registry.npmmirror.com/vuepress-theme-uni-app-test/-/vuepress-theme-uni-app-test-1.4.7.tgz#566be747f080f551a0f65ac306ccc09dab2ab623"
integrity sha512-O+4FGNetUqEHBpz/EE7KJlwNP3LrU2iz7W1WEq2vHnowPyOxwB2DiSA1aHaHhX1zDAG4n/HILQXhjH48r4uGhw==
dependencies:
"@vuepress/plugin-back-to-top" "^1.9.5"
"@vuepress/theme-default" "^1.8.2"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册