Browse Source

增加项目看板内文件夹类型

sandm 2 years ago
parent
commit
329838aeb3

+ 104 - 28
app/Http/Controllers/Api/ProjectController.php

@@ -178,8 +178,18 @@ class ProjectController extends Controller
             $user = $user['data'];
         }
         //
+        $pid = intval(Request::input('pid'));
         $whereArray = [];
         $whereArray[] = ['project_lists.delete', '=', 0];
+        $whereArray[] = ['project_lists.pid', '=', $pid];
+        $isFolder = intval(Request::input('isfloder'));
+        if($isFolder){
+            $lists = DB::table('project_lists')
+                ->select(['project_lists.*'])
+                ->where([['project_lists.delete','=',0],['project_lists.type','=',1],['project_lists.pid', '=', $pid]])
+                ->orderByDesc('project_lists.id')->get();
+            return Base::retSuccess('success', $lists);
+        }
         if(!in_array('admin',$user['identity'])){
             $whereArray[] = ['project_users.username', '=', $user['username']];
             switch (Request::input('act')) {
@@ -193,15 +203,22 @@ class ProjectController extends Controller
                     break;
                 }
                 default: {
+
                     $whereArray[] = ['project_users.type', '=', '成员'];
                     break;
                 }
             }
+            $orWhereArray = [];
+            $orWhereArray[] = ['project_lists.type','=',1];
+            $orWhereArray[] = ['project_lists.pid','=',$pid];
+            $orWhereArray[] = ['project_lists.delete','=',0];
             $lists = DB::table('project_lists')
                 ->join('project_users', 'project_lists.id', '=', 'project_users.projectid')
                 ->select(['project_lists.*', 'project_users.isowner', 'project_users.indate as uindate'])
                 ->where($whereArray)
+                ->orWhere($orWhereArray)
                 ->orderByDesc('project_lists.id')->paginate(Base::getPaginate(100, 20));
+
         }else{
             $lists = DB::table('project_lists')
                 ->select(['project_lists.*'])
@@ -357,41 +374,55 @@ class ProjectController extends Controller
         } elseif (mb_strlen($title) > 32) {
             return Base::retError('项目名称最多只能设置32个字!');
         }
