Browse Source

优化关注

master
陈裕财 4 years ago
parent
commit
8591cab894
  1. 47
      src/api/mdp/sys/userFocus.js
  2. 113
      src/views/myWork/my/components/DoFocus.vue
  3. 391
      src/views/myWork/my/components/MyFocusList.vue
  4. 2
      src/views/myWork/my/components/boxCard.vue
  5. 2
      src/views/xm/core/xmMenu/XmMenuEdit.vue
  6. 2
      src/views/xm/core/xmQuestion/XmQuestionEdit.vue
  7. 2
      src/views/xm/core/xmTask/XmTaskEdit.vue

47
src/api/mdp/sys/userFocus.js

@ -0,0 +1,47 @@
import axios from '@/utils/request'
import { getDicts,initSimpleDicts,initComplexDicts } from '@/api/mdp/meta/item';//字典表
import config from '@/common/config'
let base = config.getSysBasePath();
/**-------------------------与后端通讯接口------------------请写在下面-------------------------------------------- */
/**
* 我关注的项目或者任务
*1 默认只开放普通查询所有查询只要上传 分页参数 {pageNum:当前页码从1开始,pageSize:每页记录数,total:总记录数如果是0后台会自动计算总记录数非0不会自动计算}后台都会自动按分页查询 其它 api用到再打开没用到的api请注释掉
*2 查询新增修改的参数格式 params={userid:'用户编号 主键',bizId:'关注的对象主键 主键',pbizId:'对象上级编号,项目时填项目编号,任务时填项目编号,产品时填产品编号,需求时填产品编号,bug时填产品编号,迭代时填产品编号 主键',username:'用户名称',focusType:'对象类型:项目-1/任务-2/产品-3/需求-4/bug-5/迭代-6/团队-7/组织-8/个人-9/文章-W/合同-H/客户-K',bizName:'任务名称',pbizName:'对象上级名称',ftime:'关注时间',ubranchId:'用户归属机构'}
**/
//普通查询 条件之间and关系
export const listUserFocus = params => { return axios.get(`${base}/mdp/sys/userFocus/list`, { params: params }); };
//删除一条我关注的项目或者任务 params={userid:'用户编号 主键',bizId:'关注的对象主键 主键',pbizId:'对象上级编号,项目时填项目编号,任务时填项目编号,产品时填产品编号,需求时填产品编号,bug时填产品编号,迭代时填产品编号 主键'}
export const delUserFocus = params => { return axios.post(`${base}/mdp/sys/userFocus/del`,params); };
//批量删除我关注的项目或者任务 params=[{userid:'用户编号 主键',bizId:'关注的对象主键 主键',pbizId:'对象上级编号,项目时填项目编号,任务时填项目编号,产品时填产品编号,需求时填产品编号,bug时填产品编号,迭代时填产品编号 主键'}]
export const batchDelUserFocus = params => { return axios.post(`${base}/mdp/sys/userFocus/batchDel`, params); };
//修改一条我关注的项目或者任务记录
export const editUserFocus = params => { return axios.post(`${base}/mdp/sys/userFocus/edit`, params); };
//新增一条我关注的项目或者任务
export const addUserFocus = params => { return axios.post(`${base}/mdp/sys/userFocus/add`, params); };
//批量修改某些字段
export const editSomeFieldsUserFocus = params => { return axios.post(`${base}/mdp/sys/userFocus/editSomeFields`, params); };
//普通查询 条件之间and关系
export const myFocusForIndex = params => {
return axios.get(`${base}/mdp/sys/userFocus/myFocusForIndex`, { params: params });
};
/**-------------------------前端mng|add|edit界面公共函数---------------请写在下面----------------------------------------------- */
//初始化页面上的字典
export const initDicts = (that) => {
var itemCodes=['objType'];//在此添加要加载的字典 如['sex','grade','lvl']
if(itemCodes.length>0){
initSimpleDicts('all',itemCodes).then(res=>{
Object.assign(that.dicts,res.data.data)
});
}
};

113
src/views/myWork/my/components/DoFocus.vue

