Home.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. <template>
  2. <div>
  3. <common ref="common" @asynCallBack="asynCallBack"></common>
  4. <top-header :pageTitle="pageTitle" headerClass="vongi-bar" :leftShow="false"></top-header>
  5. <div class="mui-content margin49">
  6. <div class="vongi-index flew-sp flew-items">
  7. <div class="vongi-index-top">
  8. <div class="mui-media-object mui-pull-left">
  9. <img :src="person_data?(person_data.faceImageUrl+'?x-oss-process=image/resize,h_50,m_lfit'):''">
  10. </div>
  11. <div class="mui-media-body">
  12. <h3 v-if="person_data">{{person_data.name}}</h3>
  13. <p class='mui-ellipsis' v-text="person_popedom?(person_popedom.job?person_popedom.job:person_popedom.personRoleName):''"></p>
  14. </div>
  15. </div>
  16. <div class="vongi-index-right flew-items flew-sp">
  17. <template v-if="person_popedom && person_popedom.sceneId=='1'">
  18. <span :class="'text-list '+'work-status-color-'+person_data.workStatus" v-text="person_data?person_data.workStatusN:''"></span>
  19. <span class="line">|</span>
  20. </template>
  21. <a class="mui-pull-right" @click="selectRole">切换身份<span class="mui-icon iconfont icon-jiaohuan"></span></a>
  22. </div>
  23. </div>
  24. <div class="vongi-icons">
  25. <div class="vongi-index">
  26. <ul class="mui-table-view mui-grid-view mui-grid-9 vongi-grid-head">
  27. <li v-for="(item,index) in common_menu_list" :class="'mui-table-view-cell mui-media mui-col-xs-3 '+(item.iconRoute?'':'kfz')">
  28. <a v-if="item.iconUrl" @click="goto(item.iconUrl)">
  29. <img :src="requirePic(item.iconCommonPic)" />
  30. <div class="mui-media-body" v-text="item.iconName"></div>
  31. </a>
  32. <router-link v-else :to="{name:item.iconRoute,query:item.iconParam}">
  33. <img :src="requirePic(item.iconCommonPic)" />
  34. <div class="mui-media-body" v-text="item.iconName"></div>
  35. </router-link>
  36. </li>
  37. </ul>
  38. </div>
  39. <ul class="mui-table-view mui-grid-view mui-grid-9">
  40. <li v-for="(item,index) in menu_list" :class="'mui-table-view-cell mui-media mui-col-xs-3 '+(item.iconRoute?'':'kfz')">
  41. <a v-if="item.iconUrl" @click="goto(item.iconUrl)">
  42. <img :src="requirePic(item.iconPic)" />
  43. <div class="mui-media-body" v-text="item.iconName"></div>
  44. </a>
  45. <router-link v-else :to="{name:item.iconRoute,query:item.iconParam}">
  46. <img :src="requirePic(item.iconPic)" />
  47. <div class="mui-media-body" v-text="item.iconName"></div>
  48. </router-link>
  49. </li>
  50. <li class="mui-table-view-cell mui-media mui-col-xs-3">
  51. <router-link :to="{name:'MasterAllFun'}">
  52. <img src="http://rccs.oss-cn-hangzhou.aliyuncs.com/jp_housekeeper/img/cicon30.png?x-oss-process=image/resize,h_50,m_lfit" />
  53. <div class="mui-media-body">全部</div>
  54. </router-link>
  55. </li>
  56. </ul>
  57. </div>
  58. <div class="vongi-index-floor">
  59. <h4 class="vongi-floor-title">功能推荐区</h4>
  60. <div class="vongi-index-inter flew-sp">
  61. <div class="mui-col-xs-6">
  62. <router-link :to="{name:'MasterMineEditInfo'}" class="vongi-floor-padded">
  63. <div class="mui-media-body">
  64. <h4 class="mui-ellipsis">关联健康码</h4>
  65. <p class="mui-ellipsis">出行更便捷</p>
  66. </div>
  67. <img class="mui-media-object mui-pull-right" src="http://rccs.oss-cn-hangzhou.aliyuncs.com/jp_housekeeper/img/cicon15.png?x-oss-process=image/resize,h_50,m_lfit" width="54" />
  68. </router-link>
  69. </div>
  70. <div class="mui-col-xs-6">
  71. <a @tap="updateCompany" class="vongi-floor-padded">
  72. <div class="mui-media-body">
  73. <h4 class="mui-ellipsis">变更公司</h4>
  74. <p class="mui-ellipsis">重选所在公司</p>
  75. </div>
  76. <img class="mui-media-object mui-pull-right" src="http://rccs.oss-cn-hangzhou.aliyuncs.com/jp_housekeeper/img/cicon35.png?x-oss-process=image/resize,h_50,m_lfit" width="54" />
  77. </a>
  78. </div>
  79. <div v-if="noticeList&&noticeList.length" class="mui-col-xs-12">
  80. <div class="vongi-floor-padded">
  81. <router-link :to="{name:'CommonNotice',query:{type:1}}" v-for="(item,index) in noticeList" :key="index" :class="'text-list '+(item.readStatus?'':'red-after')">
  82. <h5 class="mui-ellipsis" v-text="item.title"></h5><span v-text="item.date"></span>
  83. </router-link>
  84. </div>
  85. <router-link :to="{name:'CommonNotice',query:{type:1}}" class="vongi-link"><span class="mui-icon mui-icon-forward"></span></router-link>
  86. </div>
  87. <div class="mui-col-xs-12">
  88. <div id="slider" class="mui-slider">
  89. <div class="mui-slider-group">
  90. <!-- 第一张 -->
  91. <div class="mui-slider-item" v-for="(item,i) in bannerTipsList" :key="i">
  92. <a @click="showTips(item)" >
  93. <img :src="item.picUrl">
  94. </a>
  95. </div>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. </div>
  101. <div class="vongi-index-floor">
  102. <h4 class="vongi-floor-title">优品推荐</h4>
  103. <div class="vongi-index-inter flew-sp">
  104. <div class="mui-col-xs-12">
  105. <ul class="mui-table-view mui-grid-view mui-grid-9 vongi-floor-padded">
  106. <li class="mui-table-view-cell mui-media mui-col-xs-6">
  107. <a href="javascript:void(0)">
  108. <div class="vongi-shop-img"><img src="http://rccs.oss-cn-hangzhou.aliyuncs.com/jp_housekeeper/img/camera02.jpg?x-oss-process=image/resize,h_100,m_lfit" width="100%" /></div>
  109. <div class="mui-media-body">智能手表</div>
  110. <div class="mui-media-body color-yellow">¥399.0</div>
  111. </a>
  112. </li>
  113. <li class="mui-table-view-cell mui-media mui-col-xs-6">
  114. <a href="javascript:void(0)">
  115. <div class="vongi-shop-img"><img src="http://rccs.oss-cn-hangzhou.aliyuncs.com/jp_housekeeper/img/camera01.jpg?x-oss-process=image/resize,h_100,m_lfit" width="100%" /></div>
  116. <div class="mui-media-body">看护摄像头</div>
  117. <div class="mui-media-body color-yellow">¥199.0</div>
  118. </a>
  119. </li>
  120. </ul>
  121. </div>
  122. </div>
  123. </div>
  124. <Tips :bannerTipsVisible="bannerTipsVisible" :bannerTipsPicUrl="bannerTipsPicUrl" :bannerTipsActivity="bannerTipsActivity"
  125. @bannerTipsHide="bannerTipsHide"></Tips>
  126. </div>
  127. <nav-menu :router="[{name:'Master'},{name:'MasterMineMessage'},{name:'MasterMineCenter'}]"></nav-menu>
  128. <loading :visible="isLoading"></loading>
  129. </div>
  130. </template>
  131. <script>
  132. require('$project/assets/js/mui.picker.min.js');
  133. import * as API_Common from '$project/apis/common'
  134. import * as API_Notice from '@/apis/Common/notice'
  135. import * as API_User from '$project/apis/user'
  136. import Common from '$project/components/Common.vue'
  137. import Loading from '$project/components/Loading.vue'
  138. import TopHeader from '$project/components/TopHeader.vue'
  139. import Tips from '$project/components/Tips.vue'
  140. import NavMenu from '@/components/NavMenu.vue'
  141. import {
  142. mapGetters,
  143. mapMutations
  144. } from 'vuex'
  145. import {
  146. hourDistance,
  147. currentTimeStamp,
  148. parseUnixTime
  149. } from '$project/utils'
  150. import * as types from '$project/store/mutation-types'
  151. export default {
  152. name: 'Master',
  153. components: {
  154. Common,
  155. Loading,
  156. TopHeader,
  157. NavMenu,Tips
  158. },
  159. data() {
  160. return {
  161. isLoading: false,
  162. roleList: [],
  163. bannerList:[
  164. {
  165. img:'Frame 913.png',
  166. url:"img:Frame 912 (2).png"
  167. }
  168. ],
  169. bannerTipsList: [],
  170. bannerInterval: null,
  171. //弹窗公告, 有就显示
  172. bannerTipsVisible: false,
  173. bannerTipsPicUrl: '',
  174. bannerTipsId: '',
  175. bannerTipsActivity: null,
  176. noticeList: [],
  177. }
  178. },
  179. created() {},
  180. methods: {
  181. showTips(item){
  182. this.bannerTipsVisible = true;
  183. this.bannerTipsPicUrl = item.linkUrl;
  184. },
  185. getBannerTipsInfo() {
  186. var time =parseUnixTime(currentTimeStamp(), '{y}-{m}-{d}');
  187. var bannerTipsTime= window.localStorage.getItem("xpgj_bannerTipsTime");
  188. //tips 广告
  189. API_Common.getBannerInfo("5").then(response => {
  190. // = response;
  191. this.bannerTipsList=response;
  192. if(!bannerTipsTime||bannerTipsTime!=time){
  193. if (this.bannerTipsList.length > 0) {
  194. this.bannerTipsVisible = true;
  195. var x = Math.floor(Math.random() * this.bannerTipsList.length);
  196. this.bannerTipsPicUrl = this.bannerTipsList[x].linkUrl;
  197. window.localStorage.setItem("xpgj_bannerTipsTime",time);
  198. }
  199. }
  200. }).catch(error => {
  201. mui.toast(error);
  202. })
  203. },
  204. bannerTipsHide() {
  205. this.bannerTipsVisible = false;
  206. },
  207. updateCompany(){
  208. var _this = this;
  209. var btnArray = ['取消', '确认'];
  210. mui.confirm('选择新公司后,需要新的公司管理员审核通过后方可正式加入', '确认变更', btnArray, function(e) {
  211. if (e.index == 1) {
  212. window.location.href="../home/#/register/business/step2?isupdate=1"
  213. }
  214. })
  215. },
  216. goto(url){
  217. window.location=url;
  218. },
  219. //获取用户角色列表
  220. getRoleList() {
  221. //this.isLoading = true;
  222. API_User.getRoleList().then(response => {
  223. this.isLoading = false;
  224. this.roleList = response.list;
  225. }).catch(error => {
  226. this.isLoading = false;
  227. mui.toast(error);
  228. })
  229. },
  230. //选择角色
  231. selectRole() {
  232. var roleList = [];
  233. if(this.roleList.length==0){
  234. mui.toast("加载中..");
  235. return
  236. }
  237. for (var i = 0; i < this.roleList.length; i++) {
  238. var preName = this.person_popedom.id == this.roleList[i]['id'] ? '(当前)' : '';
  239. roleList.push({
  240. value: this.roleList[i]['id'],
  241. text: preName + this.roleList[i]['companyName'] + ' ' + this.roleList[i]['personRoleName'],
  242. })
  243. }
  244. var _this = this;
  245. var picker = new mui.PopPicker();
  246. picker.setData(roleList);
  247. picker.pickers[0].setSelectedValue(this.person_popedom.id , 2000);
  248. picker.show(function(selectItems) {
  249. _this.switchRole(selectItems[0].value);
  250. })
  251. },
  252. //切换角色
  253. switchRole(id) {
  254. this.isLoading = true;
  255. API_User.exchangePopedom({
  256. id: id
  257. }).then(response => {
  258. this.isLoading = false;
  259. this.$refs.common.getDataByOpenId();
  260. }).catch(error => {
  261. this.isLoading = false;
  262. mui.toast(error);
  263. })
  264. },
  265. //预读取通知消息
  266. prefetchNotice() {
  267. //this.isLoading = true;
  268. API_Notice.prefetch().then(response => {
  269. this.isLoading = false;
  270. this.set_wd_message_num(response);
  271. this.getLastNotice();
  272. }).catch(error => {
  273. this.isLoading = false;
  274. mui.toast(error);
  275. })
  276. },
  277. //获取最新二条通知消息
  278. getLastNotice() {
  279. //this.isLoading = true;
  280. API_Notice.getTopList({
  281. type: 1,
  282. limit: 2,
  283. excludeMessageId: ''
  284. }).then(response => {
  285. this.noticeList = response;
  286. this.isLoading = false;
  287. }).catch(error => {
  288. this.isLoading = false;
  289. mui.toast(error);
  290. })
  291. },
  292. //引入图片
  293. requirePic(file) {
  294. if (file) {
  295. if (file.indexOf('http') == 0) {
  296. return file+'?x-oss-process=image/resize,h_40,m_lfit';
  297. } else {
  298. return require('$project/assets/img/' + file);
  299. }
  300. }
  301. },
  302. asynCallBack(bl) {
  303. if(!bl){
  304. //获取用户角色列表
  305. this.getRoleList();
  306. //获取最新二条通知消息
  307. this.prefetchNotice();
  308. }else{
  309. window.location.href = '../home/#/select';
  310. }
  311. },
  312. ...mapMutations({
  313. set_wd_message_num: types.SET_WD_MESSAGE_NUM,
  314. })
  315. },
  316. mounted() {
  317. var gallery = mui('.mui-slider');
  318. var slider = gallery.slider({
  319. interval: 2000, //自动轮播周期,若为0则不自动播放,默认为0;
  320. bounce: true //是否启用回弹
  321. });
  322. this.getBannerTipsInfo()
  323. },
  324. destroyed() {
  325. },
  326. computed: {
  327. pageTitle: {
  328. // getter
  329. get: function() {
  330. return this.person_data ? this.person_data.companyName : '小鹏管家';
  331. },
  332. // setter
  333. set: function(newValue) {
  334. console.log(newValue)
  335. }
  336. },
  337. ...mapGetters({
  338. openId: 'wx_openid',
  339. token: 'token',
  340. person_data: 'person_data',
  341. person_popedom: 'person_popedom',
  342. menu_list: 'menu_list',
  343. common_menu_list: 'common_menu_list',
  344. })
  345. }
  346. }
  347. </script>
  348. <style scoped src="$project/assets/css/xpgj.css"></style>
  349. <style src="$project/assets/css/iconfont.css"></style>
  350. <style src="$project/assets/css/mui.picker.min.css"></style>
  351. <style scoped>
  352. .red-after:after {
  353. background: red;
  354. }
  355. .work-status-color-1::after {
  356. background-color: #3385FF !important;
  357. }
  358. .work-status-color-2::after {
  359. background-color: #FF8800 !important;
  360. }
  361. .work-status-color-3::after {
  362. background-color: #FF8800 !important;
  363. }
  364. .work-status-color-4::after {
  365. background-color: #8855FF !important;
  366. }
  367. </style>