kuaifan 5 tahun lalu
induk
melakukan
80c68fb5db

+ 122 - 21
app/Http/Controllers/Api/ProjectController.php

@@ -235,9 +235,9 @@ class ProjectController extends Controller
                             'detail' => '取消收藏',
                             'indate' => Base::time()
                         ]);
-                        return Base::retSuccess('取消成功');
+                        return Base::retSuccess('取消成功');
                     }
-                    return Base::retSuccess('已取消');
+                    return Base::retSuccess('已取消');
                 }
                 default: {
                     $row = Base::DBC2A(DB::table('project_users')->where([
@@ -260,9 +260,9 @@ class ProjectController extends Controller
                             'detail' => '收藏项目',
                             'indate' => Base::time()
                         ]);
-                        return Base::retSuccess('收藏成功');
+                        return Base::retSuccess('收藏成功');
                     }
-                    return Base::retSuccess('已收藏');
+                    return Base::retSuccess('已收藏');
                 }
             }
         });
@@ -310,7 +310,7 @@ class ProjectController extends Controller
             'indate' => Base::time()
         ]);
         //
-        return Base::retSuccess('修改成功');
+        return Base::retSuccess('修改成功');
     }
 
     /**
@@ -389,7 +389,7 @@ class ProjectController extends Controller
             ])->update([
                 'isowner' => 1
             ]);
-            return Base::retSuccess('移交成功');
+            return Base::retSuccess('移交成功');
         });
     }
 
@@ -428,7 +428,104 @@ class ProjectController extends Controller
             'indate' => Base::time()
         ]);
         //
-        return Base::retSuccess('删除成功');
+        return Base::retSuccess('删除成功!');
+    }
+
+
+
+    public function sort()
+    {
+        $user = Users::authE();
+        if (Base::isError($user)) {
+            return $user;
+        } else {
+            $user = $user['data'];
+        }
+        //
+        $projectid = trim(Request::input('projectid'));
+        $inRes = Project::inThe($projectid, $user['username']);
+        if (Base::isError($inRes)) {
+            return $inRes;
+        }
+        //
+        $oldSort = explode(";", Request::input('oldsort'));
+        $newSort = explode(";", Request::input('newsort'));
+        if (count($oldSort) != count($newSort)) {
+            return Base::retError('参数错误!');
+        }
+        if (intval(Request::input('label'))) {
+            //排序分类
+            foreach ($newSort AS $sort => $item) {
+                list($newLabelid, $newTask) = explode(':', $item);
+                list($oldLabelid, $oldTask) = explode(':', $oldSort[$sort]);
+                if ($newLabelid != $oldLabelid) {
+                    DB::table('project_label')->where([
+                        'id' => $newLabelid,
+                        'projectid' => $projectid
+                    ])->update([
+                        'inorder' => intval($sort)
+                    ]);
+                }
+            }
+            $detail = '调整任务列表排序';
+            $sortType = 'label';
+        } else {
+            //排序任务(调整任务归类)
+            foreach ($newSort AS $sort => $item) {
+                list($newLabelid, $newTask) = explode(':', $item);
+                list($oldLabelid, $oldTask) = explode(':', $oldSort[$sort]);
+                if ($newTask != $oldTask) {
+                    $newTask = explode('-', $newTask);
+                    $inorder = count($newTask);
+                    foreach ($newTask AS $taskid) {
+                        DB::table('project_task')->where([
+                            'id' => $taskid,
+                            'projectid' => $projectid
+                        ])->update([
+                            'labelid' => $newLabelid,
+                            'inorder' => $inorder
+                        ]);
+                        $inorder--;
+                    }
+                }
+            }
+            $detail = '调整任务排序';
+            $sortType = 'task';
+        }
+        //
+        $row = Base::DBC2A(DB::table('project_log')->where([ 'type' => '日志', 'projectid' => $projectid ])->orderByDesc('id')->first());
+        $continue = 1;
+        if ($row && $row['username'] == $user['username'] && $row['indate'] + 300 > Base::time()) {
+            $other = Base::string2array($row['other']);
+            if ($other['sortType'] == $sortType) {
+                $continue = intval($other['continue']) + 1;
+                if ($continue <= 100) {
+                    DB::table('project_log')->where('id', $row['id'])->update([
+                        'detail' => $detail . '(' . $continue . '次)',
+                        'other' => Base::array2string([
+                            'sortType' => $sortType,
+                            'continue' => $continue,
+                            'times' => $other['times'] . '|' . Base::time(),
+                        ])
+                    ]);
+                }
+            }
+        }
+        if ($continue == 1) {
+            DB::table('project_log')->insert([
+                'type' => '日志',
+                'projectid' => $projectid,
+                'username' => $user['username'],
+                'detail' => $detail,
+                'indate' => Base::time(),
+                'other' => Base::array2string([
+                    'sortType' => $sortType,
+                    'continue' => $continue,
+                    'times' => Base::time(),
+                ])
+            ]);
+        }
+        return Base::retSuccess('保存成功!');
     }
 
     /**
@@ -471,7 +568,7 @@ class ProjectController extends Controller
             'indate' => Base::time()
         ]);
         //
-        return Base::retSuccess('退出项目成功');
+        return Base::retSuccess('退出项目成功');
     }
 
     /**
@@ -598,7 +695,7 @@ class ProjectController extends Controller
                 }
             }
         }
-        return Base::retSuccess('操作完成');
+        return Base::retSuccess('操作完成');
     }
 
     /**
@@ -652,7 +749,7 @@ class ProjectController extends Controller
         //
         $row = Base::DBC2A(DB::table('project_label')->where('id', $id)->first());
         $row['taskLists'] = [];
-        return Base::retSuccess('添加成功', $row);
+        return Base::retSuccess('添加成功', $row);
     }
 
     /**
@@ -705,7 +802,7 @@ class ProjectController extends Controller
             ]);
         }
         //
-        return Base::retSuccess('修改成功');
+        return Base::retSuccess('修改成功');
     }
 
     /**
@@ -770,7 +867,7 @@ class ProjectController extends Controller
             DB::table('project_label')->where('id', $labelDetail['id'])->delete();
             DB::table('project_log')->insert($logArray);
             //
-            return Base::retSuccess('删除成功');
+            return Base::retSuccess('删除成功');
         });
     }
 
@@ -812,8 +909,11 @@ class ProjectController extends Controller
         }
         //
         $orderBy = '`inorder` DESC,`id` DESC';
+        if (intval(Request::input('labelid')) == 0) {
+            $orderBy = '`indate` DESC,`id` DESC';
+        }
         $sorts = Base::json2array(Request::input('sorts'));
-        if (in_array($sorts['key'], ['asc', 'desc'])) {
+        if (in_array($sorts['order'], ['asc', 'desc'])) {
             switch ($sorts['key']) {
                 case 'title':
                 case 'labelid':
@@ -821,10 +921,10 @@ class ProjectController extends Controller
                 case 'username':
                 case 'level':
                 case 'indate':
-                    $orderBy = '`' . $sorts['key'] . '` ' . $sorts['key'] . ',`id` DESC';
+                    $orderBy = '`' . $sorts['key'] . '` ' . $sorts['order'] . ',`id` DESC';
                     break;
                 case 'type':
-                    $orderBy = 'CASE WHEN `complete`= 0 AND `enddate` BETWEEN 1 AND ' . Base::time() . ' THEN 0 ELSE 1 END ' . $sorts['key'] . ', `complete` ' . $sorts['key'] . ',`id` DESC';
+                    $orderBy = 'CASE WHEN `complete`= 0 AND `enddate` BETWEEN 1 AND ' . Base::time() . ' THEN 0 ELSE 1 END ' . $sorts['order'] . ', `complete` ' . $sorts['order'] . ',`id` DESC';
                     break;
             }
         }
@@ -953,6 +1053,7 @@ class ProjectController extends Controller
             'username' => $username,
             'title' => $title,
             'level' => max(1, min(4, intval(Request::input('level')))),
+            'inorder' => intval(DB::table('project_task')->where('projectid', $projectid)->orderByDesc('inorder')->value('inorder')) + 1,
             'indate' => Base::time(),
             'subtask' => Base::array2string([]),
             'files' => Base::array2string([]),
@@ -1042,7 +1143,7 @@ class ProjectController extends Controller
                         'title' => $task['title'],
                     ])
                 ]);
-                return Base::retSuccess('取消归档成功');
+                return Base::retSuccess('取消归档成功');
             }
             default: {
                 if ($task['archived'] == 1) {
@@ -1064,7 +1165,7 @@ class ProjectController extends Controller
                         'title' => $task['title'],
                     ])
                 ]);
-                return Base::retSuccess('加入归档成功');
+                return Base::retSuccess('加入归档成功');
             }
         }
     }
@@ -1099,14 +1200,14 @@ class ProjectController extends Controller
         //
         $orderBy = '`id` DESC';
         $sorts = Base::json2array(Request::input('sorts'));
-        if (in_array($sorts['key'], ['asc', 'desc'])) {
+        if (in_array($sorts['order'], ['asc', 'desc'])) {
             switch ($sorts['key']) {
                 case 'name':
                 case 'size':
                 case 'download':
                 case 'username':
                 case 'indate':
-                    $orderBy = '`' . $sorts['key'] . '` ' . $sorts['key'] . ',`id` DESC';
+                    $orderBy = '`' . $sorts['key'] . '` ' . $sorts['order'] . ',`id` DESC';
                     break;
             }
         }
@@ -1303,7 +1404,7 @@ class ProjectController extends Controller
             ]);
         }
         //
-        return Base::retSuccess('修改成功', [
+        return Base::retSuccess('修改成功', [
             'name' => $name,
         ]);
     }
@@ -1351,7 +1452,7 @@ class ProjectController extends Controller
             ])
         ]);
         //
-        return Base::retSuccess('删除成功');
+        return Base::retSuccess('删除成功');
     }
 
     /**

+ 138 - 154
package-lock.json

@@ -2835,46 +2835,30 @@
             }
         },
         "css-loader": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz",
-            "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==",
+            "version": "3.5.3",
+            "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.3.tgz",
+            "integrity": "sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw==",
             "dev": true,
             "requires": {
-                "babel-code-frame": "^6.26.0",
-                "css-selector-tokenizer": "^0.7.0",
-                "icss-utils": "^2.1.0",
-                "loader-utils": "^1.0.2",
-                "lodash": "^4.17.11",
-                "postcss": "^6.0.23",
-                "postcss-modules-extract-imports": "^1.2.0",
-                "postcss-modules-local-by-default": "^1.2.0",
-                "postcss-modules-scope": "^1.1.0",
-                "postcss-modules-values": "^1.3.0",
-                "postcss-value-parser": "^3.3.0",
-                "source-list-map": "^2.0.0"
+                "camelcase": "^5.3.1",
+                "cssesc": "^3.0.0",
+                "icss-utils": "^4.1.1",
+                "loader-utils": "^1.2.3",
+                "normalize-path": "^3.0.0",
+                "postcss": "^7.0.27",
+                "postcss-modules-extract-imports": "^2.0.0",
+                "postcss-modules-local-by-default": "^3.0.2",
+                "postcss-modules-scope": "^2.2.0",
+                "postcss-modules-values": "^3.0.0",
+                "postcss-value-parser": "^4.0.3",
+                "schema-utils": "^2.6.6",
+                "semver": "^6.3.0"
             },
             "dependencies": {
-                "postcss": {
-                    "version": "6.0.23",
-                    "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
-                    "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
-                    "dev": true,
-                    "requires": {
-                        "chalk": "^2.4.1",
-                        "source-map": "^0.6.1",
-                        "supports-color": "^5.4.0"
-                    }
-                },
-                "postcss-value-parser": {
-                    "version": "3.3.1",
-                    "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-                    "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-                    "dev": true
-                },
-                "source-map": {
-                    "version": "0.6.1",
-                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-                    "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+                "semver": {
+                    "version": "6.3.0",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+                    "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
                     "dev": true
                 }
             }
@@ -4950,31 +4934,12 @@
             "dev": true
         },
         "icss-utils": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz",
-            "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=",
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
+            "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
             "dev": true,
             "requires": {
-                "postcss": "^6.0.1"
-            },
-            "dependencies": {
-                "postcss": {
-                    "version": "6.0.23",
-                    "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
-                    "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
-                    "dev": true,
-                    "requires": {
-                        "chalk": "^2.4.1",
-                        "source-map": "^0.6.1",
-                        "supports-color": "^5.4.0"
-                    }
-                },
-                "source-map": {
-                    "version": "0.6.1",
-                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-                    "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-                    "dev": true
-                }
+                "postcss": "^7.0.14"
             }
         },
         "ieee754": {
@@ -5678,6 +5643,99 @@
                 "webpack-merge": "^4.1.0",
                 "webpack-notifier": "^1.5.1",
                 "yargs": "^12.0.5"
+            },
+            "dependencies": {
+                "css-loader": {
+                    "version": "1.0.1",
+                    "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz",
+                    "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==",
+                    "dev": true,
+                    "requires": {
+                        "babel-code-frame": "^6.26.0",
+                        "css-selector-tokenizer": "^0.7.0",
+                        "icss-utils": "^2.1.0",
+                        "loader-utils": "^1.0.2",
+                        "lodash": "^4.17.11",
+                        "postcss": "^6.0.23",
+                        "postcss-modules-extract-imports": "^1.2.0",
+                        "postcss-modules-local-by-default": "^1.2.0",
+                        "postcss-modules-scope": "^1.1.0",
+                        "postcss-modules-values": "^1.3.0",
+                        "postcss-value-parser": "^3.3.0",
+                        "source-list-map": "^2.0.0"
+                    }
+                },
+                "icss-utils": {
+                    "version": "2.1.0",
+                    "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz",
+                    "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=",
+                    "dev": true,
+                    "requires": {
+                        "postcss": "^6.0.1"
+                    }
+                },
+                "postcss": {
+                    "version": "6.0.23",
+                    "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+                    "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+                    "dev": true,
+                    "requires": {
+                        "chalk": "^2.4.1",
+                        "source-map": "^0.6.1",
+                        "supports-color": "^5.4.0"
+                    }
+                },
+                "postcss-modules-extract-imports": {
+                    "version": "1.2.1",
+                    "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz",
+                    "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==",
+                    "dev": true,
+                    "requires": {
+                        "postcss": "^6.0.1"
+                    }
+                },
+                "postcss-modules-local-by-default": {
+                    "version": "1.2.0",
+                    "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
+                    "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
+                    "dev": true,
+                    "requires": {
+                        "css-selector-tokenizer": "^0.7.0",
+                        "postcss": "^6.0.1"
+                    }
+                },
+                "postcss-modules-scope": {
+                    "version": "1.1.0",
+                    "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
+                    "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
+                    "dev": true,
+                    "requires": {
+                        "css-selector-tokenizer": "^0.7.0",
+                        "postcss": "^6.0.1"
+                    }
+                },
+                "postcss-modules-values": {
+                    "version": "1.3.0",
+                    "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
+                    "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
+                    "dev": true,
+                    "requires": {
+                        "icss-replace-symbols": "^1.1.0",
+                        "postcss": "^6.0.1"
+                    }
+                },
+                "postcss-value-parser": {
+                    "version": "3.3.1",
+                    "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+                    "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+                    "dev": true
+                },
+                "source-map": {
+                    "version": "0.6.1",
+                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+                    "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+                    "dev": true
+                }
             }
         },
         "last-call-webpack-plugin": {
@@ -7413,118 +7471,44 @@
             }
         },
         "postcss-modules-extract-imports": {
-            "version": "1.2.1",
-            "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz",
-            "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==",
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
+            "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
             "dev": true,
             "requires": {
-                "postcss": "^6.0.1"
-            },
-            "dependencies": {
-                "postcss": {
-                    "version": "6.0.23",
-                    "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
-                    "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
-                    "dev": true,
-                    "requires": {
-                        "chalk": "^2.4.1",
-                        "source-map": "^0.6.1",
-                        "supports-color": "^5.4.0"
-                    }
-                },
-                "source-map": {
-                    "version": "0.6.1",
-                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-                    "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-                    "dev": true
-                }
+                "postcss": "^7.0.5"
             }
         },
         "postcss-modules-local-by-default": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
-            "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz",
+            "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==",
             "dev": true,
             "requires": {
-                "css-selector-tokenizer": "^0.7.0",
-                "postcss": "^6.0.1"
-            },
-            "dependencies": {
-                "postcss": {
-                    "version": "6.0.23",
-                    "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
-                    "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
-                    "dev": true,
-                    "requires": {
-                        "chalk": "^2.4.1",
-                        "source-map": "^0.6.1",
-                        "supports-color": "^5.4.0"
-                    }
-                },
-                "source-map": {
-                    "version": "0.6.1",
-                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-                    "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-                    "dev": true
-                }
+                "icss-utils": "^4.1.1",
+                "postcss": "^7.0.16",
+                "postcss-selector-parser": "^6.0.2",
+                "postcss-value-parser": "^4.0.0"
             }
         },
         "postcss-modules-scope": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
-            "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz",
+            "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==",
             "dev": true,
             "requires": {
-                "css-selector-tokenizer": "^0.7.0",
-                "postcss": "^6.0.1"
-            },
-            "dependencies": {
-                "postcss": {
-                    "version": "6.0.23",
-                    "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
-                    "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
-                    "dev": true,
-                    "requires": {
-                        "chalk": "^2.4.1",
-                        "source-map": "^0.6.1",
-                        "supports-color": "^5.4.0"
-                    }
-                },
-                "source-map": {
-                    "version": "0.6.1",
-                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-                    "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-                    "dev": true
-                }
+                "postcss": "^7.0.6",
+                "postcss-selector-parser": "^6.0.0"
             }
         },
         "postcss-modules-values": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
-            "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz",
+            "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==",
             "dev": true,
             "requires": {
-                "icss-replace-symbols": "^1.1.0",
-                "postcss": "^6.0.1"
-            },
-            "dependencies": {
-                "postcss": {
-                    "version": "6.0.23",
-                    "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
-                    "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
-                    "dev": true,
-                    "requires": {
-                        "chalk": "^2.4.1",
-                        "source-map": "^0.6.1",
-                        "supports-color": "^5.4.0"
-                    }
-                },
-                "source-map": {
-                    "version": "0.6.1",
-                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-                    "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-                    "dev": true
-                }
+                "icss-utils": "^4.0.0",
+                "postcss": "^7.0.6"
             }
         },
         "postcss-normalize-charset": {

+ 5 - 4
package.json

@@ -13,15 +13,16 @@
     "devDependencies": {
         "axios": "^0.19",
         "cross-env": "^7.0",
+        "css-loader": "^3.5.3",
         "laravel-mix": "^5.0.1",
         "lodash": "^4.17.13",
         "resolve-url-loader": "^3.1.0",
-        "sass": "^1.15.2",
-        "sass-loader": "^8.0.0",
+        "sass": "^1.26.5",
+        "sass-loader": "^8.0.2",
         "node-sass": "^4.14.1",
         "jquery": "^3.5.0",
-        "stylus": "^0.54.5",
-        "stylus-loader": "^3.0.1",
+        "stylus": "^0.54.7",
+        "stylus-loader": "^3.0.2",
         "vue": "^2.6.11",
         "vue-loader": "^15.9.2",
         "vue-router": "^3.1.6",

+ 4 - 4
resources/assets/js/main/components/DrawerTabsContainer.vue

@@ -13,7 +13,7 @@
         width: 100%;
         overflow: hidden;
         position: relative;
-        transform: rotateZ(0);
+        transform: translateZ(0);
 
         .dtc-body {
             position: absolute;
@@ -43,10 +43,10 @@
                 return;
             }
             this.idDrawerTabs = true;
-            this.calculateHeight = eb.outerHeight() - el.offset().top;
+            this.calculateHeight = Math.round(eb.outerHeight() - el.offset().top);
             setInterval(() => {
-                this.calculateHeight = eb.outerHeight() - el.offset().top;
-            }, 1000);
+                this.calculateHeight = Math.round(eb.outerHeight() - el.offset().top);
+            }, 300);
         },
         computed: {
             myStyle() {

+ 2 - 1
resources/assets/js/main/components/project/task/add.vue

@@ -47,7 +47,8 @@
     .task-input-box {
         position: relative;
         margin-top: 5px;
-        margin-bottom: 12px;
+        margin-bottom: 20px;
+        min-height: 70px;
         .input-placeholder,
         .input-enter {
             position: absolute;

+ 1 - 1
resources/assets/js/main/components/project/task/lists.vue

@@ -258,7 +258,7 @@
                 whereData.page = Math.max(this.listPage, 1);
                 whereData.pagesize = Math.max($A.runNum(this.listPageSize), 10);
                 whereData.projectid = this.projectid;
-                whereData.sorts = this.sorts;
+                whereData.sorts = $A.cloneData(this.sorts);
                 $A.aAjax({
                     url: 'project/task/lists',
                     data: whereData,

+ 65 - 5
resources/assets/js/main/pages/project-panel.vue

@@ -11,7 +11,7 @@
                     <div class="project-title">
                         <div v-if="loadIng > 0" class="project-title-loading"><w-loading></w-loading></div>
                         <h1>{{projectDetail.title}}</h1>
-                        <div class="project-title-refresh" @click="getDetail">刷新</div>
+                        <div class="project-title-refresh" @click="getDetail(true)">刷新</div>
                     </div>
                 </div>
                 <div class="w-nav-flex"></div>
@@ -25,7 +25,7 @@
         </div>
 
         <w-content>
-            <draggable v-if="projectLabel.length > 0" v-model="projectLabel" class="label-box" draggable=".label-draggable" :animation="150">
+            <draggable v-if="projectLabel.length > 0" v-model="projectLabel" class="label-box" draggable=".label-draggable" :animation="150" :disabled="projectSortDisabled" @sort="projectSortUpdate(true)">
                 <div v-for="label in projectLabel" :key="label.id" class="label-item label-draggable">
                     <div class="label-body">
                         <div class="title-box">
@@ -42,7 +42,7 @@
                                 </DropdownMenu>
                             </Dropdown>
                         </div>
-                        <draggable v-model="label.taskLists" class="task-box" group="task" :animation="150" draggable=".task-draggable">
+                        <draggable v-model="label.taskLists" class="task-box" group="task" draggable=".task-draggable" :animation="150" :disabled="projectSortDisabled" @sort="projectSortUpdate(false)" @remove="projectSortUpdate(false)">
                             <div v-for="task in label.taskLists" :key="task.id" class="task-item task-draggable">
                                 <div class="task-shadow" :class="[
                                         'p'+task.level,
@@ -165,6 +165,7 @@
             width: 100%;
             height: 100%;
             padding: 15px;
+            transform: translateZ(0);
             .label-item {
                 flex-grow: 1;
                 flex-shrink: 0;
@@ -227,6 +228,7 @@
                         display: flex;
                         flex-direction: column;
                         padding: 0 12px 2px;
+                        transform: translateZ(0);
                         .task-item {
                             width: 100%;
                             .task-shadow {
@@ -349,6 +351,8 @@
                 projectDetail: {},
                 projectLabel: [],
                 projectSimpleLabel: [],
+                projectSortData: '',
+                projectSortDisabled: false,
 
                 projectDrawerShow: false,
                 projectDrawerTab: 'lists',
@@ -379,7 +383,7 @@
             }
         },
         methods: {
-            getDetail() {
+            getDetail(successTip) {
                 this.loadIng++;
                 $A.aAjax({
                     url: 'project/detail',
@@ -399,6 +403,10 @@
                             this.projectDetail = res.data.project;
                             this.projectLabel = res.data.label;
                             this.projectSimpleLabel = res.data.simpleLabel;
+                            this.projectSortData = this.getProjectSort();
+                            if (successTip === true) {
+                                this.$Message.success(this.$L('刷新成功!'));
+                            }
                         } else {
                             this.$Modal.error({title: this.$L('温馨提示'), content: res.msg});
                             this.goBack();
@@ -406,6 +414,20 @@
                     }
                 });
             },
+            getProjectSort() {
+                let sortData = "",
+                    taskData = "";
+                this.projectLabel.forEach((label) => {
+                    taskData = "";
+                    label.taskLists.forEach((task) => {
+                        if (taskData) taskData+= "-";
+                        taskData+= task.id;
+                    });
+                    if (sortData) sortData+= ";";
+                    sortData+= label.id + ":" + taskData;
+                });
+                return sortData;
+            },
             handleLabel(event, labelDetail) {
                 switch (event) {
                     case 'refresh': {
@@ -533,6 +555,7 @@
                                 this.projectLabel.some((label, index) => {
                                     if (label.id == item.id) {
                                         this.projectLabel.splice(index, 1);
+                                        this.projectSortData = this.getProjectSort();
                                         return true;
                                     }
                                 });
@@ -591,6 +614,7 @@
                                 success: (res) => {
                                     this.$Modal.remove();
                                     this.projectLabel.push(res.data);
+                                    this.projectSortData = this.getProjectSort();
                                     setTimeout(() => {
                                         if (res.ret === 1) {
                                             this.$Message.success(res.msg);
@@ -627,7 +651,43 @@
             openProjectSettingDrawer(tab) {
                 this.projectSettingDrawerTab = tab;
                 this.projectSettingDrawerShow = true;
-            }
+            },
+
+            projectSortUpdate(isLabel) {
+                let oldSort = this.projectSortData;
+                let newSort = this.getProjectSort();
+                if (oldSort == newSort) {
+                    return;
+                }
+                this.projectSortData = newSort;
+                this.projectSortDisabled = true;
+                this.loadIng++;
+                $A.aAjax({
+                    url: 'project/sort',
+                    data: {
+                        projectid: this.projectid,
+                        oldsort: oldSort,
+                        newsort: newSort,
+                        label: isLabel === true ? 1 : 0
+                    },
+                    complete: () => {
+                        this.projectSortDisabled = false;
+                        this.loadIng--;
+                    },
+                    error: () => {
+                        this.getDetail();
+                        alert(this.$L('网络繁忙,请稍后再试!'));
+                    },
+                    success: (res) => {
+                        if (res.ret === 1) {
+                            this.$Message.success(res.msg);
+                        } else {
+                            this.getDetail();
+                            this.$Modal.error({title: this.$L('温馨提示'), content: res.msg});
+                        }
+                    }
+                });
+            },
         },
     }
 </script>

+ 2 - 2
resources/assets/js/main/pages/project.vue

@@ -463,8 +463,8 @@
                                     this.$set(this.formAdd, 'template', 0);
                                     //
                                     this.getLists(true);
-                                }else{
-                                    this.$Modal.error({title: this.$L('温馨提示'), content: res.msg });
+                                } else {
+                                    this.$Modal.error({title: this.$L('温馨提示'), content: res.msg});
                                 }
                             }
                         });