123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680 |
- <?php
- namespace App\Http\Controllers\Api;
- use App\Http\Controllers\Controller;
- use App\Module\Base;
- use App\Module\Docs;
- use App\Module\Users;
- use App\Tasks\PushTask;
- use Cache;
- use DB;
- use Hhxsv5\LaravelS\Swoole\Task\Task;
- use Request;
- /**
- * @apiDefine docs
- *
- * 知识库
- */
- class DocsController extends Controller
- {
- public function __invoke($method, $action = '')
- {
- $app = $method ? $method : 'main';
- if ($action) {
- $app .= "__" . $action;
- }
- return (method_exists($this, $app)) ? $this->$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("/<img\s*src=\"data:image\/(png|jpg|jpeg);base64,(.*?)\"/s", $data['content'], $matchs);
- foreach ($matchs[2] as $key => $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], '<img src="' . Base::fillUrl($p) . '"', $data['content']);
- $isRep = true;
- }
- }
- $text = strip_tags($data['content']);
- if ($isRep == true) {
- $content = Base::array2json($data);
- }
- }
- DB::table('docs_content')->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);
- }
- }
|