Browse Source

增加复制项目功能和支持创建单页项目功能

star7th 9 years ago
parent
commit
681162d03e

+ 114 - 28
Application/Home/Controller/ItemController.class.php

@@ -2,10 +2,10 @@
 namespace Home\Controller;
 use Think\Controller;
 class ItemController extends BaseController {
-	//项目列表页
+    //项目列表页
     public function index(){
-    	$login_user = $this->checkLogin();        
-    	$items  = D("Item")->where("uid = '$login_user[uid]' or item_id in ( select item_id from ".C('DB_PREFIX')."item_member where uid = '$login_user[uid]' ) ")->select();
+        $login_user = $this->checkLogin();        
+        $items  = D("Item")->where("uid = '$login_user[uid]' or item_id in ( select item_id from ".C('DB_PREFIX')."item_member where uid = '$login_user[uid]' ) ")->select();
         
         $share_url = get_domain().__APP__.'/uid/'.$login_user['uid'];
 
@@ -40,16 +40,20 @@ class ItemController extends BaseController {
 
     //新建项目
     public function add(){
-    	$login_user = $this->checkLogin();
+        $login_user = $this->checkLogin();
         $item_id = I("item_id/d");
-		if (!IS_POST) {
+        if (!IS_POST) {
           $item = D("Item")->where("item_id = '$item_id' ")->find();
           $this->assign("item" , $item);
-		  $this->display ();
+          $this->display ();
 
-		}else{
+        }else{
             $item_name = I("item_name");
-			$item_domain = I("item_domain");
+            $item_domain = I("item_domain") ? I("item_domain") : '';
+            $copy_item_id = I("copy_item_id");
+            $password = I("password");
+            $item_description = I("item_description");
+            $item_type = I("item_type");
 
             if ($item_domain) {
                 $item = D("Item")->where("item_domain = '$item_domain' and item_id !='$item_id' ")->find();
@@ -64,11 +68,22 @@ class ItemController extends BaseController {
                     return false;
                 }
             }
-
-
-            $password = I("password");
-			$item_description = I("item_description");
-            if ($item_id > 0 ) {
+            
+            //如果是复制项目
+            if ($copy_item_id > 0) {
+                if (!$this->checkItemPermn($login_user['uid'] , $copy_item_id)) {
+                    $this->message(L('no_permissions'));
+                    return;
+                }
+                $ret = D("Item")->copy($copy_item_id,$login_user['uid'],$item_name,$item_description,$password,$item_domain);
+                if ($ret) {
+                    $this->message(L('operation_succeeded'),U('Home/Item/index'));              
+                }else{
+                    $this->message(L('operation_failed'),U('Home/Item/index'));
+                }
+                return ;
+            }
+                        if ($item_id > 0 ) {
                 $data = array(
                     "item_name" => $item_name ,
                     "item_domain" => $item_domain ,
@@ -84,20 +99,34 @@ class ItemController extends BaseController {
                     "password" => $password ,
                     "item_description" => $item_description ,
                     "item_domain" => $item_domain ,
+                    "item_type" => $item_type ,
                     "addtime" =>time()
                     );
-                $ret = D("Item")->add($insert);
+                $item_id = D("Item")->add($insert);
             }
 
-			if ($ret) {
-				$this->message(L('operation_succeeded'),U('Home/Item/index'));		        
-			}else{
-				$this->message(L('operation_failed'),U('Home/Item/index'));
-			}
-		}
+            if ($item_id) {
+                //如果是单页应用,则新建一个默认页
+                if ($item_type == 2 ) {
+                    $insert = array(
+                        'author_uid' => $login_user['uid'] ,
+                        'author_username' => $login_user['username'],
+                        "page_title" => $item_name ,
+                        "item_id" => $item_id ,
+                        "cat_id" => 0 ,
+                        "page_content" => '欢迎使用showdoc。点击右上方的编辑按钮进行编辑吧!' ,
+                        "addtime" =>time()
+                        );
+                    D("Page")->add($insert);
+                }
+                $this->message(L('operation_succeeded'),U('Home/Item/index'));              
+            }else{
+                $this->message(L('operation_failed'),U('Home/Item/index'));
+            }
+        }
     }
 
-    //展示单个项目
+    //根据项目类型展示项目
     public function show(){
         $this->checkLogin(false);
         $item_id = I("item_id/d");
@@ -110,7 +139,6 @@ class ItemController extends BaseController {
                 $item_id = $item['item_id'] ;
             }
         }
-        $keyword = I("keyword");
         $login_user = session("login_user");
         $uid = $login_user['uid'] ? $login_user['uid'] : 0 ;
             
@@ -118,20 +146,41 @@ class ItemController extends BaseController {
 
 
         $item = D("Item")->where("item_id = '$item_id' ")->find();
+        if ($item['item_type'] == 1 ) {
+            $this->_show_regular_item($item);
+        }
+        elseif ($item['item_type'] == 2 ) {
+            $this->_show_single_page_item($item);
+        }else{
+           $this->_show_regular_item($item); 
+        }
+        
 
+    }
+
+    //展示常规项目
+    private function _show_regular_item($item){
+        $item_id = $item['item_id'];
+
+        $current_page_id = I("page_id/d");
+        $keyword = I("keyword");
+
+        $login_user = session("login_user");
+        $uid = $login_user['uid'] ? $login_user['uid'] : 0 ;
+            
         //是否有搜索词
         if ($keyword) {
-            $pages = D("Page")->where("item_id = '$item_id' and ( page_title like '%{$keyword}%' or page_content like '%{$keyword}%' ) ")->order(" `s_number` asc  ")->select();
+            $pages = D("Page")->where("item_id = '$item_id' and ( page_title like '%{$keyword}%' or page_content like '%{$keyword}%' ) ")->order(" `s_number` asc  ")->field("page_id,author_uid,cat_id,page_title,addtime")->select();
         
         }else{
             //获取所有父目录id为0的页面
-            $pages = D("Page")->where("cat_id = '0' and item_id = '$item_id' ")->order(" `s_number` asc  ")->select();
+            $pages = D("Page")->where("cat_id = '0' and item_id = '$item_id' ")->order(" `s_number` asc  ")->field("page_id,author_uid,cat_id,page_title,addtime")->select();
             //获取所有二级目录
             $catalogs = D("Catalog")->where("item_id = '$item_id' and level = 2  ")->order(" `s_number` asc  ")->select();
             if ($catalogs) {
                 foreach ($catalogs as $key => &$catalog) {
                     //该二级目录下的所有子页面
-                    $temp = D("Page")->where("cat_id = '$catalog[cat_id]' ")->order(" `s_number` asc  ")->select();
+                    $temp = D("Page")->where("cat_id = '$catalog[cat_id]' ")->order(" `s_number` asc  ")->field("page_id,author_uid,cat_id,page_title,addtime")->select();
                     $catalog['pages'] = $temp ? $temp: array();
 
                     //该二级目录下的所有子目录
@@ -141,7 +190,7 @@ class ItemController extends BaseController {
                         //获取所有三级目录的子页面
                         foreach ($catalog['catalogs'] as $key3 => &$catalog3) {
                             //该二级目录下的所有子页面
-                            $temp = D("Page")->where("cat_id = '$catalog3[cat_id]' ")->order(" `s_number` asc  ")->select();
+                            $temp = D("Page")->where("cat_id = '$catalog3[cat_id]' ")->order(" `s_number` asc  ")->field("page_id,author_uid,cat_id,page_title,addtime")->select();
                             $catalog3['pages'] = $temp ? $temp: array();
                         }                        
                     }               
@@ -162,7 +211,7 @@ class ItemController extends BaseController {
         else{
             $help_url = "http://www.showdoc.cc/help";
         }
-
+        
         $this->assign("help_url" , $help_url);
         $this->assign("current_page_id" , $current_page_id);
         $this->assign("keyword" , $keyword);
@@ -173,9 +222,38 @@ class ItemController extends BaseController {
         $this->assign("pages" , $pages);
         $this->assign("item" , $item);
         $this->assign("login_user" , $login_user);
-    	$this->display();
+        $this->display("show_regular");
     }
 
+    //展示单页项目
+    private function _show_single_page_item($item){
+        $item_id = $item['item_id'];
+
+        $current_page_id = I("page_id/d");
+
+        $login_user = session("login_user");
+        $uid = $login_user['uid'] ? $login_user['uid'] : 0 ;
+
+        //获取页面
+        $page = D("Page")->where(" item_id = '$item_id' ")->find();
+
+        $domain = $item['item_domain'] ? $item['item_domain'] : $item['item_id'];
+        $share_url = get_domain().__APP__.'/'.$domain;
+
+        $ItemPermn = $this->checkItemPermn($uid , $item_id) ;
+
+        $ItemCreator = $this->checkItemCreator($uid , $item_id);
+
+        $this->assign("current_page_id" , $current_page_id);
+        $this->assign("ItemPermn" , $ItemPermn);
+        $this->assign("ItemCreator" , $ItemCreator);
+        $this->assign("share_url" , $share_url);
+        $this->assign("catalogs" , $catalogs);
+        $this->assign("page" , $page);
+        $this->assign("item" , $item);
+        $this->assign("login_user" , $login_user);
+        $this->display("show_single_page");
+    }
     //删除项目
     public function delete(){
         $item_id =  I("item_id");
@@ -346,4 +424,12 @@ class ItemController extends BaseController {
         output_word($data,$item['item_name']);
     }
 
+    public function itemList(){
+        $login_user = $this->checkLogin();        
+        $items  = D("Item")->where("uid = '$login_user[uid]' ")->select();
+        $items = $items ? $items : array();
+        $this->sendResult($items);
+    }
+
+
 }

+ 2 - 3
Application/Home/Controller/PageController.class.php

@@ -16,7 +16,7 @@ class PageController extends BaseController {
 
         $ItemPermn = $this->checkItemPermn($login_user['uid'] , $page['item_id']) ;
         $ItemCreator = $this->checkItemCreator($login_user['uid'],$page['item_id']);
-
+		$page['page_md_content'] = $page['page_content'];
 
         //$Parsedown = new \Parsedown();
         //$page['page_content'] = $Parsedown->text(htmlspecialchars_decode($page['page_content']));
@@ -41,6 +41,7 @@ class PageController extends BaseController {
         $page['page_md_content'] = $page['page_content'];
         //$page['page_html_content'] = $Parsedown->text(htmlspecialchars_decode($page['page_content']));
         $this->assign("page" , $page);
+        $this->assign("login_user" , $login_user);
         $this->display();
     }
 
@@ -285,6 +286,4 @@ class PageController extends BaseController {
         $this->assign("history_page_content" , $history_page_content);
         $this->display(); 
     }
-
-
 }

+ 16 - 1
Application/Home/Controller/UpdateController.class.php

@@ -112,7 +112,7 @@ class UpdateController extends BaseController {
             }
         }
 
-        //item_member表增加level字段
+        //item_member表增加member_group_id字段
         $columns = M("ItemMember")->getDbFields();
         if ($columns) {
             $has_it = 0 ;//是否存在该字段
@@ -127,6 +127,21 @@ class UpdateController extends BaseController {
             }
         }
 
+        //item表增加item_type字段
+        $columns = M("Item")->getDbFields();
+        if ($columns) {
+            $has_it = 0 ;//是否存在该字段
+            foreach ($columns as $key => $value) {
+                if ($value == 'item_type') {
+                    $has_it = 1 ;
+                }
+            }
+            if ($has_it === 0) {
+                $sql = "ALTER TABLE ".C('DB_PREFIX')."item ADD item_type INT( 1 ) NOT NULL DEFAULT '1'  ;";
+                D("Item")->execute($sql);
+            }
+        }
+
 
         echo 'OK!';
     }

+ 182 - 0
Application/Home/Model/ItemModel.class.php

@@ -0,0 +1,182 @@
+<?php
+namespace Home\Model;
+use Home\Model\BaseModel;
+
+class ItemModel extends BaseModel {
+
+    public function export($item_id){
+        $item = D("Item")->where("item_id = '$item_id' ")->field(" item_type, item_name ,item_description,password ")->find();
+        //获取所有父目录id为0的页面
+        $pages = D("Page")->where("cat_id = '0' and item_id = '$item_id' ")->field(" page_title ,page_content,s_number,page_comments ")->order(" `s_number` asc  ")->select();
+        //获取所有二级目录
+        $catalogs = D("Catalog")->where("item_id = '$item_id' and level = 2  ")->field("cat_id, cat_name ,level,s_number ")->order(" `s_number` asc  ")->select();
+        if ($catalogs) {
+            foreach ($catalogs as $key => &$catalog) {
+                //该二级目录下的所有子页面
+                $temp = D("Page")->where("cat_id = '$catalog[cat_id]' ")->field(" page_title ,page_content,s_number,page_comments ")->order(" `s_number` asc  ")->select();
+                $catalog['pages'] = $temp ? $temp: array();
+                //该二级目录下的所有子目录
+                $temp = D("catalog")->where("parent_cat_id = '$catalog[cat_id]' ")->field(" cat_id,cat_name ,level,s_number ")->order(" `s_number` asc  ")->select();
+                $catalog['catalogs'] = $temp ? $temp: array();
+                if($catalog['catalogs']){
+                    //获取所有三级目录的子页面
+                    foreach ($catalog['catalogs'] as $key3 => &$catalog3) {
+                        //该二级目录下的所有子页面
+                        $temp = D("Page")->where("cat_id = '$catalog3[cat_id]' ")->field(" page_title ,page_content,s_number,page_comments ")->order(" `s_number` asc  ")->select();
+                        $catalog3['pages'] = $temp ? $temp: array();
+                        unset($catalog3['cat_id']);
+                    }                        
+                }
+                unset($catalog['cat_id']);               
+            }
+        }
+        $item['pages'] = array(
+            "pages" =>$pages,
+            "catalogs" =>$catalogs,
+            );
+        unset($pages);
+        unset($catalogs);
+        $item['members'] = D("ItemMember")->where("item_id = '$item_id' ")->field(" member_group_id ,uid,username ")->select();
+        return  json_encode($item);
+        
+    }
+    public function import($json,$uid,$item_name= '',$item_description= '',$item_password = '',$item_domain = ''){
+        $userInfo = D("User")->userInfo($uid);
+        $item = json_decode($json ,1 );
+        unset($json);
+        if ($item) {
+            if ($item['item_domain']) {
+                $item2 = D("Item")->where("item_domain = '$item[item_domain]'  ")->find();
+                if ($item2) {
+                    //个性域名已经存在
+                    return false;
+                }
+                if(!ctype_alnum($item_domain) ||  is_numeric($item_domain) ){
+                    //echo '个性域名只能是字母或数字的组合';exit;
+                    return false;
+                }
+            }else{
+                $item['item_domain'] = '';
+            }
+            $item_data = array(
+                "item_name"=>$item_name ? $item_name :$item['item_name'],
+                "item_domain"=>$item_domain ? $item_domain :$item['item_domain'],
+                "item_type"=>$item['item_type'],
+                "item_description"=>$item_description ? $item_description :$item['item_description'],
+                "password"=>$item_password ? $item_password :$item['password'],
+                "uid"=>$userInfo['uid'],
+                "username"=>$userInfo['username'],
+                "addtime"=>time(),
+                );
+            $item_id = D("Item")->add($item_data);
+        }
+        if ($item['pages']) {
+            //父页面们(一级目录)
+            if ($item['pages']['pages']) {
+                foreach ($item['pages']['pages'] as $key => &$value) {
+                    $page_data = array(
+                        "author_uid"=>$userInfo['uid'],
+                        "author_username"=>$userInfo['username'],
+                        "page_title" =>$value['page_title'],
+                        "page_content" =>$value['page_content'],
+                        "s_number" =>$value['s_number'],
+                        "page_comments" =>$value['page_comments'],
+                        "item_id" => $item_id,
+                        "cat_id" => 0 ,
+                        "addtime" =>time(),
+                        );
+                    D("Page")->add($page_data);
+                    unset($page_data);
+                }
+                unset($item['pages']['pages']);
+            }
+            //二级目录
+            if ($item['pages']['catalogs']) {
+                foreach ($item['pages']['catalogs'] as $key => &$value) {
+                    $catalog_data = array(
+                        "cat_name" => $value['cat_name'],
+                        "level" => $value['level'],
+                        "s_number" => $value['s_number'],
+                        "item_id" => $item_id,
+                        "addtime" =>time(),
+                        );
+                    $cat_id = D("Catalog")->add($catalog_data);
+                    //二级目录的页面们
+                    if ($value['pages']) {
+                        foreach ($value['pages'] as $key2 => &$value2) {
+                            $page_data = array(
+                                "author_uid"=>$userInfo['uid'],
+                                "author_username"=>$userInfo['username'],
+                                "page_title" =>$value2['page_title'],
+                                "page_content" =>$value2['page_content'],
+                                "s_number" =>$value2['s_number'],
+                                "page_comments" =>$value2['page_comments'],
+                                "item_id" => $item_id,
+                                "cat_id" => $cat_id ,
+                                "addtime" =>time(),
+                                );
+                            D("Page")->add($page_data);
+                            unset($page_data);
+                            unset($value2);
+                        }
+                    }
+                    //判断是否存在三级目录
+                    if ($value['catalogs']) {
+                            foreach ($value['catalogs'] as $key3 => &$value3) {
+                                $catalog_data = array(
+                                    "cat_name" => $value3['cat_name'],
+                                    "level" => $value3['level'],
+                                    "s_number" => $value3['s_number'],
+                                    "parent_cat_id" => $cat_id,
+                                    "item_id" => $item_id,
+                                    "addtime" =>time(),
+                                    );
+                                $cat_id2 = D("Catalog")->add($catalog_data);
+                                //三级目录的页面们
+                                if ($value3['pages']) {
+                                    foreach ($value3['pages'] as $key4 => &$value4) {
+                                        $page_data = array(
+                                            "author_uid"=>$userInfo['uid'],
+                                            "author_username"=>$userInfo['username'],
+                                            "page_title" =>$value4['page_title'],
+                                            "page_content" =>$value4['page_content'],
+                                            "s_number" =>$value4['s_number'],
+                                            "page_comments" =>$value4['page_comments'],
+                                            "item_id" => $item_id,
+                                            "cat_id" => $cat_id2 ,
+                                            "addtime" =>time(),
+                                            );
+                                        D("Page")->add($page_data);
+                                        unset($page_data);
+                                        unset($value4);
+                                    }
+                                }
+                             unset($value3);
+                            }
+                    }
+                    unset($value);
+                }
+                 
+            }
+        }
+
+        if ($item['members']) {
+            foreach ($item['members'] as $key => $value) {
+                $member_data = array(
+                    "member_group_id"=>$value['member_group_id'],
+                    "uid"=>$value['uid'],
+                    "username"=>$value['username'],
+                    "item_id"=>$item_id,
+                    "addtime"=>time(),
+                    );
+                D("ItemMember")->add($member_data);
+            }
+        }
+        return $item_id;
+    }
+
+    public function copy($item_id,$uid,$item_name= '',$item_description= '',$item_password = '',$item_domain){
+        return $this->import($this->export($item_id),$uid,$item_name,$item_description,$item_password,$item_domain);
+    }
+    
+}

+ 95 - 5
Application/Home/View/Item/add.html

@@ -1,17 +1,49 @@
 <include file="Common/header" />
 <link rel="stylesheet" href="__PUBLIC__/css/login.css" />
-
+<style type="text/css">
+.choose_type{
+    margin-bottom: 20px;
+    text-align: center;
+}
+#choose_item{
+    width: 100%;
+}
+</style>
     <div class="container">
 
       <form class="form-signin" method="post">
         <input type="hidden" id="item_id" name="item_id" value="{$item.item_id}">
         <!-- <h3 class="form-signin-heading">新建项目</h3> -->
-        <input type="text" class="input-block-level"  name="item_name" placeholder="{$Think.Lang.item_name}" autocomplete="off" value="{$item.item_name}" >
-        <input type="text" class="input-block-level"  name="item_description" placeholder="{$Think.Lang.item_description}" autocomplete="off" value="{$item.item_description}">
-<!--         <input type="text" class="input-block-level"  name="item_domain" placeholder="{$Think.Lang.item_domain}" autocomplete="off" value="{$item.item_domain}" >
- -->        <input style="display:none"><!-- for disable autocomplete on chrome -->
+        <div class="choose_type">
+            <label class="radio inline">
+              <input type="radio" name="item_type" id="item_type1" value="1" <?php if(!$item['item_type'] || $item['item_type'] == 1 )echo 'checked'?> >
+              常规项目
+            </label>
+            <label class="radio inline">
+              <input type="radio" name="item_type" id="item_type2" value="2" <?php if($item['item_type'] == 2 )echo 'checked'?>>
+              单页项目
+              &nbsp;
+              <a href="http://www.showdoc.cc/page/65391" target="_blank"><i class="icon-question-sign"></i></a>
+
+            </label>
+        </div>
+
+
+        <input type="text" class="input-block-level" id="item_name" name="item_name" placeholder="{$Think.Lang.item_name}" autocomplete="off" value="{$item.item_name}" >
+        <input type="text" class="input-block-level" id="item_description" name="item_description" placeholder="{$Think.Lang.item_description}" autocomplete="off" value="{$item.item_description}">
+        <input type="text" class="input-block-level"  name="item_domain" placeholder="{$Think.Lang.item_domain}" autocomplete="off" value="{$item.item_domain}" >
+        <input style="display:none"><!-- for disable autocomplete on chrome -->
         <input style="display:none"><!-- for disable autocomplete on chrome -->
         <input type="text" onfocus="this.type='password'" id="password" class="input-block-level" name="password" placeholder="{$Think.Lang.visit_password_placeholder}" title="{$Think.Lang.visit_password_placeholder}" autocomplete="off" value="{$item.password}">
+        <label class="checkbox">
+            <input type="checkbox" id="show_copy"> 复制已存在项目
+        </label>
+        <div >
+            <select id="choose_item" name="copy_item_id">
+
+            </select>
+        </div>
+        <br>
         <button class="btn  btn-primary" type="submit">{$Think.Lang.submit}</button>
         <a href="javascript:history.go(-1)" class="btn">{$Think.Lang.goback}</a>
       </form>
@@ -28,5 +60,63 @@
     $("#password").val(password);  
  };
 
+$("#choose_item").hide();
+
+//如果是编辑项目,则禁用复制项目功能
+if ($("#item_id").val()) {
+    $("#show_copy").parent().hide();
+    $(".choose_type").html("");
+};
+
+$("#show_copy").change(function(){
+    if ($("#show_copy").is(':checked')) {
+        $("#choose_item").show();
+        $("#item_type1").attr("disabled","disabled");
+        $("#item_type2").attr("disabled","disabled");
+        $("#item_type1").removeAttr("checked");
+        $("#item_type2").removeAttr("checked");
+    }else{
+        $("#choose_item").hide();
+        $("#item_type1").removeAttr("disabled");
+        $("#item_type2").removeAttr("disabled");
+        $("#item_name").val("");
+        $("#item_description").val('');
+        $("#password").val('');
+    }
+    get_item_list();
+});
+
+
+function get_item_list(){
+    //获取已有项目列表
+    $.get(
+            "?s=/home/item/itemList",
+            {},
+            function(data){
+             if (data.error_code === 0) {
+                var json = data.data ;
+                var html = '<option>请选择</option>';
+                for (var i = 0; i < json.length; i++) {
+                    html += '<option value="'+json[i].item_id+'" item_description="'+json[i].item_description+'" password="'+json[i].password+'" >'+json[i].item_name+'</option>';
+                };
+                $("#choose_item").html(html);
+
+             };
+            },
+            "json"
+        );    
+}
+
+
+//当用户选择了某个复制项目,则填充信息
+$("#choose_item").change(function(){
+    var a = $(this).find("option:selected");
+    var item_name = a.text();
+    var item_description = a.attr("item_description");
+    var password = a.attr("password");
+    $("#item_name").val(item_name+"--copy");
+    $("#item_description").val(item_description);
+    $("#password").val(password);
 
+});
  </script>

+ 176 - 0
Application/Home/View/Item/show_regular.html

@@ -0,0 +1,176 @@
+<include file="Common/header" />
+<link rel="stylesheet" href="__PUBLIC__/css/item/show.css?1.1d.1thdddef" />
+
+
+<div class="doc-head row" >
+  <div class="left "><h2>{$item.item_name}</h2></div>
+  <div class="right">
+    <ul class="inline pull-right">
+
+      <if condition="$ItemPermn">
+      <li>
+          <div class="btn-group ">
+            <a class="btn btn-link dropdown-toggle" data-toggle="dropdown" href="#">
+              {$Think.Lang.item}
+              <span class="caret"></span>
+            </a>
+          <ul class="dropdown-menu">
+          <!-- dropdown menu links -->
+            <li><a href="#" id="share">{$Think.Lang.share}</a></li>
+             <li><a href="{:U('Home/Item/word',array('item_id'=>$item['item_id']))}">{$Think.Lang.export}</a></li>
+
+             <if condition="$ItemCreator">
+              <li><a href="{:U('Home/Item/add',array('item_id'=>$item['item_id']))}">{$Think.Lang.update_info}</a></li>          
+              <li><a href="{:U('Home/Member/edit',array('item_id'=>$item['item_id']))}">{$Think.Lang.manage_members}</a></li>
+              <li><a href="{:U('Home/Attorn/index',array('item_id'=>$item['item_id']))}">{$Think.Lang.attorn}</a></li>
+              <li><a href="{:U('Home/Item/delete',array('item_id'=>$item['item_id']))}">{$Think.Lang.delete}</a></li>
+            </if>
+
+            <li><a href="{:U('Home/Item/index')}">{$Think.Lang.goback}</a></li>
+          </ul>
+      </li>
+      <else />
+
+      <if condition="! $login_user">
+        <li ><a href="{:U('Home/User/login')}">{$Think.Lang.login_or_register}</a></li>
+        <li ><a href="{$help_url}" target="_blank">{$Think.Lang.about_showdoc}</a></li>
+        <else />
+        <li><a href="{:U('Home/Item/index')}">{$Think.Lang.my_item}</a></li>
+      </if>
+
+        
+      </if>
+
+    </ul>
+    </div>  
+  </div>
+</div>
+
+<div class="doc-body row">
+  <!-- 左侧栏菜单 -->
+    <div class="doc-left span3 bs-docs-sidebar pull-left">
+        <form class="form-search text-center" action="{:U('Home/item/show',array('item_id'=>$item['item_id']))}" method="post">
+          <div class="input-append search-input-append">
+            <i class="icon-blank"></i>
+            <input type="text" name="keyword" class="search-query search-query-input" value="{$keyword}">
+            <input type="hidden" name="item_id" value="{$item.item_id}">
+            <button type="submit" class="btn"><i class="icon-search"></i></button>
+          </div>
+        </form>
+
+      <ul class="nav nav-list bs-docs-sidenav">
+
+        <!-- 一级目录的页面在前面 -->
+        <foreach name="pages" item="page">
+          <li ><a href="{:U('Home/Page/index',array('page_id'=>$page['page_id']))}" data-page-id="{$page.page_id}" ><i class="icon-blank"></i>{$page.page_title}</a></li>
+        </foreach>
+
+        <foreach name="catalogs" item="catalog">
+
+        
+          <li><a href="#"><i class="icon-chevron-right"></i>{$catalog.cat_name}</a>
+            <ul class="child-ul nav-list hide">
+              <!-- 二级目录的页面们 -->
+              <foreach name="catalog.pages" item="catalog_page">
+                <li><a href="{:U('Home/Page/index',array('page_id'=>$catalog_page['page_id']))}" data-page-id="{$catalog_page.page_id}" >{$catalog_page.page_title}</a></li>
+              </foreach>
+              <!-- 二级目录的子目录们(三级目录) -->
+                <foreach name="catalog.catalogs" item="catalog3">   
+                  <li class="third-child-catalog"><a href="#"><i class="icon-chevron-right"></i>{$catalog3.cat_name}</a>
+                    <ul class="child-ul nav-list hide">
+                      <!-- 二级目录的页面们 -->
+                      <foreach name="catalog3.pages" item="catalog3_page">
+                        <li><a href="{:U('Home/Page/index',array('page_id'=>$catalog3_page['page_id']))}" data-page-id="{$catalog3_page.page_id}" >{$catalog3_page.page_title}</a></li>
+                      </foreach>
+                    </ul>
+                  </li>
+
+                </foreach>
+
+            </ul>
+          </li>
+
+        </foreach>
+
+      </ul>
+      <!-- 新建栏 -->
+      <div class="doc-left-newbar">
+
+        <if condition="$ItemPermn">
+          <div><a href="{:U('Home/Page/edit',array('item_id'=>$item['item_id'],'type'=>'new'))}" id="new-like"><i class="icon-plus"></i>&nbsp;{$Think.Lang.new_page}</a></div>
+          <div><a href="{:U('Home/Catalog/edit',array('item_id'=>$item['item_id']))}" id="dir-like" ><i class="icon-folder-open"></i>{$Think.Lang.new_catalog}</a></div>
+
+        </if>
+
+      </div>
+
+      <input type="hidden" id="item_id" value="{$item.item_id}">
+      <input type="hidden" id="item_domain" value="{$item.item_domain}">
+      <input type="hidden" id="current_page_id" value="{$current_page_id}">
+      <input type="hidden" id="base_url" value="__APP__">
+
+
+    </div>
+    <div class="doc-right  span12 ">
+      <!-- 编辑栏 -->
+      <div class='page-edit-link pull-right hide'>
+        <ul class="inline">
+          <if condition="$ItemPermn">
+            <li><a href="" id="share-page" title="{$Think.Lang.share_address_to_your_friends}">{$Think.Lang.share}</a></li>
+            <li><a href="" id="copy-link" title="{$Think.Lang.copy_interface_to_new}">{$Think.Lang.copy}</a></li>
+            <li><a href="" id="edit-link" title="{$Think.Lang.edit_interface}">{$Think.Lang.edit}</a></li>
+            <li><a href="" title="{$Think.Lang.delete_interface}" onclick="return confirm('{$Think.Lang.comfirm_delete}');return false;" id="delete-link">{$Think.Lang.delete}</a></li>
+          <else />
+            <li></li>
+            <li></li>
+        </if>
+        </ul>
+      </div>
+      <!-- 页面内容 -->
+      <div class='iframe_content'>
+        <iframe id="page-content" width="100%" scrolling="yes"  height="100%" frameborder="0" style=" overflow:visible; height:100%;" name="main"  seamless ="seamless"src=""></iframe>
+      </div>
+
+    </div>
+
+<include file="Common/footer" />
+<!-- 分享项目框 -->
+<div class="modal hide fade" id="share-modal">
+  <div class="modal-header">
+    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+    <h3>{$Think.Lang.share}</h3>
+  </div>
+  <div class="modal-body">
+  <div class="modal-body" style="text-align: center;">
+    <p>{$Think.Lang.item_address}:<code id="share-item-link">{$share_url}</code>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#" id="copy-item-link">复制链接</a>
+  </p>
+    <p style="border-bottom: 1px solid #eee;"><img  alt="二维码" style="width:114px;height:114px;" src="?s=home/common/qrcode&size=3&url={$share_url}"> </p>
+  </div>
+
+  </div>
+</div>
+
+<!-- 分享页面框 -->
+<div class="modal hide fade" id="share-page-modal">
+  <div class="modal-header">
+    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+    <h3>{$Think.Lang.share_page}</h3>
+  </div>
+  <div class="modal-body" style="text-align: center;">
+    <p>项目页面地址:<code id="share-page-link"></code>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#" id="copy-page-link">复制链接</a>
+  </p>
+      <p style="border-bottom: 1px solid #eee;"><img  alt="二维码" id="qr-page-link" style="width:114px;height:114px;" src="?s=home/common/qrcode&size=3&url="> </p>
+      
+    <p >单页面地址:<code id="share-single-link"></code>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#" id="copy-single-link">复制链接</a>
+    </p>
+      <p style="border-bottom: 1px solid #eee;"><img  alt="二维码" id="qr-single-link" style="width:114px;height:114px;" src="?s=home/common/qrcode&size=3&url="> </p>
+   <p><a href="http://www.showdoc.cc/page/63882" target="_blank">项目页面地址和单页面地址有什么区别?</a></p><p>
+    </p>
+  </div>
+</div>
+<script src="__PUBLIC__/js/jquery.bootstrap-growl.min.js"></script>
+<script src="__PUBLIC__/js/jquery.goup.min.js"></script>
+<script src="__PUBLIC__/js/jquery.hotkeys.js"></script>
+<script src="__PUBLIC__/jquery.zclip/jquery.zclip.js"></script>
+
+<script src="__PUBLIC__/js/item/show.js?v=1.2121"></script>

+ 90 - 0
Application/Home/View/Item/show_single_page.html

@@ -0,0 +1,90 @@
+<include file="Common/header" />
+<link href="__PUBLIC__/highlight/default.min.css" rel="stylesheet"> 
+<link href="__PUBLIC__/lightbox/css/lightbox.css?v=1.1234567" rel="stylesheet"> 
+<link rel="stylesheet" href="__PUBLIC__/css/item/show_single_page.css" />
+
+<div id="header">
+
+</div>
+<div class="container doc-container">
+   <div class="doc-title-box">
+      <span id="doc-title-span" class="dn"></span>
+      <h3 id="doc-title">{$page.page_title}</h3>
+      <ul class="tool-bar inline pull-right">
+        <li><a href="#" id="share">分享</a></li> 
+        <if condition="$ItemPermn">
+
+        <li><a href="?s=/home/page/edit/page_id/{$page.page_id}">编辑</a></li>
+        <li>
+            <div class="btn-group ">
+              <a class="btn btn-link dropdown-toggle" data-toggle="dropdown" href="#">
+                {$Think.Lang.item}
+                <span class="caret"></span>
+              </a>
+            <ul class="dropdown-menu">
+            <!-- dropdown menu links -->
+               <li><a href="{:U('Home/Item/word',array('item_id'=>$item['item_id']))}">{$Think.Lang.export}</a></li>
+               <if condition="$ItemCreator">
+                <li><a href="{:U('Home/Item/add',array('item_id'=>$item['item_id']))}">{$Think.Lang.update_info}</a></li>          
+                <li><a href="{:U('Home/Member/edit',array('item_id'=>$item['item_id']))}">{$Think.Lang.manage_members}</a></li>
+                <li><a href="{:U('Home/Attorn/index',array('item_id'=>$item['item_id']))}">{$Think.Lang.attorn}</a></li>
+                <li><a href="{:U('Home/Item/delete',array('item_id'=>$item['item_id']))}">{$Think.Lang.delete}</a></li>
+              </if>
+              <li><a href="{:U('Home/Item/index')}" >{$Think.Lang.goback}</a></li>
+            </ul>
+        </li>
+        <else />
+
+          
+        </if>
+
+      </ul>
+
+      
+
+  </div>
+  <div id="doc-body" >
+
+  <div id="page_md_content" ><textarea style="display:none;">{$page.page_content}</textarea></div>
+
+    </textarea>
+  </div>
+
+</div>
+  <div id="footer">
+    <if condition="! $login_user">
+      <div id="copyright-text">本页面使用<a href="http://www.showdoc.cc/">showdoc</a>编写
+    </if>
+    </div>
+  </div>
+
+<!-- 分享项目框 -->
+<div class="modal hide fade" id="share-modal">
+  <div class="modal-header">
+    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+    <h3>{$Think.Lang.share}</h3>
+  </div>
+  <div class="modal-body">
+  <div class="modal-body" style="text-align: center;">
+    <p>{$Think.Lang.item_address}:<code id="share-item-link">{$share_url}</code>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#" id="copy-item-link">复制链接</a>
+  </p>
+    <p style="border-bottom: 1px solid #eee;"><img  alt="二维码" style="width:114px;height:114px;" src="?s=home/common/qrcode&size=3&url={$share_url}"> </p>
+  </div>
+
+  </div>
+</div>
+ <include file="Common/footer" />
+ <script src="//cdn.staticfile.org/highlight.js/9.0.0/highlight.min.js"></script> 
+ <script src="__PUBLIC__/editor.md/lib/marked.min.js"></script>
+ <script src="__PUBLIC__/editor.md/lib/prettify.min.js"></script>
+ <script src="__PUBLIC__/editor.md/lib/flowchart.min.js"></script>
+ <script src="__PUBLIC__/editor.md/lib/raphael.min.js"></script>
+ <script src="__PUBLIC__/editor.md/lib/underscore.min.js"></script>
+ <script src="__PUBLIC__/editor.md/lib/sequence-diagram.min.js"></script>
+ <script src="__PUBLIC__/editor.md/lib/jquery.flowchart.min.js"></script>
+ <script src="__PUBLIC__/editor.md/editormd.min.js"></script>
+ <script src="__PUBLIC__/js/jquery.goup.min.js"></script>
+ <script src="__PUBLIC__/lightbox/js/lightbox.js?a=abc"></script>
+<script src="__PUBLIC__/jquery.zclip/jquery.zclip.js"></script>
+<script src="__PUBLIC__/js/jquery.bootstrap-growl.min.js"></script>
+<script src="__PUBLIC__/js/item/show_single_page.js?a=ab"></script>

+ 69 - 0
Public/css/item/show_single_page.css

@@ -0,0 +1,69 @@
+body{
+    background: #F1F0F1;
+    height: auto;
+    overflow: auto;
+    margin: 0 auto;
+}
+
+#page_content{
+  
+    padding: 11px 0 90px 0;
+    overflow: hidden;
+    font-size: 11pt;
+    line-height: 1.7;
+    color: #333;
+}
+#doc-body{
+  background-color: #fff;
+}
+
+.doc-container {
+    position: static;
+    -webkit-box-shadow: 0px 1px 6px #ccc;
+    -moz-box-shadow: 0px 1px 6px #ccc;
+    -ms-box-shadow: 0px 1px 6px #ccc;
+    -o-box-shadow: 0px 1px 6px #ccc;
+    box-shadow: 0px 1px 6px #ccc;
+    background-color: #fff;
+    border-bottom: 1px solid #d9d9d9;
+    margin-bottom: 20px;
+    width: 800px;
+    min-height: 500px;
+
+}
+
+#header{
+  height: 80px;
+}
+
+#doc-body{
+  width: 600px;
+  margin: 0 auto;
+}
+
+.doc-title-box{
+    height: auto;
+    margin: 30px 100px 10px 100px;
+    width: auto;
+    border-bottom: 1px solid #ebebeb;
+    padding-bottom: 10px;
+}
+#footer{
+    margin: 0 auto;
+    width: 180px;
+    font-size: 8px;
+    color: #959595;
+}
+
+#doc-title{
+  display: inline-block;
+}
+
+.tool-bar{
+  font-size: 14px;
+  padding-top: 15px;
+}
+
+.tool-bar .btn-link{
+  padding: 0px;
+}

