吉安感知网项目-前端
shuishen
2026-01-14 7040e9649e51857e49261fb29f2a3a3bbf9f55e8
Merge branch 'master' of http://139.196.74.78:10010/r/jagzwxm/ja_web
10 files modified
1 files added
229 ■■■■■ changed files
applications/drone-command/src/views/detectionCountermeasure/countermeasureEvaluation/FormDiaLog.vue 4 ●●●● patch | view | raw | blame | history
applications/drone-command/src/views/detectionCountermeasure/countermeasureEvaluation/index.vue 3 ●●●● patch | view | raw | blame | history
applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue 39 ●●●● patch | view | raw | blame | history
applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue 64 ●●●●● patch | view | raw | blame | history
applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/index.vue 2 ●●● patch | view | raw | blame | history
applications/drone-command/src/views/detectionCountermeasure/taskSchedule/FormDiaLog.vue 54 ●●●●● patch | view | raw | blame | history
applications/drone-command/src/views/detectionCountermeasure/taskSchedule/index.vue 16 ●●●● patch | view | raw | blame | history
applications/mobile-web-view/src/appDataSource/appwork/defaultAvatar.svg 17 ●●●●● patch | view | raw | blame | history
applications/mobile-web-view/src/appPages/voiceCallDetail/index.vue 20 ●●●● patch | view | raw | blame | history
uniapps/work-app/src/pages/login/index.vue 8 ●●●● patch | view | raw | blame | history
uniapps/work-app/src/subPackages/userDetail/password/index.vue 2 ●●● patch | view | raw | blame | history
applications/drone-command/src/views/detectionCountermeasure/countermeasureEvaluation/FormDiaLog.vue
@@ -30,7 +30,7 @@
                    <div>反制设备类型: {{ getDeviceTypeLabel(formData.deviceType) }}</div>
                </el-col>
                <el-col :span="12">
                    <div>反制设备编码: {{ formData.deviceCode }}</div>
                    <div>反制设备编码: {{ formData.deviceSn }}</div>
                </el-col>
                <el-col :span="12">
                    <div>区域编码: {{ formData.areaCode }}</div>
@@ -68,7 +68,7 @@
    deviceName: '', // 反制设备名称
    deviceModel: '', // 反制设备型号
    deviceType: '', // 反制设备类型
    deviceCode: '', // 反制设备编码
    deviceSn: '', // 反制设备编码
    areaCode: '', // 区域编码
    deployLongitude: '', // 部署经度
    deployLatitude: '', // 部署纬度
applications/drone-command/src/views/detectionCountermeasure/countermeasureEvaluation/index.vue
@@ -57,7 +57,7 @@
                    {{ getDictLabel(row.deviceType, dictObj.deviceType) }}
                </template>
            </el-table-column>
            <el-table-column prop="deviceCode" label="反制设备编码" />
            <el-table-column prop="deviceSn" label="反制设备编码" />
            <el-table-column prop="areaCode" label="场景" />
            <el-table-column prop="areaCode" label="区域" />
            <el-table-column label="部署位置">
