图片路径重设

This commit is contained in:
1 2025-07-03 08:57:13 +08:00
parent c1a82f2bd1
commit 09f4a7f7d0
27 changed files with 1814 additions and 1643 deletions

View File

@ -17,19 +17,19 @@ let xinzhiKey = 'SBh45_yy21FU5ErV_';
const CONFIG = { const CONFIG = {
// 开发环境配置 // 开发环境配置
development: { development: {
officialWebUrl: 'https://iot-xcwl.cn/', officialWebUrl: 'https://xaznkj.cn/',
baseUrl: 'https://iot-xcwl.cn/prod-api/', baseUrl: 'https://xaznkj.cn/prod-api/',
mqttServer: protocalProd + 'iot-xcwl.cn/mqtt', mqttServer: protocalProd + 'xaznkj.cn/mqtt',
decoderUrl: 'https://iot-xcwl.cn/', decoderUrl: 'https://xaznkj.cn/',
qqmapKey, qqmapKey,
xinzhiKey, xinzhiKey,
}, },
// 生产环境配置 // 生产环境配置
production: { production: {
officialWebUrl: 'https://iot-xcwl.cn/', officialWebUrl: 'https://xaznkj.cn/',
baseUrl: 'https://iot-xcwl.cn/prod-api/', baseUrl: 'https://xaznkj.cn/prod-api/',
mqttServer: protocalProd + 'iot-xcwl.cn/mqtt', mqttServer: protocalProd + 'xaznkj.cn/mqtt',
decoderUrl: 'https://iot-xcwl.cn/', decoderUrl: 'https://xaznkj.cn/',
qqmapKey, qqmapKey,
xinzhiKey, xinzhiKey,
} }

View File

@ -1,31 +1,31 @@
{ {
"name": "芯程物联", "name" : "芯程物联",
"appid": "__UNI__0B4DD99", "appid" : "__UNI__0B4DD99",
"description": "开源物联网平台", "description" : "开源物联网平台",
"versionName": "1.0.0", "versionName" : "1.0.0",
"versionCode": 260, "versionCode" : 260,
"transformPx": false, "transformPx" : false,
"app-plus": { "app-plus" : {
"kernel": { "kernel" : {
"ios": "WKWebview" "ios" : "WKWebview"
}, },
"usingComponents": true, "usingComponents" : true,
"nvueCompiler": "uni-app", "nvueCompiler" : "uni-app",
"compilerVersion": 3, "compilerVersion" : 3,
"splashscreen": { "splashscreen" : {
"alwaysShowBeforeRender": true, "alwaysShowBeforeRender" : true,
"waiting": true, "waiting" : true,
"autoclose": true, "autoclose" : true,
"delay": 0 "delay" : 0
}, },
"modules": { "modules" : {
"Barcode": {}, "Barcode" : {},
"OAuth": {}, "OAuth" : {},
"Camera": {} "Camera" : {}
}, },
"distribute": { "distribute" : {
"android": { "android" : {
"permissions": [ "permissions" : [
"<uses-feature android:name=\"android.hardware.camera\"/>", "<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>", "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>", "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
@ -36,149 +36,149 @@
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.INTERNET\"/>" "<uses-permission android:name=\"android.permission.INTERNET\"/>"
], ],
"minSdkVersion": 22, "minSdkVersion" : 22,
"targetSdkVersion": 30, "targetSdkVersion" : 30,
"abiFilters": ["armeabi-v7a", "arm64-v8a"], "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ],
"permissionExternalStorage": { "permissionExternalStorage" : {
"request": "none", "request" : "none",
"prompt": "应用保存运行状态等信息,需要获取读写手机存储权限,请允许。" "prompt" : "应用保存运行状态等信息,需要获取读写手机存储权限,请允许。"
}, },
"permissionPhoneState": { "permissionPhoneState" : {
"request": "none", "request" : "none",
"prompt": "为保证您正常、安全地使用,需要获取设备识别码使用权限,请允许。" "prompt" : "为保证您正常、安全地使用,需要获取设备识别码使用权限,请允许。"
}, },
"schemes": "fastbee" "schemes" : "fastbee"
}, },
"ios": { "ios" : {
"idfa": true, "idfa" : true,
"privacyDescription": { "privacyDescription" : {
"NSLocationAlwaysUsageDescription": "便于您使用该功能获取当前位置天气情况、WIFI列表等场景。", "NSLocationAlwaysUsageDescription" : "便于您使用该功能获取当前位置天气情况、WIFI列表等场景。",
"NSLocationAlwaysAndWhenInUseUsageDescription": "便于您使用该功能获取当前位置天气情况、WIFI列表等场景。", "NSLocationAlwaysAndWhenInUseUsageDescription" : "便于您使用该功能获取当前位置天气情况、WIFI列表等场景。",
"NSLocalNetworkUsageDescription": "允许访问蜂窝网络,用于扫码/关联式添加设备", "NSLocalNetworkUsageDescription" : "允许访问蜂窝网络,用于扫码/关联式添加设备",
"NSLocationWhenInUseUsageDescription": "便于您使用该功能获取当前位置天气情况、WIFI列表等场景。" "NSLocationWhenInUseUsageDescription" : "便于您使用该功能获取当前位置天气情况、WIFI列表等场景。"
}, },
"dSYMs": false, "dSYMs" : false,
"urltypes": "fastbee" "urltypes" : "fastbee"
}, },
"sdkConfigs": { "sdkConfigs" : {
"push": {}, "push" : {},
"statics": {}, "statics" : {},
"maps": {}, "maps" : {},
"ad": {}, "ad" : {},
"oauth": { "oauth" : {
"weixin": { "weixin" : {
"appid": "wx6be3f0d7bf7154e1", "appid" : "wx6be3f0d7bf7154e1",
"appsecret": "b6c1d0da60bd5250857d211cdc64fdc9", "appsecret" : "b6c1d0da60bd5250857d211cdc64fdc9",
"UniversalLinks": "" "UniversalLinks" : ""
} }
} }
}, },
"splashscreen": { "splashscreen" : {
"iosStyle": "common", "iosStyle" : "common",
"androidStyle": "default", "androidStyle" : "default",
"alwaysShowBeforeRender": false, "alwaysShowBeforeRender" : false,
"waiting": true, "waiting" : true,
"autoclose": false, "autoclose" : false,
"delay": 0, "delay" : 0,
"android": { "android" : {
"hdpi": "./static/logo.9.png", "hdpi" : "./static/logo.9.png",
"xhdpi": "./static/logo.9.png", "xhdpi" : "./static/logo.9.png",
"xxhdpi": "./static/logo.9.png" "xxhdpi" : "./static/logo.9.png"
} }
}, },
"icons": { "icons" : {
"android": { "android" : {
"hdpi": "unpackage/res/icons/72x72.png", "hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi": "unpackage/res/icons/96x96.png", "xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi": "unpackage/res/icons/144x144.png", "xxhdpi" : "unpackage/res/icons/144x144.png",
"xxxhdpi": "unpackage/res/icons/192x192.png" "xxxhdpi" : "unpackage/res/icons/192x192.png"
}, },
"ios": { "ios" : {
"appstore": "unpackage/res/icons/1024x1024.png", "appstore" : "unpackage/res/icons/1024x1024.png",
"ipad": { "ipad" : {
"app": "unpackage/res/icons/76x76.png", "app" : "unpackage/res/icons/76x76.png",
"app@2x": "unpackage/res/icons/152x152.png", "app@2x" : "unpackage/res/icons/152x152.png",
"notification": "unpackage/res/icons/20x20.png", "notification" : "unpackage/res/icons/20x20.png",
"notification@2x": "unpackage/res/icons/40x40.png", "notification@2x" : "unpackage/res/icons/40x40.png",
"proapp@2x": "unpackage/res/icons/167x167.png", "proapp@2x" : "unpackage/res/icons/167x167.png",
"settings": "unpackage/res/icons/29x29.png", "settings" : "unpackage/res/icons/29x29.png",
"settings@2x": "unpackage/res/icons/58x58.png", "settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight": "unpackage/res/icons/40x40.png", "spotlight" : "unpackage/res/icons/40x40.png",
"spotlight@2x": "unpackage/res/icons/80x80.png" "spotlight@2x" : "unpackage/res/icons/80x80.png"
}, },
"iphone": { "iphone" : {
"app@2x": "unpackage/res/icons/120x120.png", "app@2x" : "unpackage/res/icons/120x120.png",
"app@3x": "unpackage/res/icons/180x180.png", "app@3x" : "unpackage/res/icons/180x180.png",
"notification@2x": "unpackage/res/icons/40x40.png", "notification@2x" : "unpackage/res/icons/40x40.png",
"notification@3x": "unpackage/res/icons/60x60.png", "notification@3x" : "unpackage/res/icons/60x60.png",
"settings@2x": "unpackage/res/icons/58x58.png", "settings@2x" : "unpackage/res/icons/58x58.png",
"settings@3x": "unpackage/res/icons/87x87.png", "settings@3x" : "unpackage/res/icons/87x87.png",
"spotlight@2x": "unpackage/res/icons/80x80.png", "spotlight@2x" : "unpackage/res/icons/80x80.png",
"spotlight@3x": "unpackage/res/icons/120x120.png" "spotlight@3x" : "unpackage/res/icons/120x120.png"
} }
} }
} }
}, },
"uniStatistics": { "uniStatistics" : {
"enable": false "enable" : false
}, },
"nativePlugins": {} "nativePlugins" : {}
}, },
"quickapp": {}, "quickapp" : {},
"mp-weixin": { "mp-weixin" : {
"appid": "wx52ca113738fb0f64", "appid" : "wx71a45919045c7e19",
"setting": { "setting" : {
"urlCheck": false, "urlCheck" : false,
"minified": true, "minified" : true,
"es6": true "es6" : true
}, },
"usingComponents": true, "usingComponents" : true,
"uniStatistics": { "uniStatistics" : {
"enable": false "enable" : false
}, },
"optimization": { "optimization" : {
"subPackages": true "subPackages" : true
}, },
"permission": { "permission" : {
"scope.userLocation": { "scope.userLocation" : {
"desc": "便于您使用该功能获取当前位置天气情况、WIFI列表等场景。" "desc" : "便于您使用该功能获取当前位置天气情况、WIFI列表等场景。"
} }
}, },
"requiredPrivateInfos": ["getLocation"], "requiredPrivateInfos" : [ "getLocation" ],
"lazyCodeLoading": "requiredComponents" "lazyCodeLoading" : "requiredComponents"
}, },
"mp-alipay": { "mp-alipay" : {
"usingComponents": true "usingComponents" : true
}, },
"mp-baidu": { "mp-baidu" : {
"usingComponents": true "usingComponents" : true
}, },
"mp-toutiao": { "mp-toutiao" : {
"usingComponents": true "usingComponents" : true
}, },
"uniStatistics": { "uniStatistics" : {
"enable": false "enable" : false
}, },
"h5": { "h5" : {
"title": "蜂信物联", "title" : "蜂信物联",
"router": { "router" : {
"mode": "hash", "mode" : "hash",
"base": "./" "base" : "./"
}, },
"devServer": { "devServer" : {
// "disableHostCheck": true, // 访host // "disableHostCheck": true, // 访host
"port": 8090 "port" : 8090
}, },
"optimization": { "optimization" : {
"treeShaking": { "treeShaking" : {
"enable": false "enable" : false
} }
}, },
"template": "uni_modules/jessibuca/hybrid/index.html", "template" : "uni_modules/jessibuca/hybrid/index.html",
"sdkConfigs": { "sdkConfigs" : {
"maps": { "maps" : {
"qqmap": { "qqmap" : {
"key": "4PDBZ-4KQKU-AX6VO-GU7NB-INDZJ-YBFXC" "key" : "4PDBZ-4KQKU-AX6VO-GU7NB-INDZJ-YBFXC"
} }
} }
} }

View File

@ -2,7 +2,6 @@
export {}; export {};
; declare global { ; declare global {
const __VLS_intrinsicElements: __VLS_IntrinsicElements;
const __VLS_directiveBindingRestFields: { instance: null, oldValue: null, modifiers: any, dir: any }; const __VLS_directiveBindingRestFields: { instance: null, oldValue: null, modifiers: any, dir: any };
const __VLS_unref: typeof import('vue').unref; const __VLS_unref: typeof import('vue').unref;
const __VLS_placeholder: any; const __VLS_placeholder: any;
@ -24,10 +23,31 @@ export {};
N2 extends keyof __VLS_GlobalComponents ? N2 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N2] } : N2 extends keyof __VLS_GlobalComponents ? N2 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N2] } :
N3 extends keyof __VLS_GlobalComponents ? N3 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N3] } : N3 extends keyof __VLS_GlobalComponents ? N3 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N3] } :
{ [K in N0]: unknown }; { [K in N0]: unknown };
type __VLS_FunctionalComponentProps<T, K> = type __VLS_FunctionalComponentCtx<T, K> = __VLS_PickNotAny<'__ctx' extends keyof __VLS_PickNotAny<K, {}>
'__ctx' extends keyof __VLS_PickNotAny<K, {}> ? K extends { __ctx?: { props?: infer P } } ? NonNullable<P> : never ? K extends { __ctx?: infer Ctx } ? NonNullable<Ctx> : never : any
: T extends (props: infer P, ...args: any) => any ? P : , T extends (props: any, ctx: infer Ctx) => any ? Ctx : any
{}; >;
type __VLS_FunctionalComponentProps<T, K> = '__ctx' extends keyof __VLS_PickNotAny<K, {}>
? K extends { __ctx?: { props?: infer P } } ? NonNullable<P> : never
: T extends (props: infer P, ...args: any) => any ? P
: {};
type __VLS_FunctionalComponent<T> = (props: (T extends { $props: infer Props } ? Props : {}) & Record<string, unknown>, ctx?: any) => __VLS_Element & {
__ctx?: {
attrs?: any,
slots?: T extends { $slots: infer Slots } ? Slots : Record<string, any>,
emit?: T extends { $emit: infer Emit } ? Emit : {},
props?: (T extends { $props: infer Props } ? Props : {}) & Record<string, unknown>,
expose?: (exposed: T) => void,
}
};
type __VLS_NormalizeSlotReturns<S, R = NonNullable<S> extends (...args: any) => infer K ? K : any> = R extends any[] ? {
[K in keyof R]: R[K] extends infer V
? V extends Element ? V
: V extends new (...args: any) => infer R ? ReturnType<__VLS_FunctionalComponent<R>>
: V extends (...args: any) => infer R ? R
: any
: never
} : R;
type __VLS_IsFunction<T, K> = K extends keyof T type __VLS_IsFunction<T, K> = K extends keyof T
? __VLS_IsAny<T[K]> extends false ? __VLS_IsAny<T[K]> extends false
? unknown extends T[K] ? unknown extends T[K]
@ -35,13 +55,13 @@ export {};
: true : true
: false : false
: false; : false;
type __VLS_NormalizeComponentEvent<Props, Events, onEvent extends keyof Props, Event extends keyof Events, CamelizedEvent extends keyof Events> = ( type __VLS_NormalizeComponentEvent<Props, Emits, onEvent extends keyof Props, Event extends keyof Emits, CamelizedEvent extends keyof Emits> = (
__VLS_IsFunction<Props, onEvent> extends true __VLS_IsFunction<Props, onEvent> extends true
? Props ? Props
: __VLS_IsFunction<Events, Event> extends true : __VLS_IsFunction<Emits, Event> extends true
? { [K in onEvent]?: Events[Event] } ? { [K in onEvent]?: Emits[Event] }
: __VLS_IsFunction<Events, CamelizedEvent> extends true : __VLS_IsFunction<Emits, CamelizedEvent> extends true
? { [K in onEvent]?: Events[CamelizedEvent] } ? { [K in onEvent]?: Emits[CamelizedEvent] }
: Props : Props
) & Record<string, unknown>; ) & Record<string, unknown>;
// fix https://github.com/vuejs/language-tools/issues/926 // fix https://github.com/vuejs/language-tools/issues/926
@ -67,11 +87,16 @@ export {};
} }
> >
>; >;
type __VLS_PrettifyGlobal<T> = { [K in keyof T]: T[K]; } & {}; type __VLS_ResolveEmits<
type __VLS_PickFunctionalComponentCtx<T, K> = NonNullable<__VLS_PickNotAny< Comp,
'__ctx' extends keyof __VLS_PickNotAny<K, {}> ? K extends { __ctx?: infer Ctx } ? Ctx : never : any Emits,
, T extends (props: any, ctx: infer Ctx) => any ? Ctx : any TypeEmits = Comp extends { __typeEmits?: infer T } ? unknown extends T ? {} : import('vue').ShortEmitsToObject<T> : {},
>>; NormalizedEmits = __VLS_NormalizeEmits<Emits> extends infer E ? string extends keyof E ? {} : E : never,
> = __VLS_SpreadMerge<NormalizedEmits, TypeEmits>;
type __VLS_ResolveDirectives<T> = {
[K in Exclude<keyof T, keyof __VLS_GlobalDirectives> & string as `v${Capitalize<K>}`]: T[K];
};
type __VLS_PrettifyGlobal<T> = { [K in keyof T as K]: T[K]; } & {};
type __VLS_UseTemplateRef<T> = Readonly<import('vue').ShallowRef<T | null>>; type __VLS_UseTemplateRef<T> = Readonly<import('vue').ShallowRef<T | null>>;
function __VLS_getVForSourceType<T extends number | string | any[] | Iterable<any>>(source: T): [ function __VLS_getVForSourceType<T extends number | string | any[] | Iterable<any>>(source: T): [
@ -87,10 +112,8 @@ export {};
key: keyof T, key: keyof T,
index: number, index: number,
][]; ][];
// @ts-ignore function __VLS_getSlotParameters<S, D extends S>(slot: S, decl?: D):
function __VLS_getSlotParams<T>(slot: T): Parameters<__VLS_PickNotAny<NonNullable<T>, (...args: any[]) => any>>; __VLS_PickNotAny<NonNullable<D>, (...args: any) => any> extends (...args: infer P) => any ? P : any[];
// @ts-ignore
function __VLS_getSlotParam<T>(slot: T): Parameters<__VLS_PickNotAny<NonNullable<T>, (...args: any[]) => any>>[0];
function __VLS_asFunctionalDirective<T>(dir: T): T extends import('vue').ObjectDirective function __VLS_asFunctionalDirective<T>(dir: T): T extends import('vue').ObjectDirective
? NonNullable<T['created' | 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated' | 'beforeUnmount' | 'unmounted']> ? NonNullable<T['created' | 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated' | 'beforeUnmount' | 'unmounted']>
: T extends (...args: any) => any : T extends (...args: any) => any
@ -98,19 +121,10 @@ export {};
: (arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown) => void; : (arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown) => void;
function __VLS_makeOptional<T>(t: T): { [K in keyof T]?: T[K] }; function __VLS_makeOptional<T>(t: T): { [K in keyof T]?: T[K] };
function __VLS_asFunctionalComponent<T, K = T extends new (...args: any) => any ? InstanceType<T> : unknown>(t: T, instance?: K): function __VLS_asFunctionalComponent<T, K = T extends new (...args: any) => any ? InstanceType<T> : unknown>(t: T, instance?: K):
T extends new (...args: any) => any T extends new (...args: any) => any ? __VLS_FunctionalComponent<K>
? (props: (K extends { $props: infer Props } ? Props : any) & Record<string, unknown>, ctx?: any) => __VLS_Element & {
__ctx?: {
attrs?: any;
slots?: K extends { $slots: infer Slots } ? Slots : any;
emit?: K extends { $emit: infer Emit } ? Emit : any;
expose?(exposed: K): void;
props?: (K extends { $props: infer Props } ? Props : any) & Record<string, unknown>;
}
}
: T extends () => any ? (props: {}, ctx?: any) => ReturnType<T> : T extends () => any ? (props: {}, ctx?: any) => ReturnType<T>
: T extends (...args: any) => any ? T : T extends (...args: any) => any ? T
: (_: {} & Record<string, unknown>, ctx?: any) => { __ctx?: { attrs?: any, expose?: any, slots?: any, emit?: any, props?: {} & Record<string, unknown> } }; : __VLS_FunctionalComponent<{}>;
function __VLS_functionalComponentArgsRest<T extends (...args: any) => any>(t: T): 2 extends Parameters<T>['length'] ? [any] : []; function __VLS_functionalComponentArgsRest<T extends (...args: any) => any>(t: T): 2 extends Parameters<T>['length'] ? [any] : [];
function __VLS_asFunctionalElement<T>(tag: T, endTag?: T): (attrs: T & Record<string, unknown>) => void; function __VLS_asFunctionalElement<T>(tag: T, endTag?: T): (attrs: T & Record<string, unknown>) => void;
function __VLS_asFunctionalSlot<S>(slot: S): S extends () => infer R ? (props: {}) => R : NonNullable<S>; function __VLS_asFunctionalSlot<S>(slot: S): S extends () => infer R ? (props: {}) => R : NonNullable<S>;