+ 97 - 0
Public/js/item/show_single_page.js

@@ -0,0 +1,97 @@
+
+$(function(){
+    hljs.initHighlightingOnLoad();
+
+    var EditormdView = editormd.markdownToHTML("page_md_content", {
+      htmlDecode      : "style,script,iframe",  // you can filter tags decode
+      emoji           : true,
+      taskList        : true,
+      tex             : true,  // 默认不解析
+      flowChart       : true,  // 默认不解析
+      sequenceDiagram : true,  // 默认不解析
+    });
+    
+    //为所有table标签添加bootstap支持的表格类
+    $("table").addClass("table table-bordered table-hover");
+    //当表格列数过长时将自动出现滚动条
+    $.each($('table'), function() {
+        $(this).prop('outerHTML', '<div style="width: 100%;overflow-x: auto;">'+$(this).prop('outerHTML')+'</div>');
+    });
+
+      //超链接都在新窗口打开
+    $('a[href^="http"]').each(function() {
+          $(this).attr('target', '_blank');
+    });
+    if (!isMobile()) {
+      $("th").css("min-width","77px");
+    };
+
+    //lightbox
+    //增加返回顶部按钮
+    $.goup({
+          trigger: 100,
+          bottomOffset: 150,
+          locationOffset: 100,
+          title: lang["back_to_top"] ,
+          titleAsText: true,
+          containerColor:"#08c",
+      });
+
+    if( isMobile() || $(window).width() < 1000){
+          AdaptToMobile();
+      }
+
+    $(window).resize(function(){
+      if( isMobile()){
+          AdaptToMobile();
+      }
+
+      else if($(window).width() < 1000){
+          AdaptToMobile();
+      }else{
+        window.location.reload();
+      }
+    });
+
+    history.replaceState(null, null, $("#share-item-link").html());
+
+  //分享项目
+  $("#share").click(function(){
+    $("#share-modal").modal();
+      //延迟绑定分享事件
+        setTimeout(function(){
+          $('#copy-item-link').zclip(
+          {
+            path: DocConfig.pubile +'/jquery.zclip/ZeroClipboard.swf',
+            copy:function()
+            {
+              return $('#share-item-link').html();
+            },
+            afterCopy: function() {
+              show_top_msg("已经成功复制到剪切板",2000);
+            }
+          });
+
+        },500);
+    return false;
+  });
+
+    $("table thead tr").css({"background-color":"#08c","color":"#fff"});
+    $("table tr").each(function(){
+    if($(this).find("td").eq(1).html()=="object")
+    {
+      $(this).css({"background-color":"#99CC99","color":"#000"});
+    }
+
+    });
+
+});
+
+function AdaptToMobile(){
+  $(".doc-container").css("width","90%");
+  $("#doc-body").css("width","90%");
+  $("#header").css("height","20px");
+  $(".doc-title-box").css("margin","20px 20px 0px 20px");
+  $("#footer").css("font-size","11pt");
+  $(".tool-bar").hide();
+}

BIN
Sqlite/showdoc.db.php


+ 1 - 1
composer.json

@@ -5,7 +5,7 @@
     "description": "ShowDoc is a tool greatly applicable for an IT team to share documents online",
     "keywords": ["showdoc","documents","Api"],
     "homepage": "https://github.com/star7th/showdoc",
-    "version":"v1.1.5",
+    "version":"v1.2.0",
     "license": "Apache-2.0",
     "authors": [
         {