@@ -150,7 +150,6 @@
    searchParams.value = initSearchParams()
    getList()
}
// 获取工作模式标签
function getWorkModeLabel(value) {
applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue
@@ -24,21 +24,10 @@
            </div>
            <div class="dialog-form">
                <div class="form-title">{{ formTitle }}</div>
                <el-form
                    ref="formRef"
                    :model="formData"
                    :rules="rules"
                    label-width="84px"
                    :disabled="dialogReadonly"
                >
                <el-form ref="formRef" :model="formData" :rules="rules" label-width="84px" :disabled="dialogReadonly">
                    <el-form-item label="侦测设备" prop="deviceId">
                        <el-select v-model="formData.deviceId" placeholder="请选择" clearable @change="handleDeviceChange">
                            <el-option
                                v-for="item in deviceOptions"
                                :key="item.value"
                                :label="item.label"
                                :value="item.value"
                            />
                            <el-option v-for="item in deviceOptions" :key="item.value" :label="item.label" :value="item.value" />
                        </el-select>
                    </el-form-item>
                    <el-form-item label="设备类型" prop="deviceType">
@@ -58,8 +47,8 @@
                            </template>
                        </el-input>
                    </el-form-item>
                    <el-form-item label="设备编号" prop="deviceCode">
                        <el-input v-model="formData.deviceCode" placeholder="请输入" clearable />
                    <el-form-item label="设备编号" prop="deviceSn">
                        <el-input v-model="formData.deviceSn" placeholder="请输入" clearable />
                    </el-form-item>
                    <el-form-item label="设备型号" prop="deviceModel">
                        <el-input v-model="formData.deviceModel" placeholder="请输入" clearable />
@@ -78,14 +67,7 @@
        </div>
        <template v-if="!dialogReadonly" #footer>
            <el-button @click="handleCancel">取消</el-button>
            <el-button
                type="primary"
                :loading="submitting"
                :disabled="submitting"
                @click="handleSubmit"
            >
                保存
            </el-button>
            <el-button type="primary" :loading="submitting" :disabled="submitting" @click="handleSubmit">保存</el-button>
        </template>
    </el-dialog>
</template>
@@ -105,7 +87,7 @@
    deviceName: '', // 侦测设备
    deviceType: '', // 设备类型
    deployLocation: '', // 设备位置
    deviceCode: '', // 设备编号
    deviceSn: '', // 设备编号
    deviceModel: '', // 设备型号
    effectiveRangeKm: null, // 覆盖范围
})
@@ -152,14 +134,9 @@
    formData.value.deviceName = raw.deviceName ?? formData.value.deviceName
    formData.value.deviceType = raw.deviceType ?? formData.value.deviceType
    formData.value.deviceModel = raw.deviceModel ?? formData.value.deviceModel
    formData.value.deviceCode =
        raw.deviceCode ?? raw.deviceSn ?? raw.deviceNo ?? formData.value.deviceCode
    formData.value.deviceSn = raw.deviceSn ?? raw.deviceSn ?? raw.deviceNo ?? formData.value.deviceCode
    formData.value.deployLocation =
        raw.deployLocation ??
        raw.address ??
        raw.location ??
        raw.deployAddress ??
        formData.value.deployLocation
        raw.deployLocation ?? raw.address ?? raw.location ?? raw.deployAddress ?? formData.value.deployLocation
}
// 关闭弹框
applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue
@@ -2,15 +2,30 @@
    <basic-container>
        <el-form ref="queryParamsRef" :model="searchParams" class="ztzf-page-history-search">
            <el-form-item label="名称" prop="deviceName">
                <el-input class="ztzf-data-cockpit-search-input" v-model="searchParams.deviceName" placeholder="请输入"
                    clearable @clear="handleSearch" />
                <el-input
                    class="ztzf-data-cockpit-search-input"
                    v-model="searchParams.deviceName"
                    placeholder="请输入"
                    clearable
                    @clear="handleSearch"
                />
            </el-form-item>
            <el-form-item label="类型" prop="deviceType">
                <el-select class="ztzf-data-cockpit-select" popper-class="ztzf-data-cockpit-select-popper"
                    v-model="searchParams.deviceType" placeholder="请选择" clearable @change="handleSearch">
                    <el-option v-for="item in dictObj.deviceType" :key="item.dictKey" :label="item.dictValue"
                        :value="item.dictKey" />
                <el-select
                    class="ztzf-data-cockpit-select"
                    popper-class="ztzf-data-cockpit-select-popper"
                    v-model="searchParams.deviceType"
                    placeholder="请选择"
                    clearable
                    @change="handleSearch"
                >
                    <el-option
                        v-for="item in dictObj.deviceType"
                        :key="item.dictKey"
                        :label="item.dictValue"
                        :value="item.dictKey"
                    />
                </el-select>
            </el-form-item>
@@ -61,9 +76,14 @@
            </div>
            <div class="ztzf-table-pagination">
                <el-pagination popper-class="ztzf-data-cockpit-select-popper"
                    v-model:current-page="searchParams.current" v-model:page-size="searchParams.size"
                    layout="total, prev, pager, next, sizes" :total="total" @change="getList" />
                <el-pagination
                    popper-class="ztzf-data-cockpit-select-popper"
                    v-model:current-page="searchParams.current"
                    v-model:page-size="searchParams.size"
                    layout="total, prev, pager, next, sizes"
                    :total="total"
                    @change="getList"
                />
            </div>
        </div>
