diff --git a/.env b/.env index 6acdc4bd..9c13fa88 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ [APP] NAME = Lsky Pro -DEBUG = false +DEBUG = true TRACE = false diff --git a/application/common/model/Folders.php b/application/common/model/Folders.php new file mode 100644 index 00000000..906ce86d --- /dev/null +++ b/application/common/model/Folders.php @@ -0,0 +1,17 @@ +hasMany('Images', 'user_id', 'id'); } + + public function folders() + { + return $this->hasMany('Folders', 'user_id', 'id'); + } } diff --git a/application/common/validate/Folders.php b/application/common/validate/Folders.php new file mode 100644 index 00000000..3022d99a --- /dev/null +++ b/application/common/validate/Folders.php @@ -0,0 +1,28 @@ + 'require|number|integer', + 'name' => 'require|max:30|chsAlphaNum' + ]; + + protected $message = [ + 'parent_id.require' => '没有找到上级文件夹', + 'parent_id.number' => '上级文件夹异常', + 'parent_id.integer' => '上级文件夹异常', + 'name.require' => '文件夹名称不能为空', + 'name.max' => '文件夹名称长度最大30个字符', + 'name.chsAlphaNum' => '文件夹名称只能是汉字、字母和数字' + ]; +} diff --git a/application/index/controller/Install.php b/application/index/controller/Install.php index 79f47f9d..1cf41e7d 100644 --- a/application/index/controller/Install.php +++ b/application/index/controller/Install.php @@ -190,6 +190,14 @@ EOT; if ($start == 1) { if ($file) { $config = Config::pull('db'); + + // 替换sql关键字 + $file = str_replace([ + '{database}' + ], [ + $config['database'] + ], $file); + $mysqli = new \mysqli( $config['hostname'], $config['username'], diff --git a/application/index/controller/User.php b/application/index/controller/User.php index 9debc438..bebb8026 100644 --- a/application/index/controller/User.php +++ b/application/index/controller/User.php @@ -8,6 +8,7 @@ namespace app\index\controller; +use app\common\model\Folders; use app\common\model\Images; use think\Db; use think\facade\Config; @@ -16,14 +17,18 @@ use think\Exception; class User extends Base { - public function images($keyword = '', $limit = 60) + public function images($keyword = '', $folderId = 0, $limit = 60) { if ($this->request->isPost()) { try { $model = $this->user->images()->order('create_time', 'desc'); + $folders = $this->user->folders()->where('parent_id', $folderId)->select(); if (!empty($keyword)) { $model = $model->where('pathname', 'like', "%{$keyword}%"); } + if (is_numeric($folderId)) { + $model = $model->where('folder_id', $folderId); + } $images = $model->paginate($limit)->each(function ($item) { $item->url = $item->url; // TODO 生成缩略图 @@ -32,7 +37,10 @@ class User extends Base } catch (Exception $e) { return $this->error($e->getMessage()); } - return $this->success('success', null, $images); + return $this->success('success', null, [ + 'images' => $images, + 'folders'=> $folders + ]); } return $this->fetch(); } @@ -90,6 +98,90 @@ class User extends Base } } + public function createFolder() + { + if ($this->request->isPost()) { + try { + $parentId = $this->request->post('parent_id'); + $name = $this->request->post('name'); + $data = [ + 'user_id' => $this->user->id, + 'parent_id' => $parentId, + 'name' => $name + ]; + $validate = $this->validate($data, 'Folders'); + if (true !== $validate) { + throw new Exception($validate); + } + Folders::create($data); + } catch (Exception $e) { + return $this->error($e->getMessage()); + } + return $this->success('创建成功'); + } + } + + public function deleteFolder() + { + if ($this->request->isPost()) { + Db::startTrans(); + try { + $id = $this->request->post('id'); + $folders = $images = []; + $this->getDeleteFoldersAndImages($id, $folders, $images); + $folders[] = (int) $id; + Folders::destroy($folders, true); + Images::destroy($images, true); + Db::commit(); + } catch (Exception $e) { + Db::rollback(); + return $this->error($e->getMessage()); + } + return $this->success('删除成功'); + } + } + + public function renameFolder() + { + if ($this->request->isPost()) { + Db::startTrans(); + try { + $id = $this->request->post('id'); + $parentId = $this->request->post('parent_id'); + $name = $this->request->post('name'); + $data = [ + 'id' => $id, + 'parent_id' => $parentId, + 'user_id' => $this->user->id, + 'name' => $name + ]; + $validate = $this->validate($data, 'Folders'); + if (true !== $validate) { + throw new Exception($validate); + } + Folders::update($data); + Db::commit(); + } catch (Exception $e) { + Db::rollback(); + return $this->error($e->getMessage()); + } + return $this->success('重命名成功'); + } + } + + private function getDeleteFoldersAndImages($folderId, &$folders, &$images) + { + $folderList = Folders::where('parent_id', $folderId)->column('id'); + $imagesList = Images::where('folder_id', $folderId)->column('id'); + if ($imagesList) { + $images = array_merge($images, $imagesList); + } + foreach ($folderList as &$value) { + $folders[] = $value; + $this->getDeleteFoldersAndImages($value, $folders, $images); + } + } + public function settings() { if ($this->request->isPost()) { diff --git a/application/index/view/common/base.html b/application/index/view/common/base.html index 59869a7d..4d7b71b0 100644 --- a/application/index/view/common/base.html +++ b/application/index/view/common/base.html @@ -13,7 +13,7 @@ - + @@ -139,7 +139,7 @@ - + {block name="js"}{/block} diff --git a/install.sql b/install.sql index 875bc621..de7ca828 100644 --- a/install.sql +++ b/install.sql @@ -97,6 +97,7 @@ DROP TABLE IF EXISTS `lsky_images`; CREATE TABLE IF NOT EXISTS `lsky_images` ( `id` int(11) UNSIGNED NOT NULL COMMENT 'ID', `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '用户ID,为0表示游客上传', + `folder_id` int(11) NOT NULL DEFAULT 0 COMMENT '文件夹ID', `strategy` varchar(32) NOT NULL DEFAULT 'local' COMMENT '储存策略,默认本地', `path` varchar(500) NOT NULL COMMENT '保存路径', `name` varchar(500) NOT NULL COMMENT '保存名称', @@ -132,6 +133,21 @@ CREATE TABLE IF NOT EXISTS `lsky_users` ( `create_time` int(11) NOT NULL COMMENT '添加时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; +-- +-- 表的结构 `lsky_folders` +-- + +DROP TABLE IF EXISTS `lsky_folders`; +CREATE TABLE `lsky_folders` ( + `id` int(11) NOT NULL COMMENT 'ID', + `user_id` int(11) NOT NULL COMMENT '用户ID', + `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '上级文件夹ID', + `name` varchar(100) NOT NULL COMMENT '文件夹名称', + `delete_time` int(11) DEFAULT NULL COMMENT '删除时间', + `update_time` int(11) DEFAULT NULL COMMENT '更新时间', + `create_time` int(11) DEFAULT NULL COMMENT '添加时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件夹表'; + -- -- Indexes for dumped tables -- @@ -157,6 +173,12 @@ ALTER TABLE `lsky_users` ADD UNIQUE KEY `username` (`username`), ADD UNIQUE KEY `email` (`email`); +-- +-- Indexes for table `lsky_folders` +-- +ALTER TABLE `lsky_folders` +ADD PRIMARY KEY (`id`); + -- -- 在导出的表使用AUTO_INCREMENT -- @@ -178,3 +200,9 @@ ALTER TABLE `lsky_images` -- ALTER TABLE `lsky_users` MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1; + +-- +-- 使用表AUTO_INCREMENT `lsky_folders` +-- +ALTER TABLE `lsky_folders` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', AUTO_INCREMENT=1; diff --git a/public/static/app/css/app.css b/public/static/app/css/app.css index 635078b9..4d4d6dd8 100644 --- a/public/static/app/css/app.css +++ b/public/static/app/css/app.css @@ -161,6 +161,10 @@ main .images-container #info table tbody tr td[align="right"] { width: 50px; color: #998; } +main .images-container .box { + min-height: 10rem; +} +main .images-container .folders-box .item, main .images-container .images-box .item { position: relative; padding: 2rem 0.4rem 0.4rem; @@ -171,42 +175,54 @@ main .images-container .images-box .item { border: 1px solid transparent; margin-top: 1rem; } +main .images-container .folders-box .item i.iconfont, main .images-container .images-box .item i.iconfont { display: none; position: absolute; cursor: pointer; font-size: 19px; } +main .images-container .folders-box .item i.icon-choice, main .images-container .images-box .item i.icon-choice { top: 5px; left: 5px; color: #cecece; } +main .images-container .folders-box .item i.icon-choice:hover, main .images-container .images-box .item i.icon-choice:hover { color: #999; } +main .images-container .folders-box .item i.icon-info, main .images-container .images-box .item i.icon-info { top: 5px; right: 5px; color: #129cff; } +main .images-container .folders-box .item:hover, main .images-container .images-box .item:hover { background-color: #ebebeb; } +main .images-container .folders-box .item.choice, main .images-container .images-box .item.choice { background: rgba(204, 232, 255, 0.5); border: 1px solid rgba(153, 209, 255, 0.57); } +main .images-container .folders-box .item.choice i.icon-choice, main .images-container .images-box .item.choice i.icon-choice { display: block; color: #3b8cff; } +main .images-container .folders-box .item:hover i.icon-choice, main .images-container .images-box .item:hover i.icon-choice, +main .images-container .folders-box .item.choice i.icon-choice, main .images-container .images-box .item.choice i.icon-choice, +main .images-container .folders-box .item:hover i.icon-info, main .images-container .images-box .item:hover i.icon-info, +main .images-container .folders-box .item.choice i.icon-info, main .images-container .images-box .item.choice i.icon-info { display: block; } +main .images-container .folders-box .item .info, main .images-container .images-box .item .info { cursor: pointer; height: 90px; @@ -215,6 +231,7 @@ main .images-container .images-box .item .info { text-align: center; vertical-align: middle; } +main .images-container .folders-box .item .info img, main .images-container .images-box .item .info img { max-height: 100%; max-width: 100%; @@ -223,11 +240,13 @@ main .images-container .images-box .item .info img { top: 50%; transform: translateY(-50%); } +main .images-container .folders-box .item .info.image img, main .images-container .images-box .item .info.image img { -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2); -moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2); box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2); } +main .images-container .folders-box .item p.name, main .images-container .images-box .item p.name { color: #555; cursor: default; @@ -242,27 +261,6 @@ main .images-container .images-box .item p.name { -webkit-box-orient: vertical; -webkit-line-clamp: 3; } -main .update-container .item { - margin-top: 1rem; -} -main .update-container .item h4 { - font-size: 1.1rem; - margin-bottom: 0.5rem; - color: #555; -} -main .update-container .item h4 small { - color: #777777; -} -main .update-container .item .info { - margin-left: 0.8rem; -} -main .update-container .item .info p { - color: #777; - margin-bottom: 0.3em; -} -main .update-container p { - color: #444; -} main .mdui-textfield .captcha { position: absolute; top: 34px; @@ -271,6 +269,35 @@ main .mdui-textfield .captcha { width: 140px; cursor: pointer; } +main ul.breadcrumb { + display: block; + flex-wrap: wrap; + padding: 0.65rem 1rem; + margin-bottom: 0.5rem; + list-style: none; + background-color: #e9ecef; + border-radius: 0.2rem; + font-size: 13px; +} +main ul.breadcrumb li { + display: inline-block; +} +main ul.breadcrumb li + li { + padding-left: 0.2rem; +} +main ul.breadcrumb li + li:before { + display: inline-block; + padding-right: 0.2rem; + color: #6c757d; + content: "/"; +} +main ul.breadcrumb li a { + cursor: pointer; +} +main ul.breadcrumb li.active a { + cursor: default; + color: #6c757d; +} .file-input .file-preview { border-radius: 0; border: none; diff --git a/public/static/app/css/app.css.map b/public/static/app/css/app.css.map index 0c685803..8e2d2e91 100644 --- a/public/static/app/css/app.css.map +++ b/public/static/app/css/app.css.map @@ -1 +1 @@ -{"version":3,"sources":["app.less"],"names":[],"mappings":"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","file":"app.css"} \ No newline at end of file +{"version":3,"sources":["app.less"],"names":[],"mappings":"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","file":"app.css"} \ No newline at end of file diff --git a/public/static/app/css/app.less b/public/static/app/css/app.less index fae5f17b..cc8c0b3e 100644 --- a/public/static/app/css/app.less +++ b/public/static/app/css/app.less @@ -175,7 +175,11 @@ main { .screen-box { } - .images-box { + .box { + min-height: 10rem; + } + + .folders-box, .images-box { .item { position: relative; padding: 2rem .4rem .4rem; @@ -275,36 +279,6 @@ main { } } - // 系统更新 - .update-container { - .item { - margin-top: 1rem; - - h4 { - font-size: 1.1rem; - margin-bottom: .5rem; - color: #555; - - small { - color: #777777; - } - } - - .info { - margin-left: .8rem; - - p { - color: #777; - margin-bottom: .3em; - } - } - } - - p { - color: #444; - } - } - .mdui-textfield { .captcha { position: absolute; @@ -315,6 +289,43 @@ main { cursor: pointer; } } + + ul.breadcrumb { + display: block; + flex-wrap: wrap; + padding: .65rem 1rem; + margin-bottom: .5rem; + list-style: none; + background-color: #e9ecef; + border-radius: .20rem; + font-size: 13px; + + li { + display: inline-block; + + & + li { + padding-left: .2rem; + + &:before { + display: inline-block; + padding-right: .2rem; + color: #6c757d; + content: "/"; + } + } + + a { + cursor: pointer; + } + + &.active { + a { + cursor: default; + color: #6c757d; + } + } + } + } } // 重写fileinput插件样式 diff --git a/public/static/app/images/folder.svg b/public/static/app/images/folder.svg new file mode 100644 index 00000000..2e55fe1e --- /dev/null +++ b/public/static/app/images/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/app/js/app.js b/public/static/app/js/app.js index f3f47622..8149376f 100644 --- a/public/static/app/js/app.js +++ b/public/static/app/js/app.js @@ -14,12 +14,12 @@ var app = { data: data, dataType: 'json', beforeSend: function () { - loading.fadeIn(500); + loading.fadeIn(200); }, success: success, error: error, complete: function () { - loading.fadeOut(100); + loading.fadeOut(50); } }); }, diff --git a/update.sql b/update.sql index 7f034dba..4abedd4e 100644 --- a/update.sql +++ b/update.sql @@ -29,3 +29,26 @@ UPDATE `lsky_config` SET `key` = 'kodo', `name` = 'kodo_secret_key' WHERE `lsky_ UPDATE `lsky_config` SET `key` = 'kodo', `name` = 'kodo_bucket' WHERE `lsky_config`.`name` = 'qiniu_bucket'; UPDATE `lsky_config` SET `value` = 'kodo' WHERE `lsky_config`.`value` = 'qiniu'; UPDATE `lsky_config` SET `value` = 'uss' WHERE `lsky_config`.`value` = 'upyun'; + +-- v1.4.1 +DROP PROCEDURE IF EXISTS schema_change; +DELIMITER // +CREATE PROCEDURE schema_change() BEGIN +DECLARE {database} VARCHAR(100); +SELECT DATABASE() INTO {database}; +IF NOT EXISTS(SELECT 1 FROM information_schema.columns where table_schema='{database}' and table_name='lsky_images' and COLUMN_NAME='folder_id') THEN + ALTER TABLE `lsky_images` ADD `folder_id` INT NOT NULL DEFAULT '0' COMMENT '文件夹ID' AFTER `user_id`; +END IF; +END// +DELIMITER ; +CALL schema_change(); + +CREATE TABLE IF NOT EXISTS `lsky_folders` ( + `id` int(11) PRIMARY KEY AUTO_INCREMENT NOT NULL COMMENT 'ID', + `user_id` int(11) NOT NULL COMMENT '用户ID', + `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '上级文件夹ID', + `name` varchar(100) NOT NULL COMMENT '文件夹名称', + `delete_time` int(11) DEFAULT NULL COMMENT '删除时间', + `update_time` int(11) DEFAULT NULL COMMENT '更新时间', + `create_time` int(11) DEFAULT NULL COMMENT '添加时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件夹表';