zhjiho 4 years ago
parent
commit
af8b7887f0
  1. 17
      web_src/.gitignore
  2. 8
      web_src/config/index.js
  3. 43
      web_src/index.html
  4. BIN
      web_src/src/assets/logo.png
  5. 219
      web_src/src/components/Index.vue
  6. 2
      web_src/src/components/admin/Index.vue
  7. 2
      web_src/src/components/admin/attachment/Index.vue
  8. 7
      web_src/src/components/admin/setting/Index.vue
  9. 18
      web_src/src/components/admin/user/Index.vue
  10. 24
      web_src/src/components/attachment/Index.vue
  11. 84
      web_src/src/components/catalog/Index.vue
  12. 118
      web_src/src/components/common/Mock.vue
  13. 86
      web_src/src/components/common/OxFooter.vue
  14. 288
      web_src/src/components/common/OxHeader.vue
  15. 44
      web_src/src/components/item/export/Index.vue
  16. 6
      web_src/src/components/item/show/Index.vue
  17. 15
      web_src/src/components/item/show/show_regular_item/Index.vue
  18. 10
      web_src/src/components/item/show/show_regular_item/LeftMenu.vue
  19. 2
      web_src/src/components/item/show/show_regular_item/LeftMenuSub.vue
  20. 21
      web_src/src/components/item/show/show_regular_item/OpBar.vue
  21. 2
      web_src/src/components/item/show/show_single_page_item/Index.vue
  22. 4
      web_src/src/components/item/show/show_table_item/Index.vue
  23. 33
      web_src/src/components/page/edit/AttachmentList.vue
  24. 174
      web_src/src/components/page/edit/Filehub.vue
  25. 36
      web_src/src/components/page/edit/Index.vue
  26. 4
      web_src/src/main.js
  27. 137
      web_src/src/models/page.js
  28. 8
      web_src/src/store/actions.js
  29. 5
      web_src/src/store/index.js
  30. 3
      web_src/src/store/mutations.js
  31. 7
      web_src/src/store/state.js
  32. 92
      web_src/src/util.js
  33. 228
      web_src/static/css/OxFooter.css
  34. 82
      web_src/static/css/qietu.css
  35. 333
      web_src/static/css/responsive.css
  36. 793
      web_src/static/css/style.css
  37. BIN
      web_src/static/css/unisans.otf
  38. 5
      web_src/static/editor.md/editormd.js
  39. 2710
      web_src/static/editor.md/lib/marked.min.js
  40. 29
      web_src/static/editor.md/lib/marked.old.js
  41. BIN
      web_src/static/images/bg.jpg
  42. BIN
      web_src/static/images/code.png
  43. BIN
      web_src/static/images/icon_right.png
  44. BIN
      web_src/static/images/logo.png
  45. BIN
      web_src/static/images/logo_b.png
  46. BIN
      web_src/static/images/mini.png
  47. BIN
      web_src/static/images/search.png
  48. BIN
      web_src/static/imgs/Android.png
  49. BIN
      web_src/static/imgs/Auto.png
  50. BIN
      web_src/static/imgs/Logo.png
  51. BIN
      web_src/static/imgs/Mac.png
  52. BIN
      web_src/static/imgs/Server.png
  53. BIN
      web_src/static/imgs/Vector 9.png
  54. BIN
      web_src/static/imgs/Vector.png
  55. BIN
      web_src/static/imgs/Vector1.png
  56. BIN
      web_src/static/imgs/Wechat.png
  57. BIN
      web_src/static/imgs/Windows.png
  58. BIN
      web_src/static/imgs/bg1.png
  59. BIN
      web_src/static/imgs/bg2-1.png
  60. BIN
      web_src/static/imgs/bg2-2.png
  61. BIN
      web_src/static/imgs/bg2-3.png
  62. BIN
      web_src/static/imgs/bg2-4.png
  63. BIN
      web_src/static/imgs/bg2-5.png
  64. BIN
      web_src/static/imgs/code.png
  65. BIN
      web_src/static/imgs/home1.png
  66. BIN
      web_src/static/imgs/home2-1111111.png
  67. BIN
      web_src/static/imgs/home2-img.png
  68. BIN
      web_src/static/imgs/home2.png
  69. BIN
      web_src/static/imgs/home3.png
  70. BIN
      web_src/static/imgs/home4.png
  71. BIN
      web_src/static/imgs/home5.png
  72. BIN
      web_src/static/imgs/home6.png
  73. BIN
      web_src/static/imgs/home7.png
  74. BIN
      web_src/static/imgs/home8.png
  75. BIN
      web_src/static/imgs/home9.png
  76. BIN
      web_src/static/imgs/iOS.png
  77. BIN
      web_src/static/imgs/regbg.jpg
  78. 59
      web_src/static/lang/en.js
  79. 67
      web_src/static/lang/zh-CN.js

17
web_src/.gitignore

@ -0,0 +1,17 @@
.DS_Store
node_modules/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
/test/unit/coverage/
/test/e2e/reports/
selenium-debug.log
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln

8
web_src/config/index.js

@ -11,7 +11,13 @@ module.exports = {
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/server/': 'http://127.0.0.1/showdoc/'
'/server': {
target: 'http://showdoc.t.3pr.com.cn', //
changeOrigin: true,
pathRewrite: {
'^/server': '/server'
}
},
},
// Various Dev Server settings

43
web_src/index.html

@ -5,34 +5,33 @@
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="edge" />
<title>ShowDoc</title>
<meta name="keywords" content="在线API文档 技术文档 数据字典 在线手册" />
<meta name="description" content="一个非常适合IT团队的在线API文档、技术文档工具。你可以使用Showdoc来编写在线API文档、技术文档、数据字典、在线手册" />
<title>帮助中心-欧轩智能场馆</title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<script type="text/javascript">
// var Wwidth = window.innerWidth
// window.addEventListener('resize', function() {
// /// 宽度变化大于50像素的时候刷新整个窗口以适应新宽度
// if (Math.abs(Wwidth - window.innerWidth) > 50) {
// // 如果不在编辑页面,则在窗口变化后刷新窗口以适应宽度
// if (window.location.href.indexOf('/edit') === -1) {
// window.location.reload()
// }
// };
// })
var Wwidth = window.innerWidth ;
window.addEventListener('resize', function() {
///宽度变化大于50像素的时候刷新整个窗口以适应新宽度
if ( Math.abs(Wwidth - window.innerWidth) > 50 ) {
//如果不在编辑页面,则在窗口变化后刷新窗口以适应宽度
if(window.location.href.indexOf("/edit") === -1){
window.location.reload();
}
};
});
//挂在window下的全局配置
window.DocConfig = {
//"server":'http://127.0.0.1/showdoc/server/index.php?s=',
"server": window.location.protocol +'//'+ window.location.host + window.location.pathname+ '../server/index.php?s=',
//"lang" :'en'
"lang" :'zh-cn'
}
// 挂在window下的全局配置
window.DocConfig = {
// "server":'http://127.0.0.1/showdoc/server/index.php?s=',
'server': window.location.protocol + '//' + window.location.host + window.location.pathname + '../server/index.php?s=',
// "lang" :'en'
'lang': 'zh-cn'
}
</script>
</head>
<body class="grey-bg">
<div id="app"></div>
<!-- built files will be auto injected -->
<div style="display:none">本网站基于开源版showdoc搭建,仅供私人使用。如需访问showdoc官网,请在搜索引擎里搜索showdoc字样或者直接访问showdoc.com.cn</div>
</body>
</html>

BIN
web_src/src/assets/logo.png

Before

Width: 200  |  Height: 200  |  Size: 6.7 KiB

After

Width: 378  |  Height: 82  |  Size: 4.8 KiB

219
web_src/src/components/Index.vue