View File

@ -320,7 +320,7 @@
} }
}, },
{ {
"path": "/home/device/status/addProgram", "path": "home/device/status/addProgram",
"style": { "style": {
"navigationBarTitleText": "添加节目" "navigationBarTitleText": "添加节目"
} }

View File

@ -8,7 +8,7 @@
</view> </view>
<view class="register" @click="handleRegister()" v-if="formIndex===0">{{$tt('register.registration')}} <view class="register" @click="handleRegister()" v-if="formIndex===0">{{$tt('register.registration')}}
</view> </view>
<image class="img" src="https://iot-xcwl.cn/doc/photo/logo.jpg" mode="widthFix"></image> <image class="img" src="https://xaznkj.cn/doc/photo/logo.jpg" mode="widthFix"></image>
</view> </view>
<view class="main-wrap"> <view class="main-wrap">
<view v-if="formIndex==0"> <view v-if="formIndex==0">
@ -152,7 +152,7 @@
<view class="one-click-login-pop-wrap"> <view class="one-click-login-pop-wrap">
<u-popup :show="isShowPop" mode="bottom" :round="10" closeable="true" @close="isShowPop = false"> <u-popup :show="isShowPop" mode="bottom" :round="10" closeable="true" @close="isShowPop = false">
<view class="content-wrap"> <view class="content-wrap">
<u--image :showLoading="true" src="https://iot-xcwl.cn/app/fastbee1_blue.png" width="260rpx" <u--image :showLoading="true" src="https://xaznkj.cn/app/fastbee1_blue.png" width="260rpx"
height="90rpx" customStyle="float:left"></u--image> height="90rpx" customStyle="float:left"></u--image>
<text class="title">{{$tt("login.welcomeToLogin")}}</text> <text class="title">{{$tt("login.welcomeToLogin")}}</text>
<view class="btn-login"> <view class="btn-login">

View File

@ -86,7 +86,7 @@
<u-loadmore :status="loadmoreStatus" v-if="total > queryParams.pageSize" marginTop="20" /> <u-loadmore :status="loadmoreStatus" v-if="total > queryParams.pageSize" marginTop="20" />
</scroll-view> </scroll-view>
</view> </view>
<u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="iot-xcwl.cn"></u-loading-page> <u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="xaznkj.cn"></u-loading-page>
</view> </view>
</template> </template>

View File

@ -203,7 +203,7 @@
<u-modal :show="modal.show" :content="modal.content" @confirm="confirm" @cancel="cancel" <u-modal :show="modal.show" :content="modal.content" @confirm="confirm" @cancel="cancel"
:showConfirmButton="modal.showConfirmButton" showCancelButton></u-modal> :showConfirmButton="modal.showConfirmButton" showCancelButton></u-modal>
<u-loading-page style="z-index: 98" :loading="loading" bg-color="#eef3f7" <u-loading-page style="z-index: 98" :loading="loading" bg-color="#eef3f7"
loadingText="iot-xcwl.cn"></u-loading-page> loadingText="xaznkj.cn"></u-loading-page>
<u-modal :show="openAlert" :content="$tt('home.content')" @confirm="gotoLogin" <u-modal :show="openAlert" :content="$tt('home.content')" @confirm="gotoLogin"
@cancel="() => openAlert = false" showCancelButton></u-modal> @cancel="() => openAlert = false" showCancelButton></u-modal>
</view> </view>

View File

@ -4,7 +4,7 @@
<view class="navbar h5"> <view class="navbar h5">
<view class="navbar-left" @click="toggleSearchMode"> <view class="navbar-left" @click="toggleSearchMode">
<view v-if="!isSearching" class="logo"> <view v-if="!isSearching" class="logo">
<image src="https://iot-xcwl.cn/doc/photo/750.png" mode="widthFix" style="width: 260rpx;"> <image src="https://xaznkj.cn/doc/photo/750.png" mode="widthFix" style="width: 260rpx;">
</image> </image>
</view> </view>
<view v-else class="icon"></view> <view v-else class="icon"></view>
@ -25,7 +25,7 @@
<view class="navbar weixin"> <view class="navbar weixin">
<view class="navbar-left" @click="toggleSearchMode"> <view class="navbar-left" @click="toggleSearchMode">
<view v-if="!isSearching" class="logo"> <view v-if="!isSearching" class="logo">
<image src="https://iot-xcwl.cn/doc/photo/750.png" mode="widthFix" style="width: 260rpx;"> <image src="https://xaznkj.cn/doc/photo/750.png" mode="widthFix" style="width: 260rpx;">
</image> </image>
</view> </view>
<view v-else class="icon"></view> <view v-else class="icon"></view>
@ -50,7 +50,7 @@
<view class="navbar app"> <view class="navbar app">
<view class="navbar-left" @click="toggleSearchMode"> <view class="navbar-left" @click="toggleSearchMode">
<view v-if="!isSearching" class="logo"> <view v-if="!isSearching" class="logo">
<image src="https://iot-xcwl.cn/doc/photo/750.png" mode="widthFix" style="width: 260rpx;"> <image src="https://xaznkj.cn/doc/photo/750.png" mode="widthFix" style="width: 260rpx;">
</image> </image>
</view> </view>
<view v-else class="icon"></view> <view v-else class="icon"></view>
@ -179,7 +179,7 @@
width: 70rpx; width: 70rpx;
height: 70rpx; height: 70rpx;
margin-left: 6px; margin-left: 6px;
background-image: url('https://iot-xcwl.cn/doc/photo/logo.png'); background-image: url('https://xaznkj.cn/doc/photo/logo.png');
background-size: cover; background-size: cover;
filter: drop-shadow(0 2rpx 4rpx rgba(0, 0, 0, 0.2)); filter: drop-shadow(0 2rpx 4rpx rgba(0, 0, 0, 0.2));
animation: scaleUp 0.5s ease; animation: scaleUp 0.5s ease;

View File

@ -46,7 +46,7 @@
</view> </view>
</view> </view>
<u-empty mode="data" :show="listSwiper.length === 0 && list.length === 0" marginTop="30"></u-empty> <u-empty mode="data" :show="listSwiper.length === 0 && list.length === 0" marginTop="30"></u-empty>
<u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="iot-xcwl.cn"></u-loading-page> <u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="xaznkj.cn"></u-loading-page>
</view> </view>
</view> </view>
</template> </template>

View File

@ -193,6 +193,19 @@
<script> <script>
export default { export default {
name: 'AddProgram',
onLoad() {
//
const device = uni.getStorageSync('currentDevice');
const deviceInfo = uni.getStorageSync('currentDeviceInfo');
if (device) {
this.device = device;
}
if (deviceInfo) {
this.deviceInfo = deviceInfo;
}
},
onReady() { onReady() {
this.$nextTick(() => { this.$nextTick(() => {
this.initializeAnimations(); this.initializeAnimations();
@ -210,6 +223,8 @@
}, },
data() { data() {
return { return {
device: null,
deviceInfo: null,
screenWidth: 32, screenWidth: 32,
screenHeight: 64, screenHeight: 64,
// picker // picker
@ -229,8 +244,10 @@
showStayTimePicker: false, showStayTimePicker: false,
// //
playTypes: ['文字', '图片'], playTypes: ['文字', '图片'],
modes: ['模式1', '模式2(上下)', '模式3(左右)', '模式4(上中下)', '模式5', '模式6'], modes: ['模式1', '模式2(上下)', '模式3(左右)', '模式1114(上中下)', '模式5', '模式6'],
commonPhrases: ['自定义', "公安交警正在巡逻", commonPhrases: [
'自定义',
"公安交警正在巡逻",
"公安交警停车检查", "公安交警停车检查",
"前方事故减速慢行", "前方事故减速慢行",
"警察临检请您配合", "警察临检请您配合",
@ -249,7 +266,7 @@
], ],
fonts: ['宋体(中)', '黑体(中)', '楷体(中)'], fonts: ['宋体(中)', '黑体(中)', '楷体(中)'],
fontShapes: ['圆角(英)', '直角(英)'], fontShapes: ['圆角(英)', '直角(英)'],
fontSizes: ['16px', '24px', '32px'], fontSizes: ['16px', '24px', '32px', '48px', '64px'],
fontColors: ['红色', '绿色', '蓝色'], fontColors: ['红色', '绿色', '蓝色'],
fontBold: ['不加粗', '加粗'], fontBold: ['不加粗', '加粗'],
fontStretch: ['不拉伸', '横向拉伸', '纵向拉伸'], fontStretch: ['不拉伸', '横向拉伸', '纵向拉伸'],
@ -799,7 +816,20 @@
this.$u.toast('读取功能待实现'); this.$u.toast('读取功能待实现');
}, },
onSet() { onSet() {
this.$u.toast('设置功能待实现'); //
const programData = {
form: this.form,
device: this.device,
deviceInfo: this.deviceInfo
};
//
uni.$emit('programDataReady', programData);
this.$u.toast('设置成功');
//
uni.navigateBack();
}, },
mapFont(index) { mapFont(index) {
return ['SimSun', 'SimHei', 'KaiTi'][index] || 'SimSun'; return ['SimSun', 'SimHei', 'KaiTi'][index] || 'SimSun';

View File

@ -1,6 +1,6 @@
<template> <template>
<view class="container"> <view class="container">
<u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="iot-xcwl.cn"></u-loading-page> <u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="xaznkj.cn"></u-loading-page>
<view class="card" v-show="!loading"> <view class="card" v-show="!loading">
<view class="status-title">{{title}}</view> <view class="status-title">{{title}}</view>
<view style="padding:20rpx;"> <view style="padding:20rpx;">

View File

@ -26,7 +26,7 @@
<!-- 音量控制 --> <!-- 音量控制 -->
<view class="volume-slider"> <view class="volume-slider">
<view class="volume-icon"> <view class="volume-icon">
<image src="https://iot-xcwl.cn/doc/photo/brightness.png" mode="aspectFit" class="volume-svg"> <image src="https://xaznkj.cn/doc/photo/brightness.png" mode="aspectFit" class="volume-svg">
</image> </image>
</view> </view>
<view class="slider-container"> <view class="slider-container">
@ -106,7 +106,7 @@
<view class="card audio-list"> <view class="card audio-list">
<view class="section-title"> <view class="section-title">
<text>节目列表</text> <text>节目列表</text>
<image src="https://iot-xcwl.cn/doc/photo/add.svg" mode="aspectFit" class="add-icon" <image src="https://xaznkj.cn/doc/photo/add.svg" mode="aspectFit" class="add-icon"
@click="showAddAudioModal"></image> @click="showAddAudioModal"></image>
</view> </view>
<view class="list-container"> <view class="list-container">
@ -127,7 +127,7 @@
</view> </view>
<!-- 虚拟遥控器 --> <!-- 虚拟遥控器 -->
<view class="card default-list"> <!-- <view class="card default-list">
<view class="section-title"> <view class="section-title">
<text>虚拟遥控器</text> <text>虚拟遥控器</text>
</view> </view>
@ -146,7 +146,7 @@
</view> </view>
</view> </view>
</view> </view>
</view> </view> -->
<!-- 开机参数 --> <!-- 开机参数 -->
<view class="card remote-talk"> <view class="card remote-talk">
@ -169,11 +169,11 @@
</template> </template>
<script> <script>
import { import {
serviceInvoke serviceInvoke
} from '@/apis/modules/runtime.js'; } from '@/apis/modules/runtime.js';
export default { export default {
name: 'VoiceControl', name: 'VoiceControl',
props: { props: {
device: { device: {
@ -235,8 +235,7 @@ export default {
template: false, template: false,
screenRotate: false screenRotate: false
}, },
templateColumns: [ templateColumns: [{
{
label: '自定义', label: '自定义',
value: '1' value: '1'
}, },
@ -253,8 +252,7 @@ export default {
value: '4' value: '4'
} }
], ],
screenRotateOptions: [ screenRotateOptions: [{
{
label: '0°', label: '0°',
value: '0' value: '0'
}, },
@ -281,12 +279,17 @@ export default {
this.mqttCallback(); this.mqttCallback();
this.recorderManager = uni.getRecorderManager(); this.recorderManager = uni.getRecorderManager();
this.updateBasicSettings(); this.updateBasicSettings();
//
uni.$on('programDataReady', this.handleProgramData);
}, },
beforeDestroy() { beforeDestroy() {
if (this.recordingTimer) { if (this.recordingTimer) {
clearInterval(this.recordingTimer); clearInterval(this.recordingTimer);
this.recordingTimer = null; this.recordingTimer = null;
} }
//
uni.$off('programDataReady', this.handleProgramData);
}, },
methods: { methods: {
showPicker(type) { showPicker(type) {
@ -484,6 +487,10 @@ export default {
} }
}, },
showAddAudioModal() { showAddAudioModal() {
// addProgram 使
uni.setStorageSync('currentDevice', this.device);
uni.setStorageSync('currentDeviceInfo', this.deviceInfo);
uni.navigateTo({ uni.navigateTo({
url: '/pagesA/home/device/status/addProgram' url: '/pagesA/home/device/status/addProgram'
}); });
@ -999,6 +1006,95 @@ export default {
// this.pickerShow[type] = true; // this.pickerShow[type] = true;
// console.log('pickerShow.' + type + ' =', this.pickerShow[type]); // console.log('pickerShow.' + type + ' =', this.pickerShow[type]);
// }, // },
// addProgram
async handleProgramData(data) {
try {
console.log('收到节目数据:', data);
console.log('设备模型列表:', this.device.thingsModels);
// 线
if (!this.checkOnline()) return;
// ID
//
// 1
const displayParamsModel = this.device.thingsModels.find(model =>
model.id === 'displayParams' || model.id === '103#displayParams'
);
if (displayParamsModel) {
const displayData = {
mode: data.form.mode,
duration: parseInt(data.form.duration) || 10,
zones: data.form.zones.map(zone => ({
playType: zone.playType,
displayText: zone.displayText,
font: zone.font,
fontSize: zone.fontSize,
fontColor: zone.fontColor,
effect: zone.effect,
speed: zone.speed,
stayTime: zone.stayTime,
hAlign: zone.hAlign,
vAlign: zone.vAlign,
x: parseInt(zone.x) || 0,
y: parseInt(zone.y) || 0,
width: parseInt(zone.width) || 32,
height: parseInt(zone.height) || 64
}))
};
displayParamsModel.shadow = JSON.stringify(displayData);
await this.mqttPublish(this.device, displayParamsModel);
}
// 2
const programModel = this.device.thingsModels.find(model =>
model.id === 'program' || model.id === '103#program'
);
if (programModel) {
programModel.shadow = JSON.stringify(data.form);
await this.mqttPublish(this.device, programModel);
}
// 3
const screenParamsModel = this.device.thingsModels.find(model =>
model.id === 'screenParams' || model.id === '103#screenParams'
);
if (screenParamsModel) {
const screenData = {
template: this.screenParams.template,
screenRotate: this.screenParams.screenRotate,
oePolarity: this.screenParams.oePolarity,
dataPolarity: this.screenParams.dataPolarity,
width: this.screenParams.width,
height: this.screenParams.height,
program: data.form
};
screenParamsModel.shadow = JSON.stringify(screenData);
await this.mqttPublish(this.device, screenParamsModel);
}
uni.showToast({
title: '节目设置成功',
icon: 'success'
});
//
this.updateBasicSettings();
} catch (error) {
console.error('处理节目数据失败:', error);
uni.showToast({
title: '设置失败: ' + error.message,
icon: 'none'
});
}
},
}, },
computed: { computed: {
startTimeLabel() { startTimeLabel() {
@ -1011,11 +1107,11 @@ export default {
return this.audioIndex >= 0 ? this.audioList[this.audioIndex].name : ''; return this.audioIndex >= 0 ? this.audioList[this.audioIndex].name : '';
} }
} }
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.status-titletop { .status-titletop {
font-weight: bold; font-weight: bold;
font-size: 15px; font-size: 15px;
color: #333333; color: #333333;
@ -1024,9 +1120,9 @@ export default {
padding: 15rpx 28rpx; padding: 15rpx 28rpx;
background-color: #eef6ff; background-color: #eef6ff;
border-bottom: 1rpx solid #dceaff; border-bottom: 1rpx solid #dceaff;
} }
.voice-control { .voice-control {
padding: 24rpx; padding: 24rpx;
background-color: #f5f7fa; background-color: #f5f7fa;
min-height: 100vh; min-height: 100vh;
@ -1402,5 +1498,5 @@ export default {
padding: 20rpx; padding: 20rpx;
} }
} }
} }
</style> </style>

View File

@ -7,10 +7,10 @@
<u--form labelPosition="left" labelWidth="100" <u--form labelPosition="left" labelWidth="100"
:labelStyle="{ marginRight: '16px', lineHeight: '32px', width: '50px', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', color: '#000000' }"> :labelStyle="{ marginRight: '16px', lineHeight: '32px', width: '50px', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', color: '#000000' }">
<view class="version-wrap"> <view class="version-wrap">
<u-form-item :label="$tt('status.deviceVersion') || '设备版本'"> <u-form-item :label="$tt('status.deviceVersion')">
<u-row> <u-row>
<u-col span="8"> <u-col span="8">
<u--text :text="'Version' + (device.firmwareVersion || '')"></u--text> <u--text :text="'Version ' + device.firmwareVersion"></u--text>
</u-col> </u-col>
</u-row> </u-row>
</u-form-item> </u-form-item>
@ -19,270 +19,302 @@
</view> </view>
</view> </view>
<!-- Webview容器 --> <!-- 网关信息卡片 -->
<view class="webview-container"> <view class="card gateway-info">
<!-- #ifdef APP-PLUS --> <view class="section-title">网关信息</view>
<web-view :src="fullUrl" @message="handleWebviewMessage" ref="webview"></web-view> <view class="info-content">
<!-- #endif --> <view class="info-grid">
<view class="info-item">
<text class="info-label">设备名称</text>
<text class="info-value">{{ device.deviceName || '未命名' }}</text>
</view>
<view class="info-item">
<text class="info-label">设备ID</text>
<text class="info-value">{{ device.deviceId || '未知' }}</text>
</view>
<view class="info-item">
<text class="info-label">序列号</text>
<text class="info-value">{{ device.serialNumber || '未知' }}</text>
</view>
<view class="info-item">
<text class="info-label">产品ID</text>
<text class="info-value">{{ device.productId || '未知' }}</text>
</view>
</view>
</view>
</view>
<!-- #ifdef H5 --> <!-- 子设备分段控制器 -->
<iframe :src="fullUrl" frameborder="0" class="h5-iframe" @load="iframeLoaded"></iframe> <view class="subsection-container">
<!-- #endif --> <view class="subsection-header">
<text class="subsection-title">子设备管理</text>
<view class="subdevice-status">
<view class="status-item">
<view class="status-dot online"></view>
<text>声卡在线</text>
</view>
<view class="status-item">
<view class="status-dot online"></view>
<text>显卡在线</text>
</view>
</view>
</view>
<u-subsection
:list="subsectionList"
:current="currentSubsection"
@change="onSubsectionChange"
activeColor="#2979ff"
inactiveColor="#666"
:fontSize="28"
:height="80"
:bold="true"
:styleType="'button'"
></u-subsection>
</view>
<!-- #ifdef MP-WEIXIN --> <!-- 子设备内容区域 -->
<web-view id="wxWebview" :src="fullUrl" @message="handleWebviewMessage" @load="wxWebviewLoaded" <view class="subdevice-content">
@error="wxWebviewError"></web-view> <!-- 声卡子设备 -->
<!-- #endif --> <view v-if="currentSubsection === 0" class="subdevice-panel">
<voice-control :device="device"></voice-control>
</view>
<!-- 显卡子设备 -->
<view v-if="currentSubsection === 1" class="subdevice-panel">
<display-control :device="device"></display-control>
</view>
</view> </view>
</view> </view>
</template> </template>
<script> <script>
export default { import VoiceControl from './voice.vue';
name: 'gateway-control', import DisplayControl from './display.vue';
export default {
name: 'GatewayControl',
components: {
VoiceControl,
DisplayControl
},
props: { props: {
device: { device: {
type: Object, type: Object,
default: () => ({
deviceId: '',
serialNumber: '',
firmwareVersion: '',
status: 0,
isShadow: 0,
thingsModels: []
}),
required: true required: true
} }
}, },
data() { data() {
return { return {
title: '设备离线', title: '设备离线',
baseUrl: 'https://iot-xcwl.cn/h5/index.html', currentSubsection: 0,
wxWebviewReady: false subsectionList: [
{
text: '声卡',
icon: 'volume',
description: '音频控制'
},
{
text: '显卡',
icon: 'eye',
description: '显示控制'
}
],
deviceInfo: {
chartList: [],
}
}; };
}, },
computed: { watch: {
fullUrl() { device: function(newVal, oldVal) {
if (!this.device?.deviceId || !this.device?.serialNumber) { if (newVal.deviceName !== '') {
console.error('设备ID或序列号未定义', this.device); this.deviceInfo = newVal;
return this.baseUrl; this.updateDeviceStatus(this.deviceInfo);
} }
const productParamModel = this.device.thingsModels?.find(model => model.id === 'productpram');
let paramData = productParamModel?.shadow || '';
if (typeof paramData === 'string' && paramData.startsWith('JSON=')) {
paramData = paramData.substring(5);
}
const paramDataString = typeof paramData === 'string' ? paramData : JSON.stringify(paramData || {});
return `${this.baseUrl}?deviceId=${encodeURIComponent(this.device.deviceId)}&serialNumber=${encodeURIComponent(this.device.serialNumber)}&initialData=${encodeURIComponent(paramDataString)}`;
} }
}, },
mounted() { created() {
this.updateDeviceStatus(this.device); if (this.device !== null && Object.keys(this.device).length !== 0) {
this.deviceInfo = this.device;
this.updateDeviceStatus(this.deviceInfo);
};
this.mqttCallback(); this.mqttCallback();
// H5
uni.$on('h5Message', this.handleH5Message);
},
beforeDestroy() {
//
uni.$off('h5Message', this.handleH5Message);
if (this.messageListener) {
window.removeEventListener('message', this.messageListener);
}
}, },
methods: { methods: {
// webview onSubsectionChange(index) {
wxWebviewLoaded() { this.currentSubsection = index;
console.log('微信webview加载完成'); console.log('切换到子设备:', this.subsectionList[index].text);
this.wxWebviewReady = true;
this.sendInitialDataToWebview();
}, },
// webview
getWebviewComponent() {
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
return currentPage.selectComponent('#wxWebview');
},
// webview
sendInitialDataToWebview() {
const productParamModel = this.device.thingsModels?.find(model => model.id === 'productpram');
if (!productParamModel) {
console.warn('未找到 productpram 模型');
return;
}
let paramData = productParamModel.shadow || '';
if (typeof paramData === 'string' && paramData.startsWith('JSON=')) {
paramData = paramData.substring(5);
}
const paramDataString = typeof paramData === 'string' ? paramData : JSON.stringify(paramData || {});
// #ifdef MP-WEIXIN
const component = this.getWebviewComponent();
if (component) {
component.postMessage({
type: 'initialData',
data: paramDataString,
timestamp: Date.now()
});
console.log('【微信小程序】发送初始数据成功:', paramDataString);
} else {
console.error('获取 webview 组件失败');
}
// #endif
// #ifdef APP-PLUS
if (this.$refs.webview) {
this.$refs.webview.postMessage({
type: 'initialData',
data: paramDataString,
timestamp: Date.now()
});
console.log('【APP】发送初始数据成功:', paramDataString);
}
// #endif
// #ifdef H5
const iframe = document.querySelector('.h5-iframe');
if (iframe && iframe.contentWindow) {
iframe.contentWindow.postMessage({
type: 'initialData',
data: paramDataString,
timestamp: Date.now()
}, '*');
console.log('【H5】发送初始数据成功:', paramDataString);
}
// #endif
},
//
handleWebviewMessage(e) {
console.log('【小程序】收到 H5 消息:', e);
let messageData = null;
//
// #ifdef MP-WEIXIN
messageData = e.detail.data; //
// #endif
// #ifdef APP-PLUS || H5
messageData = e.data || e.detail?.data?.[0] || e.detail.data;
// #endif
if (!messageData) {
console.warn('无法解析的消息格式', e);
return;
}
//
console.log('【小程序】原始消息内容:', messageData);
// 使 uni.$emit 广
uni.$emit('h5Message', messageData);
},
// H5
handleH5Message(message) {
console.log('【uni.$on】接收到 H5 消息:', message);
if (message.type === 'mqtt_data') {
console.log('处理 mqtt_data 消息:', message.payload);
// MQTT
}
},
//
updateDeviceStatus(device) {
if (!device) {
this.title = '设备未连接';
return;
}
if (device.status === 3) {
this.title = this.$tt('status.online') || '在线';
} else {
this.title = device.isShadow === 1 ?
(this.$tt('status.shadow') || '影子模式') :
(this.$tt('status.deviceOffline') || '离线');
}
},
// MQTT
mqttCallback() { mqttCallback() {
if (!this.$mqttTool?.client) {
console.warn('MQTT客户端未初始化');
return;
}
this.$mqttTool.client.removeAllListeners('message');
this.$mqttTool.client.on('message', (topic, message, buffer) => { this.$mqttTool.client.on('message', (topic, message, buffer) => {
const topics = topic.split('/'); let topics = topic.split('/');
if (this.device.serialNumber !== topics[2]) return; let productId = topics[1];
let deviceNum = topics[2];
const msg = JSON.parse(message.toString()); message = JSON.parse(message.toString());
if (topics[3] === 'status') { if (topics[3] == 'status') {
this.device.status = msg.status; if (this.deviceInfo.serialNumber == deviceNum) {
this.device.isShadow = msg.isShadow; this.deviceInfo.status = message.status;
this.device.rssi = msg.rssi; this.deviceInfo.isShadow = message.isShadow;
this.updateDeviceStatus(this.device); this.deviceInfo.rssi = message.rssi;
this.updateDeviceStatus(this.deviceInfo);
}
} }
}); });
},
updateDeviceStatus(device) {
if (device.status === 3) {
this.title = this.$tt('status.online');
} else {
this.title = device.isShadow === 1 ? this.$tt('status.shadow') : this.$tt('status.deviceOffline');
} }
} }
}; }
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/* 保持原有样式不变 */ .gateway-container {
.gateway-container { padding: 24rpx;
padding: 20rpx; background-color: #f5f7fa;
height: 100%; min-height: 100vh;
display: flex; font-family: 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
flex-direction: column;
.card { .card {
background-color: #fff; background-color: #fff;
border-radius: 20rpx; border-radius: 16rpx;
margin-bottom: 20rpx; margin-bottom: 24rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
}
.webview-container {
flex: 1;
height: 0;
overflow: hidden; overflow: hidden;
border-radius: 20rpx; transition: all 0.3s ease;
background-color: #fff;
.h5-iframe { &:hover {
width: 100%; box-shadow: 0 6rpx 16rpx rgba(0, 0, 0, 0.1);
height: 600px;
} }
} }
.status-titletop { .status-titletop {
font-weight: bold; font-weight: bold;
font-size: 32rpx; font-size: 15px;
color: #333333; color: #333333;
line-height: 42rpx; line-height: 42rpx;
text-align: left; text-align: left;
padding: 15rpx 28rpx; padding: 15rpx 28rpx;
background-color: #eef6ff;
border-bottom: 1rpx solid #dceaff;
} }
.version-wrap { .version-wrap {
background-color: #F7F7F7; background-color: #F7F7F7;
border-radius: 10rpx; border-radius: 10rpx;
padding: 0 42rpx; padding: 0 42rpx;
font-size: 28rpx; font-size: 24rpx;
color: #000000; color: #000000;
line-height: 42rpx; line-height: 42rpx;
} }
.subsection-container {
background-color: #fff;
border-radius: 16rpx;
margin-bottom: 24rpx;
padding: 20rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
.subsection-header {
margin-bottom: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
.subsection-title {
font-size: 32rpx;
font-weight: 600;
color: #333;
} }
.subdevice-status {
display: flex;
gap: 20rpx;
.status-item {
display: flex;
align-items: center;
gap: 8rpx;
.status-dot {
width: 12rpx;
height: 12rpx;
border-radius: 50%;
&.online {
background-color: #52c41a;
box-shadow: 0 0 8rpx rgba(82, 196, 26, 0.4);
}
&.offline {
background-color: #ff4d4f;
box-shadow: 0 0 8rpx rgba(255, 77, 79, 0.4);
}
}
text {
font-size: 24rpx;
color: #666;
}
}
}
}
}
.subdevice-content {
.subdevice-panel {
background-color: #fff;
border-radius: 16rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
overflow: hidden;
}
}
.gateway-info {
background-color: #fff;
border-radius: 16rpx;
margin-bottom: 24rpx;
padding: 20rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
.section-title {
font-size: 32rpx;
font-weight: 600;
color: #333;
padding: 24rpx 24rpx 16rpx;
border-bottom: 1rpx solid #f0f2f5;
}
.info-content {
padding: 24rpx;
.info-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20rpx;
.info-item {
display: flex;
flex-direction: column;
gap: 8rpx;
.info-label {
font-size: 26rpx;
color: #666;
font-weight: 500;
}
.info-value {
font-size: 28rpx;
color: #333;
font-weight: 600;
}
}
}
}
}
}
</style> </style>

View File

@ -64,7 +64,7 @@
this.isSubDev = newVal.subDeviceList && newVal.subDeviceList.length > 0; this.isSubDev = newVal.subDeviceList && newVal.subDeviceList.length > 0;
this.isRelayProduct = newVal.productName === '多路控制器'; this.isRelayProduct = newVal.productName === '多路控制器';
this.isVoiceProduct = newVal.productName === '声卡'; this.isVoiceProduct = newVal.productName === '声卡';
this.isGatewayProduct = newVal.productName === '网关卡兼容'; this.isGatewayProduct = newVal.productName === '网关';
this.isdisplay = newVal.productName === '显卡设置'; this.isdisplay = newVal.productName === '显卡设置';
@ -92,8 +92,7 @@
this.isRelayProduct = this.device.productName === '继电器测试'; this.isRelayProduct = this.device.productName === '继电器测试';
this.isVoiceProduct = this.device.productName === '声卡'; this.isVoiceProduct = this.device.productName === '声卡';
this.isGatewayProduct = this.device.productName === '网关卡兼容'; this.isGatewayProduct = this.device.productName === '网关卡兼容';
this.isdisplay = newVal.productName === '显卡设置'; this.isdisplay = this.device.productName === '显卡设置';
console.log("create的数据", JSON.stringify(this.deviceInfo)) console.log("create的数据", JSON.stringify(this.deviceInfo))
}, },

View File

@ -137,7 +137,7 @@
</u--form> </u--form>
</view> </view>
</u-popup> </u-popup>
<u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="iot-xcwl.cn"></u-loading-page> <u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="xaznkj.cn"></u-loading-page>
</view> </view>
</view> </view>
</template> </template>

View File

@ -26,7 +26,7 @@
<!-- 音量控制 --> <!-- 音量控制 -->
<view class="volume-slider"> <view class="volume-slider">
<view class="volume-icon"> <view class="volume-icon">
<image src="https://iot-xcwl.cn/doc/photo/voice.svg" mode="aspectFit" class="volume-svg"> <image src="https://xaznkj.cn/doc/photo/voice.svg" mode="aspectFit" class="volume-svg">
</image> </image>
</view> </view>
<view class="slider-container"> <view class="slider-container">
@ -56,7 +56,7 @@
<view class="card audio-list"> <view class="card audio-list">
<view class="section-title"> <view class="section-title">
<text>音频列表</text> <text>音频列表</text>
<image src="https://iot-xcwl.cn/doc/photo/add.svg" mode="aspectFit" class="add-icon" <image src="https://xaznkj.cn/doc/photo/add.svg" mode="aspectFit" class="add-icon"
@click="showAddAudioModal"></image> @click="showAddAudioModal"></image>
</view> </view>
<view class="list-container"> <view class="list-container">
@ -81,7 +81,7 @@
<view class="card default-list"> <view class="card default-list">
<view class="section-title"> <view class="section-title">
<text>播放列表</text> <text>播放列表</text>
<image src="https://iot-xcwl.cn/doc/photo/add.svg" mode="aspectFit" class="add-icon" <image src="https://xaznkj.cn/doc/photo/add.svg" mode="aspectFit" class="add-icon"
@click="showAddDefaultModal"></image> @click="showAddDefaultModal"></image>
</view> </view>
<view class="list-container"> <view class="list-container">
@ -118,7 +118,7 @@
<view class="recorder-status"> <view class="recorder-status">
<view class="status-indicator" :class="{ recording: isRecording }"> <view class="status-indicator" :class="{ recording: isRecording }">
<image <image
:src="isRecording ? 'https://iot-xcwl.cn/doc/photo/recording.png' : 'https://iot-xcwl.cn/doc/photo/record.png'" :src="isRecording ? 'https://xaznkj.cn/doc/photo/recording.png' : 'https://xaznkj.cn/doc/photo/record.png'"
class="mic-img" mode="aspectFit" /> class="mic-img" mode="aspectFit" />
</view> </view>
<text class="status-text">{{ recordingStatus }}</text> <text class="status-text">{{ recordingStatus }}</text>
@ -134,7 +134,7 @@
<view class="talk-button" :class="{ recording: isRecording }" @touchstart="startRecording" <view class="talk-button" :class="{ recording: isRecording }" @touchstart="startRecording"
@touchend="stopRecording" @touchcancel="cancelRecording"> @touchend="stopRecording" @touchcancel="cancelRecording">
<image <image
:src="isRecording ? 'https://iot-xcwl.cn/doc/photo/micred.png' : 'https://iot-xcwl.cn/doc/photo/mic.png'" :src="isRecording ? 'https://xaznkj.cn/doc/photo/micred.png' : 'https://xaznkj.cn/doc/photo/mic.png'"
class="mic-img" mode="aspectFit" /> class="mic-img" mode="aspectFit" />
<text>{{ isRecording ? '录音中...' : '按住说话' }}</text> <text>{{ isRecording ? '录音中...' : '按住说话' }}</text>
</view> </view>
@ -402,7 +402,7 @@
this.recordingStatus = '上传中...'; this.recordingStatus = '上传中...';
// uni-app 使 uni.uploadFile FormData // uni-app 使 uni.uploadFile FormData
const uploadUrl = 'https://iot-xcwl.cn/common/upload/audio'; const uploadUrl = 'https://xaznkj.cn/common/upload/audio';
const token = const token =
'Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImU3MWM2OTg4LTNlMzMtNDYyMy05M2M3LWE4YzZmMTNlMjZkZSJ9.wgsL8b3WDmyuesG8JTA3LcNFp2FigkB90h6Inwxt7OFadH6rc5np5TjAyU1pzU2_b5cmG8BYXMEdAqEdJzoDcA'; 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImU3MWM2OTg4LTNlMzMtNDYyMy05M2M3LWE4YzZmMTNlMjZkZSJ9.wgsL8b3WDmyuesG8JTA3LcNFp2FigkB90h6Inwxt7OFadH6rc5np5TjAyU1pzU2_b5cmG8BYXMEdAqEdJzoDcA';

View File

@ -74,7 +74,7 @@
:nomoreText="$tt('timing.nothing')" marginTop="20" @loadmore="loadMoreLogs" /> :nomoreText="$tt('timing.nothing')" marginTop="20" @loadmore="loadMoreLogs" />
<u-empty mode="data" :show="total === 0" marginTop="60" :text="$tt('timing.emptyNull')"></u-empty> <u-empty mode="data" :show="total === 0" marginTop="60" :text="$tt('timing.emptyNull')"></u-empty>
</view> </view>
<u-loading-page :loading="loading" loadingText="iot-xcwl.cn" bg-color="#eef3f7"></u-loading-page> <u-loading-page :loading="loading" loadingText="xaznkj.cn" bg-color="#eef3f7"></u-loading-page>
<view class="other"> <view class="other">
<u-modal :show="isModal" :title="modalTitle" :content="modalContent" @confirm="modalConfirm" <u-modal :show="isModal" :title="modalTitle" :content="modalContent" @confirm="modalConfirm"

View File

@ -42,7 +42,7 @@
<u-empty mode="list" icon="http://cdn.uviewui.com/uview/empty/list.png" :show="total === 0" <u-empty mode="list" icon="http://cdn.uviewui.com/uview/empty/list.png" :show="total === 0"
marginTop="30"></u-empty> marginTop="30"></u-empty>
<u-loadmore :status="loadmoreStatus" v-if="total > 0" marginTop="20" /> <u-loadmore :status="loadmoreStatus" v-if="total > 0" marginTop="20" />
<u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="iot-xcwl.cn"></u-loading-page> <u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="xaznkj.cn"></u-loading-page>
</view> </view>
</template> </template>

View File

@ -48,7 +48,7 @@
<u-empty mode="list" :show="total === 0" marginTop="30"></u-empty> <u-empty mode="list" :show="total === 0" marginTop="30"></u-empty>
<u-loadmore :status="loadmoreStatus" v-if="total > 0" marginTop="20" /> <u-loadmore :status="loadmoreStatus" v-if="total > 0" marginTop="20" />
<u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="iot-xcwl.cn"></u-loading-page> <u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="xaznkj.cn"></u-loading-page>
</view> </view>
</template> </template>

View File

@ -1,7 +1,7 @@
<template> <template>
<view class="bind-login-wrap"> <view class="bind-login-wrap">
<view class="top-wrap"> <view class="top-wrap">
<image src="https://iot-xcwl.cn/app/fastbee1_blue.png" mode="widthFix" style="width: 500rpx;"></image> <image src="https://xaznkj.cn/app/fastbee1_blue.png" mode="widthFix" style="width: 500rpx;"></image>
</view> </view>
<view class="main-wrap"> <view class="main-wrap">
<u--text size="18" type="info" bold margin="20rpx 0" :text="$tt('bindLogin.bindLogin')"></u--text> <u--text size="18" type="info" bold margin="20rpx 0" :text="$tt('bindLogin.bindLogin')"></u--text>

View File

@ -4,7 +4,7 @@
<view class="back-btn"> <view class="back-btn">
<u-icon name="arrow-left" color="#333333" size="18" @click="handleBack()"></u-icon> <u-icon name="arrow-left" color="#333333" size="18" @click="handleBack()"></u-icon>
</view> </view>
<image class="img" src="https://iot-xcwl.cn/app/fastbee1_blue.png" mode="widthFix"></image> <image class="img" src="https://xaznkj.cn/app/fastbee1_blue.png" mode="widthFix"></image>
</view> </view>
<view class="main-wrap"> <view class="main-wrap">
<view> <view>

View File

@ -5,7 +5,7 @@
<u-icon name="arrow-left" color="#333333" size="18" @click="handleBack()"></u-icon> <u-icon name="arrow-left" color="#333333" size="18" @click="handleBack()"></u-icon>
</view> </view>
<view class="register" @click="handleRegister()">{{$tt('register.registration')}}</view> <view class="register" @click="handleRegister()">{{$tt('register.registration')}}</view>
<image class="img" src="https://iot-xcwl.cn/app/fastbee1_blue.png" mode="widthFix"></image> <image class="img" src="https://xaznkj.cn/app/fastbee1_blue.png" mode="widthFix"></image>
</view> </view>
<view class="main-wrap"> <view class="main-wrap">
<view> <view>
@ -77,7 +77,7 @@
<view class="one-click-login-pop-wrap"> <view class="one-click-login-pop-wrap">
<u-popup :show="isShowPop" mode="bottom" :round="10" closeable="true" @close="isShowPop = false"> <u-popup :show="isShowPop" mode="bottom" :round="10" closeable="true" @close="isShowPop = false">
<view class="content-wrap"> <view class="content-wrap">
<u--image :showLoading="true" src="https://iot-xcwl.cn/app/fastbee1_blue.png" width="260rpx" <u--image :showLoading="true" src="https://xaznkj.cn/app/fastbee1_blue.png" width="260rpx"
height="90rpx" customStyle="float:left"></u--image> height="90rpx" customStyle="float:left"></u--image>
<text class="title">{{$tt("login.welcomeToLogin")}}</text> <text class="title">{{$tt("login.welcomeToLogin")}}</text>
<view class="btn-login"> <view class="btn-login">

View File

@ -4,7 +4,7 @@
<view class="top-wrap"> <view class="top-wrap">
<view class="user-register" @click="handleRegister()">{{$tt('register.registration')}}</view> <view class="user-register" @click="handleRegister()">{{$tt('register.registration')}}</view>
<view class="bounce-in-top"> <view class="bounce-in-top">
<image src="https://iot-xcwl.cn/app/fastbee1_blue.png" mode="widthFix" style="width: 290rpx;"> <image src="https://xaznkj.cn/app/fastbee1_blue.png" mode="widthFix" style="width: 290rpx;">
</image> </image>
</view> </view>
</view> </view>

View File

@ -5,8 +5,8 @@
<view class="user-about"> <view class="user-about">
<view class="list-group"> <view class="list-group">
<view style="padding: 80rpx"> <view style="padding: 80rpx">
<u--image :showLoading="true" src="https://iot-xcwl.cn/app/fastbee1_blue.png" width="130px" <u--image :showLoading="true" src="https://xaznkj.cn/app/fastbee1_blue.png" width="130px" height="45px"
height="45px" customStyle="margin:auto"></u--image> customStyle="margin:auto"></u--image>
<u--text :text="$tt('about.open')" size="14" type="info" <u--text :text="$tt('about.open')" size="14" type="info"
customStyle="margin:auto; margin-top:24rpx;"></u--text> customStyle="margin:auto; margin-top:24rpx;"></u--text>
<u--text :text="$tt('about.message')" size="14" type="info" <u--text :text="$tt('about.message')" size="14" type="info"

View File

@ -69,7 +69,7 @@
</scroll-view> </scroll-view>
<u-empty mode="list" :show="total === 0 && isTriggeredTop === false" marginTop="60"></u-empty> <u-empty mode="list" :show="total === 0 && isTriggeredTop === false" marginTop="60"></u-empty>
</view> </view>
<u-loading-page :loading="loading" bg-color="rbga(0,0,0,0)" loadingText="iot-xcwl.cn"></u-loading-page> <u-loading-page :loading="loading" bg-color="rbga(0,0,0,0)" loadingText="xaznkj.cn"></u-loading-page>
</view> </view>
</template> </template>

View File

@ -1,6 +1,6 @@
<template> <template>
<view class="container"> <view class="container">
<u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="iot-xcwl.cn"></u-loading-page> <u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="xaznkj.cn"></u-loading-page>
<view class="card"> <view class="card">
<u-sticky> <u-sticky>
<view class="player-wrapper"> <view class="player-wrapper">

View File

@ -1,6 +1,6 @@
<template> <template>
<view class="container"> <view class="container">
<u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="iot-xcwl.cn"></u-loading-page> <u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="xaznkj.cn"></u-loading-page>
<view class="card"> <view class="card">
<u-sticky> <u-sticky>
<view class="player-wrapper"> <view class="player-wrapper">