Browse Source

When the user edits the page, it will be locked automatically to prevent others from modifying the overlay
当用户编辑页面的时候将自动锁定,防止其他人修改覆盖

star7th 5 years ago
parent
commit
af1d74121a

+ 42 - 0
server/Application/Api/Controller/PageController.class.php

@@ -455,4 +455,46 @@ class PageController extends BaseController {
     }
 
 
+    //判断页面是否加了编辑锁
+    public function  isLock(){
+        $page_id = I("page_id/d");
+        $lock = 0 ;
+        $now = time() ;
+        $login_user = $this->checkLogin(false);
+        $res = D("PageLock")->where(" page_id = '$page_id' and lock_to > '{$now}' ")->find() ;
+        if( $res){
+            $lock = 1 ;
+        }
+        $this->sendResult(array(
+            "lock" => $lock,
+            "lock_uid" => $res['lock_uid'] ?  $res['lock_uid'] : '',
+            "lock_username" => $res['lock_username'] ? $res['lock_username'] : '',
+            "is_cur_user" => $res['lock_uid'] == $login_user['uid'] ? 1 : 0 ,
+        ));
+    }
+
+    //设置页面加锁时间
+    public function setLock(){
+        $page_id = I("page_id/d");
+        $lock_to = I("lock_to/d") ? I("lock_to/d") :(time() + 5*60*60 )  ;
+        $item_id = I("item_id/d");
+        $login_user = $this->checkLogin();
+        if (!$this->checkItemPermn($login_user['uid'] , $item_id)) {
+            $this->sendError(10103);
+            return ;
+        }
+        D("PageLock")->where( "page_id = '{$page_id}' ")->delete();
+        $id = D("PageLock")->add(array(
+            "page_id" => $page_id ,
+            "lock_uid" => $login_user['uid'] ,
+            "lock_username" => $login_user['username'] ,
+            "lock_to" => $lock_to ,
+            "addtime" => time() ,
+        ));
+        $now = time() ;
+        D("PageLock")->where( "lock_to < '{$now}' ")->delete();
+        $this->sendResult($id);
+
+    }
+
 }

+ 11 - 0
server/Application/Home/Controller/UpdateController.class.php

@@ -238,6 +238,17 @@ class UpdateController extends BaseController {
         )";
         D("User")->execute($sql);
 
+        //创建page_lock表
+        $sql = "CREATE TABLE IF NOT EXISTS `page_lock` (
+            `id`  INTEGER PRIMARY KEY ,
+            `page_id` int(11) NOT NULL DEFAULT '0',
+            `lock_uid` int(11) NOT NULL DEFAULT '0',
+            `lock_username` CHAR(200) NOT NULL DEFAULT '',
+            `lock_to` int(11) NOT NULL DEFAULT '0',
+            `addtime` int(11) NOT NULL DEFAULT '0'
+            )";
+        D("User")->execute($sql);
+
         echo "OK!\n";
     }
 

+ 115 - 48
web_src/src/components/page/edit/Index.vue

@@ -45,6 +45,15 @@
               <span id="save-page">{{$t('save')}}</span>
               <el-dropdown-menu slot="dropdown">
                 <el-dropdown-item :command="save_to_template">{{$t('save_to_templ')}}</el-dropdown-item>
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  :content="$t('lock_edit_tips')"
+                  placement="left"
+                >
+                  <el-dropdown-item v-if="! isLock" :command="setLock">{{$t('lock_edit')}}</el-dropdown-item>
+                </el-tooltip>
+                <el-dropdown-item v-if="isLock" :command="unlock">{{$t('cacel_lock')}}</el-dropdown-item>
                 <!-- <el-dropdown-item>保存前添加注释</el-dropdown-item> -->
               </el-dropdown-menu>
             </el-dropdown>