-        //流程
-        $labels = Request::input('labels');
-        if (!is_array($labels)) $labels = [];
-        $insertLabels = [];
-        $inorder = 0;
-        foreach ($labels AS $label) {
-            $label = trim($label);
-            if ($label) {
-                $insertLabels[] = [
-                    'title' => $label,
-                    'inorder' => $inorder++,
-                ];
-            }
-        }
-        if (empty($insertLabels)) {
-            $insertLabels[] = [
-                'title' => '默认',
-                'inorder' => 0,
-            ];
-        }
-        if (count($insertLabels) > 100) {
-            return Base::retError(['项目流程最多不能超过%个!', 100]);
+        $type = intval(Request::input('type'));
+        if(!in_array($type,[0,1])){
+            return Base::retError('项目类型不正确!');
         }
+        $pid = intval(Request::input('pid',0));
+
         //开始创建
         $projectid = DB::table('project_lists')->insertGetId([
             'title' => $title,
+            'type' => $type,
+            'pid' => $pid,
             'username' => $user['username'],
             'createuser' => $user['username'],
             'indate' => Base::time()
         ]);
+
         if ($projectid) {
-            foreach ($insertLabels AS $key => $label) {
-                $insertLabels[$key]['projectid'] = $projectid;
+            if($type == 0){
+                //流程
+                $labels = Request::input('labels');
+                if (!is_array($labels)) $labels = [];
+                $insertLabels = [];
+                $inorder = 0;
+                foreach ($labels AS $label) {
+                    $label = trim($label);
+                    if ($label) {
+                        $insertLabels[] = [
+                            'title' => $label,
+                            'inorder' => $inorder++,
+                        ];
+                    }
+                }
+                if (empty($insertLabels)) {
+                    $insertLabels[] = [
+                        'title' => '默认',
+                        'inorder' => 0,
+                    ];
+                }
+                if (count($insertLabels) > 100) {
+                    return Base::retError(['项目流程最多不能超过%个!', 100]);
+                }
+
+                foreach ($insertLabels AS $key => $label) {
+                    $insertLabels[$key]['projectid'] = $projectid;
+                }
+                DB::table('project_label')->insert($insertLabels);
             }
-            DB::table('project_label')->insert($insertLabels);
+
+
             DB::table('project_log')->insert([
                 'type' => '日志',
                 'projectid' => $projectid,
@@ -556,7 +587,7 @@ class ProjectController extends Controller
         if (empty($projectDetail)) {
             return Base::retError('项目不存在或已被删除!');
         }
-        if ($projectDetail['username'] != $user['username']) {
+        if ($projectDetail['username'] != $user['username'] && !in_array('admin',$user['identity'])) {
             return Base::retError('你不是项目负责人!');
         }
         //
@@ -603,7 +634,7 @@ class ProjectController extends Controller
         if (empty($projectDetail)) {
             return Base::retError('项目不存在或已被删除!');
         }
-        if ($projectDetail['username'] != $user['username']) {
+        if ($projectDetail['username'] != $user['username'] && !in_array('admin',$user['identity'])) {
             return Base::retError('你不是项目负责人!');
         }
         //
@@ -661,6 +692,47 @@ class ProjectController extends Controller
         });
     }
 
+    public function move(){
+        $user = Users::authE();
+        if (Base::isError($user)) {
+            return $user;
+        } else {
+            $user = $user['data'];
+        }
+        //
+        $projectid = trim(Request::input('projectid'));
+        $pid = intval(Request::input('pid'));
+        $projectDetail = Base::DBC2A(DB::table('project_lists')->where('id', $projectid)->where('delete', 0)->first());
+        if (empty($projectDetail)) {
+            return Base::retError('项目不存在或已被删除!');
+        }
+        if ($projectDetail['username'] != $user['username'] && !in_array('admin',$user['identity'])) {
+            return Base::retError('你不是项目负责人!');
+        }
+        if($pid > 0){
+            $parentProjectDetail = Base::DBC2A(DB::table('project_lists')->where('id', $pid)->where('delete', 0)->first());
+            if($parentProjectDetail['type'] == 0){
+                return Base::retError('项目不允许嵌套!');
+            }
+        }
+
+        //开始转移
+        return DB::transaction(function () use ($pid, $projectDetail, $user, $parentProjectDetail) {
+            DB::table('project_lists')->where('id', $projectDetail['id'])->update([
+                'pid' => $pid
+            ]);
+            DB::table('project_log')->insert([
+                'type' => '日志',
+                'projectid' => $projectDetail['id'],
+                'username' => $user['username'],
+                'detail' => '【' . $projectDetail['title'] . '】转移到【' . $parentProjectDetail['title'] . '】下',
+                'indate' => Base::time()
+            ]);
+            return Base::retSuccess('转移成功!');
+        });
+
+    }
+
     /**
      * 删除项目
      *
@@ -680,9 +752,13 @@ class ProjectController extends Controller
         if (empty($projectDetail)) {
             return Base::retError('项目不存在或已被删除!');
         }
-        if ($projectDetail['username'] != $user['username']) {
+        if ($projectDetail['username'] != $user['username'] && !in_array('admin',$user['identity'])) {
             return Base::retError('你不是项目负责人!');
         }
+        $projectCount = Base::DBC2A(DB::table('project_lists')->where('pid', $projectid)->count("id"));
+        if($projectCount > 0){
+            return Base::retError('该文件夹有子项目,无法删除!');
+        }
         //
         DB::table('project_lists')->where('id', $projectDetail['id'])->update([
             'delete' => 1,

+ 6 - 0
assets/js/main/pages/project.vue

@@ -113,6 +113,12 @@
                 <FormItem prop="title" :label="$L('项目名称')">
                     <Input type="text" v-model="formAdd.title"></Input>
                 </FormItem>
+                <FormItem prop="title" :label="$L('项目类型')">
+                    <RadioGroup v-model="formAdd.type">
+                        <Radio label="1">文件夹</Radio>
+                        <Radio label="0">项目</Radio>
+                    </RadioGroup>
+                </FormItem>
                 <FormItem prop="labels" :label="$L('项目模板')">
                     <Select v-model="formAdd.template" @on-change="(res) => {$set(formAdd, 'labels', labelLists[res].value)}">
                         <Option v-for="(item, index) in labelLists" :value="index" :key="index">{{ item.label }}</Option>

+ 1 - 0
package.json

@@ -35,6 +35,7 @@
         "vue-template-compiler": "^2.6.11"
     },
     "dependencies": {
+        "dingtalk-jsapi": "^2.13.92",
         "tinymce": "^5.6.2",
         "view-design": "^4.4.0",
         "vue-clipboard2": "^0.3.1",

+ 1 - 1
public/.user.ini

@@ -1 +1 @@
-open_basedir=/www/wwwroot/project.jinjianghc.com/:/tmp/
+open_basedir=/www/wwwroot/project/:/tmp/

File diff suppressed because it is too large
+ 0 - 314
public/css/app.css


File diff suppressed because it is too large
+ 0 - 8940
public/js/app.js


File diff suppressed because it is too large
+ 0 - 94
public/js/build/0.js


File diff suppressed because it is too large
+ 0 - 1291
public/js/build/1.js


File diff suppressed because it is too large
+ 0 - 13611
public/js/build/10.js


File diff suppressed because it is too large
+ 0 - 441
public/js/build/11.js


File diff suppressed because it is too large
+ 0 - 89
public/js/build/12.js


File diff suppressed because it is too large
+ 0 - 12663
public/js/build/13.js


File diff suppressed because it is too large
+ 0 - 18
public/js/build/14.js


File diff suppressed because it is too large
+ 0 - 833
public/js/build/15.js


File diff suppressed because it is too large
+ 427 - 357
public/js/build/17.js


File diff suppressed because it is too large
+ 48 - 55
public/js/build/18.js


File diff suppressed because it is too large
+ 196 - 169
public/js/build/19.js


File diff suppressed because it is too large
+ 0 - 1247
public/js/build/2.js


File diff suppressed because it is too large
+ 240 - 169
public/js/build/20.js


File diff suppressed because it is too large
+ 168 - 286
public/js/build/21.js


File diff suppressed because it is too large
+ 178 - 162
public/js/build/22.js


File diff suppressed because it is too large
+ 214 - 141
public/js/build/23.js


+ 46 - 50
public/js/build/24.js

@@ -1,19 +1,19 @@
 webpackJsonp([24],{
 
-/***/ 539:
+/***/ 295:
 /***/ (function(module, exports, __webpack_require__) {
 
 var disposed = false
 function injectStyle (ssrContext) {
   if (disposed) return
-  __webpack_require__(986)
-  __webpack_require__(988)
+  __webpack_require__(981)
+  __webpack_require__(983)
 }
-var normalizeComponent = __webpack_require__(4)
+var normalizeComponent = __webpack_require__(2)
 /* script */
-var __vue_script__ = __webpack_require__(990)
+var __vue_script__ = __webpack_require__(985)
 /* template */
-var __vue_template__ = __webpack_require__(991)
+var __vue_template__ = __webpack_require__(986)
 /* template functional */
 var __vue_template_functional__ = false
 /* styles */
@@ -53,19 +53,19 @@ module.exports = Component.exports
 
 /***/ }),
 
-/***/ 550:
+/***/ 307:
 /***/ (function(module, exports, __webpack_require__) {
 
 var disposed = false
 function injectStyle (ssrContext) {
   if (disposed) return
-  __webpack_require__(551)
+  __webpack_require__(308)
 }
-var normalizeComponent = __webpack_require__(4)
+var normalizeComponent = __webpack_require__(2)
 /* script */
-var __vue_script__ = __webpack_require__(553)
+var __vue_script__ = __webpack_require__(310)
 /* template */
-var __vue_template__ = __webpack_require__(554)
+var __vue_template__ = __webpack_require__(311)
 /* template functional */
 var __vue_template_functional__ = false
 /* styles */
@@ -105,17 +105,17 @@ module.exports = Component.exports
 
 /***/ }),
 
-/***/ 551:
+/***/ 308:
 /***/ (function(module, exports, __webpack_require__) {
 
 // style-loader: Adds some css to the DOM by adding a <style> tag
 
 // load the styles
-var content = __webpack_require__(552);
+var content = __webpack_require__(309);
 if(typeof content === 'string') content = [[module.i, content, '']];
 if(content.locals) module.exports = content.locals;
 // add the styles to the DOM
-var update = __webpack_require__(3)("5ee96958", content, false, {});
+var update = __webpack_require__(1)("5ee96958", content, false, {});
 // Hot Module Replacement
 if(false) {
  // When the styles change, update the <style> tags
@@ -132,10 +132,10 @@ if(false) {
 
 /***/ }),
 
-/***/ 552:
+/***/ 309:
 /***/ (function(module, exports, __webpack_require__) {
 
-exports = module.exports = __webpack_require__(2)(false);
+exports = module.exports = __webpack_require__(0)(false);
 // imports
 
 
@@ -147,7 +147,7 @@ exports.push([module.i, "\n.w-content[data-v-35be3d57] {\n  position: absolute;\
 
 /***/ }),
 
-/***/ 553:
+/***/ 310:
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
@@ -210,7 +210,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
 
 /***/ }),
 
-/***/ 554:
+/***/ 311:
 /***/ (function(module, exports, __webpack_require__) {
 
 var render = function() {
@@ -239,19 +239,19 @@ if (false) {
 
 /***/ }),
 
-/***/ 578:
+/***/ 339:
 /***/ (function(module, exports, __webpack_require__) {
 
 var disposed = false
 function injectStyle (ssrContext) {
   if (disposed) return
-  __webpack_require__(579)
+  __webpack_require__(340)
 }
-var normalizeComponent = __webpack_require__(4)
+var normalizeComponent = __webpack_require__(2)
 /* script */
-var __vue_script__ = __webpack_require__(581)
+var __vue_script__ = __webpack_require__(342)
 /* template */
-var __vue_template__ = __webpack_require__(582)
+var __vue_template__ = __webpack_require__(343)
 /* template functional */
 var __vue_template_functional__ = false
 /* styles */
@@ -291,17 +291,17 @@ module.exports = Component.exports
 
 /***/ }),
 
-/***/ 579:
+/***/ 340:
 /***/ (function(module, exports, __webpack_require__) {
 
 // style-loader: Adds some css to the DOM by adding a <style> tag
 
 // load the styles
-var content = __webpack_require__(580);
+var content = __webpack_require__(341);
 if(typeof content === 'string') content = [[module.i, content, '']];
 if(content.locals) module.exports = content.locals;
 // add the styles to the DOM
-var update = __webpack_require__(3)("72d872d6", content, false, {});
+var update = __webpack_require__(1)("72d872d6", content, false, {});
 // Hot Module Replacement
 if(false) {
  // When the styles change, update the <style> tags
@@ -318,10 +318,10 @@ if(false) {
 
 /***/ }),
 
-/***/ 580:
+/***/ 341:
 /***/ (function(module, exports, __webpack_require__) {
 
-exports = module.exports = __webpack_require__(2)(false);
+exports = module.exports = __webpack_require__(0)(false);
 // imports
 
 
@@ -333,7 +333,7 @@ exports.push([module.i, "\n.tags-wrap {\n  display: inline-block;\n  width: 100%
 
 /***/ }),
 
-/***/ 581:
+/***/ 342:
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
@@ -571,7 +571,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
 
 /***/ }),
 
-/***/ 582:
+/***/ 343:
 /***/ (function(module, exports, __webpack_require__) {
 
 var render = function() {
@@ -701,17 +701,17 @@ if (false) {
 
 /***/ }),
 
-/***/ 986:
+/***/ 981:
 /***/ (function(module, exports, __webpack_require__) {
 
 // style-loader: Adds some css to the DOM by adding a <style> tag
 
 // load the styles
-var content = __webpack_require__(987);
+var content = __webpack_require__(982);
 if(typeof content === 'string') content = [[module.i, content, '']];
 if(content.locals) module.exports = content.locals;
 // add the styles to the DOM
-var update = __webpack_require__(3)("02c58cc5", content, false, {});
+var update = __webpack_require__(1)("02c58cc5", content, false, {});
 // Hot Module Replacement
 if(false) {
  // When the styles change, update the <style> tags
@@ -728,10 +728,10 @@ if(false) {
 
 /***/ }),
 
-/***/ 987:
+/***/ 982:
 /***/ (function(module, exports, __webpack_require__) {
 
-exports = module.exports = __webpack_require__(2)(false);
+exports = module.exports = __webpack_require__(0)(false);
 // imports
 
 
@@ -743,17 +743,17 @@ exports.push([module.i, "\n.team-add-red-input {\n  display: inline-block;\n  ma
 
 /***/ }),
 
-/***/ 988:
+/***/ 983:
 /***/ (function(module, exports, __webpack_require__) {
 
 // style-loader: Adds some css to the DOM by adding a <style> tag
 
 // load the styles
-var content = __webpack_require__(989);
+var content = __webpack_require__(984);
 if(typeof content === 'string') content = [[module.i, content, '']];
 if(content.locals) module.exports = content.locals;
 // add the styles to the DOM
-var update = __webpack_require__(3)("895aec1e", content, false, {});
+var update = __webpack_require__(1)("895aec1e", content, false, {});
 // Hot Module Replacement
 if(false) {
  // When the styles change, update the <style> tags
@@ -770,10 +770,10 @@ if(false) {
 
 /***/ }),
 
-/***/ 989:
+/***/ 984:
 /***/ (function(module, exports, __webpack_require__) {
 
-exports = module.exports = __webpack_require__(2)(false);
+exports = module.exports = __webpack_require__(0)(false);
 // imports
 
 
@@ -785,16 +785,16 @@ exports.push([module.i, "\n.team .team-main[data-v-689d329c] {\n  display: -webk
 
 /***/ }),
 
-/***/ 990:
+/***/ 985:
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_WContent__ = __webpack_require__(550);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_WContent__ = __webpack_require__(307);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_WContent___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__components_WContent__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_ImgUpload__ = __webpack_require__(22);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_ImgUpload__ = __webpack_require__(17);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_ImgUpload___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__components_ImgUpload__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_TagInput__ = __webpack_require__(578);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_TagInput__ = __webpack_require__(339);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_TagInput___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__components_TagInput__);
 //
 //
@@ -1270,7 +1270,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
 
 /***/ }),
 
-/***/ 991:
+/***/ 986:
 /***/ (function(module, exports, __webpack_require__) {
 
 var render = function() {
@@ -1281,11 +1281,7 @@ var render = function() {
     "div",
     { staticClass: "w-main team" },
     [
-      _c("v-title", [
-        _vm._v(
-          _vm._s(_vm.$L("团队")) + "-" + _vm._s(_vm.$L("轻量级的团队在线协作"))
-        )
-      ]),
+      _c("v-title", [_vm._v(_vm._s(_vm.$L("团队")))]),
       _vm._v(" "),
       _c("div", { staticClass: "w-nav" }, [
         _c("div", { staticClass: "nav-row" }, [

File diff suppressed because it is too large
+ 12 - 21
public/js/build/25.js


+ 58 - 58
public/js/build/26.js

@@ -1,16 +1,68 @@
 webpackJsonp([26],{
 
-/***/ 1013:
+/***/ 296:
+/***/ (function(module, exports, __webpack_require__) {
+
+var disposed = false
+function injectStyle (ssrContext) {
+  if (disposed) return
+  __webpack_require__(987)
+}
+var normalizeComponent = __webpack_require__(2)
+/* script */
+var __vue_script__ = null
+/* template */
+var __vue_template__ = __webpack_require__(989)
+/* template functional */
+var __vue_template_functional__ = false
+/* styles */
+var __vue_styles__ = injectStyle
+/* scopeId */
+var __vue_scopeId__ = "data-v-e45a6a6e"
+/* moduleIdentifier (server only) */
+var __vue_module_identifier__ = null
+var Component = normalizeComponent(
+  __vue_script__,
+  __vue_template__,
+  __vue_template_functional__,
+  __vue_styles__,
+  __vue_scopeId__,
+  __vue_module_identifier__
+)
+Component.options.__file = "resources/assets/js/main/pages/404.vue"
+
+/* hot reload */
+if (false) {(function () {
+  var hotAPI = require("vue-hot-reload-api")
+  hotAPI.install(require("vue"), false)
+  if (!hotAPI.compatible) return
+  module.hot.accept()
+  if (!module.hot.data) {
+    hotAPI.createRecord("data-v-e45a6a6e", Component.options)
+  } else {
+    hotAPI.reload("data-v-e45a6a6e", Component.options)
+  }
+  module.hot.dispose(function (data) {
+    disposed = true
+  })
+})()}
+
+module.exports = Component.exports
+
+
+/***/ }),
+
+/***/ 987:
 /***/ (function(module, exports, __webpack_require__) {
 
 // style-loader: Adds some css to the DOM by adding a <style> tag
 
 // load the styles
-var content = __webpack_require__(1014);
+var content = __webpack_require__(988);
 if(typeof content === 'string') content = [[module.i, content, '']];
 if(content.locals) module.exports = content.locals;
 // add the styles to the DOM
-var update = __webpack_require__(3)("2712dff7", content, false, {});
+var update = __webpack_require__(1)("2712dff7", content, false, {});
 // Hot Module Replacement
 if(false) {
  // When the styles change, update the <style> tags
@@ -27,10 +79,10 @@ if(false) {
 
 /***/ }),
 
-/***/ 1014:
+/***/ 988:
 /***/ (function(module, exports, __webpack_require__) {
 
-exports = module.exports = __webpack_require__(2)(false);
+exports = module.exports = __webpack_require__(0)(false);
 // imports
 
 
@@ -42,7 +94,7 @@ exports.push([module.i, "\n.page-404[data-v-e45a6a6e] {\n  background-color: #ff
 
 /***/ }),
 
-/***/ 1015:
+/***/ 989:
 /***/ (function(module, exports, __webpack_require__) {
 
 var render = function() {
@@ -74,58 +126,6 @@ if (false) {
   }
 }
 
-/***/ }),
-
-/***/ 541:
-/***/ (function(module, exports, __webpack_require__) {
-
-var disposed = false
-function injectStyle (ssrContext) {
-  if (disposed) return
-  __webpack_require__(1013)
-}
-var normalizeComponent = __webpack_require__(4)
-/* script */
-var __vue_script__ = null
-/* template */
-var __vue_template__ = __webpack_require__(1015)
-/* template functional */
-var __vue_template_functional__ = false
-/* styles */
-var __vue_styles__ = injectStyle
-/* scopeId */
-var __vue_scopeId__ = "data-v-e45a6a6e"
-/* moduleIdentifier (server only) */
-var __vue_module_identifier__ = null
-var Component = normalizeComponent(
-  __vue_script__,
-  __vue_template__,
-  __vue_template_functional__,
-  __vue_styles__,
-  __vue_scopeId__,
-  __vue_module_identifier__
-)
-Component.options.__file = "resources/assets/js/main/pages/404.vue"
-
-/* hot reload */
-if (false) {(function () {
-  var hotAPI = require("vue-hot-reload-api")
-  hotAPI.install(require("vue"), false)
-  if (!hotAPI.compatible) return
-  module.hot.accept()
-  if (!module.hot.data) {
-    hotAPI.createRecord("data-v-e45a6a6e", Component.options)
-  } else {
-    hotAPI.reload("data-v-e45a6a6e", Component.options)
-  }
-  module.hot.dispose(function (data) {
-    disposed = true
-  })
-})()}
-
-module.exports = Component.exports
-
-
 /***/ })
 
 });

File diff suppressed because it is too large
+ 0 - 253
public/js/build/3.js


File diff suppressed because it is too large
+ 0 - 253
public/js/build/4.js


File diff suppressed because it is too large
+ 0 - 1789
public/js/build/5.js


File diff suppressed because it is too large
+ 0 - 327
public/js/build/6.js


File diff suppressed because it is too large
+ 0 - 1648
public/js/build/7.js


File diff suppressed because it is too large
+ 0 - 89
public/js/build/8.js


+ 1 - 131
public/js/build/9.js

@@ -1,131 +1 @@
-webpackJsonp([9],{
-
-/***/ 296:
-/***/ (function(module, exports, __webpack_require__) {
-
-var disposed = false
-function injectStyle (ssrContext) {
-  if (disposed) return
-  __webpack_require__(987)
-}
-var normalizeComponent = __webpack_require__(2)
-/* script */
-var __vue_script__ = null
-/* template */
-var __vue_template__ = __webpack_require__(989)
-/* template functional */
-var __vue_template_functional__ = false
-/* styles */
-var __vue_styles__ = injectStyle
-/* scopeId */
-var __vue_scopeId__ = "data-v-e45a6a6e"
-/* moduleIdentifier (server only) */
-var __vue_module_identifier__ = null
-var Component = normalizeComponent(
-  __vue_script__,
-  __vue_template__,
-  __vue_template_functional__,
-  __vue_styles__,
-  __vue_scopeId__,
-  __vue_module_identifier__
-)
-Component.options.__file = "resources/assets/js/main/pages/404.vue"
-
-/* hot reload */
-if (false) {(function () {
-  var hotAPI = require("vue-hot-reload-api")
-  hotAPI.install(require("vue"), false)
-  if (!hotAPI.compatible) return
-  module.hot.accept()
-  if (!module.hot.data) {
-    hotAPI.createRecord("data-v-e45a6a6e", Component.options)
-  } else {
-    hotAPI.reload("data-v-e45a6a6e", Component.options)
-  }
-  module.hot.dispose(function (data) {
-    disposed = true
-  })
-})()}
-
-module.exports = Component.exports
-
-
-/***/ }),
-
-/***/ 987:
-/***/ (function(module, exports, __webpack_require__) {
-
-// style-loader: Adds some css to the DOM by adding a <style> tag
-
-// load the styles
-var content = __webpack_require__(988);
-if(typeof content === 'string') content = [[module.i, content, '']];
-if(content.locals) module.exports = content.locals;
-// add the styles to the DOM
-var update = __webpack_require__(1)("2712dff7", content, false, {});
-// Hot Module Replacement
-if(false) {
- // When the styles change, update the <style> tags
- if(!content.locals) {
-   module.hot.accept("!!../../../../../node_modules/css-loader/index.js!../../../../../node_modules/vue-loader/lib/style-compiler/index.js?{\"vue\":true,\"id\":\"data-v-e45a6a6e\",\"scoped\":true,\"hasInlineConfig\":true}!../../../../../node_modules/sass-loader/lib/loader.js!../../../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./404.vue", function() {
-     var newContent = require("!!../../../../../node_modules/css-loader/index.js!../../../../../node_modules/vue-loader/lib/style-compiler/index.js?{\"vue\":true,\"id\":\"data-v-e45a6a6e\",\"scoped\":true,\"hasInlineConfig\":true}!../../../../../node_modules/sass-loader/lib/loader.js!../../../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./404.vue");
-     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
-     update(newContent);
-   });
- }
- // When the module is disposed, remove the <style> tags
- module.hot.dispose(function() { update(); });
-}
-
-/***/ }),
-
-/***/ 988:
-/***/ (function(module, exports, __webpack_require__) {
-
-exports = module.exports = __webpack_require__(0)(false);
-// imports
-
-
-// module
-exports.push([module.i, "\n.page-404[data-v-e45a6a6e] {\n  background-color: #fff;\n  color: #636b6f;\n  font-weight: 400;\n  height: 100vh;\n  margin: 0;\n}\n.page-404 .full-height[data-v-e45a6a6e] {\n    height: 100vh;\n}\n.page-404 .flex-center[data-v-e45a6a6e] {\n    -webkit-box-align: center;\n        -ms-flex-align: center;\n            align-items: center;\n    display: -webkit-box;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-pack: center;\n        -ms-flex-pack: center;\n            justify-content: center;\n}\n.page-404 .position-ref[data-v-e45a6a6e] {\n    position: relative;\n}\n.page-404 .code[data-v-e45a6a6e] {\n    border-right: 2px solid;\n    font-size: 26px;\n    padding: 0 15px 0 15px;\n    text-align: center;\n}\n.page-404 .message[data-v-e45a6a6e] {\n    font-size: 18px;\n    padding: 10px;\n    text-align: center;\n}\n", ""]);
-
-// exports
-
-
-/***/ }),
-
-/***/ 989:
-/***/ (function(module, exports, __webpack_require__) {
-
-var render = function() {
-  var _vm = this
-  var _h = _vm.$createElement
-  var _c = _vm._self._c || _h
-  return _vm._m(0)
-}
-var staticRenderFns = [
-  function() {
-    var _vm = this
-    var _h = _vm.$createElement
-    var _c = _vm._self._c || _h
-    return _c("div", { staticClass: "page-404" }, [
-      _c("div", { staticClass: "flex-center position-ref full-height" }, [
-        _c("div", { staticClass: "code" }, [_vm._v("404")]),
-        _vm._v(" "),
-        _c("div", { staticClass: "message" }, [_vm._v("Not Found")])
-      ])
-    ])
-  }
-]
-render._withStripped = true
-module.exports = { render: render, staticRenderFns: staticRenderFns }
-if (false) {
-  module.hot.accept()
-  if (module.hot.data) {
-    require("vue-hot-reload-api")      .rerender("data-v-e45a6a6e", module.exports)
-  }
-}
-
-/***/ })
-
-});
+webpackJsonp([9],{858:function(e,t,i){var a=i(859);"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals);i(1)("e7cda57c",a,!0,{})},859:function(e,t,i){(e.exports=i(0)(!1)).push([e.i,".page-404[data-v-2d950362]{background-color:#fff;color:#636b6f;font-weight:400;height:100vh;margin:0}.page-404 .full-height[data-v-2d950362]{height:100vh}.page-404 .flex-center[data-v-2d950362]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.page-404 .position-ref[data-v-2d950362]{position:relative}.page-404 .code[data-v-2d950362]{border-right:2px solid;font-size:26px;padding:0 15px;text-align:center}.page-404 .message[data-v-2d950362]{font-size:18px;padding:10px;text-align:center}",""])},860:function(e,t){e.exports={render:function(){this.$createElement;this._self._c;return this._m(0)},staticRenderFns:[function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"page-404"},[t("div",{staticClass:"flex-center position-ref full-height"},[t("div",{staticClass:"code"},[this._v("404")]),this._v(" "),t("div",{staticClass:"message"},[this._v("Not Found")])])])}]}},870:function(e,t,i){var a=i(2)(null,i(860),!1,function(e){i(858)},"data-v-2d950362",null);e.exports=a.exports}});

+ 4 - 0
resources/assets/js/main/mixins/project.js

@@ -4,6 +4,10 @@ export default {
             this.goForward({name: 'project-panel', params: {projectid:projectid, statistics: statistics, other:otherParam||{}}});
         },
 
+        lookProject(projectid, otherParam, statistics = '') {
+            this.goForward({name: 'project-pid', params: {pid:projectid, statistics: statistics, other:otherParam||{}}});
+        },
+
         outProject(projectid, successCallback) {
             this.$Modal.confirm({
                 title: this.$L('退出项目'),

+ 151 - 6
resources/assets/js/main/pages/project.vue

@@ -40,8 +40,9 @@
                             <div v-if="item.loadIng === true" class="project-loading">
                                 <w-loading></w-loading>
                             </div>
-                            <div class="project-title" @click="handleProject('open', item)">{{item.title}}</div>
-                            <div class="project-setting">
+                            <div class="project-title" v-if="item.type == 0" @click="handleProject('open', item)">{{item.title}}</div>
+                            <div class="project-title" v-if="item.type == 1" @click="handleProject('look', item)">{{item.title}}</div>
+                            <div class="project-setting" v-if="item.type == 0">
                                 <Dropdown class="right-info" trigger="click" @on-click="handleProject($event, item)" transfer>
                                     <Icon class="project-setting-icon" type="md-settings" size="16"/>
                                     <Dropdown-menu slot="list">
@@ -49,13 +50,24 @@
                                         <Dropdown-item name="favor">{{$L('收藏')}}</Dropdown-item>
                                         <Dropdown-item v-if="item.isowner" name="rename">{{$L('重命名')}}</Dropdown-item>
                                         <Dropdown-item v-if="item.isowner" name="transfer">{{$L('移交项目')}}</Dropdown-item>
+                                        <Dropdown-item v-if="item.isowner" name="move">{{$L('移动项目')}}</Dropdown-item>
                                         <Dropdown-item v-if="item.isowner" name="delete">{{$L('删除')}}</Dropdown-item>
                                         <Dropdown-item v-else name="out">{{$L('退出')}}</Dropdown-item>
                                     </Dropdown-menu>
                                 </Dropdown>
                             </div>
+                            <div class="project-setting" v-if="item.type == 1 && isAdmin">
+                                <Dropdown class="right-info" trigger="click" @on-click="handleProject($event, item)" transfer>
+                                    <Icon class="project-setting-icon" type="md-settings" size="16"/>
+                                    <Dropdown-menu slot="list">
+                                        <Dropdown-item name="rename">{{$L('重命名')}}</Dropdown-item>
+                                        <Dropdown-item name="move">{{$L('移动')}}</Dropdown-item>
+                                        <Dropdown-item name="delete">{{$L('删除')}}</Dropdown-item>
+                                    </Dropdown-menu>
+                                </Dropdown>
+                            </div>
                         </div>
-                        <div class="project-num" @click="handleProject('open', item)">
+                        <div class="project-num" v-if="item.type == 0" @click="handleProject('open', item)">
                             <div class="project-circle">
                                 <i-circle
                                     :size="100"
@@ -81,7 +93,10 @@
                                 </ul>
                             </div>
                         </div>
-                        <div class="project-bottom">
+                        <div v-if="item.type == 1" @click="handleProject('look', item)" style="height:181px;display:flex;flex:1;flex-direction:row;align-items:center;justify-content:center;cursor: pointer">
+                            <img src="/images/statics/images/folder.png" width="100" style="position:relative;z-index: 10" />
+                        </div>
+                        <div class="project-bottom" v-if="item.type == 0">
                             <div class="project-iconbtn">
                                 <Icon class="project-iconbtn-icon" type="md-stats" />
                                 <div class="project-iconbtn-text" @click.stop="handleProject('statistics', item)">{{$L('项目统计')}}</div>
@@ -113,12 +128,18 @@
                 <FormItem prop="title" :label="$L('项目名称')">
                     <Input type="text" v-model="formAdd.title"></Input>
                 </FormItem>
-                <FormItem prop="labels" :label="$L('项目模板')">
+                <FormItem prop="type" :label="$L('项目类型')">
+                    <RadioGroup v-model="formAdd.type">
+                        <Radio label="1">文件夹</Radio>
+                        <Radio label="0">项目</Radio>
+                    </RadioGroup>
+                </FormItem>
+                <FormItem prop="labels" :label="$L('项目模板')" v-if="this.formType == 0">
                     <Select v-model="formAdd.template" @on-change="(res) => {$set(formAdd, 'labels', labelLists[res].value)}">
                         <Option v-for="(item, index) in labelLists" :value="index" :key="index">{{ item.label }}</Option>
                     </Select>
                 </FormItem>
-                <FormItem :label="$L('项目流程')">
+                <FormItem :label="$L('项目流程')" v-if="this.formType == 0">
                     <div style="line-height:38px">
                         <span v-for="(item, index) in formAdd.labels">
                             <span v-if="index > 0">&gt;</span>
@@ -404,6 +425,7 @@
                     title: '',
                     labels: [],
                     template: 0,
+                    pid:0
                 },
                 ruleAdd: {},
 
@@ -421,9 +443,16 @@
                 projectListDrawerTab: 'myjoin',
 
                 handleProjectId: 0,
+                pid:0,
+                isAdmin: false,
+                formType: 1
+
+
             }
         },
         mounted() {
+            let params = this.$route.params;
+            this.pid = params.pid;
             this.getLists(true);
             //
             $A.setOnTaskInfoListener('pages/project',(act, detail) => {
@@ -483,6 +512,7 @@
                         break;
                 }
             }, true);
+            this.isAdmin = $A.identity('admin');
         },
         deactivated() {
             this.addShow = false;
@@ -493,6 +523,22 @@
             usrName() {
                 this.usrLogin && this.getLists(true);
             },
+            '$route' (To) {
+                if (To.name == 'project-pid') {
+                    this.pid = To.params.pid;
+                }else{
+                    this.pid = 0;
+                }
+            },
+            pid(val){
+                this.formAdd.pid = val;
+                this.listPage = 1;
+                this.listPageSize = 20;
+                this.getLists(true);
+            },
+            'formAdd.type'(val){
+                this.formType = val
+            }
         },
         methods: {
             initLanguage() {
@@ -510,6 +556,9 @@
                     title: [
                         { required: true, message: this.$L('请填写项目名称!'), trigger: 'change' },
                         { type: 'string', min: 2, message: this.$L('项目名称至少2个字!'), trigger: 'change' }
+                    ],
+                    type: [
+                        { required: true, message: this.$L('请选择项目类型!'), trigger: 'change' }
                     ]
                 };
             },
@@ -536,6 +585,7 @@
                     data: {
                         page: Math.max(this.listPage, 1),
                         pagesize: Math.max($A.runNum(this.listPageSize), 20),
+                        pid: this.pid
                     },
                     complete: () => {
                         this.loadIng--;
@@ -550,6 +600,8 @@
                         }
                     }
                 });
+
+
             },
 
             addLabels() {
@@ -643,6 +695,10 @@
                         this.transferProject(item);
                         break;
                     }
+                    case 'move': {
+                        this.moveProject(item);
+                        break;
+                    }
                     case 'delete': {
                         this.deleteProject(item.id, () => {
                             this.getLists();
@@ -674,6 +730,10 @@
                         this.projectListDrawerTab = event;
                         break;
                     }
+                    case 'look': {
+                        this.lookProject(item.id, item);
+                        break;
+                    }
                 }
             },
 
@@ -803,6 +863,91 @@
                 });
             },
 
+            moveProject(item) {
+                this.loadIng++;
+                $A.apiAjax({
+                    url: 'project/lists',
+                    data: {
+                        isfloder: 1,
+                        pid: item.pid
+                    },
+                    complete: () => {
+                        this.loadIng--;
+                    },
+                    success: (res) => {
+                        if (res.ret === 1) {
+                            this.folders = res.data;
+                            this.moveValue = "";
+                            this.$Modal.confirm({
+                                render: (h) => {
+                                    return h('div', [
+                                        h('div', {
+                                            style: {
+                                                fontSize: '16px',
+                                                fontWeight: '500',
+                                                marginBottom: '20px',
+                                            }
+                                        }, this.$L('移动')),
+                                        h('Select', {
+                                                props: {
+                                                    value: this.moveValue,
+                                                    transfer: true,
+                                                },
+                                                on: {
+                                                    'on-change': (val) => {
+                                                        this.moveValue = val;
+                                                    }
+                                                }
+                                            },
+                                            this.folders.map((obj)=>{
+                                                if(obj.id != item.id){
+                                                    return h('Option', {
+                                                        props: {value: obj.id}
+                                                    },obj.title);
+                                                }
+                                            }))
+                                    ])
+                                },
+                                loading: true,
+                                onOk: () => {
+                                    if (this.moveValue) {
+                                        this.$set(item, 'loadIng', true);
+                                        let moveValue = this.moveValue;
+                                        $A.apiAjax({
+                                            url: 'project/move',
+                                            data: {
+                                                projectid: item.id,
+                                                pid: moveValue,
+                                            },
+                                            complete: () => {
+                                                this.$set(item, 'loadIng', false);
+                                            },
+                                            error: () => {
+                                                this.$Modal.remove();
+                                                alert(this.$L('网络繁忙,请稍后再试!'));
+                                            },
+                                            success: (res) => {
+                                                this.$Modal.remove();
+                                                this.getLists();
+                                                setTimeout(() => {
+                                                    if (res.ret === 1) {
+                                                        this.$Message.success(res.msg);
+                                                    } else {
+                                                        this.$Modal.error({title: this.$L('温馨提示'), content: res.msg});
+                                                    }
+                                                }, 350);
+                                            }
+                                        });
+                                    } else {
+                                        this.$Modal.remove();
+                                    }
+                                },
+                            });
+                        }
+                    }
+                });
+            },
+
             selfProportion(complete, count) {
                 if (count <= 0) {
                     return 100;

+ 5 - 0
resources/assets/js/main/routes.js

@@ -17,6 +17,11 @@ export default [
         name: 'project',
         meta: { slide: false, tabActive: 'project' },
         component: resolve => require(['./pages/project.vue'], resolve)
+    },{
+        path: '/project/pid/:pid',
+        name: 'project-pid',
+        meta: { slide: false, tabActive: 'project' },
+        component: resolve => require(['./pages/project.vue'], resolve)
     }, {
         path: '/project/panel/:projectid',
         name: 'project-panel',

BIN
resources/assets/statics/images/folder.png


+ 1 - 1
resources/views/main.blade.php

@@ -37,7 +37,7 @@
     </div>
 </div>
 {{--<script src="{{ mix('js/app.js') }}?v=111111111111111111111111111111111"></script>--}}
-<script src="{{ mix('js/app.js') }}?v=0.1.8"></script>
+<script src="{{ mix('js/app.js') }}?v=0.1.9"></script>
 
 </body>
 </html>

Some files were not shown because too many files changed in this diff