$app() : Base::ajaxError("404 not found (" . str_replace("__", "/", $app) . ")."); } /** * 知识库列表 * * @apiParam {Number} [page] 当前页,默认:1 * @apiParam {Number} [pagesize] 每页显示数量,默认:20,最大:100 */ public function book__lists() { $user = Users::authE(); if (Base::isError($user)) { return $user; } else { $user = $user['data']; } // $lists = DB::table('docs_book') ->where('username', $user['username']) ->orWhere('role_edit', 'reg') ->orWhere('role_look', 'reg') ->orWhere(function ($query) use ($user) { $query->where('role_edit', 'private')->where('username', $user['username']); }) ->orWhere(function ($query) use ($user) { $query->where('role_edit', 'member')->whereIn('id', function ($query2) use ($user) { $query2->select('bookid') ->from('docs_users') ->where('username', $user['username']) ->whereRaw(env('DB_PREFIX') . 'docs_book.id = bookid'); }); }) ->orderByDesc('id') ->paginate(Base::getPaginate(100, 20)); $lists = Base::getPageList($lists); if ($lists['total'] == 0) { return Base::retError('暂无知识库', $lists); } return Base::retSuccess('success', $lists); } /** * 添加/修改知识库 * * @apiParam {Number} id 知识库数据ID * @apiParam {String} title 知识库名称 */ public function book__add() { $user = Users::authE(); if (Base::isError($user)) { return $user; } else { $user = $user['data']; } // $id = intval(Request::input('id')); $title = trim(Request::input('title')); if ($id > 0) { $role = Docs::checkRole($id, 'edit'); if (Base::isError($role)) { return $role; } } if (mb_strlen($title) < 2 || mb_strlen($title) > 100) { return Base::retError('标题限制2-100个字!'); } if ($id > 0) { // 修改 $row = Base::DBC2A(DB::table('docs_book')->where('id', $id)->first()); if (empty($row)) { return Base::retError('知识库不存在或已被删除!'); } $data = [ 'title' => $title, ]; DB::table('docs_book')->where('id', $id)->update($data); return Base::retSuccess('修改成功!', $data); } else { // 添加 $data = [ 'username' => $user['username'], 'title' => $title, 'indate' => Base::time(), ]; $id = DB::table('docs_book')->insertGetId($data); if (empty($id)) { return Base::retError('系统繁忙,请稍后再试!'); } $data['id'] = $id; return Base::retSuccess('添加成功!', $data); } } /** * 设置知识库 * * @apiParam {Number} id 知识库数据ID * @apiParam {String} role_edit * @apiParam {String} role_view */ public function book__setting() { $user = Users::authE(); if (Base::isError($user)) { return $user; } else { $user = $user['data']; } // $id = intval(Request::input('id')); $type = trim(Request::input('type')); $role = Docs::checkRole($id, 'edit'); if (Base::isError($role) && $role['ret'] < 0) { return $role; } $row = Base::DBC2A(DB::table('docs_book')->where('id', $id)->first()); if (empty($row)) { return Base::retError('知识库不存在或已被删除!'); } $setting = Base::string2array($row['setting']); if ($type == 'save') { if (Base::isError($role)) { return $role; } foreach (Request::input() AS $key => $value) { if (in_array($key, ['role_edit', 'role_look', 'role_view'])) { $setting[$key] = $value; } } DB::table('docs_book')->where('id', $id)->update([ 'role_edit' => $setting['role_edit'], 'role_look' => $setting['role_look'], 'role_view' => $setting['role_view'], 'setting' => Base::array2string($setting), ]); } return Base::retSuccess($type == 'save' ? '修改成功!' : 'success', $setting ?: json_decode('{}')); } /** * 删除知识库 * * @apiParam {Number} id 知识库数据ID */ public function book__delete() { $user = Users::authE(); if (Base::isError($user)) { return $user; } else { $user = $user['data']; } // $id = intval(Request::input('id')); $row = Base::DBC2A(DB::table('docs_book')->where('id', $id)->first()); if (empty($row)) { return Base::retError('知识库不存在或已被删除!'); } if ($row['username'] != $user['username']) { return Base::retError('此操作仅限知识库负责人!'); } DB::table('docs_book')->where('id', $id)->delete(); DB::table('docs_section')->where('bookid', $id)->delete(); DB::table('docs_content')->where('bookid', $id)->delete(); return Base::retSuccess('删除成功!'); } /** * 成员-列表 * * @apiParam {Number} id 知识库数据ID * @apiParam {Number} [page] 当前页,默认:1 * @apiParam {Number} [pagesize] 每页显示数量,默认:20,最大:100 */ public function users__lists() { $user = Users::authE(); if (Base::isError($user)) { return $user; } else { $user = $user['data']; } // $id = intval(Request::input('id')); $role = Docs::checkRole($id, 'edit'); if (Base::isError($role)) { return $role; } $row = Base::DBC2A(DB::table('docs_book')->where('id', $id)->first()); if (empty($row)) { return Base::retError('知识库不存在或已被删除!'); } // $lists = DB::table('docs_book') ->join('docs_users', 'docs_book.id', '=', 'docs_users.bookid') ->select(['docs_book.title', 'docs_users.*']) ->where([ ['docs_book.id', $id], ]) ->orderByDesc('docs_users.id')->paginate(Base::getPaginate(100, 20)); $lists = Base::getPageList($lists); if ($lists['total'] == 0) { return Base::retError('未找到任何相关的成员'); } foreach ($lists['lists'] AS $key => $item) { $userInfo = Users::username2basic($item['username']); $lists['lists'][$key]['userimg'] = $userInfo['userimg']; $lists['lists'][$key]['nickname'] = $userInfo['nickname']; $lists['lists'][$key]['profession'] = $userInfo['profession']; } return Base::retSuccess('success', $lists); } /** * 成员-添加、删除 * * @apiParam {String} act * - delete: 删除成员 * - else: 添加成员 * @apiParam {Number} id 知识库数据ID * @apiParam {Array|String} username 用户名(或用户名组) */ public function users__join() { $user = Users::authE(); if (Base::isError($user)) { return $user; } else { $user = $user['data']; } // $id = intval(Request::input('id')); $role = Docs::checkRole($id, 'edit'); if (Base::isError($role)) { return $role; } $row = Base::DBC2A(DB::table('docs_book')->where('id', $id)->first()); if (empty($row)) { return Base::retError('知识库不存在或已被删除!'); } // $usernames = Request::input('username'); if (empty($usernames)) { return Base::retError('参数错误!'); } if (!is_array($usernames)) { if (Base::strExists($usernames, ',')) { $usernames = explode(',', $usernames); } else { $usernames = [$usernames]; } } // foreach ($usernames AS $username) { $inRow = Base::DBC2A(DB::table('docs_users')->where(['bookid' => $id, 'username' => $username])->first()); switch (Request::input('act')) { case 'delete': { if ($inRow) { DB::table('docs_users')->where([ 'bookid' => $id, 'username' => $username ])->delete(); } break; } default: { if (!$inRow && $username != $user['username']) { DB::table('docs_users')->insert([ 'bookid' => $id, 'username' => $username, 'indate' => Base::time() ]); } break; } } } return Base::retSuccess('操作完成!'); } /** * 章节列表 * * @apiParam {String} act 请求方式,用于判断权限 * - edit: 管理页请求 * - view: 阅读页请求 * @apiParam {Number} bookid 知识库数据ID */ public function section__lists() { $bookid = intval(Request::input('bookid')); $role = Docs::checkRole($bookid, Request::input('act')); if (Base::isError($role) && $role['ret'] < 0) { return $role; } $lists = Base::DBC2A(DB::table('docs_section') ->where('bookid', $bookid) ->orderByDesc('inorder') ->orderByDesc('id') ->take(500) ->get()); if (empty($lists)) { return Base::retError('暂无章节'); } foreach ($lists AS $key => $item) { $lists[$key]['icon'] = Base::fillUrl('images/files/' . $item['type'] . '.png'); } $bookDetail = Base::DBC2A(DB::table('docs_book')->select(['title'])->where('id', $bookid)->first()); return Base::retSuccess('success', [ 'book' => $bookDetail ?: json_decode('{}'), 'tree' => Base::list2Tree($lists, 'id', 'parentid') ]); } /** * 添加/修改章节 * * @apiParam {Number} bookid 知识库数据ID * @apiParam {String} title 章节名称 * @apiParam {String} type 章节类型 */ public function section__add() { $user = Users::authE(); if (Base::isError($user)) { return $user; } else { $user = $user['data']; } // $bookid = intval(Request::input('bookid')); $role = Docs::checkRole($bookid, 'edit'); if (Base::isError($role)) { return $role; } $bookRow = Base::DBC2A(DB::table('docs_book')->where('id', $bookid)->first()); if (empty($bookRow)) { return Base::retError('知识库不存在或已被删除!'); } $count = DB::table('docs_section')->where('bookid', $bookid)->count(); if ($count >= 500) { return Base::retError(['知识库章节已经超过最大限制(%)!', 500]); } // $id = intval(Request::input('id')); $title = trim(Request::input('title')); $type = trim(Request::input('type')); if (mb_strlen($title) < 2 || mb_strlen($title) > 100) { return Base::retError('标题限制2-100个字!'); } if ($id > 0) { // 修改 $row = Base::DBC2A(DB::table('docs_section')->where('id', $id)->first()); if (empty($row)) { return Base::retError('知识库不存在或已被删除!'); } $data = [ 'title' => $title, ]; DB::table('docs_section')->where('id', $id)->update($data); return Base::retSuccess('修改成功!', $data); } else { // 添加 if (!in_array($type, ['document', 'mind', 'sheet', 'flow', 'folder'])) { return Base::retError('参数错误!'); } $parentid = 0; if ($id < 0) { $count = Base::DBC2A(DB::table('docs_section')->where('id', abs($id))->where('bookid', $bookid)->count()); if ($count > 0) { $parentid = abs($id); } } $data = [ 'bookid' => $bookid, 'parentid' => $parentid, 'username' => $user['username'], 'title' => $title, 'type' => $type, 'inorder' => intval(DB::table('docs_section')->select(['inorder'])->where('bookid', $bookid)->orderByDesc('inorder')->value('inorder')) + 1, 'indate' => Base::time(), ]; $id = DB::table('docs_section')->insertGetId($data); if (empty($id)) { return Base::retError('系统繁忙,请稍后再试!'); } $data['id'] = $id; return Base::retSuccess('添加成功!', $data); } } /** * 排序章节 * * @apiParam {Number} bookid 知识库数据ID * @apiParam {String} oldsort 旧排序数据 * @apiParam {String} newsort 新排序数据 */ public function section__sort() { $user = Users::authE(); if (Base::isError($user)) { return $user; } else { $user = $user['data']; } // $bookid = intval(Request::input('bookid')); $role = Docs::checkRole($bookid, 'edit'); if (Base::isError($role)) { return $role; } $bookRow = Base::DBC2A(DB::table('docs_book')->where('id', $bookid)->first()); if (empty($bookRow)) { return Base::retError('知识库不存在或已被删除!'); } // $newSort = explode(";", Request::input('newsort')); if (count($newSort) == 0) { return Base::retError('参数错误!'); } // $count = count($newSort); foreach ($newSort AS $sort => $item) { list($newId, $newParentid) = explode(':', $item); DB::table('docs_section')->where([ 'id' => $newId, 'bookid' => $bookid ])->update([ 'inorder' => $count - intval($sort), 'parentid' => $newParentid ]); } return Base::retSuccess('保存成功!'); } /** * 删除章节 * * @apiParam {Number} id 章节数据ID */ public function section__delete() { $user = Users::authE(); if (Base::isError($user)) { return $user; } else { $user = $user['data']; } // $id = intval(Request::input('id')); $row = Base::DBC2A(DB::table('docs_section')->where('id', $id)->first()); if (empty($row)) { return Base::retError('文档不存在或已被删除!'); } $role = Docs::checkRole($row['bookid'], 'edit'); if (Base::isError($role)) { return $role; } DB::table('docs_section')->where('parentid', $id)->update([ 'parentid' => $row['parentid'] ]); DB::table('docs_section')->where('id', $id)->delete(); DB::table('docs_content')->where('sid', $id)->delete(); return Base::retSuccess('删除成功!'); } /** * 获取章节内容 * * @apiParam {String} act 请求方式,用于判断权限 * - edit: 管理页请求 * - view: 阅读页请求 * @apiParam {Number|String} id 章节数据ID(或:章节数据ID-历史数据ID) */ public function section__content() { $id = Request::input('id'); $hid = 0; if (Base::strExists($id, '-')) { list($id, $hid) = explode("-", $id); } $id = intval($id); $hid = intval($hid); $row = Base::DBC2A(DB::table('docs_section')->where('id', $id)->first()); if (empty($row)) { return Base::retError('文档不存在或已被删除!'); } $role = Docs::checkRole($row['bookid'], Request::input('act')); if (Base::isError($role) && $role['ret'] < 0) { return $role; } $whereArray = []; if ($hid > 0) { $whereArray[] = ['id', '=', $hid]; } $whereArray[] = ['sid', '=', $id]; $cRow = Base::DBC2A(DB::table('docs_content')->select(['id AS hid', 'content'])->where($whereArray)->orderByDesc('id')->first()); if (empty($cRow)) { $cRow = [ 'hid' => 0, 'content' => '' ]; } return Base::retSuccess('success', array_merge($row, $cRow)); } /** * 获取章节历史内容 * * @apiParam {Number} id 章节数据ID */ public function section__history() { $user = Users::authE(); if (Base::isError($user)) { return $user; } else { $user = $user['data']; } // $id = intval(Request::input('id')); $row = Base::DBC2A(DB::table('docs_section')->where('id', $id)->first()); if (empty($row)) { return Base::retError('文档不存在或已被删除!'); } $role = Docs::checkRole($row['bookid'], 'edit'); if (Base::isError($role) && $role['ret'] < 0) { return $role; } // $lists = Base::DBC2A(DB::table('docs_content') ->where('sid', $id) ->orderByDesc('id') ->take(50) ->get()); if (count($lists) <= 1) { return Base::retError('暂无历史数据'); } return Base::retSuccess('success', $lists); } /** * {post} 保存章节内容 * * @apiParam {Number} id 章节数据ID * @apiParam {Object} [D] Request Payload 提交 * - content: 内容 */ public function section__save() { $user = Users::authE(); if (Base::isError($user)) { return $user; } else { $user = $user['data']; } // $id = intval(Base::getPostValue('id')); $row = Base::DBC2A(DB::table('docs_section')->where('id', $id)->first()); if (empty($row)) { return Base::retError('文档不存在或已被删除!'); } $role = Docs::checkRole($row['bookid'], 'edit'); if (Base::isError($role)) { return $role; } if ($row['lockdate'] + 60 > Base::time() && $row['lockname'] != $user['username']) { return Base::retError(['已被会员【%】锁定!', Users::nickname($row['lockname'])]); } $content = Base::getPostValue('content'); $text = ''; if ($row['type'] == 'document') { $data = Base::json2array($content); $isRep = false; preg_match_all("/ $text) { $p = "uploads/docs/document/" . $id . "/"; Base::makeDir(public_path($p)); $p.= md5($text) . "." . $matchs[1][$key]; $r = file_put_contents(public_path($p), base64_decode($text)); if ($r) { $data['content'] = str_replace($matchs[0][$key], 'where('sid', $id)->update(['text' => '']); DB::table('docs_content')->insert([ 'bookid' => $row['bookid'], 'sid' => $id, 'content' => $content, 'text' => $text, 'username' => $user['username'], 'indate' => Base::time() ]); Docs::notice($id, [ 'type' => 'update' ]); // return Base::retSuccess('保存成功!', [ 'sid' => $id, 'content' => Base::json2array($content), ]); } /** * 锁定章节内容 * * @apiParam {String} act * - lock: 锁定 * - unlock: 解锁 * @apiParam {Number} id 章节数据ID */ public function section__lock() { $user = Users::authE(); if (Base::isError($user)) { return $user; } else { $user = $user['data']; } // $id = intval(Request::input('id')); $act = trim(Request::input('act')); $row = Base::DBC2A(DB::table('docs_section')->where('id', $id)->first()); if (empty($row)) { return Base::retError('文档不存在或已被删除!'); } $role = Docs::checkRole($row['bookid'], 'edit'); if (Base::isError($role)) { return $role; } if ($row['lockdate'] + 60 > Base::time() && $row['lockname'] != $user['username']) { return Base::retError(['已被会员【%】锁定!', Users::nickname($row['lockname'])]); } if ($act == 'lock') { $upArray = [ 'lockname' => $user['username'], 'lockdate' => Base::time(), ]; } else { $upArray = [ 'lockname' => '', 'lockdate' => 0, ]; } DB::table('docs_section')->where('id', $id)->update($upArray); $upArray['type'] = $act; Docs::notice($id, $upArray); // return Base::retSuccess($act == 'lock' ? '锁定成功' : '已解除锁定', $upArray); } }