瀏覽代碼

修改图片旋转问题

lex-xin 4 年之前
父節點
當前提交
0ecd9f2873
共有 44 個文件被更改,包括 230 次插入51 次删除
  1. 0 0
      dist/app.d5147c1e18e4ee28c9ca.js
  2. 二進制
      dist/app.d5147c1e18e4ee28c9ca.js.gz
  3. 二進制
      dist/app.f9a1507f0ed60f7409a8.js.gz
  4. 0 0
      dist/css/AppDetail.a4b76fa9.css
  5. 0 0
      dist/css/AppDetail.cd7b52a2.css
  6. 1 0
      dist/css/AppDetail~SignUpLevel.d5d75217.css
  7. 1 1
      dist/css/AppRecord.a5778191.css
  8. 1 1
      dist/css/ExamRecord.cce21916.css
  9. 1 1
      dist/css/LookVideo.c25186d6.css
  10. 0 0
      dist/css/SignUpLevel.85350d20.css
  11. 0 0
      dist/css/SignUpLevel.9156b994.css
  12. 0 1
      dist/css/downLoad.4beaa487.css
  13. 1 0
      dist/css/downLoad.675a09b4.css
  14. 0 0
      dist/index.html
  15. 0 0
      dist/js/AppDetail.344a507c.js
  16. 二進制
      dist/js/AppDetail.344a507c.js.gz
  17. 0 0
      dist/js/AppDetail.9a1e85cb.js
  18. 二進制
      dist/js/AppDetail.9a1e85cb.js.gz
  19. 0 0
      dist/js/AppDetail~AppRecord~ExamRecord~PayDefine~PayQRCode~PayResult~PaymentResult~SignUp~SignUpAccount~Sign~d2a2776e.225cb8a8.js
  20. 二進制
      dist/js/AppDetail~AppRecord~ExamRecord~PayDefine~PayQRCode~PayResult~PaymentResult~SignUp~SignUpAccount~Sign~d2a2776e.225cb8a8.js.gz
  21. 0 0
      dist/js/AppDetail~SignUpLevel.97f1536a.js
  22. 二進制
      dist/js/AppDetail~SignUpLevel.97f1536a.js.gz
  23. 二進制
      dist/js/AppRecord.566a9eed.js.gz
  24. 0 0
      dist/js/AppRecord.b223c558.js
  25. 二進制
      dist/js/AppRecord.b223c558.js.gz
  26. 0 0
      dist/js/ExamRecord.27bd1c4f.js
  27. 0 0
      dist/js/ExamRecord.b90d65e3.js
  28. 0 0
      dist/js/LookVideo.170072ed.js
  29. 0 0
      dist/js/LookVideo.b6d6832f.js
  30. 0 0
      dist/js/PayCenter.65b4f4d7.js
  31. 0 0
      dist/js/SignUpLevel.72dba6c7.js
  32. 二進制
      dist/js/SignUpLevel.72dba6c7.js.gz
  33. 0 0
      dist/js/SignUpLevel.e86660c1.js
  34. 二進制
      dist/js/SignUpLevel.e86660c1.js.gz
  35. 0 0
      dist/js/downLoad.97502c48.js
  36. 0 0
      dist/js/downLoad.b69f1dd6.js
  37. 2 2
      src/utils/common.js
  38. 116 0
      src/utils/fileUtil.js
  39. 41 25
      src/views/app/AppDetail.vue
  40. 14 8
      src/views/app/AppRecord.vue
  41. 13 7
      src/views/app/ExamRecord.vue
  42. 13 2
      src/views/app/LookVideo.vue
  43. 5 2
      src/views/downLoad.vue
  44. 21 1
      src/views/signup/SignUpLevel.vue

文件差異過大導致無法顯示
+ 0 - 0
dist/app.d5147c1e18e4ee28c9ca.js


二進制
dist/app.d5147c1e18e4ee28c9ca.js.gz


二進制
dist/app.f9a1507f0ed60f7409a8.js.gz


文件差異過大導致無法顯示
+ 0 - 0
dist/css/AppDetail.a4b76fa9.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/AppDetail.cd7b52a2.css


+ 1 - 0
dist/css/AppDetail~SignUpLevel.d5d75217.css

