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='文件夹表';