JLBA202505130001_关于吉林银行新建AI智能培训系统的需求_修复兼容性问题

This commit is contained in:
田岩
2025-12-24 17:34:39 +08:00
parent af5946fc70
commit f6bce46d39
53 changed files with 411 additions and 195 deletions
+1 -1
View File
@@ -7,7 +7,7 @@ ENV = 'development'
# VITE_APP_BASE_API_Url = 'https://aits.jlbank.com.cn:7001'
VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002'
VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7001'
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+2 -2
View File
@@ -8,8 +8,8 @@ android {
applicationId "cn.com.jlbank.ai"
minSdkVersion 21
targetSdkVersion 33
versionName System.getenv("versionName") ?: "1.0.0"
versionCode System.getenv("versionCode")?.toInteger() ?: 1
versionName System.getenv("versionName") ?: "0.0.4"
versionCode System.getenv("versionCode")?.toInteger() ?: 4
multiDexEnabled true
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
File diff suppressed because one or more lines are too long
@@ -7,8 +7,8 @@
"id": "__UNI__EDE0E52",
"name": "tra-app",
"version": {
"name": "0.0.3",
"code": 3
"name": "0.0.4",
"code": 4
},
"description": "",
"developer": {
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
.nav-bar[data-v-6f106210]{width:100%;height:var(--status-bar-height);position:fixed}.nav-bar-seat[data-v-6f106210]{width:100%;height:var(--status-bar-height)}.nav-bar-div[data-v-6f106210]{z-index:1900;width:100%;position:relative}uni-view[data-v-843a5998],uni-scroll-view[data-v-843a5998],uni-swiper-item[data-v-843a5998]{display:flex;flex-direction:column;flex-shrink:0;flex-grow:0;flex-basis:auto;align-items:stretch;align-content:flex-start}@font-face{font-family:uvicon-iconfont;src:url(../../assets/uvicons.04d281cc.ttf) format("truetype")}.uv-icon[data-v-843a5998]{display:flex;align-items:center}.uv-icon--left[data-v-843a5998]{flex-direction:row-reverse;align-items:center}.uv-icon--right[data-v-843a5998]{flex-direction:row;align-items:center}.uv-icon--top[data-v-843a5998]{flex-direction:column-reverse;justify-content:center}.uv-icon--bottom[data-v-843a5998]{flex-direction:column;justify-content:center}.uv-icon__icon[data-v-843a5998]{font-family:uvicon-iconfont;position:relative;display:flex;flex-direction:row;align-items:center}.uv-icon__icon--primary[data-v-843a5998]{color:#06f}.uv-icon__icon--success[data-v-843a5998]{color:#5ac725}.uv-icon__icon--error[data-v-843a5998]{color:#f56c6c}.uv-icon__icon--warning[data-v-843a5998]{color:#f9ae3d}.uv-icon__icon--info[data-v-843a5998]{color:#909399}.uv-icon__img[data-v-843a5998]{height:auto;will-change:transform}.uv-icon__label[data-v-843a5998]{line-height:1}.uv-border[data-v-1b8a7a55]{border-width:.5px!important;border-color:#dadbde!important;border-style:solid}.uv-border-bottom[data-v-1b8a7a55]{border-bottom-width:.5px!important;border-color:#dadbde!important;border-bottom-style:solid}uni-view[data-v-1b8a7a55],uni-scroll-view[data-v-1b8a7a55],uni-swiper-item[data-v-1b8a7a55]{display:flex;flex-direction:column;flex-shrink:0;flex-grow:0;flex-basis:auto;align-items:stretch;align-content:flex-start}.uv-input[data-v-1b8a7a55]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;flex:1}.uv-input--radius[data-v-1b8a7a55],.uv-input--square[data-v-1b8a7a55]{border-radius:4px}.uv-input--no-radius[data-v-1b8a7a55]{border-radius:0}.uv-input--circle[data-v-1b8a7a55]{border-radius:100px}.uv-input__content[data-v-1b8a7a55]{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.uv-input__content__field-wrapper[data-v-1b8a7a55]{position:relative;display:flex;flex-direction:row;margin:0;flex:1}.uv-input__content__field-wrapper__field[data-v-1b8a7a55]{line-height:26px;text-align:left;color:#303133;height:24px;font-size:15px;flex:1}.uv-input__content__clear[data-v-1b8a7a55]{width:20px;height:20px;border-radius:100px;background-color:#c6c7cb;display:flex;flex-direction:row;align-items:center;justify-content:center;transform:scale(.82);margin-left:15px}.uv-input__content__subfix-icon[data-v-1b8a7a55]{margin-left:4px}.uv-input__content__prefix-icon[data-v-1b8a7a55]{margin-right:4px}.no_search[data-v-3ea77890]{width:100%;display:flex;flex-direction:column;align-items:center;margin-top:3.125rem}.no_search .img[data-v-3ea77890]{width:7.1875rem}.no_search .text[data-v-3ea77890]{color:#999;font-size:.9375rem}.history_div[data-v-3ea77890]{width:100%}.history_item[data-v-3ea77890]{padding:.25rem 0;color:#777}.title_div[data-v-3ea77890]{display:flex;justify-content:space-between;align-items:center;width:100%;height:2.1875rem;margin:.3125rem 0}.title_div .text[data-v-3ea77890]{font-size:1rem;font-weight:700}.title_div .delete_img[data-v-3ea77890]{display:flex;align-items:center;justify-content:center;padding:.625rem 0 .625rem 1rem}.title_div .delete_img .img[data-v-3ea77890]{height:.75rem}.search_content[data-v-3ea77890]{background-color:#fff;margin-top:-.1875rem;border-radius:.375rem .375rem 0 0;display:flex;flex-direction:column;align-items:center;padding:0 .9375rem;min-height:6.25rem;transition:max-height .3s ease}.search_content .bg_img[data-v-3ea77890]{width:84%;margin:.625rem auto}.fixed_search_div[data-v-3ea77890]{padding:calc(.3125rem + var(--status-bar-height)) .46875rem .75rem .3125rem;background:linear-gradient(90deg,#f1f7ff,#d8edff,#c3e6ff);display:flex;align-items:center}.fixed_search_div .back_div[data-v-3ea77890]{padding:.3125rem .3125rem .3125rem .625rem}.fixed_search_div .back_div .back-icon[data-v-3ea77890]{position:relative;width:1.25rem;height:1.25rem;cursor:pointer}.fixed_search_div .back_div .back-icon[data-v-3ea77890]:before,.fixed_search_div .back_div .back-icon[data-v-3ea77890]:after{content:"";position:absolute;transition:all .3s ease}.fixed_search_div .back_div .back-icon[data-v-3ea77890]:after{top:25%;left:25%;width:40%;height:40%;border-top:.125rem solid #2b2c2e;border-left:.125rem solid #2b2c2e;transform:rotate(-45deg)}.main_div[data-v-3ea77890]{display:flex;flex-direction:column}
.nav-bar[data-v-4b9b9f99]{width:100%;height:var(--status-bar-height);position:fixed}.nav-bar-seat[data-v-4b9b9f99]{width:100%;height:var(--status-bar-height)}.nav-bar-div[data-v-4b9b9f99]{z-index:1900;width:100%;position:relative}uni-view[data-v-843a5998],uni-scroll-view[data-v-843a5998],uni-swiper-item[data-v-843a5998]{display:flex;flex-direction:column;flex-shrink:0;flex-grow:0;flex-basis:auto;align-items:stretch;align-content:flex-start}@font-face{font-family:uvicon-iconfont;src:url(../../assets/uvicons.04d281cc.ttf) format("truetype")}.uv-icon[data-v-843a5998]{display:flex;align-items:center}.uv-icon--left[data-v-843a5998]{flex-direction:row-reverse;align-items:center}.uv-icon--right[data-v-843a5998]{flex-direction:row;align-items:center}.uv-icon--top[data-v-843a5998]{flex-direction:column-reverse;justify-content:center}.uv-icon--bottom[data-v-843a5998]{flex-direction:column;justify-content:center}.uv-icon__icon[data-v-843a5998]{font-family:uvicon-iconfont;position:relative;display:flex;flex-direction:row;align-items:center}.uv-icon__icon--primary[data-v-843a5998]{color:#06f}.uv-icon__icon--success[data-v-843a5998]{color:#5ac725}.uv-icon__icon--error[data-v-843a5998]{color:#f56c6c}.uv-icon__icon--warning[data-v-843a5998]{color:#f9ae3d}.uv-icon__icon--info[data-v-843a5998]{color:#909399}.uv-icon__img[data-v-843a5998]{height:auto;will-change:transform}.uv-icon__label[data-v-843a5998]{line-height:1}.uv-border[data-v-1b8a7a55]{border-width:.5px!important;border-color:#dadbde!important;border-style:solid}.uv-border-bottom[data-v-1b8a7a55]{border-bottom-width:.5px!important;border-color:#dadbde!important;border-bottom-style:solid}uni-view[data-v-1b8a7a55],uni-scroll-view[data-v-1b8a7a55],uni-swiper-item[data-v-1b8a7a55]{display:flex;flex-direction:column;flex-shrink:0;flex-grow:0;flex-basis:auto;align-items:stretch;align-content:flex-start}.uv-input[data-v-1b8a7a55]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;flex:1}.uv-input--radius[data-v-1b8a7a55],.uv-input--square[data-v-1b8a7a55]{border-radius:4px}.uv-input--no-radius[data-v-1b8a7a55]{border-radius:0}.uv-input--circle[data-v-1b8a7a55]{border-radius:100px}.uv-input__content[data-v-1b8a7a55]{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.uv-input__content__field-wrapper[data-v-1b8a7a55]{position:relative;display:flex;flex-direction:row;margin:0;flex:1}.uv-input__content__field-wrapper__field[data-v-1b8a7a55]{line-height:26px;text-align:left;color:#303133;height:24px;font-size:15px;flex:1}.uv-input__content__clear[data-v-1b8a7a55]{width:20px;height:20px;border-radius:100px;background-color:#c6c7cb;display:flex;flex-direction:row;align-items:center;justify-content:center;transform:scale(.82);margin-left:15px}.uv-input__content__subfix-icon[data-v-1b8a7a55]{margin-left:4px}.uv-input__content__prefix-icon[data-v-1b8a7a55]{margin-right:4px}.no_search[data-v-3ea77890]{width:100%;display:flex;flex-direction:column;align-items:center;margin-top:3.125rem}.no_search .img[data-v-3ea77890]{width:7.1875rem}.no_search .text[data-v-3ea77890]{color:#999;font-size:.9375rem}.history_div[data-v-3ea77890]{width:100%}.history_item[data-v-3ea77890]{padding:.25rem 0;color:#777}.title_div[data-v-3ea77890]{display:flex;justify-content:space-between;align-items:center;width:100%;height:2.1875rem;margin:.3125rem 0}.title_div .text[data-v-3ea77890]{font-size:1rem;font-weight:700}.title_div .delete_img[data-v-3ea77890]{display:flex;align-items:center;justify-content:center;padding:.625rem 0 .625rem 1rem}.title_div .delete_img .img[data-v-3ea77890]{height:.75rem}.search_content[data-v-3ea77890]{background-color:#fff;margin-top:-.1875rem;border-radius:.375rem .375rem 0 0;display:flex;flex-direction:column;align-items:center;padding:0 .9375rem;min-height:6.25rem;transition:max-height .3s ease}.search_content .bg_img[data-v-3ea77890]{width:84%;margin:.625rem auto}.fixed_search_div[data-v-3ea77890]{padding:calc(.3125rem + var(--status-bar-height)) .46875rem .75rem .3125rem;background:linear-gradient(90deg,#f1f7ff,#d8edff,#c3e6ff);display:flex;align-items:center}.fixed_search_div .back_div[data-v-3ea77890]{padding:.3125rem .3125rem .3125rem .625rem}.fixed_search_div .back_div .back-icon[data-v-3ea77890]{position:relative;width:1.25rem;height:1.25rem;cursor:pointer}.fixed_search_div .back_div .back-icon[data-v-3ea77890]:before,.fixed_search_div .back_div .back-icon[data-v-3ea77890]:after{content:"";position:absolute;transition:all .3s ease}.fixed_search_div .back_div .back-icon[data-v-3ea77890]:after{top:25%;left:25%;width:40%;height:40%;border-top:.125rem solid #2b2c2e;border-left:.125rem solid #2b2c2e;transform:rotate(-45deg)}.main_div[data-v-3ea77890]{display:flex;flex-direction:column}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
.uni-popup[data-v-4d2f82f0]{position:fixed;z-index:99}.uni-popup.top[data-v-4d2f82f0],.uni-popup.left[data-v-4d2f82f0],.uni-popup.right[data-v-4d2f82f0]{top:0}.uni-popup .uni-popup__wrapper[data-v-4d2f82f0]{display:block;position:relative}.uni-popup .uni-popup__wrapper.left[data-v-4d2f82f0],.uni-popup .uni-popup__wrapper.right[data-v-4d2f82f0]{padding-top:0;flex:1}.fixforpc-z-index[data-v-4d2f82f0]{z-index:999}.fixforpc-top[data-v-4d2f82f0]{top:0}.overlay-box[data-v-19e7c522]{position:fixed;left:0;top:0;width:100vw;height:100vh;z-index:999;background-color:rgba(0,0,0,.65)}.overlay-box uni-movable-view[data-v-19e7c522]{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.overlay-box uni-movable-area[data-v-19e7c522]{height:100%;width:100%;position:fixed;overflow:hidden}.overlay-box uni-movable-view uni-image[data-v-19e7c522]{width:100%}.nav-bar[data-v-6f106210]{width:100%;height:var(--status-bar-height);position:fixed}.nav-bar-seat[data-v-6f106210]{width:100%;height:var(--status-bar-height)}.nav-bar-div[data-v-6f106210]{z-index:1900;width:100%;position:relative}.live-container[data-v-974a2859]{position:absolute;right:0;top:4.6875rem;overflow:hidden;border-radius:.625rem;width:8.4375rem;height:15rem}.pusher-container[data-v-974a2859]{overflow:hidden;border-radius:.625rem}.isVideo .role-info[data-v-75f2bd84]{display:none}.isVideo.show-box[data-v-75f2bd84]{background:linear-gradient(120deg,rgba(51,51,51,.2),rgba(102,102,102,.2),rgba(51,51,51,.2));backdrop-filter:blur(0px)}.title-time[data-v-75f2bd84],.title-tip[data-v-75f2bd84]{text-align:center;color:#fff;line-height:1.8125rem;font-size:1.1875rem;margin:0 auto}.role-name[data-v-75f2bd84]{margin-bottom:.8125rem;text-align:center;color:#fff;line-height:1.8125rem;font-size:1.1875rem}.title-tip[data-v-75f2bd84]{padding-right:.625rem;position:relative}.title-tip[data-v-75f2bd84]:after{content:"";position:absolute;animation:loading-75f2bd84 2.5s infinite}@keyframes loading-75f2bd84{0%{content:""}25%{content:"."}50%{content:".."}75%{content:"..."}to{content:""}}.switch-div[data-v-75f2bd84]{display:flex;justify-content:flex-end;align-items:center;margin-right:.625rem;margin-top:.3125rem;width:100%}.switch-div .switch-text[data-v-75f2bd84]{font-weight:400;font-size:.875rem;color:#fff}.switch-div .switch[data-v-75f2bd84]{transform:scale(.7) rotate(180deg)}.switch-div .switch[data-v-75f2bd84] .uni-switch-input.uni-switch-input-checked{border-color:#9eacbf!important;background-color:#9eacbf!important}.switch-div .switch[data-v-75f2bd84] .uni-switch-input:after{top:5px;left:5px;width:20px;height:20px}.switch-div .switch[data-v-75f2bd84] .uni-switch-input:before{background-color:#62a1ff!important;border-color:#62a1ff!important}.switch-div .switch[data-v-75f2bd84] .uni-switch-input:not(.uni-switch-input-checked){background-color:#62a1ff!important;border-color:#62a1ff!important}.fl1-div-1[data-v-75f2bd84]{min-height:3.75rem;max-height:7.5rem}.show-box[data-v-75f2bd84]{background:linear-gradient(120deg,rgba(51,51,51,.8),rgba(102,102,102,.8),rgba(51,51,51,.8));backdrop-filter:blur(10px);width:100vw;height:100vh;position:fixed;top:0;left:0;z-index:999;display:flex;flex-direction:column;align-items:center}.show-box-avatar[data-v-75f2bd84]{width:100vw;height:100vh;position:fixed;top:0;left:0;z-index:900}.role-info[data-v-75f2bd84]{position:relative;width:100vw;padding-top:6.5625rem}.role-info .role-avatar[data-v-75f2bd84]{width:5.78125rem;height:5.78125rem;border-radius:50%;overflow:hidden;position:absolute;left:50%;transform:translate(-50%);top:0}.body-scene[data-v-75f2bd84]{overflow:auto;width:calc(100% - 2.875rem);padding:.8125rem;color:rgba(255,255,255,.8);border:.125rem dashed rgba(255,255,255,.3);border-radius:.5rem;opacity:0;transition:opacity .5s ease}.body-scene.show[data-v-75f2bd84]{opacity:1}.close-btn[data-v-75f2bd84]{width:3.6875rem;height:3.6875rem;background-image:url(../../static/images/sparring/close-talk.png);background-repeat:no-repeat;background-position:center;background-size:cover;border-radius:50%;margin-top:1.4375rem;margin-bottom:3.5rem;flex-shrink:0}
.uni-popup[data-v-4d2f82f0]{position:fixed;z-index:99}.uni-popup.top[data-v-4d2f82f0],.uni-popup.left[data-v-4d2f82f0],.uni-popup.right[data-v-4d2f82f0]{top:0}.uni-popup .uni-popup__wrapper[data-v-4d2f82f0]{display:block;position:relative}.uni-popup .uni-popup__wrapper.left[data-v-4d2f82f0],.uni-popup .uni-popup__wrapper.right[data-v-4d2f82f0]{padding-top:0;flex:1}.fixforpc-z-index[data-v-4d2f82f0]{z-index:999}.fixforpc-top[data-v-4d2f82f0]{top:0}.overlay-box[data-v-19e7c522]{position:fixed;left:0;top:0;width:100vw;height:100vh;z-index:999;background-color:rgba(0,0,0,.65)}.overlay-box uni-movable-view[data-v-19e7c522]{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.overlay-box uni-movable-area[data-v-19e7c522]{height:100%;width:100%;position:fixed;overflow:hidden}.overlay-box uni-movable-view uni-image[data-v-19e7c522]{width:100%}.nav-bar[data-v-4b9b9f99]{width:100%;height:var(--status-bar-height);position:fixed}.nav-bar-seat[data-v-4b9b9f99]{width:100%;height:var(--status-bar-height)}.nav-bar-div[data-v-4b9b9f99]{z-index:1900;width:100%;position:relative}.live-container[data-v-974a2859]{position:absolute;right:0;top:4.6875rem;overflow:hidden;border-radius:.625rem;width:8.4375rem;height:15rem}.pusher-container[data-v-974a2859]{overflow:hidden;border-radius:.625rem}.isVideo .role-info[data-v-75f2bd84]{display:none}.isVideo.show-box[data-v-75f2bd84]{background:linear-gradient(120deg,rgba(51,51,51,.2),rgba(102,102,102,.2),rgba(51,51,51,.2));backdrop-filter:blur(0px)}.title-time[data-v-75f2bd84],.title-tip[data-v-75f2bd84]{text-align:center;color:#fff;line-height:1.8125rem;font-size:1.1875rem;margin:0 auto}.role-name[data-v-75f2bd84]{margin-bottom:.8125rem;text-align:center;color:#fff;line-height:1.8125rem;font-size:1.1875rem}.title-tip[data-v-75f2bd84]{padding-right:.625rem;position:relative}.title-tip[data-v-75f2bd84]:after{content:"";position:absolute;animation:loading-75f2bd84 2.5s infinite}@keyframes loading-75f2bd84{0%{content:""}25%{content:"."}50%{content:".."}75%{content:"..."}to{content:""}}.switch-div[data-v-75f2bd84]{display:flex;justify-content:flex-end;align-items:center;margin-right:.625rem;margin-top:.3125rem;width:100%}.switch-div .switch-text[data-v-75f2bd84]{font-weight:400;font-size:.875rem;color:#fff}.switch-div .switch[data-v-75f2bd84]{transform:scale(.7) rotate(180deg)}.switch-div .switch[data-v-75f2bd84] .uni-switch-input.uni-switch-input-checked{border-color:#9eacbf!important;background-color:#9eacbf!important}.switch-div .switch[data-v-75f2bd84] .uni-switch-input:after{top:5px;left:5px;width:20px;height:20px}.switch-div .switch[data-v-75f2bd84] .uni-switch-input:before{background-color:#62a1ff!important;border-color:#62a1ff!important}.switch-div .switch[data-v-75f2bd84] .uni-switch-input:not(.uni-switch-input-checked){background-color:#62a1ff!important;border-color:#62a1ff!important}.fl1-div-1[data-v-75f2bd84]{min-height:3.75rem;max-height:7.5rem}.show-box[data-v-75f2bd84]{background:linear-gradient(120deg,rgba(51,51,51,.8),rgba(102,102,102,.8),rgba(51,51,51,.8));backdrop-filter:blur(10px);width:100vw;height:100vh;position:fixed;top:0;left:0;z-index:999;display:flex;flex-direction:column;align-items:center}.show-box-avatar[data-v-75f2bd84]{width:100vw;height:100vh;position:fixed;top:0;left:0;z-index:900}.role-info[data-v-75f2bd84]{position:relative;width:100vw;padding-top:6.5625rem}.role-info .role-avatar[data-v-75f2bd84]{width:5.78125rem;height:5.78125rem;border-radius:50%;overflow:hidden;position:absolute;left:50%;transform:translate(-50%);top:0}.body-scene[data-v-75f2bd84]{overflow:auto;width:calc(100% - 2.875rem);padding:.8125rem;color:rgba(255,255,255,.8);border:.125rem dashed rgba(255,255,255,.3);border-radius:.5rem;opacity:0;transition:opacity .5s ease}.body-scene.show[data-v-75f2bd84]{opacity:1}.close-btn[data-v-75f2bd84]{width:3.6875rem;height:3.6875rem;background-image:url(../../static/images/sparring/close-talk.png);background-repeat:no-repeat;background-position:center;background-size:cover;border-radius:50%;margin-top:1.4375rem;margin-bottom:3.5rem;flex-shrink:0}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,11 +1,13 @@
@file:Suppress("UNCHECKED_CAST", "USELESS_CAST", "INAPPLICABLE_JVM_NAME", "UNUSED_ANONYMOUS_PARAMETER", "NAME_SHADOWING", "UNNECESSARY_NOT_NULL_ASSERTION")
package uts.sdk.modules.tyCamera
import android.content.Context
import android.graphics.Bitmap
import android.graphics.ImageFormat
import android.hardware.camera2.CameraCaptureSession
import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraDevice
import android.hardware.camera2.CameraManager
import android.hardware.camera2.CaptureRequest
import android.media.Image
import android.media.ImageReader
import android.os.Handler
@@ -21,8 +23,119 @@ import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import io.dcloud.uts.UTSAndroid
val width: Int = 176
val height: Int = 144
open class MyApiOptions (
@JsonNotNull
open var paramA: Boolean = false,
open var success: ((res: String) -> Unit)? = null,
open var fail: ((res: MyApiFail) -> Unit)? = null,
open var complete: ((res: Any) -> Unit)? = null,
) : UTSObject()
typealias MyApiErrorCode = Number
interface MyApiFail : IUniError {
override var errCode: MyApiErrorCode
}
typealias CameraFacingType = String
open class CameraHelper {
private var context: Context
private var cameraManager: CameraManager
private var currentCameraId: String? = null
private var totalRotation: Number = 0
constructor(context: Context){
this.context = context
this.cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
if (this.cameraManager == null) {
throw UTSError("CameraHelper: 获取CameraManager失败,请检查摄像头权限或设备支持性")
}
}
public open fun getCameraIdByFacing(facing: CameraFacingType): String {
try {
val cameraIds = this.cameraManager.getCameraIdList()
if (cameraIds.size === 0) {
console.error("CameraHelper: 无可用摄像头ID")
throw UTSError()
}
var targetCameraId: String? = null
for(id in resolveUTSValueIterator(cameraIds)){
val characteristics = this.cameraManager.getCameraCharacteristics(id)
val lensFacing = characteristics.get(CameraCharacteristics.LENS_FACING)
if (lensFacing !== null && lensFacing === (if (facing === "BACK") {
CameraCharacteristics.LENS_FACING_BACK
} else {
CameraCharacteristics.LENS_FACING_FRONT
}
)) {
targetCameraId = id
break
}
}
if (targetCameraId === null) {
throw UTSError()
}
console.log("CameraHelper: \u6210\u529F\u83B7\u53D6" + (if (facing === "BACK") {
"后置"
} else {
"前置"
}
) + "\u6444\u50CF\u5934ID\uFF1A" + targetCameraId)
return targetCameraId
}
catch (e: Throwable) {
console.error("CameraHelper: \u83B7\u53D6" + (if (facing === "BACK") {
"后置"
} else {
"前置"
}
) + "\u6444\u50CF\u5934ID\u5F02\u5E38\uFF1A", e.message)
throw UTSError()
}
}
public open fun openCameraByFacing(facing: CameraFacingType, callback: CameraDevice.StateCallback, handler: Handler? = null): Unit {
var cameraId: String
try {
cameraId = this.getCameraIdByFacing(facing)
}
catch (e: Throwable) {
throw UTSError()
}
val characteristics = this.cameraManager.getCameraCharacteristics(cameraId)
val streamConfigurationMap = characteristics.get(android.hardware.camera2.CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
if (streamConfigurationMap !== null) {
val supportedSizes = streamConfigurationMap.getOutputSizes(ImageFormat.YUV_420_888)
for(size in resolveUTSValueIterator(supportedSizes)){
console.log(object : UTSJSONObject() {
var width = size.getWidth()
var height = size.getHeight()
})
}
}
this.cameraManager.openCamera(cameraId, callback, handler)
}
public open fun closeCamera(): Unit {}
public open fun getCurrentCameraId(): String? {
return this.currentCameraId
}
public open fun getTotalRotation(): Number {
return this.totalRotation
}
private fun getBackCameraId(cameraIds: UTSArray<String>): String? {
for(id in resolveUTSValueIterator(cameraIds)){
val characteristics = this.cameraManager.getCameraCharacteristics(id)
val facing = characteristics.get(CameraCharacteristics.LENS_FACING)
if (facing !== null && facing === CameraCharacteristics.LENS_FACING_BACK) {
return id
}
}
return null
}
private fun calculateCameraRotation(cameraId: String): Unit {}
public open fun release(): Unit {
this.currentCameraId = null
this.totalRotation = 0
console.log("CameraHelper: 摄像头辅助类资源已释放")
}
}
val width: Int = 720
val height: Int = 480
var backgroundHandler: Handler? = null
var handlerThread: HandlerThread? = null
var imageReader: ImageReader? = null
@@ -100,7 +213,14 @@ fun yuvToJpegBase64(image: android.media.Image): String {
return ""
}
val jpegBytes = outputStream.toByteArray()
val base64Raw = android.util.Base64.encodeToString(jpegBytes, android.util.Base64.DEFAULT)
val srcBitmap: Bitmap = android.graphics.BitmapFactory.decodeByteArray(jpegBytes, 0, jpegBytes.size)
val matrix = android.graphics.Matrix()
matrix.postRotate((-90 as Number).toFloat())
val outputStream2 = java.io.ByteArrayOutputStream()
val rotatedBitmap = android.graphics.Bitmap.createBitmap(srcBitmap, 0, 0, srcBitmap.getWidth(), srcBitmap.getHeight(), matrix, true)
rotatedBitmap.compress(android.graphics.Bitmap.CompressFormat.JPEG, 80, outputStream2)
val BitmapBytes = outputStream2.toByteArray()
val base64Raw = android.util.Base64.encodeToString(BitmapBytes, android.util.Base64.DEFAULT)
val base64Jpeg = "data:image/jpeg;base64," + base64Raw
outputStream.close()
return base64Jpeg
@@ -110,7 +230,7 @@ fun yuvToJpegBase64(image: android.media.Image): String {
return ""
}
}
fun startCameraPreview(callback: (data: Any) -> Unit): Unit {
fun startCameraPreview(options: MyApiOptions): Unit {
val context = UTSAndroid.getAppContext()
val activity = UTSAndroid.getUniActivity()
if (context == null || activity == null) {
@@ -120,13 +240,10 @@ fun startCameraPreview(callback: (data: Any) -> Unit): Unit {
handlerThread = HandlerThread("CameraBackground", -8)
handlerThread!!!!.start()
backgroundHandler = Handler(handlerThread!!!!.getLooper())
val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
val cameraId = getValidCameraInfo(cameraManager)
if (cameraId == null) {
console.error("错误:cameraId为null,说明没有摄像头")
return
}
val cameraHelper = CameraHelper(context)
val totalRotation = cameraHelper.getTotalRotation()
try {
console.log("width, height", width, height)
imageReader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 8)
val localImageReader = imageReader
if (localImageReader == null) {
@@ -138,8 +255,7 @@ fun startCameraPreview(callback: (data: Any) -> Unit): Unit {
if (imageProxy === null) {
return
}
console.log("正确设置监听器")
callback(yuvToJpegBase64(imageProxy))
options.success?.invoke(yuvToJpegBase64(imageProxy))
imageProxy.close()
return
}
@@ -166,6 +282,7 @@ fun startCameraPreview(callback: (data: Any) -> Unit): Unit {
captureSession = session
val requestBuilder = this.localCameraDevice.createCaptureRequest(android.hardware.camera2.CameraDevice.TEMPLATE_PREVIEW)
requestBuilder.addTarget(this.surface)
requestBuilder.set(CaptureRequest.JPEG_ORIENTATION, 270)
session.setRepeatingRequest(requestBuilder.build(), null, backgroundHandler)
}
override fun onConfigureFailed(session: android.hardware.camera2.CameraCaptureSession): Unit {
@@ -197,7 +314,7 @@ fun startCameraPreview(callback: (data: Any) -> Unit): Unit {
}
}
val cameraStateCallback = CustomCameraStateCallback()
cameraManager.openCamera(cameraId, cameraStateCallback, backgroundHandler)
cameraHelper.openCameraByFacing("FRONT", cameraStateCallback, backgroundHandler)
}
catch (e: Throwable) {
console.error("启动摄像头失败:", e)
@@ -268,46 +385,23 @@ fun stopCameraPreview(): Unit {
console.error("释放摄像头资源时发生全局异常:", e)
}
}
fun getValidCameraInfo(cameraManager: CameraManager): String? {
try {
val cameraIds = cameraManager.getCameraIdList()
if (cameraIds.size == 0) {
console.error("无可用摄像头ID")
return null
}
var cameraId = ""
for(id in resolveUTSValueIterator(cameraIds)){
val characteristics = cameraManager.getCameraCharacteristics(id)
val facing = characteristics.get(CameraCharacteristics.LENS_FACING)
if (facing === Integer.valueOf(CameraCharacteristics.LENS_FACING_FRONT)) {
cameraId = id
break
}
}
if (cameraId === "" && cameraIds.size > 0) {
cameraId = cameraIds[0]
}
if (cameraId === "") {
console.error("无可用摄像头ID")
return null
}
return cameraId
}
catch (e: Throwable) {
console.error("获取摄像头信息异常:", e.message)
return null
}
open class MyApiOptionsJSONObject : UTSJSONObject() {
open var paramA: Boolean = false
open var success: UTSCallback? = null
open var fail: UTSCallback? = null
open var complete: UTSCallback? = null
}
fun startCameraPreviewByJs(callback: UTSCallback): Unit {
return startCameraPreview(if (callback.fnJS != null) {
callback.fnJS
} else {
callback.fnJS = fun(data: Any){
callback(data)
}
callback.fnJS
fun startCameraPreviewByJs(options: MyApiOptionsJSONObject): Unit {
return startCameraPreview(MyApiOptions(paramA = options.paramA, success = fun(res: String): Unit {
options.success?.invoke(res)
}
as (data: Any) -> Unit)
, fail = fun(res: MyApiFail): Unit {
options.fail?.invoke(res)
}
, complete = fun(res: Any): Unit {
options.complete?.invoke(res)
}
))
}
fun stopCameraPreviewByJs(): Unit {
return stopCameraPreview()
@@ -3,7 +3,7 @@ import DCloudUTSFoundation
@objcMembers
public class MyApiOptions : NSObject, UTSObject {
public var paramA: Bool = false
public var success: ((_ res: MyApiResult) -> Void)?
public var success: ((_ res: String) -> Void)?
public var fail: ((_ res: MyApiFail) -> Void)?
public var complete: ((_ res: Any) -> Void)?
public subscript(_ key: String) -> Any? {
@@ -30,49 +30,16 @@ public class MyApiOptions : NSObject, UTSObject {
}
public init(_ obj: UTSJSONObject) {
self.paramA = obj["paramA"] as! Bool
self.success = obj["success"] as! ((_ res: MyApiResult) -> Void)?
self.success = obj["success"] as! ((_ res: String) -> Void)?
self.fail = obj["fail"] as! ((_ res: MyApiFail) -> Void)?
self.complete = obj["complete"] as! ((_ res: Any) -> Void)?
}
}
@objc(UTSSDKModulesTyCameraMyApiResult)
@objcMembers
public class MyApiResult : NSObject, UTSObject {
public var fieldA: NSNumber!
public var fieldB: Bool = false
public var fieldC: String!
public subscript(_ key: String) -> Any? {
get {
return utsSubscriptGetValue(key)
}
set {
switch(key){
case "fieldA":
self.fieldA = try! utsSubscriptCheckValue(newValue)
case "fieldB":
self.fieldB = try! utsSubscriptCheckValue(newValue)
case "fieldC":
self.fieldC = try! utsSubscriptCheckValue(newValue)
default:
break
}
}
}
public override init() {
super.init()
}
public init(_ obj: UTSJSONObject) {
self.fieldA = obj["fieldA"] as! NSNumber
self.fieldB = obj["fieldB"] as! Bool
self.fieldC = obj["fieldC"] as! String
}
}
public typealias MyApiErrorCode = NSNumber
public protocol MyApiFail : IUniError {
var errCode: MyApiErrorCode { get set }
}
public typealias MyApi = (_ options: MyApiOptions) -> Void
public typealias MyApiSync = (_ paramA: Bool) -> MyApiResult
public var UniErrorSubject = "uts-api"
public var MyAPIErrors: Map<MyApiErrorCode, String> = Map([
[
@@ -167,7 +134,7 @@ public func myApiByJs(_ options: MyApiOptionsJSONObject) -> Void {
return myApi(MyApiOptions(UTSJSONObject([
"paramA": options.paramA,
"success": {
(res: MyApiResult) -> Void in
(res: String) -> Void in
options.success?(res)
},
"fail": {
+8 -12
View File
@@ -1,26 +1,25 @@
<script>
export default {
onLaunch: function() {
onLaunch: function () {
uni.onTabBarMidButtonTap(() => {
uni.navigateTo({
url: '/pages/index/dialog',
animationType: 'slide-in-bottom'
});
});
//#ifdef APP-PLUS
plus.screen.lockOrientation('portrait-primary')
//
plus.screen.lockOrientation('portrait-primary');
// #endif
},
onShow: function() {
},
onHide: function() {}
onShow: function () {},
onHide: function () {}
};
</script>
<style lang="scss">
/* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
// @import "@/uni_modules/uview-ui/index.scss";
// #ifndef APP-PLUS-NVUE
@font-face {
font-family: 'PingFangSC';
@@ -64,12 +63,11 @@
overflow: hidden;
}
.max_page {
min-height: 100vh;
}
// #endif
.mr-10 {
margin-right: 10rpx;
}
@@ -166,8 +164,6 @@
flex: 1;
}
.no-overflow {
overflow: hidden;
}
@@ -180,4 +176,4 @@
margin-right: 8rpx;
margin-left: 2rpx;
}
</style>
</style>
+59 -15
View File
@@ -15,8 +15,9 @@ function msg(title, duration = 1000) {
}
let isShowConfirm = false
function show(title, msg, showCancel = true, cancelText = '取消', confirmText = '确定') {
if(isShowConfirm) {
if (isShowConfirm) {
return new Promise((resolve, reject) => {
reject({});
});
@@ -35,7 +36,7 @@ function show(title, msg, showCancel = true, cancelText = '取消', confirmText
resolve(!!res.confirm);
isShowConfirm = false
},
};
// #ifdef APP-PLUS
if (getPhoneEnvBool('AND')) {
@@ -83,19 +84,19 @@ const hideLoading = () => uni.hideLoading()
// 根据姓名的长度生成对应的带星号格式
export const formatName = (name) => {
// 处理空值或非字符串情况
if (!name || typeof name !== 'string') {
return '';
}
const familyName = name.charAt(0); // 取姓氏(第一个字符)
const givenNameLength = name.length - 1; // 名字部分的长度
// 根据名字长度计算星号数量,最多4个
const starCount = Math.min(givenNameLength, 3);
const stars = '*'.repeat(starCount);
return familyName + stars;
// 处理空值或非字符串情况
if (!name || typeof name !== 'string') {
return '';
}
const familyName = name.charAt(0); // 取姓氏(第一个字符)
const givenNameLength = name.length - 1; // 名字部分的长度
// 根据名字长度计算星号数量,最多4个
const starCount = Math.min(givenNameLength, 3);
const stars = '*'.repeat(starCount);
return familyName + stars;
}
// 防抖工具函数
@@ -277,6 +278,49 @@ function isLogin() {
return !!getToken();
}
/**
* 获取额外高度纯函数返回对应高度值
* @returns {string} 最终的额外高度值带单位
*/
export const getExtraHeight = () => {
// 所有常量移入函数内部定义,TARGET_DEVICE_MODEL 改为数组类型
const TARGET_DEVICE_MODEL = ['XT2321-2']; // 目标设备型号数组(摩托罗拉razr 40 Ultra
const EXTRA_HEIGHT_TARGET = '15rpx'; // 目标设备额外高度
const EXTRA_HEIGHT_DEFAULT = '2rpx'; // 默认额外高度
try {
// 1. 优先读取缓存
const cachedHeight = getValue('extra_height', '');
if (cachedHeight) {
console.log('缓存有值直接返回', cachedHeight);
return cachedHeight; // 缓存有值直接返回
}
// 2. 缓存无值时,获取设备信息
const deviceInfo = uni.getDeviceInfo();
// 校验设备信息有效性
if (!deviceInfo || !deviceInfo.deviceModel) {
throw new Error('设备信息获取失败');
}
// 3. 判断设备型号(数组包含判断,适配多型号)
const isTargetDevice = TARGET_DEVICE_MODEL.includes(deviceInfo.deviceModel);
const finalHeight = isTargetDevice ? EXTRA_HEIGHT_TARGET : EXTRA_HEIGHT_DEFAULT;
// 4. 缓存结果(后续复用)
setValue('extra_height', finalHeight);
return finalHeight; // 返回计算后的高度
} catch (error) {
// 5. 异常兜底:返回默认值并缓存
console.warn('获取/设置额外高度失败:', error.message);
setValue('extra_height', EXTRA_HEIGHT_DEFAULT);
return EXTRA_HEIGHT_DEFAULT;
}
};
// 封装键盘高度变化处理
export function setupKeyboardHeightListener(updateCallback) {
// #ifndef APP-PLUS
+5 -5
View File
@@ -143,7 +143,7 @@
align-items: center;
justify-content: center;
margin-top: 34rpx;
height: 68rpx;
height: 60rpx;
.img {
width: 26rpx;
height: 44rpx;
@@ -153,7 +153,7 @@
font-weight: bold;
font-size: 46rpx;
color: #d88f50;
margin: 0rpx 30rpx;
margin: 0rpx 26rpx;
text-align: center;
}
}
@@ -180,14 +180,14 @@
}
.max-div {
width: 80vw;
max-width: 80vw;
background-color: #fefbfa;
border-radius: 38rpx;
position: relative;
padding: 26rpx;
padding: 26rpx 80rpx;
overflow: hidden;
margin-top: var(--status-bar-height);
margin-bottom: 120rpx;
margin-bottom: 100rpx;
overflow: auto;
}
</style>
+2 -2
View File
@@ -2,8 +2,8 @@
"name" : "tra-app",
"appid" : "__UNI__EDE0E52",
"description" : "",
"versionName" : "0.0.3",
"versionCode" : 3,
"versionName" : "0.0.4",
"versionCode" : 4,
"transformPx" : false,
/* 5+App */
"app-plus" : {
+6 -2
View File
@@ -130,8 +130,9 @@
import { pkAnonymousClose, pkAnonymousOpen, pkRankingList, pkRules, switchIcon, optionErrorIcon } from '@/common/imgSvg';
import { updateTraUserAnony } from '@/api/user';
import selectionInstitutions from '@/components/selection-institutions/index.vue';
import {getExtraHeight} from '@/common/common';
const extra_height = ref(getExtraHeight());
const data_info = reactive({
userId: '',
userName: '',
@@ -184,11 +185,11 @@
}, 1000);
//
const delayTime = MatchTimeGenerator.generateInSeconds();
console.log('delayTime', delayTime);
//
matchTimer = setTimeout(async () => {
try {
challengeButtonStatus.value = false;
const orgId = data_info.orgId;
const papersId = data_info.papersId;
const comId = data_info.comId;
@@ -349,4 +350,7 @@
flex-direction: column;
align-items: center;
}
.top-button-div{
padding-top: calc(16rpx + var(--status-bar-height) + v-bind(extra_height));
}
</style>
@@ -150,6 +150,9 @@
.avatar-div {
margin-top: 20rpx;
display: flex;
flex-direction: column;
align-items: center;
.avatar-img-div {
width: 204rpx;
height: 204rpx;
@@ -248,7 +251,7 @@
justify-content: space-between;
width: 100%;
height: 70rpx;
padding-top: calc(16rpx + var(--status-bar-height));
font-weight: 500;
position: relative;
margin-right: 10rpx;
+1 -1
View File
@@ -1,6 +1,6 @@
<template>
<view class="exam-ranking">
<image src="@/static/images/examRanking/bg.png" mode="aspectFit" class="bg-box"></image>
<image src="@/static/images/examRanking/bg.png" mode="aspectFill" class="bg-box"></image>
<view class="ranking-box">
<view class="nav-div">
+14 -9
View File
@@ -39,7 +39,7 @@
</view>
<view class="item" v-for="(item, index) in data_list">
<view class="title">
{{ item.mattrDesc }}
{{ item.mattrDesc}}
</view>
<view class="time">
{{ item.ctTime.substr(0, 16) }}
@@ -58,13 +58,15 @@
import { onLoad, onUnload } from '@dcloudio/uni-app';
import useZpaging from '@/composables/useZpaging.js';
import common from '@/common/common';
import {getExtraHeight} from '@/common/common';
const extra_height = ref(getExtraHeight());
import { queryPointsDetail, queryCurrentStatus } from '@/api/pointsAndRank.js';
const startVal = ref(0);
const endVal = ref(0);
const countToRef = ref(null);
const points_data = ref({});
const fetchFunction = (params) => {
queryCurrentStatus().then(({ body }) => {
const { currentPoints } = body;
@@ -172,11 +174,13 @@
flex: 1;
}
.time {
min-width: max(146rpx, 40%);
width: 254rpx;
white-space: nowrap;
}
.value {
text-align: right;
min-width: max(80rpx, 20%);
width: 128rpx;
flex-shrink: 1;
}
}
.item {
@@ -202,16 +206,18 @@
font-size: 30rpx;
color: #000000;
text-align: left;
min-width: max(146rpx, 40%);
width: 254rpx;
white-space: nowrap;
}
.value {
font-family: Arial, Arial;
font-weight: normal;
font-size: 30rpx;
flex-shrink: 1;
text-align: right;
font-weight: 600;
min-width: max(80rpx, 20%);
width: 128rpx;
// min-width: max(80rpx, 20%);
}
.up {
color: #ff8a2d;
@@ -233,14 +239,13 @@
color: #ffffff;
position: relative;
text-align: center;
margin-top: var(--status-bar-height);
margin-top: calc(var(--status-bar-height) + v-bind(extra_height));
.delete_div {
position: absolute;
right: 20rpx;
top: 17rpx;
width: 50rpx;
height: 50rpx;
.img {
width: 34rpx;
height: 34rpx;
+5 -2
View File
@@ -5,7 +5,7 @@
@query="queryList"
class="scroll_div"
:layout-only="true"
empty-view-text="暂无积分记录"
empty-view-text="暂无段位记录"
paging-class="z-paging-class"
>
<template #top>
@@ -61,6 +61,8 @@
import useZpaging from '@/composables/useZpaging.js';
import common from '@/common/common';
import { queryRankDetail, queryCurrentStatus } from '@/api/pointsAndRank.js';
import {getExtraHeight} from '@/common/common';
const extra_height = ref(getExtraHeight());
const dataInfo = reactive({
countPoints: 0, // int
currentPoints: 0, // int
@@ -210,7 +212,8 @@
color: #ffffff;
position: relative;
text-align: center;
margin-top: var(--status-bar-height);
margin-top: calc(var(--status-bar-height) + v-bind(extra_height));
// margin-top: var(--status-bar-height);
.delete_div {
position: absolute;
right: 20rpx;
+4 -2
View File
@@ -4,7 +4,7 @@
@query="queryList"
class="scroll_div"
:loading-more-enabled="false"
empty-view-text="暂无积分记录"
empty-view-text="暂无兑换活动"
paging-class="z-paging-class"
>
<template #top>
@@ -72,6 +72,8 @@
import useZpaging from '@/composables/useZpaging.js';
import common from '@/common/common';
import { queryPointsActivityDetail, addPointsExchange } from '@/api/pointsRedemption.js';
import {getExtraHeight} from '@/common/common';
const extra_height = ref(getExtraHeight());
const customStyle = {
borderRadius: '12rpx'
};
@@ -240,7 +242,7 @@
color: #ffffff;
position: relative;
text-align: center;
margin-top: var(--status-bar-height);
margin-top: calc(var(--status-bar-height) + v-bind(extra_height));
.title {
max-width: 70%;
margin: 0 auto;
+116 -18
View File
@@ -1,5 +1,5 @@
<template>
<watermark></watermark>
<!-- <watermark></watermark> -->
<view class="max_page detail-main">
<nav-bar :is_seat="false"></nav-bar>
<view class="fixed_search_div">
@@ -8,40 +8,138 @@
</view>
<view class="title font_pf">系统参数</view>
</view>
<view class="detail-title">打包信息</view>
<view class="detail-body">
<uv-cell-group :border="false">
<uv-cell-group :border="false" title="">
<uv-cell title="根域名" :value="url"></uv-cell>
<uv-cell title="当前环境:" :value="ENV.MODE"></uv-cell>
<uv-cell title="版本名称" :value="appBaseInfo.appVersion"></uv-cell>
<uv-cell title="版本号" :value="appBaseInfo.appVersionCode"></uv-cell>
<uv-cell title="点击1:" @click="aaaa"></uv-cell>
<uv-cell title="点击2:" :border="false" @click="bbbb"></uv-cell>
</uv-cell-group>
</view>
<view class="detail-title">设备信息</view>
<view class="detail-body">
<uv-cell-group :border="false" title="">
<uv-cell title="设备类型" :value="deviceInfo.deviceType"></uv-cell>
<uv-cell title="设备品牌" :value="deviceInfo.deviceBrand"></uv-cell>
<uv-cell title="设备型号" :value="deviceInfo.deviceModel"></uv-cell>
<uv-cell title="设备方向" :value="deviceInfo.deviceOrientation"></uv-cell>
<uv-cell title="设备像素比" :value="deviceInfo.devicePixelRatio"></uv-cell>
<uv-cell title="系统名称" :value="deviceInfo.osName"></uv-cell>
<uv-cell title="操作系统版本" :value="deviceInfo.osVersion"></uv-cell>
</uv-cell-group>
</view>
<view class="detail-title">窗口信息</view>
<view class="detail-body">
<uv-cell-group :border="false" title="">
<!-- 新增屏幕/窗口信息带单位优化 -->
<uv-cell title="设备像素比" :value="windowInfo.pixelRatio || '未知'"></uv-cell>
<uv-cell title="屏幕宽度" :value="windowInfo.screenWidth ? `${windowInfo.screenWidth}` : '未知'"></uv-cell>
<uv-cell title="屏幕高度" :value="windowInfo.screenHeight ? `${windowInfo.screenHeight}` : '未知'"></uv-cell>
<uv-cell title="可使用窗口宽度" :value="windowInfo.windowWidth ? `${windowInfo.windowWidth}` : '未知'"></uv-cell>
<uv-cell title="可使用窗口高度" :value="windowInfo.windowHeight ? `${windowInfo.windowHeight}` : '未知'"></uv-cell>
<uv-cell title="窗口顶部位置" :value="windowInfo.windowTop ? `${windowInfo.windowTop}` : '未知'"></uv-cell>
<uv-cell title="窗口底部位置" :value="windowInfo.windowBottom ? `${windowInfo.windowBottom}` : '未知'"></uv-cell>
<uv-cell
title="状态栏高度"
:value="windowInfo.statusBarHeight ? `${windowInfo.statusBarHeight}` : '未知'"
></uv-cell>
<uv-cell
title="设置状态栏高度"
:value="extra_height"
></uv-cell>
<uv-cell title="窗口上边缘Y值" :value="windowInfo.screenTop ? `${windowInfo.screenTop}` : '未知'"></uv-cell>
</uv-cell-group>
<uv-cell-group :border="false" title="safeArea">
<!-- 严格对应safeArea字段定义补充px单位+空值兜底 -->
<uv-cell title="左上角横坐标" :value="windowInfo.safeArea.left ? `${windowInfo.safeArea.left}` : '未知'"></uv-cell>
<uv-cell title="右下角横坐标" :value="windowInfo.safeArea.right ? `${windowInfo.safeArea.right}` : '未知'"></uv-cell>
<uv-cell title="左上角纵坐标" :value="windowInfo.safeArea.top ? `${windowInfo.safeArea.top}` : '未知'"></uv-cell>
<uv-cell title="右下角纵坐标" :value="windowInfo.safeArea.bottom ? `${windowInfo.safeArea.bottom}` : '未知'"></uv-cell>
<uv-cell title="安全区宽度" :value="windowInfo.safeArea.width ? `${windowInfo.safeArea.width}` : '未知'"></uv-cell>
<uv-cell title="安全区高度" :value="windowInfo.safeArea.height ? `${windowInfo.safeArea.height}` : '未知'"></uv-cell>
</uv-cell-group>
<uv-cell-group :border="false" title="safeAreaInsets">
<!-- 严格对应safeArea字段定义补充px单位+空值兜底 -->
<uv-cell title="左上角横坐标" :value="windowInfo.safeArea.left ? `${windowInfo.safeArea.left}` : '未知'"></uv-cell>
<uv-cell title="右下角横坐标" :value="windowInfo.safeArea.right ? `${windowInfo.safeArea.right}` : '未知'"></uv-cell>
<uv-cell title="左上角纵坐标" :value="windowInfo.safeArea.top ? `${windowInfo.safeArea.top}` : '未知'"></uv-cell>
<uv-cell title="右下角纵坐标" :value="windowInfo.safeArea.bottom ? `${windowInfo.safeArea.bottom}` : '未知'"></uv-cell>
<uv-cell title="安全区宽度" :value="windowInfo.safeArea.width ? `${windowInfo.safeArea.width}` : '未知'"></uv-cell>
<uv-cell title="安全区高度" :value="windowInfo.safeArea.height ? `${windowInfo.safeArea.height}` : '未知'"></uv-cell>
</uv-cell-group>
</view>
<view class="detail-title"></view>
</view>
</template>
<script setup>
import common from '@/common/common';
import permision from '@/common/permission'
import {
get_base_url
} from '../../api/request';
import permision from '@/common/permission';
import { get_base_url } from '../../api/request';
const url = get_base_url();
const ENV = import.meta.env
const appBaseInfo = uni.getAppBaseInfo()
import showDialog from '@/common/dialogMessage'
const ENV = import.meta.env;
const appBaseInfo = uni.getAppBaseInfo();
import showDialog from '@/common/dialogMessage';
import { reactive, ref } from 'vue';
import { onLoad } from '@dcloudio/uni-app';
import {getExtraHeight} from '@/common/common';
const extra_height = ref(getExtraHeight());
const customStyle = {
fontWeight:700
}
const deviceInfo = reactive({
deviceType: '', //
deviceBrand: '', //
deviceModel: '', //
deviceOrientation: '', //
devicePixelRatio: '', //
osName: '', //
osVersion: '' //
});
const windowInfo = reactive({
pixelRatio: '', // number
screenWidth: '', //
screenHeight: '', //
windowWidth: '', // 使
windowHeight: '', // 使
windowTop: '', // 使
windowBottom: '', // 使
statusBarHeight: '', //
screenTop: '', // y
safeArea: {}, //
safeAreaInsets: {} //
});
const bbbb = () => {
onLoad(() => {
const _deviceInfo = uni.getDeviceInfo();
Object.assign(deviceInfo, _deviceInfo);
const _windowInfo = uni.getWindowInfo();
Object.assign(windowInfo, _windowInfo);
}
const aaaa = async() => {
common.navigateTo('/pages/test/testChat')
}
});
// windowTop:'', //
// statusBarHeight:'', //
// safeArea:{}, // safeArea
const bbbb = () => {};
const aaaa = async () => {
common.navigateTo('/pages/test/testChat');
};
</script>
<style lang="scss" scoped>
$bg-margin-left: 50rpx;
.detail-title {
margin: 30rpx $bg-margin-left 0 calc($bg-margin-left + 15rpx);
font-size: 32rpx;
font-weight: 600;
z-index: 101;
overflow: hidden;
}
.detail-body {
margin: 30rpx $bg-margin-left 0 $bg-margin-left;
background: #ffffff;
@@ -65,7 +163,7 @@
}
.detail-main {
background-color: #F6F8FF;
background-color: #f6f8ff;
}
.title {
@@ -113,4 +211,4 @@
}
}
}
</style>
</style>