@@ -176,11 +185,13 @@ export default {
       page_id: '',
       copy_page_id: '',
       attachment_count: '',
-      catalogs: []
+      catalogs: [],
+      isLock: 0,
+      intervalId: 0
     }
   },
   computed: {
-    //新建/编辑目录时供用户选择的上级目录列表
+    // 新建/编辑目录时供用户选择的上级目录列表
     belong_to_catalogs: function() {
       if (!this.catalogs || this.catalogs.length <= 0) {
         return []
@@ -189,7 +200,7 @@ export default {
       var Info = this.catalogs.slice(0)
       var cat_array = []
 
-      //这个函数将递归
+      // 这个函数将递归
       var rename = function(catalog, p_cat_name) {
         if (catalog.length > 0) {
           for (var j = 0; j < catalog.length; j++) {
@@ -225,10 +236,10 @@ export default {
     SortPage
   },
   methods: {
-    //获取页面内容
+    // 获取页面内容
     get_page_content(page_id) {
       if (!page_id) {
-        var page_id = this.page_id
+        page_id = this.page_id
       }
       var that = this
       var url = DocConfig.server + '/api/page/info'
@@ -238,14 +249,14 @@ export default {
         .post(url, params)
         .then(function(response) {
           if (response.data.error_code === 0) {
-            //that.$message.success("加载成功");
+            // that.$message.success("加载成功");
             that.content = response.data.data.page_content
             setTimeout(function() {
               that.insertValue(that.content, 1)
-              document.body.scrollTop = document.documentElement.scrollTop = 0 //回到顶部
+              document.body.scrollTop = document.documentElement.scrollTop = 0 // 回到顶部
             }, 500)
             setTimeout(function() {
-              //如果长度大于3000,则关闭预览
+              // 如果长度大于3000,则关闭预览
               if (that.content.length > 3000) {
                 that.editor_unwatch()
               } else {
@@ -266,7 +277,7 @@ export default {
         })
     },
 
-    //获取所有目录
+    // 获取所有目录
     get_catalog(item_id) {
       var that = this
       var url = DocConfig.server + '/api/catalog/catListGroup'
@@ -288,7 +299,7 @@ export default {
           console.log(error)
         })
     },
-    //获取默认该选中的目录
+    // 获取默认该选中的目录
     get_default_cat() {
       var that = this
       var url = DocConfig.server + '/api/catalog/getDefaultCat'
@@ -299,7 +310,7 @@ export default {
 
       that.axios.post(url, params).then(function(response) {
         if (response.data.error_code === 0) {
-          //that.$message.success("加载成功");
+          // that.$message.success("加载成功");
           var json = response.data.data
           that.cat_id = json.default_cat_id
         } else {
@@ -307,48 +318,50 @@ export default {
         }
       })
     },
-    //插入数据到编辑器中。插入到光标处。如果参数is_cover为真,则清空后再插入(即覆盖)。
+    // 插入数据到编辑器中。插入到光标处。如果参数is_cover为真,则清空后再插入(即覆盖)。
     insertValue(value, is_cover) {
       if (value) {
-        let childRef = this.$refs.Editormd //获取子组件
+        let childRef = this.$refs.Editormd // 获取子组件
         if (is_cover) {
           // 清空
           childRef.clear()
         }
-        childRef.insertValue(value) //调用子组件的方法
+        childRef.insertValue(value) // 调用子组件的方法
       }
     },
 
-    //插入api模板
+    // 插入api模板
     insert_api_template() {
+      var val
       if (DocConfig.lang == 'zh-cn') {
-        var val = Base64.decode(
+        val = Base64.decode(
           'CiAgICAKKirnroDopoHmj4/ov7DvvJoqKiAKCi0g55So5oi35rOo5YaM5o6l5Y+jCgoqKuivt+axglVSTO+8mioqIAotIGAgaHR0cDovL3h4LmNvbS9hcGkvdXNlci9yZWdpc3RlciBgCiAgCioq6K+35rGC5pa55byP77yaKioKLSBQT1NUIAoKKirlj4LmlbDvvJoqKiAKCnzlj4LmlbDlkI185b+F6YCJfOexu+Wei3zor7TmmI58Cnw6LS0tLSAgICB8Oi0tLXw6LS0tLS0gfC0tLS0tICAgfAp8dXNlcm5hbWUgfOaYryAgfHN0cmluZyB855So5oi35ZCNICAgfAp8cGFzc3dvcmQgfOaYryAgfHN0cmluZyB8IOWvhueggSAgICB8CnxuYW1lICAgICB85ZCmICB8c3RyaW5nIHwg5pi156ewICAgIHwKCiAqKui/lOWbnuekuuS+iyoqCgpgYGAgCiAgewogICAgImVycm9yX2NvZGUiOiAwLAogICAgImRhdGEiOiB7CiAgICAgICJ1aWQiOiAiMSIsCiAgICAgICJ1c2VybmFtZSI6ICIxMjE1NDU0NSIsCiAgICAgICJuYW1lIjogIuWQtOezu+aMgiIsCiAgICAgICJncm91cGlkIjogMiAsCiAgICAgICJyZWdfdGltZSI6ICIxNDM2ODY0MTY5IiwKICAgICAgImxhc3RfbG9naW5fdGltZSI6ICIwIiwKICAgIH0KICB9CmBgYAoKICoq6L+U5Zue5Y+C5pWw6K+05piOKiogCgp85Y+C5pWw5ZCNfOexu+Wei3zor7TmmI58Cnw6LS0tLS0gIHw6LS0tLS18LS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICB8Cnxncm91cGlkIHxpbnQgICB855So5oi357uEaWTvvIwx77ya6LaF57qn566h55CG5ZGY77ybMu+8muaZrumAmueUqOaItyAgfAoKICoq5aSH5rOoKiogCgotIOabtOWkmui/lOWbnumUmeivr+S7o+eggeivt+eci+mmlumhteeahOmUmeivr+S7o+eggeaPj+i/sAoKCg=='
         )
       } else {
-        var val = Base64.decode(
+        val = Base64.decode(
           'ICAgIAoqKkJyaWVmIGRlc2NyaXB0aW9uOioqIAoKLSBVc2VyIFJlZ2lzdHJhdGlvbiBJbnRlcmZhY2UKCgoqKlJlcXVlc3QgVVJM77yaKiogCi0gYCBodHRwOi8veHguY29tL2FwaS91c2VyL3JlZ2lzdGVyIGAKICAKKipNZXRob2Q6KioKLSBQT1NUIAoKKipQYXJhbWV0ZXI6KiogCgp8UGFyYW1ldGVyIG5hbWV8UmVxdWlyZWR8VHlwZXxFeHBsYWlufAp8Oi0tLS0gICAgfDotLS18Oi0tLS0tIHwtLS0tLSAgIHwKfHVzZXJuYW1lIHxZZXMgIHxzdHJpbmcgfFlvdXIgdXNlcm5hbWUgICB8CnxwYXNzd29yZCB8WWVzICB8c3RyaW5nIHwgWW91ciBwYXNzd29yZCAgICB8CnxuYW1lICAgICB8Tm8gIHxzdHJpbmcgfCBZb3VyIG5hbWUgICAgfAoKICoqUmV0dXJuIGV4YW1wbGUqKgoKYGBgIAogIHsKICAgICJlcnJvcl9jb2RlIjogMCwKICAgICJkYXRhIjogewogICAgICAidWlkIjogIjEiLAogICAgICAidXNlcm5hbWUiOiAiMTIxNTQ1NDUiLAogICAgICAibmFtZSI6ICJoYXJyeSIsCiAgICAgICJncm91cGlkIjogMiAsCiAgICAgICJyZWdfdGltZSI6ICIxNDM2ODY0MTY5IiwKICAgICAgImxhc3RfbG9naW5fdGltZSI6ICIwIiwKICAgIH0KICB9CmBgYAoKICoqUmV0dXJuIHBhcmFtZXRlciBkZXNjcmlwdGlvbioqIAoKfFBhcmFtZXRlciBuYW1lfFR5cGV8RXhwbGFpbnwKfDotLS0tLSAgfDotLS0tLXwtLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfGdyb3VwaWQgfGludCAgIHwgIC58CgogKipSZW1hcmsqKiAKCi0gRm9yIG1vcmUgZXJyb3IgY29kZSByZXR1cm5zLCBzZWUgdGhlIGVycm9yIGNvZGUgZGVzY3JpcHRpb24gb24gdGhlIGhvbWUgcGFnZQoKCg=='
         )
       }
       this.insertValue(val)
     },
 
-    //插入数据字典模板
+    // 插入数据字典模板
     insert_database_template() {
+      var val
       if (DocConfig.lang == 'zh-cn') {
-        var val = Base64.decode(
+        val = Base64.decode(
           'CiAgICAKLSAg55So5oi36KGo77yM5YKo5a2Y55So5oi35L+h5oGvCgp85a2X5q61fOexu+Wei3znqbp86buY6K6kfOazqOmHinwKfDotLS0tICAgIHw6LS0tLS0tLSAgICB8Oi0tLSB8LS0gLXwtLS0tLS0gICAgICB8Cnx1aWQgICAgfGludCgxMCkgICAgIHzlkKYgfCAgfCAgICAgICAgICAgICB8Cnx1c2VybmFtZSB8dmFyY2hhcigyMCkgfOWQpiB8ICAgIHwgICDnlKjmiLflkI0gIHwKfHBhc3N3b3JkIHx2YXJjaGFyKDUwKSB85ZCmICAgfCAgICB8ICAg5a+G56CBICAgIHwKfG5hbWUgICAgIHx2YXJjaGFyKDE1KSB85pivICAgfCAgICB8ICAgIOaYteensCAgICAgfAp8cmVnX3RpbWUgfGludCgxMSkgICAgIHzlkKYgICB8IDAgIHwgICDms6jlhozml7bpl7QgIHwKCi0g5aSH5rOo77ya5pegCgoK'
         )
       } else {
-        var val = Base64.decode(
+        val = Base64.decode(
           'ICAgIAotICBVc2VyIHRhYmxlICwgdG8gc3RvcmUgdXNlciBpbmZvcm1hdGlvbgoKCgp8RmllbGR8VHlwZXxFbXB0eXxEZWZhdWx0fEV4cGxhaW58Cnw6LS0tLSAgICB8Oi0tLS0tLS0gICAgfDotLS0gfC0tIC18LS0tLS0tICAgICAgfAp8dWlkICAgIHxpbnQoMTApICAgICB8Tm8gfCAgfCAgICAgICAgICAgICB8Cnx1c2VybmFtZSB8dmFyY2hhcigyMCkgfE5vIHwgICAgfCAgICAgfAp8cGFzc3dvcmQgfHZhcmNoYXIoNTApIHxObyAgIHwgICAgfCAgICAgICB8CnxuYW1lICAgICB8dmFyY2hhcigxNSkgfE5vICAgfCAgICB8ICAgICAgICAgfAp8cmVnX3RpbWUgfGludCgxMSkgICAgIHxObyAgIHwgMCAgfCAgICAuIHwKCi0gUmVtYXJrIDogbm8KCg=='
         )
       }
       this.insertValue(val)
     },
-    //关闭预览
+    // 关闭预览
     editor_unwatch() {
-      let childRef = this.$refs.Editormd //获取子组件
+      let childRef = this.$refs.Editormd // 获取子组件
       childRef.editor_unwatch()
       if (sessionStorage.getItem('page_id_unwatch_' + this.page_id)) {
       } else {
@@ -358,43 +371,43 @@ export default {
     },
     //
     editor_watch() {
-      let childRef = this.$refs.Editormd //获取子组件
+      let childRef = this.$refs.Editormd // 获取子组件
       childRef.editor_watch()
     },
-    //json转参数表格
+    // json转参数表格
     ShowJsonToTable() {
-      let childRef = this.$refs.JsonToTable //获取子组件
+      let childRef = this.$refs.JsonToTable // 获取子组件
       childRef.dialogFormVisible = true
     },
-    //json格式化
+    // json格式化
     ShowJsonBeautify() {
-      let childRef = this.$refs.JsonBeautify //获取子组件
+      let childRef = this.$refs.JsonBeautify // 获取子组件
       childRef.dialogFormVisible = true
     },
 
     ShowRunApi() {
       window.open('http://runapi.showdoc.cc/')
     },
-    //更多模板、模板列表
+    // 更多模板、模板列表
     ShowTemplateList() {
-      let childRef = this.$refs.TemplateList //获取子组件
+      let childRef = this.$refs.TemplateList // 获取子组件
       childRef.show()
     },
-    //粘贴插入表格
+    // 粘贴插入表格
     ShowPasteTable() {
-      let childRef = this.$refs.PasteTable //获取子组件
+      let childRef = this.$refs.PasteTable // 获取子组件
       childRef.dialogFormVisible = true
     },
 
-    //展示历史版本
+    // 展示历史版本
     ShowHistoryVersion() {
-      let childRef = this.$refs.HistoryVersion //获取子组件
+      let childRef = this.$refs.HistoryVersion // 获取子组件
       childRef.show()
     },
-    //展示页面排序
+    // 展示页面排序
     ShowSortPage() {
       this.save(() => {
-        let childRef = this.$refs.SortPage //获取子组件
+        let childRef = this.$refs.SortPage // 获取子组件
         childRef.show()
       })
     },
@@ -427,7 +440,7 @@ export default {
             })
           }
 
-          //删除草稿
+          // 删除草稿
           that.deleteDraft()
 
           if (page_id <= 0) {
@@ -440,7 +453,7 @@ export default {
           that.$alert(response.data.error_message)
         }
       })
-      //设置一个最长关闭时间
+      // 设置一个最长关闭时间
       setTimeout(() => {
         loading.close()
       }, 20000)
@@ -457,7 +470,7 @@ export default {
         data()
       }
     },
-    //另存为模板
+    // 另存为模板
     save_to_template() {
       var that = this
       let childRef = this.$refs.Editormd
@@ -476,9 +489,9 @@ export default {
         })
       })
     },
-    //附件
+    // 附件
     ShowAttachment() {
-      let childRef = this.$refs.AttachmentList //获取子组件
+      let childRef = this.$refs.AttachmentList // 获取子组件
       childRef.show()
     },
     /** 粘贴上传图片 **/
@@ -529,12 +542,15 @@ export default {
             processData: false,
             contentType: false,
             beforeSend: function() {
+              // eslint-disable-next-line standard/no-callback-literal
               callback('before')
             },
             error: function() {
+              // eslint-disable-next-line standard/no-callback-literal
               callback('error')
             },
             success: function(data) {
+              // eslint-disable-next-line standard/no-callback-literal
               callback('success', data)
             }
           })
@@ -542,18 +558,18 @@ export default {
         }
       }
     },
-    //草稿
+    // 草稿
     draft() {
       var that = this
       var pkey = 'page_content_' + this.page_id
-      //定时保存文本内容到localStorage
+      // 定时保存文本内容到localStorage
       setInterval(() => {
         let childRef = this.$refs.Editormd
         var content = childRef.getMarkdown()
         localStorage.setItem(pkey, content)
       }, 30 * 1000)
 
-      //检测是否有定时保存的内容
+      // 检测是否有定时保存的内容
       var page_content = localStorage.getItem(pkey)
       if (page_content && page_content.length > 0) {
         localStorage.removeItem(pkey)
@@ -571,7 +587,7 @@ export default {
       }
     },
 
-    //遍历删除草稿
+    // 遍历删除草稿
     deleteDraft() {
       for (var i = 0; i < localStorage.length; i++) {
         var name = localStorage.key(i)
@@ -579,12 +595,61 @@ export default {
           localStorage.removeItem(name)
         }
       }
+    },
+
+    // 锁定
+    setLock() {
+      this.request('/api/page/setLock', {
+        page_id: this.page_id,
+        item_id: this.item_id
+      }).then(() => {
+        this.isLock = 1
+      })
+    },
+    // 解除锁定
+    unlock() {
+      if (!this.isLock) {
+        return // 本来处于未锁定中的话,不发起请求
+      }
+      this.request('/api/page/setLock', {
+        page_id: this.page_id,
+        item_id: this.item_id,
+        lock_to: 1000
+      }).then(() => {
+        this.isLock = 0
+      })
+    },
+    // 如果用户处于锁定状态的话,用心跳保持锁定
+    heartBeatLock() {
+      this.intervalId = setInterval(() => {
+        if (this.isLock) {
+          this.setLock()
+        }
+      }, 3 * 60 * 1000)
+    },
+    // 判断页面是否被锁定编辑
+    remoteIsLock() {
+      this.request('/api/page/isLock', {
+        page_id: this.page_id
+      }).then(res => {
+        // 判断已经锁定了不
+        if (res.data.data.lock > 0) {
+          if (res.data.data.is_cur_user > 0) {
+            this.isLock = 1
+          } else {
+            this.$alert(this.$t('locking') + res.data.data.lock_username)
+            this.goback()
+          }
+        } else {
+          this.setLock() // 如果没有被别人锁定,则进编辑页面后自己锁定。
+        }
+      })
     }
   },
 
   mounted() {
-    var that = this
     this.page_id = this.$route.params.page_id
+    this.item_id = this.$route.params.item_id
     this.copy_page_id = this.$route.query.copy_page_id
       ? this.$route.query.copy_page_id
       : ''
@@ -594,21 +659,23 @@ export default {
     } else if (this.page_id > 0) {
       this.get_page_content(this.page_id)
     } else {
-      this.item_id = this.$route.params.item_id
       this.content = this.$t('welcome_use_showdoc')
     }
     this.get_catalog(this.$route.params.item_id)
 
     this.draft()
-
+    this.heartBeatLock()
+    this.remoteIsLock()
     /** 监听粘贴上传图片 **/
     document.addEventListener('paste', this.upload_paste_img)
   },
 
   beforeDestroy() {
-    //解除对粘贴上传图片的监听
+    // 解除对粘贴上传图片的监听
     document.removeEventListener('paste', this.upload_paste_img)
     this.$message.closeAll()
+    clearInterval(this.intervalId)
+    this.unlock()
   }
 }
 </script>

+ 301 - 304
web_src/static/lang/en.js

@@ -1,333 +1,330 @@
-exports.__esModule = true;
+exports.__esModule = true
 exports.default = {
-    //index
-    'help' : 'Help',
-    'demo' : 'Demo',
-    'index_login_or_register' : 'Login / Register',
-    'my_item' : 'My items',
-    'section_title1' : 'ShowDoc',
-    'section_description1' : ' A tool greatly applicable 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_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_title4' : 'Explanation Document',
-    'section_description4' : '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',
+  // index
+  'help': 'Help',
+  'demo': 'Demo',
+  'index_login_or_register': 'Login / Register',
+  'my_item': 'My items',
+  'section_title1': 'ShowDoc',
+  'section_description1': ' A tool greatly applicable 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_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_title4': 'Explanation Document',
+  'section_description4': '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',
 
-    //user
-    'login':'Login',
-    'username':'Username',
-    'password':'Password',
-    'register_new_account':'Register',
-    'forget_password':'Forget password?',
-    'username_description':'Username/Email',
-    'password_again':'Input password again',
-    'verification_code':'Verification code',
-    'register':'Register',
-    'update_personal_info':'Update personal info',
-    'submit':'Submit',
-    'goback':'Back',
-    'my_email':'My email',
-    'input_email':'Input email',
-    'input_login_password':'Please enter your login password to verify',
-    'status':'Status',
-    'status_1':'Verified',
-    'status_2':'Unverified',
-    'status_3':'Unbound',
-    'binding':'Binding',
-    'modify':'Modify',
-    'modify_password':'Modify password',
-    'old_password':'Old password',
-    'new_password':'New password',
-    'modify_success':'Modify success!',
-    'update_email_success':'Update your mailbox successfully! Please log in to check the email to check the email.',
+  // user
+  'login': 'Login',
+  'username': 'Username',
+  'password': 'Password',
+  'register_new_account': 'Register',
+  'forget_password': 'Forget password?',
+  'username_description': 'Username/Email',
+  'password_again': 'Input password again',
+  'verification_code': 'Verification code',
+  'register': 'Register',
+  'update_personal_info': 'Update personal info',
+  'submit': 'Submit',
+  'goback': 'Back',
+  'my_email': 'My email',
+  'input_email': 'Input email',
+  'input_login_password': 'Please enter your login password to verify',
+  'status': 'Status',
+  'status_1': 'Verified',
+  'status_2': 'Unverified',
+  'status_3': 'Unbound',
+  'binding': 'Binding',
+  'modify': 'Modify',
+  'modify_password': 'Modify password',
+  'old_password': 'Old password',
+  'new_password': 'New password',
+  'modify_success': 'Modify success!',
+  'update_email_success': 'Update your mailbox successfully! Please log in to check the email to check the email.',
 
-    //item/index
-    'personal_setting':'Personal settings',
-    'web_home':'Home',
-    'logout':'Logout',
-    'add_an_item':'Add an item',
-    'new_item':'New item',
-    'feedback':'Feedback',
-    'more':'More',
-    'my_notice':'My notice',
-    'item_setting':'Item settings',
-    'item_top':'Make item top',
-    'cancel_item_top':'Cancel top',
+  // item/index
+  'personal_setting': 'Personal settings',
+  'web_home': 'Home',
+  'logout': 'Logout',
+  'add_an_item': 'Add an item',
+  'new_item': 'New item',
+  'feedback': 'Feedback',
+  'more': 'More',
+  'my_notice': 'My notice',
+  'item_setting': 'Item settings',
+  'item_top': 'Make item top',
+  'cancel_item_top': 'Cancel top',
 
-    //item/add
-    'item_type1' : 'Regular item',
-    'item_type2' : 'Single item',
-    'item_name' : 'Item name',
-    'item_description' : 'Description',
-    'item_domain' : 'Personalized domain name (optional)',
-    'item_domain_illegal' : 'Personalized domain names can only be a combination of letters or numbers',
-    'domain_already_exists' : 'Personal domain name already exists',
-    'visit_password_placeholder' : 'Password',
-    'copy_exists_item' : 'Copy existing item',
-    'please_choose' : 'Please select',
-    'auto_db' : 'Auto data dictionary',
+  // item/add
+  'item_type1': 'Regular item',
+  'item_type2': 'Single item',
+  'item_name': 'Item name',
+  'item_description': 'Description',
+  'item_domain': 'Personalized domain name (optional)',
+  'item_domain_illegal': 'Personalized domain names can only be a combination of letters or numbers',
+  'domain_already_exists': 'Personal domain name already exists',
+  'visit_password_placeholder': 'Password',
+  'copy_exists_item': 'Copy existing item',
+  'please_choose': 'Please select',
+  'auto_db': 'Auto data dictionary',
 
-    //item/pwd
-    'input_visit_password' : 'Input visit password',
+  // item/pwd
+  'input_visit_password': 'Input visit password',
 
-    //item/export
-    'export_all' : 'Export all',
-    'export_cat' : 'export catalog',
-    'select_cat_2' : 'Select catalog level2',
-    'select_cat_3' : 'Select catalog level3',
-    'begin_export' : 'Begin to export',
+  // item/export
+  'export_all': 'Export all',
+  'export_cat': 'export catalog',
+  'select_cat_2': 'Select catalog level2',
+  'select_cat_3': 'Select catalog level3',
+  'begin_export': 'Begin to export',
 
-    //item/setting
-    'base_info' : 'Base info',
-    'member_manage' : 'Manage member',
-    'advance_setting' : 'Advanced setting',
-    'open_api' : 'open api',
-    'info_item_domain':"Personal domain name",
-    'visit_password':"Password",
-    'visit_password_description':"(Optional: private item required)",
-    "add_member" :"Add member",
-    "authority" :"Authority",
-    "add_time" :"Add time",
-    "operation" :"Operation",
-    "delete" :"Delete",
-    "input_target_member" :"Input member's username",
-    "readonly" :"Read-only",
-    "member_authority_tips" :"Permission Description: The default member can create/edit the project page, and only delete the newly created/edited page when deleting. After checking the read-only attribute, the member can only view all pages, and cannot add/edit/delete",
-    "cancel" :"Cancel",
-    "confirm" :"Confirm",
-    "confirm_delete" :"Confirm to delete",
-    "attorn" :"Attorn",
-    "archive" :"Archive",
-    "attorn_tips":"You can attorn item(s) to other user(s)",
-    "archive_tips":"After archiving, the item will become read-only, and no more changes / additions can be made. If you want to edit it again, copy it to the new project and then edit it",
-    "delete_tips":"After deleting it, it can not be restored!",
-    "attorn_username" :"Username of receiver",
-    "archive_tips2":"Note: After archiving a project, the project will no longer be able to add and modify content and will not be able to unarchive. If you want to modify the content again, you can copy the project and modify it on the basis of the new project. The way to copy a project is to choose to copy from an existing project when you create the project.",
-    "success_jump" :"The operation is successful! Skipping...",
-    "reset_token":"Reset token",
-    "open_api_tips1":"Showdoc opens the API for document editing, making it easier for users to manipulate document data. <br>With the open API, you can do a lot of things automatically",
-    "open_api_tips2":'If you want to automate the generation of API documentation, you can refer to<a target="_bank" href="https://www.showdoc.cc/page/741656402509783">API documentation</a>',
-    "open_api_tips3":'If you want to automate the generation of a data dictionary, you can refer to<a target="_bank" href="https://www.showdoc.cc/page/312209902620725">Data dictionary</a>',
-    "open_api_tips4":'If you are more free to generate the format you need, you can refer to<a target="_bank" href="https://www.showdoc.cc/page/102098">Open API</a>',
-    //item/show
-    'item':'Item',
-    'share':'Share',
-    'export':'Export',
-    'update_info':'Update info',
-    'manage_members':'Manage members',
-    'more_item':'More item(s)',
-    'login_or_register':'Login/Register',
-    'about_showdoc':'About ShowDoc',
-    'new_page':'New page',
-    'edit_page':'Edit page',
-    'new_catalog':'New/Manage catalog ',
-    'share_address_to_your_friends':'Share the interface address to your friends',
-    'share':'Share',
-    'copy_interface_to_new':'Copy this page to a new page',
-    'copy':'Copy',
-    'edit':'Edit',
-    'detail':'Detail',
-    'delete_interface':'Delete page',
-    'comfirm_delete':'Comfirm to delete',
-    'delete':'Delete',
-    'item_address':'Item address',
-    'copy_address_to_your_friends':'You can copy the address to your friend',
-    'share_page':'Share page',
-    'page_address':'Page address',
-    'copy_address_to_your_friends':'You can copy the address to your friend',
-    'input_keyword':'Press Enter to search',
-    'item_page_address':'Item page address',
-    'single_page_address':'Single page address',
-    'page_diff_tips':'What is the difference between the project page address and the single page address?',
+  // item/setting
+  'base_info': 'Base info',
+  'member_manage': 'Manage member',
+  'advance_setting': 'Advanced setting',
+  'open_api': 'open api',
+  'info_item_domain': 'Personal domain name',
+  'visit_password': 'Password',
+  'visit_password_description': '(Optional: private item required)',
+  'add_member': 'Add member',
+  'authority': 'Authority',
+  'add_time': 'Add time',
+  'operation': 'Operation',
+  'delete': 'Delete',
+  'input_target_member': "Input member's username",
+  'readonly': 'Read-only',
+  'member_authority_tips': 'Permission Description: The default member can create/edit the project page, and only delete the newly created/edited page when deleting. After checking the read-only attribute, the member can only view all pages, and cannot add/edit/delete',
+  'cancel': 'Cancel',
+  'confirm': 'Confirm',
+  'confirm_delete': 'Confirm to delete',
+  'attorn': 'Attorn',
+  'archive': 'Archive',
+  'attorn_tips': 'You can attorn item(s) to other user(s)',
+  'archive_tips': 'After archiving, the item will become read-only, and no more changes / additions can be made. If you want to edit it again, copy it to the new project and then edit it',
+  'delete_tips': 'After deleting it, it can not be restored!',
+  'attorn_username': 'Username of receiver',
+  'archive_tips2': 'Note: After archiving a project, the project will no longer be able to add and modify content and will not be able to unarchive. If you want to modify the content again, you can copy the project and modify it on the basis of the new project. The way to copy a project is to choose to copy from an existing project when you create the project.',
+  'success_jump': 'The operation is successful! Skipping...',
+  'reset_token': 'Reset token',
+  'open_api_tips1': 'Showdoc opens the API for document editing, making it easier for users to manipulate document data. <br>With the open API, you can do a lot of things automatically',
+  'open_api_tips2': 'If you want to automate the generation of API documentation, you can refer to<a target="_bank" href="https://www.showdoc.cc/page/741656402509783">API documentation</a>',
+  'open_api_tips3': 'If you want to automate the generation of a data dictionary, you can refer to<a target="_bank" href="https://www.showdoc.cc/page/312209902620725">Data dictionary</a>',
+  'open_api_tips4': 'If you are more free to generate the format you need, you can refer to<a target="_bank" href="https://www.showdoc.cc/page/102098">Open API</a>',
+  // item/show
+  'item': 'Item',
+  'share': 'Share',
+  'export': 'Export',
+  'update_info': 'Update info',
+  'manage_members': 'Manage members',
+  'more_item': 'More item(s)',
+  'login_or_register': 'Login/Register',
+  'about_showdoc': 'About ShowDoc',
+  'new_page': 'New page',
+  'edit_page': 'Edit page',
+  'new_catalog': 'New/Manage catalog ',
+  'share_address_to_your_friends': 'Share the interface address to your friends',
+  'copy_interface_to_new': 'Copy this page to a new page',
+  'copy': 'Copy',
+  'edit': 'Edit',
+  'detail': 'Detail',
+  'delete_interface': 'Delete page',
+  'comfirm_delete': 'Comfirm to delete',
+  'item_address': 'Item address',
+  'copy_address_to_your_friends': 'You can copy the address to your friend',
+  'share_page': 'Share page',
+  'page_address': 'Page address',
+  'input_keyword': 'Press Enter to search',
+  'item_page_address': 'Item page address',
+  'single_page_address': 'Single page address',
+  'page_diff_tips': 'What is the difference between the project page address and the single page address?',
 
-    //page
-    'title':'Title',
-    'catalog':'Catalog',
-    'level_2_directory':'Level 2 catalog',
-    'level_3_directory':'Level 3 catalog',
-    's_number':'Order',
-    's_number_explain':'The default is 99, the smaller the number, the earlier it is set.(optional)',
-    'optional':'Optional',
-    'history_version':'History version',
-    'save':'Save',
-    'cancel':'Cancel',
-    'insert_apidoc_template':'ApiDoc template',
-    'insert_database_doc_template':'DatabaseDoc template',
-    'json_tools':'Json tools',
-    'format_tools':'Format tools',
-    'json_to_table':'JSON to table',
-    'beautify_json':'JSON beautify',
-    'beautify_json_description':'Please paste a JSON script, the program will automatically format the display in an elegant way.',
-    'http_test_api':'Test API online',
-    'json_to_table_description':'Please paste a JSON script, the program will automatically parse the code and generate a parameter table. This feature is suitable for quickly writing back parameter tables for API documents.',
-    'confirm':'Confirm',
-    'cancel':'Cancel',
-    'update_time':'Update time',
-    'update_by_who':'Update by ',
-    'recover_to_this_version':'Recover',
-    'close':'Close',
-    'finish':'Finish',
-    'params':'params',
-    'clear':'Clear',
-    'result':'Result',
-    'save_to_templ':'Save to template',
-    'more_templ':'More templates',
-    'saved_templ_list':'Template list',
-    'page_comments':'Page comment',
-    'cur_page_content':'Current newest version',
-    'overview':'Overview',
-    'save_templ_title':'Input template title',
-    'save_templ_text':'The template has been saved. When you create or edit an edit page later, click the "More Templates" button to use your saved template.',
-    'welcome_use_showdoc':'Welcome to ShowDoc!',
-    'templ_list':'Template list',
-    'templ_title':'Template title',
-    'no_templ_text':'You have not saved any templates yet. You can click on the right side of the "Save" button while editing the page, and select "Save as template" from the drop-down menu. After saving the page content as a template, you can use your previously saved template the next time you create or edit a page.',
-    'save_time':'Save time' ,
-    'insert_templ':'Insert',
-    'delete_templ':'Delete',
-    'save_success':'Save success',
-    'paste_insert_table': 'Insert table from paste',
-    'paste_insert_table_tips':'Paste (Ctrl + V) below an existing table data copied (Ctrl + C) from a spreadsheet (e.g. Microsoft Excel), a text document, a Markdown code, or even a website.',
-    //catalog
-    'add_cat':'Add catalog',
-    'cat_name':'Catalog name',
-    'input_cat_name':'Input catalog name',
-    'parent_cat_name':'Parent catalog',
-    'none':'none',
+  // page
+  'title': 'Title',
+  'catalog': 'Catalog',
+  'level_2_directory': 'Level 2 catalog',
+  'level_3_directory': 'Level 3 catalog',
+  's_number': 'Order',
+  's_number_explain': 'The default is 99, the smaller the number, the earlier it is set.(optional)',
+  'optional': 'Optional',
+  'history_version': 'History version',
+  'save': 'Save',
+  'insert_apidoc_template': 'ApiDoc template',
+  'insert_database_doc_template': 'DatabaseDoc template',
+  'json_tools': 'Json tools',
+  'format_tools': 'Format tools',
+  'json_to_table': 'JSON to table',
+  'beautify_json': 'JSON beautify',
+  'beautify_json_description': 'Please paste a JSON script, the program will automatically format the display in an elegant way.',
+  'http_test_api': 'Test API online',
+  'json_to_table_description': 'Please paste a JSON script, the program will automatically parse the code and generate a parameter table. This feature is suitable for quickly writing back parameter tables for API documents.',
+  'update_time': 'Update time',
+  'update_by_who': 'Update by ',
+  'recover_to_this_version': 'Recover',
+  'close': 'Close',
+  'finish': 'Finish',
+  'params': 'params',
+  'clear': 'Clear',
+  'result': 'Result',
+  'save_to_templ': 'Save to template',
+  'more_templ': 'More templates',
+  'saved_templ_list': 'Template list',
+  'page_comments': 'Page comment',
+  'cur_page_content': 'Current newest version',
+  'overview': 'Overview',
+  'save_templ_title': 'Input template title',
+  'save_templ_text': 'The template has been saved. When you create or edit an edit page later, click the "More Templates" button to use your saved template.',
+  'welcome_use_showdoc': 'Welcome to ShowDoc!',
+  'templ_list': 'Template list',
+  'templ_title': 'Template title',
+  'no_templ_text': 'You have not saved any templates yet. You can click on the right side of the "Save" button while editing the page, and select "Save as template" from the drop-down menu. After saving the page content as a template, you can use your previously saved template the next time you create or edit a page.',
+  'save_time': 'Save time',
+  'insert_templ': 'Insert',
+  'delete_templ': 'Delete',
+  'save_success': 'Save success',
+  'paste_insert_table': 'Insert table from paste',
+  'paste_insert_table_tips': 'Paste (Ctrl + V) below an existing table data copied (Ctrl + C) from a spreadsheet (e.g. Microsoft Excel), a text document, a Markdown code, or even a website.',
+  // catalog
+  'add_cat': 'Add catalog',
+  'cat_name': 'Catalog name',
+  'input_cat_name': 'Input catalog name',
+  'parent_cat_name': 'Parent catalog',
+  'none': 'none',
 
+  // 其他
+  'back_to_top': 'Back to top',
+  'draft_tips': 'Your last draft is automatically saved. Do you want automatically fill this document in with the last draft?',
 
-    //其他
-    "back_to_top":'Back to top',
-    'draft_tips':"Your last draft is automatically saved. Do you want automatically fill this document in with the last draft?",
+  // 管理后台
+  'management_backstage': 'Backstage',
+  'user_management': 'User(s)',
+  'item_management': 'Items',
+  'add_user': 'Add user',
+  'search': 'Search',
 
-    //管理后台
-    "management_backstage":"Backstage" ,
-    "user_management":"User(s)" ,
-    "item_management":"Items" ,
-    "add_user":"Add user" ,
-    "search":"Search" ,
+  'team_mamage': 'Manage Team(s)',
+  'background': 'Background',
+  'distribution_to_team': 'Distribution item',
+  'back_to_team': 'Back to team',
+  'check_item': 'Check item',
+  'unassign': 'Unassign',
+  'go_to_new_an_item': 'New item',
+  'confirm_unassign': 'Confirm unassign?',
+  'Join_time': 'Join time',
+  'add_team': 'Add team',
+  'member_authority': 'Member authority',
+  'go_to_new_an_team': 'New team',
+  'adjust_member_authority': 'Adjust member authority',
+  'team_member_empty_tips': 'The team does not have any members yet.',
+  'team_member_authority_tips': 'Permission description: The editing permission means that members can create/edit project pages, and when deleted, they can only delete their own newly created/edited pages. The read-only permission means that the member can only view all pages of this project and can not add/edit/delete them.',
+  'member': 'Member',
+  'team_item': 'Item',
+  'member_username': 'Member username',
+  'team_name': 'Team name',
+  'memberCount': 'Member count',
+  'itemCount': 'Item count',
+  'empty_team_tips': 'Welcome to the team management function. This function is well suited for collaborative management of team leader for multi person and cross team projects. Please click the top left button to add the team(s). After adding team(s), team members can be added or deleted at any time, allocated to different projects in batches, and member rights can be set in different projects. Compared with simple membership management mode, team management function can add and delete personnel in batches, which is more convenient for complex team cooperation.',
 
-    "team_mamage":'Manage Team(s)',
-    "background":'Background',
-    "distribution_to_team":'Distribution item',
-    "back_to_team":'Back to team',
-    "check_item":'Check item',
-    "unassign":'Unassign',
-    "go_to_new_an_item":'New item',
-    "confirm_unassign":'Confirm unassign?',
-    "Join_time":'Join time',
-    "add_team":'Add team',
-    "member_authority":'Member authority',
-    "go_to_new_an_team":'New team',
-    "adjust_member_authority":'Adjust member authority',
-    "team_member_empty_tips":'The team does not have any members yet.',
-    "team_member_authority_tips":'Permission description: The editing permission means that members can create/edit project pages, and when deleted, they can only delete their own newly created/edited pages. The read-only permission means that the member can only view all pages of this project and can not add/edit/delete them.',
-    "member":"Member",
-    "team_item":"Item",
-    "add_member":"Add member",
-    "member_username":"Member username",
-    "team_name":"Team name",
-    "memberCount":"Member count",
-    "itemCount":"Item count",
-    "empty_team_tips":"Welcome to the team management function. This function is well suited for collaborative management of team leader for multi person and cross team projects. Please click the top left button to add the team(s). After adding team(s), team members can be added or deleted at any time, allocated to different projects in batches, and member rights can be set in different projects. Compared with simple membership management mode, team management function can add and delete personnel in batches, which is more convenient for complex team cooperation.",
+  'copy_link': 'Copy link',
+  'copy_success': 'Copy success',
 
-    "copy_link":"Copy link",
-    "copy_success":"Copy success",
+  'user_manage': 'User manage',
+  'item_manage': 'Item manage',
+  'web_setting': 'Web setting',
+  'register_open_label': 'Register open',
+  'ldap_open_label': 'LDAP login',
 
-    "user_manage":"User manage",
-    "item_manage":"Item manage",
-    "web_setting":"Web setting",
-    "register_open_label":"Register open",
-    "ldap_open_label":"LDAP login",
+  'name': 'Name',
+  'name_tips': 'Your real name',
 
-    "name":"Name",
-    "name_tips":"Your real name",
+  'attachment': 'Attachment',
+  'upload': 'Upload',
+  'upload_file': 'Upload file',
+  'file_name': 'File name',
+  'download': 'Download',
+  'file_size_tips': 'Less than 4MB',
 
-    "attachment":"Attachment",
-    "upload":"Upload",
-    "upload_file":"Upload file",
-    "file_name":"File name",
-    "download":"Download",
-    "file_size_tips":"Less than 4MB",
-    
-    "confirm_cat_delete" :"Are you sure you want to delete the directory? This action will delete all the pages in this directory. Please be careful.",
+  'confirm_cat_delete': 'Are you sure you want to delete the directory? This action will delete all the pages in this directory. Please be careful.',
 
-    "userrole":"User role",
-    "reg_time":"Registration time",
-    "last_login_time":"Last login time",
-    "administrator":"Administrator",
-    "ordinary_users":"Ordinary users",
-    "owner":"Owner",
-    "privacy":"Privacy",
-    "link":"link",
-    "private":"private",
-    "public":"public",
-    "register_open":"Open registration",
-    "long_page_tips":'The content of this page was detected to be more, and showdoc temporarily shut down the HTML real-time preview function to prevent the page from getting stuck due to too much content. You can find the preview button in the edit bar and open it manually.',
+  'userrole': 'User role',
+  'reg_time': 'Registration time',
+  'last_login_time': 'Last login time',
+  'administrator': 'Administrator',
+  'ordinary_users': 'Ordinary users',
+  'owner': 'Owner',
+  'privacy': 'Privacy',
+  'link': 'link',
+  'private': 'private',
+  'public': 'public',
+  'register_open': 'Open registration',
+  'long_page_tips': 'The content of this page was detected to be more, and showdoc temporarily shut down the HTML real-time preview function to prevent the page from getting stuck due to too much content. You can find the preview button in the edit bar and open it manually.',
 
-    "item_exit":"Exit item",
-    "confirm_exit_item":"Are you sure to exit this item?",
+  'item_exit': 'Exit item',
+  'confirm_exit_item': 'Are you sure to exit this item?',
 
-    "insert":"Insert",
+  'insert': 'Insert',
 
-    "Open_item":"public item",
-    "private_item":"private item",
-    "private_item_passwrod":"Please set a password for private item",
+  'Open_item': 'public item',
+  'private_item': 'private item',
+  'private_item_passwrod': 'Please set a password for private item',
 
-    "create_sigle_page":"I want to create a single page address",
-    "create_sigle_page_tips":"When you just want to share a page and not the whole project, you can choose to share a single page address. After sharing, your friends will only see a single page, can not browse the catalog menu, and can not switch to other pages to view.",
-    
-    "home_page":"Website home page",
-    "full_page":"Full page",
-    "login_page":"jump to login page",
-    "jump_to_an_item":"jump to an item",
-    "jump_to_item":"choose item",
+  'create_sigle_page': 'I want to create a single page address',
+  'create_sigle_page_tips': 'When you just want to share a page and not the whole project, you can choose to share a single page address. After sharing, your friends will only see a single page, can not browse the catalog menu, and can not switch to other pages to view.',
 
-    "recycle":"recycle",
-    "recycle_tips":"The deleted page will go to the recycle bin. The content in the recycle bin for more than 30 days will be automatically selected by the system and cleaned up when appropriate",
-    "page_title":"Page title",
-    "deleter":"Delete Account",
-    "del_time":"Delete time",
-    "recover":"recover",
-    "recover_tips":"Are you sure to recover? The recovered page will appear in the item root",
+  'home_page': 'Website home page',
+  'full_page': 'Full page',
+  'login_page': 'jump to login page',
+  'jump_to_an_item': 'jump to an item',
+  'jump_to_item': 'choose item',
 
-    "sort_pages":"Sort Pages",
-    "sort_pages_tips":"After selecting a specific catalog, you can drag and sort the pages in that catalog",
+  'recycle': 'recycle',
+  'recycle_tips': 'The deleted page will go to the recycle bin. The content in the recycle bin for more than 30 days will be automatically selected by the system and cleaned up when appropriate',
+  'page_title': 'Page title',
+  'deleter': 'Delete Account',
+  'del_time': 'Delete time',
+  'recover': 'recover',
+  'recover_tips': 'Are you sure to recover? The recovered page will appear in the item root',
 
-    "cat_tips":"Drag to sort",
-    "cat_limite_tips":"Only up to three levels of directories are supported",
+  'sort_pages': 'Sort Pages',
+  'sort_pages_tips': 'After selecting a specific catalog, you can drag and sort the pages in that catalog',
 
-    "regular_item":"Regular Item",
-    "single_item":"Single Item",
-    "copy_item":"Copy Item",
-    "import_file":"Import File",
-    "auto_item":"Auto Create",
-    "single_item_tips":"Single item refers to the item with no catalog structure and only one page",
-    "copy_item_tips1":"Select and copy from your existing items",
-    "copy_item_tips2":"After copying, rename the new item to:",
-    "import_file_tips1":"The imported file can be the JSON file of postman, the JSON file of swagger, and the markdown zip of showdoc. The system will automatically identify the file type",
-    "import_file_tips2":"Drag the file here, or click to upload",
-    "export_format_word":"Word format",
-    "export_format_markdown":"Markdown zip",
-    "export_markdown_tips":"The exported compressed package can be re imported into showdoc. Select 'Import File' when creating a new item",
+  'cat_tips': 'Drag to sort',
+  'cat_limite_tips': 'Only up to three levels of directories are supported',
 
-    "private_tips":"It's a private item",
+  'regular_item': 'Regular Item',
+  'single_item': 'Single Item',
+  'copy_item': 'Copy Item',
+  'import_file': 'Import File',
+  'auto_item': 'Auto Create',
+  'single_item_tips': 'Single item refers to the item with no catalog structure and only one page',
+  'copy_item_tips1': 'Select and copy from your existing items',
+  'copy_item_tips2': 'After copying, rename the new item to:',
+  'import_file_tips1': 'The imported file can be the JSON file of postman, the JSON file of swagger, and the markdown zip of showdoc. The system will automatically identify the file type',
+  'import_file_tips2': 'Drag the file here, or click to upload',
+  'export_format_word': 'Word format',
+  'export_format_markdown': 'Markdown zip',
+  'export_markdown_tips': "The exported compressed package can be re imported into showdoc. Select 'Import File' when creating a new item",
 
-    "oss_open":"Image/attachment saved to cloud",
-    "oss_server":"cloud server",
-    "aliyun":"aliyun",
-    "qiniu":"qiniu",
-    "oss_domain":"domain(optional)",
+  'private_tips': "It's a private item",
 
-    "attornTeamTips":"All items owned by the team will also be transferred to he/her",
+  'oss_open': 'Image/attachment saved to cloud',
+  'oss_server': 'cloud server',
+  'aliyun': 'aliyun',
+  'qiniu': 'qiniu',
+  'oss_domain': 'domain(optional)',
 
-};
+  'attornTeamTips': 'All items owned by the team will also be transferred to he/her',
+
+  lock_edit: 'Lock edit',
+  lock_edit_tips: 'When locked, other people will not be able to edit this page. Until you unlock or exit editing',
+  cacel_lock: 'Unlock',
+  locking: 'The current page is being locked and edited by other members. Editor:'
+
+}

+ 297 - 302
web_src/static/lang/zh-CN.js

@@ -1,131 +1,129 @@
-exports.__esModule = true;
+exports.__esModule = true
 exports.default = {
-  //index
-  help: "帮助",
-  demo: "示例",
-  index_login_or_register: "登录 / 注册",
-  my_item: "我的项目",
-  section_title1: "ShowDoc",
-  section_description1: "一个非常适合IT团队的在线API文档、技术文档工具",
-  section_title2: "API文档",
+  // index
+  help: '帮助',
+  demo: '示例',
+  index_login_or_register: '登录 / 注册',
+  my_item: '我的项目',
+  section_title1: 'ShowDoc',
+  section_description1: '一个非常适合IT团队的在线API文档、技术文档工具',
+  section_title2: 'API文档',
   section_description2:
-    " APP、web前端与服务器常用API来进行交互<br>用ShowDoc可以非常方便快速地编写出美观的API文档",
-  section_title3: "数据字典",
+    ' APP、web前端与服务器常用API来进行交互<br>用ShowDoc可以非常方便快速地编写出美观的API文档',
+  section_title3: '数据字典',
   section_description3:
-    "好的数据字典可以很方便地向别人描述你的数据库结构<br>用ShowDoc可以编辑出美观的数据字典",
-  section_title4: "说明文档",
+    '好的数据字典可以很方便地向别人描述你的数据库结构<br>用ShowDoc可以编辑出美观的数据字典',
+  section_title4: '说明文档',
   section_description4:
-    "你完全可以使用 ShowDoc来编写一些工具的说明书<br>也可以编写一些技术规范说明文档以供团队查阅",
-  section_title5: "团队协作",
-  section_description5: "团队权限管理机制让团队良好地协同编写文档",
-  section_title6: "免费开源",
+    '你完全可以使用 ShowDoc来编写一些工具的说明书<br>也可以编写一些技术规范说明文档以供团队查阅',
+  section_title5: '团队协作',
+  section_description5: '团队权限管理机制让团队良好地协同编写文档',
+  section_title6: '免费开源',
   section_description6:
-    "ShowDoc提供免费开源的版本<br>你可以选择将ShowDoc部署到你的服务器",
-  section_title7: "在线托管",
+    'ShowDoc提供免费开源的版本<br>你可以选择将ShowDoc部署到你的服务器',
+  section_title7: '在线托管',
   section_description7:
-    "www.showdoc.cc 提供安全稳定的在线文档托管服务<br>你可以放心地选择托管你的文档数据在云端",
-  section_title8: "立即体验",
-  section_description8: "超过10000+互联网团队正在使用ShowDoc",
+    'www.showdoc.cc 提供安全稳定的在线文档托管服务<br>你可以放心地选择托管你的文档数据在云端',
+  section_title8: '立即体验',
+  section_description8: '超过10000+互联网团队正在使用ShowDoc',
 
-  //user
-  login: "登录",
-  username: "用户名",
-  password: "密码",
-  register_new_account: "注册新账号",
-  forget_password: "忘记密码",
-  username_description: "用户名/邮箱",
-  password_again: "再次输入密码",
-  verification_code: "验证码",
-  register: "注册",
-  update_personal_info: "修改个人信息",
-  submit: "提交",
-  goback: "返回",
-  my_email: "我的邮箱",
-  input_email: "请输入要绑定的邮箱",
-  input_login_password: "请输入你的登录密码以验证",
-  status: "状态",
-  status_1: "已验证",
-  status_2: "未验证",
-  status_3: "未绑定",
-  binding: "绑定",
-  modify: "修改",
-  modify_password: "修改密码",
-  old_password: "原密码",
-  new_password: "新密码",
-  modify_success: "修改成功",
-  update_email_success: "更新邮箱成功!请登录邮箱查收验证邮件",
+  // user
+  login: '登录',
+  username: '用户名',
+  password: '密码',
+  register_new_account: '注册新账号',
+  forget_password: '忘记密码',
+  username_description: '用户名/邮箱',
+  password_again: '再次输入密码',
+  verification_code: '验证码',
+  register: '注册',
+  update_personal_info: '修改个人信息',
+  submit: '提交',
+  goback: '返回',
+  my_email: '我的邮箱',
+  input_email: '请输入要绑定的邮箱',
+  input_login_password: '请输入你的登录密码以验证',
+  status: '状态',
+  status_1: '已验证',
+  status_2: '未验证',
+  status_3: '未绑定',
+  binding: '绑定',
+  modify: '修改',
+  modify_password: '修改密码',
+  old_password: '原密码',
+  new_password: '新密码',
+  modify_success: '修改成功',
+  update_email_success: '更新邮箱成功!请登录邮箱查收验证邮件',
 
-  //item/index
-  personal_setting: "个人设置",
-  web_home: "网站首页",
-  logout: "退出登录",
-  add_an_item: "添加一个新项目",
-  new_item: "新建项目",
-  feedback: "反馈",
-  more: "更多",
-  my_notice: "我的消息",
-  item_setting: "项目设置",
-  item_top: "置顶项目",
-  cancel_item_top: "取消置顶",
+  // item/index
+  personal_setting: '个人设置',
+  web_home: '网站首页',
+  logout: '退出登录',
+  add_an_item: '添加一个新项目',
+  new_item: '新建项目',
+  feedback: '反馈',
+  more: '更多',
+  my_notice: '我的消息',
+  item_setting: '项目设置',
+  item_top: '置顶项目',
+  cancel_item_top: '取消置顶',
 
-  //item/add
-  item_type1: "常规项目",
-  item_type2: "单页项目",
-  item_name: "项目名",
-  item_description: "项目描述",
-  item_domain: "(可选)个性域名",
-  item_domain_illegal: "个性域名只能是字母或数字的组合",
-  domain_already_exists: "个性域名已经存在",
-  visit_password_placeholder: "访问密码",
-  submit: "提交",
-  goback: "返回",
-  copy_exists_item: "复制已存在项目",
-  please_choose: "请选择",
-  auto_db: "我要自动生成数据字典",
+  // item/add
+  item_type1: '常规项目',
+  item_type2: '单页项目',
+  item_name: '项目名',
+  item_description: '项目描述',
+  item_domain: '(可选)个性域名',
+  item_domain_illegal: '个性域名只能是字母或数字的组合',
+  domain_already_exists: '个性域名已经存在',
+  visit_password_placeholder: '访问密码',
+  copy_exists_item: '复制已存在项目',
+  please_choose: '请选择',
+  auto_db: '我要自动生成数据字典',
 
-  //item/pwd
-  input_visit_password: "请输入访问密码",
+  // item/pwd
+  input_visit_password: '请输入访问密码',
 
-  //item/export
-  export_all: "导出全部",
-  export_cat: "按目录导出",
-  select_cat_2: "选择二级目录:",
-  select_cat_3: "选择三级目录:",
-  begin_export: "开始导出",
+  // item/export
+  export_all: '导出全部',
+  export_cat: '按目录导出',
+  select_cat_2: '选择二级目录:',
+  select_cat_3: '选择三级目录:',
+  begin_export: '开始导出',
 
-  //item/setting
-  base_info: "基础信息",
-  member_manage: "成员管理",
-  advance_setting: "高级设置",
-  open_api: "开放API",
-  info_item_domain: "个性域名",
-  visit_password: "访问密码",
-  visit_password_description: "(可选)私有项目请设置访问密码",
-  add_member: "添加成员",
-  authority: "权限",
-  add_time: "添加时间",
-  operation: "操作",
-  delete: "删除",
-  input_target_member: "请输入目标成员的用户名",
-  readonly: "只读",
+  // item/setting
+  base_info: '基础信息',
+  member_manage: '成员管理',
+  advance_setting: '高级设置',
+  open_api: '开放API',
+  info_item_domain: '个性域名',
+  visit_password: '访问密码',
+  visit_password_description: '(可选)私有项目请设置访问密码',
+  add_member: '添加成员',
+  authority: '权限',
+  add_time: '添加时间',
+  operation: '操作',
+  delete: '删除',
+  input_target_member: '请输入目标成员的用户名',
+  readonly: '只读',
   member_authority_tips:
-    "权限说明:默认成员可以新建/编辑项目页面,删除时将只能删除自己新建/编辑的页面。 勾选只读属性后,该成员对所有页面都只能查看,无法新增/编辑/删除",
-  cancel: "取消",
-  confirm: "确定",
-  confirm_delete: "确认删除吗?",
-  attorn: "转让",
-  archive: "归档",
-  attorn_tips: "你可以将项目转让给他人",
+    '权限说明:默认成员可以新建/编辑项目页面,删除时将只能删除自己新建/编辑的页面。 勾选只读属性后,该成员对所有页面都只能查看,无法新增/编辑/删除',
+  cancel: '取消',
+  confirm: '确定',
+  confirm_delete: '确认删除吗?',
+  attorn: '转让',
+  archive: '归档',
+  attorn_tips: '你可以将项目转让给他人',
   archive_tips:
-    "归档后,项目将变为只读,无法再修改/新增内容。如果要重新编辑,请复制到新项目后编辑",
-  delete_tips: "删除后将不可恢复!",
-  attorn_username: "接受者用户名",
+    '归档后,项目将变为只读,无法再修改/新增内容。如果要重新编辑,请复制到新项目后编辑',
+  delete_tips: '删除后将不可恢复!',
+  attorn_username: '接受者用户名',
   archive_tips2:
-    "说明: 归档项目后,项目将无法再新增和修改内容,并且无法取消归档状态。 如想再次修改内容,可复制本项目,在新的项目基础上修改。复制项目的方法是,在创建项目的时候,选择从已有项目里复制。",
-  success_jump: "操作成功!正在跳转...",
-  reset_token: "重新生成api_token",
+    '说明: 归档项目后,项目将无法再新增和修改内容,并且无法取消归档状态。 如想再次修改内容,可复制本项目,在新的项目基础上修改。复制项目的方法是,在创建项目的时候,选择从已有项目里复制。',
+  success_jump: '操作成功!正在跳转...',
+  reset_token: '重新生成api_token',
   open_api_tips1:
-    "showdoc开放文档编辑的API,供使用者更加方便地操作文档数据。<br>利用开放API,你可以自动化地完成很多事",
+    'showdoc开放文档编辑的API,供使用者更加方便地操作文档数据。<br>利用开放API,你可以自动化地完成很多事',
   open_api_tips2:
     '如果你想自动化生成API文档,则可参考<a target="_bank" href="https://www.showdoc.cc/page/741656402509783">API文档</a>',
   open_api_tips3:
@@ -133,228 +131,225 @@ exports.default = {
   open_api_tips4:
     '如果你更自由地生成自己所需要的格式,则可参考<a target="_bank" href="https://www.showdoc.cc/page/102098">开放API</a>',
 
-  //item/show
-  item: "项目",
-  share: "分享",
-  export: "导出",
-  update_info: "修改信息",
-  manage_members: "成员管理",
-  more_item: "更多项目",
-  login_or_register: "登录/注册",
-  about_showdoc: "关于ShowDoc",
-  my_item: "我的项目",
-  new_page: "新建页面",
-  edit_page: "编辑页面",
-  new_catalog: "新建/管理目录",
-  share_address_to_your_friends: "分享该接口地址给你的好友",
-  share: "分享",
-  copy_interface_to_new: "复制该页面到新页面",
-  copy: "复制",
-  edit: "编辑",
-  detail: "详情",
-  delete_interface: "删除页面",
-  comfirm_delete: "确认删除吗?",
-  delete: "删除",
-  item_address: "项目地址",
-  copy_address_to_your_friends: "你可以复制地址给你的好友",
-  share_page: "分享页面",
-  page_address: "页面地址",
-  copy_address_to_your_friends: "你可以复制地址给你的好友",
-  input_keyword: "输入关键字后按回车以搜索",
-  item_page_address: "项目页面地址",
-  single_page_address: "单页面地址",
-  page_diff_tips: "项目页面地址和单页面地址有什么区别?",
+  // item/show
+  item: '项目',
+  share: '分享',
+  export: '导出',
+  update_info: '修改信息',
+  manage_members: '成员管理',
+  more_item: '更多项目',
+  login_or_register: '登录/注册',
+  about_showdoc: '关于ShowDoc',
+  new_page: '新建页面',
+  edit_page: '编辑页面',
+  new_catalog: '新建/管理目录',
+  share_address_to_your_friends: '分享该接口地址给你的好友',
+  copy_interface_to_new: '复制该页面到新页面',
+  copy: '复制',
+  edit: '编辑',
+  detail: '详情',
+  delete_interface: '删除页面',
+  comfirm_delete: '确认删除吗?',
+  item_address: '项目地址',
+  copy_address_to_your_friends: '你可以复制地址给你的好友',
+  share_page: '分享页面',
+  page_address: '页面地址',
+  input_keyword: '输入关键字后按回车以搜索',
+  item_page_address: '项目页面地址',
+  single_page_address: '单页面地址',
+  page_diff_tips: '项目页面地址和单页面地址有什么区别?',
 
-  //page
-  title: "标题",
-  catalog: "目录",
-  level_2_directory: "二级目录",
-  level_3_directory: "三级目录",
-  s_number: "序号",
-  s_number_explain: "(可选)默认是99,数字越小越靠前",
-  optional: "可选",
-  history_version: "历史版本",
-  save: "保存",
-  cancel: "取消",
-  insert_apidoc_template: "API接口模板",
-  insert_database_doc_template: "数据字典模板",
-  json_tools: "JSON工具",
-  format_tools: "格式工具",
-  json_to_table: "JSON转参数表格",
-  beautify_json: "JSON格式化",
-  beautify_json_description: "请粘贴一段json,程序将自动以美观的方式格式化显示",
-  http_test_api: "在线测试API",
+  // page
+  title: '标题',
+  catalog: '目录',
+  level_2_directory: '二级目录',
+  level_3_directory: '三级目录',
+  s_number: '序号',
+  s_number_explain: '(可选)默认是99,数字越小越靠前',
+  optional: '可选',
+  history_version: '历史版本',
+  save: '保存',
+  insert_apidoc_template: 'API接口模板',
+  insert_database_doc_template: '数据字典模板',
+  json_tools: 'JSON工具',
+  format_tools: '格式工具',
+  json_to_table: 'JSON转参数表格',
+  beautify_json: 'JSON格式化',
+  beautify_json_description: '请粘贴一段json,程序将自动以美观的方式格式化显示',
+  http_test_api: '在线测试API',
   json_to_table_description:
-    "请粘贴一段json,程序将自动将json解析并生成参数表格。此功能适合用于快速编写API文档的返回参数表格",
-  confirm: "确定",
-  cancel: "取消",
-  update_time: "修改时间",
-  update_by_who: "修改人",
-  recover_to_this_version: "恢复到此版本",
-  close: "关闭",
-  finish: "完成",
-  params: "参数",
-  clear: "清除",
-  result: "返回结果",
-  save_to_templ: "另存为模板",
-  more_templ: "更多模板",
-  saved_templ_list: "保存的模板列表",
-  page_comments: "页面注释",
-  cur_page_content: "当前最新版本",
-  overview: "预览",
-  save_templ_title: "请为要保存的模板设置标题",
+    '请粘贴一段json,程序将自动将json解析并生成参数表格。此功能适合用于快速编写API文档的返回参数表格',
+  update_time: '修改时间',
+  update_by_who: '修改人',
+  recover_to_this_version: '恢复到此版本',
+  close: '关闭',
+  finish: '完成',
+  params: '参数',
+  clear: '清除',
+  result: '返回结果',
+  save_to_templ: '另存为模板',
+  more_templ: '更多模板',
+  saved_templ_list: '保存的模板列表',
+  page_comments: '页面注释',
+  cur_page_content: '当前最新版本',
+  overview: '预览',
+  save_templ_title: '请为要保存的模板设置标题',
   save_templ_text:
-    "已经保存好模板。你以后新建或者编辑编辑页面时,点击“更多模板”按钮,便可以使用你保存的模板",
-  welcome_use_showdoc: "欢迎使用ShowDoc!",
-  templ_list: "模板列表",
-  templ_title: "模板标题",
+    '已经保存好模板。你以后新建或者编辑编辑页面时,点击“更多模板”按钮,便可以使用你保存的模板',
+  welcome_use_showdoc: '欢迎使用ShowDoc!',
+  templ_list: '模板列表',
+  templ_title: '模板标题',
   no_templ_text:
-    "你尚未保存过任何模板。你可以在编辑页面时,在“保存”按钮右边点击,在下拉菜单中选择“另存为模板”。把页面内容保存为模板后,你下次新建或者编辑页面时便可以使用你之前保存的模板",
-  save_time: "保存时间",
-  insert_templ: "插入此模板",
-  delete_templ: "删除模板",
-  save_success: "保存成功",
-  paste_insert_table: "粘贴插入表格",
+    '你尚未保存过任何模板。你可以在编辑页面时,在“保存”按钮右边点击,在下拉菜单中选择“另存为模板”。把页面内容保存为模板后,你下次新建或者编辑页面时便可以使用你之前保存的模板',
+  save_time: '保存时间',
+  insert_templ: '插入此模板',
+  delete_templ: '删除模板',
+  save_success: '保存成功',
+  paste_insert_table: '粘贴插入表格',
   paste_insert_table_tips:
-    "你可以从网页或者excel中复制表格,然后粘贴在此处。粘贴并确定后,程序将自动把源表格转为markdown格式的表格。注:复制excel后,请鼠标右击,粘贴为纯文本。否则会当做图片上传。",
+    '你可以从网页或者excel中复制表格,然后粘贴在此处。粘贴并确定后,程序将自动把源表格转为markdown格式的表格。注:复制excel后,请鼠标右击,粘贴为纯文本。否则会当做图片上传。',
 
-  //catalog
-  add_cat: "添加目录",
-  cat_name: "目录名",
-  input_cat_name: "请输入目录名",
-  parent_cat_name: "上级目录",
-  none: "无",
+  // catalog
+  add_cat: '添加目录',
+  cat_name: '目录名',
+  input_cat_name: '请输入目录名',
+  parent_cat_name: '上级目录',
+  none: '无',
 
-  //其他
-  back_to_top: "回到顶部",
-  draft_tips: "检测到有上次编辑时自动保存的草稿。是否自动填充上次的草稿内容?",
+  // 其他
+  back_to_top: '回到顶部',
+  draft_tips: '检测到有上次编辑时自动保存的草稿。是否自动填充上次的草稿内容?',
 
-  //管理后台
-  management_backstage: "管理后台",
-  user_management: "用户管理",
-  item_management: "项目管理",
-  add_user: "新增用户",
-  search: "查询",
+  // 管理后台
+  management_backstage: '管理后台',
+  user_management: '用户管理',
+  item_management: '项目管理',
+  add_user: '新增用户',
+  search: '查询',
 
-  team_mamage: "团队管理",
-  background: "管理后台",
-  distribution_to_team: "分配项目给团队",
-  back_to_team: "返回团队管理",
-  check_item: "查看项目",
-  unassign: "取消分配",
-  go_to_new_an_item: "去新建项目",
-  confirm_unassign: "确认取消分配吗?此操作会取消项目和团队之间的关联",
-  Join_time: "加入时间",
-  add_team: "添加团队",
-  member_authority: "成员权限",
-  go_to_new_an_team: "去新建团队",
-  adjust_member_authority: "调整每一个成员的项目权限",
-  team_member_empty_tips: "该团队尚未有任何成员",
+  team_mamage: '团队管理',
+  background: '管理后台',
+  distribution_to_team: '分配项目给团队',
+  back_to_team: '返回团队管理',
+  check_item: '查看项目',
+  unassign: '取消分配',
+  go_to_new_an_item: '去新建项目',
+  confirm_unassign: '确认取消分配吗?此操作会取消项目和团队之间的关联',
+  Join_time: '加入时间',
+  add_team: '添加团队',
+  member_authority: '成员权限',
+  go_to_new_an_team: '去新建团队',
+  adjust_member_authority: '调整每一个成员的项目权限',
+  team_member_empty_tips: '该团队尚未有任何成员',
   team_member_authority_tips:
-    "权限说明:编辑权限指的是成员可以新建/编辑项目页面,删除时将只能删除自己新建/编辑的页面。 只读权限指的是,该成员对本项目所有页面都只能查看,无法新增/编辑/删除",
-  member: "成员",
-  team_item: "项目",
-  add_member: "添加成员",
-  member_username: "成员用户名",
-  team_name: "团队名",
-  memberCount: "成员数",
-  itemCount: "分配项目数",
+    '权限说明:编辑权限指的是成员可以新建/编辑项目页面,删除时将只能删除自己新建/编辑的页面。 只读权限指的是,该成员对本项目所有页面都只能查看,无法新增/编辑/删除',
+  member: '成员',
+  team_item: '项目',
+  member_username: '成员用户名',
+  team_name: '团队名',
+  memberCount: '成员数',
+  itemCount: '分配项目数',
   empty_team_tips:
-    "欢迎使用团队管理功能。此功能非常适合Team leader对多人员、跨团队项目的协作管理。请先点击左上方按钮添加团队。添加团队后,可以随时增加/删除团队成员、批量分配到不同项目,并且可以设置不同项目里的成员权限。相比简单成员管理模式,团队管理功能可以批量地进行人员的增删,更方便复杂团队的协作。",
+    '欢迎使用团队管理功能。此功能非常适合Team leader对多人员、跨团队项目的协作管理。请先点击左上方按钮添加团队。添加团队后,可以随时增加/删除团队成员、批量分配到不同项目,并且可以设置不同项目里的成员权限。相比简单成员管理模式,团队管理功能可以批量地进行人员的增删,更方便复杂团队的协作。',
 
-  copy_link: "复制链接",
-  copy_success: "复制成功",
+  copy_link: '复制链接',
+  copy_success: '复制成功',
 
-  user_manage: "用户管理",
-  item_manage: "项目管理",
-  web_setting: "站点设置",
-  register_open_label: "开放用户注册",
-  ldap_open_label: "启用ldap登录",
+  user_manage: '用户管理',
+  item_manage: '项目管理',
+  web_setting: '站点设置',
+  register_open_label: '开放用户注册',
+  ldap_open_label: '启用ldap登录',
 
-  name: "姓名",
-  name_tips: "推荐使用真实姓名",
+  name: '姓名',
+  name_tips: '推荐使用真实姓名',
 
-  attachment: "附件",
-  upload: "上传",
-  upload_file: "上传文件",
-  file_name: "文件名",
-  download: "下载",
-  file_size_tips: "文件大小在4M内",
+  attachment: '附件',
+  upload: '上传',
+  upload_file: '上传文件',
+  file_name: '文件名',
+  download: '下载',
+  file_size_tips: '文件大小在4M内',
 
   confirm_cat_delete:
-    "确认删除目录吗?此操作会把该目录下的所有页面一并删除,请谨慎操作。",
+    '确认删除目录吗?此操作会把该目录下的所有页面一并删除,请谨慎操作。',
 
-  userrole: "用户角色",
-  reg_time: "注册时间",
-  last_login_time: "最后登录时间",
-  administrator: "管理员",
-  ordinary_users: "普通用户",
-  owner: "所有者",
-  privacy: "私密性",
-  link: "链接",
-  private: "密码访问",
-  public: "公开访问",
-  register_open: "开放用户注册",
+  userrole: '用户角色',
+  reg_time: '注册时间',
+  last_login_time: '最后登录时间',
+  administrator: '管理员',
+  ordinary_users: '普通用户',
+  owner: '所有者',
+  privacy: '私密性',
+  link: '链接',
+  private: '密码访问',
+  public: '公开访问',
+  register_open: '开放用户注册',
   long_page_tips:
-    "检测到本页面内容比较多,showdoc暂时关闭了html实时预览功能,以防止过多内容造成页面卡顿。你可以在编辑栏中找到预览按钮进行手动打开。",
+    '检测到本页面内容比较多,showdoc暂时关闭了html实时预览功能,以防止过多内容造成页面卡顿。你可以在编辑栏中找到预览按钮进行手动打开。',
 
-  item_exit: "退出项目",
-  confirm_exit_item: "你确定要退出该项目吗?",
+  item_exit: '退出项目',
+  confirm_exit_item: '你确定要退出该项目吗?',
 
-  insert: "插入",
+  insert: '插入',
 
-  Open_item: "公开项目",
-  private_item: "私密项目",
-  private_item_passwrod: "私密项目请设置访问密码",
+  Open_item: '公开项目',
+  private_item: '私密项目',
+  private_item_passwrod: '私密项目请设置访问密码',
 
-  create_sigle_page: "我要创建单页面地址",
+  create_sigle_page: '我要创建单页面地址',
   create_sigle_page_tips:
-    "当仅仅想分享某个页面、而不想分享整个项目的时候,你可以选择分享单页面地址。分享出去后,你的好友将仅仅只看到单个页面,无法浏览目录菜单,也无法切换到其他页面查看。",
+    '当仅仅想分享某个页面、而不想分享整个项目的时候,你可以选择分享单页面地址。分享出去后,你的好友将仅仅只看到单个页面,无法浏览目录菜单,也无法切换到其他页面查看。',
 
-  home_page: "网站首页",
-  full_page: "全屏介绍页面",
-  login_page: "跳转到登录页面",
-  jump_to_an_item: "跳转到某个项目",
-  jump_to_item: "跳转到项目",
+  home_page: '网站首页',
+  full_page: '全屏介绍页面',
+  login_page: '跳转到登录页面',
+  jump_to_an_item: '跳转到某个项目',
+  jump_to_item: '跳转到项目',
 
-  recycle: "回收站",
+  recycle: '回收站',
   recycle_tips:
-    "被删除的页面会进入回收站。在回收站超过30天的内容将被系统自动选择合适时候清理掉",
-  page_title: "页面标题",
-  deleter: "删除账号",
-  del_time: "删除时间",
-  recover: "恢复",
-  recover_tips: "确认恢复吗?恢复的页面将出现在项目根目录",
+    '被删除的页面会进入回收站。在回收站超过30天的内容将被系统自动选择合适时候清理掉',
+  page_title: '页面标题',
+  deleter: '删除账号',
+  del_time: '删除时间',
+  recover: '恢复',
+  recover_tips: '确认恢复吗?恢复的页面将出现在项目根目录',
 
-  cat_tips: "可拖动以排序",
-  cat_limite_tips: "showdoc只支持最多三层目录,请优化目录结构",
+  cat_tips: '可拖动以排序',
+  cat_limite_tips: 'showdoc只支持最多三层目录,请优化目录结构',
 
-  sort_pages: "页面排序",
-  sort_pages_tips: "选择特定的目录后,你可以对该目录下的页面进行拖动排序",
+  sort_pages: '页面排序',
+  sort_pages_tips: '选择特定的目录后,你可以对该目录下的页面进行拖动排序',
 
-  regular_item: "常规项目",
-  single_item: "单页项目",
-  copy_item: "复制项目",
-  import_file: "导入文件",
-  auto_item: "自动生成",
-  single_item_tips: "单页项目指的是指没有目录结构,只有一个页面的项目",
-  copy_item_tips1: "从你已有的项目中选择并复制",
-  copy_item_tips2: "复制后将新项目重命名为:",
+  regular_item: '常规项目',
+  single_item: '单页项目',
+  copy_item: '复制项目',
+  import_file: '导入文件',
+  auto_item: '自动生成',
+  single_item_tips: '单页项目指的是指没有目录结构,只有一个页面的项目',
+  copy_item_tips1: '从你已有的项目中选择并复制',
+  copy_item_tips2: '复制后将新项目重命名为:',
   import_file_tips1:
-    "导入的文件可以是<b>postman</b>的json文件、<b>swagger</b>的json文件、showdoc的<b>markdown压缩包</b>。系统会自动识别文件类型。",
-  import_file_tips2: "将文件拖到此处,或<em>点击上传</em>",
-  export_format_word: "word格式",
-  export_format_markdown: "markdown压缩包",
+    '导入的文件可以是<b>postman</b>的json文件、<b>swagger</b>的json文件、showdoc的<b>markdown压缩包</b>。系统会自动识别文件类型。',
+  import_file_tips2: '将文件拖到此处,或<em>点击上传</em>',
+  export_format_word: 'word格式',
+  export_format_markdown: 'markdown压缩包',
   export_markdown_tips:
-    "导出的压缩包可以重新导入showdoc,在新建项目的时候选择“文件导入”即可",
+    '导出的压缩包可以重新导入showdoc,在新建项目的时候选择“文件导入”即可',
 
-  private_tips: "这是一个私密项目",
+  private_tips: '这是一个私密项目',
 
-  oss_open: "图片附件储存到云",
-  oss_server: "云服务商",
-  aliyun: "阿里云",
-  qiniu: "七牛云",
-  oss_domain: "oss绑定域名(选填)",
+  oss_open: '图片附件储存到云',
+  oss_server: '云服务商',
+  aliyun: '阿里云',
+  qiniu: '七牛云',
+  oss_domain: 'oss绑定域名(选填)',
 
-  attornTeamTips: "转让团队后,该团队下拥有的所有项目也会一并转让给对方"
-};
+  attornTeamTips: '转让团队后,该团队下拥有的所有项目也会一并转让给对方',
+
+  lock_edit: '锁定编辑',
+  lock_edit_tips: '当锁定后,其他人将无法编辑本页面。直到你取消锁定或者退出编辑',
+  cacel_lock: '解除锁定',
+  locking: '当前页面正在被其他成员锁定编辑中,编辑者:'
+}