Compare commits
10 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
cfca86ebfd | |
|
|
e6b1f560c4 | |
|
|
4037e8f8c1 | |
|
|
a9cc37a24a | |
|
|
ca09978d7c | |
|
|
b414802867 | |
|
|
99683254b1 | |
|
|
8be1e20724 | |
|
|
bf9abf570f | |
|
|
f454070d25 |
12
CHANGELOG.md
12
CHANGELOG.md
|
|
@ -1,5 +1,17 @@
|
||||||
# amWiki 版本日志
|
# amWiki 版本日志
|
||||||
|
|
||||||
|
<!--
|
||||||
|
## v1.2.2
|
||||||
|
_2017-0-0_
|
||||||
|
|
||||||
|
- 增加短链接模式 ([#53](https://github.com/TevinLi/amWiki/issues/53))
|
||||||
|
- 增加 `\` 符转义功能,用于阻止语法解析 ([#71](https://github.com/TevinLi/amWiki/issues/71))
|
||||||
|
- 对代码块增加一层隔离处理,代码块中的语法符不解析
|
||||||
|
- 修复复选框为 Todo-list 时多余的点修饰 ([#56](https://github.com/TevinLi/amWiki/issues/56))
|
||||||
|
- 修复导航子目录点号修饰在火狐下的一个显示bug
|
||||||
|
- 导航栏文件夹项增加 title ([#63](https://github.com/TevinLi/amWiki/issues/63))
|
||||||
|
-->
|
||||||
|
|
||||||
## [v1.2.1](https://github.com/TevinLi/amWiki/releases/tag/v1.2.1)
|
## [v1.2.1](https://github.com/TevinLi/amWiki/releases/tag/v1.2.1)
|
||||||
_2017-08-08_
|
_2017-08-08_
|
||||||
|
|
||||||
|
|
|
||||||
19
README.md
19
README.md
|
|
@ -4,15 +4,12 @@
|
||||||
amWiki 是一款由 JS 开发、依赖 Atom 或 Nodejs-Npm 的 Markdown 轻量级前端化开源文库系统。
|
amWiki 是一款由 JS 开发、依赖 Atom 或 Nodejs-Npm 的 Markdown 轻量级前端化开源文库系统。
|
||||||
amWiki 致力于让大家可以更简单、更便捷的建设个人和团队文库!
|
amWiki 致力于让大家可以更简单、更便捷的建设个人和团队文库!
|
||||||
|
|
||||||
[[fork amWiki on Github](https://github.com/TevinLi/amWiki)]
|
|
||||||
|
|
||||||
GitHub:
|
GitHub:
|
||||||
[](https://github.com/TevinLi/amWiki "GitHub Stars") [](https://github.com/TevinLi/amWiki "GitHub Forks") [](https://github.com/TevinLi/amWiki "GitHub Open Issues") [](https://github.com/TevinLi/amWiki "GitHub Closed Issues")
|
[    <br>  ](https://github.com/TevinLi/amWiki)
|
||||||
[](https://github.com/TevinLi/amWiki "GitHub Tag") [](https://atom.io/packages/amWiki "MIT License")
|
|
||||||
APM:
|
|
||||||
[](https://atom.io/packages/amWiki "APM Version") [](https://atom.io/packages/amWiki "APM Downloads")
|
|
||||||
NPM:
|
NPM:
|
||||||
[](https://www.npmjs.com/package/amwiki "NPM Version") [](https://www.npmjs.com/package/amwiki "APM Downloads") [](https://www.npmjs.com/package/amwiki)
|
[  ](https://www.npmjs.com/package/amwiki)
|
||||||
|
APM:
|
||||||
|
[ ](https://atom.io/packages/amWiki)
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
|
@ -32,8 +29,8 @@ NPM:
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## 安装 amWiki
|
## 安装 amWiki
|
||||||
amWiki 可以同时在 Atom 编辑器和 nodejs npm 的命令行两个平台工作,两个平台的工作相互独立,但所创建的文库却可以相互共用
|
amWiki 可以同时在 Atom 编辑器和 nodejs npm 命令行两个平台工作,两个平台的工作相互独立,所创建的文库可以相互通用
|
||||||
(PS:对这两个平台的依赖都是编辑需求而不是服务器需求,amWiki 创建的文库是纯静态 html,可以布置到任意服务器)
|
_(PS:对这两个平台的依赖都是编辑需求而不是服务器需求,amWiki 创建的文库是纯静态 html,可以布置到任意服务器)_
|
||||||
|
|
||||||
### 作为 Atom 插件安装
|
### 作为 Atom 插件安装
|
||||||
1. 下载 Github 开源文本编辑器 [Atom](https://atom.io/ "Atom官网"),并安装
|
1. 下载 Github 开源文本编辑器 [Atom](https://atom.io/ "Atom官网"),并安装
|
||||||
|
|
@ -51,10 +48,12 @@ amWiki 可以同时在 Atom 编辑器和 nodejs npm 的命令行两个平台工
|
||||||
3. cd 到某个文件夹,通过命令 `amwiki create` 创建文库
|
3. cd 到某个文件夹,通过命令 `amwiki create` 创建文库
|
||||||
4. 通过命令 `amwiki help` 查看帮助
|
4. 通过命令 `amwiki help` 查看帮助
|
||||||
|
|
||||||
|
(此场景相当于 amwiki-cli,但是 amwiki 本身就是 node 包,不用加-cli)
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## amWiki 教程 & 文档
|
## amWiki 教程 & 文档
|
||||||
更多详细功能与使用介绍请前往: [ [amWiki 官网文档中心:amwiki.org/doc/](https://amwiki.org/doc/) ]
|
更多详细资料请前往: [ [amWiki 官网文档中心:amwiki.org/doc/](https://amwiki.org/doc/) ]
|
||||||
(amWiki 的文档由项目自身创建与维护)
|
(amWiki 的文档由项目自身创建与维护)
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@
|
||||||
- 增加数学公式渲染
|
- 增加数学公式渲染
|
||||||
- 增加 markdown 式脑图渲染
|
- 增加 markdown 式脑图渲染
|
||||||
- 增加转义识别,允许使用 `\` 转义来阻止语法符解析 #71
|
- 增加转义识别,允许使用 `\` 转义来阻止语法符解析 #71
|
||||||
- 增加扩展名识别,允许使用 `.markdown` 扩展名 #49
|
|
||||||
|
|
||||||
## v1.2.3
|
## v1.2.3
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -305,18 +305,7 @@ const creator = (function () {
|
||||||
fs.writeFileSync(options.outputPath + 'library/home-首页.md', home, 'utf-8');
|
fs.writeFileSync(options.outputPath + 'library/home-首页.md', home, 'utf-8');
|
||||||
//其他页面文档
|
//其他页面文档
|
||||||
let fileList2 = [
|
let fileList2 = [
|
||||||
['doc.amwiki-introduce.md', 'library/001-学习amWiki/01-amWiki轻文库简介.md'],
|
['doc.md-start.md', 'library/100-新建栏目/01-Markdown快速开始.md'],
|
||||||
['doc.amwiki-mind-map.md', 'library/001-学习amWiki/02-amWiki功能导图.md'],
|
|
||||||
['doc.amwiki-new.md', 'library/001-学习amWiki/03-如何开始一个新amWiki轻文库.md'],
|
|
||||||
['doc.amwiki-edit.md', 'library/001-学习amWiki/04-如何编辑amWiki轻文库.md'],
|
|
||||||
['doc.amwiki-testing.md', 'library/001-学习amWiki/06-使用测试模块测试接口.md'],
|
|
||||||
['doc.amwiki-test-cross.md', 'library/001-学习amWiki/07-amWiki转接到任意域名进行接口测试.md'],
|
|
||||||
['doc.md-start.md', 'library/001-学习amWiki/05-学习markdown/01-Markdown快速开始.md'],
|
|
||||||
['doc.md-high-lighting.md', 'library/001-学习amWiki/05-学习markdown/02-amWiki与语法高亮.md'],
|
|
||||||
['doc.md-flow-chart.md', 'library/001-学习amWiki/05-学习markdown/03-amWiki与流程图.md'],
|
|
||||||
['doc.md-atom.md', 'library/001-学习amWiki/05-学习markdown/05-Atom对Markdown的原生支持.md'],
|
|
||||||
['doc.demo-api.md', 'library/002-文档示范/001-通用API接口文档示例.md'],
|
|
||||||
['doc.demo-long-article.md', 'library/002-文档示范/002-超长文档页内目录示例.md']
|
|
||||||
];
|
];
|
||||||
for (let file of fileList2) {
|
for (let file of fileList2) {
|
||||||
that._copyFile(options.filesPath + file[0], options.outputPath + file[1]);
|
that._copyFile(options.filesPath + file[0], options.outputPath + file[1]);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
@charset "utf-8";
|
@charset "utf-8";
|
||||||
|
|
||||||
|
|
||||||
/* ---------- markdown custom ---------- */
|
/* ---------- markdown custom ---------- */
|
||||||
.markdown-body{font-size:14px;}
|
.markdown-body{font-size:14px;}
|
||||||
.markdown-body h1{margin-top:50px;font-size:38px;border-bottom:#d5d5d5 1px solid;}
|
.markdown-body h1{margin-top:50px;font-size:38px;border-bottom:#d5d5d5 1px solid;}
|
||||||
|
|
@ -96,7 +95,7 @@ body{position:relative;height:100%;background:#e7e8eb;}
|
||||||
.menubar ul li > a.on:before{display:block;position:absolute;left:0px;z-index:1;width:2px;height:30px;content:" ";background:@colour-base;}
|
.menubar ul li > a.on:before{display:block;position:absolute;left:0px;z-index:1;width:2px;height:30px;content:" ";background:@colour-base;}
|
||||||
.menubar ul li > a.on:after{background:#f5f5f5;}
|
.menubar ul li > a.on:after{background:#f5f5f5;}
|
||||||
.menubar ul li > strong.on{text-shadow:#666 1px 0 0;}
|
.menubar ul li > strong.on{text-shadow:#666 1px 0 0;}
|
||||||
.menubar ul li > strong:before{position:absolute;z-index:1;width:6px;height:6px;margin:12px 0 0 -12px;background:#acacac;border-radius:50%;content:" ";}
|
.menubar ul li > strong:before{position:relative;z-index:1;float:left;width:6px;height:6px;margin:12px 0 0 -12px;background:#acacac;border-radius:50%;content:" ";}
|
||||||
.menubar ul li > strong.on:before{background:@colour-base;}
|
.menubar ul li > strong.on:before{background:@colour-base;}
|
||||||
.menubar mark{color:red;background:#f5f5f5;}
|
.menubar mark{color:red;background:#f5f5f5;}
|
||||||
|
|
||||||
|
|
@ -137,6 +136,7 @@ body[onselectstart]{cursor:pointer;-moz-user-select:none;-webkit-user-select:non
|
||||||
.main .footnote li:focus{background:#EAFFEA;}
|
.main .footnote li:focus{background:#EAFFEA;}
|
||||||
.main .footnote svg{display:inline-block;width:14px;height:14px;margin-bottom:-1px;}
|
.main .footnote svg{display:inline-block;width:14px;height:14px;margin-bottom:-1px;}
|
||||||
.main .footnote-none{width:0;height:0;overflow:hidden;}
|
.main .footnote-none{width:0;height:0;overflow:hidden;}
|
||||||
|
.main .todolist{list-style:none;padding-left:10px;}
|
||||||
/* sibling */
|
/* sibling */
|
||||||
.main-sibling{display:none;width:100%;padding:30px 45px 20px;font-size:14px;border-top:1px solid #e7e7eb;}
|
.main-sibling{display:none;width:100%;padding:30px 45px 20px;font-size:14px;border-top:1px solid #e7e7eb;}
|
||||||
.main-sibling.on{display:block;}
|
.main-sibling.on{display:block;}
|
||||||
|
|
|
||||||
|
|
@ -197,7 +197,7 @@
|
||||||
}
|
}
|
||||||
html = templates[1].replace('{{list}}', html);
|
html = templates[1].replace('{{list}}', html);
|
||||||
}
|
}
|
||||||
return text + '\n<br>' + html;
|
return text + '\n\n<br>' + html;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -292,12 +292,16 @@
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
Docs.prototype._setCheckbox = function (html) {
|
Docs.prototype._setCheckbox = function (html) {
|
||||||
return html.replace(/\[([√×Xx\s\-_])\]\s(.*?)([<\n\r])/g, function (m, s1, s2, s3, index) {
|
return html
|
||||||
var checkboxHtml = '<input type="checkbox" id="checkbox' + index + '"';
|
.replace(/<ul>\n(<li>\[[√×Xx\-_ ]\] *.*?<\/li>\n)+<\/ul>/g, function (m) {
|
||||||
checkboxHtml += /\s/.test(s1) ? '>' : 'checked="true">';
|
return m.replace('<ul>', '<ul class="todolist">');
|
||||||
checkboxHtml += '<label for="checkbox' + index + '">' + s2 + '</label>';
|
})
|
||||||
return checkboxHtml + s3;
|
.replace(/\[([√×Xx\-_ ])\] (.*?)([<\n\r])/g, function (m, s1, s2, s3, index) {
|
||||||
});
|
var checkboxHtml = '<input type="checkbox" id="checkbox' + index + '"';
|
||||||
|
checkboxHtml += /\s/.test(s1) ? '>' : 'checked="true">';
|
||||||
|
checkboxHtml += '<label for="checkbox' + index + '">' + s2 + '</label>';
|
||||||
|
return checkboxHtml + s3;
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -340,7 +344,7 @@
|
||||||
//汉字序号类型
|
//汉字序号类型
|
||||||
/^[\((【第]?[一二三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+/,
|
/^[\((【第]?[一二三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+/,
|
||||||
//英文序号类型
|
//英文序号类型
|
||||||
/^(chapter)|(section)|(part)|(step)/i,
|
/^(chapter)|(section)|(part)|(lesson)|(step)/i,
|
||||||
//罗马序号类型
|
//罗马序号类型
|
||||||
/^[ⅠⅡⅢⅣIⅤⅥⅦⅧⅨⅩⅪⅫLCDM]+\.?/
|
/^[ⅠⅡⅢⅣIⅤⅥⅦⅧⅨⅩⅪⅫLCDM]+\.?/
|
||||||
];
|
];
|
||||||
|
|
@ -359,7 +363,7 @@
|
||||||
$elm.children('li').each(function (index2) {
|
$elm.children('li').each(function (index2) {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
if (!$elm.hasClass('unindex')) {
|
if (!$elm.hasClass('unindex')) {
|
||||||
var index = typeof index1 == 'number' ? (index1 + 1) + '.' + (index2 + 1): (index2 + 1) + '.';
|
var index = typeof index1 == 'number' ? (index1 + 1) + '.' + (index2 + 1) : (index2 + 1) + '.';
|
||||||
$this.prepend('<i>' + index + '</i>');
|
$this.prepend('<i>' + index + '</i>');
|
||||||
}
|
}
|
||||||
setIndex($this.children('ol'), index2);
|
setIndex($this.children('ol'), index2);
|
||||||
|
|
@ -418,7 +422,22 @@
|
||||||
Docs.prototype.renderDoc = function (content) {
|
Docs.prototype.renderDoc = function (content) {
|
||||||
var that = this;
|
var that = this;
|
||||||
var html = '';
|
var html = '';
|
||||||
|
var codeList = [];
|
||||||
this.cleanView();
|
this.cleanView();
|
||||||
|
//抽取代码块
|
||||||
|
content = content
|
||||||
|
.replace(/( {4,}|\t+)?```[\s\S]*?```/g, function (m, s1) {
|
||||||
|
if (s1) {
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
return '<code:' + codeList.push(m) + '>';
|
||||||
|
})
|
||||||
|
.replace(/(`+)?`.*?`/g, function (m, s1) {
|
||||||
|
if (s1) {
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
return '<code:' + codeList.push(m) + '>';
|
||||||
|
});
|
||||||
//增加"\"符转义功能
|
//增加"\"符转义功能
|
||||||
content = content.replace(/\\(.)/g, function (m, s1) {
|
content = content.replace(/\\(.)/g, function (m, s1) {
|
||||||
return '&#' + s1.charCodeAt(0) + ';';
|
return '&#' + s1.charCodeAt(0) + ';';
|
||||||
|
|
@ -435,6 +454,10 @@
|
||||||
html = this._setCheckbox(html);
|
html = this._setCheckbox(html);
|
||||||
//文字飘红
|
//文字飘红
|
||||||
html = this._setRedText(html);
|
html = this._setRedText(html);
|
||||||
|
//还原代码块
|
||||||
|
html = html.replace(/<code:(\d+)>/g, function (m, s1) {
|
||||||
|
return marked(codeList[parseInt(s1) - 1]).replace(/<\/?p>/g, '');
|
||||||
|
});
|
||||||
//填充到页面
|
//填充到页面
|
||||||
this.$e.view.html(html);
|
this.$e.view.html(html);
|
||||||
//功能化代码块
|
//功能化代码块
|
||||||
|
|
|
||||||
111
files/amWiki.js
111
files/amWiki.js
|
|
@ -25,6 +25,8 @@ $(function () {
|
||||||
if (window.AWTesting) {
|
if (window.AWTesting) {
|
||||||
var testing = new AWTesting();
|
var testing = new AWTesting();
|
||||||
}
|
}
|
||||||
|
//短链接模式
|
||||||
|
var shortLink = new AWShortLink();
|
||||||
//是否支持history.state的API (IE9不支持)
|
//是否支持history.state的API (IE9不支持)
|
||||||
var HISTORY_STATE = 'pushState' in history;
|
var HISTORY_STATE = 'pushState' in history;
|
||||||
|
|
||||||
|
|
@ -133,13 +135,11 @@ $(function () {
|
||||||
$menuBar.find('h5').each(function () {
|
$menuBar.find('h5').each(function () {
|
||||||
filterNav('filter', valReg, $(this));
|
filterNav('filter', valReg, $(this));
|
||||||
});
|
});
|
||||||
storage.setStates('navFilterKey', value);
|
|
||||||
} else {
|
} else {
|
||||||
$filterClean.addClass('off');
|
$filterClean.addClass('off');
|
||||||
$menuBar.find('h5').each(function () {
|
$menuBar.find('h5').each(function () {
|
||||||
filterNav('open', null, $(this));
|
filterNav('open', null, $(this));
|
||||||
});
|
});
|
||||||
storage.setStates('navFilterKey');
|
|
||||||
}
|
}
|
||||||
$menuBar.trigger('scrollbar');
|
$menuBar.trigger('scrollbar');
|
||||||
});
|
});
|
||||||
|
|
@ -338,7 +338,7 @@ $(function () {
|
||||||
var setSiblingNav = function (num, $other) {
|
var setSiblingNav = function (num, $other) {
|
||||||
if ($other) {
|
if ($other) {
|
||||||
$mainSibling.find('a').eq(num)
|
$mainSibling.find('a').eq(num)
|
||||||
.attr('href', $other.attr('href'))
|
.attr('href', shortLink.getShort($other.attr('href')))
|
||||||
.text($other.text());
|
.text($other.text());
|
||||||
} else {
|
} else {
|
||||||
$mainSibling.find('a').eq(num)
|
$mainSibling.find('a').eq(num)
|
||||||
|
|
@ -355,7 +355,7 @@ $(function () {
|
||||||
|
|
||||||
//改变导航显示
|
//改变导航显示
|
||||||
var changeNav = function (path) {
|
var changeNav = function (path) {
|
||||||
if (/^home[-_].*?/.test(path) || path == '首页') {
|
if (path == 'home') {
|
||||||
$menuBar.find('h4').addClass('on');
|
$menuBar.find('h4').addClass('on');
|
||||||
$menuBar.find('a').removeClass('on');
|
$menuBar.find('a').removeClass('on');
|
||||||
changeSibling(null);
|
changeSibling(null);
|
||||||
|
|
@ -363,7 +363,7 @@ $(function () {
|
||||||
var hsLink = false;
|
var hsLink = false;
|
||||||
$menuBar.find('a').each(function () {
|
$menuBar.find('a').each(function () {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
var path2 = $this.attr('href').split('file=')[1];
|
var path2 = $this.attr('href').split('doc=')[1];
|
||||||
if (path2 == path) {
|
if (path2 == path) {
|
||||||
hsLink = true;
|
hsLink = true;
|
||||||
//本层加高亮
|
//本层加高亮
|
||||||
|
|
@ -386,11 +386,12 @@ $(function () {
|
||||||
|
|
||||||
//返回首页
|
//返回首页
|
||||||
var backHome = function () {
|
var backHome = function () {
|
||||||
docs.loadPage(homePage.path, function (state, content) {
|
var path2 = shortLink.getLink(homePage.path);
|
||||||
|
docs.loadPage(path2, function (state, content) {
|
||||||
if (state == 'success') {
|
if (state == 'success') {
|
||||||
changeNav(homePage.path);
|
changeNav(homePage.path);
|
||||||
docs.renderDoc(content);
|
docs.renderDoc(content);
|
||||||
storage.saveDoc(homePage.path, content);
|
storage.saveDoc(path2, content);
|
||||||
$main.trigger('scrollbar');
|
$main.trigger('scrollbar');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -401,19 +402,19 @@ $(function () {
|
||||||
|
|
||||||
//改变页面
|
//改变页面
|
||||||
var changePage = function (path, withOutPushState, callback) {
|
var changePage = function (path, withOutPushState, callback) {
|
||||||
|
var path2 = shortLink.getLink(path);
|
||||||
//第一步,从本地缓存读取并渲染页面
|
//第一步,从本地缓存读取并渲染页面
|
||||||
var localDoc = storage.read(path);
|
var localDoc = storage.read(path2);
|
||||||
docs.renderDoc(localDoc);
|
docs.renderDoc(localDoc);
|
||||||
testing && testing.crawlContent();
|
testing && testing.crawlContent();
|
||||||
$main.trigger('scrollbar');
|
$main.trigger('scrollbar');
|
||||||
$mainInner.scrollTop(0); //返回顶部
|
$mainInner.scrollTop(0); //返回顶部
|
||||||
//更新history记录
|
//更新history记录
|
||||||
if (!withOutPushState && HISTORY_STATE) {
|
if (!withOutPushState && HISTORY_STATE) {
|
||||||
var path2 = path.replace(/&/g, '%26'); //对带 & 符号的地址特殊处理
|
history.pushState({path: path}, '', '?doc=' + path);
|
||||||
history.pushState({path: path}, '', '?file=' + path2);
|
|
||||||
}
|
}
|
||||||
//第二步,加载服务器上的文档资源,如果有更新重新渲染
|
//第二步,加载服务器上的文档资源,如果有更新重新渲染
|
||||||
docs.loadPage(path, function (state, content) {
|
docs.loadPage(path2, function (state, content) {
|
||||||
//读取服务器文档失败时
|
//读取服务器文档失败时
|
||||||
if (state == 'error') {
|
if (state == 'error') {
|
||||||
//如果本地缓存为空
|
//如果本地缓存为空
|
||||||
|
|
@ -423,7 +424,7 @@ $(function () {
|
||||||
//如果本地缓存不为空
|
//如果本地缓存不为空
|
||||||
else {
|
else {
|
||||||
//记录文档打开数
|
//记录文档打开数
|
||||||
storage.increaseOpenedCount(path);
|
storage.increaseOpenedCount(path2);
|
||||||
callback && callback();
|
callback && callback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -432,7 +433,7 @@ $(function () {
|
||||||
//如果服务器文档有更新,更新本地缓存、重新渲染页面、重新判断接口测试
|
//如果服务器文档有更新,更新本地缓存、重新渲染页面、重新判断接口测试
|
||||||
if (content != localDoc) {
|
if (content != localDoc) {
|
||||||
docs.renderDoc(content);
|
docs.renderDoc(content);
|
||||||
storage.saveDoc(path, content);
|
storage.saveDoc(path2, content);
|
||||||
testing && testing.crawlContent();
|
testing && testing.crawlContent();
|
||||||
$main.trigger('scrollbar');
|
$main.trigger('scrollbar');
|
||||||
}
|
}
|
||||||
|
|
@ -440,7 +441,7 @@ $(function () {
|
||||||
else {
|
else {
|
||||||
}
|
}
|
||||||
//记录文档打开数
|
//记录文档打开数
|
||||||
storage.increaseOpenedCount(path);
|
storage.increaseOpenedCount(path2);
|
||||||
callback && callback();
|
callback && callback();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -455,12 +456,14 @@ $(function () {
|
||||||
var menuBarHome = $menuBar.find('h4');
|
var menuBarHome = $menuBar.find('h4');
|
||||||
homePage.text = menuBarHome.text();
|
homePage.text = menuBarHome.text();
|
||||||
homePage.url = menuBarHome.find('a').attr('href');
|
homePage.url = menuBarHome.find('a').attr('href');
|
||||||
homePage.path = homePage.url.split('file=')[1];
|
homePage.path = shortLink.add(homePage.url.split('file=')[1]);
|
||||||
menuBarHome.prepend('<svg><use xlink:href="#icon:navHome"></use></svg>');
|
menuBarHome.prepend('<svg><use xlink:href="#icon:navHome"></use></svg>');
|
||||||
//列表
|
//列表
|
||||||
$menuBar.find('h5').each(function () {
|
$menuBar.find('h5').each(function () {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
$this.html('<svg><use xlink:href="#icon:navArrow"></use></svg><span>' + $this.text() + '</span>')
|
$this
|
||||||
|
.attr('title', $this.text())
|
||||||
|
.html('<svg><use xlink:href="#icon:navArrow"></use></svg><span>' + $this.text() + '</span>');
|
||||||
});
|
});
|
||||||
$menuBar.trigger('scrollbar');
|
$menuBar.trigger('scrollbar');
|
||||||
var pathList = [];
|
var pathList = [];
|
||||||
|
|
@ -469,7 +472,9 @@ $(function () {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
$this.html('<span>' + $this.text() + '</span>');
|
$this.html('<span>' + $this.text() + '</span>');
|
||||||
if (HISTORY_STATE) {
|
if (HISTORY_STATE) {
|
||||||
var path = $this.attr('href').split('file=')[1];
|
var path = shortLink.add($this.attr('href').split('file=')[1]);
|
||||||
|
$this.attr('data-href', $this.attr('href'))
|
||||||
|
.attr('href', '?doc=' + path);
|
||||||
pathList.push(path);
|
pathList.push(path);
|
||||||
$this.on('click', function () {
|
$this.on('click', function () {
|
||||||
search.displayBox('off'); //关闭搜索面板
|
search.displayBox('off'); //关闭搜索面板
|
||||||
|
|
@ -486,7 +491,7 @@ $(function () {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
var href = $this.attr('href');
|
var href = $this.attr('href');
|
||||||
if (typeof href != 'undefined' && href != '') {
|
if (typeof href != 'undefined' && href != '') {
|
||||||
var path = href.split('file=')[1];
|
var path = shortLink.getShort(href.split('file=')[1]);
|
||||||
changeNav(path);
|
changeNav(path);
|
||||||
changePage(path);
|
changePage(path);
|
||||||
$this.trigger('navchange');
|
$this.trigger('navchange');
|
||||||
|
|
@ -496,7 +501,9 @@ $(function () {
|
||||||
});
|
});
|
||||||
$menuBar.find('strong').each(function () {
|
$menuBar.find('strong').each(function () {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
$this.html('<span>' + $this.text() + '</span>');
|
$this
|
||||||
|
.attr('title', $this.text())
|
||||||
|
.html('<span>' + $this.text() + '</span>');
|
||||||
});
|
});
|
||||||
//搜索结果不再跳转页面
|
//搜索结果不再跳转页面
|
||||||
$('#results').on('click', 'a', function () {
|
$('#results').on('click', 'a', function () {
|
||||||
|
|
@ -504,7 +511,7 @@ $(function () {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
var href = $this.attr('href');
|
var href = $this.attr('href');
|
||||||
if (typeof href != 'undefined' && href != '') {
|
if (typeof href != 'undefined' && href != '') {
|
||||||
var path = href.split('file=')[1];
|
var path = shortLink.getShort(href.split('file=')[1]);
|
||||||
search.displayBox('off'); //关闭搜索面板
|
search.displayBox('off'); //关闭搜索面板
|
||||||
changeNav(path);
|
changeNav(path);
|
||||||
changePage(path);
|
changePage(path);
|
||||||
|
|
@ -513,11 +520,6 @@ $(function () {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
//设置导航筛选初始值
|
|
||||||
var filterVal = storage.getStates('navFilterKey');
|
|
||||||
if (typeof filterVal != 'undefined' && filterVal != '') {
|
|
||||||
$filter.val(filterVal).trigger('input2');
|
|
||||||
}
|
|
||||||
//回调
|
//回调
|
||||||
callback && callback(pathList);
|
callback && callback(pathList);
|
||||||
};
|
};
|
||||||
|
|
@ -594,10 +596,8 @@ $(function () {
|
||||||
启动应用
|
启动应用
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//解析地址参数
|
//读取地址参数
|
||||||
var curPath = tools.getURLParameter('file');
|
var curPath = tools.getURLParameter('doc') || tools.getURLParameter('file');
|
||||||
curPath = !curPath ? '首页' : decodeURI(curPath);
|
|
||||||
curPath = curPath.replace(/%26/g, '&');
|
|
||||||
|
|
||||||
//加载导航
|
//加载导航
|
||||||
loadNav(function (list) {
|
loadNav(function (list) {
|
||||||
|
|
@ -605,9 +605,9 @@ $(function () {
|
||||||
storage.checkLibChange(list);
|
storage.checkLibChange(list);
|
||||||
//读取页面挂载数据文档部分
|
//读取页面挂载数据文档部分
|
||||||
loadPageMounts();
|
loadPageMounts();
|
||||||
//首次打开改变导航
|
//首次打开改变导航和页面
|
||||||
|
curPath = !curPath ? 'home' : shortLink.getShort(decodeURI(curPath).replace(/%26/g, '&'));
|
||||||
changeNav(curPath);
|
changeNav(curPath);
|
||||||
//首次打开改变页面
|
|
||||||
changePage(curPath, true, changeScrollByHash);
|
changePage(curPath, true, changeScrollByHash);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -618,7 +618,6 @@ $(function () {
|
||||||
//当有状态记录时,直接跳转
|
//当有状态记录时,直接跳转
|
||||||
if (e.originalEvent.state) {
|
if (e.originalEvent.state) {
|
||||||
path = e.originalEvent.state.path;
|
path = e.originalEvent.state.path;
|
||||||
path = path.replace(/%26/g, '&');
|
|
||||||
//改变导航
|
//改变导航
|
||||||
changeNav(path);
|
changeNav(path);
|
||||||
//改变页面
|
//改变页面
|
||||||
|
|
@ -627,8 +626,7 @@ $(function () {
|
||||||
//当没有状态记录时
|
//当没有状态记录时
|
||||||
else {
|
else {
|
||||||
path = tools.getURLParameter('file');
|
path = tools.getURLParameter('file');
|
||||||
path = !path ? '首页' : decodeURI(path);
|
path = !path ? 'home' : shortLink.getShort(decodeURI(curPath).replace(/%26/g, '&'));
|
||||||
path = path.replace(/%26/g, '&');
|
|
||||||
//判断 url 路径是否和当前一样,不一样才跳转
|
//判断 url 路径是否和当前一样,不一样才跳转
|
||||||
if (path != curPath) {
|
if (path != curPath) {
|
||||||
//改变导航
|
//改变导航
|
||||||
|
|
@ -676,4 +674,49 @@ $(function () {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/* 短链接模块 */
|
||||||
|
(function (win) {
|
||||||
|
|
||||||
|
var ShortLink = function () {
|
||||||
|
this._data = {
|
||||||
|
links: {}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ShortLink.prototype.add = function (link) {
|
||||||
|
if (link.indexOf('?file') >= 0) {
|
||||||
|
link = link.replace('?file=', '');
|
||||||
|
}
|
||||||
|
var short = this.getShort(link);
|
||||||
|
if (typeof this._data.links[short] == 'undefined') {
|
||||||
|
this._data.links[short] = link;
|
||||||
|
}
|
||||||
|
return short;
|
||||||
|
};
|
||||||
|
|
||||||
|
ShortLink.prototype.getShort = function (link) {
|
||||||
|
if (link.indexOf('?file') >= 0) {
|
||||||
|
link = link.replace('?file=', '');
|
||||||
|
}
|
||||||
|
var short = '';
|
||||||
|
if (/^home[-_].*?/.test(link) || link == '首页') {
|
||||||
|
short = 'home';
|
||||||
|
} else {
|
||||||
|
short = link.split('/').map(function (item) {
|
||||||
|
return item.split(/[-_]/)[0];
|
||||||
|
}).join('/');
|
||||||
|
}
|
||||||
|
return short;
|
||||||
|
};
|
||||||
|
|
||||||
|
ShortLink.prototype.getLink = function (short) {
|
||||||
|
if (short.indexOf('?doc') >= 0) {
|
||||||
|
short = short.replace('?doc=', '');
|
||||||
|
}
|
||||||
|
return this._data.links[short];
|
||||||
|
};
|
||||||
|
|
||||||
|
return win.AWShortLink = ShortLink;
|
||||||
|
|
||||||
|
})(window);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
# 如何编辑 amWiki 轻文库
|
|
||||||
|
|
||||||
文库创建后,您就可以编辑自己的文库了
|
|
||||||
|
|
||||||
## 基本编辑
|
|
||||||
|
|
||||||
1. ##### 新建文件或文件夹,组织您自己的文库
|
|
||||||

|
|
||||||
|
|
||||||
2. ##### 每个文件夹或文件要求使用 `id-名称.md` 来命名,其中:
|
|
||||||
|
|
||||||
1. id 仅允许 **整数** 或 **浮点数** 类型,且 **不可重复**
|
|
||||||
2. 必须使用连 **接符** 或 **下划线** 将 id 与后续具体名称相连
|
|
||||||
3. 文件只能使用 **.md** 扩展名
|
|
||||||
|
|
||||||
如果未能满足以上条件,将弹出以下错误提示:
|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||
正确的命名,例如:
|
|
||||||

|
|
||||||
|
|
||||||
3. ##### 使用 Markdown 语法编辑您的文档
|
|
||||||

|
|
||||||
|
|
||||||
## 扩展编辑
|
|
||||||
|
|
||||||
1. ##### library 文件夹下 `首页.md` 文档为默认打开时的显示内容
|
|
||||||
您可以适当修改此文档内容以符合您的项目需求
|
|
||||||
|
|
||||||
5. ##### `$navigation.md` 导航文件无需人工维护,创建新文件夹或文件时将自动更新,也可以在菜单栏手动刷新:
|
|
||||||
|
|
||||||
菜单栏 -> amWiki文库 -> 手动更新当前文库导航文件
|
|
||||||

|
|
||||||
|
|
||||||
6. ##### 如果需要在 Markdown 文档中插入图片,**请先截图**,然后在文档对应位置使用快捷键:`Ctrl + Shift + V`
|
|
||||||
此时,光标位置将多出一段 Markdown 图片代码,例如:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
同时,将在项目目录依次创建文件夹 assets、001 (如果不存在的话),以及此文件夹下名称为 04-b7efbbde.png 的图片文件
|
|
||||||
|
|
||||||
7. ##### 对于较长文章,可以使用页内目录,依次进行如下操作,或使用快捷键 `Ctrl + D`,即可在光标处插入页内目录。
|
|
||||||
菜单栏 -> amWiki文库 -> 提取h2、h3标题为页内目录
|
|
||||||

|
|
||||||
注意:请按顺序使用h1、h2、h3,且h1仅使用一次。
|
|
||||||
|
|
||||||
8. ##### 如果启用了测试模块,想对一篇文档激活接口测试功能,请参照 [使用测试模块测试接口](?file=001-学习amWiki/06-使用测试模块测试接口)
|
|
||||||
|
|
||||||
|
|
||||||
## 维护与延伸
|
|
||||||
|
|
||||||
1. 本插件升级后,您想更新 `(projectName)/amWiki/` 文件夹下 web 端的工作文件,您只需重新打开 `config.json` 文件,然后在 Atom 菜单上选择 `通过“config.json”创建新文库` 即可。
|
|
||||||
这个二次创建操作不会影响您 library 与 assetes 文件夹下的内容。
|
|
||||||
|
|
||||||
2. 借助版本管理 SVN、Git、Hg,传输协议FTP/SFTP,文件同步Dropbox、百度云等等工具,便捷实现网络访问。
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
# amWiki 轻文库简介
|
|
||||||
|
|
||||||

|
|
||||||
amWiki 是一款基于 Javascript 脚本语言、依赖 Atom 编辑器、使用 Markdown 标记语法的轻量级开源 wiki 文库系统。
|
|
||||||
amWiki 致力于让大家可以更简单、更便捷的建设个人和团队文库系统!
|
|
||||||
|
|
||||||
[[view amWiki on Github](https://github.com/TevinLi/amWiki)]
|
|
||||||
|
|
||||||
GitHub:
|
|
||||||
[](https://github.com/TevinLi/amWiki "GitHub Stars")
|
|
||||||
[](https://github.com/TevinLi/amWiki "GitHub Forks")
|
|
||||||
[](https://github.com/TevinLi/amWiki "GitHub Open Issues")
|
|
||||||
[](https://github.com/TevinLi/amWiki "GitHub Closed Issues")
|
|
||||||
[](https://github.com/TevinLi/amWiki "GitHub Contributors")
|
|
||||||
Apm:
|
|
||||||
[](https://atom.io/packages/amWiki "Apm Version")
|
|
||||||
[](https://atom.io/packages/amWiki "Apm Downloads")
|
|
||||||
[](https://atom.io/packages/amWiki "MIT License")
|
|
||||||
|
|
||||||
## amWiki 优势
|
|
||||||
- 文档系统采用 Markdown 语法 [>>Markdown 快速开始](?file=001-学习amWiki/05-学习markdown/01-Markdown快速开始)
|
|
||||||
- 无需服务端开发,只需支持 http 访问的静态网页空间
|
|
||||||
- 不使用数据库,使用 `.md` 扩展名存储文档为本地文件
|
|
||||||
- 一键创建新文库,自动生成一套 Html 页面
|
|
||||||
- 自动更新文库导航目录
|
|
||||||
- 支持截图直接粘帖为本地 png 并插入当前 Markdown 文档
|
|
||||||
- Web 端页面自适应显示,适合各种 Web 平台与屏幕尺寸
|
|
||||||
- 支持接口文档自动抓取内容生成简单的 Ajax 测试
|
|
||||||
- ... (更多内容期待您的发现)
|
|
||||||
|
|
||||||
## 效果演示
|
|
||||||
**Web端**
|
|
||||||
一键创建新文库默认生成Web端效果一览:[https://tevinli.github.io/amWiki/](https://tevinli.github.io/amWiki/index.html)
|
|
||||||
|
|
||||||
**工作端**
|
|
||||||
工作端需要您安装 Atom 与 amWiki 才能体验
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
# amWiki 功能导图
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**说明**:灰色文字代表的功能部分,表示目前版本没有,但是已经列入开发计划
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
# 如何开始一个新 amWiki 轻文库
|
|
||||||
|
|
||||||
## 开始一个新文库的步骤
|
|
||||||
|
|
||||||
1. ##### 下载 Github 出品的开源文本编辑器 [Atom](https://atom.io/ "打开Atom官网"),并安装
|
|
||||||

|
|
||||||
|
|
||||||
2. ##### 安装 Atom 完成之后,再安装插件 amWiki,您可以通过以下三种途径安装:
|
|
||||||
- 【方式一】:通过 Atom 菜单,File -> Setting -> Install -> 搜索 `amWiki`
|
|
||||||

|
|
||||||
<br>
|
|
||||||
- 【方式二】:运行:`apm install amWiki`
|
|
||||||

|
|
||||||
<br>
|
|
||||||
- 【方式三】:从Github的 [amWiki版本发布](https://github.com/TevinLi/amWiki/releases) 下载zip,(windows)解压到 `C:\Users\Administrator\.atom\packages`,并将文件夹名 `amWiki-x.x.x` 改为 `amWiki`
|
|
||||||
|
|
||||||
3. ##### 重启 Atom (必须)
|
|
||||||
|
|
||||||
4. ##### 在本地您需要创建文库的位置创建一个文件夹 (非 Atom 编辑器中)
|
|
||||||
|
|
||||||
5. ##### 在 Atom 中 `Add Project Folder` (添加项目文件夹),并指向刚创建的文件夹
|
|
||||||

|
|
||||||
|
|
||||||
6. ##### 在 Atom 刚创建的项目下新建 `config.json` 文件,并按 json 格式配置以下属性:
|
|
||||||
- **name**,您的文库名称,设置但为空或不设置将显示默认名
|
|
||||||
- **ver**,文本版本号或维护者名号,设置但为空将不显示,注意诺不设置此属性将显示 amWiki 作者
|
|
||||||
- **logo**,logo 的 url,设置但为空或不设置将显示默认 logo
|
|
||||||
- **colour**,自定义颜色,默认为蓝色
|
|
||||||
- **testing**,是否启用接口测试模块,默认值 false
|
|
||||||
- 例如:
|
|
||||||
```javascript
|
|
||||||
{
|
|
||||||
"name": "A3项目文档中心",
|
|
||||||
"ver": "",
|
|
||||||
"logo": "http://abc.com/logo.jpg",
|
|
||||||
"testing": true
|
|
||||||
}
|
|
||||||
```
|
|
||||||
7. ##### 保持 `config.json` 处于当前打开状态,在 Atom 菜单点击:
|
|
||||||
|
|
||||||
amWiki文库 -> 通过“config.json”创建新文库
|
|
||||||

|
|
||||||
|
|
||||||
8. ##### 此时项目中自动创建了许多内容,其中 library 文件夹即为您的文库文件夹
|
|
||||||

|
|
||||||
|
|
||||||
9. ##### 使用 `F12` 启动本地静态服务器,访问刚刚自动创建的 index.html
|
|
||||||
|
|
||||||
|
|
||||||
## 文库目录结构
|
|
||||||
项目目录自动生创建的内容如下
|
|
||||||
|
|
||||||
index.html // http 访问入口页面
|
|
||||||
amWiki/ // amWiki Web 端程序文件夹
|
|
||||||
library/ // 您的 Markdown 文库目录,所有文件必须使用 .md 格式
|
|
||||||
├ $navigation.md // amWiki 文库目录导航文件,可自动/手动更新
|
|
||||||
├ 首页.md // Web 端打开页面时页面页面默认显示的内容
|
|
||||||
├ 001-学习amWiki/ // Markdown 文件夹01
|
|
||||||
│ ├ 001-关于amWiki // 一些 Markdown 文档,支持二级目录
|
|
||||||
│ └ 002-...
|
|
||||||
├ 002-文档示范/ // Markdown 文件夹02
|
|
||||||
│ ├ 001-通用api // 一些 Markdown 文档,支持二级目录
|
|
||||||
│ └ 002-...
|
|
||||||
└ 003-... // 更多 Markdown 文件夹
|
|
||||||
(assetes/) // 如果您粘帖截图,图片文件将自动创建在此处
|
|
||||||
|
|
||||||
|
|
||||||
## 如何使用
|
|
||||||
一键创建新文库后,您可以通过以下方式开始 amWiki 文库之旅:
|
|
||||||
|
|
||||||
1. 在 Atom 编辑器中使用快捷键 `F12` 或在浏览器中使用 http 访问刚刚创建的 index.html。
|
|
||||||
2. PC 端使用左侧导航栏、移动端使用右上角弹出菜单来切换页面。
|
|
||||||
3. 在导航栏顶部,可以使用筛选功能通过输入关键词对整个导航目录进行筛选。
|
|
||||||
4. 如果存在页内目录,直接点击,页内目录使用 hash 滚动;同时您可以直接带 hash 分享,以方便他人快速浏览指定内容。
|
|
||||||
|
|
@ -1,73 +0,0 @@
|
||||||
# amWiki 转接到任意域名进行接口测试
|
|
||||||
|
|
||||||
我们分两种情况进行文档转接,一种是我们有域名服务器操作权限,一种是没有
|
|
||||||
|
|
||||||
## 有域名服务器操作权限的转接
|
|
||||||
如果我们有域名服务器操作权限,那要把其他域名下的文档转接到当前域名下,其实很简单,就是一个 **反向代理** 的过程
|
|
||||||
|
|
||||||
以 nginx 为例,将地址 https://amwiki.xf09.net/docs/ 下所有文档转接到任意域名(_无需https_) /wiki 路径下
|
|
||||||
```nginx
|
|
||||||
server {
|
|
||||||
listen 81;
|
|
||||||
server_name abc123.com;
|
|
||||||
location /wiki {
|
|
||||||
proxy_pass https://amwiki.xf09.net/docs/;
|
|
||||||
proxy_redirect off;
|
|
||||||
#proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
|
|
||||||
proxy_max_temp_file_size 0k;
|
|
||||||
proxy_connect_timeout 90;
|
|
||||||
proxy_send_timeout 90;
|
|
||||||
proxy_read_timeout 90;
|
|
||||||
proxy_buffer_size 4k;
|
|
||||||
proxy_buffers 4 32k;
|
|
||||||
proxy_busy_buffers_size 64k;
|
|
||||||
proxy_temp_file_write_size 64k;
|
|
||||||
}
|
|
||||||
# other settings ...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 无域名服务器操作权限
|
|
||||||
此时,如果想要将我们的文档转接到对应域名上去,需要利用抓包工具 Fiddler 进行 **请求代理**
|
|
||||||
(_请下载安装抓包工具 [Fiddler](http://www.telerik.com/fiddler),并了解 AutoResponder 面板的使用_)
|
|
||||||
|
|
||||||
由于 https 特殊性,我们分两种情况来讨论:
|
|
||||||
|
|
||||||
### http 请求代理
|
|
||||||
当原域名基于 http 通信时,由于 http 请求是一种很开放的通信,我们可以直接用 fiddler 非常简单的进行转接
|
|
||||||
|
|
||||||
比如,我们继续把地址 https://amwiki.xf09.net/docs/ 下所有文档转接到任意域名 /wiki 路径下
|
|
||||||
只需要如下配置 AutoResponder:
|
|
||||||
|
|
||||||

|
|
||||||
规则代码如下:
|
|
||||||
|
|
||||||
regex:.+abc123\.com\/wiki\/(.+)$
|
|
||||||
https://amwiki.xf09.net/docs/$1
|
|
||||||
|
|
||||||
第一行代码为请求匹配,其中 `regex:` 表示按正则表达式进行匹配,`.+abc123\.com\/wiki\/` 表示需要代理的路径,`(.+)$` (和第二行配合)表示转接后续的路径,即将后续路径替换到第二行代码中的 `$1`
|
|
||||||
|
|
||||||
| | 转接地址 | 实际请求地址 |
|
|
||||||
| : ---| :--- | :--- |
|
|
||||||
| 例1 | http://abc123.com/wiki/index.html | https://amwiki.xf09.net/docs/index.html |
|
|
||||||
| 例2 | http://abc123.com/wiki/amWiki/js/amWiki.js | https://amwiki.xf09.net/docs/amWiki/js/amWiki.js |
|
|
||||||
|
|
||||||
### https 请求代理
|
|
||||||
当原域名基于 https 通讯是,我们需要更多的操作才能使用代理 (Fiddler 抓包 https 的原理,有兴趣可自行知乎一下)
|
|
||||||
|
|
||||||
- **第一步,开启 https 解码**
|
|
||||||
Tools -> Fiddler Options -> HTTPS -> 依次勾选如下
|
|
||||||

|
|
||||||
- **第二步,是安装 Fiddler 根证书**
|
|
||||||
打开 http://localhost:8888/ 下载Fiddler 根证书并安装
|
|
||||||

|
|
||||||
- **第三步,按照 http 的方式进行代理**
|
|
||||||
例如,我们转接到百度域名的一个路径下
|
|
||||||
|
|
||||||
regex:.+www\.baidu\.com\/wiki\/(.+)$
|
|
||||||
https://amwiki.xf09.net/docs/$1
|
|
||||||
|
|
||||||
此时,我们打开 https://www.baidu.com/wiki/index.html 会发现,不再是“很抱歉,您要访问的页面不存在!”了
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
||||||
# 使用测试模块测试接口
|
|
||||||
|
|
||||||
让文档与测试一步搞定!
|
|
||||||
|
|
||||||
## 激活测试的条件
|
|
||||||
##### 当一篇文档中使用了 `“请求地址”`、`“请求类型”`、`“请求参数”` 三个字段作为 `h3标题` 并配套对应内容时,将激活接口测试功能
|
|
||||||

|
|
||||||
(详细书写格式请参照[通用API接口文档示例](?file=002-文档示范/001-通用API接口文档示例))
|
|
||||||
|
|
||||||
##### 此时文档右上角将出现 `“接口测试”` 按钮,例如:
|
|
||||||

|
|
||||||
|
|
||||||
## 接口测试的工作原理与步骤
|
|
||||||
1. 当测试模块处于打开状态时,每次打开文档都会扫描文档转换 html 后的内容,满足三个 h3 时即开启测试功能
|
|
||||||
2. 开启当前文档测试功能后,即会从页面上 **抓取** 符合一定格式的测试内容
|
|
||||||
3. 格式化抓取的内容并生成可再次修改的表单
|
|
||||||
4. 用户点击发送请求时,先并入全局参数到当前参数列表,再发送请求
|
|
||||||
5. 收到请求结果,格式化显示
|
|
||||||
|
|
||||||
## 接口测试文档的格式要求
|
|
||||||
|
|
||||||
### 请求地址的格式
|
|
||||||
请求地址可以使用带 http 与不带 http 两种,下面两种写法都是合适的
|
|
||||||
|
|
||||||
/api/customer-flow
|
|
||||||
http://localhost/api/customer-flow
|
|
||||||
|
|
||||||
注意,不带 http 将自动和当前域名拼合为完整绝对路径,而不是使用相对路径
|
|
||||||
|
|
||||||
### 请求类型的格式
|
|
||||||
amWiki 暂时只支持 **Get**、**Post**、**Put**、**Delete** 四种普通 ajax 请求,不支持文件上传和其他高级方式通讯
|
|
||||||
|
|
||||||
### 请求参数的格式
|
|
||||||
- 当接口不需要参数时,直接使用 **“无”** 即可
|
|
||||||

|
|
||||||
- 请求参数列表必须使用 **表格**,且必须按 `参数名`、`类型`、`必填`、`描述`、`默认值`、`参考值` 的栏目顺序建立表格,否则不能正常抓取。
|
|
||||||

|
|
||||||
其中:
|
|
||||||
- 默认值与参考值同属参数的值,但是优先显示默认值,只有当没有默认值时参考值才有效,参考值是为了方便测试之用
|
|
||||||
- 参考值一栏可选,不写参考值的整个表格栏位,不会影响测试功能
|
|
||||||
|
|
||||||
## 测试功能应用
|
|
||||||
|
|
||||||
### 测试面板
|
|
||||||
抓取测试内容生成测试表单如下
|
|
||||||

|
|
||||||
|
|
||||||
### 全局参数面板
|
|
||||||
全局参数影响所有接口,在全局参数面板可以进行新增、删除全局参数以及临时启用/禁用全局参数等操作
|
|
||||||

|
|
||||||
|
|
||||||
### 返回响应
|
|
||||||
成功的响应:
|
|
||||||

|
|
||||||
失败的响应:
|
|
||||||

|
|
||||||
|
|
||||||
## 测试模块的问题
|
|
||||||
- 测试模只能请求同域接口,不能跨域。 (跨域解决方案请参考[amWiki转接到任意域名进行接口测试](?file=001-学习amWiki/30-amWiki转接到任意域名进行接口测试))
|
|
||||||
- 如果接口需要登录权限,请先登录您自己的系统。
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
# 客户日志流水接口示例
|
|
||||||
>维护人员:**Tevin**
|
|
||||||
>创建时间:2016-04-06
|
|
||||||
|
|
||||||
## 接口简介
|
|
||||||
实时查询客户各种操作(例如登录,拓客等)的流水日志
|
|
||||||
|
|
||||||
## 接口详情
|
|
||||||
|
|
||||||
### 请求地址
|
|
||||||
/api/customer-flow
|
|
||||||
|
|
||||||
### 请求类型
|
|
||||||
GET
|
|
||||||
|
|
||||||
### 请求参数
|
|
||||||
| 参数名 | 类型 | 必填 | 描述 | 默认值 | 参考值 |
|
|
||||||
| --- | :---: | :---: | --- | --- | --- |
|
|
||||||
| customer_id | number | 是 | 客户id | - | 132 |
|
|
||||||
| type | number | 否 | 客户类型,0所有、1扩展、2报备、3成交 | - | 1 |
|
|
||||||
|
|
||||||
### 返回正确JSON示例
|
|
||||||
```javascript
|
|
||||||
{
|
|
||||||
"state": {
|
|
||||||
"code": 10200,
|
|
||||||
"msg": "ok"
|
|
||||||
},
|
|
||||||
"data": {
|
|
||||||
"id": 307, //流水id
|
|
||||||
"real_name": "Tevin", //用户名称
|
|
||||||
"mobile": "暂无", //用户手机
|
|
||||||
"origin": "暂无", //用户来源
|
|
||||||
"created_at": "2016-04-04 20:00:00", //加入时间
|
|
||||||
"last_login": "2016-05-22 15:30:21", //最后登录时间
|
|
||||||
"log": [] //日志列表
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
### 返回错误JSON示例
|
|
||||||
```javascript
|
|
||||||
{
|
|
||||||
"state": {
|
|
||||||
"code": 10500
|
|
||||||
"msg": "服务器未知报错"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 备注说明
|
|
||||||
无
|
|
||||||
|
|
||||||
### 修改日志
|
|
||||||
- 【2016-05-22】
|
|
||||||
新增了last_login最后登录时间字段
|
|
||||||
|
|
@ -1,651 +0,0 @@
|
||||||
# 微信JS-SDK说明文档(超长文档页内目录示例)
|
|
||||||
|
|
||||||
>1. [概述](#概述 "概述")
|
|
||||||
1. [JSSDK使用步骤](#JSSDK使用步骤 "JSSDK使用步骤")
|
|
||||||
1. [接口调用说明](#接口调用说明 "接口调用说明")
|
|
||||||
1. [基础接口](#基础接口 "基础接口")
|
|
||||||
1. [判断当前客户端版本是否支持指定JS接口](#判断当前客户端版本是否支持指定JS接口 "判断当前客户端版本是否支持指定JS接口")
|
|
||||||
1. [分享接口](#分享接口 "分享接口")
|
|
||||||
1. [获取“分享到朋友圈”按钮点击状态及自定义分享内容接口](#获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 "获取“分享到朋友圈”按钮点击状态及自定义分享内容接口")
|
|
||||||
1. [获取“分享给朋友”按钮点击状态及自定义分享内容接口](#获取“分享给朋友”按钮点击状态及自定义分享内容接口 "获取“分享给朋友”按钮点击状态及自定义分享内容接口")
|
|
||||||
1. [获取“分享到QQ”按钮点击状态及自定义分享内容接口](#获取“分享到QQ”按钮点击状态及自定义分享内容接口 "获取“分享到QQ”按钮点击状态及自定义分享内容接口")
|
|
||||||
1. [获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口](#获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 "获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口")
|
|
||||||
1. [获取“分享到QQ空间”按钮点击状态及自定义分享内容接口](#获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 "获取“分享到QQ空间”按钮点击状态及自定义分享内容接口")
|
|
||||||
1. [图像接口](#图像接口 "图像接口")
|
|
||||||
1. [拍照或从手机相册中选图接口](#拍照或从手机相册中选图接口 "拍照或从手机相册中选图接口")
|
|
||||||
1. [预览图片接口](#预览图片接口 "预览图片接口")
|
|
||||||
1. [上传图片接口](#上传图片接口 "上传图片接口")
|
|
||||||
1. [下载图片接口](#下载图片接口 "下载图片接口")
|
|
||||||
1. [音频接口](#音频接口 "音频接口")
|
|
||||||
1. [开始录音接口](#开始录音接口 "开始录音接口")
|
|
||||||
1. [停止录音接口](#停止录音接口 "停止录音接口")
|
|
||||||
1. [监听录音自动停止接口](#监听录音自动停止接口 "监听录音自动停止接口")
|
|
||||||
1. [播放语音接口](#播放语音接口 "播放语音接口")
|
|
||||||
1. [暂停播放接口](#暂停播放接口 "暂停播放接口")
|
|
||||||
1. [停止播放接口](#停止播放接口 "停止播放接口")
|
|
||||||
1. [监听语音播放完毕接口](#监听语音播放完毕接口 "监听语音播放完毕接口")
|
|
||||||
1. [上传语音接口](#上传语音接口 "上传语音接口")
|
|
||||||
1. [下载语音接口](#下载语音接口 "下载语音接口")
|
|
||||||
1. [智能接口](#智能接口 "智能接口")
|
|
||||||
1. [识别音频并返回识别结果接口](#识别音频并返回识别结果接口 "识别音频并返回识别结果接口")
|
|
||||||
1. [设备信息](#设备信息 "设备信息")
|
|
||||||
1. [获取网络状态接口](#获取网络状态接口 "获取网络状态接口")
|
|
||||||
1. [地理位置](#地理位置 "地理位置")
|
|
||||||
1. [使用微信内置地图查看位置接口](#使用微信内置地图查看位置接口 "使用微信内置地图查看位置接口")
|
|
||||||
1. [获取地理位置接口](#获取地理位置接口 "获取地理位置接口")
|
|
||||||
1. [摇一摇周边](#摇一摇周边 "摇一摇周边")
|
|
||||||
1. [开启查找周边ibeacon设备接口](#开启查找周边ibeacon设备接口 "开启查找周边ibeacon设备接口")
|
|
||||||
1. [关闭查找周边ibeacon设备接口](#关闭查找周边ibeacon设备接口 "关闭查找周边ibeacon设备接口")
|
|
||||||
1. [监听周边ibeacon设备接口](#监听周边ibeacon设备接口 "监听周边ibeacon设备接口")
|
|
||||||
1. [界面操作](#界面操作 "界面操作")
|
|
||||||
1. [隐藏右上角菜单接口](#隐藏右上角菜单接口 "隐藏右上角菜单接口")
|
|
||||||
1. [显示右上角菜单接口](#显示右上角菜单接口 "显示右上角菜单接口")
|
|
||||||
1. [关闭当前网页窗口接口](#关闭当前网页窗口接口 "关闭当前网页窗口接口")
|
|
||||||
1. [批量隐藏功能按钮接口](#批量隐藏功能按钮接口 "批量隐藏功能按钮接口")
|
|
||||||
1. [批量显示功能按钮接口](#批量显示功能按钮接口 "批量显示功能按钮接口")
|
|
||||||
1. [隐藏所有非基础按钮接口](#隐藏所有非基础按钮接口 "隐藏所有非基础按钮接口")
|
|
||||||
1. [显示所有功能按钮接口](#显示所有功能按钮接口 "显示所有功能按钮接口")
|
|
||||||
1. [微信扫一扫](#微信扫一扫 "微信扫一扫")
|
|
||||||
1. [调起微信扫一扫接口](#调起微信扫一扫接口 "调起微信扫一扫接口")
|
|
||||||
1. [微信小店](#微信小店 "微信小店")
|
|
||||||
1. [跳转微信商品页接口](#跳转微信商品页接口 "跳转微信商品页接口")
|
|
||||||
1. [微信卡券](#微信卡券 "微信卡券")
|
|
||||||
1. [获取api_ticket](#获取api_ticket "获取api_ticket")
|
|
||||||
1. [拉取适用卡券列表并获取用户选择信息](#拉取适用卡券列表并获取用户选择信息 "拉取适用卡券列表并获取用户选择信息")
|
|
||||||
1. [批量添加卡券接口](#批量添加卡券接口 "批量添加卡券接口")
|
|
||||||
1. [查看微信卡包中的卡券接口](#查看微信卡包中的卡券接口 "查看微信卡包中的卡券接口")
|
|
||||||
1. [核销后再次赠送卡券接口](#核销后再次赠送卡券接口 "核销后再次赠送卡券接口")
|
|
||||||
1. [微信支付](#微信支付 "微信支付")
|
|
||||||
1. [发起一个微信支付请求](#发起一个微信支付请求 "发起一个微信支付请求")
|
|
||||||
|
|
||||||
|
|
||||||
## 概述
|
|
||||||
|
|
||||||
微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。
|
|
||||||
|
|
||||||
通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。
|
|
||||||
|
|
||||||
此文档面向网页开发者介绍微信JS-SDK如何使用及相关注意事项。
|
|
||||||
|
|
||||||
### JSSDK使用步骤
|
|
||||||
|
|
||||||
#### 步骤一:绑定域名
|
|
||||||
|
|
||||||
先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。**如果你使用了支付类接口,请确保支付目录在该安全域名下,否则将无法完成支付。**
|
|
||||||
|
|
||||||
备注:登录后可在“开发者中心”查看对应的接口权限。
|
|
||||||
|
|
||||||
#### 步骤二:引入JS文件
|
|
||||||
|
|
||||||
在需要调用JS接口的页面引入如下JS文件,(支持https):
|
|
||||||
[http://res.wx.qq.com/open/js/jweixin-1.0.0.js](http://res.wx.qq.com/open/js/jweixin-1.0.0.js)
|
|
||||||
|
|
||||||
**请注意,如果你的页面启用了https,务必引入** [https://res.wx.qq.com/open/js/jweixin-1.0.0.js](https://res.wx.qq.com/open/js/jweixin-1.0.0.js) ,**否则将无法在iOS9.0以上系统中成功使用JSSDK**
|
|
||||||
|
|
||||||
如需使用摇一摇周边功能,请引入 jweixin-1.1.0.js
|
|
||||||
|
|
||||||
备注:支持使用 AMD/CMD 标准模块加载方法加载
|
|
||||||
|
|
||||||
#### 步骤三:通过config接口注入权限验证配置
|
|
||||||
|
|
||||||
**所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用**(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
wx.config({
|
|
||||||
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
|
|
||||||
appId: '', // 必填,公众号的唯一标识
|
|
||||||
timestamp: , // 必填,生成签名的时间戳
|
|
||||||
nonceStr: '', // 必填,生成签名的随机串
|
|
||||||
signature: '',// 必填,签名,见附录1
|
|
||||||
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 步骤四:通过ready接口处理成功验证
|
|
||||||
```javascript
|
|
||||||
wx.ready(function(){
|
|
||||||
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 步骤五:通过error接口处理失败验证
|
|
||||||
```javascript
|
|
||||||
wx.error(function(res){
|
|
||||||
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
|
|
||||||
});
|
|
||||||
```
|
|
||||||
### 接口调用说明
|
|
||||||
|
|
||||||
所有接口通过wx对象(也可使用jWeixin对象)来调用,参数是一个对象,除了每个接口本身需要传的参数之外,还有以下通用参数:
|
|
||||||
|
|
||||||
1. success:接口调用成功时执行的回调函数。
|
|
||||||
1. fail:接口调用失败时执行的回调函数。
|
|
||||||
1. complete:接口调用完成时执行的回调函数,无论成功或失败都会执行。
|
|
||||||
1. cancel:用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。
|
|
||||||
1. trigger: 监听Menu中的按钮点击时触发的方法,该方法仅支持Menu中的相关接口。
|
|
||||||
|
|
||||||
备注:**不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回。**
|
|
||||||
|
|
||||||
以上几个函数都带有一个参数,类型为对象,其中除了每个接口本身返回的数据之外,还有一个通用属性errMsg,其值格式如下:
|
|
||||||
|
|
||||||
1. 调用成功时:"xxx:ok" ,其中xxx为调用的接口名
|
|
||||||
1. 用户取消时:"xxx:cancel",其中xxx为调用的接口名
|
|
||||||
1. 调用失败时:其值为具体错误信息
|
|
||||||
|
|
||||||
## 基础接口
|
|
||||||
|
|
||||||
### 判断当前客户端版本是否支持指定JS接口
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
wx.checkJsApi({
|
|
||||||
jsApiList: ['chooseImage'], // 需要检测的JS接口列表,所有JS接口列表见附录2,
|
|
||||||
success: function(res) {
|
|
||||||
// 以键值对的形式返回,可用的api值true,不可用为false
|
|
||||||
// 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
备注:checkJsApi接口是客户端6.0.2新引入的一个预留接口,第一期开放的接口均可不使用checkJsApi来检测。
|
|
||||||
|
|
||||||
### 分享接口
|
|
||||||
|
|
||||||
请注意不要有诱导分享等违规行为,对于诱导分享行为将永久回收公众号接口权限,详细规则请查看:朋友圈管理常见问题。
|
|
||||||
|
|
||||||
### 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
wx.onMenuShareTimeline({
|
|
||||||
title: '', // 分享标题
|
|
||||||
link: '', // 分享链接
|
|
||||||
imgUrl: '', // 分享图标
|
|
||||||
success: function () {
|
|
||||||
// 用户确认分享后执行的回调函数
|
|
||||||
},
|
|
||||||
cancel: function () {
|
|
||||||
// 用户取消分享后执行的回调函数
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 获取“分享给朋友”按钮点击状态及自定义分享内容接口
|
|
||||||
```javascript
|
|
||||||
wx.onMenuShareAppMessage({
|
|
||||||
title: '', // 分享标题
|
|
||||||
desc: '', // 分享描述
|
|
||||||
link: '', // 分享链接
|
|
||||||
imgUrl: '', // 分享图标
|
|
||||||
type: '', // 分享类型,music、video或link,不填默认为link
|
|
||||||
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
|
|
||||||
success: function () {
|
|
||||||
// 用户确认分享后执行的回调函数
|
|
||||||
},
|
|
||||||
cancel: function () {
|
|
||||||
// 用户取消分享后执行的回调函数
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 获取“分享到QQ”按钮点击状态及自定义分享内容接口
|
|
||||||
```javascript
|
|
||||||
wx.onMenuShareQQ({
|
|
||||||
title: '', // 分享标题
|
|
||||||
desc: '', // 分享描述
|
|
||||||
link: '', // 分享链接
|
|
||||||
imgUrl: '', // 分享图标
|
|
||||||
success: function () {
|
|
||||||
// 用户确认分享后执行的回调函数
|
|
||||||
},
|
|
||||||
cancel: function () {
|
|
||||||
// 用户取消分享后执行的回调函数
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口
|
|
||||||
```javascript
|
|
||||||
wx.onMenuShareWeibo({
|
|
||||||
title: '', // 分享标题
|
|
||||||
desc: '', // 分享描述
|
|
||||||
link: '', // 分享链接
|
|
||||||
imgUrl: '', // 分享图标
|
|
||||||
success: function () {
|
|
||||||
// 用户确认分享后执行的回调函数
|
|
||||||
},
|
|
||||||
cancel: function () {
|
|
||||||
// 用户取消分享后执行的回调函数
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 获取“分享到QQ空间”按钮点击状态及自定义分享内容接口
|
|
||||||
```javascript
|
|
||||||
wx.onMenuShareQZone({
|
|
||||||
title: '', // 分享标题
|
|
||||||
desc: '', // 分享描述
|
|
||||||
link: '', // 分享链接
|
|
||||||
imgUrl: '', // 分享图标
|
|
||||||
success: function () {
|
|
||||||
// 用户确认分享后执行的回调函数
|
|
||||||
},
|
|
||||||
cancel: function () {
|
|
||||||
// 用户取消分享后执行的回调函数
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## 图像接口
|
|
||||||
|
|
||||||
### 拍照或从手机相册中选图接口
|
|
||||||
```javascript
|
|
||||||
wx.chooseImage({
|
|
||||||
count: 1, // 默认9
|
|
||||||
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
|
|
||||||
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
|
|
||||||
success: function (res) {
|
|
||||||
var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 预览图片接口
|
|
||||||
```javascript
|
|
||||||
wx.previewImage({
|
|
||||||
current: '', // 当前显示图片的http链接
|
|
||||||
urls: [] // 需要预览的图片http链接列表
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 上传图片接口
|
|
||||||
```javascript
|
|
||||||
wx.uploadImage({
|
|
||||||
localId: '', // 需要上传的图片的本地ID,由chooseImage接口获得
|
|
||||||
isShowProgressTips: 1, // 默认为1,显示进度提示
|
|
||||||
success: function (res) {
|
|
||||||
var serverId = res.serverId; // 返回图片的服务器端ID
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
备注:上传图片有效期3天,可用微信多媒体接口下载图片到自己的服务器,此处获得的 serverId 即 media_id,参考文档 ../12/58bfcfabbd501c7cd77c19bd9cfa8354.html 目前多媒体文件下载接口的频率限制为10000次/天,如需要调高频率,请邮件weixin-open@qq.com,邮件主题为【申请多媒体接口调用量】,请对你的项目进行简单描述,附上产品体验链接,并对用户量和使用量进行说明。
|
|
||||||
|
|
||||||
### 下载图片接口
|
|
||||||
```javascript
|
|
||||||
wx.downloadImage({
|
|
||||||
serverId: '', // 需要下载的图片的服务器端ID,由uploadImage接口获得
|
|
||||||
isShowProgressTips: 1, // 默认为1,显示进度提示
|
|
||||||
success: function (res) {
|
|
||||||
var localId = res.localId; // 返回图片下载后的本地ID
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## 音频接口
|
|
||||||
|
|
||||||
### 开始录音接口
|
|
||||||
```javascript
|
|
||||||
wx.startRecord();
|
|
||||||
```
|
|
||||||
|
|
||||||
### 停止录音接口
|
|
||||||
```javascript
|
|
||||||
wx.stopRecord({
|
|
||||||
success: function (res) {
|
|
||||||
var localId = res.localId;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 监听录音自动停止接口
|
|
||||||
```javascript
|
|
||||||
wx.onVoiceRecordEnd({
|
|
||||||
// 录音时间超过一分钟没有停止的时候会执行 complete 回调
|
|
||||||
complete: function (res) {
|
|
||||||
var localId = res.localId;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 播放语音接口
|
|
||||||
```javascript
|
|
||||||
wx.playVoice({
|
|
||||||
localId: '' // 需要播放的音频的本地ID,由stopRecord接口获得
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 暂停播放接口
|
|
||||||
```javascript
|
|
||||||
wx.pauseVoice({
|
|
||||||
localId: '' // 需要暂停的音频的本地ID,由stopRecord接口获得
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 停止播放接口
|
|
||||||
```javascript
|
|
||||||
wx.stopVoice({
|
|
||||||
localId: '' // 需要停止的音频的本地ID,由stopRecord接口获得
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 监听语音播放完毕接口
|
|
||||||
```javascript
|
|
||||||
wx.onVoicePlayEnd({
|
|
||||||
success: function (res) {
|
|
||||||
var localId = res.localId; // 返回音频的本地ID
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 上传语音接口
|
|
||||||
```javascript
|
|
||||||
wx.uploadVoice({
|
|
||||||
localId: '', // 需要上传的音频的本地ID,由stopRecord接口获得
|
|
||||||
isShowProgressTips: 1, // 默认为1,显示进度提示
|
|
||||||
success: function (res) {
|
|
||||||
var serverId = res.serverId; // 返回音频的服务器端ID
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
备注:上传语音有效期3天,可用微信多媒体接口下载语音到自己的服务器,此处获得的 serverId 即 media_id,参考文档 ../12/58bfcfabbd501c7cd77c19bd9cfa8354.html 目前多媒体文件下载接口的频率限制为10000次/天,如需要调高频率,请邮件weixin-open@qq.com,邮件主题为【申请多媒体接口调用量】,请对你的项目进行简单描述,附上产品体验链接,并对用户量和使用量进行说明。
|
|
||||||
|
|
||||||
### 下载语音接口
|
|
||||||
```javascript
|
|
||||||
wx.downloadVoice({
|
|
||||||
serverId: '', // 需要下载的音频的服务器端ID,由uploadVoice接口获得
|
|
||||||
isShowProgressTips: 1, // 默认为1,显示进度提示
|
|
||||||
success: function (res) {
|
|
||||||
var localId = res.localId; // 返回音频的本地ID
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## 智能接口
|
|
||||||
|
|
||||||
### 识别音频并返回识别结果接口
|
|
||||||
```javascript
|
|
||||||
wx.translateVoice({
|
|
||||||
localId: '', // 需要识别的音频的本地Id,由录音相关接口获得
|
|
||||||
isShowProgressTips: 1, // 默认为1,显示进度提示
|
|
||||||
success: function (res) {
|
|
||||||
alert(res.translateResult); // 语音识别的结果
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## 设备信息
|
|
||||||
|
|
||||||
### 获取网络状态接口
|
|
||||||
```javascript
|
|
||||||
wx.getNetworkType({
|
|
||||||
success: function (res) {
|
|
||||||
var networkType = res.networkType; // 返回网络类型2g,3g,4g,wifi
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## 地理位置
|
|
||||||
|
|
||||||
### 使用微信内置地图查看位置接口
|
|
||||||
```javascript
|
|
||||||
wx.openLocation({
|
|
||||||
latitude: 0, // 纬度,浮点数,范围为90 ~ -90
|
|
||||||
longitude: 0, // 经度,浮点数,范围为180 ~ -180。
|
|
||||||
name: '', // 位置名
|
|
||||||
address: '', // 地址详情说明
|
|
||||||
scale: 1, // 地图缩放级别,整形值,范围从1~28。默认为最大
|
|
||||||
infoUrl: '' // 在查看位置界面底部显示的超链接,可点击跳转
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 获取地理位置接口
|
|
||||||
```javascript
|
|
||||||
wx.getLocation({
|
|
||||||
type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
|
|
||||||
success: function (res) {
|
|
||||||
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
|
|
||||||
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
|
|
||||||
var speed = res.speed; // 速度,以米/每秒计
|
|
||||||
var accuracy = res.accuracy; // 位置精度
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## 摇一摇周边
|
|
||||||
|
|
||||||
### 开启查找周边ibeacon设备接口
|
|
||||||
```javascript
|
|
||||||
wx.startSearchBeacons({
|
|
||||||
ticket: "", // 摇周边的业务ticket, 系统自动添加在摇出来的页面链接后面
|
|
||||||
complete: function(argv) {
|
|
||||||
// 开启查找完成后的回调函数
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
备注:如需接入摇一摇周边功能,请参考:申请开通摇一摇周边
|
|
||||||
|
|
||||||
### 关闭查找周边ibeacon设备接口
|
|
||||||
```javascript
|
|
||||||
wx.stopSearchBeacons({
|
|
||||||
complete:function(res){
|
|
||||||
//关闭查找完成后的回调函数
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 监听周边ibeacon设备接口
|
|
||||||
```javascript
|
|
||||||
wx.onSearchBeacons({
|
|
||||||
complete:function(argv){
|
|
||||||
//回调函数,可以数组形式取得该商家注册的在周边的相关设备列表
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
备注:上述摇一摇周边接口使用注意事项及更多返回结果说明,请参考:摇一摇周边获取设备信息
|
|
||||||
|
|
||||||
## 界面操作
|
|
||||||
|
|
||||||
### 隐藏右上角菜单接口
|
|
||||||
```javascript
|
|
||||||
wx.hideOptionMenu();
|
|
||||||
```
|
|
||||||
|
|
||||||
### 显示右上角菜单接口
|
|
||||||
```javascript
|
|
||||||
wx.showOptionMenu();
|
|
||||||
```
|
|
||||||
|
|
||||||
### 关闭当前网页窗口接口
|
|
||||||
```javascript
|
|
||||||
wx.closeWindow();
|
|
||||||
```
|
|
||||||
|
|
||||||
### 批量隐藏功能按钮接口
|
|
||||||
```javascript
|
|
||||||
wx.hideMenuItems({
|
|
||||||
menuList: [] // 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 批量显示功能按钮接口
|
|
||||||
```javascript
|
|
||||||
wx.showMenuItems({
|
|
||||||
menuList: [] // 要显示的菜单项,所有menu项见附录3
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 隐藏所有非基础按钮接口
|
|
||||||
```javascript
|
|
||||||
wx.hideAllNonBaseMenuItem();
|
|
||||||
// “基本类”按钮详见附录3
|
|
||||||
```
|
|
||||||
|
|
||||||
### 显示所有功能按钮接口
|
|
||||||
```javascript
|
|
||||||
wx.showAllNonBaseMenuItem();
|
|
||||||
```
|
|
||||||
|
|
||||||
## 微信扫一扫
|
|
||||||
|
|
||||||
### 调起微信扫一扫接口
|
|
||||||
```javascript
|
|
||||||
wx.scanQRCode({
|
|
||||||
needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
|
|
||||||
scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
|
|
||||||
success: function (res) {
|
|
||||||
var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## 微信小店
|
|
||||||
|
|
||||||
### 跳转微信商品页接口
|
|
||||||
```javascript
|
|
||||||
wx.openProductSpecificView({
|
|
||||||
productId: '', // 商品id
|
|
||||||
viewType: '' // 0.默认值,普通商品详情页1.扫一扫商品详情页2.小店商品详情页
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## 微信卡券
|
|
||||||
|
|
||||||
微信卡券接口中使用的签名凭证api_ticket,与步骤三中config使用的签名凭证jsapi_ticket不同,开发者在调用微信卡券JS-SDK的过程中需依次完成两次不同的签名,并确保凭证的缓存。
|
|
||||||
|
|
||||||
### 获取api_ticket
|
|
||||||
|
|
||||||
api_ticket 是用于调用微信卡券JS API的临时票据,有效期为7200 秒,通过access_token 来获取。
|
|
||||||
|
|
||||||
开发者注意事项:
|
|
||||||
|
|
||||||
1. **此用于卡券接口签名的api_ticket与步骤三中通过config接口注入权限验证配置使用的jsapi_ticket不同。**
|
|
||||||
2. 由于获取api_ticket 的api 调用次数非常有限,频繁刷新api_ticket 会导致api调用受限,影响自身业务,开发者需在自己的服务存储与更新api_ticket。
|
|
||||||
|
|
||||||
#### 接口调用请求说明
|
|
||||||
|
|
||||||
http请求方式: GET
|
|
||||||
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card
|
|
||||||
|
|
||||||
#### 参数说明
|
|
||||||
| 参数 | 是否必须 | 说明 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| access_token | 是 | 调用接口凭证 |
|
|
||||||
|
|
||||||
#### 返回数据
|
|
||||||
|
|
||||||
数据示例:
|
|
||||||
```JSON
|
|
||||||
{
|
|
||||||
"errcode": 0,
|
|
||||||
"errmsg": "ok",
|
|
||||||
"ticket": "bxLdikRXVbTPdHSM05e5u5sUoXNKdvsdshFKA",
|
|
||||||
"expires_in": 7200
|
|
||||||
}
|
|
||||||
```
|
|
||||||
| 参数名 | 描述
|
|
||||||
| --- | ---
|
|
||||||
| errcode | 错误码
|
|
||||||
| errmsg | 错误信息
|
|
||||||
| ticket | api_ticket,卡券接口中签名所需凭证
|
|
||||||
| expires_in | 有效时间
|
|
||||||
|
|
||||||
### 拉取适用卡券列表并获取用户选择信息
|
|
||||||
```javascript
|
|
||||||
wx.chooseCard({
|
|
||||||
shopId: '', // 门店Id
|
|
||||||
cardType: '', // 卡券类型
|
|
||||||
cardId: '', // 卡券Id
|
|
||||||
timestamp: 0, // 卡券签名时间戳
|
|
||||||
nonceStr: '', // 卡券签名随机串
|
|
||||||
signType: '', // 签名方式,默认'SHA1'
|
|
||||||
cardSign: '', // 卡券签名
|
|
||||||
success: function (res) {
|
|
||||||
var cardList= res.cardList; // 用户选中的卡券列表信息
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
|参数名 |必填 |类型 |示例值 |描述
|
|
||||||
| --- | --- | --- | --- | ---
|
|
||||||
|shopId |否 |string(24) |1234 |门店ID。shopID用于筛选出拉起带有指定location_list(shopID)的卡券列表,非必填。
|
|
||||||
|cardType |否 |string(24) |GROUPON |卡券类型,用于拉起指定卡券类型的卡券列表。当cardType为空时,默认拉起所有卡券的列表,非必填。
|
|
||||||
|cardId |否 |string(32) |p1Pj9jr90_SQRaVqYI239Ka1erk |卡券ID,用于拉起指定cardId的卡券列表,当cardId为空时,默认拉起所有卡券的列表,非必填。
|
|
||||||
|timestamp |是 |string(32) |14300000000 |时间戳。
|
|
||||||
|nonceStr |是 |string(32) |sduhi123 |随机字符串。
|
|
||||||
|signType |是 |string(32) |SHA1 |签名方式,目前仅支持SHA1
|
|
||||||
|cardSign |是 |string(64) |abcsdijcous123 |签名。
|
|
||||||
|
|
||||||
cardSign详见附录4。开发者特别注意:签名错误会导致拉取卡券列表异常为空,请仔细检查参与签名的参数有效性。
|
|
||||||
|
|
||||||
**特别提醒**
|
|
||||||
|
|
||||||
拉取列表仅与用户本地卡券有关,拉起列表异常为空的情况通常有三种:签名错误、时间戳无效、筛选机制有误。请开发者依次排查定位原因。
|
|
||||||
|
|
||||||
### 批量添加卡券接口
|
|
||||||
```javascript
|
|
||||||
wx.addCard({
|
|
||||||
cardList: [{
|
|
||||||
cardId: '',
|
|
||||||
cardExt: ''
|
|
||||||
}], // 需要添加的卡券列表
|
|
||||||
success: function (res) {
|
|
||||||
var cardList = res.cardList; // 添加的卡券列表信息
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
cardExt详见附录4,值得注意的是,这里的card_ext参数必须与参与签名的参数一致,格式为字符串而不是Object,否则会报签名错误。
|
|
||||||
|
|
||||||
### 查看微信卡包中的卡券接口
|
|
||||||
```javascript
|
|
||||||
wx.openCard({
|
|
||||||
cardList: [{
|
|
||||||
cardId: '',
|
|
||||||
code: ''
|
|
||||||
}]// 需要打开的卡券列表
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 核销后再次赠送卡券接口
|
|
||||||
```javascript
|
|
||||||
wx.consumeAndShareCard({
|
|
||||||
cardId: '',
|
|
||||||
code: ''
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
参数说明:
|
|
||||||
|
|
||||||
|参数 |说明
|
|
||||||
| --- | ---
|
|
||||||
|cardId |上一步核销的card_id,若传入错误的card_id会报错
|
|
||||||
|code |上一步核销的code,若传入错误的code会报错
|
|
||||||
|
|
||||||
注意:
|
|
||||||
该接口只支持微信6.3.6以上版本的客户端,开发者在调用时需要注意两点:
|
|
||||||
|
|
||||||
1. 需要引入1.1.0版本的js文件: https://res.wx.qq.com/open/js/jweixin-1.1.0.js
|
|
||||||
2. 需要判断用户客户端版本号,做出容错处理,详情点击:判断当前客户端版本是否支持指定JS接口
|
|
||||||
|
|
||||||
## 微信支付
|
|
||||||
|
|
||||||
### 发起一个微信支付请求
|
|
||||||
```javascript
|
|
||||||
wx.chooseWXPay({
|
|
||||||
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
|
|
||||||
nonceStr: '', // 支付签名随机串,不长于 32 位
|
|
||||||
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
|
|
||||||
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
|
|
||||||
paySign: '', // 支付签名
|
|
||||||
success: function (res) {
|
|
||||||
// 支付成功后的回调函数
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
备注:prepay_id 通过微信支付统一下单接口拿到,paySign 采用统一的微信支付 Sign 签名生成方法,注意这里 appId 也要参与签名,appId 与 config 中传入的 appId 一致,即最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。
|
|
||||||
|
|
||||||
**请注意该接口只能在你配置的支付目录下调用,同时需确保支付目录在JS接口安全域名下。**
|
|
||||||
|
|
||||||
微信支付开发文档:[https://pay.weixin.qq.com/wiki/doc/api/index.html](https://pay.weixin.qq.com/wiki/doc/api/index.html)
|
|
||||||
|
|
@ -3,8 +3,16 @@
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||

|

|
||||||
|
### —— 欢迎使用 amWiki 轻文库! ——
|
||||||
|
amWiki 致力于让大家可以更简单、更便捷的建设个人和团队文库!
|
||||||
|
|
||||||
### 欢迎使用 amWiki 轻文库!
|
[ [amWiki Github](https://github.com/TevinLi/amWiki) ]
|
||||||
—— **amWiki 致力于让大家可以更简单、更便捷的建设个人和团队文库!**
|
[ [amWiki 官网·文档中心](https://amwiki.org/doc/) ]
|
||||||
|
|
||||||
[ [amWiki 官网文档中心](https://amwiki.org/doc/) ]
|
GitHub:
|
||||||
|
[](https://github.com/TevinLi/amWiki "GitHub Stars") [](https://github.com/TevinLi/amWiki "GitHub Forks") [](https://github.com/TevinLi/amWiki "GitHub Open Issues") [](https://github.com/TevinLi/amWiki "GitHub Closed Issues")
|
||||||
|
[](https://github.com/TevinLi/amWiki "GitHub Tag") [](https://github.com/TevinLi/amWiki "MIT License")
|
||||||
|
APM:
|
||||||
|
[](https://atom.io/packages/amWiki "APM Version") [](https://atom.io/packages/amWiki "APM Downloads")
|
||||||
|
NPM:
|
||||||
|
[](https://www.npmjs.com/package/amwiki "NPM Version") [](https://www.npmjs.com/package/amwiki "APM Downloads") [](https://www.npmjs.com/package/amwiki)
|
||||||
|
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
# Atom 编辑器对 Markdown 的原生支持
|
|
||||||
|
|
||||||
Atom 是 Github 开发的开源跨平台的编辑器,原生支持编辑 Markdown 文档
|
|
||||||
|
|
||||||
## 自动完成 Markdown 语法标记
|
|
||||||
|
|
||||||
### 代码段效果-code
|
|
||||||
输入 `c + Enter`
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 粗体效果-bold
|
|
||||||
输入 `b + Enter`
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 斜体效果-italic
|
|
||||||
输入 `i + Enter`
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 链接效果-link
|
|
||||||
输入 `l + Enter`
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 图片效果-img
|
|
||||||
输入 `im + Enter`
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 表格效果-table
|
|
||||||
输入 `ta + Enter`
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
<!--
|
|
||||||
### todo效果-list
|
|
||||||
输入`t + Enter`
|
|
||||||
|
|
||||||

|
|
||||||
-->
|
|
||||||
|
|
||||||
## 自动补齐二次单词输入
|
|
||||||
在第二次输入时,单词可以自动识别与补齐,回车即可完成输入
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 内置 Markdown 即时预览插件
|
|
||||||
编辑 Markdown 文档时,使用快捷键 `ctrl + shift + m` 即可在窗口右侧打开 Atom 内置的 markdown-preview 即时预览模块
|
|
||||||
|
|
||||||

|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
# amWiki 与流程图
|
|
||||||
|
|
||||||
amWiki 使用 [flowchart.js](https://github.com/adrai/flowchart.js) 进行流程图渲染,它是一款将文本表达式绘制为简单的 svg 流程图的图形库
|
|
||||||
流程图代码块和语法高亮类似,不过类型声明须用 `flow` 关键字
|
|
||||||
```flow
|
|
||||||
//your flow text here
|
|
||||||
```
|
|
||||||
|
|
||||||
## 流程图样例
|
|
||||||
代码:
|
|
||||||
|
|
||||||
```flow
|
|
||||||
st=>start: Start :>https://amwiki.xf09.net[blank]
|
|
||||||
e=>end: End :>https://amwiki.xf09.net[blank]
|
|
||||||
op1=>operation: My Operation
|
|
||||||
op2=>operation: Stuff
|
|
||||||
sub1=>subroutine: My Subroutine
|
|
||||||
cond=>condition: Yes or No? :>https://amwiki.xf09.net[blank]
|
|
||||||
c2=>condition: Good idea
|
|
||||||
io=>inputoutput: catch something...
|
|
||||||
|
|
||||||
st->op1(right)->cond
|
|
||||||
cond(yes, right)->c2
|
|
||||||
cond(no)->sub1(left)->op1
|
|
||||||
c2(yes)->io->e
|
|
||||||
c2(no)->op2->e
|
|
||||||
```
|
|
||||||
效果:
|
|
||||||
|
|
||||||
```flow
|
|
||||||
st=>start: Start :>https://amwiki.xf09.net[blank]
|
|
||||||
e=>end: End :>https://amwiki.xf09.net[blank]
|
|
||||||
op1=>operation: My Operation
|
|
||||||
op2=>operation: Stuff
|
|
||||||
sub1=>subroutine: My Subroutine
|
|
||||||
cond=>condition: Yes or No? :>https://amwiki.xf09.net[blank]
|
|
||||||
c2=>condition: Good idea
|
|
||||||
io=>inputoutput: catch something...
|
|
||||||
|
|
||||||
st->op1(right)->cond
|
|
||||||
cond(yes, right)->c2
|
|
||||||
cond(no)->sub1(left)->op1
|
|
||||||
c2(yes)->io->e
|
|
||||||
c2(no)->op2->e
|
|
||||||
```
|
|
||||||
|
|
||||||
## 流程图语法介绍
|
|
||||||
流程图语法分两个部分,一个是声明元素,一个是定义流程
|
|
||||||
|
|
||||||
### 声明元素
|
|
||||||
语法:
|
|
||||||
|
|
||||||
tag=>type: content :>url
|
|
||||||
|
|
||||||
1. `tag` 设置元素名称
|
|
||||||
2. `=>` 元素定义符
|
|
||||||
2. `type:` 设置元素类型,共分6种:
|
|
||||||
- **start**:开始,圆角矩形
|
|
||||||
- **end**:结束,圆角矩形
|
|
||||||
- **operation**:操作/行动方案,普通矩形
|
|
||||||
- **subroutine**:子主题/模块,双边线矩形
|
|
||||||
- **condition**:条件判断/问题审核,菱形
|
|
||||||
- **inputoutput**:输入输出,平行四边形
|
|
||||||
3. `content` 设置元素显示内容,中英均可
|
|
||||||
4. `:>url` 设置元素连接,可选,后接 [blank] 可以新建窗口打开
|
|
||||||
|
|
||||||
提示:注意空格,`=>` 前后都不能接空格;`type:` 后必须接空格;`:>` 是语法标记,中间不能有空格
|
|
||||||
|
|
||||||
### 定义流程
|
|
||||||
语法:
|
|
||||||
|
|
||||||
tag1(branch,direction)->tag2
|
|
||||||
|
|
||||||
1. `->` 流程定义符,连接两个元素
|
|
||||||
2. `branch` 设置 condition 类型元素的两个分支,有 `yes`/`no` 两个值,其他元素无效
|
|
||||||
3. `direction` 定义流程走线方向,有 `left`/`right`/`top`/`bottom` 四个值,所有元素有效,此项配置可选 (ps:此属性容易造成渲染 bug)
|
|
||||||
|
|
||||||
小提示:
|
|
||||||
- 继续注意空格,`->` 前后都不能有空格
|
|
||||||
- 由于 condition 类型有两个分支,我们一般遇到 condition 元素就换行书写,比如:
|
|
||||||
st->op1-c2
|
|
||||||
c2(yes)->io->e
|
|
||||||
c2(no)->op2->e
|
|
||||||
|
|
@ -1,179 +0,0 @@
|
||||||
# amWiki 与语法高亮
|
|
||||||
|
|
||||||
amWiki使用 [highlight.js](https://github.com/isagalaev/highlight.js) 进行预语法高亮渲染,它能对多达一百多种语言、样式提供语法高亮解析
|
|
||||||
使用两组每组三个反引号分单独两行将代码包围起来,并在第一组反引号后写上语言类型即可使用语法高亮,例如:
|
|
||||||
```js
|
|
||||||
//some js code here
|
|
||||||
```
|
|
||||||
|
|
||||||
## javascript / js 代码
|
|
||||||
普通代码块效果:
|
|
||||||
```
|
|
||||||
//发送验证码
|
|
||||||
function cd(num) {
|
|
||||||
$('#code').val(num + '秒后可重发');
|
|
||||||
setTimeout(function() {
|
|
||||||
if (num - 1 >= 0) {
|
|
||||||
cd(num - 1);
|
|
||||||
} else {
|
|
||||||
$('#code').removeClass('bg-gray').prop('disabled', false).val('重新发送验证码');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
1000);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
```
|
|
||||||
{
|
|
||||||
"state": {
|
|
||||||
"code": 10200, //code状态码
|
|
||||||
"msg": "ok" //状态描述
|
|
||||||
},
|
|
||||||
"data": {
|
|
||||||
"team_num": 13, //队伍数
|
|
||||||
"position": "海珠区新港中路" //位置
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
添加 `js`、`javascript` 标记后的效果:
|
|
||||||
```javascript
|
|
||||||
//发送验证码
|
|
||||||
function cd(num) {
|
|
||||||
$('#code').val(num + '秒后可重发');
|
|
||||||
setTimeout(function() {
|
|
||||||
if (num - 1 >= 0) {
|
|
||||||
cd(num - 1);
|
|
||||||
} else {
|
|
||||||
$('#code').removeClass('bg-gray').prop('disabled', false).val('重新发送验证码');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
1000);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
```js
|
|
||||||
{
|
|
||||||
"state": {
|
|
||||||
"code": 10200, //code状态码
|
|
||||||
"msg": "ok" //状态描述
|
|
||||||
},
|
|
||||||
"data": {
|
|
||||||
"team_num": 13, //队伍数
|
|
||||||
"position": "海珠区新港中路" //位置
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
amWiki对javascript代码片段做了再次增强,可以点击代码块右上角按钮隐藏/显示注释
|
|
||||||
当注释处于隐藏状态时不会被复制,比较适合模拟返回json数据的接口时直接拷贝(json不允许注释)
|
|
||||||
|
|
||||||
## Html 代码
|
|
||||||
普通代码段效果:
|
|
||||||
```
|
|
||||||
<body>
|
|
||||||
<div class="loading"><img src="/assets/images/loading.gif"></div>
|
|
||||||
<header>some text</header>
|
|
||||||
<script type="text/javascript" src="/assets/js/jquery-2.1.4.min.js"></script>
|
|
||||||
</body>
|
|
||||||
```
|
|
||||||
添加 `html` 标记后的效果:
|
|
||||||
```html
|
|
||||||
<body>
|
|
||||||
<div class="loading"><img src="/assets/images/loading.gif"></div>
|
|
||||||
<header>some text</header>
|
|
||||||
<script type="text/javascript" src="/assets/js/jquery-2.1.4.min.js"></script>
|
|
||||||
</body>
|
|
||||||
```
|
|
||||||
|
|
||||||
## css 代码
|
|
||||||
普通代码段效果:
|
|
||||||
```
|
|
||||||
/* 紧凑 */
|
|
||||||
html,body{display:block;width:100%;height:100%;min-width:320px;}
|
|
||||||
a,img{-webkit-touch-callout:none;}
|
|
||||||
/* 展开 */
|
|
||||||
input[type="button"],
|
|
||||||
input[type="submit"],
|
|
||||||
input[type="reset"],
|
|
||||||
textarea {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
添加 `css` 标记后的效果:
|
|
||||||
```css
|
|
||||||
/* 紧凑 */
|
|
||||||
html,body{display:block;width:100%;height:100%;min-width:320px;}
|
|
||||||
a,img{-webkit-touch-callout:none;}
|
|
||||||
/* 展开 */
|
|
||||||
input[type="button"],
|
|
||||||
input[type="submit"],
|
|
||||||
input[type="reset"],
|
|
||||||
textarea {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## php 代码
|
|
||||||
普通代码段效果:
|
|
||||||
```
|
|
||||||
private function addQuestData($data, $filing_id)
|
|
||||||
{
|
|
||||||
$quest_num = $data['status'] == 10 ? 1 : 2;
|
|
||||||
$where = [
|
|
||||||
['user_filing_id', '=', $filing_id],
|
|
||||||
['project_id', '=', $data['project_id']],
|
|
||||||
['mobile','=', $data['mobile']],
|
|
||||||
['quest_num', '=', $quest_num]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
```
|
|
||||||
添加 `php` 标记后的效果:
|
|
||||||
```php
|
|
||||||
private function addQuestData($data, $filing_id)
|
|
||||||
{
|
|
||||||
$quest_num = $data['status'] == 10 ? 1 : 2;
|
|
||||||
$where = [
|
|
||||||
['user_filing_id', '=', $filing_id],
|
|
||||||
['project_id', '=', $data['project_id']],
|
|
||||||
['mobile','=', $data['mobile']],
|
|
||||||
['quest_num', '=', $quest_num]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## sql 代码
|
|
||||||
普通代码段效果:
|
|
||||||
```
|
|
||||||
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
|
|
||||||
```
|
|
||||||
添加 `sql` 标记后的效果:
|
|
||||||
```sql
|
|
||||||
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
|
|
||||||
```
|
|
||||||
|
|
||||||
## java 代码
|
|
||||||
普通代码段效果:
|
|
||||||
```
|
|
||||||
public class Test {
|
|
||||||
public static void main(String args[]) {
|
|
||||||
int x = 10;
|
|
||||||
while( x < 20 ) {
|
|
||||||
System.out.print("value of x : " + x );
|
|
||||||
x++;
|
|
||||||
System.out.print("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
添加 `java` 标记后的效果:
|
|
||||||
```java
|
|
||||||
public class Test {
|
|
||||||
public static void main(String args[]) {
|
|
||||||
int x = 10;
|
|
||||||
while( x < 20 ) {
|
|
||||||
System.out.print("value of x : " + x );
|
|
||||||
x++;
|
|
||||||
System.out.print("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
1. [【分割线】](#【分割线】 "【分割线】")
|
1. [【分割线】](#【分割线】 "【分割线】")
|
||||||
1. [【换行】](#【换行】 "【换行】")
|
1. [【换行】](#【换行】 "【换行】")
|
||||||
1. [【html】](#【html】 "【html】")
|
1. [【html】](#【html】 "【html】")
|
||||||
1. [研究更多 markdown 语法详细细节](#研究更多 markdown 语法详细细节 "研究更多 markdown 语法详细细节")
|
1. [更多 markdown 语法](#更多 markdown 语法 "更多 markdown 语法")
|
||||||
|
|
||||||
|
|
||||||
## 简介
|
## 简介
|
||||||
|
|
@ -25,7 +25,7 @@ Markdown的语法简洁明了、学习容易,得到了许多著名网络平台
|
||||||
|
|
||||||
## 语法快速入门
|
## 语法快速入门
|
||||||
|
|
||||||
### <font color=#C71585>【标题】</font>
|
### <font color="#C71585">【标题】</font>
|
||||||
在行首插入1到6个#,对应1到6阶标题
|
在行首插入1到6个#,对应1到6阶标题
|
||||||
# 这是 H1
|
# 这是 H1
|
||||||
## 这是 H2
|
## 这是 H2
|
||||||
|
|
@ -41,7 +41,7 @@ Markdown的语法简洁明了、学习容易,得到了许多著名网络平台
|
||||||
##### 这是 H5
|
##### 这是 H5
|
||||||
###### 这是 H6
|
###### 这是 H6
|
||||||
|
|
||||||
### <font color=#C71585>【修辞和强调】</font>
|
### <font color="#C71585">【修辞和强调】</font>
|
||||||
使用星号和底线来标记需要强调的区段
|
使用星号和底线来标记需要强调的区段
|
||||||
|
|
||||||
**加粗**
|
**加粗**
|
||||||
|
|
@ -55,14 +55,14 @@ __加粗__
|
||||||
*斜体*
|
*斜体*
|
||||||
_斜体_
|
_斜体_
|
||||||
|
|
||||||
### <font color=#C71585>【删除线】</font>
|
### <font color="#C71585">【删除线】</font>
|
||||||
|
|
||||||
~~要删掉的内容~~
|
~~要删掉的内容~~
|
||||||
|
|
||||||
渲染效果:
|
渲染效果:
|
||||||
~~要删掉的内容~~
|
~~要删掉的内容~~
|
||||||
|
|
||||||
### <font color=#C71585>【列表】</font>
|
### <font color="#C71585">【列表】</font>
|
||||||
**无序列表** 使用星号、加号和减号来做为列表的项目标记
|
**无序列表** 使用星号、加号和减号来做为列表的项目标记
|
||||||
* Candy.
|
* Candy.
|
||||||
* Gum.
|
* Gum.
|
||||||
|
|
@ -95,7 +95,7 @@ _斜体_
|
||||||
50. Green
|
50. Green
|
||||||
1000. Blue
|
1000. Blue
|
||||||
|
|
||||||
### <font color=#C71585>【链接】</font>
|
### <font color="#C71585">【链接】</font>
|
||||||
在方括号后面用圆括号接上链接
|
在方括号后面用圆括号接上链接
|
||||||
|
|
||||||
这是一个[链接显示文本](http://www.baidu.com "链接title文本")
|
这是一个[链接显示文本](http://www.baidu.com "链接title文本")
|
||||||
|
|
@ -103,7 +103,7 @@ _斜体_
|
||||||
渲染效果:
|
渲染效果:
|
||||||
这是一个[链接显示文本](http://www.baidu.com "链接title文本")
|
这是一个[链接显示文本](http://www.baidu.com "链接title文本")
|
||||||
|
|
||||||
### <font color=#C71585>【图片】</font>
|
### <font color="#C71585">【图片】</font>
|
||||||
图片的语法和链接很像
|
图片的语法和链接很像
|
||||||
|
|
||||||

|

|
||||||
|
|
@ -111,7 +111,7 @@ _斜体_
|
||||||
渲染效果:
|
渲染效果:
|
||||||

|

|
||||||
|
|
||||||
### <font color=#C71585>【代码】</font>
|
### <font color="#C71585">【代码】</font>
|
||||||
使用反引号 \` 来标记代码区段
|
使用反引号 \` 来标记代码区段
|
||||||
|
|
||||||
我是`code`,`<div>division</div>`
|
我是`code`,`<div>division</div>`
|
||||||
|
|
@ -119,7 +119,7 @@ _斜体_
|
||||||
渲染效果:
|
渲染效果:
|
||||||
我是`code`,`<div>division</div>`
|
我是`code`,`<div>division</div>`
|
||||||
|
|
||||||
### <font color=#C71585>【代码段】</font>
|
### <font color="#C71585">【代码段】</font>
|
||||||
如果要建立一个已经格式化好的代码区块,只要每行都缩进 4 个空格或是一个 tab 就可以了
|
如果要建立一个已经格式化好的代码区块,只要每行都缩进 4 个空格或是一个 tab 就可以了
|
||||||
|
|
||||||
var name = 'Candy'
|
var name = 'Candy'
|
||||||
|
|
@ -128,7 +128,7 @@ _斜体_
|
||||||
|
|
||||||
var name = 'Candy'
|
var name = 'Candy'
|
||||||
|
|
||||||
### <font color=#C71585>【表格】</font>
|
### <font color="#C71585">【表格】</font>
|
||||||
使用竖线分割内容,且同时使用“---”与“:”指定对齐方式
|
使用竖线分割内容,且同时使用“---”与“:”指定对齐方式
|
||||||
|
|
||||||
| Header01 | Header02 | Header03
|
| Header01 | Header02 | Header03
|
||||||
|
|
@ -141,7 +141,7 @@ _斜体_
|
||||||
| -------- | :------: | ---:
|
| -------- | :------: | ---:
|
||||||
| 默认 | 居中 | 右
|
| 默认 | 居中 | 右
|
||||||
|
|
||||||
### <font color=#C71585>【引用】</font>
|
### <font color="#C71585">【引用】</font>
|
||||||
只需要在文本前加入 > 这种尖括号(大于号)即可
|
只需要在文本前加入 > 这种尖括号(大于号)即可
|
||||||
|
|
||||||
>这里是一段引用
|
>这里是一段引用
|
||||||
|
|
@ -149,7 +149,7 @@ _斜体_
|
||||||
渲染效果:
|
渲染效果:
|
||||||
>这里是一段引用
|
>这里是一段引用
|
||||||
|
|
||||||
### <font color=#C71585>【分割线】</font>
|
### <font color="#C71585">【分割线】</font>
|
||||||
只需要三个 \- 号
|
只需要三个 \- 号
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
@ -158,7 +158,7 @@ _斜体_
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### <font color=#C71585>【换行】</font>
|
### <font color="#C71585">【换行】</font>
|
||||||
只需要两个以上的空格然后回车
|
只需要两个以上的空格然后回车
|
||||||
|
|
||||||
我是首行
|
我是首行
|
||||||
|
|
@ -168,16 +168,17 @@ _斜体_
|
||||||
我是首行
|
我是首行
|
||||||
我换行了
|
我换行了
|
||||||
|
|
||||||
### <font color=#C71585>【html】</font>
|
### <font color="#C71585">【html】</font>
|
||||||
可以直接在文档里书写 HTML,不需要额外标注这是 HTML
|
可以直接在文档里书写 HTML,不需要额外标注这是 HTML
|
||||||
|
|
||||||
<div>division</div>
|
<div style="color:orange">division</div>
|
||||||
|
|
||||||
渲染效果:
|
渲染效果:
|
||||||
<div>division</div>
|
<div style="color:orange">division</div>
|
||||||
|
|
||||||
|
|
||||||
## 研究更多 markdown 语法详细细节
|
## 更多 Markdown 语法
|
||||||
|
|
||||||
|
更多 amWiki 专属 Markdown 语法,请前往:[ [amWiki 官网·文档中心](https://amwiki.org/doc/) ]
|
||||||
|
|
||||||
|
|
||||||
- [创始人 John Gruber 的 Markdown 语法说明](http://daringfireball.net/projects/markdown/syntax)
|
|
||||||
- [Markdown 中文版语法说明](http://wowubuntu.com/markdown/)
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"atom": ">=1.0.0 <2.0.0",
|
"atom": ">=1.0.0 <2.0.0",
|
||||||
"node": ">=1.0.0"
|
"node": ">=4.0.0"
|
||||||
},
|
},
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/TevinLi/amWiki/issues"
|
"url": "https://github.com/TevinLi/amWiki/issues"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue