You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

389 lines
11 KiB

2 years ago
  1. <template>
  2. <section>
  3. <el-dialog
  4. title="外邀新成员"
  5. :visible.sync="visible"
  6. :close-on-click-modal="false"
  7. append-to-body
  8. :width="width?width:'70%'"
  9. >
  10. <el-row>
  11. <el-col :span="12">
  12. <el-form label-position="top" label-width="150">
  13. <el-form-item label="邀请方式">
  14. <el-row>
  15. <div class="img-box" @click="setInviteType('email')">
  16. <img class="img-item" v-if="inviteType!=='email'" src="@/assets/image/sys/invite/email-0.png" />
  17. <img class="img-item" v-if="inviteType==='email'" src="@/assets/image/sys/invite/email-1.png" />
  18. <p class="img-text">邮箱邀请</p>
  19. </div>
  20. <div class="img-box" @click="setInviteType('phone')">
  21. <img class="img-item" v-if="inviteType!=='phone'" src="@/assets/image/sys/invite/phone-0.png"/>
  22. <img class="img-item" v-else-if="inviteType==='phone'" src="@/assets/image/sys/invite/phone-1.png"/>
  23. <p class="img-text">手机邀请</p>
  24. </div>
  25. <div class="img-box" @click="setInviteType('ewCode')" v-loading="load.ewCode">
  26. <img class="img-item" v-if="inviteType!=='ewCode'" src="@/assets/image/sys/invite/ew-code-0.png"/>
  27. <img class="img-item" v-else-if="inviteType==='ewCode'" src="@/assets/image/sys/invite/ew-code-1.png"/>
  28. <p class="img-text">二维码邀请</p>
  29. </div>
  30. </el-row>
  31. </el-form-item>
  32. </el-form>
  33. </el-col>
  34. <el-col :span="12">
  35. <el-form v-model="addForm" :rules="addFormRules" label-position="top">
  36. <el-form-item label="邮箱" v-if="inviteType==='email'" prop="emails">
  37. <el-input type="textarea" :rows="6" v-model="addForm.emails" placeholder="支持多邮箱,邮箱之间用逗号,分割">
  38. </el-input>
  39. </el-form-item>
  40. <el-form-item label="手机号码" v-if="inviteType==='phone'" prop="phonenos">
  41. <el-input type="textarea" :rows="6" v-model="addForm.phonenos" placeholder="支持多号码,号码之间用逗号,分割">
  42. </el-input>
  43. </el-form-item>
  44. <el-form-item label="二维码" v-loading="load.ewCode">
  45. <div style="text-align:center;" v-show="inviteType==='ewCode'">
  46. <div>
  47. <div id="login_container"></div>
  48. </div>
  49. <p v-if="joinUsername"> {{joinUsername}}您好{{userInfo.branchName}}-{{userInfo.username}}邀请您扫码登录</p>
  50. <p v-else> {{userInfo.branchName}}-{{userInfo.username}}邀请您扫码登录</p>
  51. </div>
  52. </el-form-item>
  53. <el-form-item>
  54. <el-col :span="24" >
  55. <el-col :span="4">
  56. <el-button type="primary" @click.native="addSubmit" :loading="load.add" v-if="inviteType!=='ewCode'">提交</el-button>
  57. <el-button type="primary" @click.native="shareEwCode" :loading="load.add" v-if="inviteType=='ewCode'">分享链接</el-button>
  58. </el-col>
  59. </el-col>
  60. </el-form-item>
  61. </el-form>
  62. </el-col>
  63. </el-row>
  64. </el-dialog>
  65. </section>
  66. </template>
  67. <script>
  68. import util from '@/components/mdp-ui/js/util';//全局公共库
  69. import { addUser,inviteUsersByEmails,inviteUsersByPhonenos } from '../../../../api/mdp/sys/user';
  70. import * as UserTpaInviteApi from '@/api/mdp/sys/userTpaInvite';
  71. import Vue from "vue";
  72. import VueClipboard from "vue-clipboard2";
  73. VueClipboard.config.autoSetContainer = true; // add this line
  74. Vue.use(VueClipboard);
  75. import { mapGetters } from 'vuex'
  76. import md5 from 'js-md5';
  77. import VueQr from 'vue-qr'
  78. import logoSrc from "@/assets/image/logo_cicle.png"
  79. export default {
  80. props:{
  81. width:{
  82. type:String,
  83. default:'70%'
  84. },
  85. },
  86. computed: {
  87. ...mapGetters([
  88. 'userInfo'
  89. ]),
  90. },
  91. watch: {
  92. },
  93. data() {
  94. var validatePhoneno = (rule, value, callback) => {
  95. if (!value) {
  96. //callback(new Error('请输入密码'));
  97. callback();
  98. } else {
  99. if (value) {
  100. if(value.length<11 || value.length>11){
  101. callback(new Error('手机号码必须11位'));
  102. }
  103. if(!(/^1[3456789]\d{9}$/.test(value))){
  104. callback(new Error('手机号码格式不正确'));
  105. }
  106. }
  107. callback();
  108. }
  109. };
  110. var validateEmail = (rule, value, callback) => {
  111. if (!value) {
  112. //callback(nPhonenoew Error('请输入密码'));
  113. callback();
  114. } else {
  115. if (value) {
  116. var reg = /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/;
  117. if(!reg.test(value)){
  118. callback(new Error('邮箱格式不正确'));
  119. }
  120. }
  121. callback();
  122. }
  123. };
  124. return {
  125. load:{add: false,ewCode:false},
  126. visible:false,
  127. addFormRules: {
  128. },
  129. //新增界面数据 sys_user
  130. addForm: {
  131. phonenos:'',emails:''
  132. },
  133. inviteType:'email',//email|phone|ewCode
  134. logoSrc:logoSrc,
  135. joinUserid: '',
  136. joinUsername:'',
  137. /**end 在上面加自定义变量**/
  138. }//end return
  139. },//end data
  140. methods: {
  141. weixinLogin(){
  142. var curlDomain=window.location.protocol+"//"+window.location.host; //
  143. var mdpRedirectUri= `${curlDomain}/${process.env.CONTEXT}/${process.env.VERSION}/`
  144. var tpaContext=this.$mdp.getTpaContext();
  145. var domain=this.$mdp.getFixedDomain();
  146. var appType=this.$mdp.getWxpubConfig().appType;
  147. var scope=this.$mdp.getWxpubConfig().scope
  148. this.load.ewCode=true;
  149. var params={}
  150. if(this.joinUserid){
  151. params={joinUserid:this.joinUserid,joinUsername:this.joinUsername,inviteScene:'2',inviteType:'1'}
  152. }else{
  153. params={inviteScene:'3',inviteType:'1'}
  154. }
  155. var appType=this.$mdp.getWxpubConfig().appType
  156. UserTpaInviteApi.createInviteId(params).then(res=>{
  157. this.load.ewCode=false;
  158. var tips = res.data.tips;
  159. if(tips.isOk){
  160. this.inviteType='ewCode'
  161. this.inviteId=res.data.data.inviteId
  162. var state=this.inviteId
  163. var obj = new WxLogin({
  164. self_redirect:false,
  165. id:"login_container",
  166. appid: this.$mdp.getWxpubConfig().appid,
  167. scope: scope,
  168. redirect_uri: encodeURIComponent(`${domain}/api/${process.env.VERSION}/${tpaContext}/login/token?authType=wechat_wxpub&appType=${appType}&redirectUri=${mdpRedirectUri}`),
  169. state: state,
  170. style: "",
  171. href: ""
  172. });
  173. }else{
  174. this.$notify.error(tips.msg)
  175. }
  176. })
  177. },
  178. show(res){
  179. this.visible=true;
  180. if(res!=null && res.inviteType){
  181. if(res.joinUserid){
  182. this.joinUserid=res.joinUserid
  183. this.joinUsername=res.joinUsername
  184. }else{
  185. this.joinUserid=''
  186. this.joinUsername=''
  187. }
  188. if(res.inviteType){
  189. this.setInviteType(res.inviteType)
  190. }
  191. }else{
  192. this.joinUserid=''
  193. this.joinUsername=''
  194. this.setInviteType('email')
  195. }
  196. },
  197. getEwCodeCallbackUri(){
  198. //var ewCodeCallbackUri=window.location.protocol+"//"+window.location.host;
  199. var ewCodeCallbackUri=window.location.protocol+"//"+window.location.host;
  200. ewCodeCallbackUri=ewCodeCallbackUri+"/xm/"+process.env.VERSION+"/#/login?branchId="+this.userInfo.branchId
  201. return ewCodeCallbackUri;
  202. },
  203. setInviteType(inviteType){
  204. if(inviteType=='ewCode'){
  205. this.weixinLogin()
  206. }else{
  207. this.inviteType=inviteType
  208. }
  209. },
  210. clear(){
  211. },
  212. // 取消按钮点击 父组件监听@cancel="addFormVisible=false" 监听
  213. handleCancel:function(){
  214. this.$emit('cancel');
  215. },
  216. //新增提交User sys_user 父组件监听@submit="afterAddSubmit"
  217. addSubmit: function () {
  218. var func=inviteUsersByEmails
  219. var params={}
  220. if(this.inviteType==='phone'){
  221. if(!this.addForm.phonenos){
  222. this.$notify({ message:"请输入手机号码列表", type: 'error' });
  223. return;
  224. }
  225. this.addForm.phonenos=this.addForm.phonenos.replace(",",",");
  226. func = inviteUsersByPhonenos
  227. params.phonenos=this.addForm.phonenos.split(",")
  228. }
  229. if(this.inviteType==='email'){
  230. if(!this.addForm.emails){
  231. this.$notify({ message:"请输入邮箱号码列表", type: 'error' });
  232. return;
  233. }
  234. params.emails=this.addForm.emails.split(",")
  235. var curlDomain=window.location.protocol+"//"+window.location.host; // 返回https://mp.csdn.net
  236. params.callbackUri=curlDomain+"/xm/"+process.env.VERSION+"/"
  237. }
  238. this.load.add=true;
  239. func(params).then(res=>{
  240. this.load.add=false;
  241. var tips = res.data.tips;
  242. if(tips.isOk){
  243. this.$notify({ message:tips.msg, type: 'success' });
  244. }else{
  245. this.$notify({ message:tips.msg, type: 'error' });
  246. }
  247. }).catch(e=>this.load.add=false)
  248. },
  249. shareEwCode(){
  250. var remark=""
  251. if(this.joinUsername){
  252. remark=this.userInfo.branchName+'-'+this.userInfo.username+'邀请【'+this.joinUsername+'】微信扫码登录'
  253. }else{
  254. remark=this.userInfo.branchName+'-'+this.userInfo.username+'邀请您微信扫码登录'
  255. }
  256. const href =
  257. window.location.protocol +
  258. "//" +
  259. window.location.host +
  260. "/"+process.env.CONTEXT+"/" +
  261. process.env.VERSION +
  262. "/#/invite/code/"+this.inviteId+'?r='+remark;
  263. this.$copyText(href).then(e => {
  264. this.$message.success("分享链接已复制,您可直接黏贴到微信、浏览器地址栏等")
  265. });
  266. }
  267. /**begin 在下面加自定义方法**/
  268. /**end 在上面加自定义方法**/
  269. },//end method
  270. components: {
  271. VueQr
  272. },
  273. mounted() {
  274. var s1 = document.createElement('script');
  275. s1.type = 'text/javascript';
  276. s1.src = 'https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js';
  277. document.body.appendChild(s1);
  278. this.addForm.deptid=this.userInfo.deptid;
  279. }//end mounted
  280. }
  281. </script>
  282. <style scoped>
  283. .img-box{
  284. margin: 2px;
  285. float:left;
  286. width: 164px;
  287. height: 180px;
  288. background-color: aliceblue;
  289. text-align: center;
  290. cursor: pointer;
  291. padding: 40px;
  292. }
  293. .img-text{
  294. text-align: center;
  295. }
  296. .img-item{
  297. object-fit:scale-down;
  298. height: 50px;
  299. max-width: 80px;
  300. background-position: 50%;
  301. }
  302. .ew-code {
  303. position: relative;
  304. display: inline-block;
  305. height: 200px;
  306. width: 200px;
  307. padding: 20px;
  308. border: 1px solid rgba(19, 16, 229, 0.17);
  309. }
  310. .ew-code::before {
  311. position: absolute;
  312. top: 0;
  313. left: 0;
  314. content: "";
  315. width: 40px;
  316. height: 40px;
  317. border-top: 7px solid rgba(71, 121, 246, 1);
  318. border-left: 7px solid rgba(71, 121, 246, 1);
  319. }
  320. .ew-code-img{
  321. object-fit: scale-down;
  322. height: 100%;
  323. background-position: 50%;
  324. }
  325. .ew-code::after {
  326. position: absolute;
  327. top: 0;
  328. right: 0;
  329. content: "";
  330. width: 40px;
  331. height: 40px;
  332. border-top: 7px solid rgba(71, 121, 246, 1);
  333. border-right: 7px solid rgba(71, 121, 246, 1);
  334. }
  335. .ew-code .ew-code-footer {
  336. position: absolute;
  337. left: 0;
  338. bottom: 0;
  339. width: 100%;
  340. }
  341. .ew-code .ew-code-footer::before {
  342. position: absolute;
  343. bottom: 0;
  344. left: 0;
  345. content: "";
  346. width: 40px;
  347. height: 40px;
  348. border-bottom: 7px solid rgba(71, 121, 246, 1);
  349. border-left: 7px solid rgba(71, 121, 246, 1);
  350. }
  351. .ew-code .ew-code-footer::after {
  352. position: absolute;
  353. bottom: 0;
  354. right: 0;
  355. content: "";
  356. width: 40px;
  357. height: 40px;
  358. border-bottom: 7px solid rgba(71, 121, 246, 1);
  359. border-right: 7px solid rgba(71, 121, 246, 1);
  360. }
  361. </style>