kuaifan 5 년 전
부모
커밋
fcd5d4f992

+ 52 - 0
app/Http/Controllers/Api/ProjectController.php

@@ -1309,4 +1309,56 @@ class ProjectController extends Controller
         //
         return Base::retSuccess('删除成功');
     }
+
+    /**
+     * 项目动态-列表
+     *
+     * @apiParam {Number} projectid             项目ID
+     * @apiParam {Number} [taskid]              任务ID
+     * @apiParam {String} [username]            用户名
+     * @apiParam {Number} [page]                当前页,默认:1
+     * @apiParam {Number} [pagesize]            每页显示数量,默认:20,最大:100
+     */
+    public function log__lists()
+    {
+        $user = Users::authE();
+        if (Base::isError($user)) {
+            return $user;
+        } else {
+            $user = $user['data'];
+        }
+        //
+        $projectid = intval(Request::input('projectid'));
+        $inRes = Project::inThe($projectid, $user['username']);
+        if (Base::isError($inRes)) {
+            return $inRes;
+        }
+        //
+        $whereArray = [];
+        $whereArray[] = ['projectid', '=', $projectid];
+        if (intval(Request::input('taskid')) > 0) {
+            $whereArray[] = ['taskid', '=', intval(Request::input('taskid'))];
+        }
+        if (trim(Request::input('username'))) {
+            $whereArray[] = ['username', '=', trim(Request::input('username'))];
+        }
+        //
+        $lists = DB::table('project_log')
+            ->where($whereArray)
+            ->orderByDesc('indate')->paginate(Min(Max(Base::nullShow(Request::input('pagesize'), 10), 1), 100));
+        $lists = Base::getPageList($lists);
+        if ($lists['total'] == 0) {
+            return Base::retError('未找到任何相关的记录', $lists);
+        }
+        foreach ($lists['lists'] AS $key => $item) {
+            $item = array_merge($item, Users::username2basic($item['username']));
+            $item['timeData'] = [
+                'ymd' => date(date("Y", $item['indate']) == date("Y", Base::time()) ? "m-d" : "Y-m-d", $item['indate']),
+                'week' => Base::getTimeWeek($item['indate']),
+                'segment' => Base::getTimeDayeSegment($item['indate']),
+            ];
+            $lists['lists'][$key] = $item;
+        }
+        return Base::retSuccess('success', $lists);
+    }
 }

+ 42 - 0
app/Module/Base.php

