微信小程序联调

This commit is contained in:
zhonghua.li
2026-04-18 07:52:47 +08:00
parent 36b8784bc1
commit d18a546915
23 changed files with 199 additions and 106 deletions

View File

@@ -524,12 +524,18 @@ export default {
<style>
.reception-form-wrapper {
/* 使用绝对定位从tab页底部开始高度计算100vh - 导航栏(88rpx) - tab页(72rpx) - 底部导航栏(96rpx) */
/* 由父组件传入 topcomputedContentTop避免不同机型写死 160rpx 导致大空白 */
position: absolute;
top: 160rpx; /* 导航栏(88rpx) + tab页(72rpx) = 160rpx */
top: 0; /* top 值通过父组件的内联 style 动态设置 */
left: 0;
right: 0;
bottom: 96rpx; /* 底部导航栏高度 */
/* #ifndef MP-WEIXIN */
bottom: 96rpx; /* H5 环境:底部导航栏高度 */
/* #endif */
/* #ifdef MP-WEIXIN */
/* 微信小程序:本页非 tabBar容器可延伸到视口底部 */
bottom: 0 !important;
/* #endif */
background-color: #F5F5F5;
box-sizing: border-box;
width: 100%;

View File

@@ -50,6 +50,8 @@
<!-- 开始接待表单 -->
<common-begin-reception
v-if="activeTab === 'reception'"
class="reception-form-container"
:style="{ top: computedContentTop || contentTop }"
:initial-data="receptionForm"
@cancel="onReceptionCancel"
@save-success="onReceptionSaveSuccess"
@@ -352,38 +354,22 @@ import ServiceListFurniture from "./serviceListFurniture.vue";
computed: {
// 计算导航栏和内容区域的位置(使用计算属性确保响应式)
computedNavbarTop() {
console.log('[FurnitureReception][computedNavbarTop] 计算导航栏位置');
const systemInfo = uni.getSystemInfoSync();
const statusBarHeight = systemInfo.statusBarHeight || 20;
const navbarHeight = 44;
const statusBarHeightRpx = statusBarHeight * 2;
const navbarHeightRpx = navbarHeight * 2;
const totalNavbarHeight = statusBarHeightRpx + navbarHeightRpx;
const result = totalNavbarHeight + 'rpx';
console.log('[FurnitureReception][computedNavbarTop] 计算结果:', {
statusBarHeight,
navbarHeight,
totalNavbarHeight,
result
});
return result;
const windowWidth = systemInfo.windowWidth || systemInfo.screenWidth || 375;
const pxToRpx = 750 / windowWidth;
const totalNavbarHeightRpx = (statusBarHeight + navbarHeight) * pxToRpx;
return totalNavbarHeightRpx + 'rpx';
},
computedContentTop() {
console.log('[FurnitureReception][computedContentTop] 计算内容区域位置');
const systemInfo = uni.getSystemInfoSync();
const statusBarHeight = systemInfo.statusBarHeight || 20;
const navbarHeight = 44;
const statusBarHeightRpx = statusBarHeight * 2;
const navbarHeightRpx = navbarHeight * 2;
const totalNavbarHeight = statusBarHeightRpx + navbarHeightRpx;
const result = (totalNavbarHeight + 72) + 'rpx'; // tab栏高度72rpx
console.log('[FurnitureReception][computedContentTop] 计算结果:', {
statusBarHeight,
navbarHeight,
totalNavbarHeight,
result
});
return result;
const windowWidth = systemInfo.windowWidth || systemInfo.screenWidth || 375;
const pxToRpx = 750 / windowWidth;
const totalNavbarHeightRpx = (statusBarHeight + navbarHeight) * pxToRpx;
return (totalNavbarHeightRpx + 72) + 'rpx'; // tab栏高度72rpx
}
},
onLoad() {

View File

@@ -1,44 +1,47 @@
<template>
<view>
<!-- 服务状态列表 -->
<scroll-view
class="service-status-list"
scroll-y
@scrolltolower="onServiceStatusReachBottom">
<view class="service-status-toolbar">
<text class="toolbar-total">{{ serviceStatusTotal }}</text>
<input
class="toolbar-input"
v-model="serviceStatusQuery.salesName"
placeholder="所属销售姓名"
placeholder-style="color: #b0b0b0"
confirm-type="search"
@confirm="onServiceStatusSearch"
/>
<input
class="toolbar-input"
v-model="serviceStatusQuery.customerName"
placeholder="客户姓名"
placeholder-style="color: #b0b0b0"
confirm-type="search"
@confirm="onServiceStatusSearch"
/>
<input
v-if="isAdmin"
class="toolbar-input"
v-model="serviceStatusQuery.salesPhone"
placeholder="销售电话"
placeholder-style="color: #b0b0b0"
confirm-type="search"
@confirm="onServiceStatusSearch"
/>
<view class="toolbar-actions">
<view class="toolbar-btn toolbar-btn--refresh" @click="onServiceStatusRefresh">
<uni-icons type="refresh" size="18" color="#2A68FF"></uni-icons>
<text>刷新</text>
</view>
<view class="service-list-container">
<!-- 工具条参考服务记录放在 scroll-view 避免顶部空白/滚动错位 -->
<view class="service-status-toolbar">
<text class="toolbar-total">{{ serviceStatusTotal }}</text>
<input
class="toolbar-input"
v-model="serviceStatusQuery.salesName"
placeholder="所属销售姓名"
placeholder-style="color: #b0b0b0"
confirm-type="search"
@confirm="onServiceStatusSearch"
/>
<input
class="toolbar-input"
v-model="serviceStatusQuery.customerName"
placeholder="客户姓名"
placeholder-style="color: #b0b0b0"
confirm-type="search"
@confirm="onServiceStatusSearch"
/>
<input
v-if="isAdmin"
class="toolbar-input"
v-model="serviceStatusQuery.salesPhone"
placeholder="销售电话"
placeholder-style="color: #b0b0b0"
confirm-type="search"
@confirm="onServiceStatusSearch"
/>
<view class="toolbar-actions">
<view class="toolbar-btn toolbar-btn--refresh" @click="onServiceStatusRefresh">
<uni-icons type="refresh" size="18" color="#2A68FF"></uni-icons>
<text>刷新</text>
</view>
</view>
</view>
<!-- 服务状态列表 -->
<scroll-view
class="service-list"
scroll-y
enable-flex
@scrolltolower="onServiceStatusReachBottom">
<view
class="service-card"
v-for="(item, index) in serviceStatusList"
@@ -1020,18 +1023,16 @@ export default {
</script>
<style scoped>
/* 最外层容器 */
.service-status-list {
/* 容器布局(参考「服务记录」组件):工具条固定在上,列表滚动占满剩余高度 */
.service-list-container {
height: 100%;
width: 100%;
display: flex;
flex-direction: column;
background-color: #F5F5F5;
padding: 24rpx 16rpx 0 16rpx;
/* 只保留左右 padding让 toolbar 紧贴 tab下方不再出现大空白 */
padding: 0 16rpx;
box-sizing: border-box;
/* #ifndef MP-WEIXIN */
height: 100%;
/* #endif */
/* #ifdef MP-WEIXIN */
height: 100%;
/* #endif */
}
.service-status-toolbar {
@@ -1047,6 +1048,14 @@ export default {
overflow-x: auto;
min-height: 64rpx;
box-sizing: border-box;
flex-shrink: 0;
}
.service-list {
flex: 1;
background-color: transparent;
box-sizing: border-box;
overflow-y: auto;
}
.toolbar-total {

View File

@@ -2,8 +2,21 @@
<view class="center">
<uni-sign-in ref="signIn"></uni-sign-in>
<view class="userInfo" @click.capture="toUserInfo">
<cloud-image width="150rpx" height="150rpx" v-if="hasLogin&&userInfo.avatar_file&&userInfo.avatar_file.url" :src="userInfo.avatar_file.url"></cloud-image>
<!-- 云存储 fileID cloud-image普通网络图用 image相对路径会拼 API 根地址避免小程序下无法加载 -->
<cloud-image
v-if="showCloudAvatar"
width="150rpx"
height="150rpx"
:src="resolvedAvatarUrl"
@load-error="onRemoteAvatarFail"
/>
<image
v-else-if="showHttpAvatar"
class="user-avatar-img"
:src="resolvedAvatarUrl"
mode="aspectFill"
@error="onRemoteAvatarFail"
/>
<view v-else class="defaultAvatarUrl">
<uni-icons color="#ffffff" size="50" type="person-filled" />
</view>
@@ -122,6 +135,7 @@
mutations
} from '@/common/store.js'
import { put, get } from '@/common/request.js'
import { API_BASE_URL } from '@/common/config.js'
import DeviceBindPopup from './components/DeviceBindPopup.vue'
import DeviceListPopup from './components/DeviceListPopup.vue'
import CloudImage from '@/uni_modules/uni-id-pages/components/cloud-image/cloud-image.vue'
@@ -171,6 +185,8 @@
confirmPassword: ''
},
changePwdSubmitting: false,
/** 头像远程地址加载失败时回退默认占位云临时链失败、域名未配置、404 等) */
remoteAvatarFailed: false,
ucenterList: [
[
// #ifdef APP-PLUS
@@ -223,6 +239,11 @@
}
}
},
watch: {
resolvedAvatarUrl() {
this.remoteAvatarFailed = false
}
},
onLoad() {
// 加载用户信息
this.loadUserInfo()
@@ -270,6 +291,34 @@
hasLogin(){
return store.hasLogin || false
},
rawAvatarUrl() {
const u = this.userInfo && this.userInfo.avatar_file && this.userInfo.avatar_file.url
return typeof u === 'string' ? u.trim() : ''
},
/** 小程序中相对路径 /api/... 或 /uploads/... 需补全为完整 URL云存储仍为 cloud:// */
resolvedAvatarUrl() {
const t = this.rawAvatarUrl
if (!t) return ''
if (
t.startsWith('cloud://') ||
t.startsWith('http://') ||
t.startsWith('https://') ||
t.startsWith('data:') ||
t.startsWith('wxfile://') ||
t.startsWith('//')
) {
return t.startsWith('//') ? `https:${t}` : t
}
const base = API_BASE_URL.replace(/\/+$/, '')
return t.startsWith('/') ? `${base}${t}` : `${base}/${t}`
},
showCloudAvatar() {
return this.hasLogin && !!this.resolvedAvatarUrl && this.resolvedAvatarUrl.startsWith('cloud://') && !this.remoteAvatarFailed
},
showHttpAvatar() {
const u = this.resolvedAvatarUrl
return this.hasLogin && !!u && !u.startsWith('cloud://') && !this.remoteAvatarFailed
},
// #ifdef APP-PLUS
appVersion() {
try {
@@ -297,6 +346,9 @@
}
},
methods: {
onRemoteAvatarFail() {
this.remoteAvatarFailed = true
},
/**
* 加载用户信息租户ID和登录人信息
*/
@@ -854,6 +906,13 @@
align-items: center;
}
.user-avatar-img {
width: 150rpx;
height: 150rpx;
border-radius: 100%;
background-color: rgba(0, 0, 0, 0.15);
}
.logo-title {
flex: 1;
align-items: center;

View File

@@ -1,6 +1,6 @@
<template>
<view @click="onClick" :style="{width,height}" style="justify-content: center;">
<image v-if="cSrc" :style="{width,height}" :src="cSrc" :mode="mode"></image>
<view @click="onClick" :style="{width,height}" class="cloud-image-box">
<image v-if="cSrc" :style="{width,height}" :src="cSrc" :mode="mode" @error="onImageError"></image>
</view>
</template>
@@ -8,20 +8,21 @@
/**
* cloud-image
* @description 兼容普通资源和unicloud图片资源渲染的组件
* @property {String} mode 图片裁剪、缩放的模式。默认为widthFix支持所有image组件的mode
* @property {String} mode 图片裁剪、缩放的模式。默认为 aspectFill适合头像,支持所有 imagemode
* @property {String} src 资源完了链接或uniCloud云存储资源的fileid
* @property {String} width 图片的宽默认为100rpx
* @property {String} height 图片的高默认为100rpx
* @event {Function} click 点击 cloud-image 触发事件
* @event {Function} load-error 临时链接获取失败或图片加载失败
*/
export default {
name: "cloud-image",
emits:['click'],
emits:['click', 'load-error'],
props: {
mode: {
type:String,
default () {
return 'widthFix'
return 'aspectFill'
}
},
src: {
@@ -46,14 +47,29 @@
watch: {
src:{
handler(src) {
if (src&&src.substring(0, 8) == "cloud://") {
this.cSrc = ''
if (!src || typeof src !== 'string') {
return
}
const s = src.trim()
if (!s) {
return
}
if (s.substring(0, 8) === 'cloud://') {
uniCloud.getTempFileURL({
fileList: [src]
}).then(res=>{
this.cSrc = res.fileList[0].tempFileURL
fileList: [s]
}).then((res) => {
const url = res && res.fileList && res.fileList[0] && res.fileList[0].tempFileURL
if (url) {
this.cSrc = url
} else {
this.$emit('load-error')
}
}).catch(() => {
this.$emit('load-error')
})
}else{
this.cSrc = src
} else {
this.cSrc = s
}
},
immediate: true
@@ -62,12 +78,25 @@
methods:{
onClick(){
this.$emit('click')
},
onImageError() {
this.cSrc = ''
this.$emit('load-error')
}
},
data() {
return {
cSrc:false
cSrc: ''
};
}
}
</script>
</script>
<style scoped>
.cloud-image-box {
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
}
</style>

View File

@@ -203,11 +203,14 @@
// 同步更新前端 store保证"我的"页等能识别为已登录状态
try {
const avatarStr = loginData.avatar != null && loginData.avatar !== ''
? String(loginData.avatar).trim()
: ''
mutations.setUserInfo({
username: loginData.userName,
mobile: loginData.phone,
email: loginData.email,
avatar_file: loginData.avatar ? { url: loginData.avatar } : undefined
avatar_file: avatarStr ? { url: avatarStr } : undefined
}, { cover: true })
console.log('[Login] Store updated successfully, hasLogin:', store.hasLogin, 'userInfo:', store.userInfo)
} catch (e) {

View File

@@ -1 +1 @@
"use strict";const o=require("./env.js"),t={local:"http://localhost:8091/",prod:"http://api01ai.huayang-star.com/"},r={development:"local",production:"prod",local:"local",prod:"prod"};const n=function(){var t;const n=null==(t=o.envConfig)?void 0:t.apiEnv;{const o=r[n.toLowerCase()];if(o)return o}const e="undefined"!=typeof process&&(null==process?void 0:process.env)?process.env.UNI_APP_API_ENV||"production":"",s=e?e.toLowerCase():"";return r[s]||"prod"}(),e=(s=t[n]||t.prod).endsWith("/")?s:`${s}/`;var s;exports.getApiEnv=function(){return n},exports.getApiUrl=function(o=""){const t=o.startsWith("/")?o:`/${o}`,r=t.startsWith("/")?t.slice(1):t;return`${e}${r}`};
"use strict";const o=require("./env.js"),t={local:"http://localhost:8091/",prod:"http://api01ai.huayang-star.com/"},r={development:"local",production:"prod",local:"local",prod:"prod"};const e=function(){var t;const e=null==(t=o.envConfig)?void 0:t.apiEnv;{const o=r[e.toLowerCase()];if(o)return o}const n="undefined"!=typeof process&&(null==process?void 0:process.env)?process.env.UNI_APP_API_ENV||"production":"",s=n?n.toLowerCase():"";return r[s]||"prod"}(),n=(s=t[e]||t.prod).endsWith("/")?s:`${s}/`;var s;exports.API_BASE_URL=n,exports.getApiEnv=function(){return e},exports.getApiUrl=function(o=""){const t=o.startsWith("/")?o:`/${o}`,r=t.startsWith("/")?t.slice(1):t;return`${n}${r}`};

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

View File

@@ -1 +1 @@
"use strict";const e=require("../../../../common/vendor.js"),t={name:"cloud-image",emits:["click"],props:{mode:{type:String,default:()=>"widthFix"},src:{default:()=>""},width:{type:String,default:()=>"100rpx"},height:{type:String,default:()=>"100rpx"}},watch:{src:{handler(t){t&&"cloud://"==t.substring(0,8)?e._r.getTempFileURL({fileList:[t]}).then((e=>{this.cSrc=e.fileList[0].tempFileURL})):this.cSrc=t},immediate:!0}},methods:{onClick(){this.$emit("click")}},data:()=>({cSrc:!1})};const i=e._export_sfc(t,[["render",function(t,i,c,r,n,d){return e.e({a:n.cSrc},n.cSrc?{b:c.width,c:c.height,d:n.cSrc,e:c.mode}:{},{f:e.o(((...e)=>d.onClick&&d.onClick(...e)),"93"),g:c.width,h:c.height})}]]);wx.createComponent(i);
"use strict";const t=require("../../../../common/vendor.js"),e={name:"cloud-image",emits:["click","load-error"],props:{mode:{type:String,default:()=>"aspectFill"},src:{default:()=>""},width:{type:String,default:()=>"100rpx"},height:{type:String,default:()=>"100rpx"}},watch:{src:{handler(e){if(this.cSrc="",!e||"string"!=typeof e)return;const r=e.trim();r&&("cloud://"===r.substring(0,8)?t._r.getTempFileURL({fileList:[r]}).then((t=>{const e=t&&t.fileList&&t.fileList[0]&&t.fileList[0].tempFileURL;e?this.cSrc=e:this.$emit("load-error")})).catch((()=>{this.$emit("load-error")})):this.cSrc=r)},immediate:!0}},methods:{onClick(){this.$emit("click")},onImageError(){this.cSrc="",this.$emit("load-error")}},data:()=>({cSrc:""})};const r=t._export_sfc(e,[["render",function(e,r,i,c,o,s){return t.e({a:o.cSrc},o.cSrc?{b:i.width,c:i.height,d:o.cSrc,e:i.mode,f:t.o(((...t)=>s.onImageError&&s.onImageError(...t)),"9a")}:{},{g:t.o(((...t)=>s.onClick&&s.onClick(...t)),"93"),h:i.width,i:i.height})}],["__scopeId","data-v-11b6d0d3"]]);wx.createComponent(r);

View File

@@ -1 +1 @@
<view bindtap="{{f}}" style="{{'width:' + g + ';' + ('height:' + h) + ';' + 'justify-content:center'}}"><image wx:if="{{a}}" style="{{'width:' + b + ';' + ('height:' + c)}}" src="{{d}}" mode="{{e}}"></image></view>
<view bindtap="{{g}}" style="{{'width:' + h + ';' + ('height:' + i)}}" class="cloud-image-box data-v-11b6d0d3"><image wx:if="{{a}}" class="data-v-11b6d0d3" style="{{'width:' + b + ';' + ('height:' + c)}}" src="{{d}}" mode="{{e}}" binderror="{{f}}"></image></view>

View File

@@ -0,0 +1 @@
.cloud-image-box.data-v-11b6d0d3{display:flex;justify-content:center;align-items:center;overflow:hidden}

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
<view class="uni-content data-v-6464e2fa"><view class="login-logo data-v-6464e2fa"><image class="data-v-6464e2fa" src="{{a}}"></image></view><text class="title title-box data-v-6464e2fa">账号密码登录</text><uni-forms class="data-v-6464e2fa" u-s="{{['d']}}" u-i="6464e2fa-0" bind:__l="__l"><uni-forms-item wx:if="{{e}}" class="data-v-6464e2fa" u-s="{{['d']}}" u-i="6464e2fa-1,6464e2fa-0" bind:__l="__l" u-p="{{e}}"><uni-easyinput wx:if="{{d}}" bindblur="{{b}}" class="input-box data-v-6464e2fa" u-i="6464e2fa-2,6464e2fa-1" bind:__l="__l" bindupdateModelValue="{{c}}" u-p="{{d}}"/></uni-forms-item><uni-forms-item wx:if="{{i}}" class="data-v-6464e2fa" u-s="{{['d']}}" u-i="6464e2fa-3,6464e2fa-0" bind:__l="__l" u-p="{{i}}"><uni-easyinput wx:if="{{h}}" bindblur="{{f}}" class="input-box data-v-6464e2fa" u-i="6464e2fa-4,6464e2fa-3" bind:__l="__l" bindupdateModelValue="{{g}}" u-p="{{h}}"/></uni-forms-item></uni-forms><uni-captcha wx:if="{{j}}" class="r data-v-6464e2fa" u-r="captcha" u-i="6464e2fa-5" bind:__l="__l" bindupdateModelValue="{{l}}" u-p="{{m}}"/><uni-id-pages-agreements wx:if="{{o}}" class="r data-v-6464e2fa" u-r="agreements" u-i="6464e2fa-6" bind:__l="__l" u-p="{{o}}"></uni-id-pages-agreements><button class="uni-btn data-v-6464e2fa" type="primary" bindtap="{{p}}">登录</button><view class="link-box data-v-6464e2fa"><view wx:if="{{q}}" class="data-v-6464e2fa"><text class="forget data-v-6464e2fa">忘记了?</text><text class="link data-v-6464e2fa" bindtap="{{r}}">找回密码</text></view><text class="link data-v-6464e2fa" bindtap="{{t}}">{{s}}</text></view><uni-id-pages-fab-login class="r data-v-6464e2fa" u-r="uniFabLogin" u-i="6464e2fa-7" bind:__l="__l"></uni-id-pages-fab-login></view>
<view class="uni-content data-v-cb74ec4b"><view class="login-logo data-v-cb74ec4b"><image class="data-v-cb74ec4b" src="{{a}}"></image></view><text class="title title-box data-v-cb74ec4b">账号密码登录</text><uni-forms class="data-v-cb74ec4b" u-s="{{['d']}}" u-i="cb74ec4b-0" bind:__l="__l"><uni-forms-item wx:if="{{e}}" class="data-v-cb74ec4b" u-s="{{['d']}}" u-i="cb74ec4b-1,cb74ec4b-0" bind:__l="__l" u-p="{{e}}"><uni-easyinput wx:if="{{d}}" bindblur="{{b}}" class="input-box data-v-cb74ec4b" u-i="cb74ec4b-2,cb74ec4b-1" bind:__l="__l" bindupdateModelValue="{{c}}" u-p="{{d}}"/></uni-forms-item><uni-forms-item wx:if="{{i}}" class="data-v-cb74ec4b" u-s="{{['d']}}" u-i="cb74ec4b-3,cb74ec4b-0" bind:__l="__l" u-p="{{i}}"><uni-easyinput wx:if="{{h}}" bindblur="{{f}}" class="input-box data-v-cb74ec4b" u-i="cb74ec4b-4,cb74ec4b-3" bind:__l="__l" bindupdateModelValue="{{g}}" u-p="{{h}}"/></uni-forms-item></uni-forms><uni-captcha wx:if="{{j}}" class="r data-v-cb74ec4b" u-r="captcha" u-i="cb74ec4b-5" bind:__l="__l" bindupdateModelValue="{{l}}" u-p="{{m}}"/><uni-id-pages-agreements wx:if="{{o}}" class="r data-v-cb74ec4b" u-r="agreements" u-i="cb74ec4b-6" bind:__l="__l" u-p="{{o}}"></uni-id-pages-agreements><button class="uni-btn data-v-cb74ec4b" type="primary" bindtap="{{p}}">登录</button><view class="link-box data-v-cb74ec4b"><view wx:if="{{q}}" class="data-v-cb74ec4b"><text class="forget data-v-cb74ec4b">忘记了?</text><text class="link data-v-cb74ec4b" bindtap="{{r}}">找回密码</text></view><text class="link data-v-cb74ec4b" bindtap="{{t}}">{{s}}</text></view><uni-id-pages-fab-login class="r data-v-cb74ec4b" u-r="uniFabLogin" u-i="cb74ec4b-7" bind:__l="__l"></uni-id-pages-fab-login></view>

View File

@@ -1 +1 @@
.uni-content.data-v-6464e2fa{padding:0 60rpx}.login-logo.data-v-6464e2fa{display:none}@media screen and (min-width: 690px){.uni-content.data-v-6464e2fa{padding:0;max-width:300px;margin-left:calc(50% - 200px)}}.uni-content view.data-v-6464e2fa{box-sizing:border-box}.title.data-v-6464e2fa{display:flex;padding:18px 0;font-weight:800;flex-direction:column}.tip.data-v-6464e2fa{display:flex;color:#bdbdc0;font-size:11px;margin:6px 0}.uni-content.data-v-6464e2fa .uni-easyinput__content,.input-box.data-v-6464e2fa{height:44px;background-color:#f8f8f8!important;border-radius:0;font-size:14px;display:flex;flex:1}.link.data-v-6464e2fa{color:#04498c;cursor:pointer}.uni-content.data-v-6464e2fa .uni-forms-item__inner{padding-bottom:8px}.uni-btn.data-v-6464e2fa{text-align:center;height:40px;line-height:40px;margin:15px 0 10px;color:#fff!important;border-radius:5px;font-size:16px}.uni-body.uni_modules-uni-id-pages-pages-login-login-withoutpwd.data-v-6464e2fa{height:auto!important}@media screen and (min-width: 690px){.uni-content.data-v-6464e2fa{height:auto}}.forget.data-v-6464e2fa{font-size:12px;color:#8a8f8b}.link-box.data-v-6464e2fa{display:flex;flex-direction:row;justify-content:space-between;margin-top:20px}.link.data-v-6464e2fa{font-size:12px}
.uni-content.data-v-cb74ec4b{padding:0 60rpx}.login-logo.data-v-cb74ec4b{display:none}@media screen and (min-width: 690px){.uni-content.data-v-cb74ec4b{padding:0;max-width:300px;margin-left:calc(50% - 200px)}}.uni-content view.data-v-cb74ec4b{box-sizing:border-box}.title.data-v-cb74ec4b{display:flex;padding:18px 0;font-weight:800;flex-direction:column}.tip.data-v-cb74ec4b{display:flex;color:#bdbdc0;font-size:11px;margin:6px 0}.uni-content.data-v-cb74ec4b .uni-easyinput__content,.input-box.data-v-cb74ec4b{height:44px;background-color:#f8f8f8!important;border-radius:0;font-size:14px;display:flex;flex:1}.link.data-v-cb74ec4b{color:#04498c;cursor:pointer}.uni-content.data-v-cb74ec4b .uni-forms-item__inner{padding-bottom:8px}.uni-btn.data-v-cb74ec4b{text-align:center;height:40px;line-height:40px;margin:15px 0 10px;color:#fff!important;border-radius:5px;font-size:16px}.uni-body.uni_modules-uni-id-pages-pages-login-login-withoutpwd.data-v-cb74ec4b{height:auto!important}@media screen and (min-width: 690px){.uni-content.data-v-cb74ec4b{height:auto}}.forget.data-v-cb74ec4b{font-size:12px;color:#8a8f8b}.link-box.data-v-cb74ec4b{display:flex;flex-direction:row;justify-content:space-between;margin-top:20px}.link.data-v-cb74ec4b{font-size:12px}