@@ -0,0 +1 @@
+.mheader[data-v-9865a7b0]{height:.44rem;overflow:hidden}.m-nav-header[data-v-9865a7b0]{position:absolute;left:0;top:0;width:100%;height:.44rem;line-height:.44rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#1a1a1a;background:#fff}.m-nav-header.fixed[data-v-9865a7b0]{position:fixed;z-index:99}.m-nav-header.headerColor[data-v-9865a7b0]{background-color:#14928a;color:#fff}.m-nav-header.headerColor .m-nav-bar__title[data-v-9865a7b0]{color:#fff;font-size:.18rem}.m-nav-header .m-nav-bar__title[data-v-9865a7b0]{max-width:60%;margin:0 auto;color:#333;font-weight:500;font-size:.18rem}.m-nav-header .m-nav-bar__left[data-v-9865a7b0],.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{position:absolute;bottom:0}.m-nav-header .m-nav-bar__left[data-v-9865a7b0]{left:.12rem}.m-nav-header .m-nav-bar__left .arrow-left[data-v-9865a7b0]{font-size:.21rem;vertical-align:middle}.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{right:.12rem}

+ 1 - 1
dist/css/AppRecord.df40bc42.css → dist/css/AppRecord.a5778191.css

@@ -1 +1 @@
-.mheader[data-v-9865a7b0]{height:.44rem;overflow:hidden}.m-nav-header[data-v-9865a7b0]{position:absolute;left:0;top:0;width:100%;height:.44rem;line-height:.44rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#1a1a1a;background:#fff}.m-nav-header.fixed[data-v-9865a7b0]{position:fixed;z-index:99}.m-nav-header.headerColor[data-v-9865a7b0]{background-color:#14928a;color:#fff}.m-nav-header.headerColor .m-nav-bar__title[data-v-9865a7b0]{color:#fff;font-size:.18rem}.m-nav-header .m-nav-bar__title[data-v-9865a7b0]{max-width:60%;margin:0 auto;color:#333;font-weight:500;font-size:.18rem}.m-nav-header .m-nav-bar__left[data-v-9865a7b0],.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{position:absolute;bottom:0}.m-nav-header .m-nav-bar__left[data-v-9865a7b0]{left:.12rem}.m-nav-header .m-nav-bar__left .arrow-left[data-v-9865a7b0]{font-size:.21rem;vertical-align:middle}.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{right:.12rem}.appRecord[data-v-a168eb00]{height:100vh;overflow-y:auto;overflow-x:hidden}[data-v-a168eb00] .van-cell{padding:14px 16px;font-size:16px;color:#333}[data-v-a168eb00] .van-cell .van-cell__value{width:40%;text-align:left;-webkit-box-flex:1;-ms-flex:auto;flex:auto;color:#999}[data-v-a168eb00] .van-cell .payTime{color:#ff3535}.section[data-v-a168eb00]{margin-top:10px}.van-button--default[data-v-a168eb00]{border:0;color:#2dc7aa;font-size:15px;height:.5rem;line-height:.52rem}.van-button--primary[data-v-a168eb00]{margin:.35rem 0 .1rem;background-color:#2dc7aa;border:1px solid #2dc7aa;color:#fff;font-size:.18rem;height:.5rem;line-height:.52rem;width:90%;margin-left:5%}[data-v-a168eb00] .van-tabs__content{background-color:#f3f4f8}
+.mheader[data-v-9865a7b0]{height:.44rem;overflow:hidden}.m-nav-header[data-v-9865a7b0]{position:absolute;left:0;top:0;width:100%;height:.44rem;line-height:.44rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#1a1a1a;background:#fff}.m-nav-header.fixed[data-v-9865a7b0]{position:fixed;z-index:99}.m-nav-header.headerColor[data-v-9865a7b0]{background-color:#14928a;color:#fff}.m-nav-header.headerColor .m-nav-bar__title[data-v-9865a7b0]{color:#fff;font-size:.18rem}.m-nav-header .m-nav-bar__title[data-v-9865a7b0]{max-width:60%;margin:0 auto;color:#333;font-weight:500;font-size:.18rem}.m-nav-header .m-nav-bar__left[data-v-9865a7b0],.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{position:absolute;bottom:0}.m-nav-header .m-nav-bar__left[data-v-9865a7b0]{left:.12rem}.m-nav-header .m-nav-bar__left .arrow-left[data-v-9865a7b0]{font-size:.21rem;vertical-align:middle}.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{right:.12rem}.appRecord[data-v-371c3518]{height:100vh;overflow-y:auto;overflow-x:hidden}[data-v-371c3518] .van-cell{padding:14px 16px;font-size:16px;color:#333}[data-v-371c3518] .van-cell .van-cell__value{width:40%;text-align:left;-webkit-box-flex:1;-ms-flex:auto;flex:auto;color:#999}[data-v-371c3518] .van-cell .payTime{color:#ff3535}.section[data-v-371c3518]{margin-top:10px}.van-button--default[data-v-371c3518]{border:0;color:#2dc7aa;font-size:15px;height:.5rem;line-height:.52rem}.van-button--primary[data-v-371c3518]{margin:.35rem 0 .1rem;background-color:#2dc7aa;border:1px solid #2dc7aa;color:#fff;font-size:.18rem;height:.5rem;line-height:.52rem;width:90%;margin-left:5%}[data-v-371c3518] .van-tabs__content{background-color:#f3f4f8}

+ 1 - 1
dist/css/ExamRecord.82df7384.css → dist/css/ExamRecord.cce21916.css

@@ -1 +1 @@
-.mheader[data-v-9865a7b0]{height:.44rem;overflow:hidden}.m-nav-header[data-v-9865a7b0]{position:absolute;left:0;top:0;width:100%;height:.44rem;line-height:.44rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#1a1a1a;background:#fff}.m-nav-header.fixed[data-v-9865a7b0]{position:fixed;z-index:99}.m-nav-header.headerColor[data-v-9865a7b0]{background-color:#14928a;color:#fff}.m-nav-header.headerColor .m-nav-bar__title[data-v-9865a7b0]{color:#fff;font-size:.18rem}.m-nav-header .m-nav-bar__title[data-v-9865a7b0]{max-width:60%;margin:0 auto;color:#333;font-weight:500;font-size:.18rem}.m-nav-header .m-nav-bar__left[data-v-9865a7b0],.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{position:absolute;bottom:0}.m-nav-header .m-nav-bar__left[data-v-9865a7b0]{left:.12rem}.m-nav-header .m-nav-bar__left .arrow-left[data-v-9865a7b0]{font-size:.21rem;vertical-align:middle}.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{right:.12rem}.appRecord[data-v-5d7616ba]{height:100vh;overflow-y:auto;overflow-x:hidden}.appRecord .container[data-v-5d7616ba]{margin-bottom:20px}[data-v-5d7616ba] .van-cell{padding:14px 16px;font-size:16px;color:#333}[data-v-5d7616ba] .van-cell .van-cell__value{width:40%;text-align:left;-webkit-box-flex:1;-ms-flex:auto;flex:auto;color:#999}[data-v-5d7616ba] .van-cell .error{color:#ff3535}[data-v-5d7616ba] .van-cell .success{color:#2dc7aa}.section[data-v-5d7616ba]{margin-top:10px}.van-button--default[data-v-5d7616ba]{border:0;color:#2dc7aa;font-size:15px;height:.5rem;line-height:.52rem}[data-v-5d7616ba] .van-button__text{display:-webkit-box;display:-ms-flexbox;display:flex}.arrow[data-v-5d7616ba]{min-width:1em;font-size:1.2em;line-height:inherit;margin-left:5px}
+.mheader[data-v-9865a7b0]{height:.44rem;overflow:hidden}.m-nav-header[data-v-9865a7b0]{position:absolute;left:0;top:0;width:100%;height:.44rem;line-height:.44rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#1a1a1a;background:#fff}.m-nav-header.fixed[data-v-9865a7b0]{position:fixed;z-index:99}.m-nav-header.headerColor[data-v-9865a7b0]{background-color:#14928a;color:#fff}.m-nav-header.headerColor .m-nav-bar__title[data-v-9865a7b0]{color:#fff;font-size:.18rem}.m-nav-header .m-nav-bar__title[data-v-9865a7b0]{max-width:60%;margin:0 auto;color:#333;font-weight:500;font-size:.18rem}.m-nav-header .m-nav-bar__left[data-v-9865a7b0],.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{position:absolute;bottom:0}.m-nav-header .m-nav-bar__left[data-v-9865a7b0]{left:.12rem}.m-nav-header .m-nav-bar__left .arrow-left[data-v-9865a7b0]{font-size:.21rem;vertical-align:middle}.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{right:.12rem}.appRecord[data-v-6aca83b1]{height:100vh;overflow-y:auto;overflow-x:hidden}.appRecord .container[data-v-6aca83b1]{margin-bottom:20px}[data-v-6aca83b1] .van-cell{padding:14px 16px;font-size:16px;color:#333}[data-v-6aca83b1] .van-cell .van-cell__value{width:40%;text-align:left;-webkit-box-flex:1;-ms-flex:auto;flex:auto;color:#999}[data-v-6aca83b1] .van-cell .error{color:#ff3535}[data-v-6aca83b1] .van-cell .success{color:#2dc7aa}.section[data-v-6aca83b1]{margin-top:10px}.van-button--default[data-v-6aca83b1]{border:0;color:#2dc7aa;font-size:15px;height:.5rem;line-height:.52rem}[data-v-6aca83b1] .van-button__text{display:-webkit-box;display:-ms-flexbox;display:flex}.arrow[data-v-6aca83b1]{min-width:1em;font-size:1.2em;line-height:inherit;margin-left:5px}

+ 1 - 1
dist/css/LookVideo.78d1f9db.css → dist/css/LookVideo.c25186d6.css

@@ -1 +1 @@
-.mheader[data-v-9865a7b0]{height:.44rem;overflow:hidden}.m-nav-header[data-v-9865a7b0]{position:absolute;left:0;top:0;width:100%;height:.44rem;line-height:.44rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#1a1a1a;background:#fff}.m-nav-header.fixed[data-v-9865a7b0]{position:fixed;z-index:99}.m-nav-header.headerColor[data-v-9865a7b0]{background-color:#14928a;color:#fff}.m-nav-header.headerColor .m-nav-bar__title[data-v-9865a7b0]{color:#fff;font-size:.18rem}.m-nav-header .m-nav-bar__title[data-v-9865a7b0]{max-width:60%;margin:0 auto;color:#333;font-weight:500;font-size:.18rem}.m-nav-header .m-nav-bar__left[data-v-9865a7b0],.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{position:absolute;bottom:0}.m-nav-header .m-nav-bar__left[data-v-9865a7b0]{left:.12rem}.m-nav-header .m-nav-bar__left .arrow-left[data-v-9865a7b0]{font-size:.21rem;vertical-align:middle}.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{right:.12rem}.lookVideo[data-v-47533e66]{min-height:100vh;background-color:#fff;overflow-x:hidden;overflow-y:auto}.video[data-v-47533e66]{width:100%;height:2rem}
+.mheader[data-v-9865a7b0]{height:.44rem;overflow:hidden}.m-nav-header[data-v-9865a7b0]{position:absolute;left:0;top:0;width:100%;height:.44rem;line-height:.44rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#1a1a1a;background:#fff}.m-nav-header.fixed[data-v-9865a7b0]{position:fixed;z-index:99}.m-nav-header.headerColor[data-v-9865a7b0]{background-color:#14928a;color:#fff}.m-nav-header.headerColor .m-nav-bar__title[data-v-9865a7b0]{color:#fff;font-size:.18rem}.m-nav-header .m-nav-bar__title[data-v-9865a7b0]{max-width:60%;margin:0 auto;color:#333;font-weight:500;font-size:.18rem}.m-nav-header .m-nav-bar__left[data-v-9865a7b0],.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{position:absolute;bottom:0}.m-nav-header .m-nav-bar__left[data-v-9865a7b0]{left:.12rem}.m-nav-header .m-nav-bar__left .arrow-left[data-v-9865a7b0]{font-size:.21rem;vertical-align:middle}.m-nav-header .m-nav-bar__right[data-v-9865a7b0]{right:.12rem}.lookVideo[data-v-631c0e65]{min-height:100vh;background-color:#fff;overflow-x:hidden;overflow-y:auto}.video[data-v-631c0e65]{width:100%;height:2rem}

文件差異過大導致無法顯示
+ 0 - 0
dist/css/SignUpLevel.85350d20.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/SignUpLevel.9156b994.css


+ 0 - 1
dist/css/downLoad.4beaa487.css

@@ -1 +0,0 @@
-.container[data-v-e9a1f4b2]{overflow:hidden;background:url(../img/bg.89575063.png) top no-repeat #fff;background-size:contain;min-height:calc(100vh - .9rem);margin-top:.9rem;text-align:center}.container .tips[data-v-e9a1f4b2]{font-size:18px;color:#333;margin-top:2.6rem}.container .ps[data-v-e9a1f4b2]{font-size:12px;color:#ff3535}.wxContainer[data-v-e9a1f4b2]{overflow:hidden;height:100vh}.wxpopup[data-v-e9a1f4b2]{width:100%;height:100vh;position:absolute;top:0;left:0;background:rgba(0,0,0,.5)}.wxpopup img[data-v-e9a1f4b2]{width:88%;margin:0 6%}

+ 1 - 0
dist/css/downLoad.675a09b4.css

@@ -0,0 +1 @@
+.container[data-v-caee44c4]{overflow:hidden;background:url(../img/bg.89575063.png) top no-repeat #fff;background-size:contain;min-height:calc(100vh - .9rem);margin-top:.9rem;text-align:center}.container .tips[data-v-caee44c4]{font-size:18px;color:#333;margin-top:2.6rem}.container .ps[data-v-caee44c4]{font-size:12px;color:#ff3535}.wxContainer[data-v-caee44c4]{overflow:hidden;height:100vh}.wxpopup[data-v-caee44c4]{width:100%;height:100vh;position:absolute;top:0;left:0;background:rgba(0,0,0,.5)}.wxpopup img[data-v-caee44c4]{width:88%;margin:0 6%}

文件差異過大導致無法顯示
+ 0 - 0
dist/index.html


文件差異過大導致無法顯示
+ 0 - 0
dist/js/AppDetail.344a507c.js


二進制
dist/js/AppDetail.344a507c.js.gz


文件差異過大導致無法顯示
+ 0 - 0
dist/js/AppDetail.9a1e85cb.js


二進制
dist/js/AppDetail.9a1e85cb.js.gz


文件差異過大導致無法顯示
+ 0 - 0
dist/js/AppDetail~AppRecord~ExamRecord~PayDefine~PayQRCode~PayResult~PaymentResult~SignUp~SignUpAccount~Sign~d2a2776e.225cb8a8.js


二進制
dist/js/AppDetail~AppRecord~ExamRecord~PayDefine~PayQRCode~PayResult~PaymentResult~SignUp~SignUpAccount~Sign~d2a2776e.fbf674f3.js.gz → dist/js/AppDetail~AppRecord~ExamRecord~PayDefine~PayQRCode~PayResult~PaymentResult~SignUp~SignUpAccount~Sign~d2a2776e.225cb8a8.js.gz


文件差異過大導致無法顯示
+ 0 - 0
dist/js/AppDetail~SignUpLevel.97f1536a.js


二進制
dist/js/AppDetail~SignUpLevel.97f1536a.js.gz


二進制
dist/js/AppRecord.566a9eed.js.gz


文件差異過大導致無法顯示
+ 0 - 0
dist/js/AppRecord.b223c558.js


二進制
dist/js/AppRecord.b223c558.js.gz


文件差異過大導致無法顯示
+ 0 - 0
dist/js/ExamRecord.27bd1c4f.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/ExamRecord.b90d65e3.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/LookVideo.170072ed.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/LookVideo.b6d6832f.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/PayCenter.65b4f4d7.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/SignUpLevel.72dba6c7.js


二進制
dist/js/SignUpLevel.72dba6c7.js.gz


文件差異過大導致無法顯示
+ 0 - 0
dist/js/SignUpLevel.e86660c1.js


二進制
dist/js/SignUpLevel.e86660c1.js.gz


文件差異過大導致無法顯示
+ 0 - 0
dist/js/downLoad.97502c48.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/downLoad.b69f1dd6.js


+ 2 - 2
src/utils/common.js

@@ -9,8 +9,8 @@ const browser = () => {
 		mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
 		ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
 		// ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
-		android: u.indexOf('DAYAAPPA') > -1 || u.indexOf('Adr') > -1, //android终端
-		iPhone: u.indexOf('DAYAAPPI') > -1, //是否为iPhone或者QQHD浏览器
+		android: u.indexOf('EXAMAPP') > -1 || u.indexOf('Adr') > -1, //android终端
+		iPhone: u.indexOf('EXAMAPPI') > -1, //是否为iPhone或者QQHD浏览器
 		iPad: u.indexOf('iPad') > -1, //是否iPad
 		webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部
 		weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)

+ 116 - 0
src/utils/fileUtil.js

@@ -0,0 +1,116 @@
+import EXIF from 'exif-js'
+
+// 旋转图片
+const rotateImg = (img, direction, canvas) => {
+    //最小与最大旋转方向,图片旋转4次后回到原方向
+    const min_step = 0;
+    const max_step = 3;
+    if (img == null) return;
+    //img的高度和宽度不能在img元素隐藏后获取,否则会出错
+    let height = img.height;
+    let width = img.width;
+    let step = 2;
+    if (step == null) {
+        step = min_step;
+    }
+    if (direction == "right") {
+        step++;
+        //旋转到原位置,即超过最大值
+        step > max_step && (step = min_step);
+    } else {
+        step--;
+        step < min_step && (step = max_step);
+    }
+    //旋转角度以弧度值为参数
+    let degree = (step * 90 * Math.PI) / 180;
+    let ctx = canvas.getContext("2d");
+    switch (step) {
+        case 0:
+            canvas.width = width;
+            canvas.height = height;
+            ctx.drawImage(img, 0, 0);
+            break;
+        case 1:
+            canvas.width = height;
+            canvas.height = width;
+            ctx.rotate(degree);
+            ctx.drawImage(img, 0, -height);
+            break;
+        case 2:
+            canvas.width = width;
+            canvas.height = height;
+            ctx.rotate(degree);
+            ctx.drawImage(img, -width, -height);
+            break;
+        case 3:
+            canvas.width = height;
+            canvas.height = width;
+            ctx.rotate(degree);
+            ctx.drawImage(img, -width, 0);
+            break;
+    }
+}
+export default {
+    getOrientation: (file) => {
+        return new Promise((resolve) => {
+            EXIF.getData(file, function () {
+                const orient = EXIF.getTag(this, 'Orientation')
+                resolve(orient)
+            })
+        })
+    },
+
+    dataURLtoFile: (dataUrl, filename) => {
+        const arr = dataUrl.split(',')
+        const mime = arr[0].match(/:(.*?);/)[1]
+        const bstr = atob(arr[1])
+        let n = bstr.length
+        let u8arr = new Uint8Array(n);
+        while (n--) {
+            u8arr[n] = bstr.charCodeAt(n);
+        }
+        return new File([u8arr], filename, {
+            type: mime
+        });
+    },
+
+    // rotateImage: (image, width, height) => {
+    //     let canvas = document.createElement('canvas')
+    //     let ctx = canvas.getContext('2d')
+    //     ctx.save()
+    //     canvas.width = height
+    //     canvas.height = width
+    //     ctx.rotate(90 * Math.PI / 180)
+    //     ctx.drawImage(image, 0, -height)
+    //     ctx.restore()
+    //     return canvas.toDataURL("image/jpeg")
+    // },
+
+    rotateImage: (img, width, height, Orientation) => {
+        let canvas = document.createElement('canvas')
+        let ctx = canvas.getContext('2d')
+        ctx.save()
+        canvas.width = height
+        canvas.height = width
+        //修复ios上传图片的时候 被旋转的问题
+        if (Orientation != "" && Orientation != 1) {
+            switch (Orientation) {
+                case 6: //需要顺时针(向左)90度旋转
+                    rotateImg(img, "left", canvas);
+                    break;
+                case 8: //需要逆时针(向右)90度旋转
+                    rotateImg(img, "right", canvas);
+                    break;
+                case 3: //需要180度旋转
+                    rotateImg(img, "right", canvas); //转两次
+                    rotateImg(img, "right", canvas);
+                    break;
+            }
+        }
+
+        // ctx.rotate(90 * Math.PI / 180)
+        // ctx.drawImage(img, 0, -height)
+        ctx.restore()
+        return canvas.toDataURL("image/jpeg")
+    }
+}

+ 41 - 25
src/views/app/AppDetail.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="appDetail">
-        <m-header />
+        <m-header v-if="headerStatus" />
 		<van-cell-group>
             <!-- <van-field v-model="form.paymentOrderNo" disabled label="订单编号" /> -->
             <van-field v-model="form.examBaseName" disabled label="考级名称" />
@@ -46,12 +46,12 @@
                         :before-delete="beforeDelete"
                         :after-read="afterRead"
                         v-model="uploadCertificate2"
-                        disabled
-                        :deletable="false"
                         accept="image/*"
                         :max-count="1" />
                 </template>
             </van-field>
+            <!-- disabled
+                        :deletable="false" -->
         </van-cell-group>
 
         <van-cell-group style="margin-top: 20px">
@@ -112,9 +112,10 @@
 </template>
 <script>
 import MHeader from '@/components/MHeader'
-// import { browser } from '@/common/common'
+import { browser } from '@/utils/common'
 import dayjs from 'dayjs'
 import setLoading from '@/utils/loading'
+import fileUtil from '@/utils/fileUtil'
 import { uploadFile } from '../signup/SignUpApi'
 import { applyList } from './appApi'
 export default {
@@ -123,6 +124,7 @@ export default {
     data () {
         const query = this.$route.query
         return {
+            headerStatus: false,
             examRegistrationId: query.examRegistrationId,
             form: {
                 paymentOrderNo: null,
@@ -149,22 +151,20 @@ export default {
             performInfo: [], // 演奏曲基本信息
             practiceUpload: [], // 练习曲
             practiceInfo: [], // 练习曲基本信息
-            performNumUpload: [{
-                url: "https://daya-online.oss-cn-beijing.aliyuncs.com/202007/S3wXfqp.jpg"
-            }, {
-                url: "https://daya-online.oss-cn-beijing.aliyuncs.com/202007/S3wrElA.jpg"
-            }, {
-                url: "https://daya-online.oss-cn-beijing.aliyuncs.com/202007/S3wuoPO.jpg"
-            }]
         }
     },
     mounted() {
         // 插入token
-        // let params = this.$route.query
-        // if(params.Authorization) {
-        //     localStorage.setItem('Authorization', decodeURI(params.Authorization))
-        // }
-        document.title = "报考详情"
+        let params = this.$route.query
+        if(params.Authorization) {
+            localStorage.setItem('Authorization', decodeURI(params.Authorization))
+        }
+        // 判断是否在app里面
+        if(!browser().android && !browser().iPhone) {
+            this.headerStatus = true
+        } else {
+            document.title = '报考详情'
+        }
 
         this.__init()
     },
@@ -228,25 +228,23 @@ export default {
                     })
                 }
                 // examRegistrationId
-            }catch(err) {}
+            }catch(err) {
+                //
+            }
             setLoading(false)
         },
         onOpen(type, index) {
             let songUpload = this.songUpload
-            console.log({
-                type: type,
-                index: index
-            })
             songUpload.indexName = type
             songUpload.index = index
             let practiceSUL = this.practiceInfo[index]
             let performSUL = this.performInfo[index]
             if(type == "perform") {
-                songUpload.name = practiceSUL ? practiceSUL.songName : null
-                songUpload.author = practiceSUL ? practiceSUL.songAuthor : null
-            } else if(type == "practice") {
                 songUpload.name = performSUL ? performSUL.songName : null
                 songUpload.author = performSUL ? performSUL.songAuthor : null
+            } else if(type == "practice") {
+                songUpload.name = practiceSUL ? practiceSUL.songName : null
+                songUpload.author = practiceSUL ? practiceSUL.songAuthor : null
             }
             songUpload.songStatus = true
         },
@@ -257,7 +255,25 @@ export default {
                 this.$toast('上传图片大小不能超过 5MB')
                 return false
             }
-            return true
+            return new Promise((resolve) => {
+                fileUtil.getOrientation(file).then((orient) => {
+                    if (orient && orient != "" && orient != 1) {
+                        let reader = new FileReader()
+                        let img = new Image()
+                        reader.onload = (e) => {
+                            img.src = e.target.result
+                            img.onload = function () {
+                                const data = fileUtil.rotateImage(img, img.width, img.height, orient)
+                                const newFile = fileUtil.dataURLtoFile(data, file.name)
+                                resolve(newFile)
+                            }
+                        }
+                        reader.readAsDataURL(file)
+                    } else {
+                        resolve(file)
+                    }
+                })
+            })
         },
         beforeDelete(file, detail) {
             const obj = detail.name.split('-')

+ 14 - 8
src/views/app/AppRecord.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="appRecord">
-		<m-header />
+		<m-header v-if="headerStatus" />
 		<!-- <van-tabs sticky title-active-color="#2DC7AA" color="#2DC7AA" line-width="50">
 			<van-tab title="已缴费">
 				<div v-if="dataShow" key="data">
@@ -58,7 +58,7 @@
 </template>
 <script>
 	import MHeader from '@/components/MHeader'
-	// import { browser } from '@/common/common'
+	import { browser } from '@/utils/common'
 	import dayjs from 'dayjs'
 	import {
 		applyList
@@ -70,6 +70,7 @@
 		},
 		data() {
 			return {
+				headerStatus: false,
 				dataShow: true, // 是否有数据
 				loading: false,
 				finished: false,
@@ -92,11 +93,16 @@
 		},
 		mounted() {
 			// 插入token
-			// let params = this.$route.query
-			// if(params.Authorization) {
-			//     localStorage.setItem('Authorization', decodeURI(params.Authorization))
-			// }
-			document.title = "报考记录"
+			let params = this.$route.query
+			if(params.Authorization) {
+				localStorage.setItem('Authorization', decodeURI(params.Authorization))
+			}
+			// 判断是否在app里面
+			if(!browser().android && !browser().iPhone) {
+				this.headerStatus = true
+			} else {
+				document.title = '报考记录'
+			}
 		},
 		methods: {
 			async getList() {
@@ -177,7 +183,7 @@
 	.appRecord {
 		height: 100vh;
 		overflow-y: auto;
-  		overflow-x: hidden;
+		overflow-x: hidden;
 	}
 
 	/deep/.van-cell {

+ 13 - 7
src/views/app/ExamRecord.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="appRecord">
-		<m-header />
+		<m-header v-if="headerStatus" />
 		<div class="container">
 			<div v-if="dataShow" key="data">
 				<van-list v-model="loading" :finished="finished" finished-text="没有更多数据了~" @load="getList">
@@ -58,7 +58,7 @@
 </template>
 <script>
 	import MHeader from "@/components/MHeader";
-    // import { browser } from '@/common/common'
+    import { browser } from '@/utils/common'
 	import {
 		examList
 	} from "./appApi";
@@ -69,6 +69,7 @@
 		},
 		data() {
 			return {
+				headerStatus: false,
 				dataShow: true, // 是否有数据
 				loading: false,
 				finished: false,
@@ -82,11 +83,16 @@
 		},
 		mounted() {
 			// 插入token
-			// let params = this.$route.query
-			// if(params.Authorization) {
-			//     localStorage.setItem('Authorization', decodeURI(params.Authorization))
-			// }
-			document.title = "考试记录";
+			let params = this.$route.query
+			if(params.Authorization) {
+				localStorage.setItem('Authorization', decodeURI(params.Authorization))
+			}
+			// 判断是否在app里面
+			if(!browser().android && !browser().iPhone) {
+				this.headerStatus = true
+			} else {
+				document.title = '考试记录'
+			}
 		},
 		methods: {
 			getList() {

+ 13 - 2
src/views/app/LookVideo.vue

@@ -1,11 +1,12 @@
 <template>
 	<div class="lookVideo">
-		<m-header />
+		<m-header v-if="headerStatus" />
 		<video class="video" controls="controls" type="video/mp4" preload="auto" :src="videoUrl"></video>
 	</div>
 </template>
 <script>
 	import MHeader from "@/components/MHeader";
+	import { browser } from '@/utils/common'
 	export default {
 		name: "lookVideo",
 		components: {
@@ -14,11 +15,21 @@
 		data() {
             let query = this.$route.query
 			return {
+				headerStatus: false,
                 videoUrl: decodeURIComponent(query.url)
 			};
 		},
 		mounted() {
-			document.title = "考级回看";
+			let params = this.$route.query
+			if(params.Authorization) {
+				localStorage.setItem('Authorization', decodeURI(params.Authorization))
+			}
+			// 判断是否在app里面
+			if(!browser().android && !browser().iPhone) {
+				this.headerStatus = true
+			} else {
+				document.title = '考级回看'
+			}
 		}
 	};
 </script>

+ 5 - 2
src/views/downLoad.vue

@@ -41,13 +41,16 @@
 					url += `&memo=1`
 				} else if(params.memo == 2) { // 准考证页
 					url = `memo=2`
+					if(params.examRegistrationId) {
+						url += '&examRegistrationId=' + params.examRegistrationId
+					}
 				}
 				url = encodeURIComponent(url);
 				// console.log(url)
 				if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
-					window.location.href = `StudentsDaya://linkUrl=${url}`;
+					window.location.href = `StudentsExam://linkUrl=${url}`;
 				} else if (/(Android)/i.test(navigator.userAgent)) {
-					window.location.href = `studentdaya://html:8888/SplashActivity?url=${url}`;
+					window.location.href = `studentExam://html:8888/SplashActivity?url=${url}`;
 				} else {
 					this.$toast("请用手机或移动设备打开");
 				}

+ 21 - 1
src/views/signup/SignUpLevel.vue

@@ -128,6 +128,7 @@ import MStep from '@/components/MStep'
 import setLoading from '@/utils/loading'
 import { patternPhone } from '@/utils/validateRules'
 import { getExamSubjects, getExamSubjectLevel, getExamSubjectSong, uploadFile, getTheoryLevelList, getExamIngOrder, closeOrder } from './SignUpApi'
+import fileUtil from '@/utils/fileUtil'
 const levelToCN = {
     1: "一级",
     2: "二级",
@@ -646,7 +647,26 @@ export default {
                 this.$toast('上传图片大小不能超过 5MB')
                 return false
             }
-            return true
+            return new Promise((resolve) => {
+                fileUtil.getOrientation(file).then((orient) => {
+                    if (orient && orient != "" && orient != 1) {
+                        let reader = new FileReader()
+                        let img = new Image()
+                        reader.onload = (e) => {
+                            img.src = e.target.result
+                            img.onload = function () {
+                                const data = fileUtil.rotateImage(img, img.width, img.height, orient)
+                                const newFile = fileUtil.dataURLtoFile(data, file.name)
+                                resolve(newFile)
+                            }
+                        }
+                        reader.readAsDataURL(file)
+                    } else {
+                        resolve(file)
+                    }
+                })
+            })
+            // return true
         },
         beforeDelete(file, detail) {
             const obj = detail.name.split('-')

部分文件因文件數量過多而無法顯示