history.vue 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <template>
  2. <view class="history-container">
  3. <view class="item-list">
  4. <view class="item" v-for="(item,index) in items" :key="index">
  5. <view class="time">{{formatTime(item.createDate)}}</view>
  6. <div class="item-cont" @click="linkTo(item)">
  7. <view class="logo">
  8. <img :src="formatImage(item.sportVedioPath)" v-if="item.sportVedioPath" >
  9. <uni-icons type="videocam" size="30" v-else></uni-icons>
  10. </view>
  11. <view class="center">
  12. <view class="sportType">
  13. <text>{{formatSportType(item.sportType)}}</text>
  14. <view class="camera-box" @click.stop="onClick(item)">
  15. <image class="camera" src="/static/history/camera.png" ></image>
  16. </view>
  17. </view>
  18. </view>
  19. <view class="rt">
  20. <text class="name">评分:</text>
  21. <template>
  22. <text class="score" v-if="item.sportGrade">{{item.sportGrade}}</text>
  23. <text class="score" v-else>--</text>
  24. </template>
  25. </view>
  26. </div>
  27. </view>
  28. </view>
  29. <template>
  30. <view class="pagination-box" v-if="total>0">
  31. <uni-pagination @change="changePageNumber"
  32. :pageSize="limit" :current="page"
  33. :total="total"></uni-pagination>
  34. </view>
  35. <template v-else>
  36. <view class="isEmpty" >
  37. <p class="word">没有数据 ^_^ </p>
  38. </view>
  39. </template>
  40. </template>
  41. <uni-popup ref="video-popup" type="center" :animation="false" is-mask-click>
  42. <video id="video" :src="sportVedioPath" controls></video>
  43. </uni-popup>
  44. <getPhone ref="getPhone" v-if="!isLogin" showByPlatform />
  45. </view>
  46. </template>
  47. <script>
  48. import config from "@/config/index.js"
  49. const baseUrl = process.env.NODE_ENV === 'development' ? config.base.dev : config.base.pro;
  50. import {getSportGradeByPage,getSportGradeById} from '@/api/user.js'
  51. import getPhone from '@/components/getPhone.vue'
  52. export default {
  53. data() {
  54. return {
  55. time:new Date(),
  56. note:"18743733582",
  57. page:1,
  58. limit:15,
  59. total:0,
  60. items:[],
  61. sportVedioPath:"",
  62. isLogin:true
  63. }
  64. },
  65. components:{
  66. getPhone
  67. },
  68. onShow() {
  69. this.getSportGrade()
  70. this.init()
  71. },
  72. methods: {
  73. initPhoneModal(){
  74. const accountName=uni.getStorageSync('phone')
  75. if(!accountName){
  76. this.isLogin=false
  77. this.$nextTick(()=>{
  78. this.$refs['getPhone'].isAuthorize=false
  79. })
  80. }else{
  81. this.isLogin=true
  82. }
  83. },
  84. getSportGrade(){
  85. let page=this.page;
  86. let limit=this.limit;
  87. const accountName=uni.getStorageSync('phone')
  88. if(!accountName){
  89. this.isLogin=false
  90. return
  91. }else{
  92. this.isLogin=true
  93. }
  94. getSportGradeByPage({
  95. accountName,
  96. page, limit
  97. }).then((res)=>{
  98. this.items=res.data
  99. this.total=res.total;
  100. })
  101. },
  102. init(){
  103. if(this.sportVedioPath){
  104. this.sportVedioPath="";
  105. this.$refs['video-popup'].close()
  106. }
  107. this.items=[]
  108. this.total=0
  109. this.limit=15
  110. this.page=1
  111. // this.initPhoneModal()
  112. },
  113. onClick(item){
  114. let gradeId=item.gradeId
  115. let sportVedioPath=item.sportVedioPath;
  116. this.sportVedioPath=sportVedioPath
  117. if(this.sportVedioPath){
  118. this.$refs['video-popup'].open()
  119. }
  120. return
  121. }
  122. ,formatTime(date) {
  123. if (!date) return null
  124. if(typeof(date)==="string"){date = new Date(date)}
  125. var y = date.getFullYear()
  126. var M = date.getMonth() + 1
  127. var d = date.getDate()
  128. var H = date.getHours()
  129. var m = date.getMinutes()
  130. var s = date.getSeconds()
  131. M = M > 9 ? M : '0' + M; d = d > 9 ? d : '0' + d; H = H > 9 ? H : '0' + H
  132. m = m > 9 ? m : '0' + m; s = s > 9 ? s : '0' + s
  133. return `${y}-${M}-${d} ${H}:${m}:${s}`
  134. },
  135. formatImage(path){
  136. if(!path) return
  137. let fileName=path.substring(0,path.lastIndexOf('.'))
  138. return `${fileName}.jpg`;
  139. },
  140. formatSportType(val){
  141. if(this.isEmpty(val)) return '--';
  142. var enums={
  143. '0000':"引体向上",
  144. '0001':"仰卧起坐",
  145. '0002':"跳远",
  146. '0003':"坐位体前屈",
  147. '0004':"健身动作",
  148. '0005':"高抬腿",
  149. '0006':"排球垫球",
  150. '0007':"足球垫球",
  151. }
  152. return enums[val];
  153. },
  154. changePageNumber({type,current}){
  155. this.page=current
  156. this.getSportGrade()
  157. },
  158. linkTo(item){
  159. uni.setStorageSync('detail-info',item)
  160. uni.navigateTo({
  161. url:'/pages/history/detail/detail'
  162. })
  163. },
  164. isEmpty(val){
  165. if(val!=="undefined"&&val!==undefined&&val!==""&&val!==null){
  166. return false
  167. }
  168. return true
  169. }
  170. }
  171. }
  172. </script>
  173. <style lang="scss" scoped>
  174. .history-container{
  175. background:#E4F0FB;
  176. }
  177. .pagination-box{
  178. margin: 40rpx 0;
  179. background-color: #fff;
  180. }
  181. .isEmpty{
  182. width: 100%;
  183. height: 100vh;
  184. background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNzkgODYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjM4Ljg1JSIgeTE9IjAlIiB4Mj0iNjEuMTUlIiB5Mj0iMTAwJSI+PHN0b3Agc3RvcC1jb2xvcj0iI0ZDRkNGRCIgb2Zmc2V0PSIwJSIvPjxzdG9wIHN0b3AtY29sb3I9IiNFRUVGRjMiIG9mZnNldD0iMTAwJSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMCUiIHkxPSI5LjUlIiB5Mj0iOTAuNSUiPjxzdG9wIHN0b3AtY29sb3I9IiNGQ0ZDRkQiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjRTlFQkVGIiBvZmZzZXQ9IjEwMCUiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJjIiBkPSJNMCAwaDE3djM2SDB6Ii8+PC9kZWZzPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PHBhdGggZD0iTTM5LjUgODZDNjEuMzE1IDg2IDc5IDgzLjkxIDc5IDgxLjMzM1M1Ny4zMTUgNzggMzUuNSA3OCAwIDc4Ljc1NiAwIDgxLjMzM0MwIDgzLjkxMSAxNy42ODUgODYgMzkuNSA4NnoiIGZpbGw9IiNGN0Y4RkMiLz48cGF0aCBmaWxsPSIjRTVFN0U5IiBkPSJNMTMgNDVoNDBMNDIgNThIMnpNNjUuNTUxIDI5Ljk4bC0xNi4zMTMtNy42MDctMi44NDEtNS43MzggMTYuMzEzIDcuNjA3eiIvPjxwYXRoIGZpbGw9IiNFREVFRjIiIGQ9Ik02NS41NTEgMjkuOThsLTM0LjQ0LTE2LjA1OS0xNS4yMTQgMzIuNjI3IDM0LjQ0IDE2LjA2eiIvPjxwYXRoIGZpbGw9InVybCgjYSkiIHRyYW5zZm9ybT0icm90YXRlKDI1IDI3LjQ0NiAtNDMuNDE2KSIgZD0iTTM4IDdoMTd2MzZIMzh6Ii8+PHBhdGggZmlsbD0iI0Y4RjlGQiIgZD0iTTE1LjcwNSA2LjczN2wxNS40MDcgNy4xODQgMTUuNjQ2LS40MjctMTUuNDA3LTcuMTg1eiIvPjxwYXRoIGZpbGw9InVybCgjYikiIGQ9Ik0xMyA0NWg0MHYzNkgxM3oiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MyA0NSkiPjxtYXNrIGlkPSJkIiBmaWxsPSIjZmZmIj48dXNlIHhsaW5rOmhyZWY9IiNjIi8+PC9tYXNrPjx1c2UgZmlsbD0iI0UwRTNFOSIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTcgMCkiIHhsaW5rOmhyZWY9IiNjIi8+PHBhdGggZmlsbD0iI0Q1RDdERSIgbWFzaz0idXJsKCNkKSIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjQgMCkiIGQ9Ik03IDBoMTdsLTQgMTgtMjAtMnoiLz48L2c+PHBhdGggZmlsbD0iI0Y4RjlGQiIgZD0iTTcwIDQ1SDUzbDkgMTNoMTd6Ii8+PC9nPjwvc3ZnPg==);
  185. background-size: contain;
  186. background-repeat: no-repeat;
  187. position: relative;
  188. background-color: #fff;
  189. /* #ifndef MP-WEIXIN */
  190. height: calc( 100vh - 100px);
  191. /* #endif */
  192. .word{
  193. width: 100%;
  194. text-align: center;
  195. position: absolute;
  196. top: 80vh;
  197. left: 0;
  198. color: #999;
  199. font-size: 28rpx;
  200. letter-spacing: 2rpx;
  201. }
  202. }
  203. #video{
  204. display: block;
  205. width: 720rpx;
  206. margin: 20rpx auto;
  207. }
  208. .item-list{
  209. .item{
  210. &{
  211. padding: 0 20rpx;
  212. }
  213. .time{
  214. font-size: 24rpx;
  215. font-family: PingFang SC;
  216. font-weight: 400;
  217. line-height: 28rpx;
  218. color: #666666;
  219. padding: 24rpx 0;
  220. }
  221. .item-cont{
  222. &{
  223. display: flex;
  224. justify-content: space-between;
  225. align-items: center;
  226. padding: 20rpx 16rpx;
  227. background-color: #fff;
  228. border-radius: 20rpx;
  229. }
  230. .logo{
  231. width: 80rpx;
  232. height: 80rpx;
  233. border-radius: 8px;
  234. display: flex;
  235. justify-content:center;
  236. align-items: center;
  237. background-color: #e2e2e2;
  238. img{
  239. display: block;
  240. width: 80rpx;
  241. height: 80rpx;
  242. border-radius: 8px;
  243. }
  244. }
  245. .center{
  246. color: #999;
  247. font-size: 12px;
  248. flex: 1;
  249. padding-left: 20rpx;
  250. .sportType{
  251. &{
  252. font-size: 28rpx;
  253. font-family: PingFang SC;
  254. font-weight: bold;
  255. line-height: 1;
  256. display: flex;
  257. justify-content: flex-start;
  258. align-items: center;
  259. color: #333333;
  260. }
  261. .camera-box{
  262. padding-left: 26rpx;
  263. .camera{
  264. display: block;
  265. width: 36rpx;
  266. height: 36rpx;
  267. }
  268. }
  269. }
  270. }
  271. .rt{
  272. font-size: 32rpx;
  273. display: flex;
  274. justify-content:space-between;
  275. align-items: center;
  276. .name{
  277. font-size: 28rpx;
  278. font-family: PingFang SC;
  279. font-weight: bold;
  280. color: #F97743;
  281. line-height: 1;
  282. }
  283. .score{
  284. font-weight: 900;
  285. padding-right: 10rpx;
  286. font-size: 40rpx;
  287. font-family: PingFang SC;
  288. font-weight: bold;
  289. color: #FF4600;
  290. line-height: 1;
  291. }
  292. }
  293. }
  294. }
  295. }
  296. </style>