Browse Source

Merge branch 'master' of http://www.qingqinkj.com/gitlab/qqkj/mmcloud/xm/xm-ui-web

# Conflicts:
#	package.json
#	src/views/login/index2.vue
master
xiejiahao 4 years ago
parent
commit
8e19048a69
  1. 4
      config/index.js
  2. 3
      package.json
  3. 39
      src/api/login.js
  4. 30
      src/api/mdp/sys/branch.js
  5. 44
      src/api/mdp/sys/userLoginRecord.js
  6. 4
      src/router/index.js
  7. 13
      src/router/routes_my_work.js
  8. 6
      src/views/layout/components/Navbar.vue
  9. 78
      src/views/login/components/login.vue
  10. 33
      src/views/login/components/register.vue
  11. 539
      src/views/login/index.vue
  12. 61
      src/views/login/index2.vue
  13. 378
      src/views/login/register.vue
  14. 182
      src/views/mdp/sys/branch/BranchEdit.vue
  15. 182
      src/views/myWork/set/BranchEdit.vue
  16. 163
      src/views/myWork/set/ChangeEmailStepOne.vue
  17. 109
      src/views/myWork/set/ChangeEmailStepTwo.vue
  18. 265
      src/views/myWork/set/index.vue
  19. 397
      src/views/myWork/userLoginRecord/index.vue
  20. 1434
      src/views/xm/XmOverview.vue
  21. 1163
      src/views/xm/XmOverview2.vue
  22. 6
      src/views/xm/core/components/XmProjectSelect.vue
  23. 148
      src/views/xm/core/xmGroup/XmGroupMng.vue
  24. 21
      src/views/xm/core/xmGroupUser/XmGroupUserMng.vue
  25. 2
      src/views/xm/core/xmMenu/XmMenuAdd.vue
  26. 52
      src/views/xm/core/xmMenu/XmMenuEdit.vue
  27. 6
      src/views/xm/core/xmMenu/XmMenuMngBatch.vue
  28. 12
      src/views/xm/core/xmMenu/XmMenuWithPlan.vue
  29. 2
      src/views/xm/core/xmProduct/XmProductInfo.vue
  30. 22
      src/views/xm/core/xmProduct/XmProductMng.vue
  31. 6
      src/views/xm/core/xmProduct/XmProductTplMng.vue
  32. 4
      src/views/xm/core/xmProject/XmProjectInfo.vue
  33. 34
      src/views/xm/core/xmProject/XmProjectMng.vue
  34. 7
      src/views/xm/core/xmQuestion/XmQuestionAdd.vue
  35. 2
      src/views/xm/core/xmQuestion/XmQuestionEdit.vue
  36. 16
      src/views/xm/core/xmRecord/XmRecord.vue
  37. 9
      src/views/xm/core/xmRecord/XmRecordMng.vue
  38. 12
      src/views/xm/core/xmTask/XmTaskEdit.vue
  39. 4
      src/views/xm/core/xmTask/XmTaskMng.vue
  40. 2
      src/views/xm/core/xmTaskExecuser/XmTaskExecuserForTask.vue
  41. 10
      src/views/xm/core/xmTaskExecuser/XmTaskExecuserMng.vue
  42. 281
      src/views/xm/core/xmTaskExecuser/XmTaskExecuserSelect.vue

4
config/index.js

@ -17,7 +17,7 @@ module.exports = {
'^/api/m1/xm': '/xm'
}
},
/**
'/api/m1/sys': {
target: 'http://localhost:7015',
changeOrigin: true,
@ -33,7 +33,7 @@ module.exports = {
'^/api/m1/pay': '/pay'
}
},
**/
/**
'/api/m1/workflow': {
target: 'http://localhost:7080',

3
package.json

@ -52,7 +52,7 @@
"vue-i18n": "7.3.2",
"vue-okr-tree": "^1.0.10",
"vue-print-nb": "^1.7.5",
"vue-qriously": "^1.1.1",
"vue-qr": "^4.0.6",
"vue-router": "3.0.1",
"vuedraggable": "2.15.0",
"vuex": "3.0.1",
@ -122,6 +122,7 @@
"vue-loader": "^15.9.8",
"vue-style-loader": "^4.1.3",
"vue-template-compiler": "^2.6.14",
"vue-wxlogin": "^1.0.4",
"webpack": "^5.59.1",
"webpack-bundle-analyzer": "2.9.1",
"webpack-cli": "^4.9.1",

39
src/api/login.js

@ -22,6 +22,20 @@ export function doLoginByUserloginid(userloginid, password,grantType,authType,de
data
})
}
export function switchUser(userloginid, password,grantType,authType,deptid,userid) {
const data = {
userloginid: userloginid,
password: password,
authType:authType,
deptid:deptid,
userid:userid,
}
return axios({
url: base+'/login/token?grantType='+grantType,
method: 'post',
data
})
}
export function checkUserid(userid ) {
removeToken();
const data = {
@ -143,3 +157,28 @@ export function validEmailCode(params) {
params:params
})
}
/**
* 获取第三方登录需要state参数防止crfs攻击
* @param
* @returns
*/
export function getTpaState( ) {
return axios({
url: '/tpa/login/wechat/wxpub/state',
method: 'post',
data:{}
})
}
/**
* 获取查询当前登录账户的所有关联账户
* @returns
*/
export function queryMyUsers( ) {
return axios({
url: base+'/user/queryMyUsers',
method: 'get'
})
}

30
src/api/mdp/sys/branch.js