@@ -99,7 +119,7 @@
provide('dictObj', dictObj)
// 获取列表
async function getList () {
async function getList() {
    loading.value = true
    try {
        const res = await detectionRangePageApi(searchParams.value)
@@ -111,35 +131,35 @@
}
// 查询
function handleSearch () {
function handleSearch() {
    searchParams.value.current = 1
    getList()
}
// 重置查询
function resetForm () {
function resetForm() {
    queryParamsRef.value?.resetFields()
    searchParams.value.current = 1
    getList()
}
// 新增
function handleAdd () {
function handleAdd() {
    dialogRef.value?.open({ mode: 'add' })
}
// 查看
function handleView (row) {
function handleView(row) {
    dialogRef.value?.open({ mode: 'view', row: { ...row } })
}
// 编辑
function handleEdit (row) {
function handleEdit(row) {
    dialogRef.value?.open({ mode: 'edit', row: { ...row } })
}
// 删除
async function handleDelete (row) {
async function handleDelete(row) {
    await ElMessageBox.confirm('确认删除该条数据吗?', '提示', { type: 'warning' })
    await detectionRangeSubmitApi({ id: row.id, effectiveRangeKm: 0 })
    ElMessage.success('删除成功')
@@ -147,13 +167,13 @@
}
// 获取字典
function getDictList () {
function getDictList() {
    getDictionaryByCode('deviceType').then(res => {
        dictObj.value = res.data.data
    })
}
function formatDeployLocation (row) {
function formatDeployLocation(row) {
    if (!row) return '-'
    const location = row.deployLocation ?? row.address ?? row.location ?? row.deployAddress
    if (Array.isArray(location) && location.length) {
@@ -170,15 +190,15 @@
    return '-'
}
function formatRange (row) {
function formatRange(row) {
    if (!row) return '-'
    const value = row.effectiveRangeKm ?? row.range
    return value === null || value === undefined || value === '' ? '-' : value
}
function formatDeviceCode (row) {
    if (!row) return '-'
    return row.deviceCode || row.deviceSn || row.deviceNo || '-'
function formatDeviceCode(row) {
    if (!row) return ''
    return row.deviceSn
}
onMounted(() => {
applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/index.vue
@@ -36,7 +36,7 @@
            </el-table-column>
            <el-table-column prop="deviceModel" label="设备型号" />
            <el-table-column prop="deviceName" label="设备名称" />
            <el-table-column prop="deviceCode" label="设备编码" />
            <el-table-column prop="deviceSn" label="设备编码" />
            <el-table-column prop="deployLocation" label="部署位置" />
            <el-table-column prop="manufacturer" label="厂商" />
            <el-table-column prop="contactPhone" label="联系方式" />
applications/drone-command/src/views/detectionCountermeasure/taskSchedule/FormDiaLog.vue
@@ -6,10 +6,7 @@
                    <div>设备名称: {{ formData.deviceName }}</div>
                </el-col>
                <el-col :span="12">
                    <div>设备编码: {{ formData.deviceCode }}</div>
                </el-col>
                <el-col :span="12">
                    <div>设备状态: {{ getDeviceStatusLabel(formData.deviceStatus) }}</div>
                    <div>设备编码: {{ formData.deviceSn }}</div>
                </el-col>
                <el-col :span="12">
                    <div>场景: {{ formData.defenseSceneName }}</div>
@@ -40,20 +37,15 @@
        <el-form v-else ref="formRef" :model="formData" :rules="rules" :disabled="readonly" label-width="100px">
            <el-row>
                <el-col :span="12">
                    <el-form-item label="设备名称" prop="deviceId">
                    <el-form-item label="设备" prop="deviceId">
                        <el-select v-model="formData.deviceId" placeholder="请选择" clearable @change="handleDeviceChange">
                            <el-option v-for="item in deviceList" :key="item.id" :label="item.deviceName" :value="item.id" />
                        </el-select>
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="设备编码" prop="deviceCode">
                        <el-input v-model="formData.deviceCode" disabled placeholder="选择设备后自动带出" />
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="设备状态" prop="deviceStatus">
                        <el-input v-model="formData.deviceStatusLabel" disabled placeholder="选择设备后自动带出" />
                    <el-form-item label="设备编码" prop="deviceSn">
                        <el-input v-model="formData.deviceSn" disabled placeholder="选择设备后自动带出" />
                    </el-form-item>
                </el-col>
                <el-col :span="12">
@@ -70,6 +62,7 @@
                            placeholder="请先选择场景"
                            clearable
                            :disabled="!formData.defenseSceneId"
                            @change="handleAreaChange"
                        >
                            <el-option v-for="item in areaList" :key="item.id" :label="item.areaName" :value="item.id" />
                        </el-select>
@@ -94,9 +87,10 @@
                </el-col>
                <el-col :span="24">
                    <el-form-item label="调度位置" prop="longitude">
                        <el-button @click="selectLocation" style="width: 100%">
<!--                        <el-button @click="selectLocation" style="width: 100%">-->
                        <el-button style="width: 100%">
                            {{
                                formData.longitude && formData.latitude ? `${formData.longitude}, ${formData.latitude}` : '点击选择位置'
                                formData.longitude && formData.latitude ? `${formData.longitude}, ${formData.latitude}` : '选择区域后自动带出'
                            }}
                        </el-button>
                    </el-form-item>
@@ -139,6 +133,7 @@
                </el-col>
            </el-row>
        </el-form>
        <template #footer>
            <el-button @click="handleCancel">{{ readonly ? '关闭' : '取消' }}</el-button>
            <el-button v-if="!readonly" type="primary" :loading="submitting" :disabled="submitting" @click="handleSubmit">
@@ -168,7 +163,7 @@
// 初始化表单
const initForm = () => ({
    deviceId: '', // 设备ID
    deviceCode: '', // 设备编码
    deviceSn: '', // 设备编码
    deviceName: '', // 设备名称
    deviceStatus: '', // 设备状态
    deviceStatusLabel: '', // 设备状态标签
@@ -193,9 +188,6 @@
    deviceList: { type: Array, default: () => [] },
})
// 注入字典数据
const dictObj = inject('dictObj')
const emit = defineEmits(['success'])
const formRef = ref(null) // 表单实例
const formData = ref(initForm()) // 表单数据
@@ -209,16 +201,11 @@
const areaList = ref([]) // 区域列表
const rules = {
    deviceId: [{ required: true, message: '请选择设备', trigger: 'change' }],
    defenseSceneId: [{ required: true, message: '请选择场景', trigger: 'change' }],
    areaDivideId: [{ required: true, message: '请选择区域', trigger: 'change' }],
    deviceId: fieldRules(true),
    areaDivideId: fieldRules(true),
    defenseSceneId: fieldRules(true),
    dispatchUser: fieldRules(true, 50),
}
// 获取设备状态标签
function getDeviceStatusLabel(status) {
    const statusMap = { 0: '离线', 1: '在线' }
    return statusMap[status] || status
    dispatchDateRange: fieldRules(true),
}
// 设备选择变化处理
@@ -226,14 +213,12 @@
    const device = props.deviceList.find(item => item.id === deviceId)
    if (device) {
        formData.value.deviceName = device.deviceName
        formData.value.deviceCode = device.deviceCode
        formData.value.deviceSn = device.deviceSn
        formData.value.deviceStatus = device.deviceStatus
        formData.value.deviceStatusLabel = getDeviceStatusLabel(device.deviceStatus)
    } else {
        formData.value.deviceName = ''
        formData.value.deviceCode = ''
        formData.value.deviceSn = ''
        formData.value.deviceStatus = ''
        formData.value.deviceStatusLabel = ''
    }
}
@@ -245,6 +230,12 @@
    } else {
        areaList.value = []
    }
}
function handleAreaChange(areaId) {
    const find = areaList.value.find(item => item.id === areaId)
    formData.value.longitude = find?.longitude
    formData.value.latitude = find?.latitude
}
// 加载区域列表
@@ -285,7 +276,6 @@
    const data = res?.data?.data ?? {}
    formData.value = {
        ...data,
        deviceStatusLabel: getDeviceStatusLabel(data.deviceStatus),
        dispatchDateRange:
            data.dispatchStartTime && data.dispatchEndTime ? [data.dispatchStartTime, data.dispatchEndTime] : [],
    }
applications/drone-command/src/views/detectionCountermeasure/taskSchedule/index.vue
@@ -30,10 +30,10 @@
                    />
                </el-select>
            </el-form-item>
            <el-form-item label="设备编号" prop="deviceCode">
            <el-form-item label="设备编号" prop="deviceSn">
                <el-input
                    class="ztzf-data-cockpit-search-input"
                    v-model="searchParams.deviceCode"
                    v-model="searchParams.deviceSn"
                    placeholder="请输入"
                    clearable
                    @clear="handleSearch"
@@ -57,14 +57,14 @@
                    <el-table-column type="selection" width="46" />
                    <el-table-column type="index" show-overflow-tooltip width="64" label="序号" />
                    <el-table-column prop="deviceName" show-overflow-tooltip width="140" label="设备名称" />
                    <el-table-column prop="deviceCode" show-overflow-tooltip width="140" label="设备编码" />
                    <el-table-column prop="deviceStatus" show-overflow-tooltip width="100" label="设备状态">
                    <el-table-column prop="deviceSn" show-overflow-tooltip width="140" label="设备编码" />
                    <!--                    <el-table-column prop="deviceStatus" show-overflow-tooltip width="100" label="设备状态">
                        <template v-slot="{ row }">
                            {{ getDictLabel(row.deviceStatus, dictObj.deviceStatus) }}
                        </template>
                    </el-table-column>
                    <el-table-column prop="areaDivideName" show-overflow-tooltip width="120" label="区域" />
                    <el-table-column prop="defenseSceneName" show-overflow-tooltip width="120" label="场景" />
                    </el-table-column>-->
                    <el-table-column prop="areaName" show-overflow-tooltip width="120" label="区域" />
                    <el-table-column prop="defenseZoneName" show-overflow-tooltip width="120" label="场景" />
                    <el-table-column show-overflow-tooltip width="200" label="调度位置">
                        <template v-slot="{ row }">{{ row.longitude }}, {{ row.latitude }}</template>
                    </el-table-column>
@@ -124,7 +124,7 @@
const initSearchParams = () => ({
    deviceId: '', // 设备名称
    deviceType: '', // 设备类型
    deviceCode: '', // 设备编号
    deviceSn: '', // 设备编号
    current: 1, // 当前页
    size: 10, // 每页大小
})
applications/mobile-web-view/src/appDataSource/appwork/defaultAvatar.svg
New file
@@ -0,0 +1,17 @@
<svg width="66" height="66" viewBox="0 0 66 66" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame" clip-path="url(#clip0_134_811)">
<path id="Vector" d="M30.6833 42.3407H35.8941V48.5364H30.6833V42.3407ZM47.647 28.7265C48.7195 28.1028 49.3564 28.1028 49.5544 28.7265C49.8531 29.6588 49.1221 32.3895 48.3714 33.099C47.8714 33.5693 47.1867 33.7673 46.3155 33.6897L47.647 28.7249V28.7265Z" fill="#FAF5F1"/>
<path id="Vector_2" d="M0 33C0 41.7521 3.47678 50.1458 9.66548 56.3345C15.8542 62.5232 24.2479 66 33 66C41.7521 66 50.1458 62.5232 56.3345 56.3345C62.5232 50.1458 66 41.7521 66 33C66 24.2479 62.5232 15.8542 56.3345 9.66548C50.1458 3.47678 41.7521 0 33 0C24.2479 0 15.8542 3.47678 9.66548 9.66548C3.47678 15.8542 0 24.2479 0 33Z" fill="#DCE0EC"/>
<path id="Vector_3" d="M33 66C28.3651 66 23.3558 64.9226 19.3479 63.0432C20.1746 58.3671 23.0703 54.4038 27.4494 52.6449C29.1423 51.9651 31.3335 52.1499 33.2789 52.1499C35.3414 52.1499 37.9847 52.0674 39.7584 52.8264C43.8488 54.5787 46.6504 58.2434 47.5794 62.606C46.8633 62.9871 45.3535 63.6966 43.1904 64.388C42.3027 64.6718 41.5536 64.8995 40.1956 65.2064C37.8317 65.7232 35.4198 65.9892 33 66Z" fill="#1D6FE9" fill-opacity="0.5"/>
<path id="Vector_4" d="M33.0298 50.6385C41.5025 50.6385 45.9724 43.8273 47.7923 35.4288C46.2199 29.4608 41.9876 20.2785 33.5149 20.2785C25.0421 20.2785 17.0149 27.0881 18.7507 35.4882C20.4865 43.8867 24.557 50.6369 33.0298 50.6369V50.6385Z" fill="#FAF5F1"/>
<path id="Vector_5" d="M20.2307 35.8264C19.0427 35.4882 18.3216 35.404 18.0626 35.5707C17.8695 35.6961 17.9207 36.5013 18.2061 37.2372C18.4916 37.9681 19.0113 38.6298 19.2786 38.6298C19.8099 38.6298 20.8032 37.8378 20.8032 37.8378L20.2307 35.8248V35.8264ZM46.3089 35.8264C47.4969 35.4882 48.2196 35.404 48.477 35.5707C48.6717 35.6961 48.6189 36.5013 48.3335 37.2372C48.048 37.9681 47.5299 38.6298 47.2626 38.6298C46.7297 38.6298 45.7364 37.8378 45.7364 37.8378L46.3089 35.8248V35.8264Z" fill="#FAF5F1"/>
<path id="Vector_6" d="M41.3555 17.9404C40.2929 17.721 34.937 12.6159 29.6157 13.6603C24.2978 14.7048 19.2966 17.886 17.4849 22.0308C15.6749 26.1723 17.7159 35.6878 18.6944 35.6878C19.6745 35.6878 20.9631 30.9144 24.4067 29.8551C27.8502 28.7958 28.5581 29.8551 32.6699 29.2314C35.4105 28.8156 37.8245 26.9412 39.9118 23.6098C44.4328 26.8356 47.0068 30.8616 47.6371 35.6878C48.8284 35.7835 49.7623 25.1212 47.6371 22.2502C45.5119 19.3792 42.4165 18.1615 41.3555 17.9404Z" fill="#1D6FE9" fill-opacity="0.5"/>
<path id="Vector_7" d="M31.2626 47.8797H35.3166V52.1268C37.092 52.1994 38.2801 52.338 38.8807 52.5393C39.1166 52.6878 38.0177 52.8644 37.9434 53.0887C37.8906 53.2438 37.6135 53.5161 37.1119 53.9022C35.4982 53.9962 34.297 54.054 33.5099 54.0771C32.7229 54.1002 31.9754 54.1002 31.2626 54.0771C29.3486 53.3544 28.5071 52.8429 28.7414 52.5409C28.9774 52.2373 29.8172 52.0839 31.2626 52.079V47.8797Z" fill="#FAF5F1"/>
<path id="Vector_8" d="M29.8485 52.1499L33.5775 54.0771L31.2626 56.3558L28.3289 52.3661C28.5797 52.2968 28.8008 52.2473 28.9905 52.2209C29.1819 52.1928 29.4674 52.1697 29.8485 52.1499ZM37.5078 52.2704L33.5792 54.0771L35.8809 56.3558L38.9631 52.5476C38.6496 52.475 38.4087 52.4238 38.2437 52.3925C38.0787 52.3595 37.8345 52.3199 37.5078 52.2704Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_134_811">
<rect width="66" height="66" fill="white"/>
</clipPath>
</defs>
</svg>
applications/mobile-web-view/src/appPages/voiceCallDetail/index.vue
@@ -16,7 +16,10 @@
        <div class="button-group">
            <button @click="connectWS" :disabled="connected" class="btn btn-connect">连接WS</button>
        </div>
      <!--  头像-->
            <div class="contactAvatar">
                <img :src="defaultAvatar" alt=""></img>
            </div>
        <div class="button-group">
            <button @click="requestCall" :disabled="!connected || state!=='idle'" class="btn btn-call">呼叫</button>
          
@@ -49,7 +52,7 @@
<script setup>
import { useRoute } from 'vue-router'
import defaultAvatar from '@/appDataSource/appwork/defaultAvatar.svg'
const route = useRoute()
/** ✅ 你的 WS 地址前缀(后面拼 userId) */
const WS_BASE = 'wss://wrj.shuixiongit.com/ws/chat?userId='
@@ -493,7 +496,6 @@
  <style scoped lang="scss">
    .call-container {
        padding: 20px;
        background-color: #f5f5f5;
        min-height: 100vh;
        font-family: Arial, sans-serif;
    }
@@ -535,6 +537,7 @@
        display: flex;
        gap: 10px;
        flex-wrap: wrap;
        justify-content: center;
    }
    .btn {
@@ -622,4 +625,15 @@
    .hidden-audio {
        display: none;
    }
    .contactAvatar {
        width: 172rpx;
        height: 172rpx;
        display: flex;
        justify-content: center;
        align-items: center;
        img{
            width: 172rpx;
            height: 172rpx;
        }
    }
  </style>
uniapps/work-app/src/pages/login/index.vue
@@ -27,7 +27,7 @@
        </checkbox-group>
        记住密码
      </label>
      <div class="forgotPassword">忘记密码?</div>
      <div class="forgotPassword" @click="goToForgotPassword">忘记密码?</div>
    </div>
    <button class="login-btn" :style="[inputStyle]" @tap="submit">登录</button>
@@ -78,6 +78,12 @@
  showPassword.value = !showPassword.value;
}
function goToForgotPassword() {
  uni.navigateTo({
    url: '/subPackages/userDetail/password/index'
  });
}
async function submit() {
  if (!loginForm.value.username.trim()) {
    uni.showToast({
uniapps/work-app/src/subPackages/userDetail/password/index.vue
@@ -213,7 +213,7 @@
      password2: password2,
            code
        };
    console.log('canshu',resetData)
        resetPassword(resetData).then(res => {
            if (res.data.code === 200) {
                uni.showToast({