index.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <template>
  2. <div class="manage-layout">
  3. <div class="manage-bg" v-if="deviceLogin">
  4. <div class="manage-con">
  5. <div class="info deviceLogin">
  6. <div class="member">
  7. <p>{{language!=='en'?(detail.nickName||'--'):(detail.nickName==='Pro设备用户'?'4DKanKan Pro User':(detail.nickName||'--'))}}</p>
  8. <p>
  9. <span class="child-name">
  10. {{detail.snCode||(detail.childName&&detail.childName.replace('4DKKPRO_',''))||'--'}}
  11. </span>
  12. </p>
  13. </div>
  14. <div class="capacity">
  15. <div class="c-dec">
  16. <span>{{langMain.used}}{{detail.totalSpaceStr?(detail.usedSpaceStr+' / '+detail.totalSpaceStr):'--'}} </span>
  17. </div>
  18. <div class="c-line">
  19. <div class="active" :style="{width:getBar(detail.usedSpace,detail.totalSpace),background:getColor(detail.usedSpace,detail.totalSpace)}"></div>
  20. </div>
  21. <div class="c-detail">
  22. <span>{{langMain.space}}{{detail.spaceStr||'--'}} &nbsp;&nbsp;&nbsp;{{langMain.expire}}{{detail.spaceEndStr||'--'}}</span>
  23. </div>
  24. </div>
  25. </div>
  26. <div class="open-btn" :style="{backgroundColor:'#1fe4dc'}" @click="toastKR(detail.userId)">{{langMain.btnType.buy[detail.spaceId?'xufei':'name']}}</div>
  27. </div>
  28. </div>
  29. <div class="manage-body ">
  30. <div class="container">
  31. <div class="mc-left">
  32. <div v-for="(item,index) in settings" :key="index">
  33. <ul class="list-items">
  34. <li v-for="(sub,i) in item.items" :key="i" :class="{'is-en': language !== 'zh'}">
  35. <span @click="tabHandle(sub)" :class="{active:active.name===sub.name,'logout-span':sub.name === '退出登录'||sub.name === 'Log out'}">{{sub.name}}</span>
  36. </li>
  37. </ul>
  38. </div>
  39. </div>
  40. <div class="mc-right">
  41. <div class="mc-title">{{active.name}}</div>
  42. <router-view />
  43. <!-- <component :is="active.cp"/> -->
  44. </div>
  45. </div>
  46. </div>
  47. </div>
  48. </template>
  49. <script>
  50. import {mapState} from 'vuex'
  51. export default {
  52. data () {
  53. return {
  54. content: {
  55. cameraList: []
  56. },
  57. detail: '',
  58. activeCamera: {},
  59. selectActive: false,
  60. isSelect: false
  61. }
  62. },
  63. mounted () {
  64. if (!this.token) {
  65. this.$router.push('/login/login')
  66. return
  67. }
  68. document.addEventListener('click', (e) => {
  69. if (this.$refs.selectMenu) {
  70. if (!this.$refs.selectMenu.contains(e.target)) {
  71. this.selectActive = false
  72. }
  73. }
  74. })
  75. this.deviceLogin ? this.getDetail() : this.getInfo()
  76. },
  77. methods: {
  78. selectInId (item) {
  79. this.activeCamera = item
  80. },
  81. selectChange () {
  82. if (this.isSelect) {
  83. this.selectActive = !this.selectActive
  84. }
  85. },
  86. addstar (item) {
  87. let back = ''
  88. let font = ''
  89. if (item) {
  90. back = item.substring(7, 12) || ''
  91. font = item.substring(0, 3) || ''
  92. return font + '****' + back
  93. }
  94. return item
  95. },
  96. toastKR (userId) {
  97. let key = userId ? 40 : 43
  98. this.$toast.showConfirm('warn', this.langToast[key], async () => {
  99. await this.$store.dispatch('logout')
  100. this.$router.push({name: 'home', query: {open: true}})
  101. }, '', this.langToast['41'])
  102. },
  103. tabHandle (sub) {
  104. switch (sub.to) {
  105. case 'logout':
  106. this.$toast.showConfirm('warn', this.language === 'en' ? 'Are you sure to log out?' : '确定要退出登录吗?', async () => {
  107. await this.$store.dispatch('logout')
  108. this.$router.push({
  109. name: 'home'
  110. })
  111. })
  112. break
  113. default:
  114. this.active = sub
  115. this.$router.push(sub.to)
  116. if (sub.to.name === 'scene') {
  117. if (this.deviceLogin) {
  118. setTimeout(() => {
  119. this.$bus.$emit('mycid')
  120. }, 70)
  121. }
  122. }
  123. break
  124. }
  125. },
  126. getBar (a, b) {
  127. if (a === 0) {
  128. return 0
  129. }
  130. let temp = (a / b) * 100
  131. if (temp < 1) {
  132. return '1%'
  133. }
  134. return temp > 100 ? 100 : Math.round(temp) + '%'
  135. },
  136. getColor (a, b) {
  137. if (a === undefined || b === undefined) {
  138. return '#e2e2e2'
  139. }
  140. let temp = (a / b) * 100
  141. let point = 80
  142. let color = ''
  143. switch (true) {
  144. case temp < point:
  145. color = '#1fe4dc'
  146. break
  147. default:
  148. color = '#ff0000'
  149. break
  150. }
  151. return color
  152. },
  153. async getDetail () {
  154. let params = {
  155. childName: this.deviceLogin
  156. }
  157. let result = await this.$http({
  158. method: 'post',
  159. data: params,
  160. headers: {
  161. token: this.token
  162. },
  163. url: '/user/camera/detail'
  164. })
  165. let data = result.data
  166. if (data.code !== 0) {
  167. return this.$toast.show('error', this.langToast['13'])
  168. }
  169. this.detail = data.data
  170. await this.$store.commit('CAMERADERTAIL', this.detail)
  171. this.$bus.$emit('mycid')
  172. },
  173. async getInfo () {
  174. let res = await this.$http
  175. .post('/user/camera/deadline', {}, {
  176. headers: {
  177. token: this.token
  178. }
  179. })
  180. let data = res.data
  181. if (data.code !== 0) {
  182. return false
  183. }
  184. this.content = data.data
  185. this.isSelect = data.data.cameraList.length > 0
  186. this.activeCamera = this.isSelect ? data.data.cameraList[0] : {}
  187. }
  188. },
  189. computed: {
  190. ...mapState({
  191. split: state => state.ui.navDivision,
  192. token: state => state.user.token,
  193. info: state => state.user.info,
  194. deviceLogin: state => state.user.deviceLogin,
  195. langManage: state => state.language.home.manage,
  196. language: state => state.language.current,
  197. langToast: state => state.language.home.toast,
  198. langMain: state => state.language.home.manage.main,
  199. settings: state => {
  200. return state.user.deviceLogin ? state.language.home.manage.information.deviceSettings : state.language.home.manage.information.settings
  201. }
  202. }),
  203. active: {
  204. get () {
  205. return {
  206. name: this.langManage.information.nameArr[this.$route.name] || '',
  207. to: {name: this.$route.name} || ''
  208. }
  209. },
  210. set () {}
  211. }
  212. }
  213. }
  214. </script>
  215. <style lang="scss" scoped>
  216. @import "./style.scss";
  217. </style>