@ -1,108 +1,42 @@
<template>
<div class="hello">
<div class="block">
<div class="row header">
<div class="right pull-right">
<ul class="inline pull-right">
<li>
<router-link :to="link">{{link_text}}</router-link>&nbsp;&nbsp;&nbsp;
<a
target="_blank"
v-if="lang =='zh-cn'"
href="https://www.showdoc.cc/clients"
>客户端</a>
</li>
</ul>
<div class="body">
<!--header-->
<OxHeader></OxHeader>
<div class="searchBox">
<div class="wrapperBox">
<div class="tip-text">您好 请问您需要什么帮助</div>
<div class="input-group">
<img src="static/images/search.png" alt="">
<input v-model="keyword" type="text" class="form-control">
<button class="btn" type="button" @click="handldSearch">搜索</button>
</div>
</div>
<el-carousel :height="height" :autoplay="false" arrow="always">
<el-carousel-item style="background-color: #1bbc9b;">
<div class="slide">
<img src="static/logo/b_64.png" alt />
<h2>{{$t("section_title1")}}</h2>
<p>
<span v-html="$t('section_description1')"></span>
</p>
<p>
<a class="el-button" href="https://www.showdoc.cc/demo" target="_blank">{{$t("demo")}}</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a
class="el-button"
href="https://www.showdoc.cc/help"
target="_blank"
>{{$t("help")}}&nbsp;</a>
</p>
</div>
</el-carousel-item>
<el-carousel-item style="background-color: #2C606A;">
<div class="slide">
<h2>{{$t("section_title2")}}</h2>
<p>
<span v-html="$t('section_description2')"></span>
</p>
</div>
</el-carousel-item>
<div class="docListBox resListBox" v-loading="loading" v-if="$route.query.keyword">
<div class="docList">
<router-link :key="item.item_id" v-for="item in itemList"
:to="'/' + (item.item_domain ? item.item_domain:item.item_id ) + ('?page_id='+item.page_id)" title>
<el-carousel-item style="background-color: #f90;">
<div class="slide">
<h2>{{$t("section_title3")}}</h2>
<p>
<span v-html="$t('section_description3')"></span>
</p>
{{item.page_title}}
<small>{{item.item_cat}}</small>
</router-link>
</div>
</el-carousel-item>
<el-carousel-item style="background-color: #7CBD9D;">
<div class="slide">
<h2>{{$t("section_title4")}}</h2>
<p>
<span v-html="$t('section_description4')"></span>
</p>
<div v-if="itemList.length===0" style="text-align:center;padding:30px;">暂无数据</div>
</div>
</el-carousel-item>
<el-carousel-item style="background-color: #A77DC2;">
<div class="slide">
<h2>{{$t("section_title5")}}</h2>
<p>
<span v-html="$t('section_description5')"></span>
</p>
<div class="docListBox " v-loading="loading" v-else>
<h2 class="title">获取帮助</h2>
<div class="docList">
<router-link :key="item.item_id" v-for="item in itemList" :to="'/' + (item.item_domain ? item.item_domain:item.item_id )" title>
{{item.item_name}}
</router-link>
</div>
</el-carousel-item>
<el-carousel-item style="background-color: #85CE92;">
<div class="slide">
<h2>{{$t("section_title6")}}</h2>
<p>
<span v-html="$t('section_description6')"></span>
</p>
</div>
</el-carousel-item>
<OxFooter></OxFooter>
<el-carousel-item style="background-color: #4BBFC3;">
<div class="slide">
<h2>{{$t("section_title7")}}</h2>
<p>
<span v-html="$t('section_description7')"></span>
</p>
</div>
</el-carousel-item>
<el-carousel-item style="background-color: #1bbc9b;">
<div class="slide">
<h2></h2>
<p>{{$t("section_description8")}}</p>
<p>
<el-button>
<router-link to="/user/login">{{$t("section_title8")}}</router-link>
</el-button>
</p>
</div>
</el-carousel-item>
</el-carousel>
</div>
</div>
</template>
<script>
@ -110,13 +44,53 @@ export default {
name: 'Index',
data() {
return {
loading:false,
keyword:this.$route.query.keyword,
// isSearch:this.$route.query.
itemList:[],
height: '',
link: '',
link_text: '',
lang: ''
}
},
watch: {
'$route.query.keyword': function(val) {
this.keyword = val
if (val) {
this.search()
} else {
this.getList()
}
}
},
methods: {
handldSearch(){
this.$router.push({
query:{
keyword:this.keyword
}
})
// if(this.keyword){
// this.search()
// }else{
// this.getList()
// }
},
search(){
this.loading= true;
var url = DocConfig.server + '/api/help/search'
this.axios.post(url,{
keyword:this.keyword
}).then(res => {
this.loading= false;
if (res.data.error_code === 0) {
this.itemList = res.data.data.items
}
})
},
getHeight() {
var winHeight
if (window.innerHeight) {
@ -147,11 +121,27 @@ export default {
}
}
})
},
getList() {
this.loading= true;
var url = DocConfig.server + '/api/help/getItemList'
this.axios.post(url).then(res => {
this.loading= false;
if (res.data.error_code === 0) {
this.itemList = res.data.data.items
}
})
}
},
mounted() {
var that = this
this.lang = DocConfig.lang
if(this.keyword){
this.search()
}else{
this.getList()
}
this.getHeight()
this.homePageSetting()
that.link = '/user/login'
@ -167,45 +157,6 @@ export default {
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.el-carousel__item {
text-align: center;
font: 25px 'Microsoft Yahei';
color: #fff;
}
.header {
padding-right: 50px;
padding-top: 30px;
font-size: 18px;
position: fixed;
right: 0;
left: 0;
z-index: 1030;
margin-bottom: 0;
}
.header a {
color: white;
font-size: 12px;
font-weight: bold;
}
.slide {
width: 100%;
max-width: 700px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding-top: 0px;
padding-left: 15px;
padding-right: 15px;
padding-bottom: 0px;
box-sizing: border-box;
}
@media only screen and (max-width: 800px) {
.slide p {
font-size: 14px;
}
}
</style>
<style scoped src="@/../static/css/qietu.css"></style>
<style scoped src="@/../static/css/style.css"></style>
<style scoped src="@/../static/css/responsive.css"></style>

2
web_src/src/components/admin/Index.vue

@ -2,7 +2,7 @@
<div class="hello">
<el-container>
<el-header>
<div class="header_title">ShowDoc</div>
<div class="header_title">helpoxzn</div>
<router-link class="goback" to="/item/index">{{$t('goback')}}</router-link>
</el-header>
<el-container>

2
web_src/src/components/admin/attachment/Index.vue

@ -27,7 +27,7 @@
<el-table-column prop="visit_times" :label="$t('visit_times')"></el-table-column>
<el-table-column prop="username" :label="$t('uploader')"></el-table-column>
<el-table-column prop="addtime" :label="$t('add_time')" width="160"></el-table-column>
<el-table-column prop :label="operation">
<el-table-column prop :label="$t('operation')">
<template slot-scope="scope">
<el-button @click="visit(scope.row)" type="text" size="small">{{$t('visit')}}</el-button>
<el-button @click="delete_row(scope.row)" type="text" size="small">{{$t('delete')}}</el-button>

7
web_src/src/components/admin/setting/Index.vue

@ -85,6 +85,7 @@
<div v-if="form.oss_open" style="margin-left:50px">
<el-form-item :label="$t('oss_server')">
<el-select v-model="form.oss_setting.oss_type">
<el-option :label="$t('tencent')" value="tencent"></el-option>
<el-option :label="$t('aliyun')" value="aliyun"></el-option>
<el-option :label="$t('qiniu')" value="qiniu"></el-option>
</el-select>
@ -98,6 +99,10 @@
<el-input v-model="form.oss_setting.secret" class="form-el"></el-input>
</el-form-item>
<el-form-item label="region" v-if="form.oss_setting.oss_type == 'tencent'">
<el-input v-model="form.oss_setting.region" class="form-el"></el-input>
</el-form-item>
<el-form-item label="endpoint" v-if="form.oss_setting.oss_type == 'aliyun'">
<el-input v-model="form.oss_setting.endpoint" class="form-el"></el-input>
</el-form-item>
@ -150,7 +155,7 @@ export default {
home_item: '',
oss_open: false,
oss_setting: {
oss_type: 'aliyun',
oss_type: 'tencent',
key: '',
secret: '',
endpoint: '',

18
web_src/src/components/admin/user/Index.vue

@ -38,7 +38,12 @@
></el-pagination>
</div>
<el-dialog :visible.sync="dialogAddVisible" :close-on-click-modal="false" width="300px">
<el-dialog
:visible.sync="dialogAddVisible"
:before-close="resetForm"
:close-on-click-modal="false"
width="300px"
>
<el-form>
<el-form-item label>
<el-input
@ -61,7 +66,7 @@
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogAddVisible = false">{{$t('cancel')}}</el-button>
<el-button @click="resetForm">{{$t('cancel')}}</el-button>
<el-button type="primary" @click="add_user">{{$t('confirm')}}</el-button>
</div>
</el-dialog>
@ -191,6 +196,15 @@ export default {
.catch(function(error) {
console.log(error)
})
},
resetForm() {
this.addForm = {
uid: 0,
name: '',
username: '',
password: ''
}
this.dialogAddVisible = false
}
},
mounted() {

24
web_src/src/components/attachment/Index.vue

@ -21,6 +21,17 @@
<el-form-item>
<el-button @click="onSubmit">{{$t('search')}}</el-button>
</el-form-item>
<el-form-item>
<el-upload
class="upload-file"
:action="uploadUrl"
:on-success="uploadCallback"
:on-error="uploadCallback"
ref="uploadFile"
>
<el-button>{{$t('upload')}}</el-button>
</el-upload>
</el-form-item>
</el-form>
<P>{{$t('accumulated_used_sapce')}} {{used}}M , {{$t('month_flow')}} {{used_flow}}M</P>
<el-table :data="dataList" style="width: 100%">
@ -30,7 +41,7 @@
<el-table-column prop="file_size_m" :label="$t('file_size_m')" width="160"></el-table-column>
<el-table-column prop="visit_times" :label="$t('visit_times')"></el-table-column>
<el-table-column prop="addtime" :label="$t('add_time')" width="160"></el-table-column>
<el-table-column prop :label="operation">
<el-table-column prop :label="$t('operation')">
<template slot-scope="scope">
<el-button @click="visit(scope.row)" type="text" size="small">{{$t('visit')}}</el-button>
<el-button @click="delete_row(scope.row)" type="text" size="small">{{$t('delete')}}</el-button>
@ -69,7 +80,8 @@ export default {
positive_type: '1',
attachment_type: '-1',
used: 0,
used_flow: 0
used_flow: 0,
uploadUrl: DocConfig.server + '/api/page/upload'
}
},
methods: {
@ -120,6 +132,14 @@ export default {
},
goback() {
this.$router.push({ path: '/item/index' })
},
uploadCallback(data) {
if (data.error_message) {
this.$alert(data.error_message)
}
let childRef = this.$refs.uploadFile //
childRef.clearFiles()
this.getList()
}
},

84
web_src/src/components/catalog/Index.vue

@ -148,14 +148,11 @@ export default {
methods: {
get_catalog() {
var that = this
var url = DocConfig.server + '/api/catalog/catListGroup'
var params = new URLSearchParams()
params.append('item_id', that.$route.params.item_id)
that.axios
.post(url, params)
.then(function(response) {
if (response.data.error_code === 0) {
var Info = response.data.data
this.request('/api/catalog/catListGroup', {
item_id: this.$route.params.item_id
})
.then(data => {
var Info = data.data
that.catalogs = Info
that.treeData = []
var duang = function(Info) {
@ -172,37 +169,20 @@ export default {
return treeData
}
that.treeData = duang(Info)
} else {
that.$alert(response.data.error_message)
}
})
.catch(function(error) {
console.log(error)
})
},
MyFormSubmit() {
var that = this
var url = DocConfig.server + '/api/catalog/save'
var params = new URLSearchParams()
params.append('item_id', that.$route.params.item_id)
params.append('cat_id', this.MyForm.cat_id)
params.append('parent_cat_id', this.MyForm.parent_cat_id)
params.append('cat_name', this.MyForm.cat_name)
that.axios
.post(url, params)
.then(function(response) {
if (response.data.error_code === 0) {
this.request('/api/catalog/save', {
item_id: this.$route.params.item_id,
cat_id: this.MyForm.cat_id,
parent_cat_id: this.MyForm.parent_cat_id,
cat_name: this.MyForm.cat_name
})
.then(data => {
that.dialogFormVisible = false
that.get_catalog()
that.MyForm = []
} else {
that.$alert(response.data.error_message)
}
})
.catch(function(error) {
console.log(error)
})
},
edit(node, data) {
@ -218,26 +198,29 @@ export default {
delete_cat(node, data) {
var that = this
var cat_id = data.id
var url = DocConfig.server + '/api/catalog/delete'
this.$confirm(that.$t('confirm_cat_delete'), ' ', {
confirmButtonText: that.$t('confirm'),
cancelButtonText: that.$t('cancel'),
type: 'warning'
}).then(() => {
var params = new URLSearchParams()
params.append('item_id', that.$route.params.item_id)
params.append('cat_id', cat_id)
that.axios.post(url, params).then(function(response) {
if (response.data.error_code === 0) {
that.get_catalog()
} else {
that.$alert(response.data.error_message)
}
this.request('/api/catalog/delete', {
item_id: this.$route.params.item_id,
cat_id: cat_id
})
.then(data => {
this.get_catalog()
})
})
},
resetForm() {
this.MyForm = {
cat_id: 0,
parent_cat_id: '',
cat_name: '',
s_number: ''
}
},
add_cat(node, data) {
if (node && data.id) {
this.MyForm = {
@ -246,7 +229,7 @@ export default {
cat_name: ''
}
} else {
this.MyForm = {}
this.resetForm()
}
this.dialogFormVisible = true
@ -256,17 +239,10 @@ export default {
this.$router.push({ path: url })
},
handleDragEnd(node1, node2, position, evt) {
var that = this
let treeData2 = this.dimensionReduction(this.treeData)
var url = DocConfig.server + '/api/catalog/batUpdate'
var params = new URLSearchParams()
params.append('item_id', that.$route.params.item_id)
params.append('cats', JSON.stringify(treeData2))
that.axios.post(url, params).then(response => {
if (response.data.error_code === 0) {
} else {
that.$alert(response.data.error_message)
}
this.request('/api/catalog/batUpdate', {
item_id: this.$route.params.item_id,
cats: JSON.stringify(treeData2)
})
},
//

118
web_src/src/components/common/Mock.vue

@ -0,0 +1,118 @@
<template>
<div>
<el-dialog title="Mock" :visible="true" :close-on-click-modal="false" @close="callback()">
<el-form>
<p v-if="mock_url" style=" margin-bottom:20px;font-size: 16px">
Mock地址 :
<code>{{mock_url}}</code>
<i class="el-icon-document-copy" v-clipboard:copy="mock_url" v-clipboard:success="onCopy"></i>
&nbsp;
<el-button @click="callback(mock_url)" type="text">把地址插入文档中</el-button>
</p>
<el-input
type="textarea"
class="dialoContent"
placeholder="这里填写的是Mock接口的返回结果。你可以直接编辑/粘贴一段json字符串,支持使用MockJs语法(关于MockJs语法,可以查看下方的帮助说明按钮)。输入完毕后,点击保存,就会自动生成Mock地址"
:rows="20"
v-model="content"
></el-input>
<p>
<el-button type="primary" @click="handleClick">{{$t('save')}}</el-button>&nbsp;
<el-tooltip
class="item"
effect="dark"
content="假如上面填写的是一段符合json语法的字符串,点此按钮可以对json字符串进行快速格式化(美化)"
placement="top"
>
<el-button @click="beautifyJson">json快速美化</el-button>
</el-tooltip>&nbsp;
&nbsp;
<a
href="https://www.showdoc.com.cn/p/d952ed6b7b5fb454df13dce74d1b41f8"
target="_blank"
>帮助说明</a>
</p>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="callback()">{{$t('goback')}}</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { unescapeHTML } from '@/models/page'
export default {
name: 'JsonBeautify',
props: {
formLabelWidth: '120px',
callback: '',
page_id: ''
},
data() {
return {
content: '',
json_table_data: '',
mock_url: ''
}
},
methods: {
add() {
this.request('/api/mock/add', {
'page_id': this.page_id,
'template': this.content
}).then((data) => {
this.$message({
showClose: true,
message: '保存成功',
type: 'success'
})
this.mock_url = this.getUrl(data.data.unique_key)
})
},
infoByPageId() {
if (this.page_id <= 0) {
this.$alert('请先保存页面')
this.callback()
return
}
this.request('/api/mock/infoByPageId', {
'page_id': this.page_id
}).then((data) => {
if (data.data && data.data.unique_key && data.data.template) {
this.mock_url = this.getUrl(data.data.unique_key)
this.content = unescapeHTML(data.data.template)
}
})
},
getUrl(unique_key) {
if (DocConfig.server.indexOf('web') > -1) {
let server = window.location.protocol + '//' + window.location.host + window.location.pathname + 'index.php?s='
server = server.replace(/\/web/g, '/server')
return server + '/mock-data/' + unique_key
} else {
return window.location.protocol + '//' + window.location.host + '/server/index.php?s=' + '/mock-data/' + unique_key
}
},
handleClick() {
this.add()
},
beautifyJson() {
this.content = this.formatJson(this.content)
},
onCopy() {
this.$message(this.$t('copy_success'))
}
},
mounted() {
this.infoByPageId()
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.el-icon-document-copy {
cursor: pointer;
}
</style>

86
web_src/src/components/common/OxFooter.vue

@ -0,0 +1,86 @@
<template>
<div>
<div class="contactBox">
<div class="wrapperBox">
<div class="leftBox">
<div class="enText">
GET IN TOUCH
</div>
<div class="desc">
联系电话: 020-22102214 <br>
广州地址:广州市白云区学山塘街66号世联空间D2栋5楼<br>
深圳地址:深圳市南山区蛇街道科苑南路三湘海尚E座10D<br>
上海地址:上海市虹区汶水东路29号榕辉大厦802室<br>
</div>
</div>
<div class="rightBox">
<div class="enText">
FOLLOW US
</div>
<div class="item">
<img src="static/images/code.png" alt=""> 体验公众号
</div>
<div class="item">
<img src="static/images/mini.png" alt=""> 体验小程序
</div>
</div>
</div>
</div>
<div class="linksBox">
<div class="wrapperBox">
<div class="links">
<div class="leftBox">
<h3>快速入口</h3>
<ul>
<li><a href="javascript:;">申请试用</a></li>
<li><a href="javascript:;">产品介绍</a></li>
<li><a href="javascript:;">帮助中心</a></li>
<li><a href="javascript:;">登录注册</a></li>
<li><a href="javascript:;">合作伙伴</a></li>
</ul>
</div>
<div class="rightBox">
<h3>合作产品</h3>
<ul>
<li><a href="javascript:;">欧轩互动</a></li>
<li><a href="javascript:;">晓法AI</a></li>
</ul>
</div>
</div>
<div class="linksBtm">
<a href="javascript:;">智能羽毛球馆</a>
<a href="javascript:;">智能体育馆</a>
<a href="javascript:;">无人体育馆</a>
</div>
<img class="rlogo" src="static/images/logo_b.png" alt="">
</div>
</div>
<div class="footer">
<div class="copyright">
<a href="javascript:;" target="_blank">欧轩智能场馆</a>
<span>广州欧轩网络科技有限公司版权所有</span>
<a href="https://beian.miit.gov.cn/" target="_blank">粤ICP备13086082号</a>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'oxFooter',
data() {
return {
msg: '尾部'
}
}
}
</script>
<style scoped src="@/../static/css/OxFooter.css"></style>
<!-- Add "scoped" attribute to limit CSS to this component only -->

288
web_src/src/components/common/OxHeader.vue

@ -0,0 +1,288 @@
<template>
<div class="header">
<div class="header-wrap">
<div class="logo">
<a href="/">
<img src="static/images/logo.png" />
</a>
</div>
<input type="checkbox" name id="mobile-menu-toggle" value />
<label class="gh" for="mobile-menu-toggle">
<span></span>
</label>
<div class="nav">
<ul>
<li><a>首页</a></li>
<li><a>产品介绍</a></li>
<li><a>案例展示</a></li>
<li><a>合作伙伴</a></li>
<li><a>新闻资讯</a></li>
<li class="active"><a>帮助中心</a></li>
<li><a>登录 / 注册</a></li>
</ul>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'OxHeader',
data() {
return {
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
/*reset*/
html{-webkit-text-size-adjust:none; /*解决chrome浏览器下字体不能小于12px*/}
body{ color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif;}
a{outline:none; text-decoration:none;} a:hover{ text-decoration:underline;}
html{zoom:1;}html *{outline:0;zoom:1;} html button::-moz-focus-inner{border-color:transparent!important;}
body{overflow-x: hidden; font-size:12px;} body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}
a{ color:inherit; text-decoration: none;}
a:hover{ color:#3e6ed4; text-decoration: none;}
body{font-family: "Microsoft YaHei",sans-serif;}
/*手机下汉堡菜单*/
.gh {
height:34px;
width:34px;
margin-right:30px;
position:absolute;
right: 0; top: 14px;
transition: all 0.5s cubic-bezier(0.7, 0, 0.3, 1) 0s;
-webkit-transition: all 0.5s cubic-bezier(0.7, 0, 0.3, 1) 0s;
-ms-transition: all 0.5s cubic-bezier(0.7, 0, 0.3, 1) 0s;
cursor:pointer;
display: none;
}
.gh span {
background-color: #fff;
display: block;
height: 2px;
margin-top: -2px;
position: relative;
top: 50%;
transition: all 0.3s cubic-bezier(0.7, 0, 0.3, 1) 0s;
-webkit-transition: all 0.3s cubic-bezier(0.7, 0, 0.3, 1) 0s;
-ms-transition: all 0.3s cubic-bezier(0.7, 0, 0.3, 1) 0s;
width: 100%;
}
.gh span:after, .gh span:before {
background-color: #fff;
content: "";
display: block;
height: 2px;
left: 0;
position: absolute;
transition: all 0.3s cubic-bezier(0.7, 0, 0.3, 1) 0s;
-webkit-transition: all 0.3s cubic-bezier(0.7, 0, 0.3, 1) 0s;
-ms-transition: all 0.3s cubic-bezier(0.7, 0, 0.3, 1) 0s;
width:100%;
}
.gh span:after {
top:10px;
}
.gh span:before {
top:-10px;
}
#mobile-menu-toggle{
display: none;
}
#mobile-menu-toggle:checked + .gh span:after,
#mobile-menu-toggle:checked + .gh span:before {
top: 0;
}
#mobile-menu-toggle:checked + .gh span:before {
transform: translateY(0px) rotate(-45deg);
-webkit-transform: translateY(0px) rotate(-45deg);
-ms-transform: translateY(0px) rotate(-45deg);
}
#mobile-menu-toggle:checked + .gh span:after {
transform: translateY(0px) rotate(45deg);
-webkit-transform: translateY(0px) rotate(45deg);
-ms-transform: translateY(0px) rotate(45deg);
}
#mobile-menu-toggle:checked + .gh span {
background-color: transparent !important;
}
#mobile-menu-toggle:checked + .gh + .nav{
max-height: 1000px;
}
* {
box-sizing: border-box;
}
.body,
body,
select,
input,
view,
text,
button,
textarea {
font-family: 'PingFang SC', 'microsoft yahei', arial, 'helvetica neue', 'hiragino sans gb', sans-serif;
}
body,
.body {
font-size: 14px;
color: #fff;
background-color: #fff;
overflow-x: hidden;
line-height: 1.6;
}
a {
color: inherit;
}
a:hover {
color: inherit;
}
img {
max-width: 100%;
}
/*header*/
.header {
/*margin-top: 50px; position: absolute;*/
left: 0;
right: 0;
top: 0;
/**/
background: #009874;
position: fixed;
padding-top: 8px;
padding-bottom: 4px;
z-index: 99;
}
.header .logo {
margin-left: 60px;
float: left;
}
.header .logo img {
width: 189px;
}
.header .nav {
float: right;
margin-right: 60px;
font-weight: 400;
margin-top: 10px;
}
.header .nav li {
margin-left: 30px;
display: inline-block;
vertical-align: middle;
font-size: 14px;
position: relative;
}
.header .nav li.active a,
.header .nav li a:hover {
color: #000000;
}
.header .nav li.active::after {
position: absolute;
bottom: -18px;
left: 0;
width: 100%;
height: 4px;
content: '';
background: #000;
}
* {
margin: 0;
padding: 0;
-webkit-appearance: none;
/*去掉浏览器默认样式*/
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-touch-callout: none;
box-sizing: border-box;
}
body,
.body {
-webkit-text-size-adjust: 100%;
/*关闭自动调整字体*/
-webkit-overflow-scrolling: touch;
overflow-scrolling: touch;
}
/*pad*/
img {
max-width: 100%;
}
/* 平板--sm */
@media screen and (max-width:992px) {
.gh {
display: block;
}
.gh+.nav {
height: auto;
background: #fff;
overflow: hidden;
transition: 0.4s;
padding: 0;
max-height: 0;
margin-right: 0;
float: none;
width: 100%;
text-align: center;
}
.header .nav ul {
padding: 20px 0;
}
.header .nav li {
display: block;
margin-left: 0;
}
.nav a {
color: #000;
display: block;
padding: 10px 0;
}
.header .nav li.active::after {
display: none;
}
.header .nav li.active a,
.header .nav li a:hover {
color: #369FFF;
}
.header {
/*margin-top: 20px;*/
padding-top: 8px;
}
.header .logo {
margin-left: 20px;
}
}
</style>

44
web_src/src/components/item/export/Index.vue

@ -28,6 +28,7 @@
class="cat"
v-model="cat_id"
v-if="computed_catalogs"
@change="get_pages"
>
<el-option
v-for="cat in computed_catalogs "
@ -37,7 +38,16 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label v-if="export_format == 'word' && export_type == 2">
<el-select class="cat" v-model="page_id" v-if="pages">
<el-option
v-for="page in pages "
:key="page.page_title"
:label="page.page_title"
:value="page.page_id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label>
<el-button type="primary" style="width:100%;" @click="onSubmit">{{$t('begin_export')}}</el-button>
</el-form-item>
@ -63,7 +73,12 @@ export default {
cat_id: '',
export_type: '1',
item_id: 0,
export_format: 'word'
export_format: 'word',
pages: [
{ page_id: '0',
page_title: this.$t('all_pages')
}],
page_id: '0'
}
},
computed: {
@ -134,7 +149,7 @@ export default {
'/api/export/word&item_id=' +
this.item_id +
'&cat_id=' +
this.cat_id
this.cat_id + '&page_id=' + this.page_id
if (this.export_format == 'markdown') {
url = DocConfig.server + '/api/export/markdown&item_id=' + this.item_id
}
@ -142,6 +157,29 @@ export default {
},
goback() {
this.$router.go(-1)
},
//
get_pages(cat_id) {
var that = this
var url = DocConfig.server + '/api/catalog/getPagesBycat'
var params = new URLSearchParams()
params.append('item_id', this.item_id)
params.append('cat_id', cat_id)
that.axios
.post(url, params)
.then(function(response) {
if (response.data.error_code === 0) {
var pages = response.data.data
pages.unshift({
page_id: '0',
page_title: that.$t('all_pages')
})
that.pages = pages
that.page_id = '0'
} else {
that.$alert(response.data.error_message)
}
})
}
},
mounted() {

6
web_src/src/components/item/show/Index.vue

@ -70,7 +70,8 @@ export default {
json.ItemCreator = json.ItemPermn = false
}
that.item_info = json
document.title = that.item_info.item_name + '--ShowDoc'
that.$store.dispatch('changeItemInfo', json)
document.title = that.item_info.item_name + '--欧轩智能场馆'
if (json.unread_count > 0) {
that.$message({
showClose: true,
@ -103,6 +104,7 @@ export default {
},
search_item(keyword) {
this.item_info = ''
this.$store.dispatch('changeItemInfo', '')
this.keyword = keyword
this.get_item_menu(keyword)
},
@ -117,7 +119,7 @@ export default {
},
beforeDestroy() {
this.$message.closeAll()
document.title = 'ShowDoc'
document.title = '欧轩智能场馆'
}
}
</script>

15
web_src/src/components/item/show/show_regular_item/Index.vue

@ -30,15 +30,12 @@
v-show="showfullPageBtn"
@click="clickFullPage"
></i>
<el-badge
:value="attachment_count"
class="item"
<i
class="el-icon-upload item"
id="attachment"
v-if="attachment_count"
@click.native="ShowAttachment"
>
<i class="el-icon-upload"></i>
</el-badge>
@click="ShowAttachment"
></i>
</div>
<div id="doc-body">
<div id="page_md_content" class="page_content_main">
@ -127,7 +124,7 @@ export default {
}, 'post', false).then((data) => {
// loading.close();
if (data.error_code === 0) {
that.content = rederPageContent(data.data.page_content)
that.content = rederPageContent(data.data.page_content, that.$store.state.item_info.global_param)
that.page_title = data.data.page_title
that.page_info = data.data
@ -142,7 +139,7 @@ export default {
that.page_id = page_id
//
document.body.scrollTop = document.documentElement.scrollTop = 0
document.title = that.page_title + '--ShowDoc'
document.title = that.page_title + '--欧轩智能场馆'
})
} else {
// that.$alert(data.error_message);

10
web_src/src/components/item/show/show_regular_item/LeftMenu.vue

@ -40,7 +40,7 @@
<template v-if="menu.pages && menu.pages.length ">
<el-menu-item v-for="(page ) in menu.pages" :index="page.page_id" :key="page.page_id">
<i class="el-icon-document"></i>
<span :title="page.page_title">{{page.page_title}}</span>
<span :title="page.page_title" :id="'left_page_'+page.page_id">{{page.page_title}}</span>
</el-menu-item>
</template>
@ -93,6 +93,9 @@ export default {
// url
change_url(page_id) {
if (page_id > 0 && page_id == this.$route.query.page_id) {
return
}
var domain = this.item_info.item_domain
? this.item_info.item_domain
: this.item_info.item_id
@ -149,6 +152,11 @@ export default {
} else if (item_info.default_cat_id2) {
that.openeds = [item_info.default_cat_id2, item_info.default_page_id]
}
//
setTimeout(() => {
const element = document.querySelector('#left_page_' + item_info.default_page_id)
element.scrollIntoView()
}, 1000)
}
//

2
web_src/src/components/item/show/show_regular_item/LeftMenuSub.vue

@ -14,7 +14,7 @@
:key="page3.page_id"
>
<i class="el-icon-document"></i>
<span :title="page3.page_title">{{page3.page_title}}</span>
<span :title="page3.page_title" :id="'left_page_'+page3.page_id">{{page3.page_title}}</span>
</el-menu-item>
</template>

21
web_src/src/components/item/show/show_regular_item/OpBar.vue

@ -37,8 +37,8 @@
<i class="el-icon-user"></i>
</router-link>
</el-tooltip>
<el-tooltip class="item" effect="dark" :content="$t('detail')" placement="top">
<i class="el-icon-info" @click="show_page_info"></i>
<el-tooltip class="item" effect="dark" :content="$t('history_version')" placement="top">
<i class="el-icon-goods" @click="ShowHistoryVersion"></i>
</el-tooltip>
<el-tooltip
class="item"
@ -159,7 +159,7 @@
<div v-show="item_info.ItemPermn">
<el-checkbox
v-model="isCreateSiglePage"
@change="CreateSiglePage"
@change="checkCreateSiglePage"
>{{$t('create_sigle_page')}}</el-checkbox>
<p v-if="isCreateSiglePage">
@ -338,6 +338,21 @@ export default {
onCopy() {
this.$message(this.$t('copy_success'))
},
checkCreateSiglePage(newvalue) {
if (newvalue) {
this.CreateSiglePage()
} else {
this.$confirm(this.$t('cancelSingle'), ' ', {
confirmButtonText: this.$t('cancelSingleYes'),
cancelButtonText: this.$t('cancelSingleNo'),
type: 'warning'
}).then(() => {
this.CreateSiglePage()
}, () => {
this.isCreateSiglePage = true
})
}
},
CreateSiglePage() {
var page_id = this.page_id > 0 ? this.page_id : 0
var that = this

2
web_src/src/components/item/show/show_single_page_item/Index.vue

@ -226,7 +226,7 @@ export default {
encodeURIComponent(this.share_item_link)
this.dialogVisible = true
this.copyText =
this.item_info.item_name + ' -- ShowDoc \r\n' + this.share_item_link
this.item_info.item_name + ' -- 欧轩智能场馆 \r\n' + this.share_item_link
},
AdaptToMobile() {
var doc_container = document.getElementById('doc-container')

4
web_src/src/components/item/show/show_table_item/Index.vue

@ -139,7 +139,7 @@ export default {
}[tag] || tag)
)
objData = JSON.parse(
unescapeHTML(decodeURIComponent(response.data.page_content))
unescapeHTML(response.data.page_content)
)
} catch (error) {
objData = {}
@ -181,7 +181,7 @@ export default {
encodeURIComponent(this.share_item_link)
this.dialogVisible = true
this.copyText =
this.item_info.item_name + ' -- ShowDoc \r\n' + this.share_item_link
this.item_info.item_name + ' -- 欧轩智能场馆 \r\n' + this.share_item_link
},
onCopy() {
this.$message(this.$t('copy_success'))

33
web_src/src/components/page/edit/AttachmentList.vue

@ -9,18 +9,25 @@
:visible.sync="dialogTableVisible"
:close-on-click-modal="false"
>
<el-form :inline="true" class="demo-form-inline">
<el-form-item>
<el-button @click="showFilehub">{{$t('from_file_gub')}}</el-button>
</el-form-item>
<el-form-item>
<el-upload
class="upload-file"
:action="uploadUrl"
:on-success="clearFiles"
:on-error="clearFiles"
:on-success="uploadCallback"
:on-error="uploadCallback"
:data="uploadData"
ref="uploadFile"
v-if="manage"
>
<el-button size="small" type="primary">{{$t('upload_file')}}</el-button>
<el-button>{{$t('upload')}}</el-button>
<small>&nbsp;&nbsp;&nbsp;{{$t('file_size_tips')}}</small>
</el-upload>
</el-form-item>
</el-form>
<el-table :data="content">
<el-table-column property="addtime" :label="$t('add_time')" width="170"></el-table-column>
@ -49,6 +56,7 @@
</el-table>
</el-dialog>
</el-container>
<filehub :callback="get_content" :item_id="item_id" :page_id="page_id" ref="filehub"></filehub>
<Footer></Footer>
<div class></div>
</div>
@ -58,6 +66,7 @@
</style>
<script>
import filehub from '@/components/page/edit/Filehub'
export default {
props: {
callback: '',
@ -73,7 +82,9 @@ export default {
uploadUrl: DocConfig.server + '/api/page/upload'
}
},
components: {},
components: {
filehub
},
computed: {
uploadData: function() {
return {
@ -119,6 +130,7 @@ export default {
var url = DocConfig.server + '/api/page/deleteUploadFile'
var params = new URLSearchParams()
params.append('file_id', file_id)
params.append('page_id', that.page_id)
that.axios.post(url, params).then(function(response) {
if (response.data.error_code === 0) {
that.get_content()
@ -144,6 +156,19 @@ export default {
'")'
this.callback(val)
this.dialogTableVisible = false
},
uploadCallback(data) {
if (data.error_message) {
this.$alert(data.error_message)
}
let childRef = this.$refs.uploadFile //
childRef.clearFiles()
this.get_content()
},
//
showFilehub() {
let childRef = this.$refs.filehub //
childRef.show()
}
},
mounted() {}

174
web_src/src/components/page/edit/Filehub.vue

@ -0,0 +1,174 @@
<!-- 附件 -->
<template>
<div class="hello">
<Header></Header>
<el-container class="container-narrow">
<el-dialog
:title="$t('file_gub')"
:visible.sync="dialogTableVisible"
:close-on-click-modal="false"
width="65%"
>
<el-form :inline="true" class="demo-form-inline">
<el-form-item label>
<el-input v-model="display_name" :placeholder="$t('display_name')"></el-input>
</el-form-item>
<el-form-item label>
<el-select v-model="attachment_type" placeholder>
<el-option :label="$t('all_attachment_type')" value="-1"></el-option>
<el-option :label="$t('image')" value="1"></el-option>
<el-option :label="$t('general_attachment')" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="onSubmit">{{$t('search')}}</el-button>
</el-form-item>
<el-form-item>
<el-upload
class="upload-file"
:action="uploadUrl"
:on-success="uploadCallback"
:on-error="uploadCallback"
ref="uploadFile"
>
<el-button>{{$t('upload')}}</el-button>
</el-upload>
</el-form-item>
</el-form>
<P>{{$t('accumulated_used_sapce')}} {{used}}M , {{$t('month_flow')}} {{used_flow}}M</P>
<el-table :data="dataList" style="width: 100%">
<el-table-column prop="file_id" :label="$t('file_id')"></el-table-column>
<el-table-column prop="display_name" :label="$t('display_name')"></el-table-column>
<el-table-column prop="file_type" :label="$t('file_type')" width="160"></el-table-column>
<el-table-column prop="file_size_m" :label="$t('file_size_m')" width="160"></el-table-column>
<el-table-column prop="visit_times" :label="$t('visit_times')"></el-table-column>
<el-table-column prop="addtime" :label="$t('add_time')" width="160"></el-table-column>
<el-table-column prop :label="$t('operation')">
<template slot-scope="scope">
<el-button @click="select(scope.row)" type="text" size="small">{{$t('select')}}</el-button>
<el-button @click="visit(scope.row)" type="text" size="small">{{$t('visit')}}</el-button>
<el-button @click="delete_row(scope.row)" type="text" size="small">{{$t('delete')}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="block">
<span class="demonstration"></span>
<el-pagination
@current-change="handleCurrentChange"
:page-size="count"
layout="total, prev, pager, next"
:total="total"
></el-pagination>
</div>
</el-dialog>
</el-container>
<Footer></Footer>
<div class></div>
</div>
</template>
<style>
</style>
<script>
export default {
props: {
callback: '',
page_id: '',
item_id: '',
manage: true
},
data() {
return {
dialogTableVisible: false,
page: 1,
count: 5,
display_name: '',
username: '',
dataList: [],
total: 0,
positive_type: '1',
attachment_type: '-1',
used: 0,
used_flow: 0,
uploadUrl: DocConfig.server + '/api/page/upload'
}
},
components: {},
computed: {
uploadData: function() {
return {
page_id: this.page_id,
item_id: this.item_id
}
}
},
methods: {
getList() {
this.request('/api/attachment/getMyList', {
page: this.page,
count: this.count,
attachment_type: this.attachment_type,
display_name: this.display_name,
username: this.username
}).then(data => {
var json = data.data
this.dataList = json.list
this.total = parseInt(json.total)
this.used = json.used_m
this.used_flow = json.used_flow_m
})
},
show() {
this.dialogTableVisible = true
this.getList()
},
handleCurrentChange(currentPage) {
this.page = currentPage
this.getList()
},
onSubmit() {
this.page = 1
this.getList()
},
visit(row) {
window.open(row.url)
},
delete_row(row) {
this.$confirm(this.$t('confirm_delete'), ' ', {
confirmButtonText: this.$t('confirm'),
cancelButtonText: this.$t('cancel'),
type: 'warning'
}).then(() => {
this.request('/api/attachment/deleteMyAttachment', {
file_id: row.file_id
}).then(data => {
this.$message.success(this.$t('op_success'))
this.getList()
})
})
},
uploadCallback(data) {
if (data.error_message) {
this.$alert(data.error_message)
}
let childRef = this.$refs.uploadFile //
childRef.clearFiles()
this.getList()
},
select(row) {
this.request('/api/attachment/bindingPage', {
file_id: row.file_id,
page_id: this.page_id
}).then(data => {
this.dialogTableVisible = false
this.callback()
})
}
},
mounted() {}
}
</script>

36
web_src/src/components/page/edit/Index.vue

@ -82,7 +82,13 @@
<el-dropdown-item @click.native="ShowPasteTable">{{$t('paste_insert_table')}}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button type size="medium" @click="ShowRunApi">{{$t('http_test_api')}}</el-button>
<el-button v-if="lang =='zh-cn'" type size="medium" @click="showMockDialog = true">Mock</el-button>
<el-button
v-if="lang =='zh-cn'"
type
size="medium"
@click="ShowRunApi"
>{{$t('http_test_api')}}</el-button>
<el-badge :value="attachment_count" class="item">
<el-button type size="medium" @click="ShowAttachment">{{$t('attachment')}}</el-button>
@ -131,6 +137,18 @@
:cat_id="cat_id"
ref="SortPage"
></SortPage>
<!-- mock -->
<Mock
:page_id="page_id"
v-if="showMockDialog"
:callback="(data)=>{
if(data){
insertValue(data);
}
showMockDialog = false;
}"
ref="Mock"
></Mock>
</el-container>
<Footer></Footer>
<div class></div>
@ -165,6 +183,7 @@
import Editormd from '@/components/common/Editormd'
import JsonToTable from '@/components/common/JsonToTable'
import JsonBeautify from '@/components/common/JsonBeautify'
import Mock from '@/components/common/Mock'
import TemplateList from '@/components/page/edit/TemplateList'
import HistoryVersion from '@/components/page/edit/HistoryVersion'
import AttachmentList from '@/components/page/edit/AttachmentList'
@ -194,7 +213,10 @@ export default {
attachment_count: '',
catalogs: [],
isLock: 0,
intervalId: 0
intervalId: 0,
saving: false,
showMockDialog: false,
lang: ''
}
},
computed: {
@ -240,7 +262,8 @@ export default {
HistoryVersion,
AttachmentList,
PasteTable,
SortPage
SortPage,
Mock
},
methods: {
//
@ -414,6 +437,10 @@ export default {
},
save(callback) {
var that = this
if (this.saving) {
return false
}
this.saving = true
var loading = that.$loading()
let childRef = this.$refs.Editormd
var content = childRef.getMarkdown()
@ -430,6 +457,7 @@ export default {
params.append('cat_id', cat_id)
that.axios.post(url, params).then(function(response) {
loading.close()
that.saving = false
if (response.data.error_code === 0) {
if (typeof callback == 'function') {
callback()
@ -457,6 +485,7 @@ export default {
//
setTimeout(() => {
loading.close()
that.saving = false
}, 20000)
},
goback() {
@ -676,6 +705,7 @@ export default {
this.remoteIsLock()
/** 监听粘贴上传图片 **/
document.addEventListener('paste', this.upload_paste_img)
this.lang = DocConfig.lang
},
beforeDestroy() {

4
web_src/src/main.js

@ -7,6 +7,8 @@ import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import Header from '@/components/common/Header'
import Footer from '@/components/common/Footer'
import OxFooter from '@/components/common/OxFooter'
import OxHeader from '@/components/common/OxHeader'
import util from '@/util.js'
import axios from '@/http'
import request from '@/request.js'
@ -24,6 +26,8 @@ Vue.use(util)
Vue.config.productionTip = false
Vue.component('Header', Header)
Vue.component('Footer', Footer)
Vue.component('OxFooter', OxFooter)
Vue.component('OxHeader', OxHeader)
Vue.use(ElementUI)
Vue.use(VueI18n)
Vue.use(VueClipboard)

137
web_src/src/models/page.js

@ -1,36 +1,71 @@
// 处理页面数据相关的逻辑
// 渲染来自runapi的文档
const rederPageContent = page_content => {
let obj;
// 先定义一个html反转义的函数
const unescapeHTML = str =>
// 定义一个html反转义的函数
const unescapeHTML = str =>
str.replace(
/&amp;|&lt;|&gt;|&#39;|&quot;/g,
tag =>
({
"&amp;": "&",
"&lt;": "<",
"&gt;": ">",
"&#39;": "'",
"&quot;": '"'
'&amp;': '&',
'&lt;': '<',
'&gt;': '>',
'&#39;': "'",
'&quot;': '"'
}[tag] || tag)
);
page_content = unescapeHTML(page_content);
)
// 渲染来自runapi的文档
const rederPageContent = (page_content, globalParams = {}) => {
let obj
page_content = unescapeHTML(page_content)
try {
obj = JSON.parse(page_content);
obj = JSON.parse(page_content)
} catch (e) {
// console.log(`不支持解析的页面内容:${page_content}`);
}
if (!obj || !obj.info || !obj.info.url) {
return page_content;
return page_content
}
// console.log(obj)
// 判断有没有全局参数,有的话加上。
if (globalParams) {
// 全局query
if (
obj.info.method == 'get' &&
globalParams.query &&
globalParams.query[0] &&
globalParams.query[0].name
) {
globalParams.query.map((element) => {
obj.request.params[obj.request.params.mode].unshift(element)
})
}
// 全局body
if (
obj.info.method != 'get' &&
obj.request.params.mode != 'json' &&
globalParams.body &&
globalParams.body[0] &&
globalParams.body[0].name
) {
globalParams.body.map((element) => {
obj.request.params[obj.request.params.mode].unshift(element)
})
}
// 全局header
if (globalParams.header && globalParams.header[0] && globalParams.header[0].name) {
globalParams.header.map((element) => {
obj.request.headers.unshift(element)
})
}
console.log(obj);
} // 全局参数处理完毕
let newContent = `
[TOC]
##### 简要描述
- ${obj.info.description ? obj.info.description : "无"}
- ${obj.info.description ? obj.info.description : '无'}
##### 请求URL
@ -38,7 +73,7 @@ const rederPageContent = page_content => {
##### 请求方式
- ${obj.info.method}
`;
`
if (
obj.request.headers &&
@ -50,16 +85,18 @@ const rederPageContent = page_content => {
|header|必选|类型|说明|
|:----- |:-----|-----|
`;
const headers = obj.request.headers;
`
const headers = obj.request.headers
headers.map(one => {
newContent += `|${one.name} |${one.require > 0 ? "是" : "否"} |${
// 如果名字为空,或者存在禁用的key且禁用状态生效中,则终止本条参数
if (!one.name || (one.disable && one.disable >= 1)) return
newContent += `|${one.name} |${one.require > 0 ? '是' : '否'} |${
one.type
} |${one.remark ? one.remark : "无"} |
`;
});
} |${one.remark ? one.remark : '无'} |
`
})
}
const params = obj.request.params[obj.request.params.mode];
const params = obj.request.params[obj.request.params.mode]
if (params && params[0] && params[0].name) {
newContent += `
@ -67,40 +104,43 @@ const rederPageContent = page_content => {
|参数名|必选|类型|说明|
|:----- |:-----|-----|
`;
`
params.map(one => {
newContent += `|${one.name} |${one.require > 0 ? "是" : "否"} |${
// 如果名字为空,或者存在禁用的key且禁用状态生效中,则终止本条参数
if (!one.name || (one.disable && one.disable >= 1)) return
newContent += `|${one.name} |${one.require > 0 ? '是' : '否'} |${
one.type
} |${one.remark ? one.remark : "无"} |
`;
});
} |${one.remark ? one.remark : '无'} |
`
})
}
if (obj.request.params.mode == "json" && params) {
if (obj.request.params.mode == 'json' && params) {
newContent += `
##### 请求参数示例
\`\`\`
${params}
\`\`\`
`;
`
}
const jsonDesc = obj.request.params.jsonDesc;
const jsonDesc = obj.request.params.jsonDesc
if ( obj.request.params.mode == "json" && jsonDesc && jsonDesc[0] && jsonDesc[0].name) {
if (obj.request.params.mode == 'json' && jsonDesc && jsonDesc[0] && jsonDesc[0].name) {
newContent += `
##### json字段说明
|字段名|必选|类型|说明|
|:----- |:-----|-----|
`;
`
jsonDesc.map(one => {
newContent += `|${one.name} |${one.require > 0 ? "是" : "否"} |${
if (!one.name) return
newContent += `|${one.name} |${one.require > 0 ? '是' : '否'} |${
one.type
} |${one.remark ? one.remark : "无"} |
`;
});
} |${one.remark ? one.remark : '无'} |
`
})
}
if (obj.response.responseExample) {
@ -109,7 +149,7 @@ ${params}
\`\`\`
${obj.response.responseExample}
\`\`\`
`;
`
}
if (
@ -122,14 +162,15 @@ ${obj.response.responseExample}
|参数名|类型|说明|
|:----- |:-----|-----|
`;
const returnParams = obj.response.responseParamsDesc;
`
const returnParams = obj.response.responseParamsDesc
returnParams.map(one => {
if (!one.name) return
newContent += `|${one.name} |${one.type} |${
one.remark ? one.remark : "无"
one.remark ? one.remark : '无'
} |
`;
});
`
})
}
newContent += `
@ -137,9 +178,9 @@ ${obj.response.responseExample}
${obj.info.remark}
`;
`
return newContent;
};
return newContent
}
export { rederPageContent };
export { rederPageContent, unescapeHTML }

8
web_src/src/store/actions.js

@ -1,8 +1,14 @@
// action比mutation的好处是可以任意异步
// action比mutation的好处是可以任意异步。本来mutation只能同步。现在通过action封装,可以任意异步操作数据
export default {
incrementAsync({ commit }) {
setTimeout(() => {
commit('increment')
}, 1000)
},
changeItemInfo(ctx, val) {
// console.log(val) //val是dispatch派发传递过来的值
// console.log(ctx) //ctx是上下文,必传
ctx.commit('changeItemInfo', val)// commit到mutation
}
}

5
web_src/src/store/index.js

@ -2,13 +2,10 @@ import Vue from 'vue'
import Vuex from 'vuex'
import mutations from './mutations'
import actions from './actions'
import state from './state'
Vue.use(Vuex)
const state = {
count: '1'
}
export default new Vuex.Store({
state,
actions,

3
web_src/src/store/mutations.js

@ -5,6 +5,9 @@ export default {
increment(state, payload) {
state.count++
},
changeItemInfo(state, val) {
state.item_info = val
},
[SOME_MUTATION](state) {
// mutate state
}

7
web_src/src/store/state.js

@ -0,0 +1,7 @@
const state = {
count: '1',
item_info: {}
}
export default state

92
web_src/src/util.js

@ -1,60 +1,82 @@
//全局函数/变量
export default{
install(Vue,options)
{
// 全局函数/变量
export default {
install(Vue, options) {
Vue.prototype.getData = function () {
console.log('我是插件中的方法');
console.log('我是插件中的方法')
}
//Vue.prototype.DocConfig = {
// Vue.prototype.DocConfig = {
// "server":'http://127.0.0.1/showdoc.cc/server/index.php?s=',
//"server":'../server/index.php?s=',
//}
Vue.prototype.request = function(){
// "server":'../server/index.php?s=',
// }
Vue.prototype.request = function () {
}
Vue.prototype.getRootPath = function(){
return window.location.protocol +'//' +window.location.host + window.location.pathname
Vue.prototype.getRootPath = function () {
return window.location.protocol + '//' + window.location.host + window.location.pathname
}
/*判断是否是移动设备*/
Vue.prototype.isMobile = function (){
return navigator.userAgent.match(/iPhone|iPad|iPod|Android|android|BlackBerry|IEMobile/i) ? true : false;
/* 判断是否是移动设备 */
Vue.prototype.isMobile = function () {
return !!navigator.userAgent.match(/iPhone|iPad|iPod|Android|android|BlackBerry|IEMobile/i)
}
Vue.prototype.get_user_info = function(callback){
var that = this ;
var url = DocConfig.server+'/api/user/info';
var params = new URLSearchParams();
params.append('redirect_login', false);
Vue.prototype.get_user_info = function (callback) {
var that = this
var url = DocConfig.server + '/api/user/info'
var params = new URLSearchParams()
params.append('redirect_login', false)
that.axios.post(url, params)
.then(function (response) {
if (callback) {callback(response);};
});
if (callback) { callback(response) };
})
}
Vue.prototype.get_notice = function(callback){
var that = this ;
var url = DocConfig.server+'/api/notice/getList';
var params = new URLSearchParams();
params.append('notice_type', 'unread');
params.append('count', '1');
Vue.prototype.get_notice = function (callback) {
var that = this
var url = DocConfig.server + '/api/notice/getList'
var params = new URLSearchParams()
params.append('notice_type', 'unread')
params.append('count', '1')
that.axios.post(url, params)
.then(function (response) {
if (callback) {callback(response);};
});
if (callback) { callback(response) };
})
}
Vue.prototype.set_bg_grey = function(){
/*给body添加类,设置背景色*/
document.getElementsByTagName("body")[0].className="grey-bg";
Vue.prototype.set_bg_grey = function () {
/* 给body添加类,设置背景色 */
document.getElementsByTagName('body')[0].className = 'grey-bg'
}
Vue.prototype.unset_bg_grey = function(){
/*去掉添加的背景色*/
document.body.removeAttribute("class","grey-bg");
Vue.prototype.unset_bg_grey = function () {
/* 去掉添加的背景色 */
document.body.removeAttribute('class', 'grey-bg')
}
// json格式化与压缩
// compress=false的时候表示美化json,compress=true的时候表示将美化过的json压缩还原
Vue.prototype.formatJson = function (txt, compress = false) {
if (compress === false) {
try {
if (typeof txt === 'string') {
txt = JSON.parse(txt)
}
return JSON.stringify(txt, null, 2)
} catch (e) {
// 非json数据直接显示
return txt
}
}
// 将美化过的json压缩还原
try {
const obj = JSON.parse(txt);
return JSON.stringify(obj);
} catch (e) {
// 非json数据直接显示
return txt;
}
}
}
}

228
web_src/static/css/OxFooter.css

@ -0,0 +1,228 @@
/*reset*/
html{-webkit-text-size-adjust:none; /*解决chrome浏览器下字体不能小于12px*/}
body{ color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif;}
a{outline:none; text-decoration:none;} a:hover{ text-decoration:underline;}
html{zoom:1;}html *{outline:0;zoom:1;} html button::-moz-focus-inner{border-color:transparent!important;}
body{overflow-x: hidden; font-size:12px;} body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}
* {
margin: 0;
padding: 0;
-webkit-appearance: none;
/*去掉浏览器默认样式*/
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-touch-callout: none;
box-sizing: border-box;
}
body,
.body {
-webkit-text-size-adjust: 100%;
/*关闭自动调整字体*/
-webkit-overflow-scrolling: touch;
overflow-scrolling: touch;
}
/*pad*/
img {
max-width: 100%;
}
a {
color: inherit;
}
a:hover {
color: inherit;
}
.contactBox {
background: #5CCCB2;
}
.contactBox .wrapperBox {
width: 1200px;
overflow: hidden;
margin: 0 auto;
padding-top: 30px;
padding-bottom: 70px;
color: #000;
font-size: 16px;
line-height: 2;
}
.contactBox .wrapperBox>div {
float: left;
width: 50%;
}
.contactBox .desc {
margin-top: 20px;
}
.contactBox .rightBox {
overflow: hidden;
}
.contactBox .item {
width: 100px;
float: left;
text-align: center;
margin-right: 46px;
}
.contactBox .item img {
width: 100%;
display: block;
margin-bottom: 12px;
}
@font-face {
font-family: "unisans";
src: url("unisans.otf");
/* iOS 4.1- */
font-style: normal;
font-weight: normal;
}
.enText {
font-size: 60px;
font-weight: bold;
font-family: "unisans";
color: #000;
}
.linksBox{
background: #009874;
color: #000;
}
.linksBox .wrapperBox{
width: 1200px;
margin:0 auto;
position: relative;
padding-top: 60px;
padding-bottom: 60px;
}
.links{
overflow: hidden;
font-size: 16px;
margin-bottom: 55px;
}
.links > div{
width: 546px;
float: left;
}
.links h3{
font-size: 30px;
font-weight: bold;
margin-bottom: 30px;
}
.links li{
margin-bottom: 14px;
}
.linksBtm{
font-size: 20px;
}
.linksBtm a{
margin-right: 100px;
font-weight: bold;
}
.rlogo{
width:200px;
position: absolute;
right:0;
top:70px;
}
.footer {
font-size: 16px;
background: #000000;
}
.footer .copyright span {
margin: 0 180px;
}
.footer .copyright {
width: 1200px;
margin: 0 auto;
padding: 30px 0;
}
/* 平板--sm */
@media screen and (max-width:992px) {
.contactBox .wrapperBox{
width:100%;
padding: 20px 0;
font-size: 12px;
}
.enText{
font-size: 22px;
text-align: center;
}
.contactBox .wrapperBox>div{
float: none;
width:100%;
padding: 0 15px;
}
.rightBox .enText{
margin-top: 20px;
margin-bottom: 20px;
}
.contactBox .item{
width:50%;
margin-right: 0;
}
.contactBox .item img{
width: 100px;
margin:0 auto 15px;
}
.linksBox .wrapperBox{
width:100%;
padding: 20px 15px;
}
.rlogo{
display: none;
}
.links{
margin-bottom: 15px;
}
.links > div{
width: 100%;
float: none;
padding: 0;
text-align: center;
}
.links li{
margin:4px 5px ;
display: inline-block;
font-size: 14px;
}
.links h3{
font-size: 18px;
margin:10px 0;
}
.linksBtm{
font-size: 16px;
text-align: center;
}
.linksBtm a{
margin: 5px;
}
.footer .copyright{
width: 100%;
padding: 10px;
font-size: 12px;
text-align: center;
}
.footer .copyright span{
margin: 0;
}
.footer .copyright a:first-child{
display: block;
margin:0 auto 3px;
font-size: 14px;
}
}

82
web_src/static/css/qietu.css

@ -0,0 +1,82 @@
/*reset*/
html{-webkit-text-size-adjust:none; /*解决chrome浏览器下字体不能小于12px*/}
body{ color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif;}
a{outline:none; text-decoration:none;} a:hover{ text-decoration:underline;}
html{zoom:1;}html *{outline:0;zoom:1;} html button::-moz-focus-inner{border-color:transparent!important;}
body{overflow-x: hidden; font-size:12px;} body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;} table{/*border-collapse:collapse;border-spacing:0;*/} fieldset,a img{border:0;} address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:normal;} li{list-style:none;} caption,th{text-align:left;} h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;} q:before,q:after{content:'';}
input[type="submit"], input[type="reset"], input[type="button"], button { -webkit-appearance: none; /*去掉苹果的默认UI来渲染按钮*/} em,i{ font-style:normal;}
/*common*/
.clearfix:after {content:"."; display:block; height:0; clear:both; visibility:hidden; }.clearfix {display:block;}.clear{ clear:both;}
.colwrapper { overflow:hidden; zoom:1 /*for ie*/; margin:5px auto; }
.strong{ font-weight: bold;} .left{ float: left;} .right{ float: right;} .center{ margin:0 auto; text-align:center;}
.show{ display:block; visibility:visible;}.hide{ display: none; visibility:hidden;}
.block{ display:block;} .inline{ display:inline;}
.break{ word-wrap:break-word;overflow:hidden; /*word-break:break-all;*/}
.tal{ text-align:left} .tar{ text-align:right;}
/*文字两侧对齐*/
.justify {
text-align:justify;
text-justify:distribute-all-lines;/*ie6-8*/
text-align-last:justify;/* ie9*/
-moz-text-align-last:justify;/*ff*/
-webkit-text-align-last:justify;/*chrome 20+*/
}
.toe{
/*超出省略号*/
word-break:keep-all;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
@media screen and (-webkit-min-device-pixel-ratio:0){/* chrome*/
.justify:after{
content:".";
display: inline-block;
width:100%;
overflow:hidden;
height:0;
}
}
a{ color:inherit; text-decoration: none;}
a:hover{ color:#3e6ed4; text-decoration: none;}
body{font-family: "Microsoft YaHei",sans-serif;}
.css3{
/*transition: all 0.3s ease-in-out 0s;*/
-webkit-transform:translate3d(0, -20px, 0);
-ms-transform:translate3d(0, -20px, 0);
transform:translate3d(0, -20px, 0);
-webkit-transition-property:opacity, -webkit-transform;
transition-property:opacity, transform;
-webkit-transition-duration:1000ms;
transition-duration:1000ms;
-webkit-transition-timing-function:cubic-bezier(0.25, 0.46, 0.33, 0.98);
transition-timing-function:cubic-bezier(0.25, 0.46, 0.33, 0.98);
-webkit-transition-delay:800ms;
transition-delay:800ms
}
.css3.animated{
-webkit-transform:translate3d(0, 0, 0);
-ms-transform:translate3d(0, 0, 0);
transform:translate3d(0, 0, 0);
}
@media screen and (max-width: 650px) {
}
@media screen and (max-width: 480px) {
}

333
web_src/static/css/responsive.css

@ -0,0 +1,333 @@
* {
margin: 0;
padding: 0;
-webkit-appearance: none;
/*去掉浏览器默认样式*/
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-touch-callout: none;
box-sizing: border-box;
}
body,
.body {
-webkit-text-size-adjust: 100%;
/*关闭自动调整字体*/
-webkit-overflow-scrolling: touch;
overflow-scrolling: touch;
}
/*pad*/
img {
max-width: 100%;
}
input[type="submit"],
input[type="reset"],
input[type="button"],
button {
-webkit-appearance: none;
/*去掉苹果的默认UI来渲染按钮*/
}
@media only screen and (max-width:1480px) {
.wrapper {
width: 1240px;
}
.hbanner .wrapper {
background-size: 650px auto;
}
.hrow .txt h2 {
font-size: 36px;
}
.hrow .txt p {
font-size: 18px;
}
}
/* 电脑小屏--md */
@media screen and (max-width:1200px) {
.wrapper {
width: 1170px;
}
/*价格*/
.mprice-main .wrapper {
padding-left: 150px;
position: relative;
margin-right: 20px;
}
.mprice-main {
background-size: cover;
padding-bottom: 40px;
padding-top: 100px;
}
.mprice-main .itemwrap {
white-space: nowrap;
overflow-x: scroll;
padding-top: 80px;
}
.mprice-main .item {
float: none;
display: inline-block;
vertical-align: top;
width: 200px;
}
.mprice-main .item ul.tit {
padding-left: 20px;
}
.mprice-main .itemtit {
position: absolute;
left: 0;
top: 0;
}
.mprice-main .item .btn a {
width: 120px;
height: 45px;
line-height: 45px;
font-size: 14px;
}
.mprice-explain {
padding: 60px 0;
}
.mprice-explain .wrapper {
padding: 0 20px;
}
}
/* 平板--sm */
@media screen and (max-width:992px) {
.wrapper {
width: auto;
}
.hbanner .wrapper {
background-size: 300px auto;
background-position: center 100px;
padding-top: 400px;
height: auto;
padding-bottom: 100px;
}
.hbanner-txt .btns a {
width: auto;
min-width: 120px;
height: 45px;
line-height: 45px;
}
.hbanner-txt {
padding-left: 40px;
/*text-align: center;*/
}
.hbanner-txt h2 {
font-size: 24px;
}
.hbanner-txt .list li {
margin-bottom: 15px;
}
.hrow .img {
width: auto;
float: none;
text-align: center;
padding-top: 0;
}
.hrow {
height: auto !important;
padding-bottom: 100px;
padding-top: 100px;
}
.hrow .txt {
width: auto;
float: none;
padding-top: 40px;
}
.hrow .img>img {
max-width: 220px;
}
.hrow .txt h2 {
font-size: 24px;
margin-bottom: 20px;
}
.hrow .txt p {
font-size: 14px;
padding-bottom: 10px;
}
.hfoot {
padding-top: 100px;
height: auto;
padding-bottom: 120px;
background-size: cover;
}
.hfoot h2 {
font-size: 24px;
}
.hfoot h2 br {
display: block;
}
.hfoot .btn {
width: auto;
min-width: 120px;
height: 45px;
line-height: 45px;
}
/*下载*/
.downpage {
width: auto;
margin-left: 20px;
margin-right: 20px;
margin-top: 100px;
margin-bottom: 100px;
}
.downlist {
padding: 40px 0;
}
.downlist .body {
margin-top: 40px;
}
.downlist .body li {
display: block;
margin-bottom: 40px;
}
.downlist .body .btn a {
width: auto;
min-width: 120px;
height: 45px;
line-height: 45px;
font-size: 14px;
}
/*注册*/
.form-box {
width: auto;
margin-left: 20px;
margin-right: 20px;
margin-top: 150px;
margin-bottom: 100px;
}
.form {
padding: 20px;
padding-top: 70px;
}
.form-btns button {
height: 45px;
line-height: 45px;
font-size: 14px;
}
.form-list .text {
height: 45px;
}
.form-list .textcode+img {
height: 45px;
width: 100px;
}
/*帮助中心*/
.searchBox {
height: auto;
padding-top: 20px;
padding-bottom: 20px;
}
.searchBox .wrapperBox {
width: 100%;
padding: 0 15px;
}
.tip-text {
font-size: 18px;
}
.input-group {
height: 40px;
padding-left: 40px;
border-radius: 20px;
}
.input-group .btn {
font-size: 18px;
line-height: 36px;
width: 80px
}
.input-group>img {
width: 24px;
top: 6px;
left: 10px;
}
.input-group .form-control {
line-height: 38px;
font-size: 16px;
}
h2.title {
font-size: 20px;
margin-bottom: 30px;
}
.docListBox {
width: 100%;
padding: 20px 15px;
}
.docListBox a {
width: 100%;
height: auto;
padding-top: 10px;
padding-bottom: 10px;
float:none;
font-size: 14px;
margin: 0;
border-top: 1px solid#EDEDED;
}
.docListBox a::before{
top:50%;
margin-top: -20px;
}
}
@media screen and (max-width:768px) {
/*.wrapper{
width: 750px;
}*/
}

793
web_src/static/css/style.css

@ -0,0 +1,793 @@
* {
box-sizing: border-box;
}
.body,
body,
select,
input,
view,
text,
button,
textarea {
font-family: 'PingFang SC', 'microsoft yahei', arial, 'helvetica neue', 'hiragino sans gb', sans-serif;
}
body,
.body {
font-size: 14px;
color: #fff;
background-color: #fff;
overflow-x: hidden;
line-height: 1.6;
}
a {
color: inherit;
}
a:hover {
color: inherit;
}
img {
max-width: 100%;
}
.clearfix:after {
content: "";
display: table;
clear: both;
height: 0;
visibility: hidden;
}
.fl {
float: left;
}
.fr {
float: right;
}
.form-box {
width: 400px;
margin: 200px auto 170px;
}
.form-tit {
text-align: center;
font-size: 22px;
margin-bottom: 20px;
}
.form {
background: #202020;
border-radius: 4px;
padding: 55px 55px 55px 55px;
position: relative;
}
.form-err {
background: #FF6A6A;
border-radius: 4px 4px 0 0;
position: absolute;
left: 0;
right: 0;
top: 0;
padding: 10px;
font-style: normal;
font-weight: normal;
font-size: 12px;
text-align: center;
}
.form-list li {
margin-bottom: 15px;
}
.form-list .text {
width: 100%;
height: 52px;
background: #111111;
border-radius: 4px;
border: 0;
font-size: 14px;
color: #989898;
padding: 0 15px;
border: #111111 solid 1px;
}
.form-list .text-err {
border-color: #FF6A6A;
}
.form-list .textcode {
width: 160px;
}
.form-list .textcode+img {
vertical-align: middle;
width: 116px;
height: 52px;
}
.form-list .text:focus {
border: #369FFF solid 1px;
}
.form-list a:hover {
color: #369FFF;
}
.form-btns {
margin-top: 50px;
text-align: center;
}
.form-btns li+li {
margin-top: 10px;
}
.form-btns .btn {
width: 100%;
height: 55px;
background: #FFFFFF;
font-size: 16px;
color: #111111;
border: 1px solid #FFFFFF;
box-sizing: border-box;
border-radius: 4px;
cursor: pointer;
display: inline-block;
line-height: 55px;
}
.form-btns .btn:hover {
background: #369FFF !important;
border-color: #369FFF !important;
color: #fff !important;
}
.form-btns .btn.btn1 {
background: transparent;
color: #fff;
}
.form-other {
text-align: center;
margin-top: 15px;
}
.form-other .hd {
color: #4E4E4E;
}
.form-other .bd {
margin-top: 15px;
}
/*首页*/
.wrapper {
width: 1440px;
margin: 0 auto;
}
.searchBox {
height: 366px;
background-image: url(../images/bg.jpg);
background-size: contain;
margin-top: 59px;
padding-top: 60px;
}
.searchBox .wrapperBox {
width: 900px;
margin: 0 auto;
}
.tip-text {
font-size: 50px;
text-align: center;
color: #000;
}
.input-group {
margin-top: 30px;
position: relative;
border: 2px solid #009874;
height: 60px;
border-radius: 30px;
background: #fff;
padding-left: 60px;
padding-right: 100px;
overflow: hidden;
}
.input-group .btn {
background: #009874;
font-size: 24px;
text-align: center;
width: 100px;
height: 100%;
line-height: 56px;
position: absolute;
right: 0;
top: 0;
border: none;
color: #fff;
cursor: pointer;
}
.input-group>img {
width: 30px;
position: absolute;
left: 18px;
top: 14px;
}
.input-group .form-control {
width: 100%;
font-size: 20px;
line-height: 56px;
height: 100%;
border: none;
background: none;
}
.docListBox {
min-height: 200px;
color: #000;
padding-top: 80px;
padding-bottom: 20px;
width: 1200px;
overflow: hidden;
margin: 0 auto;
}
.docListBox a {
display: block;
width: 319px;
height: 173px;
margin: 0 35px;
float: left;
font-size: 20px;
padding-top: 22px;
padding-right: 70px;
border-top: 2px solid #000;
position: relative;
}
.docListBox a::before {
content: '';
width: 40px;
height: 40px;
position: absolute;
right: 10px;
top: 20px;
background: url(../images/icon_right.png);
background-size: 100%;
}
.docListBox a.active,
.docListBox a:hover {
background: #76EACF;
}
.resListBox {
width:1100px;
padding:40px 0;
}
.resListBox a {
width: 100%;
height: auto;
padding-top: 20px;
padding-bottom: 20px;
float: none;
font-size: 20px;
margin: 0;
border-top: 1px solid#EDEDED;
}
.resListBox a small {
display: block;
font-size: 70%;
color:#999999
}
.resListBox a:last-child {
border-bottom: 1px solid#EDEDED;
}
.resListBox a::before {
top: 50%;
margin-top: -20px;
}
h2.title {
font-size: 32px;
text-align: center;
margin-bottom: 91px;
font-weight: bold;
}
.hbanner .wrapper {
background: url(../imgs/home1.png) no-repeat right center;
height: 940px;
padding-top: 305px;
}
.hbanner-txt {
padding-left: 155px;
}
.hbanner-txt h2 {
font-size: 40px;
line-height: 160%;
color: #fff;
font-weight: bold;
margin-bottom: 55px;
}
.hbanner-txt h2 font {
color: #369FFF;
}
.hbanner-txt .list {
font-size: 14px;
line-height: 20px;
}
.hbanner-txt .list li {
margin-bottom: 24px;
}
.hbanner-txt .list li:last-child {
margin-bottom: 0;
}
.hbanner-txt .list .num {
background: #333333;
border-radius: 1px;
margin-left: 5px;
padding: 0 3px;
font-family: 'Barlow-Regular';
}
.hbanner-txt .btns {
margin-top: 60px;
}
.hbanner-txt .btns a {
width: 130px;
height: 55px;
line-height: 55px;
text-align: center;
display: inline-block;
border: 1px solid #FFFFFF;
box-sizing: border-box;
border-radius: 4px;
margin-right: 24px;
/*transition: 0.4s;*/
}
.hbanner-txt .btns a:hover {
background: #369FFF !important;
color: #fff !important;
border-color: #369FFF;
}
.hbanner-txt .btns a.on {
color: #111111;
background: #fff;
}
.hrow {
height: 634px;
}
.hrow .wrapper {
/*overflow: hidden;*/
padding: 0 10%;
}
.hrow .fl {
float: left;
}
.hrow .fr {
float: right;
}
.hrow .txt {
/*padding-left: 155px;*/
padding-top: 210px;
/*width: 570px;*/
width: 53%;
}
.hrow .txt h2 {
font-weight: 600;
font-size: 40px;
line-height: 160%;
margin-bottom: 50px;
}
.hrow .txt p {
font-size: 22px;
line-height: 1.4;
padding-bottom: 30px;
}
.hrow .txt p img {
margin-right: 13px;
}
.hrow .img {
/*padding-top: 120px;*/
padding-top: 110px;
/*width: 500px;*/
width: 43%;
}
.hrow1 {
background: #202020;
height: 634px;
}
.hrow1 .img {
position: relative;
}
.hrow1 .img>.box {
position: absolute;
left: 0;
top: -50px;
}
.hrow1 .img>img {
position: relative;
z-index: 2;
}
.hrow2 {
background: #369FFF;
height: 634px;
}
.hrow3 {
background: #111111;
height: 634px;
}
.hrow4 {
background: #202020;
height: 570px;
}
.hrow5 {
background: #369FFF;
height: 634px;
}
.hrow6 {
background: #111111;
height: 617px;
}
.hrow7 {
background: #202020;
height: 617px;
}
.hfoot {
height: 594px;
background: url(../imgs/home9.png) no-repeat center top #fff;
color: #111111;
text-align: center;
padding-top: 280px;
position: relative;
}
.hfoot h2 {
font-size: 40px;
line-height: 160%;
font-weight: bold;
}
.hfoot h2 br {
display: none;
}
.hfoot .num {
background: #DFF0FF;
color: #369FFF;
font-weight: bold;
border-radius: 1px;
margin-right: 1px;
padding: 0 6px;
font-family: 'Barlow-Regular';
}
.hfoot .btn {
display: inline-block;
width: 130px;
height: 55px;
line-height: 55px;
background: #111111;
border-radius: 4px;
margin-top: 24px;
font-size: 16px;
color: #fff;
/*transition: 0.4s;*/
}
.hfoot .btn:hover {
background: #369FFF;
}
.hfoot .copyright {
color: #9C9C9C;
position: absolute;
left: 0;
right: 0;
text-align: center;
bottom: 35px;
}
/*价格*/
.mprice-main {
background: #111111 url(../imgs/bg1.png) no-repeat center top;
padding-top: 200px;
padding-bottom: 210px;
text-align: center;
}
.mprice-main .wrapper {
overflow: hidden;
/*padding-left: 140px;*/
padding-top: 80px;
}
.mprice-main .item {
width: 218px;
/*float: left;*/
display: inline-block;
vertical-align: top;
text-align: center;
margin-right: 24px;
cursor: pointer;
transition: 0.4s;
-webkit-transition: 0.4s;
}
.mprice-main .item:hover {
transform: translateY(-20px);
-webkit-transform: translateY(-20px);
}
.mprice-main .itemtit:hover {
transform: translateY(0);
-webkit-transform: translateY(0);
}
.mprice-main .item .title {
font-style: normal;
font-weight: 600;
font-size: 22px;
height: 60px;
}
.mprice-main .itembox {
background: #202020;
border-radius: 4px;
height: 902px;
padding-top: 46px;
position: relative;
padding-bottom: 130px;
}
.mprice-main .itembox-bgnone {
background: none;
}
.mprice-main .itembox-border {
background: #111111;
border: 1px solid #202020;
}
.mprice-main .itembox-border li {
border-bottom: #202020 solid 1px;
}
.mprice-main .itembox-highlight {
background: #369FFF;
}
.mprice-main .item ul {
padding: 0 25px;
}
.mprice-main .item ul.tit {
color: #989898;
text-align: left;
padding-left: 50px;
}
.mprice-main .item li {
padding: 20px 0;
}
.mprice-main .item li.num {
height: 90px;
padding: 0;
border: none;
font-family: "Barlow-Regular";
}
.mprice-main .item li.num big {
font-size: 40px;
font-weight: bold;
}
.mprice-main .item .btn {
position: absolute;
left: 0;
right: 0;
bottom: 35px;
}
.mprice-main .item .btn a {
width: 130px;
height: 55px;
line-height: 55px;
text-align: center;
border: 1px solid #FFFFFF;
box-sizing: border-box;
border-radius: 4px;
display: inline-block;
}
.mprice-main .item .btn a:hover {
background: #369FFF;
border-color: #369FFF;
}
.mprice-main .itembox-highlight .btn a {
color: #369FFF;
background: #fff;
}
.mprice-main .itembox-highlight .btn a:hover {
border-color: #fff;
color: #fff;
}
.mprice-explain {
background: #202020;
padding: 60px 0 150px;
}
.mprice-explain .wrapper {
padding: 0 155px;
}
.mprice-explain h3 {
font-style: normal;
font-weight: 600;
font-size: 22px;
margin-bottom: 60px;
}
.mprice-explain p {
margin-bottom: 24px;
font-size: 14px;
}
/*下载*/
.downpage {
width: 736px;
/*height: 821px;*/
background: #202020;
border-radius: 4px;
margin: 0 auto;
margin-top: 210px;
margin-bottom: 270px;
padding: 24px;
}
.downlist {
border-bottom: #333333 solid 1px;
padding: 60px 0;
}
.downlist .head {
font-style: normal;
font-weight: 600;
font-size: 22px;
text-align: center;
}
.downlist .dbody {
margin-top: 60px;
text-align: center;
}
.downlist .dbody li {
display: inline-block;
margin: 0 30px;
}
.downlist .dbody .txt {
font-style: normal;
font-weight: normal;
font-size: 14px;
color: #989898;
margin-top: 15px;
}
.downlist .dbody .btn {
margin-top: 20px;
}
.downlist .dbody .btn a {
width: 130px;
height: 55px;
line-height: 55px;
text-align: center;
border: 1px solid #FFFFFF;
box-sizing: border-box;
border-radius: 4px;
display: inline-block;
font-style: normal;
font-weight: 500;
font-size: 16px;
}
.downlist .dbody .btn a.on {
background: #fff;
color: #111111;
}
.downlist .dbody .btn a:hover {
background: #369FFF;
border-color: #369FFF;
color: #fff;
}
.downlist .dbody .link {
margin-top: 20px;
}
.downlist .dbody .link a {
text-decoration: underline;
font-style: normal;
font-weight: 500;
font-size: 16px;
}
.downlist+.downlist {
border: none;
}
.downtip {
font-style: normal;
font-weight: normal;
font-size: 12px;
line-height: 17px;
color: #666666;
padding-top: 24px;
}
.regbg {
background: #111111 url(../imgs/regbg.jpg) no-repeat center top;
}

BIN
web_src/static/css/unisans.otf

5
web_src/static/editor.md/editormd.js

@ -3706,8 +3706,9 @@
smartypants: true
}
markdownDoc = new String(markdownDoc)
// markdownDoc = new String(markdownDoc)
// console.log(saveTo.val())
// console.log(markdownDoc)
var markdownParsed = marked(markdownDoc, markedOptions)
markdownParsed = editormd.filterHTMLTags(markdownParsed, settings.htmlDecode)

2710
web_src/static/editor.md/lib/marked.min.js
File diff suppressed because it is too large
View File

29
web_src/static/editor.md/lib/marked.old.js

@ -0,0 +1,29 @@
/**
* marked v0.3.3 - a markdown parser
* Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
* https://github.com/chjj/marked
*/
(function() {
var block = {newline: /^\n+/, code: /^( {4}[^\n]+\n*)+/, fences: noop, hr: /^( *[-*_]){3,} *(?:\n+|$)/, heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/, nptable: noop, lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/, blockquote: /^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/, list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/, html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/, def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/, table: noop, paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/, text: /^[^\n]+/}; block.bullet = /(?:[*+-]|\d+\.)/; block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/; block.item = replace(block.item, 'gm')(/bull/g, block.bullet)(); block.list = replace(block.list)(/bull/g, block.bullet)('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))')('def', '\\n+(?=' + block.def.source + ')')(); block.blockquote = replace(block.blockquote)('def', block.def)(); block._tag = '(?!(?:' + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code' + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo' + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b'; block.html = replace(block.html)('comment', /<!--[\s\S]*?-->/)('closed', /<(tag)[\s\S]+?<\/\1>/)('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)(/tag/g, block._tag)(); block.paragraph = replace(block.paragraph)('hr', block.hr)('heading', block.heading)('lheading', block.lheading)('blockquote', block.blockquote)('tag', '<' + block._tag)('def', block.def)(); block.normal = merge({}, block); block.gfm = merge({}, block.normal, {fences: /^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/, paragraph: /^/}); block.gfm.paragraph = replace(block.paragraph)('(?!', '(?!' + block.gfm.fences.source.replace('\\1', '\\2') + '|' + block.list.source.replace('\\1', '\\3') + '|')(); block.tables = merge({}, block.gfm, {nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/, table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/}); function Lexer(options) { this.tokens = []; this.tokens.links = {}; this.options = options || marked.defaults; this.rules = block.normal; if (this.options.gfm) { if (this.options.tables) { this.rules = block.tables } else { this.rules = block.gfm } } }Lexer.rules = block; Lexer.lex = function(src, options) { var lexer = new Lexer(options); return lexer.lex(src) }; Lexer.prototype.lex = function(src) { src = src.replace(/\r\n|\r/g, '\n').replace(/\t/g, ' ').replace(/\u00a0/g, ' ').replace(/\u2424/g, '\n'); return this.token(src, true) }; Lexer.prototype.token = function(src, top, bq) {
var src = src.replace(/^ +$/gm, ''), next, loose, cap, bull, b, item, space, i, l; while (src) {
if (cap = this.rules.newline.exec(src)) { src = src.substring(cap[0].length); if (cap[0].length > 1) { this.tokens.push({type: 'space'}) } } if (cap = this.rules.code.exec(src)) { src = src.substring(cap[0].length); cap = cap[0].replace(/^ {4}/gm, ''); this.tokens.push({type: 'code', text: !this.options.pedantic ? cap.replace(/\n+$/, '') : cap}); continue } if (cap = this.rules.fences.exec(src)) { src = src.substring(cap[0].length); this.tokens.push({type: 'code', lang: cap[2], text: cap[3]}); continue } if (cap = this.rules.heading.exec(src)) { src = src.substring(cap[0].length); this.tokens.push({type: 'heading', depth: cap[1].length, text: cap[2]}); continue } if (top && (cap = this.rules.nptable.exec(src))) { src = src.substring(cap[0].length); item = {type: 'table', header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */), align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), cells: cap[3].replace(/\n$/, '').split('\n')}; for (i = 0; i < item.align.length; i++) { if (/^ *-+: *$/.test(item.align[i])) { item.align[i] = 'right' } else { if (/^ *:-+: *$/.test(item.align[i])) { item.align[i] = 'center' } else { if (/^ *:-+ *$/.test(item.align[i])) { item.align[i] = 'left' } else { item.align[i] = null } } } } for (i = 0; i < item.cells.length; i++) { item.cells[i] = item.cells[i].split(/ *\| */) } this.tokens.push(item); continue } if (cap = this.rules.lheading.exec(src)) { src = src.substring(cap[0].length); this.tokens.push({type: 'heading', depth: cap[2] === '=' ? 1 : 2, text: cap[1]}); continue } if (cap = this.rules.hr.exec(src)) { src = src.substring(cap[0].length); this.tokens.push({type: 'hr'}); continue } if (cap = this.rules.blockquote.exec(src)) { src = src.substring(cap[0].length); this.tokens.push({type: 'blockquote_start'}); cap = cap[0].replace(/^ *> ?/gm, ''); this.token(cap, top, true); this.tokens.push({type: 'blockquote_end'}); continue } if (cap = this.rules.list.exec(src)) {
src = src.substring(cap[0].length); bull = cap[2]; this.tokens.push({type: 'list_start', ordered: bull.length > 1}); cap = cap[0].match(this.rules.item); next = false; l = cap.length; i = 0; for (;i < l; i++) {
item = cap[i]; space = item.length; item = item.replace(/^ *([*+-]|\d+\.) +/, ''); if (~item.indexOf('\n ')) { space -= item.length; item = !this.options.pedantic ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '') : item.replace(/^ {1,4}/gm, '') } if (this.options.smartLists && i !== l - 1) { b = block.bullet.exec(cap[i + 1])[0]; if (bull !== b && !(bull.length > 1 && b.length > 1)) { src = cap.slice(i + 1).join('\n') + src; i = l - 1 } }loose = next || /\n\n(?!\s*$)/.test(item); if (i !== l - 1) { next = item.charAt(item.length - 1) === '\n'; if (!loose) { loose = next } } this.tokens.push({type: loose ? 'loose_item_start' : 'list_item_start'}); this.token(item, false, bq)
this.tokens.push({type: 'list_item_end'})
} this.tokens.push({type: 'list_end'}); continue
} if (cap = this.rules.html.exec(src)) { src = src.substring(cap[0].length); this.tokens.push({type: this.options.sanitize ? 'paragraph' : 'html', pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style', text: cap[0]}); continue } if ((!bq && top) && (cap = this.rules.def.exec(src))) { src = src.substring(cap[0].length); this.tokens.links[cap[1].toLowerCase()] = {href: cap[2], title: cap[3]}; continue } if (top && (cap = this.rules.table.exec(src))) { src = src.substring(cap[0].length); item = {type: 'table', header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */), align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')}; for (i = 0; i < item.align.length; i++) { if (/^ *-+: *$/.test(item.align[i])) { item.align[i] = 'right' } else { if (/^ *:-+: *$/.test(item.align[i])) { item.align[i] = 'center' } else { if (/^ *:-+ *$/.test(item.align[i])) { item.align[i] = 'left' } else { item.align[i] = null } } } } for (i = 0; i < item.cells.length; i++) { item.cells[i] = item.cells[i].replace(/^ *\| *| *\| *$/g, '').split(/ *\| */) } this.tokens.push(item); continue } if (top && (cap = this.rules.paragraph.exec(src))) { src = src.substring(cap[0].length); this.tokens.push({type: 'paragraph', text: cap[1].charAt(cap[1].length - 1) === '\n' ? cap[1].slice(0, -1) : cap[1]}); continue } if (cap = this.rules.text.exec(src)) { src = src.substring(cap[0].length); this.tokens.push({type: 'text', text: cap[0]}); continue } if (src) { throw new Error('Infinite loop on byte: ' + src.charCodeAt(0)) }
} return this.tokens
}; var inline = {escape: /^\\([\\`*{}\[\]()#+\-.!_>])/, autolink: /^<([^ >]+(@|:\/)[^ >]+)>/, url: noop, tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/, link: /^!?\[(inside)\]\(href\)/, reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/, nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/, strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/, em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/, code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/, br: /^ {2,}\n(?!\s*$)/, del: noop, text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/}; inline._inside = /(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/; inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/; inline.link = replace(inline.link)('inside', inline._inside)('href', inline._href)(); inline.reflink = replace(inline.reflink)('inside', inline._inside)(); inline.normal = merge({}, inline); inline.pedantic = merge({}, inline.normal, {strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/}); inline.gfm = merge({}, inline.normal, {escape: replace(inline.escape)('])', '~|])')(), url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/, del: /^~~(?=\S)([\s\S]*?\S)~~/, text: replace(inline.text)(']|', '~]|')('|', '|https?://|')()}); inline.breaks = merge({}, inline.gfm, {br: replace(inline.br)('{2,}', '*')(), text: replace(inline.gfm.text)('{2,}', '*')()}); function InlineLexer(links, options) { this.options = options || marked.defaults; this.links = links; this.rules = inline.normal; this.renderer = this.options.renderer || new Renderer(); this.renderer.options = this.options; if (!this.links) { throw new Error('Tokens array requires a `links` property.') } if (this.options.gfm) { if (this.options.breaks) { this.rules = inline.breaks } else { this.rules = inline.gfm } } else { if (this.options.pedantic) { this.rules = inline.pedantic } } }InlineLexer.rules = inline; InlineLexer.output = function(src, links, options) { var inline = new InlineLexer(links, options); return inline.output(src) }; InlineLexer.prototype.output = function(src) {
var out = '', link, text, href, cap; while (src) {
if (cap = this.rules.escape.exec(src)) { src = src.substring(cap[0].length); out += cap[1]; continue } if (cap = this.rules.autolink.exec(src)) { src = src.substring(cap[0].length); if (cap[2] === '@') { text = cap[1].charAt(6) === ':' ? this.mangle(cap[1].substring(7)) : this.mangle(cap[1]); href = this.mangle('mailto:') + text } else { text = escape(cap[1]); href = text }out += this.renderer.link(href, null, text); continue } if (!this.inLink && (cap = this.rules.url.exec(src))) { src = src.substring(cap[0].length); text = escape(cap[1]); href = text; out += this.renderer.link(href, null, text); continue } if (cap = this.rules.tag.exec(src)) { if (!this.inLink && /^<a /i.test(cap[0])) { this.inLink = true } else { if (this.inLink && /^<\/a>/i.test(cap[0])) { this.inLink = false } }src = src.substring(cap[0].length); out += this.options.sanitize ? escape(cap[0]) : cap[0]; continue } if (cap = this.rules.link.exec(src)) { src = src.substring(cap[0].length); this.inLink = true; out += this.outputLink(cap, {href: cap[2], title: cap[3]}); this.inLink = false; continue } if ((cap = this.rules.reflink.exec(src)) || (cap = this.rules.nolink.exec(src))) { src = src.substring(cap[0].length); link = (cap[2] || cap[1]).replace(/\s+/g, ' '); link = this.links[link.toLowerCase()]; if (!link || !link.href) { out += cap[0].charAt(0); src = cap[0].substring(1) + src; continue } this.inLink = true; out += this.outputLink(cap, link); this.inLink = false; continue } if (cap = this.rules.strong.exec(src)) { src = src.substring(cap[0].length); out += this.renderer.strong(this.output(cap[2] || cap[1])); continue } if (cap = this.rules.em.exec(src)) {
src = src.substring(cap[0].length); out += this.renderer.em(this.output(cap[2] || cap[1])); continue
} if (cap = this.rules.code.exec(src)) { src = src.substring(cap[0].length); out += this.renderer.codespan(escape(cap[2], true)); continue } if (cap = this.rules.br.exec(src)) { src = src.substring(cap[0].length); out += this.renderer.br(); continue } if (cap = this.rules.del.exec(src)) { src = src.substring(cap[0].length); out += this.renderer.del(this.output(cap[1])); continue } if (cap = this.rules.text.exec(src)) { src = src.substring(cap[0].length); out += escape(this.smartypants(cap[0])); continue } if (src) { throw new Error('Infinite loop on byte: ' + src.charCodeAt(0)) }
} return out
}; InlineLexer.prototype.outputLink = function(cap, link) { var href = escape(link.href), title = link.title ? escape(link.title) : null; return cap[0].charAt(0) !== '!' ? this.renderer.link(href, title, this.output(cap[1])) : this.renderer.image(href, title, escape(cap[1])) }; InlineLexer.prototype.smartypants = function(text) { if (!this.options.smartypants) { return text } return text.replace(/--/g, '\u2014').replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018').replace(/'/g, '\u2019').replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c').replace(/"/g, '\u201d').replace(/\.{3}/g, '\u2026') }; InlineLexer.prototype.mangle = function(text) { var out = '', l = text.length, i = 0, ch; for (;i < l; i++) { ch = text.charCodeAt(i); if (Math.random() > 0.5) { ch = 'x' + ch.toString(16) }out += '&#' + ch + ';' } return out }; function Renderer(options) { this.options = options || {} }Renderer.prototype.code = function(code, lang, escaped) { if (this.options.highlight) { var out = this.options.highlight(code, lang); if (out != null && out !== code) { escaped = true; code = out } } if (!lang) { return '<pre><code>' + (escaped ? code : escape(code, true)) + '\n</code></pre>' } return '<pre><code class="' + this.options.langPrefix + escape(lang, true) + '">' + (escaped ? code : escape(code, true)) + '\n</code></pre>\n' }; Renderer.prototype.blockquote = function(quote) { return '<blockquote>\n' + quote + '</blockquote>\n' }; Renderer.prototype.html = function(html) { return html }; Renderer.prototype.heading = function(text, level, raw) { return '<h' + level + ' id="' + this.options.headerPrefix + raw.toLowerCase().replace(/[^\w]+/g, '-') + '">' + text + '</h' + level + '>\n' }; Renderer.prototype.hr = function() { return this.options.xhtml ? '<hr/>\n' : '<hr>\n' }; Renderer.prototype.list = function(body, ordered) { var type = ordered ? 'ol' : 'ul'; return '<' + type + '>\n' + body + '</' + type + '>\n' }; Renderer.prototype.listitem = function(text) { return '<li>' + text + '</li>\n' }; Renderer.prototype.paragraph = function(text) { return '<p>' + text + '</p>\n' }; Renderer.prototype.table = function(header, body) { return '<table>\n' + '<thead>\n' + header + '</thead>\n' + '<tbody>\n' + body + '</tbody>\n' + '</table>\n' }; Renderer.prototype.tablerow = function(content) { return '<tr>\n' + content + '</tr>\n' }; Renderer.prototype.tablecell = function(content, flags) { var type = flags.header ? 'th' : 'td'; var tag = flags.align ? '<' + type + ' style="text-align:' + flags.align + '">' : '<' + type + '>'; return tag + content + '</' + type + '>\n' }; Renderer.prototype.strong = function(text) { return '<strong>' + text + '</strong>' }; Renderer.prototype.em = function(text) { return '<em>' + text + '</em>' }; Renderer.prototype.codespan = function(text) { return '<code>' + text + '</code>' }; Renderer.prototype.br = function() { return this.options.xhtml ? '<br/>' : '<br>' }; Renderer.prototype.del = function(text) { return '<del>' + text + '</del>' }; Renderer.prototype.link = function(href, title, text) { if (this.options.sanitize) { try { var prot = decodeURIComponent(unescape(href)).replace(/[^\w:]/g, '').toLowerCase() } catch (e) { return '' } if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0) { return '' } } var out = '<a href="' + href + '"'; if (title) { out += ' title="' + title + '"' }out += '>' + text + '</a>'; return out }; Renderer.prototype.image = function(href, title, text) { var out = '<img src="' + href + '" alt="' + text + '"'; if (title) { out += ' title="' + title + '"' }out += this.options.xhtml ? '/>' : '>'; return out }; function Parser(options) { this.tokens = []; this.token = null; this.options = options || marked.defaults; this.options.renderer = this.options.renderer || new Renderer(); this.renderer = this.options.renderer; this.renderer.options = this.options }Parser.parse = function(src, options, renderer) { var parser = new Parser(options, renderer); return parser.parse(src) }; Parser.prototype.parse = function(src) { this.inline = new InlineLexer(src.links, this.options, this.renderer); this.tokens = src.reverse(); var out = ''; while (this.next()) { out += this.tok() } return out }; Parser.prototype.next = function() { return this.token = this.tokens.pop() }; Parser.prototype.peek = function() { return this.tokens[this.tokens.length - 1] || 0 }; Parser.prototype.parseText = function() { var body = this.token.text; while (this.peek().type === 'text') { body += '\n' + this.next().text } return this.inline.output(body) }; Parser.prototype.tok = function() {
switch (this.token.type) {
case 'space':return ''; case 'hr':return this.renderer.hr(); case 'heading':return this.renderer.heading(this.inline.output(this.token.text), this.token.depth, this.token.text); case 'code':return this.renderer.code(this.token.text, this.token.lang, this.token.escaped); case 'table':var header = '', body = '', i, row, cell, flags, j; cell = ''; for (i = 0; i < this.token.header.length; i++) {
flags = {header: true, align: this.token.align[i]}; cell += this.renderer.tablecell(this.inline.output(this.token.header[i]), {header: true, align: this.token.align[i]})
}header += this.renderer.tablerow(cell); for (i = 0; i < this.token.cells.length; i++) { row = this.token.cells[i]; cell = ''; for (j = 0; j < row.length; j++) { cell += this.renderer.tablecell(this.inline.output(row[j]), {header: false, align: this.token.align[j]}) }body += this.renderer.tablerow(cell) } return this.renderer.table(header, body); case 'blockquote_start':var body = ''; while (this.next().type !== 'blockquote_end') { body += this.tok() } return this.renderer.blockquote(body); case 'list_start':var body = '', ordered = this.token.ordered; while (this.next().type !== 'list_end') { body += this.tok() } return this.renderer.list(body, ordered); case 'list_item_start':var body = ''; while (this.next().type !== 'list_item_end') { body += this.token.type === 'text' ? this.parseText() : this.tok() } return this.renderer.listitem(body); case 'loose_item_start':var body = ''; while (this.next().type !== 'list_item_end') { body += this.tok() } return this.renderer.listitem(body); case 'html':var html = !this.token.pre && !this.options.pedantic ? this.inline.output(this.token.text) : this.token.text; return this.renderer.html(html); case 'paragraph':return this.renderer.paragraph(this.inline.output(this.token.text)); case 'text':return this.renderer.paragraph(this.parseText())
}
}; function escape(html, encode) { return html.replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;') } function unescape(html) { return html.replace(/&([#\w]+);/g, function(_, n) { n = n.toLowerCase(); if (n === 'colon') { return ':' } if (n.charAt(0) === '#') { return n.charAt(1) === 'x' ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1)) } return '' }) } function replace(regex, opt) { regex = regex.source; opt = opt || ''; return function self(name, val) { if (!name) { return new RegExp(regex, opt) }val = val.source || val; val = val.replace(/(^|[^\[])\^/g, '$1'); regex = regex.replace(name, val); return self } } function noop() {}noop.exec = noop; function merge(obj) { var i = 1, target, key; for (;i < arguments.length; i++) { target = arguments[i]; for (key in target) { if (Object.prototype.hasOwnProperty.call(target, key)) { obj[key] = target[key] } } } return obj } function marked(src, opt, callback) { if (callback || typeof opt === 'function') { if (!callback) { callback = opt; opt = null }opt = merge({}, marked.defaults, opt || {}); var highlight = opt.highlight, tokens, pending, i = 0; try { tokens = Lexer.lex(src, opt) } catch (e) { return callback(e) }pending = tokens.length; var done = function(err) { if (err) { opt.highlight = highlight; return callback(err) } var out; try { out = Parser.parse(tokens, opt) } catch (e) { err = e }opt.highlight = highlight; return err ? callback(err) : callback(null, out) }; if (!highlight || highlight.length < 3) { return done() } delete opt.highlight; if (!pending) { return done() } for (;i < tokens.length; i++) { (function(token) { if (token.type !== 'code') { return --pending || done() } return highlight(token.text, token.lang, function(err, code) { if (err) { return done(err) } if (code == null || code === token.text) { return --pending || done() }token.text = code; token.escaped = true; --pending || done() }) })(tokens[i]) } return } try { if (opt) { opt = merge({}, marked.defaults, opt) } return Parser.parse(Lexer.lex(src, opt), opt) } catch (e) { e.message += '\nPlease report this to https://github.com/chjj/marked.'; if ((opt || marked.defaults).silent) { return '<p>An error occured:</p><pre>' + escape(e.message + '', true) + '</pre>' } throw e } }marked.options = marked.setOptions = function(opt) { merge(marked.defaults, opt); return marked }; marked.defaults = {gfm: true, tables: true, breaks: false, pedantic: false, sanitize: false, smartLists: false, silent: false, highlight: null, langPrefix: 'lang-', smartypants: false, headerPrefix: '', renderer: new Renderer(), xhtml: false}; marked.Parser = Parser; marked.parser = Parser.parse; marked.Renderer = Renderer; marked.Lexer = Lexer; marked.lexer = Lexer.lex; marked.InlineLexer = InlineLexer; marked.inlineLexer = InlineLexer.output; marked.parse = marked; if (typeof module !== 'undefined' && typeof exports === 'object') { module.exports = marked } else { if (typeof define === 'function' && define.amd) { define(function() { return marked }) } else { this.marked = marked } }
}).call(function() { return this || (typeof window !== 'undefined' ? window : global) }())

BIN
web_src/static/images/bg.jpg

After

Width: 3840  |  Height: 804  |  Size: 23 KiB

BIN
web_src/static/images/code.png

After

Width: 200  |  Height: 200  |  Size: 16 KiB

BIN
web_src/static/images/icon_right.png

After

Width: 80  |  Height: 80  |  Size: 287 B

BIN
web_src/static/images/logo.png

After

Width: 378  |  Height: 82  |  Size: 4.8 KiB

BIN
web_src/static/images/logo_b.png

After

Width: 400  |  Height: 290  |  Size: 12 KiB

BIN
web_src/static/images/mini.png

After

Width: 200  |  Height: 200  |  Size: 22 KiB

BIN
web_src/static/images/search.png

After

Width: 60  |  Height: 60  |  Size: 1.2 KiB

BIN
web_src/static/imgs/Android.png

After

Width: 34  |  Height: 34  |  Size: 649 B

BIN
web_src/static/imgs/Auto.png

After

Width: 155  |  Height: 55  |  Size: 7.2 KiB

BIN
web_src/static/imgs/Logo.png

After

Width: 162  |  Height: 38  |  Size: 1.8 KiB

BIN
web_src/static/imgs/Mac.png

After

Width: 34  |  Height: 34  |  Size: 204 B

BIN
web_src/static/imgs/Server.png

After

Width: 34  |  Height: 34  |  Size: 419 B

BIN
web_src/static/imgs/Vector 9.png

After

Width: 204  |  Height: 146  |  Size: 1.6 KiB

BIN
web_src/static/imgs/Vector.png

After

Width: 19  |  Height: 15  |  Size: 342 B

BIN
web_src/static/imgs/Vector1.png

After

Width: 19  |  Height: 15  |  Size: 241 B

BIN
web_src/static/imgs/Wechat.png

After

Width: 38  |  Height: 38  |  Size: 1.2 KiB

BIN
web_src/static/imgs/Windows.png

After

Width: 34  |  Height: 34  |  Size: 439 B

BIN
web_src/static/imgs/bg1.png

After

Width: 1440  |  Height: 805  |  Size: 60 KiB

BIN
web_src/static/imgs/bg2-1.png

After

Width: 922  |  Height: 586  |  Size: 15 KiB

BIN
web_src/static/imgs/bg2-2.png

After

Width: 462  |  Height: 263  |  Size: 9.4 KiB

BIN
web_src/static/imgs/bg2-3.png

After

Width: 364  |  Height: 208  |  Size: 9.2 KiB

BIN
web_src/static/imgs/bg2-4.png

After

Width: 384  |  Height: 220  |  Size: 7.5 KiB

BIN
web_src/static/imgs/bg2-5.png

After

Width: 929  |  Height: 530  |  Size: 25 KiB

BIN
web_src/static/imgs/code.png

After

Width: 116  |  Height: 52  |  Size: 12 KiB

BIN
web_src/static/imgs/home1.png

After

Width: 799  |  Height: 652  |  Size: 80 KiB

BIN
web_src/static/imgs/home2-1111111.png

After

Width: 740  |  Height: 513  |  Size: 12 KiB

BIN
web_src/static/imgs/home2-img.png

After

Width: 531  |  Height: 197  |  Size: 15 KiB

BIN
web_src/static/imgs/home2.png

After

Width: 500  |  Height: 362  |  Size: 34 KiB

BIN
web_src/static/imgs/home3.png

After

Width: 500  |  Height: 402  |  Size: 38 KiB

BIN
web_src/static/imgs/home4.png

After

Width: 500  |  Height: 326  |  Size: 17 KiB

BIN
web_src/static/imgs/home5.png

After

Width: 500  |  Height: 382  |  Size: 68 KiB

BIN
web_src/static/imgs/home6.png

After

Width: 500  |  Height: 326  |  Size: 20 KiB

BIN
web_src/static/imgs/home7.png

After

Width: 500  |  Height: 356  |  Size: 26 KiB

BIN
web_src/static/imgs/home8.png

After

Width: 500  |  Height: 287  |  Size: 46 KiB

BIN
web_src/static/imgs/home9.png

After

Width: 1337  |  Height: 594  |  Size: 75 KiB

BIN
web_src/static/imgs/iOS.png

After

Width: 34  |  Height: 34  |  Size: 601 B

BIN
web_src/static/imgs/regbg.jpg

After

Width: 1439  |  Height: 1029  |  Size: 49 KiB

59
web_src/static/lang/en.js

@ -7,25 +7,42 @@ exports.default = {
my_item: 'My items',
section_title1: 'ShowDoc',
section_description1: ' A tool greatly applicable for an IT team',
section_description1_1: 'A tool greatly applicable',
section_description1_2: 'for an IT team',
section_title2: 'API Document',
section_description2:
'ShowDoc can compile exquisite API documents <br>in a very fast and convenient way',
section_description2_1:
'ShowDoc can compile exquisite API documents',
section_description2_2:
'in a very fast and convenient way',
section_title3: 'Data Dictionary',
section_description3:
'A good Data Dictionary can easily exhibit database structure to other people<br>ShowDoc can compile exquisite Data Dictionary',
section_description3_1:
'A good Data Dictionary can easily exhibit database structure to other people',
section_description3_2:
'ShowDoc can compile exquisite Data Dictionary',
section_title4: 'Explanation Document',
section_description4:
section_description4_1:
'You can absolutely use ShowDoc to compile the explanation documents for some tools',
section_description4_2:
'You can absolutely use ShowDoc to compile the explanation documents for some tools',
section_title5: 'Team Work',
section_description5: 'Your team will work with ShowDoc together very well ',
section_title6: 'Open Source',
section_description6:
'ShowDoc is a free, open source tool that <br>you can deploy it to your own server',
section_title7: 'Hosted online',
section_description7:
'Www.showdoc.cc provide security and stability of the document hosting service',
section_title8: 'Try it now',
section_description8: 'Over 10000+ IT team is using ShowDoc',
section_title6: 'Document Automation',
section_description6_1:
'Documents can be generated automatically from code comments',
section_description6_2:
'With the runapi client, you can debug the interface and automatically generate documents',
section_title7: 'Open Source',
section_description7_1:
'ShowDoc is a free, open source tool',
section_description7_2:
'You can deploy it to your own server',
section_title8: 'Hosted online',
section_description8_1:
'www.showdoc.com.cn provide security and stability of the document hosting service',
section_description8_2:
'You can safely choose to host your document data in the cloud',
section_title9: 'Try it now',
section_description9: 'Over 100000+ IT team is using ShowDoc',
// user
login: 'Login',
@ -88,7 +105,7 @@ exports.default = {
// item/export
export_all: 'Export all',
export_cat: 'export catalog',
export_cat: 'export catalog/page',
select_cat_2: 'Select catalog level2',
select_cat_3: 'Select catalog level3',
begin_export: 'Begin to export',
@ -349,6 +366,7 @@ exports.default = {
oss_open: 'Image/attachment saved to cloud',
oss_server: 'cloud server',
tencent: 'tencent',
aliyun: 'aliyun',
qiniu: 'qiniu',
oss_domain: 'domain(optional)',
@ -389,5 +407,16 @@ exports.default = {
visit_times: 'visit times',
my_attachment: 'My attachment',
accumulated_used_sapce: 'Accumulated used space',
month_flow: 'Traffic has been used this month'
month_flow: 'Traffic has been used this month',
all_pages: 'All pages',
cancelSingle: 'Are you sure you want to cancel the single page link? After cancellation, the original link will be invalid immediately',
cancelSingleYes: 'Unlink single page',
cancelSingleNo: 'Keep single page',
from_file_gub: 'From FileHub',
file_gub: 'FileHub',
select: 'select'
}

67
web_src/static/lang/zh-CN.js

@ -6,26 +6,42 @@ exports.default = {
index_login_or_register: '登录 / 注册',
my_item: '我的项目',
section_title1: 'ShowDoc',
section_description1: '一个非常适合IT团队的在线API文档、技术文档工具',
section_description1_1: '一个非常适合IT团队的',
section_description1_2: '在线API文档、技术文档工具',
section_title2: 'API文档',
section_description2:
' APP、web前端与服务器常用API来进行交互<br>用ShowDoc可以非常方便快速地编写出美观的API文档',
section_description2_1:
'APP、web前端与服务器常用API来进行交互',
section_description2_2:
'ShowDoc可以非常方便快速地编写出美观的API文档',
section_title3: '数据字典',
section_description3:
'好的数据字典可以很方便地向别人描述你的数据库结构<br>用ShowDoc可以编辑出美观的数据字典',
section_description3_1:
'好的数据字典可以方便地向别人描述你的数据库结构',
section_description3_2:
'用ShowDoc可以编辑出美观的数据字典',
section_title4: '说明文档',
section_description4:
'你完全可以使用 ShowDoc来编写一些工具的说明书<br>也可以编写一些技术规范说明文档以供团队查阅',
section_description4_1:
'你完全可以使用 ShowDoc来编写一些工具的说明书',
section_description4_2:
'也可以编写一些技术规范说明文档以供团队查阅',
section_title5: '团队协作',
section_description5: '团队权限管理机制让团队良好地协同编写文档',
section_title6: '免费开源',
section_description6:
'ShowDoc提供免费开源的版本<br>你可以选择将ShowDoc部署到你的服务器',
section_title7: '在线托管',
section_description7:
'www.showdoc.cc 提供安全稳定的在线文档托管服务<br>你可以放心地选择托管你的文档数据在云端',
section_title8: '立即体验',
section_description8: '超过10000+互联网团队正在使用ShowDoc',
section_title6: '文档自动化',
section_description6_1:
'可从代码注释中自动生成文档',
section_description6_2:
'搭配的RunApi客户端,可调试接口和自动生成文档',
section_title7: '免费开源',
section_description7_1:
'ShowDoc提供免费开源的版本',
section_description7_2:
'你可以选择将ShowDoc部署到你的服务器',
section_title8: '在线托管',
section_description8_1:
'www.showdoc.com.cn 安全稳定的在线文档托管服务',
section_description8_2:
'你可以放心地选择托管你的文档数据在云端',
section_title9: '立即体验',
section_description9: '超过100000+互联网团队正在使用ShowDoc',
// user
login: '登录',
@ -86,7 +102,7 @@ exports.default = {
// item/export
export_all: '导出全部',
export_cat: '按目录导出',
export_cat: '按目录/页面',
select_cat_2: '选择二级目录:',
select_cat_3: '选择三级目录:',
begin_export: '开始导出',
@ -342,6 +358,7 @@ exports.default = {
oss_open: '图片附件储存到云',
oss_server: '云服务商',
tencent: '腾讯云',
aliyun: '阿里云',
qiniu: '七牛云',
oss_domain: 'oss绑定域名(选填)',
@ -369,16 +386,26 @@ exports.default = {
attachment_manage: '附件管理',
op_success: '操作成功',
display_name: '展示名字',
all_attachment_type: '全部件类型',
all_attachment_type: '全部件类型',
image: '图片',
general_attachment: '普通附件',
general_attachment: '其它文件',
uploader: '上传者',
file_id: '文件id',
file_type: '文件类型',
file_size_m: '文件大小/mb',
visit: '查看',
visit_times: '访问次数',
my_attachment: '我的附件',
my_attachment: '文件库',
accumulated_used_sapce: '累计已使用空间',
month_flow: '本月已使用流量'
month_flow: '本月已使用流量',
all_pages: '全部页面',
cancelSingle: '是否确定取消单页链接?取消后,原链接会立马失效',
cancelSingleYes: '取消单页链接',
cancelSingleNo: '保留单页链接',
from_file_gub: '从文件库选择',
file_gub: '文件库',
select: '选择'
}
Loading…
Cancel
Save