@ -0,0 +1,113 @@
<template>
<section>
<el-row v-if="userFocuss.length>0">
<el-tag type="success">已关注</el-tag> <el-button @click="handleDel"></el-button>
</el-row>
<el-row v-if="userFocuss.length<=0">
<el-tag type="primary">未关注</el-tag> <el-button @click="saveSubmit"></el-button>
</el-row>
</section>
</template>
<script>
import util from '@/common/js/util';//
import config from "@/common/config"; //import
import { initDicts, listUserFocus,addUserFocus,delUserFocus } from '@/api/mdp/sys/userFocus';
import { mapGetters } from 'vuex'
export default {
name:'xmMyDoFocus',
components: {
},
computed: {
...mapGetters([ 'userInfo' ]),
},
props:['pbizId','bizId','focusType','bizName'],
watch: {
bizId(){
this.searchUserFocuss()
}
},
data() {
return {
load:{ list: false, edit: false, del: false, add: false },//...
dicts:{},// params={categoryId:'all',itemCodes:['sex']} {sex: [{id:'1',name:''},{id:'2',name:''}]}
userFocuss:[],
}//end return
},//end data
methods: {
...util,
// UserFocus
searchUserFocuss() {
let params = {
pbizId:this.pbizId,
bizId:this.bizId,
focusType:this.focusType
};
this.load.list = true;
listUserFocus(params).then((res) => {
var tips=res.data.tips;
if(tips.isOk){
this.userFocuss = res.data.data;
}else{
this.$notify({ position:'bottom-left',showClose:true, message: tips.msg, type: 'error' });
}
this.load.list = false;
}).catch( err => this.load.list = false );
},
initData: function(){
this.searchUserFocuss();
},
//userFocus
handleDel: function ( ) {
var row=this.userFocuss[0]
this.load.del=true;
let params = { userid:row.userid, bizId:row.bizId, pbizId:row.pbizId };
delUserFocus(params).then((res) => {
this.load.del=false;
var tips=res.data.tips;
if(tips.isOk){
this.searchUserFocuss();
}
this.$notify({ position:'bottom-left', showClose:true, message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.del=false );
},
//UserFocus @submit="afterEditSubmit"
saveSubmit: function () {
this.load.edit=true
let params = {pbizId:this.pbizId,bizId:this.bizId,focusType:this.focusType,bizName:this.bizName}
var func=addUserFocus
func(params).then((res) => {
this.load.edit=false
var tips=res.data.tips;
if(tips.isOk){
this.searchUserFocuss()
this.$emit('submit');// @submit="afterAddSubmit"
}
this.$notify({ position:'bottom-left',showClose:true, message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err =>this.load.edit=false);
},
},//end method
mounted() {
this.$nextTick(() => {
initDicts(this);
this.initData()
});
}
}
</script>
<style scoped>
</style>

391
src/views/myWork/my/components/MyFocusList.vue

@ -0,0 +1,391 @@
<template>
<section>
<el-row :gutter="20">
<el-col :span="8">
<el-card class="box-card">
<div slot="header" class="clearfix">
<div class="avatar-container">
<div class="avatar-wrapper">
<img class="user-avatar" src="../../img/cp.png">
<span class="username"> 产品项目</span>
</div>
</div>
</div>
<div v-for="(o,index) in pps" :key="index" class="list-item">
<el-tag v-for="(item,index) in formatDictsWithClass(dicts,'objType',o.focusType)" :key="index" :type="item.className">{{item.name}}</el-tag>
<el-link @click="toBizPage(o)">{{o.bizName }}</el-link>
<div class="tool-bar">
<span class="u-btn">
<el-button type="text" @click="handleDel(o,index)" icon="el-icon-remove-outline" title="取消关注" >取消关注 </el-button>
</span>
</div>
</div>
</el-card>
</el-col>
<el-col :span="8">
<el-card class="box-card">
<div slot="header" class="clearfix">
<div class="avatar-container">
<div class="avatar-wrapper">
<img class="user-avatar" src="../../img/xmgl.png">
<span class="username"> 迭代需求</span>
</div>
</div>
</div>
<div v-for="(o,index) in ims" :key="index" class="list-item">
<el-tag v-for="(item,index) in formatDictsWithClass(dicts,'objType',o.focusType)" :key="index" :type="item.className">{{item.name}}</el-tag>
<el-link @click="toBizPage(o)">{{o.bizName }}</el-link>
<div class="tool-bar">
<span class="u-btn">
<el-button type="text" circle @click="handleDel(o,index)" icon="el-icon-remove-outline" title="取消关注">取消关注 </el-button>
</span>
</div>
</div>
</el-card>
</el-col>
<el-col :span="8">
<el-card class="box-card">
<div slot="header" class="clearfix">
<div class="avatar-container">
<div class="avatar-wrapper">
<img class="user-avatar" src="../../img/xqgl.png">
<span class="username">任务缺陷</span>
</div>
</div>
</div>
<div v-for="(o,index) in tbs" :key="index" class="list-item">
<el-tag v-for="(item,index) in formatDictsWithClass(dicts,'objType',o.focusType)" :key="index" :type="item.className">{{item.name}}</el-tag>
<el-link @click="toBizPage(o)"> {{o.bizName }}</el-link>
<div class="tool-bar">
<span class="u-btn">
<el-button type="text" @click="handleDel(o,index)" icon="el-icon-remove-outline" title="取消关注"> 取消关注</el-button>
</span>
</div>
</div>
</el-card>
</el-col>
</el-row>
</section>
</template>
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { initDicts,myFocusForIndex, delUserFocus, batchDelUserFocus,editSomeFieldsUserFocus } from '@/api/mdp/sys/userFocus';
import { mapGetters } from 'vuex'
export default {
name:'userFocusMng',
components: {
},
props:['visible'],
computed: {
...mapGetters(['userInfo']),
pps(){
return this.userFocuss.filter(k=>k.focusType=='1'||k.focusType=='3')
},
ims(){
return this.userFocuss.filter(k=>k.focusType=='4'||k.focusType=='6')
},
tbs(){
return this.userFocuss.filter(k=>k.focusType=='2' || k.focusType=='5')
}
},
watch:{
visible(val){
if(val==true){
this.initData();
}
}
},
data() {
return {
filters: {
key: ''
},
userFocuss: [],//
pageInfo:{//
total:0,//0>0
pageSize:10,//
count:false,//
pageNum:1,//1
orderFields:[],// ['sex','student_id']
orderDirs:[]// asc,desc ['asc','desc']
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
dicts:{
objType:[],
//sex: [{id:'1',name:''},{id:'2',name:''}]
},// params={categoryId:'all',itemCodes:['sex']} {sex: [{id:'1',name:''},{id:'2',name:''}]}
addFormVisible: false,//userFocus
addForm: {
userid:'',username:'',bizId:'',focusType:'',pbizId:'',bizName:'',pbizName:'',ftime:'',ubranchId:''
},
editFormVisible: false,//
editForm: {
userid:'',username:'',bizId:'',focusType:'',pbizId:'',bizName:'',pbizName:'',ftime:'',ubranchId:''
},
maxTableHeight:300,
}
},//end data
methods: {
...util,
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
this.getUserFocuss();
},
handleCurrentChange(pageNum) {
this.pageInfo.pageNum = pageNum;
this.getUserFocuss();
},
// obj.order=ascending/descending, asc/desc ; obj.prop=,
sortChange( obj ){
if(obj.order==null){
this.pageInfo.orderFields=[];
this.pageInfo.orderDirs=[];
}else{
var dir='asc';
if(obj.order=='ascending'){
dir='asc'
}else{
dir='desc';
}
this.pageInfo.orderFields=[util.toLine(obj.prop)];
this.pageInfo.orderDirs=[dir];
}
this.getUserFocuss();
},
searchUserFocuss:function(){
this.pageInfo.count=true;
this.getUserFocuss();
},
// UserFocus
getUserFocuss() {
debugger;
let params = {
pageSize: this.pageInfo.pageSize,
pageNum: this.pageInfo.pageNum,
total: this.pageInfo.total,
count:this.pageInfo.count
};
if(this.pageInfo.orderFields!=null && this.pageInfo.orderFields.length>0){
let orderBys=[];
for(var i=0;i<this.pageInfo.orderFields.length;i++){
orderBys.push(this.pageInfo.orderFields[i]+" "+this.pageInfo.orderDirs[i])
}
params.orderBy= orderBys.join(",")
}
if(this.filters.key){
params.key=this.filters.key
}
this.load.list = true;
myFocusForIndex(params).then((res) => {
debugger;
var tips=res.data.tips;
if(tips.isOk){
this.pageInfo.total = res.data.total;
this.pageInfo.count=false;
this.userFocuss = res.data.data;
localStorage.setItem('mdp-sys-user-focus-list',JSON.stringify( this.userFocuss ))
}else{
this.$notify({ position:'bottom-left',showClose:true, message: tips.msg, type: 'error' });
}
this.load.list = false;
}).catch( err => this.load.list = false );
},
// UserFocus
showEdit: function ( row,index ) {
this.editFormVisible = true;
this.editForm = Object.assign({}, row);
},
/**
* that.dicts['focusType']=[{id:'1',name:'项目'},{id:'2',name:'任务'},{id:'3',name:'产品'},{id:'4',name:'需求'},{id:'5',name:'缺陷'},]
*/
toBizPage(bizObj){
if(bizObj.focusType=='1'){
this.$router.push({path:'/xm/core/xmProject/XmProjectInfoRoute',query:{id:bizObj.bizId}})
}else if(bizObj.focusType=='3'){
this.$router.push({path:'/xm/core/xmProduct/XmProductInfoRoute',query:{id:bizObj.bizId}})
}else if(bizObj.focusType=='2'){
this.$router.push({path:'/xm/core/xmTask/XmTaskDetailRoute',query:{id:bizObj.bizId}})
}else if(bizObj.focusType=='4'){
this.$router.push({path:'/xm/core/xmMenu/XmMenuDetailRoute',query:{id:bizObj.bizId}})
}else if(bizObj.focusType=='5'){
this.$router.push({path:'/xm/core/xmQuestion/XmQuestionDetailRoute',query:{id:bizObj.bizId}})
}else if(bizObj.focusType=='6'){
this.$router.push({path:'/xm/core/xmIteration/XmIterationInfoRoute',query:{id:bizObj.bizId}})
}
},
// UserFocus
showAdd: function () {
this.addFormVisible = true;
//this.addForm=Object.assign({}, this.editForm);
},
afterAddSubmit(){
this.addFormVisible=false;
this.pageInfo.count=true;
this.getUserFocuss();
},
afterEditSubmit(){
this.editFormVisible=false;
},
//userFocus
selsChange: function (sels) {
this.sels = sels;
},
//userFocus
handleDel: function (row,index) {
this.load.del=true;
let params = { userid:row.userid, bizId:row.bizId, pbizId:row.pbizId };
delUserFocus(params).then((res) => {
this.load.del=false;
var tips=res.data.tips;
if(tips.isOk){
this.searchUserFocuss();
}
this.$notify({ position:'bottom-left', showClose:true, message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.del=false );
},
//userFocus
batchDel: function () {
if(this.sels.length<=0){
return;
}
var params=this.sels.map(i=>{
return { userid:i.userid, bizId:i.bizId, pbizId:i.pbizId}
})
this.$confirm('确认删除选中记录吗?', '提示', {
type: 'warning'
}).then(() => {
this.load.del=true;
batchDelUserFocus(params).then((res) => {
this.load.del=false;
var tips=res.data.tips;
if( tips.isOk ){
this.searchUserFocuss();
}
this.$notify({ position:'bottom-left',showClose:true, message: tips.msg, type: tips.isOk?'success':'error'});
}).catch( err => this.load.del=false );
});
},
editSomeFields(row,fieldName,$event){
let params={};
if(this.sels.length>0){
if(!this.sels.some(k=> k.userid==row.userid && k.bizId==row.bizId && k.pbizId==row.pbizId)){
this.$notify({position:'bottom-left',showClose:true,message:'请编辑选中的行',type:'warning'})
Object.assign(this.editForm,this.editFormBak)
return;
}
params['pkList']=this.sels.map(i=>{ return { userid:i.userid, bizId:i.bizId, pbizId:i.pbizId}})
}else{
params['pkList']=[row].map(i=>{ return { userid:i.userid, bizId:i.bizId, pbizId:i.pbizId}})
}
params[fieldName]=$event
var func = editSomeFieldsUserFocus
func(params).then(res=>{
let tips = res.data.tips;
if(tips.isOk){
if(this.sels.length>0){
this.searchUserFocuss();
}
this.editFormBak=[...this.editForm]
}else{
Object.assign(this.editForm,this.editFormBak)
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
}).catch((e)=>Object.assign(this.editForm,this.editFormBak))
},
rowClick: function(row, event, column){
this.editForm=row
this.editFormBak={...row};
this.$emit('row-click',row, event, column);// @row-click="rowClick"
},
initData: function(){
},
},//end methods
mounted() {
this.$nextTick(() => {
initDicts(this);
this.initData()
var myFocusList=localStorage.getItem('mdp-sys-user-focus-list')
debugger;
if(myFocusList){
this.userFocuss=JSON.parse(myFocusList)
}else{
this.searchUserFocuss();
}
//this.maxTableHeight = util.calcTableMaxHeight(this.$refs.userFocusTable.$el)
});
}
}
</script>
<style lang="scss" scoped>
.box-card{
height: 450px;
}
.avatar-container {
height: 20px;
display: flex;
align-items: center;
.avatar-wrapper {
cursor: pointer;
display: flex;
flex-direction: row;
align-items: center;
.user-avatar {
height: 34px;
width: 34px;
border-radius: 50%;
margin-right: 12px;
}
.username{
color: #7D7D7D;
font-size: 18px;
margin-right: 2px;
}
.el-icon-caret-bottom {
font-size: 22px;
}
}
}
.tool-bar{
visibility: hidden;
float: right;
}
.list-item{
margin-bottom: 15px;
}
.list-item:hover{
.tool-bar{
visibility: visible;
.u-btn{
float: right;
}
}
}
</style>

2
src/views/myWork/my/components/boxCard.vue

@ -44,7 +44,7 @@ import wdcp from '@/views/xm/core/xmProduct/XmProductAllMng.vue';
import wdxm from '@/views/xm/core/xmProject/XmProjectMng'; import wdxm from '@/views/xm/core/xmProject/XmProjectMng';
import { userMenuFavoriteList, saveMenuFavoriteList} from '@/api/mdp/sys/menuFavorite' import { userMenuFavoriteList, saveMenuFavoriteList} from '@/api/mdp/sys/menuFavorite'
import myFocus from '@/views/xm/core/xmMyFocus/XmMyFocusList';
import myFocus from './MyFocusList';
import VueGridLayout from 'vue-grid-layout'; import VueGridLayout from 'vue-grid-layout';
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'

2
src/views/xm/core/xmMenu/XmMenuEdit.vue

@ -214,7 +214,7 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
import TagMng from "@/views/mdp/arc/tag/TagMng"; import TagMng from "@/views/mdp/arc/tag/TagMng";
import XmSubWorkItem from "@/views/xm/core/xmMenuWorkItem/XmSubWorkItem"; import XmSubWorkItem from "@/views/xm/core/xmMenuWorkItem/XmSubWorkItem";
import XmRecord from '../xmRecord/XmRecord' import XmRecord from '../xmRecord/XmRecord'
import XmMyDoFocus from '../xmMyFocus/XmMyDoFocus.vue';
import XmMyDoFocus from '@/views/myWork/my/components/DoFocus';
export default { export default {
computed: { computed: {

2
src/views/xm/core/xmQuestion/XmQuestionEdit.vue

@ -240,7 +240,7 @@
import TagMng from "@/views/mdp/arc/tag/TagMng"; import TagMng from "@/views/mdp/arc/tag/TagMng";
import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect'; import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect';
import XmMyDoFocus from '../xmMyFocus/XmMyDoFocus.vue';
import XmMyDoFocus from '@/views/myWork/my/components/DoFocus';
export default { export default {
computed: { computed: {

2
src/views/xm/core/xmTask/XmTaskEdit.vue

@ -292,7 +292,7 @@
import xmQuestionForTask from "@/views/xm/core/xmQuestion/XmQuestionForTask"; import xmQuestionForTask from "@/views/xm/core/xmQuestion/XmQuestionForTask";
import XmTaskWorkloadRecord from "../xmTaskWorkload/XmTaskWorkloadRecord" import XmTaskWorkloadRecord from "../xmTaskWorkload/XmTaskWorkloadRecord"
import XmMenuEdit from '../xmMenu/XmMenuEdit.vue'; import XmMenuEdit from '../xmMenu/XmMenuEdit.vue';
import XmMyDoFocus from '../xmMyFocus/XmMyDoFocus.vue';
import XmMyDoFocus from '@/views/myWork/my/components/DoFocus';
import XmTaskExecuserForTask from '../xmTaskExecuser/XmTaskExecuserForTask.vue'; import XmTaskExecuserForTask from '../xmTaskExecuser/XmTaskExecuserForTask.vue';
export default { export default {
computed: { computed: {

Loading…
Cancel
Save