@@ -1161,6 +1161,48 @@ class Base
     }
 
     /**
+     * 获取(时间戳转)今天是星期几,只返回(几)
+     * @param string|number $unixTime
+     * @return string
+     */
+    public static function getTimeWeek($unixTime = '')
+    {
+        $unixTime = is_numeric($unixTime) ? $unixTime : Base::time();
+        $weekarray = ['日', '一', '二', '三', '四', '五', '六'];
+        return $weekarray[date('w', $unixTime)];
+    }
+
+    /**
+     * 获取(时间戳转)现在时间段:深夜、凌晨、早晨、上午.....
+     * @param string|number $unixTime
+     * @return string
+     */
+    public static function getTimeDayeSegment($unixTime = '')
+    {
+        $unixTime = is_numeric($unixTime) ? $unixTime : Base::time();
+        $H = date('H', $unixTime);
+        if ($H >= 19) {
+            return '晚上';
+        } elseif ($H >= 18) {
+            return '傍晚';
+        } elseif ($H >= 13) {
+            return '下午';
+        } elseif ($H >= 12) {
+            return '中午';
+        } elseif ($H >= 8) {
+            return '上午';
+        } elseif ($H >= 5) {
+            return '早晨';
+        } elseif ($H >= 1) {
+            return '凌晨';
+        } elseif ($H >= 0) {
+            return '深夜';
+        } else {
+            return '';
+        }
+    }
+
+    /**
      * JSON返回
      * @param $param
      * @return string

+ 55 - 0
resources/assets/js/main/components/DrawerTabsContainer.vue

@@ -0,0 +1,55 @@
+<template>
+    <div class="dtc-main" :style="myStyle">
+        <div class="dtc-body">
+            <slot/>
+        </div>
+    </div>
+</template>
+
+<style lang="scss" scoped>
+    .dtc-main {
+        display: flex;
+        flex-direction: column;
+        width: 100%;
+        overflow: hidden;
+        position: relative;
+        transform: rotateZ(0);
+
+        .dtc-body {
+            position: absolute;
+            left: 0;
+            right: 0;
+            top: 0;
+            bottom: 0;
+            width: 100%;
+            height: 100%;
+            overflow: auto;
+        }
+    }
+</style>
+<script>
+    export default {
+        name: 'DrawerTabsContainer',
+        data() {
+            return {
+                calculateHeight: 0,
+            }
+        },
+        mounted() {
+            let el = $A(this.$el);
+            let eb = el.parents(".ivu-drawer-body");
+            this.calculateHeight = eb.outerHeight() - el.offset().top;
+            setInterval(() => {
+                this.calculateHeight = eb.outerHeight() - el.offset().top;
+            }, 1000);
+        },
+        computed: {
+            myStyle() {
+                const {calculateHeight} = this;
+                return {
+                    height: Math.max(0, calculateHeight - 16) + 'px'
+                }
+            }
+        },
+    }
+</script>

+ 10 - 6
resources/assets/js/main/components/project/complete.vue

@@ -1,10 +1,12 @@
 <template>
-    <div class="project-complete">
-        <!-- 列表 -->
-        <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
-        <!-- 分页 -->
-        <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
-    </div>
+    <drawer-tabs-container>
+        <div class="project-complete">
+            <!-- 列表 -->
+            <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
+            <!-- 分页 -->
+            <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
+        </div>
+    </drawer-tabs-container>
 </template>
 
 <style lang="scss" scoped>
@@ -15,8 +17,10 @@
     }
 </style>
 <script>
+    import DrawerTabsContainer from "../DrawerTabsContainer";
     export default {
         name: 'ProjectComplete',
+        components: {DrawerTabsContainer},
         props: {
             projectid: {
                 default: 0

+ 10 - 6
resources/assets/js/main/components/project/my/favor.vue

@@ -1,10 +1,12 @@
 <template>
-    <div class="project-complete">
-        <!-- 列表 -->
-        <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
-        <!-- 分页 -->
-        <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
-    </div>
+    <drawer-tabs-container>
+        <div class="project-complete">
+            <!-- 列表 -->
+            <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
+            <!-- 分页 -->
+            <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
+        </div>
+    </drawer-tabs-container>
 </template>
 
 <style lang="scss" scoped>
@@ -16,9 +18,11 @@
 </style>
 <script>
     import Project from "../../../mixins/project";
+    import DrawerTabsContainer from "../../DrawerTabsContainer";
 
     export default {
         name: 'ProjectMyFavor',
+        components: {DrawerTabsContainer},
         props: {
             canload: {
                 type: Boolean,

+ 10 - 6
resources/assets/js/main/components/project/my/join.vue

@@ -1,10 +1,12 @@
 <template>
-    <div class="project-complete">
-        <!-- 列表 -->
-        <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
-        <!-- 分页 -->
-        <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
-    </div>
+    <drawer-tabs-container>
+        <div class="project-complete">
+            <!-- 列表 -->
+            <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
+            <!-- 分页 -->
+            <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
+        </div>
+    </drawer-tabs-container>
 </template>
 
 <style lang="scss" scoped>
@@ -16,9 +18,11 @@
 </style>
 <script>
     import Project from '../../../mixins/project'
+    import DrawerTabsContainer from "../../DrawerTabsContainer";
 
     export default {
         name: 'ProjectMyJoin',
+        components: {DrawerTabsContainer},
         props: {
             canload: {
                 type: Boolean,

+ 10 - 6
resources/assets/js/main/components/project/my/manage.vue

@@ -1,10 +1,12 @@
 <template>
-    <div class="project-complete">
-        <!-- 列表 -->
-        <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
-        <!-- 分页 -->
-        <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
-    </div>
+    <drawer-tabs-container>
+        <div class="project-complete">
+            <!-- 列表 -->
+            <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
+            <!-- 分页 -->
+            <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
+        </div>
+    </drawer-tabs-container>
 </template>
 
 <style lang="scss" scoped>
@@ -16,9 +18,11 @@
 </style>
 <script>
     import Project from "../../../mixins/project";
+    import DrawerTabsContainer from "../../DrawerTabsContainer";
 
     export default {
         name: 'ProjectMyManage',
+        components: {DrawerTabsContainer},
         props: {
             canload: {
                 type: Boolean,

+ 31 - 27
resources/assets/js/main/components/project/statistics.vue

@@ -1,31 +1,33 @@
 <template>
-    <div class="project-statistics">
-        <!-- 标签 -->
-        <ul class="state-overview">
-            <li :class="[taskType==='未完成'?'active':'']" @click="taskType='未完成'">
-                <div class="yellow">
-                    <h1 class="count">{{statistics_unfinished}}</h1>
-                    <p>未完成任务</p>
-                </div>
-            </li>
-            <li :class="[taskType==='已超期'?'active':'']" @click="taskType='已超期'">
-                <div class="red">
-                    <h1 class="count">{{statistics_overdue}}</h1>
-                    <p>超期任务</p>
-                </div>
-            </li>
-            <li :class="[taskType==='已完成'?'active':'']" @click="taskType='已完成'">
-                <div class="terques">
-                    <h1 class="count">{{statistics_complete}}</h1>
-                    <p>已完成任务</p>
-                </div>
-            </li>
-        </ul>
-        <!-- 列表 -->
-        <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
-        <!-- 分页 -->
-        <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
-    </div>
+    <drawer-tabs-container>
+        <div class="project-statistics">
+            <!-- 标签 -->
+            <ul class="state-overview">
+                <li :class="[taskType==='未完成'?'active':'']" @click="taskType='未完成'">
+                    <div class="yellow">
+                        <h1 class="count">{{statistics_unfinished}}</h1>
+                        <p>未完成任务</p>
+                    </div>
+                </li>
+                <li :class="[taskType==='已超期'?'active':'']" @click="taskType='已超期'">
+                    <div class="red">
+                        <h1 class="count">{{statistics_overdue}}</h1>
+                        <p>超期任务</p>
+                    </div>
+                </li>
+                <li :class="[taskType==='已完成'?'active':'']" @click="taskType='已完成'">
+                    <div class="terques">
+                        <h1 class="count">{{statistics_complete}}</h1>
+                        <p>已完成任务</p>
+                    </div>
+                </li>
+            </ul>
+            <!-- 列表 -->
+            <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
+            <!-- 分页 -->
+            <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
+        </div>
+    </drawer-tabs-container>
 </template>
 
 <style lang="scss" scoped>
@@ -120,8 +122,10 @@
     }
 </style>
 <script>
+    import DrawerTabsContainer from "../DrawerTabsContainer";
     export default {
         name: 'ProjectStatistics',
+        components: {DrawerTabsContainer},
         props: {
             projectid: {
                 default: 0

+ 42 - 38
resources/assets/js/main/components/project/task/files.vue

@@ -1,49 +1,51 @@
 <template>
-    <div class="project-task-file">
+    <drawer-tabs-container>
+        <div class="project-task-file">
 
-        <!-- 搜索 -->
-        <Row class="sreachBox">
-            <div class="item">
-                <div class="item-2">
-                    <sreachTitle :val="keys.name">文件名</sreachTitle>
-                    <Input v-model="keys.name" placeholder="关键词"/>
+            <!-- 搜索 -->
+            <Row class="sreachBox">
+                <div class="item">
+                    <div class="item-2">
+                        <sreachTitle :val="keys.name">文件名</sreachTitle>
+                        <Input v-model="keys.name" placeholder="关键词"/>
+                    </div>
+                    <div class="item-2">
+                        <sreachTitle :val="keys.username">上传者</sreachTitle>
+                        <Input v-model="keys.username" placeholder="用户名"/>
+                    </div>
                 </div>
-                <div class="item-2">
-                    <sreachTitle :val="keys.username">上传者</sreachTitle>
-                    <Input v-model="keys.username" placeholder="用户名"/>
+                <div class="item item-button">
+                    <Button type="text" v-if="$A.objImplode(keys)!=''" @click="sreachTab(true)">取消筛选</Button>
+                    <Button type="primary" icon="md-search" :loading="loadIng > 0" @click="sreachTab">搜索</Button type="primary">
                 </div>
-            </div>
-            <div class="item item-button">
-                <Button type="text" v-if="$A.objImplode(keys)!=''" @click="sreachTab(true)">取消筛选</Button>
-                <Button type="primary" icon="md-search" :loading="loadIng > 0" @click="sreachTab">搜索</Button type="primary">
-            </div>
-        </Row>
+            </Row>
 
-        <!-- 按钮 -->
-        <Row class="butBox" style="float:left;margin-top:-32px;">
-            <Upload
-                name="files"
-                ref="upload"
-                :action="actionUrl"
-                :data="params"
-                multiple
-                :format="uploadFormat"
-                :show-upload-list="false"
-                :max-size="10240"
-                :on-success="handleSuccess"
-                :on-format-error="handleFormatError"
-                :on-exceeded-size="handleMaxSize">
-                <Button :loading="loadIng > 0" type="primary" icon="ios-cloud-upload-outline" @click="">上传文件</Button>
-            </Upload>
-        </Row>
+            <!-- 按钮 -->
+            <Row class="butBox" style="float:left;margin-top:-32px;">
+                <Upload
+                    name="files"
+                    ref="upload"
+                    :action="actionUrl"
+                    :data="params"
+                    multiple
+                    :format="uploadFormat"
+                    :show-upload-list="false"
+                    :max-size="10240"
+                    :on-success="handleSuccess"
+                    :on-format-error="handleFormatError"
+                    :on-exceeded-size="handleMaxSize">
+                    <Button :loading="loadIng > 0" type="primary" icon="ios-cloud-upload-outline" @click="">上传文件</Button>
+                </Upload>
+            </Row>
 
-        <!-- 列表 -->
-        <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" @on-sort-change="sortChange" stripe></Table>
+            <!-- 列表 -->
+            <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" @on-sort-change="sortChange" stripe></Table>
 
-        <!-- 分页 -->
-        <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
+            <!-- 分页 -->
+            <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
 
-    </div>
+        </div>
+    </drawer-tabs-container>
 </template>
 <style lang="scss" scoped>
     .project-task-file {
@@ -58,12 +60,14 @@
     import Vue from 'vue'
     import VueClipboard from 'vue-clipboard2'
     import WLoading from '../../../components/WLoading'
+    import DrawerTabsContainer from "../../DrawerTabsContainer";
 
     Vue.use(VueClipboard)
     Vue.component('WLoading', WLoading);
 
     export default {
         name: 'ProjectTaskFiles',
+        components: {DrawerTabsContainer},
         props: {
             projectid: {
                 default: 0

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

@@ -1,56 +1,58 @@
 <template>
-    <div class="project-task-lists">
+    <drawer-tabs-container>
+        <div class="project-task-lists">
 
-        <!-- 搜索 -->
-        <Row class="sreachBox">
-            <div class="item">
-                <div class="item-4">
-                    <sreachTitle :val="keys.type">状态</sreachTitle>
-                    <Select v-model="keys.type" placeholder="全部">
-                        <Option value="">全部</Option>
-                        <Option value="未完成">未完成</Option>
-                        <Option value="已超期">已超期</Option>
-                        <Option value="已完成">已完成</Option>
-                    </Select>
+            <!-- 搜索 -->
+            <Row class="sreachBox">
+                <div class="item">
+                    <div class="item-4">
+                        <sreachTitle :val="keys.type">状态</sreachTitle>
+                        <Select v-model="keys.type" placeholder="全部">
+                            <Option value="">全部</Option>
+                            <Option value="未完成">未完成</Option>
+                            <Option value="已超期">已超期</Option>
+                            <Option value="已完成">已完成</Option>
+                        </Select>
+                    </div>
+                    <div class="item-4">
+                        <sreachTitle :val="keys.username">负责人</sreachTitle>
+                        <Input v-model="keys.username" placeholder="用户名"/>
+                    </div>
+                    <div class="item-4">
+                        <sreachTitle :val="keys.level">级别</sreachTitle>
+                        <Select v-model="keys.level" placeholder="全部">
+                            <Option value="">全部</Option>
+                            <Option value="1">P1</Option>
+                            <Option value="2">P2</Option>
+                            <Option value="3">P3</Option>
+                            <Option value="4">P4</Option>
+                        </Select>
+                    </div>
+                    <div class="item-4">
+                        <sreachTitle :val="keys.labelid">阶段</sreachTitle>
+                        <Select v-model="keys.labelid" placeholder="全部">
+                            <Option value="">全部</Option>
+                            <Option
+                                v-for="item in labelLists"
+                                :value="item.id"
+                                :key="item.id">{{ item.title }}</Option>
+                        </Select>
+                    </div>
                 </div>
-                <div class="item-4">
-                    <sreachTitle :val="keys.username">负责人</sreachTitle>
-                    <Input v-model="keys.username" placeholder="用户名"/>
+                <div class="item item-button">
+                    <Button type="text" v-if="$A.objImplode(keys)!=''" @click="sreachTab(true)">取消筛选</Button>
+                    <Button type="primary" icon="md-search" :loading="loadIng > 0" @click="sreachTab">搜索</Button>
                 </div>
-                <div class="item-4">
-                    <sreachTitle :val="keys.level">级别</sreachTitle>
-                    <Select v-model="keys.level" placeholder="全部">
-                        <Option value="">全部</Option>
-                        <Option value="1">P1</Option>
-                        <Option value="2">P2</Option>
-                        <Option value="3">P3</Option>
-                        <Option value="4">P4</Option>
-                    </Select>
-                </div>
-                <div class="item-4">
-                    <sreachTitle :val="keys.labelid">阶段</sreachTitle>
-                    <Select v-model="keys.labelid" placeholder="全部">
-                        <Option value="">全部</Option>
-                        <Option
-                            v-for="item in labelLists"
-                            :value="item.id"
-                            :key="item.id">{{ item.title }}</Option>
-                    </Select>
-                </div>
-            </div>
-            <div class="item item-button">
-                <Button type="text" v-if="$A.objImplode(keys)!=''" @click="sreachTab(true)">取消筛选</Button>
-                <Button type="primary" icon="md-search" :loading="loadIng > 0" @click="sreachTab">搜索</Button>
-            </div>
-        </Row>
+            </Row>
 
-        <!-- 列表 -->
-        <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" @on-sort-change="sortChange" stripe></Table>
+            <!-- 列表 -->
+            <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" @on-sort-change="sortChange" stripe></Table>
 
-        <!-- 分页 -->
-        <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
+            <!-- 分页 -->
+            <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
 
-    </div>
+        </div>
+    </drawer-tabs-container>
 </template>
 <style lang="scss" scoped>
     .project-task-lists {
@@ -63,8 +65,10 @@
 
 <script>
 
+    import DrawerTabsContainer from "../../DrawerTabsContainer";
     export default {
         name: 'ProjectTaskLists',
+        components: {DrawerTabsContainer},
         props: {
             projectid: {
                 default: 0

+ 146 - 0
resources/assets/js/main/components/project/task/logs.vue

@@ -0,0 +1,146 @@
+<template>
+    <drawer-tabs-container>
+        <div class="project-task-logs">
+            <ul class="logs-activity">
+                <li v-for="(item, date) in lists">
+                    <div class="logs-date">{{date}}</div>
+                    <div class="logs-section">
+                        <Timeline>
+                            <TimelineItem color="green">
+                                <span>发布里程碑版本</span>
+                            </TimelineItem>
+                            <TimelineItem>发布1.0版本</TimelineItem>
+                            <TimelineItem>发布2.0版本</TimelineItem>
+                            <TimelineItem>发布3.0版本</TimelineItem>
+                        </Timeline>
+                    </div>
+                </li>
+            </ul>
+        </div>
+    </drawer-tabs-container>
+</template>
+<style lang="scss" scoped>
+    .project-task-logs {
+        margin: 0 12px;
+        .logs-activity {
+            position: relative;
+            word-break: break-all;
+            padding: 12px 12px;
+            > li {
+                padding-top: 22px;
+                &:first-child {
+                    padding-top: 0;
+                }
+                .logs-date {
+                    color: rgba(0, 0, 0, .36);
+                    padding-bottom: 14px;
+                }
+            }
+        }
+    }
+</style>
+
+<script>
+
+    import DrawerTabsContainer from "../../DrawerTabsContainer";
+    export default {
+        name: 'ProjectTaskLogs',
+        components: {DrawerTabsContainer},
+        props: {
+            projectid: {
+                default: 0
+            },
+            taskid: {
+                default: 0
+            },
+            canload: {
+                type: Boolean,
+                default: true
+            },
+        },
+        data() {
+            return {
+                loadYet: false,
+
+                loadIng: 0,
+
+                lists: {},
+                hasMorePages: false,
+            }
+        },
+
+        created() {
+
+        },
+
+        mounted() {
+            if (this.canload) {
+                this.loadYet = true;
+                this.getLists(true);
+            }
+        },
+
+        watch: {
+            projectid() {
+                if (this.loadYet) {
+                    this.getLists(true);
+                }
+            },
+            taskid() {
+                if (this.loadYet) {
+                    this.getLists(true);
+                }
+            },
+            canload(val) {
+                if (val && !this.loadYet) {
+                    this.loadYet = true;
+                    this.getLists(true);
+                }
+            }
+        },
+
+        methods: {
+            getLists(resetLoad) {
+                if (resetLoad === true) {
+                    this.listPage = 1;
+                }
+                if (this.projectid == 0) {
+                    this.lists = {};
+                    this.hasMorePages = false;
+                    return;
+                }
+                this.loadIng++;
+                $A.aAjax({
+                    url: 'project/log/lists',
+                    data: {
+                        projectid: this.projectid,
+                        taskid: this.taskid,
+                        pagesize: 100,
+                    },
+                    complete: () => {
+                        this.loadIng--;
+                    },
+                    success: (res) => {
+                        if (res.ret === 1) {
+                            let timeData,
+                                ymd;
+                            res.data.lists.forEach((item) => {
+                                timeData = item.timeData;
+                                ymd = timeData.ymd;
+                                if (typeof this.lists[ymd] !== "object") {
+                                    this.$set(this.lists, ymd, []);
+                                }
+                                this.lists[ymd].push(item);
+                            });
+                            console.log(this.lists);
+                            this.hasMorePages = res.data.hasMorePages;
+                        } else {
+                            this.lists = [];
+                            this.hasMorePages = false;
+                        }
+                    }
+                });
+            },
+        }
+    }
+</script>

+ 12 - 8
resources/assets/js/main/components/project/users.vue

@@ -1,12 +1,14 @@
 <template>
-    <div class="project-complete">
-        <!-- 按钮 -->
-        <Button :loading="loadIng > 0" type="primary" icon="md-add" @click="addUser">添加成员</Button>
-        <!-- 列表 -->
-        <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
-        <!-- 分页 -->
-        <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
-    </div>
+    <drawer-tabs-container>
+        <div class="project-complete">
+            <!-- 按钮 -->
+            <Button :loading="loadIng > 0" type="primary" icon="md-add" @click="addUser">添加成员</Button>
+            <!-- 列表 -->
+            <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
+            <!-- 分页 -->
+            <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
+        </div>
+    </drawer-tabs-container>
 </template>
 
 <style lang="scss" scoped>
@@ -18,8 +20,10 @@
     }
 </style>
 <script>
+    import DrawerTabsContainer from "../DrawerTabsContainer";
     export default {
         name: 'ProjectUsers',
+        components: {DrawerTabsContainer},
         props: {
             projectid: {
                 default: 0

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

@@ -82,6 +82,7 @@
                     <project-task-files :canload="projectDrawerShow && projectDrawerTab == 'files'" :projectid="projectid"></project-task-files>
                 </TabPane>
                 <TabPane :label="$L('项目动态')" name="logs">
+                    <project-task-logs :canload="projectDrawerShow && projectDrawerTab == 'logs'" :projectid="projectid"></project-task-logs>
                 </TabPane>
                 <TabPane :label="$L('项目设置')" name="setting">
                 </TabPane>
@@ -315,9 +316,12 @@
     import ProjectAddTask from "../components/project/task/add";
     import ProjectTaskLists from "../components/project/task/lists";
     import ProjectTaskFiles from "../components/project/task/files";
+    import ProjectTaskLogs from "../components/project/task/logs";
 
     export default {
-        components: {ProjectTaskFiles, ProjectTaskLists, ProjectAddTask, draggable, WLoading, WContent, WHeader},
+        components: {
+            ProjectTaskLogs,
+            ProjectTaskFiles, ProjectTaskLists, ProjectAddTask, draggable, WLoading, WContent, WHeader},
         data () {
             return {
                 loadIng: 0,