From a49dae2b2f8e9ee33abbca73ce717ad3d20d7eb0 Mon Sep 17 00:00:00 2001 From: zhaorulin <zhaorulin@singsingenglish.com> Date: Mon, 12 Aug 2019 19:05:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=87=E7=AD=BE=E9=A1=B5=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=90=9C=E7=B4=A2=E3=80=81=E9=AB=98=E7=BA=A7=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E3=80=81=E5=AF=BC=E5=87=BA=E3=80=81=E6=9D=83=E9=99=90?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=209=E4=B8=AA=E6=9C=9F=E6=95=B0=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=A1=86=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 21 + .../conversionList/channelConversionList.vue | 7 +- .../channelGoodsConversionList.vue | 8 +- .../conversionList/channelTransList.vue | 7 +- .../marketEnrollmentConversionList.vue | 23 +- .../conversionList/periodsConversionList.vue | 34 +- .../conversionList/sourceConversionList.vue | 10 +- .../conversionList/squadConversionList.vue | 10 +- .../conversionList/teacherConversionList.vue | 10 +- .../teacherPeriodsConversionList.vue | 7 +- src/components/exchange/add.vue | 2 +- src/components/framework/index.vue | 6 +- src/components/lesson/index.vue | 26 +- src/components/marketStatistics/index.vue | 3 +- src/components/periods/dialog.vue | 10 +- src/components/periods/index.vue | 4 +- src/components/periods/newDialog.vue | 33 +- src/components/system/role.vue | 2 +- src/components/system/staff.vue | 4 +- src/components/system/staffRecord.vue | 2 +- src/components/system/tag.vue | 417 ++++++------------ src/components/user/index.vue | 108 ++--- src/components/userDetail/index.vue | 34 +- src/service/api.js | 8 + 24 files changed, 320 insertions(+), 476 deletions(-) diff --git a/src/App.vue b/src/App.vue index fdb56a3f..31663e1e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -198,6 +198,12 @@ html, body { &.width-320 { max-width: 320px; } + &.width-360 { + max-width: 360px; + } + &.width-400 { + max-width: 400px; + } &.width-480 { max-width: 480px; } @@ -232,4 +238,19 @@ html, body { } } +.el-table { + .f-c > div { + display: flex !important; + flex-flow: row; + justify-content: flex-start; + align-items: center; + } + .avatar { + width: 50px; + margin-right: 8px; + border-radius: 50%; + height: 50px; + } +} + </style> diff --git a/src/components/conversionList/channelConversionList.vue b/src/components/conversionList/channelConversionList.vue index cbc8a683..36655b57 100644 --- a/src/components/conversionList/channelConversionList.vue +++ b/src/components/conversionList/channelConversionList.vue @@ -140,8 +140,7 @@ export default { goods_id: null, teacherList: [], goodsList: [], - periodList: [], - total: 0, + //periodList: [], today: { text: "今天", onClick: () => { @@ -343,12 +342,12 @@ export default { this.limit = val; this.getChannelTransList(); }, - getPeriodsOtherList() { + /*getPeriodsOtherList() { let json = { limit: 1000, page: 1,max_watch_num:20 }; getPeriodsOtherListApi(json).then(res => { this.periodList = res.list; }); - }, + },*/ getChannelTransList() { let json = { limit: this.limit, diff --git a/src/components/conversionList/channelGoodsConversionList.vue b/src/components/conversionList/channelGoodsConversionList.vue index 89b73372..4e900f2e 100644 --- a/src/components/conversionList/channelGoodsConversionList.vue +++ b/src/components/conversionList/channelGoodsConversionList.vue @@ -157,8 +157,7 @@ export default { list: [], goods_id: null, teacherList: [], - periodList: [], - total: 0, + //periodList: [], today: { text: "今天", onClick: () => { @@ -204,7 +203,6 @@ export default { ]; } }, - propertyList: [], spanArr: [], contentSpanArr: [], searchFrom: { @@ -391,12 +389,12 @@ export default { this.limit = val; this.getChannelTransList(); }, - getPeriodsOtherList() { + /*getPeriodsOtherList() { let json = { limit: 1000,page:1,max_watch_num:20 }; getPeriodsOtherListApi(json).then(res => { this.periodList = res.list; }); - }, + },*/ getChannelTransList() { let json = { limit: this.limit, diff --git a/src/components/conversionList/channelTransList.vue b/src/components/conversionList/channelTransList.vue index 4c6dfbe1..8405f7ad 100644 --- a/src/components/conversionList/channelTransList.vue +++ b/src/components/conversionList/channelTransList.vue @@ -65,13 +65,15 @@ </el-form-item> <el-form-item label="期数åç§°" prop="periods_title"> <el-select + :popper-class="'refresh-select-multi width-480'" + style="width: 480px" placeholder="请选择" v-model="searchFrom.periods_id" @change="onPeriodChange" multiple clearable filterable> - <el-option v-for="item in periodList" :key="item.id" :label="item.title" :value="item.id"></el-option> + <el-option v-for="item in periodList" :key="item.id" :label="item.label" :value="item.id"></el-option> </el-select> </el-form-item> <el-form-item label="组ID"> @@ -443,6 +445,9 @@ export default { getPeriodsOtherList() { let json = { limit: 1000,page:1,max_watch_num:20 }; getPeriodsOtherListApi(json).then(res => { + res.list.forEach(val=>{ + val.label = `ã€${val.goods_id}】${val.title}${val.watch_num}课时(${val.start_at.slice(5).replace('-', '')})-d${val.has_watch_num}` + }) this.periodList = res.list; }); }, diff --git a/src/components/conversionList/marketEnrollmentConversionList.vue b/src/components/conversionList/marketEnrollmentConversionList.vue index 5e9a8187..f24766d2 100644 --- a/src/components/conversionList/marketEnrollmentConversionList.vue +++ b/src/components/conversionList/marketEnrollmentConversionList.vue @@ -36,13 +36,15 @@ </el-form-item> <el-form-item label="期数åç§°" prop="periods_title"> <el-select + :popper-class="'refresh-select-multi width-480'" + style="width: 480px" placeholder="请选择" v-model="searchFrom.periods_id" @change="onPeriodChange" multiple clearable filterable> - <el-option v-for="item in periodList" :key="item.id" :label="item.title" :value="item.id"></el-option> + <el-option v-for="item in periodList" :key="item.id" :label="item.label" :value="item.id"></el-option> </el-select> </el-form-item> <el-form-item> @@ -58,12 +60,11 @@ :header-cell-style="{background:'#5f5f5f',color:'#fff'}" :data="list" size="mini" - height="calc(100vh - 210px)" :row-class-name="tableRowClassName" :span-method="arraySpanMethod" > - <el-table-column prop="periods_title" align="center" min-width="80" fixed label="期数åç§°"> - </el-table-column> + <!--height="calc(100vh - 210px)"--> + <el-table-column prop="periods_title" align="center" min-width="80" fixed label="期数åç§°"></el-table-column> <el-table-column prop="is_other" min-width="160" align="left" fixed label="æ¸ é“ä¿¡æ¯"> <template slot-scope="scope"> æ¥æºï¼š{{scope.row.is_other==0?"内部":"外部"}}<br> @@ -109,7 +110,6 @@ export default { "wait_join_num", "other_wait_join_num" ], - periodList:[], searchFrom: { payTime: [], start_at: "", @@ -196,6 +196,9 @@ export default { getPeriodsOtherList() { let json = { limit: 1000,page:1,max_watch_num:20 }; getPeriodsOtherListApi(json).then(res => { + res.list.forEach(val=>{ + val.label = `ã€${val.goods_id}】${val.title}${val.watch_num}课时(${val.start_at.slice(5).replace('-', '')})-d${val.has_watch_num}` + }) this.periodList = res.list; }); }, @@ -292,10 +295,12 @@ export default { <style scoped lang="less"> .searchFrom{ - position: absolute; - top: 20px; + /*position: absolute; + top: 20px;*/ +} +.el-table{ + /*margin-top: 130px;*/ } -.el-table{margin-top: 130px;} /deep/.el-table--enable-row-hover .el-table__body tr:hover > td { background-color: #fff; } @@ -306,6 +311,6 @@ export default { max-width: 100% !important; } .el-main .content .router-block .child-view { - height: 100vh; + /*height: 100vh;*/ } </style> diff --git a/src/components/conversionList/periodsConversionList.vue b/src/components/conversionList/periodsConversionList.vue index 6171c99c..e8dabe19 100644 --- a/src/components/conversionList/periodsConversionList.vue +++ b/src/components/conversionList/periodsConversionList.vue @@ -11,8 +11,7 @@ end-placeholder="ç»“æŸæ—¥æœŸ" :picker-options="{shortcuts:[today,yesterday,last7Day,last30Day]}" :default-time="['00:00:00','23:59:59']" - @change="getChannelTransList" - ></el-date-picker> + @change="getChannelTransList"></el-date-picker> </el-form-item> <el-form-item label="开结课日期"> <el-date-picker @@ -24,8 +23,7 @@ end-placeholder="ç»“æŸæ—¥æœŸ" :picker-options="{shortcuts:[classToday,classYesterday,classLast7Day,classLast30Day]}" :default-time="['00:00:00','23:59:59']" - @change="getChannelTransList" - ></el-date-picker> + @change="getChannelTransList"></el-date-picker> </el-form-item> <el-form-item label="æ¸ é“code"> <el-input v-model="searchFrom.invite_type" style="width: 110px"></el-input> @@ -38,25 +36,23 @@ clearable placeholder="请选择" style="width: 150px" - @change="selectChange" - > + @change="selectChange"> <el-option v-for="(data,index) in watchList" :key="index" :label="data.title" - :value="data.id" - ></el-option> + :value="data.id"></el-option> </el-select> </el-form-item> <el-form-item label="期数åç§°" prop="periods_title"> <el-select + style="width: 480px" placeholder="请选择" v-model="searchFrom.periods_id" @change="onPeriodChange" multiple - filterable - > - <el-option v-for="item in periodList" :key="item.id" :label="item.title" :value="item.id"></el-option> + filterable> + <el-option v-for="item in periodList" :key="item.id" :label="item.label" :value="item.id"></el-option> </el-select> </el-form-item> <el-form-item label="组ID"> @@ -69,15 +65,13 @@ placeholder="请选择" @change="changeTeacher" clearable - style="width: 100px" - > + style="width: 100px"> <el-option label="æš‚ä¸åˆ†é…" value="0"></el-option> <el-option v-for="(data,index) in teacherList" :key="index" :label="data.name" - :value="data.id" - ></el-option> + :value="data.id"></el-option> </el-select> </el-form-item> <el-form-item> @@ -92,15 +86,13 @@ :data="list" @sort-change="sortMethod" :style="{width: width+'px'}" - fixed - > + fixed> <el-table-column prop="periods_title" label="期数åç§°" ></el-table-column> <el-table-column prop="duration_over_at" label="开课看课时间" style="font-size:12px;" - width="200" - > + width="200"> <template slot-scope="scope"> 开课日期:{{scope.row.start_at}} <br> @@ -164,7 +156,6 @@ export default { teacherList: [], goodsList: [], periodList: [], - total: 0, today: { text: "今天", onClick: () => { @@ -453,6 +444,9 @@ export default { getPeriodsOtherList() { let json = { limit: 1000,page:1,max_watch_num:20 }; getPeriodsOtherListApi(json).then(res => { + res.list.forEach(val=>{ + val.label = `ã€${val.goods_id}】${val.title}${val.watch_num}课时(${val.start_at.slice(5).replace('-', '')})-d${val.has_watch_num}` + }) this.periodList = res.list; console.log(320) }); diff --git a/src/components/conversionList/sourceConversionList.vue b/src/components/conversionList/sourceConversionList.vue index 8ec49ead..040504b7 100644 --- a/src/components/conversionList/sourceConversionList.vue +++ b/src/components/conversionList/sourceConversionList.vue @@ -35,13 +35,13 @@ </el-form-item> <el-form-item label="期数åç§°" prop="periods_title"> <el-select + style="width: 480px" placeholder="请选择" v-model="searchFrom.periods_id" @change="onPeriodChange" multiple - filterable - > - <el-option v-for="item in periodList" :key="item.id" :label="item.title" :value="item.id"></el-option> + filterable> + <el-option v-for="item in periodList" :key="item.id" :label="item.label" :value="item.id"></el-option> </el-select> </el-form-item> <el-form-item label="转化å‰å•†å“"> @@ -193,7 +193,6 @@ export default { teacherList: [], goodsList: [], periodList: [], - total: 0, today: { text: "今天", onClick: () => { @@ -473,6 +472,9 @@ export default { getPeriodsOtherList() { let json = { limit: 1000,page:1,max_watch_num:20 }; getPeriodsOtherListApi(json).then(res => { + res.list.forEach(val=>{ + val.label = `ã€${val.goods_id}】${val.title}${val.watch_num}课时(${val.start_at.slice(5).replace('-', '')})-d${val.has_watch_num}` + }) this.periodList = res.list; console.log(320) }); diff --git a/src/components/conversionList/squadConversionList.vue b/src/components/conversionList/squadConversionList.vue index d6d3e611..d4977327 100644 --- a/src/components/conversionList/squadConversionList.vue +++ b/src/components/conversionList/squadConversionList.vue @@ -37,13 +37,13 @@ </el-form-item> <el-form-item label="期数åç§°" prop="periods_title"> <el-select + style="width: 480px" placeholder="请选择" v-model="searchFrom.periods_id" @change="onPeriodChange" multiple - filterable - > - <el-option v-for="item in periodList" :key="item.id" :label="item.title" :value="item.id"></el-option> + filterable> + <el-option v-for="item in periodList" :key="item.id" :label="item.label" :value="item.id"></el-option> </el-select> </el-form-item> <el-form-item> @@ -117,7 +117,6 @@ export default { teacherList: [], goodsList: [], periodList: [], - total: 0, today: { text: "今天", onClick: () => { @@ -355,6 +354,9 @@ export default { getPeriodsOtherList() { let json = { limit: 1000,page:1,max_watch_num:20 }; getPeriodsOtherListApi(json).then(res => { + res.list.forEach(val=>{ + val.label = `ã€${val.goods_id}】${val.title}${val.watch_num}课时(${val.start_at.slice(5).replace('-', '')})-d${val.has_watch_num}` + }) this.periodList = res.list; }); }, diff --git a/src/components/conversionList/teacherConversionList.vue b/src/components/conversionList/teacherConversionList.vue index e980a153..5f89c942 100644 --- a/src/components/conversionList/teacherConversionList.vue +++ b/src/components/conversionList/teacherConversionList.vue @@ -29,8 +29,7 @@ clearable placeholder="请选择" style="width: 150px" - @change="selectChange" - > + @change="selectChange"> <el-option v-for="(data,index) in watchList" :key="index" @@ -41,12 +40,13 @@ </el-form-item> <el-form-item label="期数åç§°" prop="periods_title"> <el-select + style="width: 480px" placeholder="请选择" v-model="searchFrom.periods_id" @change="onPeriodChange" multiple filterable> - <el-option v-for="item in periodList" :key="item.id" :label="item.title" :value="item.id"></el-option> + <el-option v-for="item in periodList" :key="item.id" :label="item.label" :value="item.id"></el-option> </el-select> </el-form-item> <el-form-item> @@ -121,7 +121,6 @@ export default { teacherList: [], goodsList: [], periodList: [], - total: 0, today: { text: "今天", onClick: () => { @@ -358,6 +357,9 @@ export default { getPeriodsOtherList() { let json = { limit: 1000,page:1,max_watch_num:20 }; getPeriodsOtherListApi(json).then(res => { + res.list.forEach(val=>{ + val.label = `ã€${val.goods_id}】${val.title}${val.watch_num}课时(${val.start_at.slice(5).replace('-', '')})-d${val.has_watch_num}` + }) this.periodList = res.list; }); }, diff --git a/src/components/conversionList/teacherPeriodsConversionList.vue b/src/components/conversionList/teacherPeriodsConversionList.vue index b6e69544..115e4521 100644 --- a/src/components/conversionList/teacherPeriodsConversionList.vue +++ b/src/components/conversionList/teacherPeriodsConversionList.vue @@ -35,12 +35,13 @@ </el-form-item> <el-form-item label="期数åç§°" prop="periods_title"> <el-select + style="width: 480px" placeholder="请选择" v-model="searchFrom.periods_id" @change="onPeriodChange" multiple filterable> - <el-option v-for="item in periodList" :key="item.id" :label="item.title" :value="item.id"></el-option> + <el-option v-for="item in periodList" :key="item.id" :label="item.label" :value="item.id"></el-option> </el-select> </el-form-item> <el-form-item label="è€å¸ˆ"> @@ -164,7 +165,6 @@ export default { teacherList: [], goodsList: [], periodList: [], - total: 0, today: { text: "今天", onClick: () => { @@ -456,6 +456,9 @@ export default { getPeriodsOtherList() { let json = { limit: 1000,page:1,max_watch_num:20 }; getPeriodsOtherListApi(json).then(res => { + res.list.forEach(val=>{ + val.label = `ã€${val.goods_id}】${val.title}${val.watch_num}课时(${val.start_at.slice(5).replace('-', '')})-d${val.has_watch_num}` + }) this.periodList = res.list; }); }, diff --git a/src/components/exchange/add.vue b/src/components/exchange/add.vue index 20fe8788..6469717c 100644 --- a/src/components/exchange/add.vue +++ b/src/components/exchange/add.vue @@ -14,7 +14,7 @@ <el-form-item label="活动方案"> <el-select v-model="newIntegral.source" - :prop-class="'refresh-select-multi width-480'" + :popper-class="'refresh-select-multi width-480'" style="width: 480px" placeholder="请选择" filterable> <el-option v-for="(data,index) in classSource" diff --git a/src/components/framework/index.vue b/src/components/framework/index.vue index 0fba9d8d..1ace653d 100644 --- a/src/components/framework/index.vue +++ b/src/components/framework/index.vue @@ -54,6 +54,8 @@ .menu-block{ float: left; height: 100%; + background-color: #333333; + /*height: calc(100vh - 60px);*/ /*overflow: auto; position: fixed; left: 0; @@ -69,9 +71,9 @@ height: 100%; position: relative; .child-view{ - height: calc(100% - 40px); + /*height: calc(100% - 40px); width: 100%; - overflow-y: auto; + overflow-y: auto;*/ } } } diff --git a/src/components/lesson/index.vue b/src/components/lesson/index.vue index 02e5aa8a..e342626e 100644 --- a/src/components/lesson/index.vue +++ b/src/components/lesson/index.vue @@ -1,24 +1,22 @@ <template> <div class="user"> <el-form ref="searchFrom" :model="searchFrom" label-width="100px" inline="" class="search-form"> - <el-form-item label="è¯¾ç¨‹æ ‡é¢˜"> - <el-input v-model="searchFrom.title"></el-input> - </el-form-item> - <el-form-item label=""> - <div class="search-btn-block"> - <el-button type="primary" plain @click="getUser" icon="el-icon-search">æœç´¢</el-button> - <el-button type="success" plain @click="add" v-if="!$store.state.readonly" icon="el-icon-plus">新增课程</el-button> - </div> - </el-form-item> + <el-form-item label="è¯¾ç¨‹æ ‡é¢˜"> + <el-input v-model="searchFrom.title"></el-input> + </el-form-item> + <el-form-item label=""> + <div class="search-btn-block"> + <el-button type="primary" plain @click="getUser" icon="el-icon-search">æœç´¢</el-button> + <el-button type="success" plain @click="add" v-if="!$store.state.readonly" icon="el-icon-plus">新增课程</el-button> + </div> + </el-form-item> </el-form> <el-tabs v-model="searchFrom.type" type="card" style="background: white;padding-top: 10px" @tab-click="getUser"> <el-tab-pane label="全部" name="-1"></el-tab-pane> <el-tab-pane label="日课" name="1"></el-tab-pane> <el-tab-pane label="月课" name="0"></el-tab-pane> </el-tabs> - <el-table - :data="userList" - style="width: 100%"> + <el-table :data="userList"> <el-table-column prop="title" label="课程å"> @@ -181,8 +179,8 @@ margin: 0; } .user{ - height: 100%; - overflow: auto; + /*height: 100%;*/ + /*overflow: auto;*/ padding: 20px 0; .btn-content{ text-align: center; diff --git a/src/components/marketStatistics/index.vue b/src/components/marketStatistics/index.vue index 0432f685..c078f512 100644 --- a/src/components/marketStatistics/index.vue +++ b/src/components/marketStatistics/index.vue @@ -8,8 +8,7 @@ height="calc(100vh - 60px)" size="mini" :row-class-name="tableRowClassName" - :span-method="arraySpanMethod" - > + :span-method="arraySpanMethod"> <el-table-column min-width="180" prop="wait_join_num" align="left" fixed="left" label="期数总状况"> <template slot-scope="scope"> 期数å称:{{scope.row.title}} diff --git a/src/components/periods/dialog.vue b/src/components/periods/dialog.vue index 389488b8..2b1983a1 100644 --- a/src/components/periods/dialog.vue +++ b/src/components/periods/dialog.vue @@ -1,19 +1,13 @@ <template> <div> - <el-dialog - :title="dialogObj.title" - :visible.sync="dialogObj.show" - > + <el-dialog :title="dialogObj.title" :visible.sync="dialogObj.show"> <el-table :data="goodList" style="width: 100%" row-key="id" highlight-current-row @current-change="handleCurrentChange"> - <el-table-column - prop="id" - label="商å“ID"> - </el-table-column> + <el-table-column prop="id" label="商å“ID"></el-table-column> <el-table-column prop="name" label="åç§°"> diff --git a/src/components/periods/index.vue b/src/components/periods/index.vue index fbe36ccf..79ef5eb7 100644 --- a/src/components/periods/index.vue +++ b/src/components/periods/index.vue @@ -6,7 +6,9 @@ <el-input v-model="title" placeholder="请输入内容" style="width: 150px" clearable></el-input> </el-form-item> <el-form-item label="商å“åç§°"> - <el-select v-model="goodsId" filterable placeholder="请选择" style="width: 150px" @change="onSearch" clearable> + <el-select + :popper-class="'refresh-select-multi width-400'" style="width: 400px" + v-model="goodsId" filterable placeholder="请选择" @change="onSearch" clearable> <el-option v-for="(data,index) in goodList" :key="index" diff --git a/src/components/periods/newDialog.vue b/src/components/periods/newDialog.vue index 33a74026..c4850609 100644 --- a/src/components/periods/newDialog.vue +++ b/src/components/periods/newDialog.vue @@ -2,26 +2,23 @@ <div> <el-dialog :title="dialogObj.title" - center - append-to-body + center append-to-body :visible.sync="show" width="800px"> <div v-loading="loading"> <el-form ref="form" :model="form" label-width="120px" :rules="rules"> - <el-row> - <el-col :span="10"> - <el-form-item label="商å“åç§°" prop="goods_id"> - <el-select v-model="form.goods_id" placeholder="请选择" @change="onOptionChange" :disabled="form.id ? true : false"> - <el-option - v-for="(data,index) in goodList" - :key="index" - :label="data | filterGoods" - :value="data.id"> - </el-option> - </el-select> - </el-form-item> - </el-col> - </el-row> + <el-form-item label="商å“åç§°" prop="goods_id"> + <el-select + :popper-class="'refresh-select-multi width-480'" style="width: 480px" + v-model="form.goods_id" placeholder="请选择" @change="onOptionChange" :disabled="form.id ? true : false"> + <el-option + v-for="(data,index) in goodList" + :key="index" + :label="data | filterGoods" + :value="data.id"> + </el-option> + </el-select> + </el-form-item> <el-form-item label="期数åç§°" prop="title"> <el-input v-model="form.title"></el-input> </el-form-item> @@ -83,10 +80,10 @@ </el-select> </el-form-item> </el-form> - <span slot="footer" class="dialog-footer"> + </div> + <div slot="footer" class="dialog-footer"> <el-button @click="show = false">å– æ¶ˆ</el-button> <el-button type="primary" @click="sub">ç¡® 定</el-button> - </span> </div> </el-dialog> </div> diff --git a/src/components/system/role.vue b/src/components/system/role.vue index 8b519a70..d946affc 100644 --- a/src/components/system/role.vue +++ b/src/components/system/role.vue @@ -96,7 +96,7 @@ limit: 10, roleList:[], exportMenuList:[ - '2-3','5-10','5-2','5-1','5-3','5-8','5-9','3-1','7-9','6-3' + '2-3','5-10','5-2','5-1','5-3','5-8','5-9','3-1','7-9','6-3', '10-8' ], dialog:{ title:'新增角色', diff --git a/src/components/system/staff.vue b/src/components/system/staff.vue index 9cfc9557..8dc3ec99 100644 --- a/src/components/system/staff.vue +++ b/src/components/system/staff.vue @@ -81,7 +81,7 @@ </el-table-column> </el-table> <page :total="total" :limit="limit" @pageChange="onPageChange" @sizeChange="onSizeChange"/> - <el-dialog :title="dialog.title" :visible.sync="dialog.show" width="500px"> + <el-dialog :title="dialog.title" :visible.sync="dialog.show" width="800px"> <el-form ref="dialogForm" :rules="dialog.form.rules" :model="dialog.form" label-width="100px"> <el-form-item label="真实姓å:" prop="name"> @@ -334,7 +334,7 @@ } .user { - height: 100%; + /*height: 100%;*/ overflow: auto; padding: 20px 0; diff --git a/src/components/system/staffRecord.vue b/src/components/system/staffRecord.vue index 9e690806..f9018327 100644 --- a/src/components/system/staffRecord.vue +++ b/src/components/system/staffRecord.vue @@ -151,7 +151,7 @@ <style lang="less" scoped> .user { - height: 100%; + /*height: 100%;*/ overflow: auto; padding: 20px 0; diff --git a/src/components/system/tag.vue b/src/components/system/tag.vue index cc0d5ebd..22fc7dd1 100644 --- a/src/components/system/tag.vue +++ b/src/components/system/tag.vue @@ -4,15 +4,17 @@ <div class="section-search search-single"> <el-form ref="searchFrom" :model="searchFrom" label-width="80px" inline> <el-form-item> - <el-cascader + <!--<el-cascader style="width: 280px" placeholder="é€‰æ‹©æ ‡ç¾" - :props="searchProps" clearable></el-cascader> + :props="searchProps" clearable></el-cascader>--> + + <el-input placeholder="è¾“å…¥æ ‡ç¾åæœç´¢" v-model="filterText"></el-input> </el-form-item> <el-form-item> <div class="search-btn-wrapper"> - <el-button @click="onSearch" type="primary" plain>æœç´¢</el-button> - <el-button @click="onSearch" type="warning" plain>高级æœç´¢</el-button> + <!--<el-button @click="onSearch" type="primary" plain>æœç´¢</el-button>--> + <el-button @click="dialogToggle" type="warning" plain>高级æœç´¢</el-button> <!--<el-button v-if="!$store.state.readonly" @click="onAdd" type="success" plain>æ–°å¢žæ ‡ç¾</el-button>--> </div> </el-form-item> @@ -21,275 +23,81 @@ <div class="tag-tree"> <el-tree - :data="tableData" - node-key="id" + :data="treeData" + node-key="id" ref="tagTree" :props="tagProps" :indent="40" @node-expand="tagExpand" @node-collapse="tagCollapse" + :filter-node-method="filterNode" :default-expanded-keys="tagExpanded" - :expand-on-click-node="false"> + :expand-on-click-node="true"> <div class="custom-tree-node" slot-scope="{ node, data }"> <el-tag class="tag-tree-item" effect="plain" size="medium">{{node.label}}</el-tag> <div style="display: flex"> - <el-link type="success" size="mini" plain @click.stop="onAdd(node)">æ–°å¢žåæ ‡ç¾ ({{node.level}}级)</el-link> - <el-link v-if="node.level != 1" type="warning" size="mini" plain @click.stop="onEdit(node, data, el)">编辑</el-link> + <!--<span>{{node.data.cover}}</span>--> + <el-popover + placement="right-start" + title="æ ‡ç¾å¤‡æ³¨" + width="200" + trigger="hover" + :disabled="!node.data.cover" + :content="node.data.cover ? node.data.cover : 'æš‚æ— å¤‡æ³¨'"> + <el-link @click.stop class="cover-link" slot="reference" :disabled="!node.data.cover">备注</el-link> + </el-popover> + <el-link v-if="node.level < 4 && !$store.state.readonly" type="success" size="mini" plain @click.stop="onAdd(node)">æ–°å¢žåæ ‡ç¾ ({{node.level}}级)</el-link> + <el-link v-if="node.level != 1 && !$store.state.readonly" type="warning" size="mini" plain @click.stop="onEdit(node, data)">编辑</el-link> </div> </div> </el-tree> </div> - <el-dialog :title="dialog.title" :visible.sync="dialog.show" width="500px"> - - <el-form ref="dialogForm" :rules="dialog.form.rules" :model="dialog.form" label-width="100px"> - - <el-form-item label="ID:" prop="id" style="display: none;"> - <el-input v-model="dialog.form.id" maxlength="10" type="text"></el-input> - </el-form-item> - <el-form-item label="PID:" prop="pid" style="display: none;"> - <el-input v-model="dialog.form.pid" maxlength="10" type="text"></el-input> - </el-form-item> - - <el-form-item label="æ ‡ç¾å称:" prop="name"> - <el-input v-model="dialog.form.name" maxlength="10" type="text"></el-input> - </el-form-item> - <el-form-item label="æ ‡ç¾å¤‡æ³¨ï¼š" prop="cover"> - <el-input v-model="dialog.form.cover" maxlength="50" type="textarea" :rows="3"></el-input> - </el-form-item> - </el-form> - - <span slot="footer" class="dialog-footer"> + <el-dialog :title="dialog.title" :visible.sync="dialog.show" width="800px" title="高级æœç´¢"> + + <div style="display: flex;margin-bottom: 20px;"> + <el-button style="margin-right: 20px; width: 70px;" type="primary" v-if="!$store.state.readonly && $store.state.export" plain :disabled="!tableData.length" @click="exportExcel">导出</el-button> + <el-cascader + style="width: calc(100% - 90px)" placeholder="é€‰æ‹©æ ‡ç¾" clearable @change="conditionsChange" + :options="treeDataOrigin" :props="{ value: 'id', label: 'name', multiple: true, checkStrictly: true }"></el-cascader> + </div> + + <el-table :data="tableData" border> + <el-table-column className="f-c" label="用户"> + <template slot-scope="scope"> + <img class="avatar" :src="scope.row.avatar">{{scope.row.nickname}}<br>(ID:{{scope.row.user_id}}) + </template> + </el-table-column> + + <el-table-column prop="baby_name" label="å®å®åç§°"></el-table-column> + <el-table-column prop="birthday" label="å®å®ç”Ÿæ—¥"></el-table-column> + <el-table-column prop="sex" label="å®å®æ€§åˆ«" :formatter="sexFormatter"></el-table-column> + <el-table-column prop="mobile" label="手机å·ç "></el-table-column> + <!--<el-table-column label="æ“作" v-if="!$store.state.readonly" width="100"> + <template slot-scope="scope"> + <el-button size="mini" plain type="primary" @click="onEdit(scope.row)">编辑</el-button> + </template> + </el-table-column>--> + </el-table> + <page :total="total" :limit="limit" @pageChange="onPageChange" @sizeChange="onSizeChange"/> + + <!--<span slot="footer" class="dialog-footer"> <el-button @click="dialogToggle">å–æ¶ˆ</el-button> <el-button type="primary" @click="dialogSave">确定</el-button> - </span> + </span>--> </el-dialog> </div> </template> <script> - import {getTagApi, postTagApi, putTagApi} from "../../service/api"; - - let sid = 0, id = 1000; + import {getTagApi, postTagApi, putTagApi, getTagUserApi, exportExcelApi} from "../../service/api"; + import page from '../framework/page'; export default { name: "index", data() { return { - - options: [{ - value: 'zhinan', - label: '指å—', - children: [{ - value: 'shejiyuanze', - label: '设计原则', - children: [{ - value: 'yizhi', - label: '一致' - }, { - value: 'fankui', - label: 'å馈' - }, { - value: 'xiaolv', - label: '效率' - }, { - value: 'kekong', - label: '坿ާ' - }] - }, { - value: 'daohang', - label: '导航', - children: [{ - value: 'cexiangdaohang', - label: 'ä¾§å‘导航' - }, { - value: 'dingbudaohang', - label: '顶部导航' - }] - }] - }, { - value: 'zujian', - label: '组件', - children: [{ - value: 'basic', - label: 'Basic', - children: [{ - value: 'layout', - label: 'Layout 布局' - }, { - value: 'color', - label: 'Color 色彩' - }, { - value: 'typography', - label: 'Typography å—体' - }, { - value: 'icon', - label: 'Icon å›¾æ ‡' - }, { - value: 'button', - label: 'Button 按钮' - }] - }, { - value: 'form', - label: 'Form', - children: [{ - value: 'radio', - label: 'Radio å•选框' - }, { - value: 'checkbox', - label: 'Checkbox 多选框' - }, { - value: 'input', - label: 'Input 输入框' - }, { - value: 'input-number', - label: 'InputNumber 计数器' - }, { - value: 'select', - label: 'Select 选择器' - }, { - value: 'cascader', - label: 'Cascader 级è”选择器' - }, { - value: 'switch', - label: 'Switch 开关' - }, { - value: 'slider', - label: 'Slider 滑å—' - }, { - value: 'time-picker', - label: 'TimePicker 时间选择器' - }, { - value: 'date-picker', - label: 'DatePicker 日期选择器' - }, { - value: 'datetime-picker', - label: 'DateTimePicker 日期时间选择器' - }, { - value: 'upload', - label: 'Upload ä¸Šä¼ ' - }, { - value: 'rate', - label: 'Rate 评分' - }, { - value: 'form', - label: 'Form 表å•' - }] - }, { - value: 'data', - label: 'Data', - children: [{ - value: 'table', - label: 'Table è¡¨æ ¼' - }, { - value: 'tag', - label: 'Tag æ ‡ç¾' - }, { - value: 'progress', - label: 'Progress 进度æ¡' - }, { - value: 'tree', - label: 'Tree æ ‘å½¢æŽ§ä»¶' - }, { - value: 'pagination', - label: 'Pagination 分页' - }, { - value: 'badge', - label: 'Badge æ ‡è®°' - }] - }, { - value: 'notice', - label: 'Notice', - children: [{ - value: 'alert', - label: 'Alert è¦å‘Š' - }, { - value: 'loading', - label: 'Loading åŠ è½½' - }, { - value: 'message', - label: 'Message æ¶ˆæ¯æç¤º' - }, { - value: 'message-box', - label: 'MessageBox 弹框' - }, { - value: 'notification', - label: 'Notification 通知' - }] - }, { - value: 'navigation', - label: 'Navigation', - children: [{ - value: 'menu', - label: 'NavMenu 导航èœå•' - }, { - value: 'tabs', - label: 'Tabs æ ‡ç¾é¡µ' - }, { - value: 'breadcrumb', - label: 'Breadcrumb é¢åŒ…屑' - }, { - value: 'dropdown', - label: 'Dropdown 下拉èœå•' - }, { - value: 'steps', - label: 'Steps æ¥éª¤æ¡' - }] - }, { - value: 'others', - label: 'Others', - children: [{ - value: 'dialog', - label: 'Dialog å¯¹è¯æ¡†' - }, { - value: 'tooltip', - label: 'Tooltip æ–‡å—æç¤º' - }, { - value: 'popover', - label: 'Popover 弹出框' - }, { - value: 'card', - label: 'Card å¡ç‰‡' - }, { - value: 'carousel', - label: 'Carousel 走马ç¯' - }, { - value: 'collapse', - label: 'Collapse 折å 颿¿' - }] - }] - }, { - value: 'ziyuan', - label: '资æº', - children: [{ - value: 'axure', - label: 'Axure Components' - }, { - value: 'sketch', - label: 'Sketch Templates' - }, { - value: 'jiaohu', - label: '组件交互文档' - }] - }], - - searchProps: { - lazy: true, - multiple: true, - checkStrictly: true, - lazyLoad (node, resolve) { - const { level } = node; - setTimeout(() => { - const nodes = Array.from({ length: level + 1 }) - .map(item => ({ - value: ++sid, - label: `选项${sid}`, - leaf: level >= 2 - })); - // 通过调用resolveå°†å节点数æ®è¿”回,通知组件数æ®åŠ è½½å®Œæˆ - resolve(nodes); - }, 1000); - } - }, + conditions: [], + filterText: '', tagProps: { children: 'children', @@ -311,6 +119,8 @@ }, startTime: [], tableData: [], + treeData: [], + treeDataOrigin: [], dialog: { title: '', show: false, @@ -331,17 +141,63 @@ loading: false } }, - //components: { page }, + components: { page }, + watch: { + filterText(val) { + this.$refs.tagTree.filter(val); + } + }, mounted() { this.getData() }, methods: { + sexFormatter(item){ + if(item.sex==0){ + return 'ä¿å¯†' + } + if(item.sex==1){ + return 'ç”·' + } + if(item.sex==2){ + return '女' + } + }, + + onPageChange(val) { + this.nowPage = val + this.getUserData() + }, + onSizeChange(val) { + this.limit = val; + this.nowPage = 1; + this.getUserData() + }, + + getUserData(){ + let json = { + conditions: JSON.stringify(this.conditions), + limit: this.limit, + page: this.nowPage + } + + getTagUserApi(json).then(res=>{ + this.tableData = res.list + }) + }, + + filterNode(value, data) { + if (!value) return true; + return data.name.indexOf(value) !== -1; + }, dialogToggle() { this.dialog.show = !this.dialog.show; if (!this.dialog.show) { this.dialogReset(); } + /*if (this.tableData.length && this.tableData[0] == 0) { // 未åˆå§‹åŒ– + this.getUserData(); + }*/ }, dialogReset(callback) { this.$nextTick(()=>{ @@ -384,52 +240,27 @@ }, tagExpand(data, node, el) { - console.log(node) + //console.log(node) if (node.expanded) { this.tagExpanded.push(node.data.id) } }, tagCollapse(data, node, el) { - console.log(node) + //console.log(node) if (node.expanded) { this.tagExpanded.splice(this.tagExpanded.findIndex(item => item == node.data.id), 1) } }, - /*append(data) { - console.log(data) - const newChild = { id: id++, label: 'testtest', children: [] }; - if (!data.children) { - this.$set(data, 'children', []); - } - data.children.push(newChild); - }, - - remove(node, data) { - console.log(node) - const parent = node.parent; - const children = parent.data.children || parent.data; - const index = children.findIndex(d => d.id === data.id); - children.splice(index, 1); - },*/ - getData() { - /*function addLable(data) { - data.forEach(val => { - val.label = val.name; - if (val.children && val.children.length) { - addLable(val.children) - } - }) - };*/ getTagApi().then(res => { - this.tableData = [{ + this.treeDataOrigin = res; + this.treeData = [{ children: res, cover: '', created_at: '', id: 0, - label: 'æ‰€æœ‰æ ‡ç¾', name: 'æ‰€æœ‰æ ‡ç¾', pid: 0, weight: 0, @@ -450,7 +281,7 @@ }); }, - onEdit(node,data,el) { + onEdit(node,data) { console.log(el) console.log(node) console.log(data) @@ -469,6 +300,28 @@ onSearch(){ this.getData(); }, + + conditionsChange(val){ + console.log(val); + let arr = []; + if(val.length) { + val.forEach(v => { + arr.push(v[v.length - 1]) + }) + this.conditions = arr; + this.getUserData(); + } else { + this.conditions = arr; + this.tableData = []; + } + }, + + exportExcel() { + let json = { + conditions: JSON.stringify(this.conditions), + } + exportExcelApi(`api/admin/advanced/search/export`, json, 'æ ‡ç¾ç”¨æˆ·åˆ—表'); + } } } </script> @@ -501,6 +354,12 @@ .el-link { font-size: 12px; + + &.cover-link { + margin-right: 10px; + line-height: 28px; + } + &:hover:after { bottom: 2px; } diff --git a/src/components/user/index.vue b/src/components/user/index.vue index 6471171a..59b7b47a 100644 --- a/src/components/user/index.vue +++ b/src/components/user/index.vue @@ -1,65 +1,48 @@ <template> <div class="user" v-loading="loading"> <el-form ref="searchFrom" :model="searchFrom" label-width="80px" inline> - <el-form-item label="ID"> - <el-input v-model="searchFrom.userId"></el-input> - </el-form-item> - <el-form-item label="昵称"> - <el-input v-model="searchFrom.nickName"></el-input> - </el-form-item> - <el-form-item label="电è¯"> - <el-input v-model="searchFrom.mobile"></el-input> - </el-form-item> - <el-form-item label="ç‰çº§"> - <el-input v-model="searchFrom.level"></el-input> - </el-form-item> - <el-form-item> - <div class="flexRow"> - <el-button type="primary" plain @click="getUser">æœç´¢</el-button> - <!--<el-button type="success" plain @click="syncUser">åŒæ¥æœ€æ–°æ•°æ®</el-button>--> - </div> - </el-form-item> + <el-form-item label="ID"> + <el-input v-model="searchFrom.userId"></el-input> + </el-form-item> + <el-form-item label="昵称"> + <el-input v-model="searchFrom.nickName"></el-input> + </el-form-item> + <el-form-item label="电è¯"> + <el-input v-model="searchFrom.mobile"></el-input> + </el-form-item> + <el-form-item label="ç‰çº§"> + <el-input v-model="searchFrom.level"></el-input> + </el-form-item> + <!--<el-form-item label="æ ‡ç¾"> + <el-cascader + style="width: 320px" placeholder="é€‰æ‹©æ ‡ç¾" clearable @change="tagChange" + :options="options" :props="{ multiple: true, checkStrictly: true }"></el-cascader> + </el-form-item>--> + <el-form-item> + <div class="flexRow"> + <el-button type="primary" plain @click="getUser">æœç´¢</el-button> + <!--<el-button type="success" plain @click="syncUser">åŒæ¥æœ€æ–°æ•°æ®</el-button>--> + </div> + </el-form-item> </el-form> <el-table :data="userList" style="width: 100%"> - <el-table-column - className="f-c" - label="用户"> + <el-table-column className="f-c" label="用户"> <template slot-scope="scope"> - <img class="avatar" :src="scope.row.avatar">{{scope.row.nickname}}(ID:{{scope.row.user_id}}) + <img class="avatar" :src="scope.row.avatar">{{scope.row.nickname}}<br>(ID:{{scope.row.user_id}}) </template> </el-table-column> - <el-table-column - prop="mobile" - label="手机å·"> - </el-table-column> - <el-table-column - prop="created_at" - label="注册时间" sortable> - </el-table-column> - <el-table-column - prop="last_login_at" - label="最åŽç™»å½•æ—¶é—´" sortable> - </el-table-column> - <el-table-column - prop="baby_name" - label="å®å®åç§°" > - </el-table-column> - <el-table-column - prop="birthday" - label="å®å®ç”Ÿæ—¥" > - </el-table-column> - <el-table-column - prop="sex" - label="å®å®æ€§åˆ«" :formatter="sexFormatter" > - </el-table-column> - <el-table-column - label="æ“作"> + <el-table-column prop="mobile" label="手机å·"></el-table-column> + <el-table-column prop="created_at" label="注册时间" width="105px" sortable></el-table-column> + <el-table-column prop="last_login_at" label="最åŽç™»å½•" width="105px" sortable></el-table-column> + <!--<el-table-column prop="last_login_at" label="最åŽç™»å½•æ—¶é—´" width="120px" sortable></el-table-column>--> + <el-table-column prop="baby_name" label="å®å®åç§°"></el-table-column> + <el-table-column prop="birthday" label="å®å®ç”Ÿæ—¥" width="105px"></el-table-column> + <el-table-column prop="sex" label="å®å®æ€§åˆ«" width="80px" :formatter="sexFormatter"></el-table-column> + <el-table-column label="æ“作" width="100px"> <template slot-scope="scope"> - <el-button size="mini" plain type="primary" @click="goToDetail(scope.row.user_id)"> - 查看详情 - </el-button> + <el-button size="mini" plain type="primary" @click="goToDetail(scope.row.user_id)">查看详情</el-button> </template> </el-table-column> </el-table> @@ -123,6 +106,9 @@ this.getUser() }, methods:{ + tagChange() { + + }, sexFormatter(item){ if(item.sex==0){ return 'ä¿å¯†' @@ -204,16 +190,10 @@ } </script> -<style scoped lang="less"> - @import "../../util/public"; - .avatar { - width: 50px; - margin-right: 5px; - border-radius: 50%; - height: 50px; - } +<style lang="less"> + /*@import "../../util/public";*/ .user{ - height: 100%; + /*height: 100%;*/ overflow: auto; padding: 20px 0; .btn-content{ @@ -228,11 +208,3 @@ } </style> -<style> - .f-c > div { - display: flex !important; - flex-flow: row; - justify-content: flex-start; - align-items: center; - } -</style> diff --git a/src/components/userDetail/index.vue b/src/components/userDetail/index.vue index ca828545..a8dc4c0e 100644 --- a/src/components/userDetail/index.vue +++ b/src/components/userDetail/index.vue @@ -97,24 +97,19 @@ </el-table> </template> </el-table-column> - <el-table-column - prop="periods_title" - label="期数åç§°"> + <el-table-column prop="periods_title" label="期数åç§°"> <template slot-scope="scope"> <router-link :to="{name:'class', query: { goods_id: scope.row.goods_id, periods_id: scope.row.periods_id}}" > {{scope.row.periods_title}} </router-link> </template> </el-table-column> - <el-table-column - label="看课æƒé™"> + <el-table-column label="看课æƒé™"> <template slot-scope="scope"> {{scope.row.is_view_course === 1 ? '是' : 'å¦'}} </template> </el-table-column> - <el-table-column - className="f-c" - label="è€å¸ˆ"> + <el-table-column className="f-c" label="è€å¸ˆ"> <template slot-scope="scope"> <router-link :to="`/teacher/${scope.row.teacher_id}`" > <div class="f-c"> @@ -125,24 +120,11 @@ </router-link> </template> </el-table-column> - <el-table-column - prop="join_num" - label="åŠ å…¥äººæ•°"> - </el-table-column> - <el-table-column - prop="max_join_num" - label="æœ€å¤§åŠ å…¥äººæ•°"> - </el-table-column> - <el-table-column - prop="start_at" - label="开课时间"> - </el-table-column> - <el-table-column - prop="created_at" - label="创建时间"> - </el-table-column> - <el-table-column - label="æ“作" width="400px"> + <el-table-column prop="join_num" label="åŠ å…¥äººæ•°"></el-table-column> + <el-table-column prop="max_join_num" label="æœ€å¤§åŠ å…¥äººæ•°"></el-table-column> + <el-table-column prop="start_at" label="开课时间"></el-table-column> + <el-table-column prop="created_at" label="创建时间"></el-table-column> + <el-table-column label="æ“作" width="340px"> <template slot-scope="scope"> <el-button @click="showUser(scope.row)" size="mini" type="primary"> ç级æˆå‘˜</el-button> <el-button size="mini" type="warning" v-if="!$store.state.readonly" @click="editPrivilege(scope.row)" >编辑</el-button> diff --git a/src/service/api.js b/src/service/api.js index 73063854..2c9f3abc 100644 --- a/src/service/api.js +++ b/src/service/api.js @@ -1337,6 +1337,14 @@ export const postTagApi = function (json) { export const putTagApi = function (json) { return Vue.prototype.$put(`${_baseUrl}api/admin/category/${json.category_id}`, json) }; +// æ ¹æ®æ ‡ç¾æœç´¢ç”¨æˆ· +export const getTagUserApi = function (json) { + return Vue.prototype.$fetch(`${_baseUrl}api/admin/advanced/search`, json) +}; +// æ ¹æ®æ ‡ç¾æœç´¢ç”¨æˆ· +export const TagUserApi = function (json) { + return Vue.prototype.$fetch(`${_baseUrl}api/admin/advanced/search`, json) +}; // 获å–员工列表 export const getStaffListApi = function (json) { return Vue.prototype.$fetch(`${_baseUrl}api/admin/staff/list`, json) -- 2.21.0