diff --git a/config/index.js b/config/index.js index e241b113..371874da 100644 --- a/config/index.js +++ b/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', diff --git a/package.json b/package.json index 0874e812..e2ae66fe 100644 --- a/package.json +++ b/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", diff --git a/src/api/login.js b/src/api/login.js index f01c13ec..ac243514 100644 --- a/src/api/login.js +++ b/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' + }) +} + diff --git a/src/api/mdp/sys/branch.js b/src/api/mdp/sys/branch.js index 73c3744f..e00a7192 100644 --- a/src/api/mdp/sys/branch.js +++ b/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); }; \ No newline at end of file +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) + }); + } +}; \ No newline at end of file diff --git a/src/api/mdp/sys/userLoginRecord.js b/src/api/mdp/sys/userLoginRecord.js new file mode 100644 index 00000000..06796f75 --- /dev/null +++ b/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) + }); + } +}; \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index 0992248f..3ee07bcf 100644 --- a/src/router/index.js +++ b/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 } }, diff --git a/src/router/routes_my_work.js b/src/router/routes_my_work.js index e3d222ed..f67f4c78 100644 --- a/src/router/routes_my_work.js +++ b/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' + } + }, ] } ] diff --git a/src/views/layout/components/Navbar.vue b/src/views/layout/components/Navbar.vue index 9c5c5e2f..75670e59 100644 --- a/src/views/layout/components/Navbar.vue +++ b/src/views/layout/components/Navbar.vue @@ -27,7 +27,7 @@ - +
@@ -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() { diff --git a/src/views/login/components/login.vue b/src/views/login/components/login.vue index d60ce41d..15c70dd9 100644 --- a/src/views/login/components/login.vue +++ b/src/views/login/components/login.vue @@ -1,5 +1,6 @@ @@ -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); + } } diff --git a/src/views/login/components/register.vue b/src/views/login/components/register.vue index 909f9f52..da0c3ce3 100644 --- a/src/views/login/components/register.vue +++ b/src/views/login/components/register.vue @@ -10,7 +10,10 @@ - 发送验证码 + 发送验证码 + 该手机号已注册有{{phonenoUsers.length}}个账户 + 查看明细 + @@ -36,6 +39,23 @@ + + + + + + + + + + + + + +
@@ -44,7 +64,7 @@ - - + + -.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; - } - } -} - \ No newline at end of file diff --git a/src/views/login/index2.vue b/src/views/login/index2.vue deleted file mode 100644 index 0e4ae6a6..00000000 --- a/src/views/login/index2.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - diff --git a/src/views/login/register.vue b/src/views/login/register.vue deleted file mode 100644 index fb879e04..00000000 --- a/src/views/login/register.vue +++ /dev/null @@ -1,378 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/views/mdp/sys/branch/BranchEdit.vue b/src/views/mdp/sys/branch/BranchEdit.vue new file mode 100644 index 00000000..b6e03c69 --- /dev/null +++ b/src/views/mdp/sys/branch/BranchEdit.vue @@ -0,0 +1,182 @@ + + + + + \ No newline at end of file diff --git a/src/views/myWork/set/BranchEdit.vue b/src/views/myWork/set/BranchEdit.vue new file mode 100644 index 00000000..b6e03c69 --- /dev/null +++ b/src/views/myWork/set/BranchEdit.vue @@ -0,0 +1,182 @@ + + + + + \ No newline at end of file diff --git a/src/views/myWork/set/ChangeEmailStepOne.vue b/src/views/myWork/set/ChangeEmailStepOne.vue new file mode 100644 index 00000000..c81dbec7 --- /dev/null +++ b/src/views/myWork/set/ChangeEmailStepOne.vue @@ -0,0 +1,163 @@ + + + + + \ No newline at end of file diff --git a/src/views/myWork/set/ChangeEmailStepTwo.vue b/src/views/myWork/set/ChangeEmailStepTwo.vue new file mode 100644 index 00000000..0901a275 --- /dev/null +++ b/src/views/myWork/set/ChangeEmailStepTwo.vue @@ -0,0 +1,109 @@ + + + + + \ No newline at end of file diff --git a/src/views/myWork/set/index.vue b/src/views/myWork/set/index.vue index 98df6e58..1fbf4f84 100644 --- a/src/views/myWork/set/index.vue +++ b/src/views/myWork/set/index.vue @@ -5,13 +5,21 @@
- {{userInfo.username}} + {{userInfo.username}} + + 个人账户 + 企业管理员账户 + 企业员工账户 + {{editForm.branchName}} + 升级为企业账户 + 切换账户 + 所在部门:{{userInfo.deptName}} 修改头像
-
+

基本信息

@@ -19,15 +27,46 @@ - + + + + 绑定手机 + 更换手机 + - + + 绑定邮箱 + 更换邮箱 保存 + 绑定主账户
+
+

绑定主账户

+ + + 主账号指平台统一账户,一般同一个手机号、微信号、邮箱认为是同一个账户 +
+ 绑定主账户后,可以实现微信、app、公众号、小程序等各个应用账户互通 +
+ + +
+ 扫描绑定{{editForm.username}}主账号 +
+ + 返回 + +
+

密码设置

@@ -57,76 +96,59 @@ :remark="userInfo.username" > 商品高清大图 - -
- - - - - + + + + + + + + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/src/views/xm/XmOverview.vue b/src/views/xm/XmOverview.vue index 6776fd97..c714272d 100644 --- a/src/views/xm/XmOverview.vue +++ b/src/views/xm/XmOverview.vue @@ -1,355 +1,154 @@ - - \ No newline at end of file diff --git a/src/views/xm/XmOverview2.vue b/src/views/xm/XmOverview2.vue deleted file mode 100644 index c714272d..00000000 --- a/src/views/xm/XmOverview2.vue +++ /dev/null @@ -1,1163 +0,0 @@ - - - - - diff --git a/src/views/xm/core/components/XmProjectSelect.vue b/src/views/xm/core/components/XmProjectSelect.vue index b083e1fd..eae4de7a 100644 --- a/src/views/xm/core/components/XmProjectSelect.vue +++ b/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; }, diff --git a/src/views/xm/core/xmGroup/XmGroupMng.vue b/src/views/xm/core/xmGroup/XmGroupMng.vue index 5fa13710..53920b15 100644 --- a/src/views/xm/core/xmGroup/XmGroupMng.vue +++ b/src/views/xm/core/xmGroup/XmGroupMng.vue @@ -1,7 +1,7 @@ + +