page-person.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <template>
  2. <div class="page-person-box">
  3. <div class="user-box">
  4. <!-- 头像 -->
  5. <div class="userCardBox">
  6. <div class="userInfo">
  7. <van-image
  8. class="userHeaderImg"
  9. fit="cover"
  10. round
  11. :src="maleAvatar"
  12. :show-error="true"
  13. :error-icon="maleAvatar"
  14. />
  15. <div>
  16. <div class="userName">
  17. {{ userInfo.nickName }}
  18. </div>
  19. <div class="userGroup">组织:{{ userInfo.group }}</div>
  20. </div>
  21. </div>
  22. <div class="userCardLine"></div>
  23. <!-- 今日积分 -->
  24. <div class="todayScoreBox">
  25. <div class="flexRowStartCenter">
  26. <span class="todayScore">今日积分:</span>
  27. <span class="todayScoreNum">{{ todayPoints }}</span>
  28. </div>
  29. </div>
  30. <div class="dropdown-div">
  31. <van-dropdown-menu active-color="#1989fa">
  32. <van-dropdown-item
  33. v-model="engineeringWorkChooseValue"
  34. :options="engineeringWorkList"
  35. :title="
  36. engineeringWorkChooseValue
  37. ? engineeringWorkChooseValue.text
  38. : '工种选择'
  39. "
  40. @change="handleChangeEngneeringWorkFun"
  41. />
  42. </van-dropdown-menu>
  43. </div>
  44. </div>
  45. </div>
  46. <!-- 积分 -->
  47. <div class="all-score-box">
  48. <div class="allScoreCard">
  49. <div class="allScore">总积分: {{ allPoints }}</div>
  50. </div>
  51. </div>
  52. <!-- 菜单 -->
  53. <div class="menu-box">
  54. <div class="menuCard">
  55. <!-- <van-grid>
  56. <van-grid-item
  57. v-for="(item, index) in menus"
  58. :key="index"
  59. :text="item.title"
  60. @click="clickGridIcon(item)"
  61. >
  62. <van-image slot="icon" :src="item.src" />
  63. </van-grid-item>
  64. </van-grid> -->
  65. <div
  66. :class="{
  67. 'menu-card-item': true,
  68. 'menu-card-item-border': index !== 0 && index !== 4
  69. }"
  70. v-for="(item, index) in menus"
  71. :key="index"
  72. @click="clickGridIcon(item)"
  73. >
  74. <div class="menu-card-item-img">
  75. <van-image width="100%" height="100%" :src="item.src" />
  76. </div>
  77. <span class="menu-card-item-title">{{ item.title }}</span>
  78. </div>
  79. </div>
  80. </div>
  81. </div>
  82. </template>
  83. <script>
  84. import maleAvatar from "@/assets/image/maleAvatar.jpg";
  85. import { mapState } from "vuex";
  86. export default {
  87. name: "page-personal",
  88. components: {},
  89. data() {
  90. return {
  91. maleAvatar,
  92. todayPoints: 0,
  93. allPoints: 0,
  94. avatarStyle: {
  95. "border-radius": "3rem",
  96. width: "1.8rem",
  97. height: "1.8rem",
  98. "background-color": "white",
  99. "margin-right": "0.2rem"
  100. },
  101. faceUrl: "",
  102. menus: [
  103. {
  104. title: "学习积分",
  105. icon: "photo-o",
  106. to: "user-manual",
  107. src: require("@/assets/image/personal/manual.png")
  108. },
  109. {
  110. title: "考试积分",
  111. icon: "photo-o",
  112. to: "exam-history",
  113. src: require("@/assets/image/personal/testScore.png")
  114. },
  115. {
  116. title: "排行榜",
  117. icon: "photo-o",
  118. to: "rank",
  119. src: require("@/assets/image/personal/leaderboard .png")
  120. },
  121. {
  122. title: "收藏",
  123. icon: "photo-o",
  124. to: "collection",
  125. src: require("@/assets/image/personal/collect.png")
  126. }
  127. // {
  128. // title: "积分兑换",
  129. // icon: "photo-o",
  130. // to: "",
  131. // src: require("@/assets/image/personal/redeem.png")
  132. // }
  133. // { title: "我要编辑", icon: "photo-o", to: "", src: require("@/assets/image/personal/toEdit.png") }
  134. ],
  135. engineeringWorkChooseValue: null, // 工种选择的值
  136. engineeringWorkList: [] // 工种可选列表
  137. };
  138. },
  139. computed: {
  140. ...mapState({
  141. userInfo: state => state.user.userInfo,
  142. chooseEngneeringWork: state => state.user.chooseEngneeringWork
  143. })
  144. },
  145. mounted() {
  146. this.engineeringWorkList = [
  147. { text: "桥隧工", value: "QiaoSuiGong" },
  148. // { text: "测量工", value: "CeLiangGong" },
  149. { text: "线路工", value: "XianLuGong" }
  150. ];
  151. this.engineeringWorkChooseValue =
  152. this.chooseEngneeringWork && this.chooseEngneeringWork.value
  153. ? this.chooseEngneeringWork.value
  154. : this.engineeringWorkList[0].value;
  155. this.handleChangeEngneeringWorkFun(this.engineeringWorkChooseValue);
  156. console.log(this.userInfo);
  157. this.getDailyPoints();
  158. this.getAllPoints();
  159. },
  160. methods: {
  161. // 操作:选择了工种
  162. handleChangeEngneeringWorkFun(value) {
  163. let resultItem = null;
  164. for (let i = 0; i < this.engineeringWorkList.length; i++) {
  165. let item = this.engineeringWorkList[i];
  166. if (value === item.value) {
  167. resultItem = item;
  168. break;
  169. }
  170. }
  171. this.$store.commit("updateUserItemStore", {
  172. field: "chooseEngneeringWork",
  173. value: resultItem
  174. });
  175. },
  176. // 获取今日分数
  177. getDailyPoints() {
  178. let path = {
  179. userName: this.userInfo.userName
  180. };
  181. this.$_http
  182. .get(this.$pathParams(this.$_API.JTXT_GET_USER_DAIYL_POINTS, path))
  183. .then(res => {
  184. this.todayPoints = res.data;
  185. })
  186. .catch(() => {
  187. this.$store.commit("toggleLoading", false);
  188. });
  189. },
  190. // 查询总积分
  191. getAllPoints() {
  192. let path = {
  193. userName: this.userInfo.userName
  194. };
  195. this.$_http
  196. .get(this.$pathParams(this.$_API.JTXT_GET_USER_ALL_POINTS, path))
  197. .then(res => {
  198. this.allPoints = res.data;
  199. })
  200. .catch(() => {
  201. this.$store.commit("toggleLoading", false);
  202. });
  203. },
  204. // 点击宫格图标
  205. clickGridIcon(item) {
  206. if (!item.to) {
  207. return;
  208. }
  209. this.$router.push({
  210. name: item.to,
  211. params: { userId: "testuser-zirKBELIlg" }
  212. });
  213. }
  214. }
  215. };
  216. </script>
  217. <style lang="scss">
  218. .page-person-box {
  219. .van-dropdown-menu__bar {
  220. height: 1.5rem;
  221. }
  222. .van-dropdown-menu__title {
  223. padding-left: 0;
  224. }
  225. }
  226. </style>
  227. <style lang="scss" scoped>
  228. .page-person-box {
  229. overflow-y: auto;
  230. overflow-x: hidden;
  231. position: relative;
  232. font-size: 1rem;
  233. width: 100%;
  234. height: 100%;
  235. .user-box {
  236. padding: 0.5rem 0.5rem;
  237. .userCardBox {
  238. background-color: #fff;
  239. padding: 0.5rem 0.5rem;
  240. box-shadow: 0 0 4px 2px rgba(139, 163, 198, 0.3);
  241. -webkit-box-shadow: 0 0 4px 2px rgba(139, 163, 198, 0.3);
  242. border-radius: 0.1rem;
  243. position: relative;
  244. .userCardLine {
  245. border-bottom: 1px solid #f1f1f1;
  246. width: 100%;
  247. height: 1px;
  248. margin: 0.4rem 0;
  249. }
  250. .userInfo {
  251. padding: 0.5rem 0;
  252. display: flex;
  253. // justify-content: space-between;
  254. align-items: center;
  255. .userHeaderImg {
  256. width: 2.5rem;
  257. height: 2.5rem;
  258. margin-right: 0.5rem;
  259. }
  260. .userName {
  261. font-size: 0.8rem;
  262. }
  263. .userGroup {
  264. margin-top: 0.5rem;
  265. font-size: 0.65rem;
  266. color: #333;
  267. }
  268. }
  269. .flexRowStartCenter {
  270. display: flex;
  271. flex-direction: row;
  272. justify-content: flex-start;
  273. align-items: center;
  274. }
  275. .todayScoreBox {
  276. padding: 0.5rem 0;
  277. font-size: 0.5rem;
  278. flex-wrap: nowrap;
  279. white-space: nowrap;
  280. overflow: hidden;
  281. .todayScore {
  282. margin-left: 0.5rem;
  283. margin-right: 0.5rem;
  284. font-size: 0.7rem;
  285. }
  286. .todayScoreNum {
  287. margin-right: 0.5rem;
  288. font-size: 0.7rem;
  289. }
  290. }
  291. }
  292. }
  293. .all-score-box {
  294. padding: 0.5rem 0.5rem;
  295. .allScoreCard {
  296. background-color: #fff;
  297. width: 100%;
  298. padding: 0.5rem 0.5rem;
  299. box-shadow: 0 0 4px 2px rgba(139, 163, 198, 0.3);
  300. -webkit-box-shadow: 0 0 4px 2px rgba(139, 163, 198, 0.3);
  301. border-radius: 0.1rem;
  302. .allScore {
  303. padding: 0.5rem 0;
  304. margin-left: 0.5rem;
  305. margin-right: 0.5rem;
  306. font-size: 0.8rem;
  307. color: #0088e9;
  308. font-weight: bold;
  309. }
  310. }
  311. }
  312. .menu-box {
  313. padding: 0.5rem 0.5rem;
  314. .menuCard {
  315. background-color: #fff;
  316. width: 100%;
  317. padding: 1rem 0.5rem 0;
  318. box-shadow: 0 0 4px 2px rgba(139, 163, 198, 0.3);
  319. -webkit-box-shadow: 0 0 4px 2px rgba(139, 163, 198, 0.3);
  320. border-radius: 0.1rem;
  321. display: flex;
  322. justify-content: space-between;
  323. flex-wrap: wrap;
  324. .menu-card-item {
  325. width: 23%;
  326. // height: 3rem;
  327. display: flex;
  328. flex-direction: column;
  329. align-items: center;
  330. margin-bottom: 1rem;
  331. .menu-card-item-img {
  332. width: 2.5rem;
  333. height: 2.5rem;
  334. }
  335. .menu-card-item-title {
  336. font-size: 0.65rem;
  337. margin-top: 0.25rem;
  338. }
  339. }
  340. // .menu-card-item-border {
  341. // border: 1px solid #e6e6e6;
  342. // }
  343. }
  344. }
  345. .dropdown-div {
  346. position: absolute;
  347. top: 0;
  348. right: 0.5rem;
  349. width: 3rem;
  350. height: 1.5rem;
  351. overflow: hidden;
  352. z-index: 1000;
  353. background-color: blanchedalmond;
  354. }
  355. }
  356. </style>