@ -1,21 +1,20 @@
import axios from '@/utils/request'
import { getDicts,initSimpleDicts,initComplexDicts } from '@/api/mdp/meta/item';//字典表
import config from '@/common/config'
let base=config.getSysBasePath();
let base = config.getSysBasePath();
/**-------------------------与后端通讯接口------------------请写在下面-------------------------------------------- */
/**
* 管理端机构表机构下面若干部门
*1 默认只开放普通查询所有查询只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录数如果是0后台会自动计算总记录数非0不会自动计算}后台都会自动按分页查询 其它 api用到再打开没用到的api请注释掉
*2 查询新增修改的参数格式 params={id:'机构编号 主键',branchName:'机构名称',enabled:'是否可用',industryCategory:'行业分类',cuserid:'创建人编号',cdate:'创建日期',cusername:'创建人姓名',phoneNo:'联系电话',emaill:'邮件'}
*1 默认只开放普通查询所有查询只要上传 分页参数 {pageNum:当前页码从1开始,pageSize:每页记录数,total:总记录数如果是0后台会自动计算总记录数非0不会自动计算}后台都会自动按分页查询 其它 api用到再打开没用到的api请注释掉
*2 查询新增修改的参数格式 params={id:'机构编号 主键',branchName:'机构名称',enabled:'是否可用',industryCategory:'行业分类',cuserid:'创建人编号-可以转让,创建人与机构管理员有同样的权限',cdate:'创建日期',cusername:'创建人姓名-可以转让',lphoneNo:'联系电话',emaill:'邮件',bizProcInstId:'当前流程实例编号',bizFlowState:'当前流程状态',pbranchId:'上级机构',admUserid:'管理员编号(==机构编号,不允许修改,即机构主账户)',admUsername:'管理员名称(==机构名称+'管理员',不允许修改)',lusername:'联系人姓名',luserid:'联系人编号',address:'公司地址'}
**/
//普通查询 条件之间and关系
export const listBranch = params => { return axios.get(`${base}/mdp/sys/branch/list`, { params: params }); };
//模糊查询管理端机构表(机构下面若干部门) 条件之间or关系
//export const listBranchKey = params => { return axios.get(`${base}/mdp/sys/branch/listKey`, { params: params }); };
//删除一条管理端机构表(机构下面若干部门) params={id:'机构编号 主键'}
export const delBranch = params => { return axios.post(`${base}/mdp/sys/branch/del`,params); };
@ -26,4 +25,21 @@ export const batchDelBranch = params => { return axios.post(`${base}/mdp/sys/bra
export const editBranch = params => { return axios.post(`${base}/mdp/sys/branch/edit`, params); };
//新增一条管理端机构表(机构下面若干部门)
export const addBranch = params => { return axios.post(`${base}/mdp/sys/branch/add`, params); };
export const addBranch = params => { return axios.post(`${base}/mdp/sys/branch/add`, params); };
//批量修改某些字段
export const editSomeFieldsBranch = params => { return axios.post(`${base}/mdp/sys/branch/editSomeFields`, params); };
/**-------------------------前端mng|add|edit界面公共函数---------------请写在下面----------------------------------------------- */
//初始化页面上的字典
export const initDicts = (that) => {
var itemCodes=['industryCategory'];//在此添加要加载的字典 如['sex','grade','lvl']
that.dicts['enabled']=[{id:"0",name:'停用'},{id:"1",name:'启用'}];
if(itemCodes.length>0){
initSimpleDicts('all',itemCodes).then(res=>{
Object.assign(that.dicts,res.data.data)
});
}
};

44
src/api/mdp/sys/userLoginRecord.js

@ -0,0 +1,44 @@
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={id:'主键 主键',userid:'用户编号',shopId:'商户编号',locationId:'门店编号',loginShopid:'登录的商户编号',loginLocationid:'登录的门店编号',branchId:'机构编号',loginType:'1-微信扫门店二维码,2-点击小程序登录,3-账户密码登录,4-手机号码登录',loginTime:'登录时间',loginBranchId:'登录机构号',username:'登录用户名',authId:'授权码',mdpAppid:'mdp平台appid',lockNo:'批处理编号',lockStatus:'批处理状态0-待处理1-处理中2处理完毕',lockTime:'批处理时间',phoneno:'登录手机号',loginIp:'登录ip',userType:'mem-会员端用户,adm-管理端用户',loginDeviceId:'登录设备编号',loginDeviceSn:'设备特征码',userAgent:'请求特征码',reqNo:'请求特征码-方便前端补充回填部分信息',deviceType:'设备类型COMPUTER/MOBILE/TABLET/GAME_CONSOLE/DMR/WEARABLE/UNKNOWN',os:'操作系统Windows/ios/Android',osVersion:'操作系统版本如Android',osName:'操作系统名称如Android',renderingEngine:'浏览器渲染引擎如WEBKIT',deviceManufacturer:'设备生产厂商',browerGroup:'浏览器组',borderName:'浏览器名称',borderVersion:'浏览器版本',longitude:'经度',latitude:'纬度',regionId:'区域编号精确到4级镇、街道',regionName:'定位街道名称',formatAddress:'定位格式化地址名称',districtId:'定位区县编号',memType:'用户类型',loginStatus:'1-登录成功,0-登录失败',loginMsg:'登录成功或者失败的说明',authType:'授权码',grantType:'授权码'}
**/
//普通查询 条件之间and关系
export const listUserLoginRecord = params => { return axios.get(`${base}/mdp/sys/userLoginRecord/list`, { params: params }); };
//删除一条用户登录信息登记 params={id:'主键 主键'}
export const delUserLoginRecord = params => { return axios.post(`${base}/mdp/sys/userLoginRecord/del`,params); };
//批量删除用户登录信息登记 params=[{id:'主键 主键'}]
export const batchDelUserLoginRecord = params => { return axios.post(`${base}/mdp/sys/userLoginRecord/batchDel`, params); };
//修改一条用户登录信息登记记录
export const editUserLoginRecord = params => { return axios.post(`${base}/mdp/sys/userLoginRecord/edit`, params); };
//新增一条用户登录信息登记
export const addUserLoginRecord = params => { return axios.post(`${base}/mdp/sys/userLoginRecord/add`, params); };
//批量修改某些字段
export const editSomeFieldsUserLoginRecord = params => { return axios.post(`${base}/mdp/sys/userLoginRecord/editSomeFields`, params); };
/**-------------------------前端mng|add|edit界面公共函数---------------请写在下面----------------------------------------------- */
//初始化页面上的字典
export const initDicts = (that) => {
var itemCodes=[];//在此添加要加载的字典 如['sex','grade','lvl']
if(itemCodes.length>0){
initSimpleDicts('all',itemCodes).then(res=>{
Object.assign(that.dicts,res.data.data)
});
}
};

4
src/router/index.js

@ -38,7 +38,7 @@ export { Layout }
}
**/
export const constantRouterMap = [
{ path: '/login', component: _import('login/index2'), hidden: true },
{ path: '/login', component: _import('login/index'), hidden: true },
{ path: '/404', component: _import('errorPage/404'), hidden: true },
{ path: '/401', component: _import('errorPage/401'), hidden: true },
{
@ -49,7 +49,7 @@ export const constantRouterMap = [
children: [
{
path: 'dashboard',
component: _import('xm/XmOverview2'),
component: _import('xm/XmOverview'),
name: '首页',
meta: { title: '首页', icon: 'home-page', noCache: true }
},

13
src/router/routes_my_work.js

@ -4,6 +4,10 @@ const _import = require('./_import_' + process.env.NODE_ENV)
export default {
routes: [
{ path: '/changeEmailStepOne', component: _import('myWork/set/ChangeEmailStepOne'), hidden: true },
{ path: '/changeEmailStepTwo', component: _import('myWork/set/ChangeEmailStepTwo'), hidden: true },
{ path: '/updateUserInfo', component: _import('myWork/set/index'), hidden: true },
{
path: '/my/work',
component: Layout,
@ -42,6 +46,15 @@ export default {
icon: 'component'
}
},
{
path: 'userLoginRecord',
component: _import('myWork/userLoginRecord/index'),
name: '登录日志',
meta: {
title: '登录日志',
icon: 'component'
}
},
]
}
]

6
src/views/layout/components/Navbar.vue

@ -27,7 +27,7 @@
<theme-picker class="theme-switch right-menu-item"></theme-picker>
</el-tooltip>
<el-dropdown class="avatar-container right-menu-item hidden-sm-and-down" trigger="hover" style="max-width:300px;" @command="handleCommand">
<el-dropdown class="avatar-container right-menu-item hidden-sm-and-down" trigger="hover" @command="handleCommand">
<div class="avatar-wrapper">
<img v-if="userInfo && userInfo.headimgurl && userInfo.headimgurl!=null && userInfo.headimgurl!=='' " class="user-avatar" :src="userInfo.headimgurl">
<img v-else class="user-avatar" src="../../../assets/image/user_img.gif">
@ -223,7 +223,9 @@ export default {
},
logout() {
this.$store.dispatch('LogOut').then(() => {
location.reload()// In order to re-instantiate the vue-router object to avoid bugs
//location.reload()// In order to re-instantiate the vue-router object to avoid bugs
//this.$router.replace({path:'/login'})
location.replace('/');
})
},
showSelectShopMethod() {

78
src/views/login/components/login.vue

@ -1,5 +1,6 @@
<template>
<div>
<div v-if="!isRestPwd">
<div class="login_form">
<el-form autoComplete="on" :model="loginForm" :rules="loginRules" ref="loginForm">
@ -16,7 +17,7 @@
<el-form-item prop="smsCode" v-show="loginForm.authType=='sms'">
<el-input class="inp smsCode" name="smsCode" type="text" v-model="loginForm.smsCode" autoComplete="on" placeholder="短信验证码">
</el-input>
<el-button class="sendCode" :disabled="abledBut" @click.prevent="sendPhonenoSmsCode">
<el-button class="sendCode" :disabled="abledBut" @click.prevent="sendPhonenoSmsCode('login')">
<span class="text" v-if="!abledBut">发送验证码</span>
<span class="text" v-else>({{setTimeNum}}s)</span>
</el-button>
@ -35,9 +36,11 @@
</div>
<div class="bottom">
<el-divider content-position="center">第三方登录方式</el-divider>
<div class="other">
<img src="@/assets/image/module/weixin.png">
<img src="@/assets/image/module/qq.png">
<div class="other">
<el-popover trigger="manual" v-model="wxLoginCodeVisible" placement="top-start"> <div id="login_container"></div>
<img slot="reference" src="@/assets/image/module/weixin.png" @click="weixinLogin">
<el-button type="text" @click="wxLoginCodeVisible=false" icon="el-icon-close">关闭</el-button><el-button type="text" @click="weixinLogin" icon="el-icon-refresh"></el-button>
</el-popover>
</div>
</div>
</div>
@ -52,7 +55,7 @@
<el-form-item prop="smsCode">
<el-input class="inp smsCode" name="smsCode" type="text" v-model="loginForm.smsCode" autoComplete="on" placeholder="短信验证码">
</el-input>
<el-button :disabled="abledBut" class="sendCode" @click.prevent="sendPhonenoSmsCode">
<el-button :disabled="abledBut" class="sendCode" @click.prevent="sendPhonenoSmsCode('changePassword')">
<span class="text" v-if="!abledBut">发送验证码</span>
<span class="text" v-else>({{setTimeNum}}s)</span>
</el-button>
@ -71,7 +74,7 @@
</el-button>
</div>
</div>
</div>
</template>
@ -80,8 +83,7 @@
import { sendSmsCode } from '@/api/sms/sms';
import { mapGetters } from 'vuex';
import md5 from 'js-md5';
import { resetPasswordByPhoneno } from '@/api/login';
import { resetPasswordByPhoneno,getTpaState } from '@/api/login';
export default {
name: 'login',
@ -178,6 +180,7 @@ export default {
abledBut: false, //
setTimeNum: 60, //
timeWrap: null, //
wxLoginCodeVisible:false,
}
},
@ -190,10 +193,10 @@ export default {
}
},
sendPhonenoSmsCode(){
sendPhonenoSmsCode(scene){
var params={
phoneno:this.loginForm.phoneno,
scene:"login"
scene:scene
}
sendSmsCode(params).then(res=>{
if(res.data.tips.isOk){
@ -265,33 +268,14 @@ export default {
loginParams.branchId=params.branchId
}
this.$store.dispatch("LoginByUserloginid",loginParams).then(res => {
this.loading = false
this.loading = false
if(res.data.tips.isOk==true){
this.loading = true;
this.$store.dispatch('GetUserInfo').then((res2)=>{
//this.userDeptid=res2.data.userInfo.deptid
this.$store.dispatch('GetUserInfo').then((res2)=>{
this.loading = false
if(res2.data.tips.isOk==true){
if(this.$store.state.user.myBranchs==null ||this.$store.state.user.myBranchs.length==0||this.$store.state.user.myDepts==null || this.$store.state.user.myDepts.length<=0){
//if(1==1){
//this.$message.error("\n ");
this.addBranchFormVisible=true;
}else if(this.$store.state.user.myDepts.length>1 ){
//this.$message.info("");
if( !this.userDeptid ){
this.userDeptid=res2.data.userInfo.deptid
this.deptSelectVisible=true;
}else{
this.rolesChecked();
}
//this.$router.push({ path: 'mdp/sys/branch/BranchAdd' })
}else if(this.$store.state.user.myDepts.length==1){
//
if(res2.data.tips.isOk==true){
this.userDeptid=res2.data.userInfo.deptid
this.rolesChecked();
}else{
this.rolesChecked();
}
this.rolesChecked();
}else{
this.$message.error(res2.data.tips.msg);
}
@ -343,6 +327,28 @@ export default {
this.addBranchFormVisible=false;
this.handleLogin();
},
weixinLogin(){
var curlDomain=window.location.protocol+"//"+window.location.host; //
var mdpRedirectUri=curlDomain+"/"+process.env.CONTEXT+"/"+process.env.VERSION+"/"
getTpaState().then(res=>{
var tips = res.data.tips;
if(tips.isOk){
this.wxLoginCodeVisible=true;
var state=res.data.data
var obj = new WxLogin({
self_redirect:false,
id:"login_container",
appid: "wx2671d5db8346b6fc",
scope: "snsapi_login",
redirect_uri: encodeURIComponent("https://www.maimengcloud.com/api/m1/tpa/login/token?authType=wechat_wxpub&authId=mmxmcloud_wxopen_pc&redirectUri="+mdpRedirectUri),
state: state,
style: "",
href: ""
});
}
})
},
afterQRScan() {
// const hash = window.location.hash.slice(1)
@ -369,6 +375,12 @@ export default {
destroyed() {
// window.removeEventListener('hashchange', this.afterQRScan)
},
mounted(){
const s = document.createElement('script');
s.type = 'text/javascript';
s.src = 'https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js';
document.body.appendChild(s);
}
}

33
src/views/login/components/register.vue

@ -10,7 +10,10 @@
<el-form-item prop="smsCode">
<el-input class="inp smsCode" name="smsCode" type="text" v-model="loginForm.smsCode" autoComplete="on" placeholder="短信验证码">
</el-input>
<el-button class="sendCode" @click.prevent="sendPhonenoSmsCode"><span class="text">发送验证码</span></el-button>
<el-button class="sendCode" @click.prevent="sendPhonenoSmsCode"><span class="text">发送验证码</span></el-button>
<span v-if="phonenoUsers!=null && phonenoUsers.length>0"> 该手机号已注册有{{phonenoUsers.length}}个账户<font color="blue"></font>
<el-button type="text" @click="phonenoUsersVisible=true">查看明细</el-button>
</span>
</el-form-item>
<el-form-item prop="username">
@ -36,6 +39,23 @@
</el-form>
<el-dialog
title="查看已有账户"
:visible.sync="phonenoUsersVisible"
width="600" append-to-body>
<el-table :data="phonenoUsers">
<el-table-column prop="userid" label="编号">
</el-table-column>
<el-table-column prop="displayUserid" label="登录账号">
</el-table-column>
<el-table-column prop="username" label="姓名">
</el-table-column>
<el-table-column prop="branchName" label="企业">
</el-table-column>
</el-table>
</el-dialog>
</div>
</div>
@ -44,7 +64,7 @@
<script>
import { sendSmsCode } from '@/api/sms/sms';
import { checkPhoneno,checkDisplayUserid,doRegister } from '@/api/login';
import { checkPhoneno,checkDisplayUserid,doRegister,queryByUserloginid } from '@/api/login';
import LangSelect from '@/components/LangSelect';
import SocialSign from '../socialsignin';
import BranchAdd from '../BranchAdd';
@ -115,6 +135,8 @@ export default {
deptSelectVisible:false,//
userDeptid:'',//
addBranchFormVisible:false, //
phonenoUsers:[],
phonenoUsersVisible:false,
}
},
methods: {
@ -138,17 +160,18 @@ export default {
phoneno:this.loginForm.phoneno,
scene:"register"
}
checkPhoneno(this.loginForm.phoneno).then(res0=>{
queryByUserloginid({userloginid:this.loginForm.phoneno,idType:"phoneno"}).then(res0=>{
if(res0.data.tips.isOk){
this.phonenoUsers=res0.data.data;
sendSmsCode(params).then(res=>{
if(res.data.tips.isOk){
this.$message.success(res.data.tips.msg);
this.$message.success("发送成功");
}else{
this.$message.error(res.data.tips.msg);
}
})
}else{
this.$message.error("手机号码已存在,不允许注册,请直接登录");
this.$message.error(res0.data.tips.msg);
}
})

539
src/views/login/index.vue

@ -1,509 +1,62 @@
<template>
<div class="login-container">
<el-form class="login-form" autoComplete="on" :model="loginForm" :rules="loginRules" ref="loginForm">
<div class="title-container">
<div class="logo">
<img src="../../assets/image/logo1.png" alt="" />
<div class="logo-text">
<div class="main-title">{{$t('login.title')}}</div>
</div>
</div>
<lang-select class="set-language"></lang-select>
</div>
<el-form-item prop="authType">
<el-radio-group v-model="loginForm.authType">
<el-radio label="password_display_userid">账户密码</el-radio>
<el-radio label="sms">短信验证码快速登录</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="userloginid" v-show="loginForm.authType=='password_display_userid'">
<el-input title="登陆账号" name="userloginid" type="text" v-model="loginForm.userloginid" autoComplete="on" placeholder="用户编号" >
<template slot="prepend">账号</template>
</el-input>
</el-form-item>
<el-form-item prop="password" v-show="loginForm.authType=='password_display_userid'">
<el-input name="password" :type="passwordType" @keyup.enter.native="handleLogin" v-model="loginForm.password" autoComplete="on" placeholder="password">
<template slot="prepend">密码</template>
<span slot="append" class="show-pwd" @click="showPwd">
<svg-icon icon-class="eye" />
</span>
</el-input>
</el-form-item>
<el-form-item prop="phoneno" v-show="loginForm.authType=='sms'">
<el-input name="phoneno" type="text" v-model="loginForm.phoneno" autoComplete="on" placeholder="手机号码">
<template slot="prepend">手机号码&nbsp;&nbsp;&nbsp;</template>
<el-button slot="append" @click.prevent="sendPhonenoSmsCode" v-loading="load.sendSmsCode">发送验证码</el-button>
</el-input>
<span v-if="users!=null && users.length>0"> 该手机号有{{users.length}}个账户,请选择需要登录的账户<font color="blue"></font>
<br>
<el-tag v-if="selectUser && selectUser.userid">已选择:{{selectUser.username}}</el-tag> <el-button type="text" @click="phonenoUsersVisible=true">选择账户</el-button>
</span>
</el-form-item>
<el-form-item prop="smsCode" v-show="loginForm.authType=='sms'">
<el-input name="smsCode" type="text" v-model="loginForm.smsCode" autoComplete="on" placeholder="短信验证码">
<template slot="prepend">短信验证码</template>
<template slot="append">六位验证码</template>
</el-input>
</el-form-item>
<el-button type="primary" style="width:100%;margin-bottom:30px;" :loading="loading" @click.native.prevent="handleLogin">{{$t('login.logIn')}}</el-button>
<el-row>
<el-button type="success" plain round @click="showRegisterDialog=true">新用户注册</el-button>
<el-button type="warning" plain round @click="showResetPasswordDialog=true">忘记密码</el-button>
<el-button type="primary" plain round @click="showTpLoginDialog=true">{{$t('login.thirdparty')}}</el-button>
</el-row>
</el-form>
<el-dialog
title="请选择一个部门进行登陆"
:visible.sync="deptSelectVisible"
width="screenWidth<500?'90%':'500px" append-to-body>
<el-row class="app-container">
<el-col :span=20 v-for="(d,index) in myDepts" :key="index">
<el-col :span=20><el-radio v-model="userDeptid" :label="d.deptid">{{d.deptName}}({{d.branchName}}) </el-radio> </el-col>
</el-col>
</el-row >
<el-row class="app-container" style="text-align:right;">
<el-col :span=20 >
<el-button @click="deptSelectVisible = false"> </el-button>
<el-button type="primary" @click="deptChecked"> </el-button>
</el-col>
</el-row >
</el-dialog>
<!-- 第三方登陆窗口 -->
<el-dialog :title="$t('login.thirdparty')" :visible.sync="showTpLoginDialog" append-to-body>
{{$t('login.thirdpartyTips')}}
<br/>
<br/>
<br/>
<social-sign />
</el-dialog>
<!-- 注册窗口 -->
<el-dialog title="新用户注册" :visible.sync="showRegisterDialog" append-to-body>
<register />
</el-dialog>
<!-- 重置密码窗口 -->
<el-dialog title="重置密码" :visible.sync="showResetPasswordDialog" append-to-body>
<reset-password />
</el-dialog>
<!--新增 Branch 管理端机构表机构下面若干部门界面-->
<el-dialog title="新增机构" :visible.sync="addBranchFormVisible" width="50%" :close-on-click-modal="false" append-to-body>
<branch-add :visible="addBranchFormVisible" @cancel="addBranchFormVisible=false" @submit="afterAddBranchSubmit"></branch-add>
</el-dialog>
<el-dialog
title="查看已有账户"
:visible.sync="phonenoUsersVisible"
width="600" append-to-body>
<el-table :data="users">
<el-table-column prop="userid" label="编号">
</el-table-column>
<el-table-column prop="displayUserid" label="登录账号">
</el-table-column>
<el-table-column prop="username" label="姓名">
</el-table-column>
<el-table-column prop="branchName" label="企业">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button type="primary" @click="onUserSelect(scope.row)">选中</el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
<div class="login_container">
<div class="login_content">
<div class="left">
</div>
<div class="right">
<div class="logo">
<img src="@/assets/image/logo1.png">
<span>唛盟</span>
</div>
<div class="login_box">
<div class="login_box_content">
<div class="top">
<h2>平台{{status == 'register' ? '注册' : '登录' }}</h2>
<span v-if="status == 'login'" >没有账号?<a style="color:#409EFF;" @click="status = 'register' ">点此注册</a> </span>
<span v-else>已有账号<a style="color:#409EFF;" @click="status = 'login' ">点此登录</a> </span>
</div>
<login-form v-if="status == 'login'"></login-form>
<register-form v-else></register-form>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { sendSmsCode } from '@/api/sms/sms';
import LangSelect from '@/components/LangSelect';
import SocialSign from './socialsignin';
import Register from './register';
import ResetPassword from './resetPassword';
import { queryByUserloginid } from '@/api/login';
import BranchAdd from './BranchAdd';
import { mapGetters } from 'vuex';
import md5 from 'js-md5';
<script>
import loginForm from './components/login';
import registerForm from './components/register';
export default {
components: { LangSelect, SocialSign, BranchAdd, Register,ResetPassword},
name: 'login',
data() {
const validateDisplayUserid = (rule, value, callback) => {
if (this.loginForm.authType=='password_display_userid') {
if(value.length<=6){
callback(new Error('请输入6位以上用户账号'))
}else{
callback()
}
} else {
callback()
}
}
const validatePassword = (rule, value, callback) => {
if (this.loginForm.authType=='password_display_userid') {
if(value.length<6){
callback(new Error('密码最少为六位'))
}else{
callback()
}
} else {
callback()
}
}
const validatePhoneno = (rule, value, callback) => {
if (this.loginForm.authType=='sms') {
if(value.length !=11 ){
callback(new Error('手机号码必须为11位号码'))
}else{
callback()
}
} else {
callback()
}
}
const validateSmsCode = (rule, value, callback) => {
if (this.loginForm.authType=='sms') {
if(value.length !=6 ){
callback(new Error('请输入6位短信验证码'))
}else{
callback()
}
} else {
callback()
}
}
return {
loginForm: {
userloginid: '',
password: '',
authType:'password_display_userid',//password/sms/password_display_userid
phoneno:'',//
smsCode:'',//
},
loginRules: {
userloginid: [{ required: true, trigger: 'blur', validator: validateDisplayUserid }],
password: [{ required: true, trigger: 'blur', validator: validatePassword }],
phoneno: [{ required: true, trigger: 'blur', validator: validatePhoneno }],
smsCode: [{ required: true, trigger: 'blur', validator: validateSmsCode }],
},
passwordType: 'password',
loading: false,
load:{sendSmsCode:false,},
showResetPasswordDialog:false,//
showTpLoginDialog: false, //
showRegisterDialog: false,//
deptSelectVisible:false,//
userDeptid:'',//
addBranchFormVisible:false, //
users:[],
phonenoUsersVisible:false,
selectUser:null,
}
},
methods: {
showPwd() {
if (this.passwordType === 'password') {
this.passwordType = ''
} else {
this.passwordType = 'password'
}
},
sendPhonenoSmsCode(){
this.load.sendSmsCode=true;
this.$refs.loginForm.validateField("phoneno",(err)=>{
if(err){
this.$message.error(err);
this.load.sendSmsCode=false;
return;
}else{
var params={
phoneno:this.loginForm.phoneno,
scene:"login"
}
sendSmsCode(params).then(res=>{
this.load.sendSmsCode=false;
if(res.data.tips.isOk){
this.$message.success(res.data.tips.msg);
this.queryByUserloginid();
}else{
this.$message.error(res.data.tips.msg);
}
}).catch(()=>this.load.sendSmsCode=false)
name: 'login',
components: {loginForm, registerForm},
data() {
return {
status: "login",
}
});
},
handleLogin() {
this.$refs.loginForm.validate(valid => {
if (valid) {
this.loading = true
let params={
userloginid:this.loginForm.userloginid,
password:md5(this.loginForm.password),
deptid:this.userDeptid,
authType:this.loginForm.authType,
phoneno:this.loginForm.phoneno,
smsCode:this.loginForm.smsCode
}
var loginParams={ }
if(params.authType=='password_display_userid'){
loginParams.userloginid=params.userloginid
loginParams.password=params.password
loginParams.grantType="password"
loginParams.authType='password_display_userid'
loginParams.deptid=params.deptid
}else if(params.authType=='sms'){
loginParams.userloginid=params.phoneno
loginParams.password=params.smsCode
loginParams.grantType="password"
loginParams.authType="sms"
loginParams.deptid=params.deptid
}
if(this.selectUser){
loginParams.userid=this.selectUser.userid
}
this.$store.dispatch("LoginByUserloginid",loginParams).then(res => {
this.loading = false
if(res.data.tips.isOk==true){
console.log(this.$store);
this.loading = true;
this.$store.dispatch('GetUserInfo').then((res2)=>{
//this.userDeptid=res2.data.userInfo.deptid
this.loading = false
if(res2.data.tips.isOk==true){
if(this.$store.state.user.myDepts.length>1 ){
//this.$message.info("");
if( !this.userDeptid ){
this.userDeptid=res2.data.userInfo.deptid
this.deptSelectVisible=true;
}else{
this.rolesChecked();
}
//this.$router.push({ path: 'mdp/sys/branch/BranchAdd' })
}else if(this.$store.state.user.myDepts.length==1){
//
this.userDeptid=res2.data.userInfo.deptid
this.rolesChecked();
}else{
this.rolesChecked();
}
}else{
this.$message.error(res2.data.tips.msg);
}
}).catch(err=>{
console.log(err);
this.loading = false
});
}else{
this.$message.error(res.data.tips.msg);
}
}).catch((e) => {
console.log(e);
this.loading = false
})
} else {
console.log('error submit!!')
return false
}
})
methods: {
},
deptChecked() {
if( !this.userDeptid){
this.$message.error("请选择登陆的部门")
return
}
let depts=this.myDepts.filter(d=>d.deptid==this.userDeptid)
if(this.$store.state.user.userInfo.deptid!=this.userDeptid){
this.handleLogin();
return;
}else{
this.rolesChecked();
}
created() {
},
//
rolesChecked(){
if(this.userInfo.isSuperAdmin){
this.$router.push({ path: '/' });
this.$message.info("欢迎登陆,超级管理员");
}else if(this.userInfo.isPlatformAdmin){
this.$router.push({ path: '/' });
this.$message.info("欢迎登陆,平台管理员");
}else{
this.$router.push({ path: '/' });
this.$message.info("欢迎登陆");
}
},
afterAddBranchSubmit(branch){
this.addBranchFormVisible=false;
this.handleLogin();
},
afterQRScan() {
// const hash = window.location.hash.slice(1)
// const hashObj = getQueryObject(hash)
// const originUrl = window.location.origin
// history.replaceState({}, '', originUrl)
// const codeMap = {
// wechat: 'code',
// tencent: 'code'
// }
// const codeName = hashObj[codeMap[this.auth_type]]
// if (!codeName) {
// alert('')
// } else {
// this.$store.dispatch('LoginByThirdparty', codeName).then(() => {
// this.$router.push({ path: '/' })
// })
// }
},
queryByUserloginid(){
var params={userloginid:this.loginForm.userloginid}
if(this.loginForm.authType=='sms'){
params.idType="phoneno"
}else{
params.idType='all'
}
queryByUserloginid(params).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
this.users=res.data.data
}
})
destroyed() {
},
onUserSelect(user){
this.selectUser=user
this.phonenoUsersVisible=false;
}
},
created() {
// window.addEventListener('hashchange', this.afterQRScan)
},
destroyed() {
// window.removeEventListener('hashchange', this.afterQRScan)
},
computed: {
...mapGetters([
'myBranchs','myDepts','userInfo','roles'
]),
screenWidth:function(){
return screen.width;
},
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
$bg:#2d3a4b;
$dark_gray:#889aa4;
$light_gray:#ef1010;
<style lang="scss" scoped>
@import './index.scss';
</style>
.login-container {
position:absolute;
height: 100%;
width: 100%;
background-color: $bg;
background-size: 100%;
background:url(../../assets/image/yxin_login_backgroup_pc.png) center center;
.login-form {
position: absolute;
left: 0;
right: 0;
max-width: 520px;
padding: 35px 35px 15px 35px;
margin: 180px auto;
border-radius: 20px;
background-color:#f5f7faee;
}
.tips {
font-size: 14px;
color: #fff;
margin-bottom: 10px;
span {
&:first-of-type {
margin-right: 16px;
}
}
}
.svg-container {
padding: 6px 5px 6px 15px;
color: $dark_gray;
vertical-align: middle;
width: 30px;
display: inline-block;
&_login {
font-size: 20px;
}
}
.title-container {
position: relative;
.title {
font-size: 26px;
font-weight: 400;
color: $light_gray;
margin: 0px auto 40px auto;
text-align: center;
font-weight: bold;
}
.set-language {
color: rgb(95, 41, 221);
position: absolute;
top: 5px;
right: 0px;
}
}
.show-pwd {
position: absolute;
right: 10px;
top: 7px;
font-size: 16px;
color: $dark_gray;
cursor: pointer;
user-select: none;
}
.thirdparty-button {
position: absolute;
right: 35px;
bottom: 28px;
}
.register-button {
position: absolute;
bottom: 28px;
}
}
.logo {
height: 100px;
width: 100%;
// padding: 0 20px;
display: flex;
align-items: left;
justify-content: center;
img {
height: 100%;
}
.logo-text {
display: flex;
align-items: center;
justify-content: center;
color: $light_gray;
.main-title {
font-size: 35px;
font-weight: 400;
color: $light_gray;
text-align: center;
font-weight: bold;
}
}
}
</style>

61
src/views/login/index2.vue

@ -1,61 +0,0 @@
<template>
<div class="login_container">
<div class="login_content">
<div class="left">
</div>
<div class="right">
<div class="logo">
<img src="@/assets/image/logo1.png">
<span>唛盟</span>
</div>
<div class="login_box">
<div class="login_box_content">
<div class="top">
<h2>平台{{status == 'register' ? '注册' : '登录' }}</h2>
<span v-if="status == 'login'" >没有账号?<a style="color:#409EFF;" @click="status = 'register' ">点此注册</a> </span>
<span v-else>已有账号<a style="color:#409EFF;" @click="status = 'login' ">点此登录</a> </span>
</div>
<login-form v-if="status == 'login'"></login-form>
<register-form v-else></register-form>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import loginForm from './components/login';
import registerForm from './components/register';
export default {
name: 'login',
components: {loginForm, registerForm},
data() {
return {
status: "login",
}
},
methods: {
},
created() {
},
destroyed() {
},
}
</script>
<style lang="scss" scoped>
@import './index.scss';
</style>

378
src/views/login/register.vue

@ -1,378 +0,0 @@
<template>
<div>
<el-form autoComplete="on" label-width="120px" :model="loginForm" :rules="loginRules" ref="loginForm">
<div>
<div class="logo">
<img src="../../assets/image/logo1.png" alt="" />
<div class="logo-text">
<div class="systemName">{{$t('login.title')}}</div>
</div>
</div>
</div>
<el-form-item prop="phoneno" label="手机号码">
<el-input name="phoneno" type="text" v-model="loginForm.phoneno" autoComplete="on" placeholder="手机号码">
<span slot="append"> <el-button @click.prevent="sendPhonenoSmsCode" v-loading="load.sendSmsCode">发送验证码</el-button> </span>
</el-input>
<span v-if="phonenoUsers!=null && phonenoUsers.length>0"> 该手机号已注册有{{phonenoUsers.length}}个账户<font color="blue"></font>
<el-button type="text" @click="phonenoUsersVisible=true">查看明细</el-button>
</span>
</el-form-item>
<el-form-item prop="smsCode" label="短信验证码">
<el-input name="smsCode" type="text" v-model="loginForm.smsCode" autoComplete="on" placeholder="短信验证码">
<template slot="append">六位验证码</template>
</el-input>
</el-form-item>
<el-form-item prop="username" label="用户名称">
<el-input name="username" type="text" v-model="loginForm.username" autoComplete="on" placeholder="用户名称" >
</el-input>
</el-form-item>
<el-form-item prop="displayUserid" label="账号">
<el-input name="displayUserid" type="text" v-model="loginForm.displayUserid" autoComplete="on" placeholder="用户编号" >
<el-button slot="append" @click.prevent="checkDisplayUserid">检测是否已注册</el-button>
</el-input>
</el-form-item>
<el-form-item prop="password" label="密码">
<el-input name="password" :type="passwordType" @keyup.enter.native="handleLogin" v-model="loginForm.password" autoComplete="on" placeholder="password">
<span slot="append" class="show-pwd" @click="showPwd">
<svg-icon icon-class="eye" />
</span>
</el-input>
</el-form-item>
<el-button type="primary" style="width:100%;margin-bottom:30px;" :loading="loading" @click.native.prevent="handleRegister">注册</el-button>
</el-form>
<el-dialog
title="请选择一个部门进行登陆"
:visible.sync="deptSelectVisible"
width="screenWidth<500?'90%':'500px" append-to-body>
<el-row class="app-container">
<el-col :span=20 v-for="(d,index) in myDepts" :key="index">
<el-col :span=20><el-radio v-model="userDeptid" :label="d.deptid">{{d.deptName}}({{d.branchName}}) </el-radio> </el-col>
</el-col>
</el-row >
<el-row class="app-container" style="text-align:right;">
<el-col :span=20 >
<el-button @click="deptSelectVisible = false"> </el-button>
<el-button type="primary" @click="deptChecked"> </el-button>
</el-col>
</el-row >
</el-dialog>
<el-dialog
title="查看已有账户"
:visible.sync="phonenoUsersVisible"
width="600" append-to-body>
<el-table :data="phonenoUsers">
<el-table-column prop="userid" label="编号">
</el-table-column>
<el-table-column prop="displayUserid" label="登录账号">
</el-table-column>
<el-table-column prop="username" label="姓名">
</el-table-column>
<el-table-column prop="branchName" label="企业">
</el-table-column>
</el-table>
</el-dialog>
<!-- 第三方登陆窗口 -->
<el-dialog :title="$t('login.thirdparty')" :visible.sync="showTpLoginDialog" append-to-body>
{{$t('login.thirdpartyTips')}}
<br/>
<br/>
<br/>
<social-sign />
</el-dialog>
<!--新增 Branch 管理端机构表机构下面若干部门界面-->
<el-dialog title="新增机构" :visible.sync="addBranchFormVisible" width="50%" :close-on-click-modal="false" append-to-body>
<branch-add :visible="addBranchFormVisible" @cancel="addBranchFormVisible=false" @submit="afterAddBranchSubmit"></branch-add>
</el-dialog>
</div>
</template>
<script>
import { sendSmsCode } from '@/api/sms/sms';
import { checkPhoneno,checkDisplayUserid,doRegister,queryByUserloginid } from '@/api/login';
import LangSelect from '@/components/LangSelect';
import SocialSign from './socialsignin';
import BranchAdd from './BranchAdd';
import { mapGetters } from 'vuex';
import md5 from 'js-md5';
export default {
components: { LangSelect, SocialSign, BranchAdd },
name: 'login',
data() {
const validateDisplayUserid = (rule, value, callback) => {
if( !value || value.length<=6){
callback(new Error('请输入6位以上用户账号'))
}else{
callback()
}
}
const validatePassword = (rule, value, callback) => {
if( !value || value.length<6){
callback(new Error('密码最少为六位'))
}else{
callback()
}
}
const validatePhoneno = (rule, value, callback) => {
if( !value || value.length !=11 ){
callback(new Error('手机号码必须为11位号码'))
}else{
callback()
}
}
const validateSmsCode = (rule, value, callback) => {
if( !value || value.length !=6 ){
callback(new Error('请输入6位短信验证码'))
}else{
callback()
}
}
const validateUsername = (rule, value, callback) => {
if( !value || value.length <2 ){
callback(new Error('请输入用户名称'))
}else{
callback()
}
}
return {
loginForm: {
username:'',
displayUserid: '',
password: '',
authType:'password_display_userid',//password/sms/password_display_userid
phoneno:'',//
smsCode:'',//
},
loginRules: {
username: [{ required: true, trigger: 'blur', validator: validateUsername }],
displayUserid: [{ required: true, trigger: 'blur', validator: validateDisplayUserid }],
password: [{ required: true, trigger: 'blur', validator: validatePassword }],
phoneno: [{ required: true, trigger: 'blur', validator: validatePhoneno }],
smsCode: [{ required: true, trigger: 'blur', validator: validateSmsCode }],
},
passwordType: 'password',
loading: false,
load:{sendSmsCode:false,},
showTpLoginDialog: false, //
deptSelectVisible:false,//
userDeptid:'',//
addBranchFormVisible:false, //
phonenoUsers:[],//
phonenoUsersVisible:false,
}
},
methods: {
showPwd() {
if (this.passwordType === 'password') {
this.passwordType = ''
} else {
this.passwordType = 'password'
}
},
sendPhonenoSmsCode(){
this.load.sendSmsCode=true;
if(!this.loginForm.phoneno){
this.$message.error("手机号码不能为空");
this.load.sendSmsCode=false;
return;
}
if(this.loginForm.phoneno.length !=11 ){
this.$message.error("手机号码必须为11位");
this.load.sendSmsCode=false;
return;
}
var params={
phoneno:this.loginForm.phoneno,
scene:"register"
}
queryByUserloginid({userloginid:this.loginForm.phoneno,idType:"phoneno"}).then(res0=>{
this.load.sendSmsCode=false;
if(res0.data.tips.isOk){
this.phonenoUsers=res0.data.data;
sendSmsCode(params).then(res=>{
if(res.data.tips.isOk){
this.$message.success(res.data.tips.msg);
}else{
this.$message.error(res.data.tips.msg);
}
})
}
}).catch(err=> this.load.sendSmsCode=false)
/**
checkPhoneno(this.loginForm.phoneno).then(res0=>{
if(res0.data.tips.isOk){
sendSmsCode(params).then(res=>{
if(res.data.tips.isOk){
this.$message.success(res.data.tips.msg);
}else{
this.$message.error(res.data.tips.msg);
}
})
}else{
this.$message.error("手机号码已存在,不允许注册,请直接登录");
}
})
*/
},
checkPhonenoUsers(){
queryByUserloginid({userloginid:this.loginForm.phoneno,idType:"phoneno",atype:'1'}).then(res0=>{
if(res0.data.tips.isOk){
this.phonenoUsers=res0.data.data;
}
})
},
checkDisplayUserid(){
if(!this.loginForm.displayUserid){
this.$message.error("账号不能为空");
return;
}
checkDisplayUserid(this.loginForm.displayUserid).then(res0=>{
if(res0.data.tips.isOk){
this.$message.success("该账户可以注册");
}else{
this.$message.error("该账户已存在,不允许再注册!");
}
})
},
handleRegister() {
this.loading = true
this.$refs.loginForm.validate(valid => {
if (valid) {
let params={
displayUserid:this.loginForm.displayUserid,
password:md5(this.loginForm.password),
deptid:this.userDeptid,
phoneno:this.loginForm.phoneno,
smsCode:this.loginForm.smsCode,
username:this.loginForm.username,
}
doRegister(params).then(res=>{
this.loading = false
if(res.data.tips.isOk){
this.$message.success(res.data.tips.msg);
}else{
this.$message.error(res.data.tips.msg);
}
})
} else {
this.loading = false
return false
}
})
},
deptChecked() {
if( !this.userDeptid){
this.$message.error("请选择登陆的部门")
return
}
let depts=this.myDepts.filter(d=>d.deptid==this.userDeptid)
if(this.$store.state.user.userInfo.deptid!=this.userDeptid){
this.handleLogin();
return;
}else{
this.rolesChecked();
}
},
//
rolesChecked(){
if(this.userInfo.isSuperAdmin){
this.$router.push({ path: '/' });
this.$message.info("欢迎登陆,超级管理员");
}else if(this.userInfo.isPlatformAdmin){
this.$router.push({ path: '/' });
this.$message.info("欢迎登陆,平台管理员");
}else{
this.$router.push({ path: '/' });
this.$message.info("欢迎登陆");
}
},
afterAddBranchSubmit(branch){
this.addBranchFormVisible=false;
this.loading=true
this.$store.dispatch('GetUserInfo').then((res)=>{
this.userDeptid=res.data.userInfo.deptid
this.loading = false;
//
this.rolesChecked();
});
},
afterQRScan() {
// const hash = window.location.hash.slice(1)
// const hashObj = getQueryObject(hash)
// const originUrl = window.location.origin
// history.replaceState({}, '', originUrl)
// const codeMap = {
// wechat: 'code',
// tencent: 'code'
// }
// const codeName = hashObj[codeMap[this.auth_type]]
// if (!codeName) {
// alert('')
// } else {
// this.$store.dispatch('LoginByThirdparty', codeName).then(() => {
// this.$router.push({ path: '/' })
// })
// }
}
},
created() {
// window.addEventListener('hashchange', this.afterQRScan)
},
destroyed() {
// window.removeEventListener('hashchange', this.afterQRScan)
},
computed: {
...mapGetters([
'myBranchs','myDepts','userInfo','roles'
]),
screenWidth:function(){
return screen.width;
},
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
$bg:#2d3a4b;
$dark_gray:#889aa4;
$light_gray:#ef1010;
.logo {
height: 100px;
width: 100%;
// padding: 0 20px;
display: flex;
align-items: left;
justify-content: center;
img {
height: 100%;
}
.logo-text {
display: flex;
align-items: center;
justify-content: center;
color: $light_gray;
.systemName {
font-size: 35px;
font-weight: 400;
color: $light_gray;
text-align: center;
font-weight: bold;
}
}
}
</style>

182
src/views/mdp/sys/branch/BranchEdit.vue

@ -0,0 +1,182 @@
<template>
<section>
<el-row ref="table">
<!--编辑界面 Branch 管理端机构表机构下面若干部门-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editFormRef">
<el-form-item label="机构编号" prop="id" v-if="opType==='add'">
<el-input v-model="editForm.id" placeholder="机构编号,如果不填写将后台自动生成" :maxlength="50" :disabled="branch.id"></el-input>
<br><font color="red">机构号将作为该机构的管理员登录账号</font>
</el-form-item>
<el-form-item label="机构名称" prop="branchName">
<el-input v-model="editForm.branchName" placeholder="机构名称" :maxlength="50">
<template slot="prepend" v-if="opType==='edit'">
{{editForm.id}}
</template>
</el-input>
</el-form-item>
<el-form-item label="是否可用" prop="enabled" v-if="opType==='edit'">
<el-select v-model="editForm.enabled">
<el-option v-for="(item,index) in dicts['enabled']" :value="item.id" :label="item.name" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="行业分类" prop="industryCategory">
<el-select v-model="editForm.industryCategory">
<el-option v-for="(item,index) in dicts['industryCategory']" :value="item.id" :label="item.name" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="创建日期" prop="cdate" v-if="opType==='edit'">
<el-date-picker type="date" placeholder="选择日期" v-model="editForm.cdate" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd"></el-date-picker>
</el-form-item>
<el-form-item label="联系人姓名" prop="lusername">
<el-input v-model="editForm.lusername" placeholder="联系人姓名" :maxlength="255"></el-input>
</el-form-item>
<el-form-item label="联系电话" prop="lphoneNo">
<el-input v-model="editForm.lphoneNo" placeholder="联系电话" :maxlength="50"></el-input>
</el-form-item>
<el-form-item label="联系邮箱" prop="emaill">
<el-input v-model="editForm.emaill" placeholder="联系邮箱" :maxlength="50"></el-input>
</el-form-item>
<el-form-item label="管理员" prop="admUserid">
账号:&nbsp;<font style="font-size:10px;">{{editForm.admUserid}}</font> &nbsp; &nbsp;名称&nbsp; <font style="font-size:10px;">{{editForm.admUsername}} </font>&nbsp;登录密码<font style="font-size:10px;">{{opType==='add'?'888888':'*****'}}</font>
<br><font color="blue">管理员账户具有最高权限仅作为内部管理权限使用账户编号与机构号相同不可修改</font>
</el-form-item>
<el-form-item label="公司地址" prop="address" v-if="opType==='edit'">
<el-input v-model="editForm.address" placeholder="公司地址" :maxlength="255"></el-input>
</el-form-item>
</el-form>
</el-row>
<el-row>
<el-button @click.native="handleCancel">取消</el-button>
<el-button v-loading="load.edit" type="primary" @click.native="saveSubmit" :disabled="load.edit==true">提交</el-button>
</el-row>
</section>
</template>
<script>
import util from '@/common/js/util';//
import config from "@/common/config"; //import
import { initDicts, addBranch,editBranch } from '@/api/mdp/sys/branch';
import { mapGetters } from 'vuex'
export default {
name:'branchEdit',
components: {
},
computed: {
...mapGetters([ 'userInfo' ]),
},
props:['branch','visible','opType'],
watch: {
'branch':function( branch ) {
if(branch){
this.editForm = {...branch};
}
},
'editForm.id':function( val ) {
this.editForm.admUserid =val;
},
'editForm.branchName':function( val ) {
this.editForm.admUsername =val+'管理员';
},
'visible':function(visible) {
if(visible==true){
this.initData()
}
}
},
data() {
return {
currOpType:'add',//add/edit
load:{ list: false, edit: false, del: false, add: false },//...
dicts:{
industryCategory:[],
enabled:[],
},// params={categoryId:'all',itemCodes:['sex']} {sex: [{id:'1',name:''},{id:'2',name:''}]}
editFormRules: {
branchName: [
{ required: true, message: '机构名称不能为空', trigger: 'blur' }
]
},
editForm: {
id:'',branchName:'',enabled:'',industryCategory:'',cuserid:'',cdate:'',cusername:'',lphoneNo:'',emaill:'',bizProcInstId:'',bizFlowState:'',pbranchId:'',admUserid:'',admUsername:'',lusername:'',luserid:'',address:''
},
maxTableHeight:300,
}//end return
},//end data
methods: {
...util,
// @cancel="editFormVisible=false"
handleCancel:function(){
this.$refs['editFormRef'].resetFields();
this.$emit('cancel');
},
//Branch @submit="afterEditSubmit"
saveSubmit: function () {
this.$refs.editFormRef.validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.load.edit=true
let params = Object.assign({}, this.editForm);
var func=addBranch
if(this.currOpType=='edit'){
func=editBranch
}
func(params).then((res) => {
this.load.edit=false
var tips=res.data.tips;
if(tips.isOk){
this.editForm=res.data.data
this.initData()
this.currOpType="edit";
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);
});
}else{
this.$notify({ showClose:true, message: "表单验证不通过,请修改表单数据再提交", type: 'error' });
}
});
},
initData: function(){
this.currOpType=this.opType
if(this.branch){
this.editForm = Object.assign({},this.branch);
}
if(this.opType=='edit'){
}else{
this.editForm.cuserid=this.userInfo.userid
this.editForm.cusername=this.userInfo.username
this.editForm.luserid=this.userInfo.userid
this.editForm.lusername=this.userInfo.username
this.editForm.lphoneNo=this.userInfo.phoneno
this.editForm.email=this.userInfo.email
this.editForm.enabled="0"
}
},
},//end method
mounted() {
this.$nextTick(() => {
initDicts(this);
this.initData()
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el)
});
}
}
</script>
<style scoped>
</style>

182
src/views/myWork/set/BranchEdit.vue

@ -0,0 +1,182 @@
<template>
<section>
<el-row ref="table">
<!--编辑界面 Branch 管理端机构表机构下面若干部门-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editFormRef">
<el-form-item label="机构编号" prop="id" v-if="opType==='add'">
<el-input v-model="editForm.id" placeholder="机构编号,如果不填写将后台自动生成" :maxlength="50" :disabled="branch.id"></el-input>
<br><font color="red">机构号将作为该机构的管理员登录账号</font>
</el-form-item>
<el-form-item label="机构名称" prop="branchName">
<el-input v-model="editForm.branchName" placeholder="机构名称" :maxlength="50">
<template slot="prepend" v-if="opType==='edit'">
{{editForm.id}}
</template>
</el-input>
</el-form-item>
<el-form-item label="是否可用" prop="enabled" v-if="opType==='edit'">
<el-select v-model="editForm.enabled">
<el-option v-for="(item,index) in dicts['enabled']" :value="item.id" :label="item.name" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="行业分类" prop="industryCategory">
<el-select v-model="editForm.industryCategory">
<el-option v-for="(item,index) in dicts['industryCategory']" :value="item.id" :label="item.name" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="创建日期" prop="cdate" v-if="opType==='edit'">
<el-date-picker type="date" placeholder="选择日期" v-model="editForm.cdate" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd"></el-date-picker>
</el-form-item>
<el-form-item label="联系人姓名" prop="lusername">
<el-input v-model="editForm.lusername" placeholder="联系人姓名" :maxlength="255"></el-input>
</el-form-item>
<el-form-item label="联系电话" prop="lphoneNo">
<el-input v-model="editForm.lphoneNo" placeholder="联系电话" :maxlength="50"></el-input>
</el-form-item>
<el-form-item label="联系邮箱" prop="emaill">
<el-input v-model="editForm.emaill" placeholder="联系邮箱" :maxlength="50"></el-input>
</el-form-item>
<el-form-item label="管理员" prop="admUserid">
账号:&nbsp;<font style="font-size:10px;">{{editForm.admUserid}}</font> &nbsp; &nbsp;名称&nbsp; <font style="font-size:10px;">{{editForm.admUsername}} </font>&nbsp;登录密码<font style="font-size:10px;">{{opType==='add'?'888888':'*****'}}</font>
<br><font color="blue">管理员账户具有最高权限仅作为内部管理权限使用账户编号与机构号相同不可修改</font>
</el-form-item>
<el-form-item label="公司地址" prop="address" v-if="opType==='edit'">
<el-input v-model="editForm.address" placeholder="公司地址" :maxlength="255"></el-input>
</el-form-item>
</el-form>
</el-row>
<el-row>
<el-button @click.native="handleCancel">取消</el-button>
<el-button v-loading="load.edit" type="primary" @click.native="saveSubmit" :disabled="load.edit==true">提交</el-button>
</el-row>
</section>
</template>
<script>
import util from '@/common/js/util';//
import config from "@/common/config"; //import
import { initDicts, addBranch,editBranch } from '@/api/mdp/sys/branch';
import { mapGetters } from 'vuex'
export default {
name:'branchEdit',
components: {
},
computed: {
...mapGetters([ 'userInfo' ]),
},
props:['branch','visible','opType'],
watch: {
'branch':function( branch ) {
if(branch){
this.editForm = {...branch};
}
},
'editForm.id':function( val ) {
this.editForm.admUserid =val;
},
'editForm.branchName':function( val ) {
this.editForm.admUsername =val+'管理员';
},
'visible':function(visible) {
if(visible==true){
this.initData()
}
}
},
data() {
return {
currOpType:'add',//add/edit
load:{ list: false, edit: false, del: false, add: false },//...
dicts:{
industryCategory:[],
enabled:[],
},// params={categoryId:'all',itemCodes:['sex']} {sex: [{id:'1',name:''},{id:'2',name:''}]}
editFormRules: {
branchName: [
{ required: true, message: '机构名称不能为空', trigger: 'blur' }
]
},
editForm: {
id:'',branchName:'',enabled:'',industryCategory:'',cuserid:'',cdate:'',cusername:'',lphoneNo:'',emaill:'',bizProcInstId:'',bizFlowState:'',pbranchId:'',admUserid:'',admUsername:'',lusername:'',luserid:'',address:''
},
maxTableHeight:300,
}//end return
},//end data
methods: {
...util,
// @cancel="editFormVisible=false"
handleCancel:function(){
this.$refs['editFormRef'].resetFields();
this.$emit('cancel');
},
//Branch @submit="afterEditSubmit"
saveSubmit: function () {
this.$refs.editFormRef.validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.load.edit=true
let params = Object.assign({}, this.editForm);
var func=addBranch
if(this.currOpType=='edit'){
func=editBranch
}
func(params).then((res) => {
this.load.edit=false
var tips=res.data.tips;
if(tips.isOk){
this.editForm=res.data.data
this.initData()
this.currOpType="edit";
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);
});
}else{
this.$notify({ showClose:true, message: "表单验证不通过,请修改表单数据再提交", type: 'error' });
}
});
},
initData: function(){
this.currOpType=this.opType
if(this.branch){
this.editForm = Object.assign({},this.branch);
}
if(this.opType=='edit'){
}else{
this.editForm.cuserid=this.userInfo.userid
this.editForm.cusername=this.userInfo.username
this.editForm.luserid=this.userInfo.userid
this.editForm.lusername=this.userInfo.username
this.editForm.lphoneNo=this.userInfo.phoneno
this.editForm.email=this.userInfo.email
this.editForm.enabled="0"
}
},
},//end method
mounted() {
this.$nextTick(() => {
initDicts(this);
this.initData()
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el)
});
}
}
</script>
<style scoped>
</style>

163
src/views/myWork/set/ChangeEmailStepOne.vue

@ -0,0 +1,163 @@
<template>
<section>
<el-row class="padding" style="width:700px;">
<el-form :model="editForm" label-width="120px" ref="editForm">
<el-form-item label="更换步骤">
<el-steps :active="2" finish-status="success">
<el-step title="1 验证原邮箱"></el-step>
<el-step title="2 验证新邮箱"></el-step>
<el-step title="3 更换成功"></el-step>
</el-steps>
</el-form-item>
<el-form-item label="新邮箱" prop="email" :rules="[{required:true,message:'新邮箱不能为空'}]">
<el-input style="width:400px;" v-model="editForm.email" auto-complete="off"></el-input>
</el-form-item>
<el-form-item>
<el-button type="text" @click.native="doLogin" :loading="editLoading">登录</el-button> <el-button type="primary" @click.native="doChangeEmail" :loading="editLoading"></el-button>
</el-form-item>
</el-form>
</el-row>
</section>
</template>
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { sendEmail,validEmailCode } from '@/api/login';
import { mapGetters } from 'vuex'
export default {
computed: {
...mapGetters([
'userInfo'
])
},
props:['user'],
watch: {
'user':function(data) {
this.editForm=data;
},
},
data() {
var validatePhoneno = (rule, value, callback) => {
if (!value) {
callback();
} else {
if (value) {
if(value.length<11 || value.length>11){
callback(new Error('手机号码必须11位'));
}
if(!(/^1[3456789]\d{9}$/.test(value))){
callback(new Error('手机号码格式不正确'));
}
}
callback();
}
};
var validateEmail = (rule, value, callback) => {
if (value=='') {
callback();
} else {
if (value !== '') {
var reg = /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/;
if(!reg.test(value)){
callback(new Error('邮箱格式不正确'));
}
}
callback();
}
};
var validateIdCardNo = (rule, value, callback) => {
if (value === ''|| value==null) {
//callback(nPhonenoew Error(''));
callback();
}else {
if (value !== '' && value.length>15) {
var reg = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
if(!reg.test(value)){
callback(new Error('身份证号码格式不正确'));
}else{
callback();
}
}else if(value !== '' && value.length<15){
callback(new Error('请输入15位或者18位长度身份证号码'));
}else{
callback();
}
}
};
return {
validateEmail:validateEmail,
options:{},//
editLoading: false,
editFormRules: {
email: [
{ validator:validateEmail, trigger: 'blur' }
]
},
editForm:{
email:''
},
valiCode:'',//
}
},
methods: {
// @cancel="editFormVisible=false"
handleCancel:function(){
this.$emit('cancel');
},
doChangeEmail(){
this.$refs.editForm.validate((valid) => {
if (valid) {
this.changeEmail();
}
})
},
changeEmail(){
if(this.editForm.email){
var curlDomain=window.location.protocol+"//"+window.location.host+"/"+process.env.CONTEXT+"/"+process.env.VERSION;
sendEmail({codeScene:'3',codeEmail:this.editForm.email,userType:'staff',callbackUri:curlDomain+'/#/changeEmailStepTwo'}).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
this.$message({ message: "邮件已发送,请到收件箱收取邮件,并点击其链接进行验证新邮箱。", type: 'success' });
}else{
this.$message({ message: tips.msg, type: tips.isOk?'success':'error' });
}
})
}
},
validEmailCode(){
validEmailCode({valiCode:this.valiCode,userType:'staff'}).then(res=>{
var tips = res.data.tips;
this.$message({ message: tips.msg, type: tips.isOk?'success':'error' });
})
},
doLogin(){
this.$router.push({path: '/login' })
}
},
components: {
},
mounted() {
var valiCode=this.$route.query.valiCode;
//var valiCode=util.getQueryStringByName('valiCode');
if(valiCode){
this.valiCode=valiCode;
this.validEmailCode();
}
}
}
</script>
<style scoped>
</style>

109
src/views/myWork/set/ChangeEmailStepTwo.vue

@ -0,0 +1,109 @@
<template>
<section>
<el-row class="padding" style="width:700px;">
<el-form :model="editForm" label-width="120px" ref="editForm">
<el-form-item label="更换常用邮箱">
<el-steps :active="3" finish-status="success">
<el-step title="1 验证原邮箱"></el-step>
<el-step title="2 验证新邮箱"></el-step>
<el-step title="3 更换成功"></el-step>
</el-steps>
</el-form-item>
<el-form-item>
<el-button type="primary" @click.native="doLogin" :loading="editLoading">登录</el-button>
</el-form-item>
</el-form>
</el-row>
</section>
</template>
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { validEmailCode } from '@/api/login';
import { mapGetters } from 'vuex'
export default {
computed: {
...mapGetters([
'userInfo'
])
},
props:['user'],
watch: {
'user':function(data) {
this.editForm=data;
},
},
data() {
var validateEmail = (rule, value, callback) => {
if (value=='') {
callback();
} else {
if (value !== '') {
var reg = /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/;
if(!reg.test(value)){
callback(new Error('邮箱格式不正确'));
}
}
callback();
}
};
return {
validateEmail:validateEmail,
options:{},//
editLoading: false,
editFormRules: {
email: [
{ validator:validateEmail, trigger: 'blur' }
]
},
editForm:{
email:''
},
valiCode:'',//
}
},
methods: {
// @cancel="editFormVisible=false"
handleCancel:function(){
this.$emit('cancel');
},
doChangeEmail(){
this.$refs.editForm.validate((valid) => {
if (valid) {
this.changeEmail();
}
})
},
validEmailCode(){
validEmailCode({valiCode:this.valiCode,userType:'staff'}).then(res=>{
var tips = res.data.tips;
this.$message({ message: tips.msg, type: tips.isOk?'success':'error' });
})
},
doLogin(){
this.$router.push({path: '/login' });
}
},
components: {
},
mounted() {
var valiCode=this.$route.query.valiCode;
//var valiCode=util.getQueryStringByName('valiCode');
if(valiCode){
this.valiCode=valiCode;
this.validEmailCode();
}
}
}
</script>
<style scoped>
</style>

265
src/views/myWork/set/index.vue

@ -5,13 +5,21 @@
<el-avatar class="m_avater" :src="editForm.headimgurl || defaultImg">
</el-avatar>
<div class="m_msg">
<span class="m_name">{{userInfo.username}}</span>
<span class="m_name">{{userInfo.username}}
<el-tag v-if="editForm.memType==='0'" type="primary">个人账户</el-tag>
<el-tag type="warning" v-else-if="editForm.memType=='1'">企业管理员账户</el-tag>
<el-tag type="warning" v-else-if="editForm.memType=='2'">企业员工账户</el-tag>
<el-button v-if="editForm.memType!=='0'" type="text">{{editForm.branchName}}</el-button>
<el-button v-if="editForm.memType==='0'" type="text" icon="el-icon-top" @click="upgradeToBranchAccount">升级为企业账户</el-button>
<el-button type="warning" @click="switchUser">切换账户</el-button>
</span>
<span class="m_dept">所在部门{{userInfo.deptName}}</span>
<el-button @click="showUploadHeadimg" class="m_btn">修改头像</el-button>
</div>
</div>
<div class="m_opercard">
<div class="m_base">
<div class="m_base" v-if="showPanel!='bindMainAccount'">
<h3>基本信息</h3>
<el-form class="m_f m_from1" :model="editForm" label-width="120px" :rules="editFormRules" ref="editForm">
<el-form-item label="用户名称" prop="username" :rules="[{required:true,message:'用户名称不能为空'}]">
@ -19,15 +27,46 @@
</el-form-item>
<el-form-item label="登录账号" prop="displayUserid" :rules="[{required:true,message:'登录账号不能为空'}]">
<el-input style="width:400px;" v-model="editForm.displayUserid" auto-complete="off"></el-input>
</el-form-item>
</el-form-item>
<el-form-item label="手机号码" prop="phoneno">
<el-input style="width:400px;" v-model="editForm.phoneno" auto-complete="off"></el-input>
<el-button type="text" @click="registerPhoneno" v-if="!userInfo.phoneno">绑定手机</el-button>
<el-button type="text" @click="changePhoneno" v-if="userInfo.phoneno">更换手机</el-button>
</el-form-item>
<el-form-item label="邮箱" prop="email" :rules="[{required:true,message:'邮箱不能为空'},{validator:validateEmail}]">
<el-input style="width:400px;" v-model="editForm.email" auto-complete="off"></el-input>
<el-input style="width:400px;" v-model="editForm.email" auto-complete="off"></el-input>
<el-button type="text" @click="registerEmail" v-if="!userInfo.email">绑定邮箱</el-button>
<el-button type="text" @click="changeEmail" v-if="userInfo.email">更换邮箱</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click.native="editSubmit" :loading="editLoading">保存</el-button>
<el-button @click.native="showPanel='bindMainAccount'" :loading="editLoading">绑定主账户</el-button>
</el-form-item>
</el-form>
</div>
<div class="m_base" v-if="showPanel==='bindMainAccount'">
<h3>绑定主账户</h3>
<el-row class="padding">
<el-row class="padding">
<font color="blue">主账号指平台统一账户一般同一个手机号微信号邮箱认为是同一个账户</font>
<br>
<font color="blue">绑定主账户后可以实现微信app公众号小程序等各个应用账户互通</font>
</el-row>
<el-row class="padding">
<vue-qr
ref="qrcode"
:logoSrc="logoSrc"
:text="' https://www.qingqinkj.com/miniapp?page=bindMainAccount&userid='+editForm.userid"
:size="200"
:loadMake="true"/>
<br>
<font color="blue">扫描绑定{{editForm.username}}主账号</font>
</el-row>
<el-row class="padding">
<el-button @click.native="showPanel='baseInfo'" :loading="editLoading">返回</el-button>
</el-row>
</el-row>
</div>
<div class="m_setpwd">
<h3>密码设置</h3>
<el-form class="m_f m_from1" :model="editForm" label-width="80px" ref="passwordForm">
@ -57,76 +96,59 @@
:remark="userInfo.username"
>
<span slot="title">商品高清大图</span>
</single-shear-upload>
</div>
<!-- <section>
<el-row class="padding" v-show="changePasswordVisible==true" >
<el-form :model="passwordForm" label-width="120px" ref="passwordForm">
<el-form-item label="" prop="headimgurl">
<el-avatar :size="100" :src="editForm.headimgurl"></el-avatar>
</el-form-item>
<el-form-item label="原密码" prop="oldPassword" :rules="[{required:true,message:'原密码不能为空'}]">
<el-input style="width:400px;" type="password" v-model="passwordForm.oldPassword" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="新密码" prop="newPassword" :rules="[{required:true,message:'新密码不能为空'}]">
<el-input style="width:400px;" type="password" v-model="passwordForm.newPassword" auto-complete="off"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click.native="doChangePassword" :loading="editLoading">保存</el-button>
<el-button @click.native="changePasswordVisible=false" :loading="editLoading">返回</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row class="padding" v-show="changePasswordVisible==false" >
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editForm">
<el-form-item label="" prop="headimgurl">
<el-avatar :size="100" :src="editForm.headimgurl" @click="showUploadHeadimg"></el-avatar>
<br>
<el-button type="text" @click="showUploadHeadimg">更换头像</el-button>
</el-form-item>
<el-form-item label="" v-show="false" prop="headimgurl">
<single-shear-upload ref="uploadImg"
:img-width="100"
:img-height="100"
:show-title="true"
v-model="editForm.headimgurl"
:branch-id="userInfo.branchId"
:deptid="userInfo.deptid"
:remark="userInfo.username"
>
<span slot="title">商品高清大图</span>
</single-shear-upload>
</el-form-item>
<el-form-item label="用户名称" prop="username" :rules="[{required:true,message:'用户名称不能为空'}]">
<el-input style="width:400px;" v-model="editForm.username" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="登录账号" prop="displayUserid" :rules="[{required:true,message:'登录账号不能为空'}]">
<el-input style="width:400px;" v-model="editForm.displayUserid" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email" :rules="[{required:true,message:'邮箱不能为空'},{validator:validateEmail}]">
<el-input style="width:400px;" v-model="editForm.email" auto-complete="off"></el-input>
</el-form-item>
<el-form-item>
<el-button @click.native="changePasswordVisible=true" :loading="editLoading">修改密码</el-button>
<el-button type="primary" @click.native="editSubmit" :loading="editLoading">保存</el-button>
</el-form-item>
</el-form>
</el-row>
</section> -->
</single-shear-upload>
<!--新增 Branch 管理端机构表机构下面若干部门界面-->
<el-dialog
title="新增机构"
:visible.sync="branchAddVisible"
width="50%"
top="20px"
:close-on-click-modal="false"
>
<branch-add
:branch="{id:userInfo.branchId,branchName:'',admUserid:userInfo.branchId,admUsername:userInfo.username,luserid:userInfo.userid,lusername:userInfo.username}"
op-type="add"
:visible="branchAddVisible"
@cancel="branchAddVisible=false"
@submit="afterAddSubmit"
></branch-add>
</el-dialog>
<el-dialog
title="请选择一个账户进行登录"
:visible.sync="phonenoUsersVisible"
width="600" append-to-body>
<el-table :data="phonenoUsers">
<el-table-column prop="displayUserid" label="登录账号">
</el-table-column>
<el-table-column prop="username" label="姓名">
</el-table-column>
<el-table-column prop="branchName" label="企业">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button type="primary" @click="toLogin(scope.row)">登录</el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<script>
import { editUser,changePassword } from '@/api/mdp/sys/user';
import { mapGetters } from 'vuex'
import { sendEmail,validEmailCode,queryMyUsers,switchUser } from '@/api/login';
import SingleShearUpload from "@/components/Image/Single/Index";
import VueQr from 'vue-qr'
import BranchAdd from "@/views/mdp/sys/branch/BranchEdit";
import { getToken, setToken, removeToken,getCacheUserInfo,setCacheUserInfo,removeCacheUserInfo} from '@/utils/auth'
import md5 from "js-md5";
export default {
computed: {
...mapGetters([
@ -216,7 +238,13 @@ import md5 from "js-md5";
},
passwordForm:{
newPassword:'',oldPassword:''
}
},
branchAddVisible:false,
valiCode:'',//
showPanel:'',//bindMainAccount
phonenoUsers:[],
phonenoUsersVisible:false,
}
},
methods: {
@ -261,14 +289,109 @@ import md5 from "js-md5";
showUploadHeadimg(){
this.$refs.uploadImg.showAdd();
},
upgradeToBranchAccount(){
//
this.branchAddVisible=true;
},
toBranchDetail(){
//
},
registerEmail(){
if(this.editForm.email){
var curlDomain=window.location.protocol+"//"+window.location.host+"/"+process.env.CONTEXT+"/"+process.env.VERSION;
sendEmail({codeScene:'1',codeEmail:this.editForm.email,userType:'staff',callbackUri:curlDomain+'/#/updateUserInfo'}).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
this.$message({ message: "邮件已发送,请到收件箱收取邮件,并点击其链接进行自动验证。", type: 'success' });
}else{
this.$message({ message: tips.msg, type: tips.isOk?'success':'error' });
}
})
}
},
changeEmail(){
if(this.editForm.email){
var curlDomain=window.location.protocol+"//"+window.location.host+"/"+process.env.CONTEXT+"/"+process.env.VERSION;
sendEmail({codeScene:'2',codeEmail:this.editForm.email,userType:'staff',callbackUri:curlDomain+'/#/changeEmailStepOne'}).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
this.$message({ message: "邮件已发送,请到收件箱收取邮件,并点击其链接进行验证原邮箱。", type: 'success' });
}else{
this.$message({ message: tips.msg, type: tips.isOk?'success':'error' });
}
})
}
},
validEmailCode(){
validEmailCode({valiCode:this.valiCode,userType:'staff'}).then(res=>{
var tips = res.data.tips;
this.$message({ message: tips.msg, type: tips.isOk?'success':'error' });
})
},
switchUser(){
queryMyUsers().then(res0=>{
if(res0.data.tips.isOk){
this.phonenoUsers=res0.data.data;
if(res0.data.data.length<=1){
this.$message.warning("当前没有关联的账户,无须切换");
}else{
this.phonenoUsersVisible=true;
}
}else{
this.$message.error(res0.data.tips.msg);
}
})
},
toLogin(user) {
this.$prompt('请输入密码', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
}).then(({ value }) => {
let params={
password:md5(value),
userloginid:user.userid,
authType:'password_display_userid' ,
grantType:"password"
}
//userloginid, password,grantType,authType,deptid,userid
switchUser(params.userloginid,params.password,params.grantType,params.authType,'',params.userloginid).then(res => {
this.phonenoUsersVisible=false;
if(res.data.tips.isOk==true){
setToken( res.data.data.accessToken.tokenValue)
removeCacheUserInfo();
this.$store.dispatch('GetUserInfo').then((res2)=>{
this.$router.push({ path: '/' });
}).catch(err=>{
});
}else{
this.$message.error(res.data.tips.msg);
}
}).catch((e) => {
})
}).catch(() => {
this.phonenoUsersVisible=false;
});
},
afterAddSubmit(){
}
},
components: {
SingleShearUpload
SingleShearUpload,VueQr,BranchAdd
},
mounted() {
console.log(this.userInfo, "this.userInfo");
this.editForm=Object.assign(this.editForm, this.userInfo);
mounted() {
this.editForm=Object.assign(this.editForm, this.userInfo);
var valiCode=this.$route.query.valiCode;
//var valiCode=util.getQueryStringByName('valiCode');
if(valiCode){
this.valiCode=valiCode;
this.validEmailCode();
}
}
}

397
src/views/myWork/userLoginRecord/index.vue

@ -0,0 +1,397 @@
<template>
<section class="page-container border padding">
<el-row>
<el-input v-model="filters.key" style="width: 20%;" placeholder="模糊查询"></el-input>
<el-button v-loading="load.list" :disabled="load.list==true" @click="searchUserLoginRecords" icon="el-icon-search">查询</el-button>
</el-row>
<el-row class="padding-top">
<!--列表 UserLoginRecord 用户登录信息登记-->
<el-table ref="userLoginRecordTable" :data="userLoginRecords" :height="maxTableHeight" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column type="selection" width="55" show-overflow-tooltip fixed="left"></el-table-column>
<el-table-column sortable type="index" width="55" show-overflow-tooltip fixed="left"></el-table-column>
<el-table-column prop="userid" label="用户编号" min-width="80" show-overflow-tooltip fixed="left">
<template slot-scope="scope">
<span >
{{scope.row.userid}}
</span>
</template>
</el-table-column>
<el-table-column prop="loginType" label="登录方式" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.loginType}}
</span>
</template>
</el-table-column>
<el-table-column prop="loginTime" label="登录时间" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.loginTime}}
</span>
</template>
</el-table-column>
<el-table-column prop="loginBranchId" label="登录机构号" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.loginBranchId}}
</span>
</template>
</el-table-column>
<el-table-column prop="username" label="登录用户名" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.username}}
</span>
</template>
</el-table-column>
<el-table-column prop="phoneno" label="登录手机号" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.phoneno}}
</span>
</template>
</el-table-column>
<el-table-column prop="loginIp" label="登录ip" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.loginIp}}
</span>
</template>
</el-table-column>
<el-table-column prop="userAgent" label="请求特征码" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.userAgent}}
</span>
</template>
</el-table-column>
<!--
<el-table-column prop="deviceType" label="设备类型" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.deviceType}}
</span>
</template>
</el-table-column>
<el-table-column prop="os" label="操作系统" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.os}}
</span>
</template>
</el-table-column>
<el-table-column prop="osVersion" label="操作系统版本如Android" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.osVersion}}
</span>
</template>
</el-table-column>
<el-table-column prop="osName" label="系统名称" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.osName}}
</span>
</template>
</el-table-column>
<el-table-column prop="deviceManufacturer" label="设备生产厂商" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.deviceManufacturer}}
</span>
</template>
</el-table-column>
<el-table-column prop="browerGroup" label="浏览器组" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.browerGroup}}
</span>
</template>
</el-table-column>
<el-table-column prop="borderName" label="浏览器名称" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.borderName}}
</span>
</template>
</el-table-column>
<el-table-column prop="borderVersion" label="浏览器版本" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.borderVersion}}
</span>
</template>
</el-table-column>
<el-table-column prop="longitude" label="经度" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.longitude}}
</span>
</template>
</el-table-column>
<el-table-column prop="latitude" label="纬度" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.latitude}}
</span>
</template>
</el-table-column>
-->
<el-table-column prop="loginStatus" label="登录状态" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<el-tag v-if="scope.row.loginStatus=='0'" type="danger">
失败
</el-tag>
<el-tag v-else type="success">
成功
</el-tag>
</template>
</el-table-column>
<el-table-column prop="loginMsg" label="登录说明" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span >
{{scope.row.loginMsg}}
</span>
</template>
</el-table-column>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
</section>
</template>
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { initDicts,listUserLoginRecord, delUserLoginRecord, batchDelUserLoginRecord,editSomeFieldsUserLoginRecord } from '@/api/mdp/sys/userLoginRecord';
import { mapGetters } from 'vuex'
export default {
name:'userLoginRecordMng',
components: {
},
props:['visible'],
computed: {
...mapGetters(['userInfo']),
},
watch:{
visible(val){
if(val==true){
this.initData();
this.searchUserLoginRecords()
}
}
},
data() {
return {
filters: {
key: ''
},
userLoginRecords: [],//
pageInfo:{//
total:0,//0>0
pageSize:10,//
count:false,//
pageNum:1,//1
orderFields:['login_time'],// ['sex','student_id']
orderDirs:['desc']// asc,desc ['asc','desc']
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
dicts:{
//sex: [{id:'1',name:''},{id:'2',name:''}]
},// params={categoryId:'all',itemCodes:['sex']} {sex: [{id:'1',name:''},{id:'2',name:''}]}
addFormVisible: false,//userLoginRecord
addForm: {
userid:'',shopId:'',locationId:'',loginShopid:'',loginLocationid:'',branchId:'',loginType:'',loginTime:'',loginBranchId:'',username:'',authId:'',mdpAppid:'',lockNo:'',lockStatus:'',lockTime:'',phoneno:'',loginIp:'',userType:'',loginDeviceId:'',loginDeviceSn:'',userAgent:'',reqNo:'',deviceType:'',os:'',osVersion:'',osName:'',renderingEngine:'',deviceManufacturer:'',browerGroup:'',borderName:'',borderVersion:'',id:'',longitude:'',latitude:'',regionId:'',regionName:'',formatAddress:'',districtId:'',memType:'',loginStatus:'',loginMsg:'',authType:'',grantType:''
},
editFormVisible: false,//
editForm: {
userid:'',shopId:'',locationId:'',loginShopid:'',loginLocationid:'',branchId:'',loginType:'',loginTime:'',loginBranchId:'',username:'',authId:'',mdpAppid:'',lockNo:'',lockStatus:'',lockTime:'',phoneno:'',loginIp:'',userType:'',loginDeviceId:'',loginDeviceSn:'',userAgent:'',reqNo:'',deviceType:'',os:'',osVersion:'',osName:'',renderingEngine:'',deviceManufacturer:'',browerGroup:'',borderName:'',borderVersion:'',id:'',longitude:'',latitude:'',regionId:'',regionName:'',formatAddress:'',districtId:'',memType:'',loginStatus:'',loginMsg:'',authType:'',grantType:''
},
maxTableHeight:300,
}
},//end data
methods: {
...util,
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
this.getUserLoginRecords();
},
handleCurrentChange(pageNum) {
this.pageInfo.pageNum = pageNum;
this.getUserLoginRecords();
},
// 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.getUserLoginRecords();
},
searchUserLoginRecords(){
this.pageInfo.count=true;
this.getUserLoginRecords();
},
// UserLoginRecord
getUserLoginRecords() {
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
}
params.userid=this.userInfo.userid;
this.load.list = true;
listUserLoginRecord(params).then((res) => {
var tips=res.data.tips;
if(tips.isOk){
this.pageInfo.total = res.data.total;
this.pageInfo.count=false;
this.userLoginRecords = 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 );
},
// UserLoginRecord
showEdit: function ( row,index ) {
this.editFormVisible = true;
this.editForm = Object.assign({}, row);
},
// UserLoginRecord
showAdd: function () {
this.addFormVisible = true;
//this.addForm=Object.assign({}, this.editForm);
},
afterAddSubmit(){
this.addFormVisible=false;
this.pageInfo.count=true;
this.getUserLoginRecords();
},
afterEditSubmit(){
this.editFormVisible=false;
},
//userLoginRecord
selsChange: function (sels) {
this.sels = sels;
},
//userLoginRecord
handleDel: function (row,index) {
this.$confirm('确认删除该记录吗?', '提示', {
type: 'warning'
}).then(() => {
this.load.del=true;
let params = { id:row.id };
delUserLoginRecord(params).then((res) => {
this.load.del=false;
var tips=res.data.tips;
if(tips.isOk){
this.searchUserLoginRecords();
}
this.$notify({ position:'bottom-left', showClose:true, message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.del=false );
});
},
//userLoginRecord
batchDel: function () {
if(this.sels.length<=0){
return;
}
var params=this.sels.map(i=>{
return { id:i.id}
})
this.$confirm('确认删除选中记录吗?', '提示', {
type: 'warning'
}).then(() => {
this.load.del=true;
batchDelUserLoginRecord(params).then((res) => {
this.load.del=false;
var tips=res.data.tips;
if( tips.isOk ){
this.searchUserLoginRecords();
}
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.id==row.id)){
this.$notify({position:'bottom-left',showClose:true,message:'请编辑选中的行',type:'warning'})
Object.assign(this.editForm,this.editFormBak)
return;
}
params['ids']=this.sels.map(i=>i.id)
}else{
params['ids']=[row].map(i=>i.id)
}
params[fieldName]=$event
var func = editSomeFieldsUserLoginRecord
func(params).then(res=>{
let tips = res.data.tips;
if(tips.isOk){
if(this.sels.length>0){
this.searchUserLoginRecords();
}
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()
this.searchUserLoginRecords();
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.userLoginRecordTable.$el)
});
}
}
</script>
<style scoped>
</style>

1434
src/views/xm/XmOverview.vue
File diff suppressed because it is too large
View File

1163
src/views/xm/XmOverview2.vue
File diff suppressed because it is too large
View File

6
src/views/xm/core/components/XmProjectSelect.vue

@ -241,11 +241,11 @@
rowClick: function(row, event, column){
this.editForm=row
this.$emit('row-click',row, event, column);// @row-click="rowClick"
this.selectedProduct(row)
this.selectedProject(row)
this.projectVisible=false;
this.moreVisible=false;
},
selectedProduct:function(row){
selectedProject:function(row){
this.editForm=row
this.$emit('selected',row);
this.projectVisible=false;
@ -283,7 +283,7 @@
clearSelect(){
this.$refs.table.setCurrentRow();
this.$emit("clear");
this.selectedProduct(null);
this.selectedProject(null);
this.projectVisible=false;
this.moreVisible=false;
},

148
src/views/xm/core/xmGroup/XmGroupMng.vue

@ -1,7 +1,7 @@
<template>
<section class="page-container border padding" >
<el-row>
<xm-project-select style="display:inline;" v-if="!selProject" :auto-select="true" :link-iteration-id="xmIteration?xmIteration.id:null" :link-product-id="xmProduct?xmProduct.id:null" @row-click="onProjectRowClick" @clear="onProjectClearSelect"></xm-project-select>
<xm-project-select style="display:inline;" v-if="!selProject" :auto-select="true" :link-iteration-id="xmIteration?xmIteration.id:null" :link-product-id="xmProduct?xmProduct.id:null" @selected="onProjectRowClick" @clear="onProjectClearSelect"></xm-project-select>
<el-input v-model="filters.key" style="width:15%;" clearable placeholder="名称过滤"></el-input>
<el-button type="primary" @click="searchXmGroups" icon="el-icon-search">刷新</el-button>
@ -53,11 +53,7 @@
<el-row v-if="currNodeType=='project'">
<el-button type="primary" @click="loadNexGroup" icon="el-icon-search" v-loading="load.add">加载下一级小组</el-button>
<el-button @click="showProjectGroupAdd" icon="el-icon-plus" v-loading="load.add">新增项目小组</el-button>
</el-row>
<el-row v-else-if="currNodeType=='product'">
<el-button type="primary" @click="loadNexGroup" icon="el-icon-search" v-loading="load.add">加载下一级小组</el-button>
<el-button type="primary" @click="showProductGroupAdd" icon="el-icon-plus" v-loading="load.add">新增产品小组</el-button>
</el-row>
</el-row>
<el-row v-else-if="currNodeType=='group'">
<el-row>
<el-button type="primary" @click="loadNexGroup" icon="el-icon-search" v-loading="load.add">加载下一级小组</el-button>
@ -68,16 +64,13 @@
<el-button @click="showAddSub(editForm)" icon="el-icon-plus" v-loading="load.add">新增下一级小组</el-button>
<el-button @click="showEdit(editForm)" icon="el-icon-edit" v-loading="load.edit">修改小组信息</el-button>
<el-button @click="userSelectVisible=true" icon="el-icon-plus" v-loading="load.add">新增组员</el-button>
<el-button @click="candidateVisible=true" icon="el-icon-plus" v-loading="load.add">拉竞标人进组</el-button>
<el-button type="danger" @click="handleDel(editForm)" icon="el-icon-delete" v-loading="load.del">删除小组</el-button>
</el-row>
</el-row>
<el-row v-else-if="currNodeType=='groupUser'">
<el-button type="danger" icon="el-icon-delete" @click="handleDelGroupUser(editForm)" v-loading="load.del">删除组员</el-button>
</el-row>
<el-row v-else>
<el-button type="primary" @click="loadNexGroup" icon="el-icon-search" v-loading="load.add">加载下一级小组</el-button>
<el-button type="primary" @click="selectProjectVisible=true" icon="el-icon-plus" v-loading="load.add">新增项目小组</el-button>
</el-row>
</el-row>
</el-dialog>
<el-drawer append-to-body
@ -185,39 +178,44 @@
<el-drawer v-if="currNodeType=='group'&&editForm.groupName" center :title="(editForm==null?editForm.groupName:'')+'小组成员管理'" :visible.sync="groupUserVisible" size="80%" :close-on-click-modal="false" append-to-body>
<xm-group-user-mng :xm-group="editForm" :visible="groupUserVisible" ></xm-group-user-mng>
</el-drawer>
<el-drawer :visible.sync="candidateVisible" size="80%" :close-on-click-modal="false" append-to-body>
<xm-task-execuser-select :sel-project="filters.selProject" :visible="candidateVisible" @select="onExecuserSelect"></xm-task-execuser-select>
</el-drawer>
</el-row>
</section>
</template>
<script>
import util from '@/common/js/util';//
import treeTool from '@/common/js/treeTool';//
import config from '@/common/config';//
import { getDicts,initSimpleDicts,initComplexDicts } from '@/api/mdp/meta/item';//
import { listXmGroup, delXmGroup, batchDelXmGroup,getGroups } from '@/api/xm/core/xmGroup';
import XmGroupEdit from './XmGroupEdit';//
import { mapGetters } from 'vuex'
import {VueOkrTree} from 'vue-okr-tree';
import 'vue-okr-tree/dist/vue-okr-tree.css'
import { listImGroup} from '@/api/mdp/im/group/imGroup';
import { publishMessage} from '@/api/mdp/im/imPush';
import { listXmGroupUser, delXmGroupUser, batchDelXmGroupUser,batchAddXmGroupUser } from '@/api/xm/core/xmGroupUser';
import util from '@/common/js/util';//
import treeTool from '@/common/js/treeTool';//
import config from '@/common/config';//
import { getDicts,initSimpleDicts,initComplexDicts } from '@/api/mdp/meta/item';//
import { listXmGroup, delXmGroup, batchDelXmGroup,getGroups } from '@/api/xm/core/xmGroup';
import XmGroupEdit from './XmGroupEdit';//
import { mapGetters } from 'vuex'
import {VueOkrTree} from 'vue-okr-tree';
import 'vue-okr-tree/dist/vue-okr-tree.css'
import { listImGroup} from '@/api/mdp/im/group/imGroup';
import { publishMessage} from '@/api/mdp/im/imPush';
import { listXmGroupUser, delXmGroupUser, batchDelXmGroupUser,batchAddXmGroupUser } from '@/api/xm/core/xmGroupUser';
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
import XmGroupStateMng from '../xmGroupState/XmGroupStateMng';//
import XmGroupUserMng from '../xmGroupUser/XmGroupUserMng';//
import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect';
import XmProductSelect from '@/views/xm/core/components/XmProductSelect.vue'
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
import XmGroupStateMng from '../xmGroupState/XmGroupStateMng';//
import XmGroupUserMng from '../xmGroupUser/XmGroupUserMng';//
import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect';
import XmProductSelect from '@/views/xm/core/components/XmProductSelect.vue'
import XmTaskExecuserSelect from '../xmTaskExecuser/XmTaskExecuserSelect.vue';
export default {
name:'xmGroupMng',
components: {
XmGroupEdit,VueOkrTree,UsersSelect,XmGroupStateMng,XmGroupUserMng,
XmProductSelect,XmProjectSelect,
XmTaskExecuserSelect,
},
props:["visible","selProject" ,"isSelectSingleUser","isSelectMultiUser",'xmProduct','xmIteration','pgClass'],
computed: {
@ -255,8 +253,8 @@ XmProductSelect,XmProjectSelect,
})
var groupsTree=treeTool.translateDataToTree(groups,'pgroupId','id')
var topLabel=this.userInfo.branchName+"-组织架构"
var currNodeType='branch'
var topdata={id:this.userInfo.branchId,branchName:this.userInfo.branchName,branchId:this.userInfo.branchId}
var currNodeType='project'
var topdata={}
if(this.filters.selProject && this.filters.selProject.id){
topLabel=this.filters.selProject.name+"-项目组织架构"
currNodeType='project'
@ -265,15 +263,9 @@ XmProductSelect,XmProjectSelect,
topdata.leaderUsername=this.filters.selProject.pmUsername
topdata.assUserid=this.filters.selProject.assUserid
topdata.assUsername=this.filters.selProject.assUsername
}else if(this.xmProduct && this.xmProduct.id){
topLabel=this.xmProduct.productName+"-产品组织架构"
currNodeType='product'
topdata=this.xmProduct
topdata.leaderUserid=this.xmProduct.pmUserid
topdata.leaderUsername=this.xmProduct.pmUsername
topdata.assUserid=this.xmProduct.assUserid
topdata.assUsername=this.xmProduct.assUsername
}
}else{
return []
}
var data=[{
...topdata,
label:topLabel,
@ -293,15 +285,9 @@ XmProductSelect,XmProjectSelect,
},
selProject(){
this.selProject=this.selProject;
this.filters.selProject=this.selProject;
this.getXmGroup();
},
xmProduct(){
this.getXmGroup();
},
xmIteration(){
this.getXmGroup();
},
},
"filters.key":function(val) {
this.$refs.tree.filter(val);
},
@ -353,8 +339,8 @@ XmProductSelect,XmProjectSelect,
groupOperSelectVisible:false,
currNodeType:'',//project/product/iteration/group/groupUser
groupUserVisible:false,
selectProjectVisible:false,
selectProductVisible:false,
selectProjectVisible:false,
candidateVisible:false,
}
},//end data
methods: {
@ -434,14 +420,12 @@ XmProductSelect,XmProjectSelect,
}
params.orderBy= orderBys.join(",")
}
if( !this.filters.selProject || !this.filters.selProject.id){
return;
}
if(this.filters.selProject && this.filters.selProject.id){
params.projectId=this.filters.selProject.id
}else if(this.xmProduct && this.xmProduct.id){
params.productId=this.xmProduct.id
}else if(this.xmIteration && this.xmIteration.id){
params.iterationId=this.xmIteration.id
}
}
if(this.filters.key){
params.key=this.filters.key
}
@ -453,22 +437,9 @@ XmProductSelect,XmProjectSelect,
}
if(this.filters.mngUsernamekey){
params.mngUsernamekey=this.filters.mngUsernamekey
}
if(this.pgClass==='0'||!this.pgClass){
if(!params.projectId){
return;
}
}else if(this.pgClass==='1'){
if(!params.productId){
return;
}
}
}
var func=getGroups
this.load.list = true;
if( !params.productId && !params.projectId && !params.iterationId){
func=listXmGroup
params.lvl=1
}
this.load.list = true;
func(params).then((res) => {
var tips=res.data.tips;
if(tips.isOk){
@ -654,6 +625,22 @@ XmProductSelect,XmProjectSelect,
}
},
onExecuserSelect:function(users){
this.candidateVisible=false;
if(users && users.length>0){
var arrs=[];
users.forEach(i=>{
if(!arrs.some(k=>k.userid==i.userid)){
i.branchId=i.execUserBranchId
i.branchName=''
arrs.push(i)
}
})
this.onUserSelected(arrs);
}
},
//
onUserSelected: function(groupUsers) {
@ -667,6 +654,8 @@ XmProductSelect,XmProjectSelect,
var u={
userid:i.userid,
username:i.username,
obranchId:i.branchId,
obranchName:i.branchName,
groupId:this.editForm.id,
}
if(this.editForm.pgClass=='1'){
@ -699,7 +688,9 @@ XmProductSelect,XmProjectSelect,
this.$emit('row-click',row, event, column);// @row-click="rowClick"
},
initData: function(){
this.filters.selProject=this.selProject;
if(this.selProject){
this.filters.selProject=this.selProject;
}
},
renderCurrentClass (node) {
return 'label-bg-blue'
@ -757,16 +748,7 @@ XmProductSelect,XmProjectSelect,
this.addForm.pgClass="0"
this.addFormVisible=true;
this.selectProjectVisible=false;
},
onProductConfirm(product){
this.addForm={...this.addFormInit}
this.addForm.productId=product.id
this.addForm.groupName=product.productName+"-管理小组"
this.addForm.projectName=product.productName
this.addForm.pgClass="1"
this.addFormVisible=true;
this.selectProductVisible=false;
},
},
onProjectRowClick(project){
this.filters.selProject=project;
this.searchXmGroups();

21
src/views/xm/core/xmGroupUser/XmGroupUserMng.vue

@ -10,21 +10,21 @@
<el-row class="padding-top">
<!--列表 XmGroupUser xm_group_user-->
<el-table ref="xmGroupUserTable" :data="xmGroupUsers" :height="maxTableHeight" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column type="selection" width="55" ></el-table-column>
<el-table-column sortable type="index" width="55"></el-table-column>
<el-table-column prop="pgClass" label="产品/团队编号" min-width="120" >
<template slot-scope="scope">{{scope.row.pgClass=='1'?'产品':'项目'}}
&nbsp;&nbsp;{{scope.row.pgClass=='1'?scope.row.productId:scope.row.projectId}}
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column sortable type="index" width="55"></el-table-column>
<el-table-column prop="pgClass" label="项目编号" min-width="150">
<template slot-scope="scope">
{{ scope.row.projectId}}
</template>
</el-table-column>
<el-table-column prop="groupName" label="组名" min-width="120" show-overflow-tooltip></el-table-column>
<el-table-column prop="userid" label="成员编号" min-width="120" show-overflow-tooltip></el-table-column>
<el-table-column prop="username" label="成员姓名" min-width="120" show-overflow-tooltip></el-table-column>
<el-table-column prop="groupName" label="组名" min-width="150" show-overflow-tooltip></el-table-column>
<el-table-column prop="username" label="成员姓名" min-width="150" show-overflow-tooltip ></el-table-column>
<el-table-column prop="userid" label="成员编号" min-width="150" show-overflow-tooltip></el-table-column>
<el-table-column prop="obranchId" label="归属机构" min-width="150" show-overflow-tooltip></el-table-column>
<el-table-column prop="joinTime" label="加入时间" min-width="80" show-overflow-tooltip></el-table-column>
<el-table-column prop="outTime" label="离队时间" min-width="80" show-overflow-tooltip></el-table-column>
<el-table-column prop="status" label="状态" min-width="80" show-overflow-tooltip>
<template slot-scope="scope"> {{scope.row.status=='1'?'已加入':'已退出'}}
<template slot-scope="scope"> {{scope.row.status=='0'?'已退出':'已加入'}}
</template>
</el-table-column>
<el-table-column prop="isPri" label="是否私人" min-width="80" show-overflow-tooltip>
@ -32,7 +32,6 @@
</template>
</el-table-column>
<el-table-column prop="seqNo" label="排序号" min-width="80" show-overflow-tooltip></el-table-column>
<el-table-column prop="obranchName" label="原归属机构名称" min-width="80" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="180" fixed="right">
<template scope="scope">
<el-button type="primary" @click="showEdit( scope.row,scope.$index)" icon="el-icon-edit"></el-button>

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

@ -71,7 +71,7 @@
</el-col>
</el-row>
<el-tabs value="1" >
<el-tab-pane label="基本信息'" name="1" >
<el-tab-pane label="基本信息" name="1" >
<el-row>

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

@ -70,8 +70,8 @@
</el-form-item>
</el-col>
</el-row>
<el-tabs value="1" >
<el-tab-pane label="基本信息'" name="1" >
<el-tabs v-model="activateTabPaneName" >
<el-tab-pane label="基本信息" name="1" >
<el-row>
@ -118,19 +118,19 @@
</el-form-item>
</el-col>
</el-row>
</el-tab-pane>
</el-tab-pane >
<el-tab-pane label="概述" name="4">
<el-form-item label="需求概述" prop="remark">
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 20}" v-model="editForm.remark" @click.native="editXmMenuSomeFields(editForm,'remark',editForm.remark)" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input>
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 20}" v-model="editForm.remark" @change="editXmMenuSomeFields(editForm,'remark',editForm.remark)" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input>
</el-form-item>
</el-tab-pane>
<el-tab-pane :label="'子工作项'+(subWorkItemNum>=0?'('+subWorkItemNum+')':'')" name="6">
<xm-sub-work-item :parent-xm-menu="editForm" :link-project-id="selProject?selProject.id:null" @sub-work-item-num="setSubWorkItemNum" @add-sub-menu="onAddSubMenu"></xm-sub-work-item>
<xm-sub-work-item v-if="this.activateTabPaneName=='6'" :parent-xm-menu="editForm" :link-project-id="selProject?selProject.id:null" @sub-work-item-num="setSubWorkItemNum" @add-sub-menu="onAddSubMenu"></xm-sub-work-item>
</el-tab-pane>
<el-tab-pane :label="'工时('+editForm.mactWorkload+' h)'" name="2">
<el-tab-pane :label="'工时('+editForm.actWorkload+' h)'" name="2">
<el-form-item label="工时进度" prop="mactRate" >
<el-progress style="width:60%;" :text-inside="true" :stroke-width="15" :percentage="editForm.mactRate?editForm.mactRate:0"></el-progress>
<el-form-item label="工时进度" prop="finishRate" >
<el-progress style="width:60%;" :text-inside="true" :stroke-width="15" :percentage="editForm.finishRate?editForm.finishRate:0"></el-progress>
</el-form-item>
<el-form-item label="预估工期" prop="budgetHours">
<el-input-number :disabled="editForm.calcType!=='2' " style="width:200px;" v-model="editForm.budgetHours" :precision="2" :step="8" :min="0" placeholder="预计工期(小时)"></el-input-number> &nbsp;h
@ -138,16 +138,16 @@
<el-form-item label="预估工时" prop="budgetWorkload">
<el-input-number :disabled="editForm.calcType!=='2' " style="width:200px;" v-model="editForm.budgetWorkload" :precision="2" :step="8" :min="0" placeholder="预计工时(小时)"></el-input-number> &nbsp;h
</el-form-item>
<el-form-item label="实际工时" prop="mactWorkload">
<el-input-number :disabled="editForm.calcType!=='2' " style="width:200px;" v-model="editForm.mactWorkload" :precision="2" :step="8" :min="0" placeholder="实际工时(小时)"></el-input-number> &nbsp;h
<el-form-item label="实际工时" prop="actWorkload">
<el-input-number :disabled="editForm.calcType!=='2' " style="width:200px;" v-model="editForm.actWorkload" :precision="2" :step="8" :min="0" placeholder="实际工时(小时)"></el-input-number> &nbsp;h
</el-form-item>
</el-tab-pane>
<el-tab-pane label="成本" name="3">
<el-form-item label="预估金额" prop="budgetAmount">
<el-input-number :disabled="editForm.calcType!=='2' " style="width:200px;" v-model="editForm.budgetAmount" :precision="2" :step="100" :min="0" placeholder="预算金额"></el-input-number>
<el-form-item label="预估金额" prop="budgetAt">
<el-input-number :disabled="editForm.calcType!=='2' " style="width:200px;" v-model="editForm.budgetAt" :precision="2" :step="100" :min="0" placeholder="预算金额"></el-input-number>
</el-form-item>
<el-form-item label="实际金额" prop="mactAmount">
<el-input-number :disabled="editForm.calcType!=='2' " style="width:200px;" v-model="editForm.mactAmount" :precision="2" :step="100" :min="0" placeholder="实际金额"></el-input-number>
<el-form-item label="实际金额" prop="actAt">
<el-input-number :disabled="editForm.calcType!=='2' " style="width:200px;" v-model="editForm.actAt" :precision="2" :step="100" :min="0" placeholder="实际金额"></el-input-number>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="链接" name="5">
@ -174,6 +174,9 @@
<el-tab-pane label="附件" name="8">
上传附件
</el-tab-pane>
<el-tab-pane label="日志" name="9">
<xm-record v-if="activateTabPaneName=='9'" :biz-id="editForm.menuId" :obj-type="'menu'"></xm-record>
</el-tab-pane>
</el-tabs>
</el-form>
<el-drawer title="选择提出人" :visible.sync="proposerSelectVisible" size="60%" append-to-body>
@ -204,6 +207,7 @@ import XmMenuOverview from './XmMenuOverview.vue';
import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
import TagMng from "@/views/mdp/arc/tag/TagMng";
import XmSubWorkItem from "@/views/xm/core/xmMenuWorkItem/XmSubWorkItem";
import XmRecord from '../xmRecord/XmRecord'
export default {
computed: {
@ -255,28 +259,28 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
}
}
},
'editForm.mactWorkload':function(val,oldVal){
'editForm.actWorkload':function(val,oldVal){
if(!this.editForm.budgetWorkload){
return;
}
if(val==0||!val){
return;
}
this.editForm.mactRate=Math.round(val/this.editForm.budgetWorkload*100)
if( this.editForm.mactRate>100){
this.editForm.mactRate=100;
this.editForm.finishRate=Math.round(val/this.editForm.budgetWorkload*100)
if( this.editForm.finishRate>100){
this.editForm.finishRate=100;
}
},
'editForm.budgetWorkload':function(val,oldVal){
if(!this.editForm.mactWorkload){
if(!this.editForm.actWorkload){
return;
}
if(val==0||!val){
return;
}
this.editForm.mactRate=Math.round(this.editForm.mactWorkload/val*100)
if( this.editForm.mactRate>100){
this.editForm.mactRate=100;
this.editForm.finishRate=Math.round(this.editForm.actWorkload/val*100)
if( this.editForm.finishRate>100){
this.editForm.finishRate=100;
}
}
},
@ -301,7 +305,7 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
//
editForm: {
menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'',online:'',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:'',seqNo:'1',mmUserid:'',mmUsername:'',ntype:'0',childrenCnt:0,sinceVersion:'',
proposerId:'',proposerName:'',dlvl:'',dtype:'',priority:'',source:'',calcType:'1',mactWorkload:0,mactAmount:0,mactRate:0,ctime:'',dclass:'1'
proposerId:'',proposerName:'',dlvl:'',dtype:'',priority:'',source:'',calcType:'1',actWorkload:0,actAt:0,finishRate:0,ctime:'',dclass:'1'
},
proposerSelectVisible:false,
mmUserSelectVisible:false,
@ -323,6 +327,7 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
tagSelectVisible:false,
dateRanger:[],
subWorkItemNum:-1,
activateTabPaneName:'1'
/**begin 在下面加自定义属性,记得补上面的一个逗号**/
/**end 在上面加自定义属性**/
@ -489,6 +494,7 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
TagMng,
XmMenuExchangeMng,
XmSubWorkItem,
XmRecord
},
mounted() {

6
src/views/xm/core/xmMenu/XmMenuMngBatch.vue

@ -152,11 +152,7 @@
this.$emit('no-batch-edit')
},
batchSaveMenu(){
if(!this.roles.some(i=>i.roleid=='productAdmin') && !this.roles.some(i=>i.roleid=='productTeamAdmin')){
this.$notify({position:'bottom-left',showClose:true,message: "只有产品经理、产品组长能够修改需求", type: 'error'});
return false;
}
if(this.valueChangeRows.length==0){
this.$notify.success("没有数据被修改");
return

12
src/views/xm/core/xmMenu/XmMenuWithPlan.vue

@ -411,11 +411,7 @@
}).catch( err => this.load.add=false );
},
//xmMenu
batchDel: function () {
if(!this.roles.some(i=>i.roleid=='productAdmin') && !this.roles.some(i=>i.roleid=='productTeamAdmin')){
this.$notify({position:'bottom-left',showClose:true,message: "只有产品经理、产品组长能够修改需求", type: 'error'});
return false;
}
batchDel: function () {
this.$confirm('确认删除选中记录吗?', '提示', {
type: 'warning'
@ -505,11 +501,7 @@
}
},
showBatchEdit:function(){
if(!this.roles.some(i=>i.roleid=='productAdmin') && !this.roles.some(i=>i.roleid=='productTeamAdmin')){
this.$notify({position:'bottom-left',showClose:true,message: "只有产品经理、产品组长能够修改需求", type: 'error'});
return false;
}
showBatchEdit:function(){
if(this.xmMenus.length==0 ){
this.$notify({position:'bottom-left',showClose:true,message:"没有数据可以修改", type: 'error'});
return ;

2
src/views/xm/core/xmProduct/XmProductInfo.vue

@ -177,7 +177,7 @@
<xm-record v-if="infotype=='日志'" :visible="infotype=='日志'" :xm-product="xmProduct"></xm-record>
<xm-contract v-if="infotype=='合同管理'" :xm-product="xmProduct"></xm-contract>
<xm-env-list v-if="infotype=='环境清单'" :xm-product="xmProduct"></xm-env-list>
<xm-question v-if="infotype=='风险'" :qtype="'risk'" :xm-product='xmProduct' ref="xmRisk"></xm-question>
<xm-question v-if="infotype=='风险'" :qtype="'2'" :xm-product='xmProduct' ref="xmRisk"></xm-question>
<xm-report v-if="infotype=='效能'" :xm-product="xmProduct"></xm-report>
<el-drawer title="选中团队成员" :visible.sync="groupUserVisible" size="50%" append-to-body :close-on-click-modal="false">

22
src/views/xm/core/xmProduct/XmProductMng.vue

@ -159,16 +159,16 @@
<!--列表 XmProduct 产品表-->
<el-table ref="table" :height="maxTableHeight" :data="xmProducts" @sort-change="sortChange" highlight-current-row v-loading="load.list" @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column type="index" width="60">
<el-table-column type="index" width="60" fixed="left">
</el-table-column>
<el-table-column prop="id" label="产品编码" min-width="100" sortable >
<el-table-column prop="id" label="产品编码" min-width="150" sortable fixed="left">
</el-table-column>
<el-table-column prop="productName" label="产品名称" min-width="200" sortable >
<el-table-column prop="productName" label="产品名称" min-width="250" sortable fixed="left">
<template slot-scope="scope" >
<el-link id="guider-three" type="primary" @click="intoInfo(scope.row)">{{scope.row.productName}}</el-link>
</template>
</el-table-column>
<el-table-column prop="pstatus" label="状态" width="100" sortable :formatter="formatPstatus">
<el-table-column prop="pstatus" label="状态" width="100" sortable :formatter="formatPstatus" fixed="left">
<template slot-scope="scope">
<el-tag v-if="scope.row.pstatus=='0'" type="info" effect="plain">{{formatPstatus(null,null,scope.row.pstatus)}}</el-tag>
<el-tag v-else-if="scope.row.pstatus=='1' " type="primary" effect="plain">{{formatPstatus(null,null,scope.row.pstatus)}}</el-tag>
@ -187,7 +187,7 @@
</font>
</template>
</el-table-column>
<el-table-column prop="pmUsername" label="产品经理" width="120" sortable show-overflow-tooltip>
<el-table-column prop="pmUsername" label="产品经理" width="150" sortable show-overflow-tooltip>
<template slot-scope="scope">
<el-tag v-if="scope.row.pmUsername">{{scope.row.pmUsername}}</el-tag>
</template>
@ -511,11 +511,7 @@
this.editForm = Object.assign({}, row);
},
// XmProduct
showAdd: function () {
if(!this.roles.some(i=>i.roleid=='productAdmin')){
this.$notify({position:'bottom-left',showClose:true,message: "只有产品经理能够创建产品", type: 'error'});
return false;
}
showAdd: function () {
this.addFormVisible = true;
//this.addForm=Object.assign({}, this.editForm);
},
@ -569,11 +565,7 @@
});
},
//xmProduct
batchDel: function () {
if(!this.roles.some(i=>i.roleid=='productAdmin')){
this.$notify({position:'bottom-left',showClose:true,message: "只有产品经理能够删除产品", type: 'error'});
return false;
}
batchDel: function () {
var mmSels=this.sels.filter(i=>i.pmUserid!=this.userInfo.userid)
if(mmSels.length>0){
this.$notify({position:'bottom-left',showClose:true,message: "只能删除你负责的产品", type: 'error'});

6
src/views/xm/core/xmProduct/XmProductTplMng.vue

@ -283,11 +283,7 @@
this.editForm = Object.assign({}, row);
},
// XmProduct
showAdd: function () {
if(!this.roles.some(i=>i.roleid=='productAdmin')){
this.$notify({position:'bottom-left',showClose:true,message: "只有产品经理能够创建产品", type: 'error'});
return false;
}
showAdd: function () {
this.addFormVisible = true;
//this.addForm=Object.assign({}, this.editForm);
},

4
src/views/xm/core/xmProject/XmProjectInfo.vue

@ -124,7 +124,7 @@
<xm-product-for-link-complex v-if="infotype=='产品'" ref="xmProductComplex" :sel-project="selProject"></xm-product-for-link-complex>
<xm-menu-mng v-if="infotype=='需求'" :sel-project="selProject"></xm-menu-mng>
<xm-task-mng v-if="infotype=='任务'" ref="xmTaskMng" :sel-project="selProject" ptype="0" queryScope="task" key="task"></xm-task-mng>
<xm-question v-if="infotype=='缺陷'" :sel-project='selProject' ref="xmQuestion"></xm-question>
<xm-question v-if="infotype=='缺陷'" :qtype="'1'" :sel-project='selProject' ref="xmQuestion"></xm-question>
<xm-group-mng v-if="infotype=='团队'" :sel-project="selProject"></xm-group-mng>
<xm-file-mng v-if="infotype=='文档'" :sel-project="selProject"></xm-file-mng>
<xm-task-mng v-if="infotype=='计划'" ref="projectPlan" ptype="0" queryScope="planTask" :sel-project="selProject" key="projectPlan"></xm-task-mng>
@ -138,7 +138,7 @@
<xm-record v-if="infotype=='日志'" :visible="infotype=='日志'" :sel-project="selProject"></xm-record>
<xm-contract v-if="infotype=='合同管理'" :sel-project="selProject"></xm-contract>
<xm-env-list v-if="infotype=='环境清单'" :sel-project="selProject"></xm-env-list>
<xm-question v-if="infotype=='风险'" :qtype="'risk'" :sel-project='selProject' ref="xmRisk"></xm-question>
<xm-question v-if="infotype=='风险'" :qtype="'2'" :sel-project='selProject' ref="xmRisk"></xm-question>
<el-drawer title="选中团队成员" :visible.sync="groupUserVisible" size="50%" append-to-body :close-on-click-modal="false">
<xm-group-select :sel-project="selProject" :visible="groupUserVisible" is-select-multi-user="1" @user-confirm="onUserSelected"></xm-group-select>
</el-drawer>

34
src/views/xm/core/xmProject/XmProjectMng.vue

@ -99,8 +99,9 @@
<el-col v-cloak v-for="(p,i) in ScreenData" :key="i" :xl="8" :lg="8" :md="8" :sm="12">
<el-card @click.native="intoInfo(p,i)" class="project-card" shadow="always" id="prj-view-box">
<div class="project-name" title="这是项目名称">{{p.name}}</div>
<div class="project-id"><span title="项目代号">{{p.code}} </span><font title="项目状态" :color="p.status=='7'?'green':'blue'">{{formatProjectStatus(dicts,'projectStatus',p.status)}}</font>
<el-link id="prj-del-btn" type="danger" style="font-size:14px;float:right;margin-left:2px;" title="删除项目" @click.stop="handleDel(p)" v-loading="load.add">删除</el-link>
<div class="project-id"><span title="项目代号">{{p.code}} </span>
<el-tag title="项目状态" v-for="(item,index) in formatDictsWithClass(dicts,'projectStatus',p.status)" :key="index" :type="item.className">{{item.name}}</el-tag>
<el-link id="prj-del-btn" type="danger" style="font-size:14px;float:right;margin-left:2px;" title="删除项目" @click.stop="handleDel(p)" v-loading="load.add">删除</el-link>
<el-link id="prj-copy-btn" type="primary" style="font-size:14px;float:right;margin-left:2px;" title="通过复制快速创建新项目" @click.stop="onCopyToBtnClick(p)" v-loading="load.add">复制</el-link>
<el-link id="prj-calc-btn" type="warning" style="font-size:14px;float:right;margin-left:2px;" title="统计项目的工作量、进度、需求、bugs等数据" @click.stop="loadTasksToXmProjectState(p)" v-loading="load.add">统计</el-link>
</div>
@ -151,21 +152,16 @@
</el-row>
<el-table ref="table" :height="maxTableHeight" v-cloak v-show="!showType" fit stripe :data="ScreenData" @sort-change="sortChange" highlight-current-row v-loading="load.list" @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column type="index" label="序号" width="60" ></el-table-column>
<el-table-column prop="id" label="项目编码" width="120" sortable show-overflow-tooltip></el-table-column>
<el-table-column prop="name" label="标题" sortable min-width="200" >
<el-table-column type="index" label="序号" width="60" fixed="left"></el-table-column>
<el-table-column prop="id" label="项目编码" min-width="150" sortable show-overflow-tooltip fixed="left"></el-table-column>
<el-table-column prop="name" label="标题" sortable min-width="250" fixed="left">
<template slot-scope="scope">
<el-link type="primary" @click.stop="intoInfo(scope.row)">{{scope.row.name}}</el-link>
</template>
</el-table-column>
<el-table-column prop="status" label="状态" width="80 sortable" :formatter="formatterByDicts">
<template slot-scope="scope">
<el-tag v-if="scope.row.status=='0'" type="info" effect="plain">{{formatProjectStatus(scope.row.status)}}</el-tag>
<el-tag v-else-if="scope.row.status=='1' || scope.row.status=='2'|| scope.row.status=='3'" type="primary" effect="plain">{{formatProjectStatus(scope.row.status)}}</el-tag>
<el-tag v-else-if="scope.row.status=='4' " type="warning" effect="plain">{{formatProjectStatus(scope.row.status)}}</el-tag>
<el-tag v-else-if="scope.row.status=='5'||scope.row.status=='6' || scope.row.status=='7'|| scope.row.status=='8'" type="success" effect="plain">{{formatProjectStatus(scope.row.status)}}</el-tag>
<el-tag v-else type="danger" effect="plain">{{formatProjectStatus(scope.row.status)}}</el-tag>
<el-table-column prop="status" label="状态" width="100" sortable fixed="left">
<template slot-scope="scope">
<el-tag v-for="(item,index) in formatDictsWithClass(dicts,'projectStatus',scope.row.status)" :key="index" :type="item.className">{{item.name}}</el-tag>
</template>
</el-table-column>
<el-table-column prop="finishRate" label="进度" width="100" sortable>
@ -177,21 +173,21 @@
</font>
</template>
</el-table-column>
<el-table-column prop="productCnt" label="产品数" sortable min-width="80" >
<el-table-column prop="productCnt" label="产品数" sortable min-width="120" >
</el-table-column>
<el-table-column prop="iterationCnt" label="迭代数" sortable min-width="80" >
<el-table-column prop="iterationCnt" label="迭代数" sortable min-width="120" >
</el-table-column>
<el-table-column prop="menuCnt" label="需求数" sortable min-width="80" >
<el-table-column prop="menuCnt" label="需求数" sortable min-width="120" >
<template slot-scope="scope">
<span title="完成的需求数 / 需求总数 ">{{scope.row.menuCnt>0?scope.row.menuFinishCnt+'&nbsp;/&nbsp;'+scope.row.menuCnt:''}}</span>
</template>
</el-table-column>
<el-table-column prop="taskCnt" label="任务数" sortable min-width="80" >
<el-table-column prop="taskCnt" label="任务数" sortable min-width="120" >
<template slot-scope="scope">
<span title="完成的任务数 / 任务总数 ">{{scope.row.taskCnt>0?scope.row.taskFinishCnt+'&nbsp;/&nbsp;'+scope.row.taskCnt:''}}</span>
</template>
</el-table-column>
<el-table-column prop="bugCnt" label="缺陷" sortable min-width="80" >
<el-table-column prop="bugCnt" label="缺陷" sortable min-width="120" >
<template slot-scope="scope">
<span title="关闭的缺陷数 / 缺陷总数 ">{{scope.row.bugCnt>0?scope.row.closedBugs+'&nbsp;/&nbsp;'+scope.row.bugCnt:''}}</span>
</template>
@ -201,7 +197,7 @@
{{scope.row.startTime? scope.row.startTime.substr(0,10) : ""}}~{{scope.row.endTime? scope.row.endTime.substr(0,10) : ""}}
</template>
</el-table-column>
<el-table-column prop="bizFlowState" label="审批状态" min-width="80" >
<el-table-column prop="bizFlowState" label="审批状态"min-width="120" >
<template slot-scope="scope">
<el-tag v-for="(item,index) in formatDictsWithClass(dicts,'bizFlowState',scope.row.bizFlowState)" :key="index" :type="item.className">{{item.name}}</el-tag>
</template>

7
src/views/xm/core/xmQuestion/XmQuestionAdd.vue

@ -186,7 +186,12 @@
'visible':function(visible) {
if(visible==true){
//
this.addForm.qtype=this.qtype
if(this.qtype){
this.addForm.qtype=this.qtype
}else{
this.addForm.qtype='1'
}
this.addForm.id=sn('bug_')
this.initByExec();

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

@ -244,7 +244,7 @@
props:['xmQuestion','visible',"selProject"],
watch: {
'xmQuestion':function( xmQuestion ) {
this.editForm = xmQuestion;
this.editForm = {...xmQuestion};
},
'visible':function(visible) {
if(visible==true){

16
src/views/xm/core/xmRecord/XmRecord.vue

@ -2,7 +2,7 @@
<section class="page-container padding border">
<el-row v-if="!simple">
<el-input v-model="filters.key" style="width: 20%;" placeholder="模糊查询"></el-input>
<el-radio v-model="filters.objType" v-for="i in objTypeOptions" :label="i.key" :key="i.key">{{i.name}}</el-radio>
<span v-if="!objType"><el-radio v-model="filters.objType" v-for="i in objTypeOptions" :label="i.key" :key="i.key">{{i.name}}</el-radio></span>
<el-button type="primary" v-loading="load.list" :disabled="load.list==true" v-on:click="searchXmRecords">查询</el-button>
</el-row>
<el-row class="page-main">
@ -65,12 +65,15 @@
'userInfo','roles'
])
},
props:["projectId","objType","objId","simple" ,"visible"],
props:["projectId",'productId',"objType","bizId","simple" ,"visible"],
watch:{
visible:function(visible){
if( visible ==true ){
this.getXmRecords();
this.searchXmRecords();
}
},
bizId:function(bizId){
this.searchXmRecords();
}
},
data() {
@ -157,8 +160,11 @@
if(this.projectId){
params.projectId=this.projectId;
}
if(this.objId){
params.taskId=this.objId;
if(this.productId){
params.productId=this.productId;
}
if(this.bizId){
params.bizId=this.bizId;
}
this.load.list = true;
listXmRecord(params).then((res) => {

9
src/views/xm/core/xmRecord/XmRecordMng.vue

@ -9,12 +9,7 @@
import Vue from 'vue'
import { mapGetters } from 'vuex'
import XmRecord from './XmRecord'
if(!Vue.component("xm-record")){
Vue.component('xm-record',XmRecord)
Vue.use(XmRecord);
}
import XmRecord from './XmRecord'
export default {
computed: {
@ -32,7 +27,7 @@
},//end methods
components: {
XmRecord
},
mounted() {

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

@ -92,7 +92,7 @@
</el-row>
<el-tabs value="1" accordion>
<el-tabs v-model="activateTabPaneName" >
<el-tab-pane label="基础信息" name="1">
<el-row>
<el-col :span="10">
@ -164,10 +164,10 @@
</el-row>
</el-tab-pane>
<el-tab-pane :label="'子工作项('+subWorkItemNum+')'" name="4" v-if="editForm.ntype==='1'">
<xm-sub-work-item :parent-xm-task="editForm" @sub-work-item-num="setSubWorkItemNum" @add-sub-task="onAddSubTask"></xm-sub-work-item>
<xm-sub-work-item v-if="activateTabPaneName=='4'" :parent-xm-task="editForm" @sub-work-item-num="setSubWorkItemNum" @add-sub-task="onAddSubTask"></xm-sub-work-item>
</el-tab-pane>
<el-tab-pane label="工时" name="5">
<xm-task-workload-record :visible="visible" :xm-task="editForm" ></xm-task-workload-record>
<xm-task-workload-record v-if="activateTabPaneName=='5'" :xm-task="editForm" ></xm-task-workload-record>
</el-tab-pane>
<el-tab-pane label="预算金额" name="6">
<el-form-item label="自研工时单价" prop="uniInnerPrice">
@ -218,6 +218,9 @@
<el-step title="提现" description="企业付款完成后,个人对钱包中余额进行提现"></el-step>
</el-steps>
</el-tab-pane>
<el-tab-pane label="日志" name="9">
<xm-record v-if="activateTabPaneName=='9'" :biz-id="editForm.id" :obj-type="'task'"></xm-record>
</el-tab-pane>
</el-tabs>
</el-form>
</el-row>
@ -273,6 +276,7 @@
import XmGroupSelect from '../xmGroup/XmGroupSelect.vue';
import XmMenuRichDetail from '../xmMenu/XmMenuRichDetail';
import TagMng from "@/views/mdp/arc/tag/TagMng";
import XmRecord from '../xmRecord/XmRecord'
import XmSubWorkItem from "@/views/xm/core/xmTaskWorkItem/XmSubWorkItem";
import XmTaskWorkloadRecord from "../xmTaskWorkload/XmTaskWorkloadRecord"
@ -375,6 +379,7 @@ import XmMenuEdit from '../xmMenu/XmMenuEdit.vue';
pickerOptions: util.getPickerOptions('datarange'),
tagSelectVisible:false,
subWorkItemNum:0,
activateTabPaneName:'1'
/**end 在上面加自定义属性**/
}//end return
},//end data
@ -649,6 +654,7 @@ import XmMenuEdit from '../xmMenu/XmMenuEdit.vue';
components: {
xmSkillMng,
skillMng,xmMenuSelect,XmTaskList,XmExecuserMng,XmGroupSelect,XmMenuRichDetail,TagMng,XmSubWorkItem,XmTaskWorkloadRecord,XmMenuEdit,
XmRecord,
// 'xm-task-edit':XmTaskEdit
},
mounted() {

4
src/views/xm/core/xmTask/XmTaskMng.vue

@ -2497,7 +2497,9 @@ export default {
mounted() {
this.initData();
this.$nextTick(() => {
this.getXmTasks();
if(this.isTaskCenter ||(this.selProject && this.selProject.id)){
this.getXmTasks();
}
this.tableHeight = this.source == 'GZT' ? this.tableHeight : util.calcTableMaxHeight(this.$refs.table.$el);
initSimpleDicts( "all", ["planType","taskType","priority","xmTaskSettleSchemel","priority","taskState" ]).then((res) => {
this.dicts = res.data.data;

2
src/views/xm/core/xmTaskExecuser/XmTaskExecuserForTask.vue

@ -71,7 +71,7 @@
<el-drawer append-to-body title="报价" :visible.sync="quotePriceVisible" size="60%" :close-on-click-modal="false">
<el-form :model="quotePriceForm" label-width="100px" ref="quotePriceForm">
<el-form-item label="候选人名称">
<span>{{ quotePriceForm.username }}</span>
<span>{{ quotePriceForm.username }} </span>
</el-form-item>
<el-form-item label="报价工期" prop="quoteWeekday">
<div>

10
src/views/xm/core/xmTaskExecuser/XmTaskExecuserMng.vue

@ -4,7 +4,8 @@
<el-input v-model="filters.key" style="width: 20%;" placeholder="任务名称、用户姓名模糊查询" clearable></el-input>
<el-input v-model="filters.taskId" style="width:150px;" placeholder="任务编号查询" clearable></el-input>
<el-input v-model="filters.projectId" style="width: 150px;" placeholder="项目编号" clearable></el-input>
<el-input v-model="filters.execUserBranchId" style="width: 150px;" placeholder="归属公司" clearable></el-input>
<el-input v-model="filters.execUserBranchId" style="width: 150px;" placeholder="用户公司编号" clearable></el-input>
<el-input v-model="filters.branchId" style="width: 150px;" placeholder="项目公司编号" clearable></el-input>
<el-select v-model="filters.status" placeholder="候选状态" clearable>
<el-option v-for="(item,index) in dicts.projectTaskExecuserStatus" :value="item.id" :label="item.name" :key="index"></el-option>
</el-select>
@ -19,7 +20,9 @@
<el-table ref="table" :height="tableHeight" :data="xmTaskExecusers" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column label="序号" type="index" width="60" fixed="left">
</el-table-column>
<el-table-column prop="username" label="姓名" width="150" sortable show-overflow-tooltip fixed="left">
<el-table-column prop="username" label="用户姓名" width="150" sortable show-overflow-tooltip fixed="left">
</el-table-column>
<el-table-column prop="execUserBranchId" label="用户归属公司" width="150" sortable show-overflow-tooltip fixed="left">
</el-table-column>
<el-table-column prop="status" label="候选状态" width="100" sortable fixed="left">
<template slot-scope="scope">
@ -74,8 +77,6 @@
</el-table-column>
<el-table-column prop="remarks" label="备注" min-width="150" sortable show-overflow-tooltip>
</el-table-column>
<el-table-column prop="execUserBranchId" label="归属公司" width="150" sortable show-overflow-tooltip>
</el-table-column>
<el-table-column label="报价信息" min-width="150">
<el-table-column prop="createTime" label="报价时间" width="150" sortable>
@ -211,6 +212,7 @@
projectId:'',
status:'',
taskState:'',
branchId:'',
},
xmTaskExecusers: [],//
pageInfo:{//

281
src/views/xm/core/xmTaskExecuser/XmTaskExecuserSelect.vue

@ -0,0 +1,281 @@
<template>
<section class="padding">
<el-row>
<el-input v-model="filters.key" style="width: 20%;" placeholder="任务名称、用户姓名模糊查询" clearable></el-input>
<el-input v-model="filters.taskId" style="width:150px;" placeholder="任务编号查询" clearable></el-input>
<span v-if="!selProject || !selProject.id">
<el-input v-model="filters.projectId" style="width: 150px;" placeholder="项目编号" clearable></el-input>
<el-input v-model="filters.branchId" style="width: 150px;" placeholder="项目公司编号" clearable></el-input>
</span>
<el-input v-model="filters.execUserBranchId" style="width: 150px;" placeholder="用户公司编号" clearable></el-input>
<el-select v-model="filters.status" placeholder="候选状态" clearable>
<el-option v-for="(item,index) in dicts.projectTaskExecuserStatus" :value="item.id" :label="item.name" :key="index"></el-option>
</el-select>
<el-select v-model="filters.taskState" placeholder="任务状态" clearable>
<el-option v-for="(item,index) in dicts.taskState" :value="item.id" :label="item.name" :key="index"></el-option>
</el-select>
<el-button type="primary" v-loading="load.list" :disabled="load.list==true" v-on:click="searchXmTaskExecusers">查询</el-button>
<span style="float:right;">
<el-button type="primary" @click="select">确认选择</el-button>
</span>
<!-- <el-button type="danger" v-loading="load.del" @click="batchDel" :disabled="this.sels.length===0 || load.del==true">批量删除</el-button> -->
</el-row>
<el-row class="page-main ">
<!--列表 XmTaskExecuser xm_task_execuser-->
<el-table ref="table" :height="tableHeight" :data="xmTaskExecusers" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column label="" type="selection" width="60" fixed="left">
</el-table-column>
<el-table-column label="序号" type="index" width="60" fixed="left">
</el-table-column>
<el-table-column prop="username" label="用户姓名" width="150" sortable show-overflow-tooltip fixed="left">
<template slot-scope="scope">
{{scope.row.username}}
</template>
</el-table-column>
<el-table-column prop="execUserBranchId" label="用户归属公司" width="150" sortable show-overflow-tooltip fixed="left">
</el-table-column>
<el-table-column prop="status" label="候选状态" width="100" sortable fixed="left">
<template slot-scope="scope">
<el-link type="primary" v-if="scope.row.status=='0'">候选中</el-link>
<el-link type="success" v-else-if="scope.row.status=='1'">执行中 </el-link>
<el-link type="info" v-else-if="scope.row.status=='7'">已放弃 </el-link>
<el-link type="danger" v-else-if="scope.row.status=='8'">黑名单 </el-link>
</template>
</el-table-column>
<el-table-column prop="taskName" label="任务名称" width="150" sortable show-overflow-tooltip fixed="left">
</el-table-column>
<el-table-column prop="taskName" label="任务状态" width="100" sortable show-overflow-tooltip >
<template slot-scope="scope">
<el-tag v-for="(item,index) in formatDictsWithClass(dicts,'taskState',scope.row.taskState)" :key="index" :type="item.className">{{item.name}}</el-tag>
</template>
</el-table-column>
<el-table-column prop="projectId" label="项目编号" width="100" sortable show-overflow-tooltip>
</el-table-column>
<el-table-column prop="startTime" label="加入时间" width="150" sortable>
</el-table-column>
<el-table-column prop="endTime" label="离开时间" width="150" sortable>
</el-table-column>
<el-table-column prop="skillRemark" label="技能" min-width="150" sortable show-overflow-tooltip>
</el-table-column>
<el-table-column prop="remarks" label="备注" min-width="150" sortable show-overflow-tooltip>
</el-table-column>
<el-table-column label="报价信息" min-width="150">
<el-table-column prop="createTime" label="报价时间" width="150" sortable>
</el-table-column>
<el-table-column prop="quoteWorkload" label="报价工作量" width="100" sortable>
<template slot-scope="scope">
{{scope.row.quoteWorkload?scope.row.quoteWorkload:'-'}}h
</template>
</el-table-column>
<el-table-column prop="quotePrice" label="报价金额" width="100" sortable>
<template slot-scope="scope">
{{scope.row.quotePrice?scope.row.quotePrice:'-'}}
</template>
</el-table-column>
</el-table-column>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
</section>
</template>
<script>
import util from '@/common/js/util';//
import config from "@/common/config"; //
//import Sticky from '@/components/Sticky' // header
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmTaskExecuserWithTask,editXmTaskExecuser,leaveTask,beExecutor,settleExec, delXmTaskExecuser, batchDelXmTaskExecuser,quotePrice,becomeCandidate,toTest,testSuccess,testFail } from '@/api/xm/core/xmTaskExecuser';
import { mapGetters } from 'vuex'
export default {
computed: {
...mapGetters([
'userInfo','roles'
]),
xmTask:function(){
var xmTask={...this.editForm}
xmTask.id=this.editForm.taskId;
return xmTask;
}
},
props: ["visible",'selProject'],
watch: {
'visible': function(val) {
if(val == true){
this.searchXmTaskExecusers();
}
},
},
data() {
return {
filters: {
key: '',
execUserBranchId:'',
taskId:'',
projectId:'',
status:'',
taskState:'',
branchId:'',
},
xmTaskExecusers: [],//
pageInfo:{//
total:0,//0>0
pageSize:10,//
count:false,//
pageNum:1,//1
orderFields:['res.create_time'],// ['sex','student_id']
orderDirs:['desc']// asc,desc ['asc','desc']
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
dicts:{
projectTaskExecuserStatus:[],
projectTaskSettleStatus:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmTaskExecuser
//xmTaskExecuser
addForm: {
createTime:'',id:'',taskId:'',userid:'',startTime:'',endTime:'',status:'',remarks:'',settleAmount:'',settleWorkload:'',settleStatus:'',settleTime:'',createUserid:'',createUsername:'',username:'',matchScore:'',quoteWeekday:'',quoteAmount:'',quoteTime:'',bizProcInstId:'',bizFlowState:'',projectId:'',phaseId:'',skillRemark:'',quoteWorkload:'',quoteStartTime:'',quoteEndTime:'',branchId:'',projectPhaseName:'',taskName:''
},
editFormVisible: false,//
//xmTaskExecuser
editForm: {
createTime:'',id:'',taskId:'',userid:'',startTime:'',endTime:'',status:'',remarks:'',settleAmount:'',settleWorkload:'',settleStatus:'',settleTime:'',createUserid:'',createUsername:'',username:'',matchScore:'',quoteWeekday:'',quoteAmount:'',quoteTime:'',bizProcInstId:'',bizFlowState:'',projectId:'',phaseId:'',skillRemark:'',quoteWorkload:'',quoteStartTime:'',quoteEndTime:'',branchId:'',projectPhaseName:'',taskName:''
},
/**begin 自定义属性请在下面加 请加备注**/
pickerOptions: util.getPickerOptions('datarange'),
tableHeight:300,
/**end 自定义属性请在上面加 请加备注**/
}
},//end data
methods: {
...util,
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
this.getXmTaskExecusers();
},
handleCurrentChange(pageNum) {
this.pageInfo.pageNum = pageNum;
this.getXmTaskExecusers();
},
// obj.order=ascending/descending, asc/desc ; obj.prop=,
sortChange( obj ){
var dir='asc';
if(obj.order=='ascending'){
dir='asc'
}else{
dir='desc';
}
if(obj.prop=='xxx'){
this.pageInfo.orderFields=['xxx'];
this.pageInfo.orderDirs=[dir];
}
this.getXmTaskExecusers();
},
searchXmTaskExecusers(){
this.pageInfo.count=true;
this.getXmTaskExecusers();
},
// XmTaskExecuser xm_task_execuser
getXmTaskExecusers() {
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;
if(this.filters.taskId){
params.taskId=this.filters.taskId
}
if(this.filters.projectId){
params.projectId=this.filters.projectId
}
if(this.selProject && this.selProject.id){
params.projectId=this.selProject.id
}
if(this.filters.execUserBranchId){
params.execUserBranchId=this.filters.execUserBranchId
}
if(this.filters.taskState){
params.taskState=this.filters.taskState
}
if(this.filters.status){
params.status=this.filters.status
}
listXmTaskExecuserWithTask(params).then((res) => {
var tips=res.data.tips;
if(tips.isOk){
this.pageInfo.total = res.data.total;
this.pageInfo.count=false;
this.xmTaskExecusers = res.data.data;
this.$emit("loadExecUserList",this.xmTaskExecusers);
}else{
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: 'error' });
}
this.load.list = false;
}).catch( err => this.load.list = false );
},
//xmTaskExecuser
selsChange: function (sels) {
this.sels = sels;
},
rowClick: function(row, event, column){
this.editForm=row;
this.$emit('row-click',row, event, column);// @row-click="rowClick"
},
/**end 自定义函数请在上面加**/
select: function(){
this.$emit('select',this.sels);// @row-click="rowClick"
},
},//end methods
components: {
//
},
mounted() {
this.$nextTick(() => {
this.tableHeight = util.calcTableMaxHeight(this.$refs.table.$el);
this.getXmTaskExecusers();
});
initSimpleDicts('all',['projectTaskExecuserStatus','projectTaskSettleStatus','taskState']).then(res=>{
this.dicts=res.data.data;
})
}
}
</script>
<style scoped>
.exec-navbar{
background: #fafbfc;
padding: 0 20px;
height: 50px;
overflow: auto hidden;
line-height: 50px;
}
.badge {
margin-top: 7px;
padding-bottom: 10px;
}
</style>
Loading…
Cancel
Save