From 9aae657453076fd1bc3fe0d043847530a54c80a7 Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Thu, 15 Jan 2026 09:23:58 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 uniapps/work-wx/src/pages/equipmentManagement/index.vue         |    9 
 uniapps/work-wx/src/subPackages/userDetail/infos/index.vue      |    4 
 uniapps/work-wx/src/pages.json                                  |   35 
 applications/drone-command/src/views/system/user/FormDiaLog.vue |  451 ++++++++++++++++++
 uniapps/work-wx/src/subPackages/userDetail/password/index.vue   |  220 ++++----
 uniapps/work-wx/src/subPackages/deviceRegistration/add.vue      |   97 ++-
 applications/drone-command/src/views/system/user/index.vue      |  504 ++++++++++++++++++++
 uniapps/work-wx/src/subPackages/flightApplication/add.vue       |   35 
 uniapps/work-wx/src/subPackages/flightApplication/index.vue     |   10 
 uniapps/work-wx/src/pages/legalPolicy/index.vue                 |    2 
 /dev/null                                                       |   26 -
 uniapps/work-wx/src/pages/login/index.vue                       |   29 
 uniapps/work-wx/src/static/images/user/droneLogo.png            |    0 
 uniapps/work-wx/src/pages/register/index.vue                    |   28 
 uniapps/work-wx/src/pages/user/index.vue                        |    4 
 uniapps/work-wx/src/static/images/logo.png                      |    0 
 uniapps/work-wx/src/pages/page/index.vue                        |   12 
 17 files changed, 1,201 insertions(+), 265 deletions(-)

diff --git a/applications/drone-command/src/views/system/user/FormDiaLog.vue b/applications/drone-command/src/views/system/user/FormDiaLog.vue
new file mode 100644
index 0000000..8aba6fe
--- /dev/null
+++ b/applications/drone-command/src/views/system/user/FormDiaLog.vue
@@ -0,0 +1,451 @@
+<template>
+	<el-dialog v-model="visible" :title="titleEnum[dialogMode]" :close-on-click-modal="false" width="800px">
+		<!-- 查看模式 -->
+		<div v-if="readonly" class="view-mode">
+			<el-row :gutter="16">
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">登录账号:</span>
+						{{ formData.account }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">用户姓名:</span>
+						{{ formData.realName }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">手机号码:</span>
+						{{ formData.phone }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">电子邮箱:</span>
+						{{ formData.email }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">用户性别:</span>
+						{{ getSexLabel(formData.sex) }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">用户生日:</span>
+						{{ formData.birthday }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">所属角色:</span>
+						{{ formData.roleName }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">所属部门:</span>
+						{{ formData.deptName }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">用户编号:</span>
+						{{ formData.code }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">账号状态:</span>
+						{{ formData.statusName }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">到期时间:</span>
+						{{ formData.expireTime }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">次数限制:</span>
+						{{ formData.maxLoginNum }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">飞行开始时间:</span>
+						{{ formData.flightStartTime }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">飞行结束时间:</span>
+						{{ formData.flightEndTime }}
+					</div>
+				</el-col>
+			</el-row>
+		</div>
+
+		<!-- 编辑/新增模式 -->
+		<el-form v-else ref="formRef" :model="formData" :rules="rules" label-width="110px">
+			<el-divider content-position="left">基础信息</el-divider>
+			<el-row :gutter="16">
+				<el-col :span="12">
+					<el-form-item label="登录账号" prop="account">
+						<el-input v-model="formData.account" maxlength="50" placeholder="请输入" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12" v-if="dialogMode === 'add'">
+					<el-form-item label="密码" prop="password">
+						<el-input
+							v-model="formData.password"
+							type="password"
+							maxlength="50"
+							placeholder="请输入"
+							clearable
+							show-password
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12" v-if="dialogMode === 'add'">
+					<el-form-item label="确认密码" prop="password2">
+						<el-input
+							v-model="formData.password2"
+							type="password"
+							maxlength="50"
+							placeholder="请输入"
+							clearable
+							show-password
+						/>
+					</el-form-item>
+				</el-col>
+			</el-row>
+
+			<el-divider content-position="left">详细信息</el-divider>
+			<el-row :gutter="16">
+				<el-col :span="12">
+					<el-form-item label="用户姓名" prop="realName">
+						<el-input v-model="formData.realName" maxlength="50" placeholder="请输入" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="手机号码" prop="phone">
+						<el-input v-model="formData.phone" maxlength="20" placeholder="请输入" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="电子邮箱" prop="email">
+						<el-input v-model="formData.email" maxlength="50" placeholder="请输入" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="用户性别" prop="sex">
+						<el-select v-model="formData.sex" placeholder="请选择" clearable>
+							<el-option label="男" :value="1" />
+							<el-option label="女" :value="2" />
+							<el-option label="未知" :value="3" />
+						</el-select>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="用户生日" prop="birthday">
+						<el-date-picker
+							v-model="formData.birthday"
+							type="datetime"
+							placeholder="请选择"
+							format="YYYY-MM-DD HH:mm:ss"
+							value-format="YYYY-MM-DD HH:mm:ss"
+							clearable
+						/>
+					</el-form-item>
+				</el-col>
+			</el-row>
+
+			<el-divider content-position="left">职责信息</el-divider>
+			<el-row :gutter="16">
+				<el-col :span="12">
+					<el-form-item label="用户编号" prop="code">
+						<el-input v-model="formData.code" maxlength="50" placeholder="请输入" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="所属角色" prop="roleId">
+						<el-tree-select
+							v-model="formData.roleId"
+							:data="roleTree"
+							:props="treeProps"
+							node-key="id"
+							check-strictly
+							clearable
+							placeholder="请选择"
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="所属部门" prop="deptId">
+						<el-tree-select
+							v-model="formData.deptId"
+							:data="deptTree"
+							:props="deptTreeSelectProps"
+							node-key="id"
+							check-strictly
+							clearable
+							placeholder="请选择"
+						/>
+					</el-form-item>
+				</el-col>
+			</el-row>
+
+			<el-divider content-position="left">登录限制</el-divider>
+			<el-row :gutter="16">
+				<el-col :span="12">
+					<el-form-item label="到期时间" prop="expireTime">
+						<el-date-picker
+							v-model="formData.expireTime"
+							type="datetime"
+							placeholder="请选择"
+							format="YYYY-MM-DD HH:mm:ss"
+							value-format="YYYY-MM-DD HH:mm:ss"
+							clearable
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="次数限制" prop="maxLoginNum">
+						<el-input v-model="formData.maxLoginNum" placeholder="请输入" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="飞行开始时间" prop="flightStartTime">
+						<el-time-picker
+							v-model="formData.flightStartTime"
+							placeholder="请选择"
+							format="HH:mm"
+							value-format="HH:mm"
+							clearable
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="飞行结束时间" prop="flightEndTime">
+						<el-time-picker
+							v-model="formData.flightEndTime"
+							placeholder="请选择"
+							format="HH:mm"
+							value-format="HH:mm"
+							clearable
+						/>
+					</el-form-item>
+				</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">
+				确定
+			</el-button>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup>
+import { computed, onMounted, ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import { getUser, add, update } from '@/api/system/user'
+import { getDeptTree } from '@/api/system/dept'
+import { getRoleTree } from '@/api/system/role'
+import func from '@/utils/func'
+
+// 初始化表单
+const initForm = () => ({
+	account: '',
+	password: '',
+	password2: '',
+	realName: '',
+	phone: '',
+	email: '',
+	sex: null,
+	birthday: '',
+	code: '',
+	roleId: '',
+	deptId: '',
+	expireTime: '',
+	maxLoginNum: '',
+	flightStartTime: '',
+	flightEndTime: '',
+})
+
+const treeProps = {
+	label: 'title',
+	children: 'children',
+}
+const deptTreeSelectProps = {
+	label: 'name',
+	value: 'id',
+	children: 'children',
+}
+
+const emit = defineEmits(['success'])
+const formRef = ref(null)
+const formData = ref(initForm())
+const visible = defineModel()
+const dialogMode = ref('add')
+const submitting = ref(false)
+const readonly = computed(() => dialogMode.value === 'view')
+const titleEnum = ref({ edit: '编辑用户', view: '查看用户', add: '新增用户' })
+const roleTree = ref([])
+const deptTree = ref([])
+
+// 密码验证
+const validatePass = (rule, value, callback) => {
+	if (value === '') {
+		callback(new Error('请输入密码'))
+	} else {
+		callback()
+	}
+}
+const validatePass2 = (rule, value, callback) => {
+	if (value === '') {
+		callback(new Error('请再次输入密码'))
+	} else if (value !== formData.value.password) {
+		callback(new Error('两次输入密码不一致!'))
+	} else {
+		callback()
+	}
+}
+
+const rules = {
+	account: [{ required: true, message: '请输入登录账号', trigger: 'blur' }],
+	password: [{ required: true, validator: validatePass, trigger: 'blur' }],
+	password2: [{ required: true, validator: validatePass2, trigger: 'blur' }],
+	realName: [
+		{ required: true, message: '请输入用户姓名', trigger: 'blur' },
+		{ min: 2, max: 50, message: '姓名长度在2到50个字符', trigger: 'blur' },
+	],
+	roleId: [{ required: true, message: '请选择所属角色', trigger: 'change' }],
+	deptId: [{ required: true, message: '请选择所属部门', trigger: 'change' }],
+}
+
+// 获取性别标签
+function getSexLabel(sex) {
+	const map = { 1: '男', 2: '女', 3: '未知' }
+	return map[sex] || ''
+}
+
+// 获取角色树
+async function getRoleTreeData() {
+	const res = await getRoleTree('000000')
+	roleTree.value = res.data.data
+}
+
+// 获取部门树
+async function getDeptTreeData() {
+	const res = await getDeptTree('000000')
+	deptTree.value = res.data.data
+}
+
+// 关闭弹框
+function handleCancel() {
+	visible.value = false
+}
+
+// 验证飞行时间
+function validateFlightTime() {
+	if (formData.value.flightStartTime && formData.value.flightEndTime) {
+		const [startHours, startMinutes] = formData.value.flightStartTime.split(':').map(Number)
+		const [endHours, endMinutes] = formData.value.flightEndTime.split(':').map(Number)
+		const startTotalMinutes = startHours * 60 + startMinutes
+		const endTotalMinutes = endHours * 60 + endMinutes
+		if (endTotalMinutes < startTotalMinutes) {
+			ElMessage.error('飞行结束时间不能小于飞行开始时间')
+			return false
+		}
+	}
+	return true
+}
+
+// 提交新增/编辑
+async function handleSubmit() {
+	const isValid = await formRef.value?.validate().catch(() => false)
+	if (!isValid) return
+	if (!validateFlightTime()) return
+
+	submitting.value = true
+	try {
+		const submitData = { ...formData.value }
+		submitData.roleId = func.toStr(submitData.roleId)
+		submitData.name = submitData.realName
+
+		if (dialogMode.value === 'add') {
+			await add(submitData)
+			ElMessage.success('新增成功')
+		} else {
+			await update(submitData)
+			ElMessage.success('更新成功')
+		}
+		visible.value = false
+		emit('success')
+	} finally {
+		submitting.value = false
+	}
+}
+
+// 加载详情
+async function loadDetail() {
+	if (!formData.value.id) return
+	const res = await getUser(formData.value.id)
+	const data = res?.data?.data ?? {}
+	// 处理 roleId
+	if (data.roleId) {
+		data.roleId = func.split(data.roleId)[0] || data.roleId
+	}
+	formData.value = data
+}
+
+// 打开弹框
+async function open({ mode, row } = {}) {
+	dialogMode.value = mode || 'add'
+	if (dialogMode.value === 'add') {
+		formData.value = initForm()
+	} else {
+		formData.value = { id: row.id }
+		await loadDetail()
+	}
+}
+
+onMounted(() => {
+	getRoleTreeData()
+	getDeptTreeData()
+})
+
+defineExpose({ open })
+</script>
+
+<style scoped lang="scss">
+.view-mode {
+	.view-item {
+		padding: 10px 0;
+		.label {
+			color: #606266;
+			font-weight: 500;
+		}
+	}
+}
+
+:deep(.el-select) {
+	width: 100%;
+}
+
+:deep(.el-date-editor) {
+	width: 100%;
+}
+
+:deep(.el-tree-select) {
+	width: 100%;
+}
+</style>
diff --git a/applications/drone-command/src/views/system/user/index.vue b/applications/drone-command/src/views/system/user/index.vue
new file mode 100644
index 0000000..af2de07
--- /dev/null
+++ b/applications/drone-command/src/views/system/user/index.vue
@@ -0,0 +1,504 @@
+<template>
+	<basic-container>
+		<!-- 左侧部门树 -->
+		<el-row :gutter="16" class="user-container">
+			<el-col :span="4">
+				<div class="tree-box">
+					<el-scrollbar>
+						<el-tree
+							:data="deptTree"
+							:props="deptTreeProps"
+							node-key="id"
+							:load="loadDeptTree"
+							lazy
+							@node-click="handleDeptNodeClick"
+						/>
+					</el-scrollbar>
+				</div>
+			</el-col>
+			<!-- 右侧列表区 -->
+			<el-col :span="20">
+				<!-- 搜索表单 -->
+				<el-form ref="queryParamsRef" :model="searchParams">
+					<el-row :gutter="16">
+						<el-col :span="5">
+							<el-form-item label="登录账号" prop="account">
+								<el-input v-model="searchParams.account" placeholder="请输入" clearable @clear="handleSearch" />
+							</el-form-item>
+						</el-col>
+						<el-col :span="5">
+							<el-form-item label="用户姓名" prop="realName">
+								<el-input v-model="searchParams.realName" placeholder="请输入" clearable @clear="handleSearch" />
+							</el-form-item>
+						</el-col>
+						<el-col :span="4">
+							<el-form-item>
+								<el-button @click="resetForm">重置</el-button>
+								<el-button type="primary" @click="handleSearch">查询</el-button>
+							</el-form-item>
+						</el-col>
+					</el-row>
+				</el-form>
+
+				<!-- 操作按钮 -->
+				<div class="btn-group">
+					<el-button v-if="permission.user_add && !auditMode" type="primary" @click="openForm('add')">新增</el-button>
+					<el-button
+						v-if="permission.user_delete && !auditMode"
+						type="danger"
+						:disabled="!selectedIds.length"
+						@click="handleDelete()"
+					>
+						删除
+					</el-button>
+					<el-button
+						v-if="userInfo.role_name?.includes('admin') && auditMode"
+						type="success"
+						:disabled="!selectedIds.length"
+						@click="handleAuditPass"
+					>
+						通过
+					</el-button>
+					<el-button
+						v-if="userInfo.role_name?.includes('admin') && auditMode"
+						type="danger"
+						:disabled="!selectedIds.length"
+						@click="handleAuditRefuse"
+					>
+						拒绝
+					</el-button>
+					<el-button
+						v-if="userInfo.role_name?.includes('admin') && auditMode"
+						type="primary"
+						plain
+						@click="handleAuditBack"
+					>
+						返回
+					</el-button>
+					<el-button
+						v-if="permission.user_role && !auditMode"
+						type="info"
+						plain
+						:disabled="!selectedIds.length"
+						@click="handleGrant"
+					>
+						角色配置
+					</el-button>
+					<el-button
+						v-if="permission.user_reset && !auditMode"
+						type="info"
+						plain
+						:disabled="!selectedIds.length"
+						@click="handleReset"
+					>
+						密码重置
+					</el-button>
+					<el-button
+						v-if="userInfo.role_name?.includes('admin') && !auditMode"
+						type="info"
+						plain
+						:disabled="!selectedIds.length"
+						@click="handleLock"
+					>
+						账号解封
+					</el-button>
+					<el-button
+						v-if="userInfo.role_name?.includes('admin') && !auditMode"
+						type="success"
+						plain
+						@click="handleImport"
+					>
+						导入
+					</el-button>
+					<el-button
+						v-if="userInfo.role_name?.includes('admin') && !auditMode"
+						type="warning"
+						plain
+						@click="handleExport"
+					>
+						导出
+					</el-button>
+				</div>
+
+				<!-- 用户列表 -->
+				<el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+					<el-table-column type="selection" width="55" />
+					<el-table-column type="index" width="60" label="序号" />
+					<el-table-column prop="account" label="登录账号" />
+					<el-table-column prop="realName" label="用户姓名" />
+					<el-table-column prop="roleName" label="所属角色">
+						<template v-slot="{ row }">
+							<el-tag v-if="row.roleName">{{ row.roleName }}</el-tag>
+						</template>
+					</el-table-column>
+					<el-table-column prop="deptName" label="所属部门">
+						<template v-slot="{ row }">
+							<el-tag v-if="row.deptName">{{ row.deptName }}</el-tag>
+						</template>
+					</el-table-column>
+					<el-table-column prop="phone" label="手机号码" />
+					<el-table-column label="操作" width="180">
+						<template v-slot="{ row }">
+							<el-link v-if="permission.user_view" @click="openForm('view', row)" type="primary">查看</el-link>
+							<el-link v-if="permission.user_edit && !auditMode" @click="openForm('edit', row)" type="warning">
+								编辑
+							</el-link>
+							<el-link v-if="permission.user_delete && !auditMode" @click="handleDelete(row)" type="danger">
+								删除
+							</el-link>
+						</template>
+					</el-table-column>
+				</el-table>
+
+				<!-- 分页 -->
+				<div>
+					<el-pagination
+						v-model:current-page="searchParams.current"
+						v-model:page-size="searchParams.size"
+						:total="total"
+						@change="getList"
+					/>
+				</div>
+			</el-col>
+		</el-row>
+
+		<!-- 用户表单弹框 -->
+		<FormDiaLog v-if="dialogVisible" v-model="dialogVisible" ref="dialogRef" @success="getList" />
+
+		<!-- 角色配置弹框 -->
+		<el-dialog title="用户角色配置" append-to-body v-model="roleBox" width="345px">
+			<el-tree
+				:data="roleGrantList"
+				show-checkbox
+				check-strictly
+				default-expand-all
+				node-key="id"
+				ref="treeRoleRef"
+				:default-checked-keys="roleTreeObj"
+				:props="roleProps"
+			></el-tree>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="roleBox = false">取 消</el-button>
+					<el-button type="primary" @click="submitRole">确 定</el-button>
+				</span>
+			</template>
+		</el-dialog>
+
+		<!-- 导入弹框 -->
+		<el-dialog title="用户数据导入" append-to-body v-model="excelBox" width="555px">
+			<el-form :model="excelForm" label-width="100px">
+				<el-form-item label="数据覆盖">
+					<el-switch v-model="excelForm.isCovered" :active-value="1" :inactive-value="0" />
+				</el-form-item>
+				<el-form-item label="模板上传">
+					<el-upload
+						:action="uploadAction"
+						:on-success="handleUploadSuccess"
+						accept=".xls,.xlsx"
+						:show-file-list="false"
+					>
+						<el-button type="primary">点击上传</el-button>
+					</el-upload>
+					<div class="upload-tip">请上传 .xls,.xlsx 标准格式文件</div>
+				</el-form-item>
+				<el-form-item label="模板下载">
+					<el-button type="primary" @click="handleTemplate">点击下载</el-button>
+				</el-form-item>
+			</el-form>
+		</el-dialog>
+	</basic-container>
+</template>
+
+<script setup>
+import { computed, nextTick, onMounted, ref } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { useStore } from 'vuex'
+import FormDiaLog from './FormDiaLog.vue'
+import { getList as getListApi, remove, grant, resetPassword, unlock, auditPass, auditRefuse } from '@/api/system/user'
+import { exportBlob } from '@/api/common'
+import { getDeptTree, getDeptLazyTree } from '@/api/system/dept'
+import { getRoleTree } from '@/api/system/role'
+import website from '@/config/website'
+import { getToken } from '@/utils/auth'
+import { downloadXls } from '@/utils/util'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import func from '@/utils/func'
+
+const store = useStore()
+const userInfo = computed(() => store.getters.userInfo)
+const permission = computed(() => store.getters.permission)
+
+// 初始化搜索参数
+const initSearchParams = () => ({
+	account: '',
+	realName: '',
+	current: 1,
+	size: 10,
+})
+
+const searchParams = ref(initSearchParams())
+const total = ref(0)
+const loading = ref(false)
+const list = ref([])
+const selectedIds = ref([])
+const selectionList = ref([])
+const queryParamsRef = ref(null)
+const dialogRef = ref(null)
+const dialogVisible = ref(false)
+const auditMode = ref(false)
+const treeDeptId = ref('')
+
+// 部门树
+const deptTree = ref([])
+const deptTreeProps = {
+	label: 'title',
+	children: 'children',
+	isLeaf: 'leaf',
+}
+
+// 角色配置
+const roleBox = ref(false)
+const roleGrantList = ref([])
+const roleTreeObj = ref([])
+const treeRoleRef = ref(null)
+const roleProps = {
+	label: 'title',
+	value: 'key',
+}
+
+// 导入相关
+const excelBox = ref(false)
+const excelForm = ref({
+	isCovered: 0,
+})
+const uploadAction = computed(() => `/blade-system/user/import-user?isCovered=${excelForm.value.isCovered}`)
+
+provide('treeDeptId', treeDeptId)
+
+// 加载部门树节点
+async function loadDeptTree(node, resolve) {
+	const parentId = node.level === 0 ? 0 : node.data.id
+	const param = {
+		parentId: parentId,
+		level: node.level,
+	}
+	const res = await getDeptLazyTree(param)
+	resolve(
+		res.data.data.map(item => ({
+			...item,
+			leaf: !item.hasChildren,
+		}))
+	)
+}
+
+// 部门节点点击
+function handleDeptNodeClick(data) {
+	treeDeptId.value = data.id
+	searchParams.value.current = 1
+	getList()
+}
+
+// 获取列表
+async function getList() {
+	loading.value = true
+	try {
+		const res = await getListApi(
+			searchParams.value.current,
+			searchParams.value.size,
+			{
+				account: searchParams.value.account,
+				realName: searchParams.value.realName,
+				status: auditMode.value ? 0 : 1,
+			},
+			treeDeptId.value
+		)
+		list.value = res?.data?.data?.records ?? []
+		total.value = res?.data?.data?.total ?? 0
+	} finally {
+		loading.value = false
+	}
+}
+
+// 查询
+function handleSearch() {
+	searchParams.value.current = 1
+	getList()
+}
+
+// 重置查询
+function resetForm() {
+	queryParamsRef.value?.resetFields()
+	searchParams.value = initSearchParams()
+	treeDeptId.value = ''
+	getList()
+}
+
+// 删除
+async function handleDelete(row) {
+	const tips = row ? '该条' : '选中的项'
+	await ElMessageBox.confirm(`确认删除${tips}吗?`, '提示', { type: 'warning' })
+	const ids = row ? row.id : selectedIds.value.join(',')
+	await remove(ids)
+	ElMessage.success('删除成功')
+	selectedIds.value = []
+	getList()
+}
+
+// 勾选值设置
+function handleSelectionChange(rows) {
+	selectionList.value = rows
+	selectedIds.value = rows.map(item => item.id)
+}
+
+// 角色配置
+async function handleGrant() {
+	if (selectedIds.value.length === 0) {
+		ElMessage.warning('请选择至少一条数据')
+		return
+	}
+	roleTreeObj.value = []
+	if (selectionList.value.length === 1) {
+		roleTreeObj.value = selectionList.value[0].roleId?.split(',') || []
+	}
+	const res = await getRoleTree()
+	roleGrantList.value = res.data.data
+	roleBox.value = true
+}
+
+// 提交角色配置
+async function submitRole() {
+	const roleList = treeRoleRef.value.getCheckedKeys().join(',')
+	await grant(selectedIds.value.join(','), roleList)
+	roleBox.value = false
+	ElMessage.success('操作成功')
+	getList()
+}
+
+// 密码重置
+async function handleReset() {
+	if (selectedIds.value.length === 0) {
+		ElMessage.warning('请选择至少一条数据')
+		return
+	}
+	await ElMessageBox.confirm('确定将选择账号密码重置为123456?', '提示', { type: 'warning' })
+	await resetPassword(selectedIds.value.join(','))
+	ElMessage.success('操作成功')
+}
+
+// 账号解封
+async function handleLock() {
+	if (selectedIds.value.length === 0) {
+		ElMessage.warning('请选择至少一条数据')
+		return
+	}
+	await ElMessageBox.confirm('确定将选择账号解封?', '提示', { type: 'warning' })
+	await unlock(selectedIds.value.join(','))
+	ElMessage.success('操作成功')
+}
+
+// 审核通过
+async function handleAuditPass() {
+	if (selectedIds.value.length === 0) {
+		ElMessage.warning('请选择至少一条数据')
+		return
+	}
+	await ElMessageBox.confirm('确定将选择数据通过审核?', '提示', { type: 'warning' })
+	await auditPass(selectedIds.value.join(','))
+	ElMessage.success('操作成功')
+	getList()
+}
+
+// 审核拒绝
+async function handleAuditRefuse() {
+	if (selectedIds.value.length === 0) {
+		ElMessage.warning('请选择至少一条数据')
+		return
+	}
+	await ElMessageBox.confirm('确定将选择数据拒绝审核?', '提示', { type: 'warning' })
+	await auditRefuse(selectedIds.value.join(','))
+	ElMessage.success('操作成功')
+	getList()
+}
+
+// 返回正常模式
+function handleAuditBack() {
+	auditMode.value = false
+	getList()
+}
+
+// 导入
+function handleImport() {
+	excelBox.value = true
+}
+
+// 上传成功
+function handleUploadSuccess() {
+	excelBox.value = false
+	getList()
+	ElMessage.success('导入成功')
+}
+
+// 导出
+function handleExport() {
+	const account = func.toStr(searchParams.value.account)
+	const realName = func.toStr(searchParams.value.realName)
+	ElMessageBox.confirm('是否导出用户数据?', '提示', { type: 'warning' }).then(() => {
+		NProgress.start()
+		exportBlob(
+			`/blade-system/user/export-user?${website.tokenHeader}=${getToken()}&account=${account}&realName=${realName}`
+		).then(res => {
+			downloadXls(res.data, `用户数据表${new Date().toISOString().slice(0, 10)}.xlsx`)
+			NProgress.done()
+		})
+	})
+}
+
+// 下载模板
+function handleTemplate() {
+	exportBlob(`/blade-system/user/export-template?${website.tokenHeader}=${getToken()}`).then(res => {
+		downloadXls(res.data, '用户数据模板.xlsx')
+	})
+}
+
+// 新增/编辑/查看 弹框
+function openForm(mode, row) {
+	dialogVisible.value = true
+	nextTick(() => {
+		dialogRef.value?.open({ mode, row })
+	})
+}
+
+onMounted(() => {
+	getList()
+})
+</script>
+
+<style scoped lang="scss">
+.user-container {
+	height: 100%;
+}
+
+.tree-box {
+	height: 100%;
+	padding: 10px;
+	border-radius: 5px;
+	background-color: #fff;
+	box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+
+	:deep(.el-scrollbar) {
+		height: 100%;
+	}
+}
+
+.btn-group {
+	margin-bottom: 16px;
+}
+
+.upload-tip {
+	color: #999;
+	font-size: 12px;
+	margin-top: 8px;
+}
+</style>
diff --git a/uniapps/work-wx/src/pages.json b/uniapps/work-wx/src/pages.json
index 98d5c7d..44584ee 100644
--- a/uniapps/work-wx/src/pages.json
+++ b/uniapps/work-wx/src/pages.json
@@ -11,8 +11,7 @@
 		{
 			"path": "pages/page/index",
 			"style": {
-				"navigationBarTitleText": "首页",
-				"navigationStyle": "custom"
+				"navigationBarTitleText": "首页"
 			}
 		},
 		{
@@ -24,23 +23,20 @@
 		{
 			"path": "pages/equipmentManagement/index",
 			"style": {
-				"navigationBarTitleText": "设备管理",
-				"navigationStyle": "custom"
+				"navigationBarTitleText": "设备管理"
 			}
 		},
 		{
 			"path": "pages/legalPolicy/index",
 			"style": {
-				"navigationBarTitleText": "法律政策",
-				"navigationStyle": "custom"
+				"navigationBarTitleText": "法律政策"
 			}
 		},
 
 		{
 			"path": "pages/user/index",
 			"style": {
-				"navigationBarTitleText": "我的",
-				"navigationStyle": "custom"
+				"navigationBarTitleText": "我的"
 			}
 		},
     {
@@ -101,13 +97,6 @@
 					}
 				},
 				{
-					"path": "workDetail/mapWork/index",
-					"style": {
-						"navigationBarTitleText": "地图展示",
-						"navigationStyle": "custom"
-					}
-				},
-				{
 					"path": "userDetail/infos/index",
 					"style": {
 						"navigationBarTitleText": "个人资料"
@@ -135,26 +124,26 @@
 		"backgroundColor": "#ffffff",
 		"list": [
 			{
-				"iconPath": "static/images/tabbar/icon_order.png",
-				"selectedIconPath": "static/images/tabbar/icon_order_selected.png",
+				"iconPath": "static/images/tabbar/home.png",
+				"selectedIconPath": "static/images/tabbar/home-selected.png",
 				"pagePath": "pages/page/index",
 				"text": "首页"
 			},
 			{
-				"iconPath": "static/images/tabbar/icon_order.png",
-				"selectedIconPath": "static/images/tabbar/icon_order_selected.png",
+				"iconPath": "static/images/tabbar/sbgl.png",
+				"selectedIconPath": "static/images/tabbar/sbgl-selected.png",
 				"pagePath": "pages/equipmentManagement/index",
 				"text": "设备管理"
 			},
 			{
-				"iconPath": "static/images/tabbar/icon_home1.png",
-				"selectedIconPath": "static/images/tabbar/icon_home_selected.png",
+				"iconPath": "static/images/tabbar/flzc.png",
+				"selectedIconPath": "static/images/tabbar/flzc-selected.png",
 				"pagePath": "pages/legalPolicy/index",
 				"text": "法律政策"
 			},
 			{
-				"iconPath": "static/images/tabbar/icon_me.png",
-				"selectedIconPath": "static/images/tabbar/icon_me_selected.png",
+				"iconPath": "static/images/tabbar/my.png",
+				"selectedIconPath": "static/images/tabbar/my-selected.png",
 				"pagePath": "pages/user/index",
 				"text": "我的"
 			}
diff --git a/uniapps/work-wx/src/pages/equipmentManagement/index.vue b/uniapps/work-wx/src/pages/equipmentManagement/index.vue
index b681daf..4f55c62 100644
--- a/uniapps/work-wx/src/pages/equipmentManagement/index.vue
+++ b/uniapps/work-wx/src/pages/equipmentManagement/index.vue
@@ -24,8 +24,8 @@
 <script setup>
 import { reactive, ref } from 'vue'
 import lbPng from '@/static/images/lb.png'
-import addSvg from '@/static/images/add.svg'
-import droneSvg from '@/static/images/drone.svg'
+import addSvg from '@/static/images/add.png'
+import droneSvg from '@/static/images/drone.png'
 import { myDevicePageInfoApi, aircraftInfoPageInfoOfMyApi } from '@/api/index.js'
 const equipmentList = ref([])
 const noticeTitle = ref('')
@@ -35,11 +35,10 @@
   try {
     const res = await aircraftInfoPageInfoOfMyApi({
       current: 1,
-      size: 10,
+      size: 99,
       model:'',
       name: '',
     })
-    console.log(8888888,res.data.data.records)
     equipmentList.value = res.data.data.records || []
   } catch (error) {
     console.error('获取设备列表失败:', error)
@@ -73,7 +72,7 @@
   height: 100%;
   display: flex;
   flex-direction: column;
-  .u-search {
+  :deep(.u-search) {
     padding: 10px 20px;
     height: 68rpx;
     flex: 0;
diff --git a/uniapps/work-wx/src/pages/legalPolicy/index.vue b/uniapps/work-wx/src/pages/legalPolicy/index.vue
index 486ee56..ec6b766 100644
--- a/uniapps/work-wx/src/pages/legalPolicy/index.vue
+++ b/uniapps/work-wx/src/pages/legalPolicy/index.vue
@@ -96,7 +96,7 @@
   display: flex;
   flex-direction: column;
   
-   .u-search {
+   :deep(.u-search) {
     padding: 10px 20px;
     height: 68rpx;
     flex: 0;
diff --git a/uniapps/work-wx/src/pages/login/index.vue b/uniapps/work-wx/src/pages/login/index.vue
index 40aa57e..2962df3 100644
--- a/uniapps/work-wx/src/pages/login/index.vue
+++ b/uniapps/work-wx/src/pages/login/index.vue
@@ -9,24 +9,25 @@
         <input v-model="loginForm.username" placeholder="请输入用户名" />
       </div>
       <div class="pass-word">
-        <input v-model="loginForm.password" :type="isShowPassword ? 'text' : 'password'" placeholder="请输入密码"/>
+        <u-input type="password" border="bottom" v-model="loginForm.password" placeholder="请输入密码"></u-input>
+        <!-- <input v-model="loginForm.password" :type="isShowPassword ? 'text' : 'password'" placeholder="请输入密码"/>
         <image v-if="!isShowPassword" :src="showPasswordSvg" @click="isShowPassword = !isShowPassword" />
-        <image v-else :src="showPsdSvg"  @click="isShowPassword = !isShowPassword" />
+        <image v-else :src="showPsdSvg"  @click="isShowPassword = !isShowPassword" /> -->
       </div>
     </view>
     <div class="remember-password">
       <view class="remember">
-        <checkbox-group @change="toggleRemember">
+        <!-- <checkbox-group @change="toggleRemember">
           <checkbox
             :checked="rememberPassword"
             color="#1D6FE9"
             style="transform: scale(0.7)"
           />
         </checkbox-group>
-        记住密码
+        记住密码 -->
       </view>
-      <view class="forget">
-        忘记密码
+      <view class="forget" @click="forgetClick">
+        忘记密码?
       </view>
     </div>
     <button class="login-btn" :style="[inputStyle]" @tap="submit">登录</button>
@@ -43,10 +44,8 @@
 import { HOME_PATH, LOGIN_PATH, removeQueryString } from "@/router";
 import { ref } from "vue";
 
-import logoSvg from "@/static/images/logo.svg";
-import droneLogSvg from "@/static/images/user/droneLogo.svg";
-import showPsdSvg from "@/static/images/user/showPsd.svg";
-import showPasswordSvg from "@/static/images/show-password.svg";
+import logoSvg from "@/static/images/logo.png";
+import droneLogSvg from "@/static/images/user/droneLogo.png";
 
 const droneSvg = getAssetsImage("/images/login/droneSvg.svg");
 const usernameSvg = getAssetsImage("/images/login/username.svg");
@@ -151,6 +150,12 @@
   });
 }
 
+function forgetClick() {
+  uni.navigateTo({
+    url: "/subPackages/userDetail/password/index",
+  });
+}
+
 // 从本地存储加载记住的密码
 onMounted(() => {
   const savedUserInfo = uni.getStorageSync("rememberedUser");
@@ -176,8 +181,8 @@
   width: 100%;
 
   .logo {
-    width: 127px;
-    height: 51px;
+    width: 67px;
+    height: 67px;
     margin: 0 auto;
     margin-top: 162px;
     margin-bottom: 16px;
diff --git a/uniapps/work-wx/src/pages/page/index.vue b/uniapps/work-wx/src/pages/page/index.vue
index 29b4624..57a6161 100644
--- a/uniapps/work-wx/src/pages/page/index.vue
+++ b/uniapps/work-wx/src/pages/page/index.vue
@@ -71,10 +71,10 @@
 <script setup>
   import { onMounted, reactive, ref } from 'vue'
   import lbPng from '@/static/images/lb.png'
-  import kyxxPng from '@/static/images/kyxx.svg'
-  import fxsqPng from '@/static/images/fxsq.svg'
-  import flfgPng from '@/static/images/flfg.svg'
-  import zczdPng from '@/static/images/zczd.svg'
+  import kyxxPng from '@/static/images/kyxx.png'
+  import fxsqPng from '@/static/images/fxsq.png'
+  import flfgPng from '@/static/images/flfg.png'
+  import zczdPng from '@/static/images/zczd.png'
   import docSvg from '@/static/images/doc.png'
   import { sysNoticePageInfoApi, flightAirspacePageInfoApi } from '@/api/index'
 const lbList = reactive([]);
@@ -225,8 +225,8 @@
   height: 100%;
   display: flex;
   flex-direction: column;
-  .u-grid {
-    margin-top: 20px;
+  :deep(.u-grid) {
+    margin-top: 40rpx;
     .grid-text {
       font-family: Source Han Sans CN, Source Han Sans CN;
       font-weight: 500;
diff --git a/uniapps/work-wx/src/pages/register/index.vue b/uniapps/work-wx/src/pages/register/index.vue
index 19679db..ffb2067 100644
--- a/uniapps/work-wx/src/pages/register/index.vue
+++ b/uniapps/work-wx/src/pages/register/index.vue
@@ -4,7 +4,7 @@
         <view class="pageBg"></view>
         <view class="content">
            <view class="row">
-             <view class="label"><span>*</span>手机号码</view>
+             <view class="label"><span class="required">*</span>手机号码</view>
              <view class="input">
                 <u-input input-align="right" border="bottom" v-model="formParams.userName" placeholder="请输入手机号码"></u-input>
              </view>
@@ -16,23 +16,23 @@
              </view>
            </view>
            <view class="row">
-            <view class="label"><span>*</span>密码</view>
+            <view class="label"><span class="required">*</span>密码</view>
              <view class="input">
                 <u-input type="password" input-align="right" border="bottom" v-model="formParams.password" placeholder="请输入密码"></u-input>
              </view>
            </view>
            <view class="row">
-            <view class="label"><span>*</span>确认密码</view>
+            <view class="label"><span class="required">*</span>确认密码</view>
              <view class="input">
                 <u-input type="password" input-align="right" border="bottom" v-model="formParams.password2" placeholder="请确认密码"></u-input>
              </view>
            </view>
            <view class="row">
-            <view class="label"><span>*</span>验证码</view>
+            <view class="label"><span class="required">*</span>验证码</view>
              <view class="input">
                 <u-input input-align="right" border="bottom" v-model="formParams.code" placeholder="请输入验证码"></u-input>
              </view>
-             <u-button class="getCode" :disabled="countDown > 0" @click="sendVerificationCode" type="primary" color="#007AFF">
+             <u-button :disabled="countDown > 0" @click="sendVerificationCode" type="primary" color="#007AFF">
                 {{ countDown > 0 ? `${countDown}s后重发` : '获取验证码' }}
             </u-button>
            </view>
@@ -214,7 +214,7 @@
 		left: 0;
 		width: 100%;
 		height: 100%;
-		background: url("@/static/images/user/userbg.svg")  no-repeat ;
+		background-image: url("../../static/images/user/userbg.svg")  no-repeat ;
         background-size: 100%;
 	}
     .content {
@@ -238,7 +238,7 @@
             font-weight: 400;
             font-size: 15px;
             color: #222324;
-            span {
+            .required {
                 color: #FF4444;
             }
         }
@@ -251,15 +251,19 @@
         :deep(.u-icon--right) {
             display: none;
         }
-        .getCode {
+        :deep(.u-button) {
             width: 180rpx;
         }
     }
     .register {
-        position: fixed;
-        left: 24rpx;
-        right: 24rpx;
-        bottom: 126rpx;
+        :deep(.u-button) {
+            position: fixed;
+            left: 24rpx;
+            right: 24rpx;
+            bottom: 126rpx;
+            width: 80% !important;
+            height: 100rpx !important;
+        }
     }
 }
 </style>
diff --git a/uniapps/work-wx/src/pages/user/index.vue b/uniapps/work-wx/src/pages/user/index.vue
index 20ddaf9..29d8c39 100644
--- a/uniapps/work-wx/src/pages/user/index.vue
+++ b/uniapps/work-wx/src/pages/user/index.vue
@@ -55,7 +55,7 @@
 import { getDeviceRegionApi } from "@/api/map.js";
 import defaultAvatar  from '/static/images/defaultAvatar.svg'
 import rightImage from '@/static/images/user/rightBtn.svg';
-import showDefaultHeader from "@/static/images/user/default-header.svg";
+import showDefaultHeader from "@/static/images/user/default-header.png";
 const { setClipboardData, getClipboardData } = useClipboard();
 //
 // const rightImage = getAssetsImage("/images/user/rightBtn.svg");
@@ -100,7 +100,7 @@
   height: 100%;
 }
 .pageUser {
-  background: url("@/static/images/user/userbg.svg")  no-repeat;
+  background-image: url("../../static/images/user/userbg.svg")  no-repeat;
   background-size: 100%;
 }
 .userBox {
diff --git a/uniapps/work-wx/src/static/images/fly-apply.svg b/uniapps/work-wx/src/static/images/fly-apply.svg
deleted file mode 100644
index 5a8e836..0000000
--- a/uniapps/work-wx/src/static/images/fly-apply.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g id="Group 1321318767">
-<g id="Group 1321318768">
-<foreignObject x="0" y="-4" width="64" height="68"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_92_2794_clip_path);height:100%;width:100%"></div></foreignObject><g id="Rectangle 346241139" filter="url(#filter0_d_92_2794)" data-figma-bg-blur-radius="4">
-<rect x="4" width="56" height="56" rx="8" fill="white" fill-opacity="0.37" shape-rendering="crispEdges"/>
-</g>
-<g id="Frame">
-<path id="Vector" d="M46.0051 28.4331H27.0608V46.5015H46.0051V28.4331Z" fill="white" fill-opacity="0.01"/>
-<path id="Vector_2" d="M14.6179 43.612V12.075C14.6174 11.8474 14.6643 11.6218 14.7561 11.4114C14.8478 11.201 14.9825 11.0098 15.1525 10.8488C15.3225 10.6878 15.5244 10.5602 15.7466 10.4733C15.9688 10.3865 16.207 10.342 16.4474 10.3425H43.7885C44.0288 10.3423 44.2668 10.3869 44.4889 10.4739C44.711 10.5609 44.9128 10.6885 45.0827 10.8494C45.2526 11.0103 45.3874 11.2014 45.4792 11.4117C45.5711 11.622 45.6182 11.8474 45.6179 12.075V24.3904L27.3466 40.8915V45.3425H16.4474C16.2071 45.3428 15.9692 45.2981 15.7473 45.2111C15.5253 45.1241 15.3236 44.9965 15.1539 44.8356C14.9841 44.6746 14.8496 44.4835 14.758 44.2732C14.6663 44.0629 14.6195 43.8375 14.62 43.6101L14.6179 43.612ZM20.2421 18.1278C20.2418 18.2812 20.2736 18.4331 20.3355 18.5748C20.3974 18.7166 20.4883 18.8453 20.6029 18.9537C20.7176 19.0621 20.8537 19.1479 21.0035 19.2063C21.1532 19.2647 21.3137 19.2945 21.4757 19.294H37.512C37.8388 19.294 38.1523 19.171 38.3835 18.9521C38.6146 18.7332 38.7445 18.4364 38.7445 18.1268C38.7445 17.8172 38.6146 17.5204 38.3835 17.3015C38.1523 17.0826 37.8388 16.9596 37.512 16.9596H21.4757C21.3135 16.9591 21.1529 16.9889 21.003 17.0475C20.8531 17.106 20.7168 17.192 20.6022 17.3006C20.4875 17.4092 20.3967 17.5382 20.3349 17.6801C20.2731 17.8221 20.2416 17.9742 20.2421 18.1278ZM21.4757 23.6895C21.1491 23.6901 20.8359 23.813 20.6048 24.0316C20.3736 24.2501 20.2432 24.5464 20.2421 24.8557C20.2416 25.0092 20.2731 25.1613 20.3349 25.3031C20.3968 25.445 20.4876 25.5738 20.6023 25.6822C20.717 25.7907 20.8532 25.8765 21.0031 25.9348C21.153 25.9931 21.3136 26.0227 21.4757 26.0219H32.6614C32.9456 26.0204 33.2206 25.9259 33.4398 25.7545C33.659 25.5831 33.809 25.3452 33.8643 25.0811C33.9196 24.8171 33.8769 24.543 33.7434 24.3053C33.61 24.0676 33.3939 23.8809 33.1318 23.7767C32.9818 23.7187 32.8213 23.6891 32.6593 23.6895H21.4757ZM20.2421 31.5857C20.2418 31.7391 20.2736 31.891 20.3355 32.0327C20.3974 32.1745 20.4883 32.3032 20.6029 32.4116C20.7176 32.52 20.8537 32.6058 21.0035 32.6642C21.1532 32.7226 21.3137 32.7524 21.4757 32.7519H27.7815C28.1074 32.749 28.4193 32.6262 28.6512 32.4093C28.7934 32.2732 28.8985 32.1064 28.9575 31.9232C29.0165 31.7401 29.0276 31.5461 28.9899 31.358C28.9593 31.2075 28.8973 31.0644 28.8076 30.9369C28.7178 30.8094 28.6021 30.7001 28.4673 30.6155C28.2644 30.4866 28.0257 30.4177 27.7815 30.4175H21.4736C21.2708 30.4166 21.0709 30.4635 20.892 30.5541C20.7132 30.6447 20.5609 30.776 20.4491 30.9362C20.3133 31.1284 20.2413 31.3545 20.2421 31.5857Z" fill="url(#paint0_linear_92_2794)"/>
-<g id="Vector_3" filter="url(#filter1_i_92_2794)">
-<path d="M43.1893 30.3224L47.4113 33.9083L49.2954 32.101C49.3972 32.0162 49.4783 31.9137 49.5338 31.7998C49.5893 31.6859 49.6179 31.563 49.6179 31.4388C49.6179 31.3147 49.5893 31.1918 49.5338 31.0779C49.4783 30.964 49.3972 30.8615 49.2954 30.7767L46.7575 28.6186C46.5477 28.438 46.2662 28.3388 45.9746 28.3426C45.6838 28.3447 45.4044 28.4438 45.1917 28.6205L43.1893 30.3224ZM29.6179 45.3425H33.8507L46.08 34.8436L41.858 31.2501L29.6201 41.7566V45.3406L29.6179 45.3425Z" fill="#409D84"/>
-</g>
-</g>
-</g>
-</g>
-<defs>
-<filter id="filter0_d_92_2794" x="0" y="-4" width="64" height="68" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
-<feFlood flood-opacity="0" result="BackgroundImageFix"/>
-<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
-<feOffset dy="4"/>
-<feGaussianBlur stdDeviation="2"/>
-<feComposite in2="hardAlpha" operator="out"/>
-<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0.082532 0 0 0 0 0.495192 0 0 0 0.12 0"/>
-<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_92_2794"/>
-<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_92_2794" result="shape"/>
-</filter>
-<clipPath id="bgblur_0_92_2794_clip_path" transform="translate(0 4)"><rect x="4" width="56" height="56" rx="8"/>
-</clipPath><filter id="filter1_i_92_2794" x="29.6179" y="28.3425" width="21" height="18" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
-<feFlood flood-opacity="0" result="BackgroundImageFix"/>
-<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
-<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
-<feOffset dx="1" dy="1"/>
-<feGaussianBlur stdDeviation="1.2"/>
-<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
-<feColorMatrix type="matrix" values="0 0 0 0 0.0028199 0 0 0 0 0.293269 0 0 0 0 0.12384 0 0 0 0.32 0"/>
-<feBlend mode="normal" in2="shape" result="effect1_innerShadow_92_2794"/>
-</filter>
-<linearGradient id="paint0_linear_92_2794" x1="30.1179" y1="10.3425" x2="30.1179" y2="45.3425" gradientUnits="userSpaceOnUse">
-<stop stop-color="#4263D5"/>
-<stop offset="1" stop-color="#A4C1F6"/>
-</linearGradient>
-</defs>
-</svg>
diff --git a/uniapps/work-wx/src/static/images/logo.png b/uniapps/work-wx/src/static/images/logo.png
index b5771e2..fad3549 100644
--- a/uniapps/work-wx/src/static/images/logo.png
+++ b/uniapps/work-wx/src/static/images/logo.png
Binary files differ
diff --git a/uniapps/work-wx/src/static/images/user/droneLogo.png b/uniapps/work-wx/src/static/images/user/droneLogo.png
new file mode 100644
index 0000000..4da1626
--- /dev/null
+++ b/uniapps/work-wx/src/static/images/user/droneLogo.png
Binary files differ
diff --git a/uniapps/work-wx/src/static/images/zczd.svg b/uniapps/work-wx/src/static/images/zczd.svg
deleted file mode 100644
index e2ec49b..0000000
--- a/uniapps/work-wx/src/static/images/zczd.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-<svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g id="Frame" clip-path="url(#clip0_77_1174)">
-<path id="Vector" d="M23.2143 4.30487V4.86201C23.1581 4.98582 23.1019 5.04773 23.0457 5.17154C22.8772 5.35725 22.6524 5.41915 22.4277 5.41915H6.47043C5.96474 5.41915 5.57143 4.98582 5.57143 4.49058C5.57143 4.24296 5.6838 3.99534 5.85236 3.80963C6.02093 3.62392 6.24568 3.56201 6.47043 3.56201H22.3715C22.7648 3.56201 23.0457 3.80963 23.2143 4.11915V4.30487Z" fill="url(#paint0_linear_77_1174)"/>
-<path id="Vector_2" d="M23.2143 2.14918V1.23381V1.06218C23.2143 0.890544 23.0457 0.776123 22.8771 0.776123H6.18477C3.88045 0.776123 1.96955 2.49244 1.85714 4.60923V21.3147C2.13815 23.3171 3.93665 24.919 6.12857 24.919H22.8209C22.9895 24.919 23.1581 24.7473 23.1581 24.5757V7.64139C23.1581 7.41255 22.9895 7.24092 22.7647 7.29813H13.3788V12.9048C13.3788 13.3052 13.2101 13.7057 12.8729 13.9346C12.7043 14.049 12.4795 14.1062 12.2547 14.1062C12.0861 14.1062 11.9175 14.049 11.8051 13.9918L9.27594 12.6759L6.803 13.9346C6.46579 14.1062 6.07236 14.1062 5.73515 13.8773C5.45413 13.6485 5.22932 13.248 5.22932 12.8476V7.46976C5.22932 7.35534 5.22932 7.24092 5.28552 7.1265C4.33007 6.78323 3.65564 5.92507 3.65564 4.89528C3.65564 3.57944 4.7797 2.49244 6.18477 2.49244H22.7647C22.9895 2.49244 23.2143 2.32081 23.2143 2.14918Z" fill="url(#paint1_linear_77_1174)"/>
-<path id="Vector_3" d="M7.06031 11.5785V7.91968H11.6485H11.7032V11.634L11.6485 11.6055L11.6485 11.634L9.73678 10.6361C9.63366 10.5838 9.48187 10.5315 9.32735 10.5258C9.17813 10.5315 9.07213 10.5838 8.91745 10.6361L7.06031 11.5785Z" fill="#2EB28E"/>
-</g>
-<defs>
-<linearGradient id="paint0_linear_77_1174" x1="14.3929" y1="3.56201" x2="14.3929" y2="5.41915" gradientUnits="userSpaceOnUse">
-<stop stop-color="#1E66E9"/>
-<stop offset="1" stop-color="#5AB3FA"/>
-</linearGradient>
-<linearGradient id="paint1_linear_77_1174" x1="12.5357" y1="0.776123" x2="12.5357" y2="24.919" gradientUnits="userSpaceOnUse">
-<stop stop-color="#1E66E9"/>
-<stop offset="1" stop-color="#5AB3FA"/>
-</linearGradient>
-<clipPath id="clip0_77_1174">
-<rect width="26" height="26" fill="white"/>
-</clipPath>
-</defs>
-</svg>
diff --git a/uniapps/work-wx/src/subPackages/deviceRegistration/add.vue b/uniapps/work-wx/src/subPackages/deviceRegistration/add.vue
index e15b689..3f85b95 100644
--- a/uniapps/work-wx/src/subPackages/deviceRegistration/add.vue
+++ b/uniapps/work-wx/src/subPackages/deviceRegistration/add.vue
@@ -220,53 +220,54 @@
                     placeholder="请输入"
             ></u-input>
         </u-form-item>
-        <u-button class="submit-button-wrapper" color="#1D6FE9" size="large" @click="submitForm">
-            注册
-        </u-button>
-            <!-- 飞行器型号 -->
-    <u-picker
-        :show="showType"
-        :columns="[typeList]"
-        keyName="label"
-        @confirm="onPickerConfirmType"
-        @cancel="showType = false"
-    />
-    <!-- 飞行器厂商 -->
-    <u-picker
-        :show="showManufacturer"
-        :columns="[manufacturerList]"
-        keyName="label"
-        @confirm="onPickerConfirmManufacturer"
-        @cancel="showManufacturer = false"
-    />
-    <u-picker
-        :show="showIsModified"
-        :columns="[actionsModified]"
-        keyName="label"
-        @confirm="onPickerConfirm"
-        @cancel="showIsModified = false"
-    />
-    <u-picker
-        :show="showHasInsurance"
-        :columns="[actionsHasInsurance]"
-        keyName="label"
-        @confirm="onPickerConfirmHasInsurance"
-        @cancel="showHasInsurance = false"
-    />
-    <u-datetime-picker
-      :show="showPurchaseDate"
-      v-model="birthdayValue"
-      mode="date"
-      @confirm="onPurchaseDate"
-      @cancel="showPurchaseDate = false"
-    />
-    <!-- 所属区域 -->
-     <u-cascader 
-        show="show"
-        v-model="value"
-        :data="areaData"
-    ></u-cascader>
+        <!-- 飞行器型号 -->
+        <u-picker
+            :show="showType"
+            :columns="[typeList]"
+            keyName="label"
+            @confirm="onPickerConfirmType"
+            @cancel="showType = false"
+        />
+        <!-- 飞行器厂商 -->
+        <u-picker
+            :show="showManufacturer"
+            :columns="[manufacturerList]"
+            keyName="label"
+            @confirm="onPickerConfirmManufacturer"
+            @cancel="showManufacturer = false"
+        />
+        <u-picker
+            :show="showIsModified"
+            :columns="[actionsModified]"
+            keyName="label"
+            @confirm="onPickerConfirm"
+            @cancel="showIsModified = false"
+        />
+        <u-picker
+            :show="showHasInsurance"
+            :columns="[actionsHasInsurance]"
+            keyName="label"
+            @confirm="onPickerConfirmHasInsurance"
+            @cancel="showHasInsurance = false"
+        />
+        <u-datetime-picker
+        :show="showPurchaseDate"
+        v-model="birthdayValue"
+        mode="date"
+        @confirm="onPurchaseDate"
+        @cancel="showPurchaseDate = false"
+        />
+        <!-- 所属区域 -->
+        <u-cascader 
+            show="show"
+            v-model="value"
+            :data="areaData"
+        ></u-cascader>
     </u-form>
+    <u-button @click="submitForm" color="#1D6FE9">提交</u-button>
+    <!-- <u-button class="submit-button-wrapper" color="#1D6FE9" size="large" @click="submitForm">
+            注册
+        </u-button> -->
 </view>
 </template>
 <script setup>
@@ -585,9 +586,11 @@
         padding: 24rpx;
     }
 
-    .submit-button-wrapper {
+    :deep(.u-button) {
+        width: 80%;
         padding: 28rpx;
         border-radius: 8rpx 8rpx 8rpx 8rpx;
+        margin-bottom: 20rpx;
     }
     
     :deep(.u-form-item) {
diff --git a/uniapps/work-wx/src/subPackages/flightApplication/add.vue b/uniapps/work-wx/src/subPackages/flightApplication/add.vue
index e350718..02c5d54 100644
--- a/uniapps/work-wx/src/subPackages/flightApplication/add.vue
+++ b/uniapps/work-wx/src/subPackages/flightApplication/add.vue
@@ -290,13 +290,9 @@
                 ></up-icon>
             </template>
         </u-form-item>
-        <u-button class="submit-button-wrapper" color="#1D6FE9" size="large" @click="submitForm">
+        <!-- <u-button class="submit-button-wrapper" color="#1D6FE9" size="large" @click="submitForm">
             飞行申请
-        </u-button>
-        <!-- 飞任务类型 -->
-        <view class="attention">
-            注:新增空域/航线/飞手等前往吉安市低空经济服务一体化
-        </view>
+        </u-button> -->
     <u-picker
         :show="isShowFlightTaskType"
         :columns="[actionsFlightTaskType]"
@@ -377,7 +373,11 @@
         @cancel="isShowFlightRouteInfo = false"
     />
     </u-form>
-    
+    <u-button @click="submitForm" color="#1D6FE9">飞行申请</u-button>
+    <!-- 飞任务类型 -->
+    <view class="attention">
+        注:新增空域/航线/飞手等前往吉安市低空经济服务一体化
+    </view>
 </view>
 </template>
 <script setup>
@@ -751,6 +751,20 @@
         margin-bottom: 24rpx;
         padding-left: 0rpx !important;
     }
+    :deep(.u-button) {
+        width: 80%;
+        padding: 28rpx;
+        border-radius: 8rpx 8rpx 8rpx 8rpx;
+        margin-bottom: 20rpx;
+    }
+    .attention {
+        font-family: Source Han Sans CN, Source Han Sans CN;
+        font-weight: 400;
+        font-size: 12px;
+        color: #1D6FE9;
+        //  margin-top: 24rpx;
+        text-align: center;
+    }
     .select-wrapper {
         position: relative;
         width: 100%;
@@ -785,13 +799,6 @@
         // width: 80%;
         // height: 100rpx;
         border-radius: 8rpx 8rpx 8rpx 8rpx;
-    }
-    .attention {
-        font-family: Source Han Sans CN, Source Han Sans CN;
-        font-weight: 400;
-        font-size: 12px;
-        color: #1D6FE9;
-         margin-top: 24rpx;
     }
     :deep(.u-form-item) {
         margin-bottom: 40rpx;
diff --git a/uniapps/work-wx/src/subPackages/flightApplication/index.vue b/uniapps/work-wx/src/subPackages/flightApplication/index.vue
index 546e569..4a10046 100644
--- a/uniapps/work-wx/src/subPackages/flightApplication/index.vue
+++ b/uniapps/work-wx/src/subPackages/flightApplication/index.vue
@@ -33,10 +33,10 @@
 </view>
 </template>
 <script setup>
-    import spSvg from '@/static/images/sp.svg'
+    import spSvg from '@/static/images/sp.png'
     import { flightPlanPageInfoApi } from '@/api/index.js'
-    import fxsqSvg from '@/static/images/fly-apply.svg'
-    import mysbSvg from '@/static/images/my-sb.svg'
+    import fxsqSvg from '@/static/images/fly-apply.png'
+    import mysbSvg from '@/static/images/my-sb.png'
 import { ref } from 'vue'
 
 
@@ -130,7 +130,7 @@
     .header-top {
         width: 100%;
         height: 350rpx;
-        background: url('@/static/images/fxsq-bg.png') no-repeat center center;
+        background: url('@/static/images/fxsq-bg.png') no-repeat center;
         background-size: 100% 100%;
         position: fixed;
         top: 0;
@@ -170,7 +170,7 @@
             }
         }
     }
-     .u-search {
+     :deep(.u-search) {
         position: absolute;
         width: 90%;
         left: 50%;
diff --git a/uniapps/work-wx/src/subPackages/regulationsDetail/copy.vue b/uniapps/work-wx/src/subPackages/regulationsDetail/copy.vue
deleted file mode 100644
index 085ec63..0000000
--- a/uniapps/work-wx/src/subPackages/regulationsDetail/copy.vue
+++ /dev/null
@@ -1,127 +0,0 @@
-<template>
-    <view class="regulationsDetail" @click="handleRetry">
-        <view class="title">
-            {{ title }}
-        </view>
-        <!-- <u-parse 
-            :content="htmlContent"
-            :tagStyle="tagStyles"
-            @preview="handlePreview"
-            @navigate="handleNavigate"
-            /> -->
-        <!-- <view v-for="item in fileList" :key="item.id">
-            <image :src="fjSvg" class="fj-icon" />
-            <view class="fj-name">{{ item.fileName }}</view>
-            <view class="fj-size">{{ item.createTime }}</view>
-        </view> -->
-    </view>
-</template>
-<script setup>
-    import fjSvg from '@/components/fj.svg'
-import { ref, onMounted, onUnmounted } from 'vue'
-import { regulationsDetailApi } from '@/api/index'
-const formParams = ref({
-    id: '',
-})
-const htmlContent = ref('<p>暂无数据</p>')
-const title = ref('')
-const tagStyles = ref({})
-onMounted(() => {
-    console.log('onMounted 开始执行')
-    try {
-        // 获取当前页面(最后一个元素)而不是第一个页面
-        const pages = getCurrentPages()
-        const currentPage = pages[pages.length - 1]
-        
-        // 尝试获取ID参数
-        const id = currentPage.options.id
-        const type = currentPage.options.type
-        
-        if (id) {
-            formParams.value.id = id
-            // 设置默认标题
-            title.value = '法律政策详情'
-            
-            // 使用setTimeout延迟执行API调用,避免页面跳转时的网络请求冲突
-            getRegulationsDetail()
-        } else {
-            console.error('未获取到ID参数')
-            title.value = '法律政策详情'
-            htmlContent.value = '<div style="padding: 20px; text-align: center; color: #999;">未获取到有效ID参数</div>'
-        }
-    } catch (error) {
-        console.error('获取ID失败:', error)
-        title.value = '法律政策详情'
-        htmlContent.value = '<div style="padding: 20px; text-align: center; color: #999;">页面加载失败,请稍后重试</div>'
-    }
-})
-const fileList = ref([]) // 附件列表
-// API调用超时处理函数
-const fetchWithTimeout = async (promise, timeout = 10000) => {
-    const timeoutPromise = new Promise((_, reject) => {
-        setTimeout(() => reject(new Error('网络请求超时,请稍后重试')), timeout)
-    })
-    return Promise.race([promise, timeoutPromise])
-}
-
-const handleRetry = () => {
-    // 只有在加载失败时才允许重试
-    if (htmlContent.value.includes('超时') || htmlContent.value.includes('失败')) {
-        console.log('用户点击重试')
-        getRegulationsDetail()
-    }
-}
-
-const getRegulationsDetail = async () => {
-    if (!formParams.value.id) {
-        console.error('ID为空,不执行API调用')
-        htmlContent.value = '<div style="padding: 20px; text-align: center; color: #999;">未获取到有效ID参数</div>'
-        return
-    }
-    
-    // 显示加载状态
-    htmlContent.value = '<div style="padding: 40px; text-align: center; color: #999;">加载中...</div>'
-    
-    try {
-        // 调用API并设置10秒超时
-        const res = await fetchWithTimeout(regulationsDetailApi(formParams.value.id), 10000)
-        
-        // 检查返回数据结构
-        if (res && res.data) {
-            if (res.data.code === 200) {
-                // 法律法规提供的是地址附件
-                htmlContent.value = res.data.data.noticeContent || '<div style="padding: 20px; text-align: center; color: #999;">暂无数据</div>'
-                title.value = res.data.data.noticeTitle || '法律政策详情'
-                fileList.value = res.data.data.fileList || []
-            } else {
-                console.error('API返回错误:', res.data.msg || '未知错误')
-                htmlContent.value = `<div style="padding: 20px; text-align: center; color: #999;">${res.data.msg || '获取数据失败,请点击屏幕重试'}</div>`
-            }
-        } else {
-            console.error('API返回数据结构不正确:', res)
-            htmlContent.value = '<div style="padding: 20px; text-align: center; color: #999;">数据格式错误,请点击屏幕重试</div>'
-        }
-    } catch (error) {
-        console.error('获取详情异常:', error)
-        // 根据错误类型显示不同的提示
-        if (error.message.includes('timeout')) {
-            htmlContent.value = '<div style="padding: 20px; text-align: center; color: #999;">网络连接超时,请点击屏幕重试</div>'
-        } else {
-            htmlContent.value = '<div style="padding: 20px; text-align: center; color: #999;">加载失败,请点击屏幕重试</div>'
-        }
-    }
-}
-</script>
-<style scoped lang="scss">
-.regulationsDetail {
-    padding: 24rpx;
-    .title {
-        font-family: Source Han Sans CN, Source Han Sans CN;
-        font-weight: 500;
-        font-size: 18px;
-        color: #1D2129;
-        margin-bottom: 40rpx;
-    }
-}
-</style>
-
diff --git a/uniapps/work-wx/src/subPackages/userDetail/infos/index.vue b/uniapps/work-wx/src/subPackages/userDetail/infos/index.vue
index 2c407b9..a6c460d 100644
--- a/uniapps/work-wx/src/subPackages/userDetail/infos/index.vue
+++ b/uniapps/work-wx/src/subPackages/userDetail/infos/index.vue
@@ -41,7 +41,7 @@
 </template>
 
 <script setup>
-	import showDefaultHeader from "@/static/images/user/default-header.svg";
+	import showDefaultHeader from "@/static/images/user/default-header.png";
 	import {
 		getEnvObj,
 		getWebViewUrl
@@ -252,7 +252,7 @@
 		left: 0;
 		width: 100%;
 		height: 100%;
-		background: url("@/static/images/user/userbg.svg")  no-repeat ;
+		background-image: url("../../../static/images/user/userbg.svg")  no-repeat ;
 		background-size: 100%;
 	}
 	.avatarBox {
diff --git a/uniapps/work-wx/src/subPackages/userDetail/password/index.vue b/uniapps/work-wx/src/subPackages/userDetail/password/index.vue
index 875d361..246611c 100644
--- a/uniapps/work-wx/src/subPackages/userDetail/password/index.vue
+++ b/uniapps/work-wx/src/subPackages/userDetail/password/index.vue
@@ -1,6 +1,6 @@
 <!-- 修改密码 -->
 <template>
-	<view class="container">
+	<view class="user-password">
 		<view class="pageBg"></view>
 		<view class="detailBox">
 			<div class="detailCon">
@@ -20,7 +20,7 @@
 				<div class="orderRow">
 					<div class="rowTitle">验证码</div>
 					<input type="text" v-model="passwordForm.code" placeholder="请输入验证码" class="input-item" />
-					<u-button class="getCode" :disabled="countDown > 0" @click="sendVerificationCode" type="primary" color="#007AFF">
+					<u-button :disabled="countDown > 0" @click="sendVerificationCode" type="primary" color="#007AFF">
 						{{ countDown > 0 ? `${countDown}s后重发` : '获取验证码' }}
 					</u-button>
 				</div>
@@ -34,6 +34,7 @@
 </template>
 
 <script setup>
+	import userbgSvg from "@/static/images/user/userbg.svg";
 	import {
 		useUserStore
 	} from "@/store/index.js";
@@ -246,126 +247,125 @@
 </script>
 
 <style lang="scss" scoped>
-	.container {
+	.user-password {
 		width: 100%;
 		height: 100%;
 		display: flex;
 		flex-direction: column;
 		align-items: center;
 		position: relative;
-	}
-
-	.pageBg {
-		position: fixed;
-		top: 0;
-		left: 0;
-		width: 100%;
-		height: 100%;
-		background: url("@/static/images/user/userbg.svg")  no-repeat ;
-		background-size: 100%;
-	}
-
-	.detailBox {
-		position: absolute;
-		top: 180rpx;
-		// margin-top: 40rpx;
-		width: 702rpx;
-
-		min-height: 326rpx;
-		background: #FFFFFF;
-		border-radius: 12rpx;
-		box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
-
-		.detailCon {
-			padding: 0 24rpx;
+		.pageBg {
+			position: fixed;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: 100%;
+			background-image: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_app_assets/images/user/bg.png");
+			background-size: 100%;
 		}
 
-		.orderRow {
+		.detailBox {
+			position: absolute;
+			top: 180rpx;
+			// margin-top: 40rpx;
+			width: 702rpx;
+
+			min-height: 326rpx;
+			background: #FFFFFF;
+			border-radius: 12rpx;
+			box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
+
+			.detailCon {
+				padding: 0 24rpx;
+			}
+
+			.orderRow {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				height: 96rpx;
+				border-bottom: 2rpx solid #f5f5f5;
+				color: #7b7b7b;
+
+
+				.rowTitle {
+					font-family: Source Han Sans CN, Source Han Sans CN;
+					font-weight: 400;
+					font-size: 30rpx;
+					color: #222324;
+					white-space: nowrap;
+				}
+
+				input.input-item {
+					text-align: right;
+					border: none !important;
+					background: transparent !important;
+					box-shadow: none !important;
+					padding: 0 !important;
+					margin: 0 !important;
+					height: auto !important;
+
+					outline: none;
+					font-size: 30rpx;
+					color: #222324;
+					font-family: Source Han Sans CN, Source Han Sans CN;
+				}
+		:deep(.uni-input-placeholder) {
+			color: #D5D5D5;
+		}
+				input.input-item::placeholder {
+					font-size: 30rpx;
+				}
+
+				// .code-container {
+				// 	display: flex;
+				// 	align-items: center;
+				// 	justify-content: flex-end;
+				// 	width: 100%;
+				// }
+
+				.send-code-btn {
+					margin-left: 20rpx;
+					width: 200rpx;
+					height: 70rpx;
+					line-height: 70rpx;
+					font-size: 26rpx;
+					background: #f5f5f5;
+					color: #666;
+					border-radius: 8rpx;
+				}
+
+				.send-code-btn:disabled {
+					background: #e0e0e0;
+					color: #999;
+				}
+				:deep(.u-button){
+					width: 180rpx !important;
+					height: 60rpx !important;
+				}
+			}
+		}
+
+		.btngroup {
 			display: flex;
-			justify-content: space-between;
-			align-items: center;
-			height: 96rpx;
-			border-bottom: 2rpx solid #f5f5f5;
-			color: #7b7b7b;
-
-
-			.rowTitle {
-				font-family: Source Han Sans CN, Source Han Sans CN;
-				font-weight: 400;
-				font-size: 30rpx;
-				color: #222324;
-				white-space: nowrap;
-			}
-
-			input.input-item {
-				text-align: right;
-				border: none !important;
-				background: transparent !important;
-				box-shadow: none !important;
-				padding: 0 !important;
-				margin: 0 !important;
-				height: auto !important;
-
-				outline: none;
-				font-size: 30rpx;
-				color: #222324;
-				font-family: Source Han Sans CN, Source Han Sans CN;
-			}
-      :deep(.uni-input-placeholder) {
-        color: #D5D5D5;
-      }
-			input.input-item::placeholder {
-				font-size: 30rpx;
-			}
-
-			// .code-container {
-			// 	display: flex;
-			// 	align-items: center;
-			// 	justify-content: flex-end;
-			// 	width: 100%;
-			// }
-
-			.send-code-btn {
-				margin-left: 20rpx;
-				width: 200rpx;
-				height: 70rpx;
-				line-height: 70rpx;
-				font-size: 26rpx;
-				background: #f5f5f5;
-				color: #666;
-				border-radius: 8rpx;
-			}
-
-			.send-code-btn:disabled {
-				background: #e0e0e0;
-				color: #999;
+			position: absolute;
+			bottom: 150rpx;
+			:deep(.u-button){
+				width: 276rpx !important;
+				height: 100rpx !important;
 			}
 		}
-	}
 
-	.btngroup {
-		display: flex;
-		position: absolute;
-		bottom: 150rpx;
-	}
+		:deep(.u-button:first-child) {
+			margin-right: 30rpx !important;
+		}
 
-	:deep(.u-button:first-child) {
-		margin-right: 30rpx !important;
+		.custom-style {
+			width: 276rpx;
+			height: 100rpx;
+			font-family: "Source Han Sans CN";
+			font-weight: 400;
+			font-size: 36rpx;
+		}
 	}
-
-	.custom-style {
-		width: 276rpx;
-		height: 100rpx;
-		  font-family: "Source Han Sans CN";
-		font-weight: 400;
-		font-size: 36rpx;
-	}
-	:deep(.u-button.data-v-461e713c){
-		width: 276rpx !important;
-		height: 100rpx !important;
-	}
-	.getCode {
-		margin-left: 20rpx;
-            width: 180rpx;
-        }
 </style>
diff --git a/uniapps/work-wx/src/subPackages/workDetail/addWork/index.vue b/uniapps/work-wx/src/subPackages/workDetail/addWork/index.vue
deleted file mode 100644
index 6d9b4a0..0000000
--- a/uniapps/work-wx/src/subPackages/workDetail/addWork/index.vue
+++ /dev/null
@@ -1,52 +0,0 @@
-<!--
- * @Author       : yuan
- * @Date         : 2025-11-13 18:14:52
- * @LastEditors  : yuan
- * @LastEditTime : 2025-12-20 16:56:27
- * @FilePath     : \src\subPackages\workDetail\addWork\index.vue
- * @Description  : 
- * Copyright 2025 OBKoro1, All Rights Reserved. 
- * 2025-11-13 18:14:52
--->
-<template>
-  <view>
-    <WebViewPlus
-      @webMessage="onPostMessage"
-      ref="sWebViewRef"
-      :src="`${viewUrl}`"
-    />
-  </view>
-</template>
-
-<script setup>
-import { getWebViewUrl } from "@/utils/index.js";
-import WebViewPlus from "@/components/WebViewPlus.vue";
-const sWebViewRef = ref(null);
-const viewUrl = getWebViewUrl("/addWork");
-
-function onPostMessage(data) {
-  if (data.type === "submitSuccess") {
-    // #ifdef MP-WEIXIN
-    if ("fun" in data && data.fun === "add") {
-      uni.setStorageSync("joinParams", {
-        type: "add",
-      });
-    }
-    // #endif
-
-    // #ifndef MP-WEIXIN
-    uni.setStorageSync("joinParams", {
-      type: "add",
-    });
-    // uni.switchTab({
-    //   url: '/pages/work/index'
-    // });
-    uni.switchTab({
-      url: `/pages/work/index?addLog=111`,
-    });
-    // #endif
-  }
-}
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/uniapps/work-wx/src/subPackages/workDetail/index.vue b/uniapps/work-wx/src/subPackages/workDetail/index.vue
deleted file mode 100644
index 8adecf1..0000000
--- a/uniapps/work-wx/src/subPackages/workDetail/index.vue
+++ /dev/null
@@ -1,68 +0,0 @@
-<!-- 工单详情 - 包含待审核、待处理、处理中、已完成 -->
-<template>
-  <div class="workDetailContainer">
-    <WebViewPlus
-      ref="sWebViewRef"
-      :src="`${viewUrl}`"
-      @webMessage="onPostMessage"
-    />
-  </div>
-</template>
-
-<script setup>
-import { getWebViewUrl } from "@/utils/index.js";
-import { onLoad } from "@dcloudio/uni-app";
-import { useUserStore } from "@/store/index.js";
-const userStore = useUserStore();
-const userInfo = userStore.userInfo;
-const sWebViewRef = ref(null);
-const viewUrl = ref("");
-onLoad((options) => {
-  const eventNum = options.eventNum;
-  viewUrl.value = getWebViewUrl("/workDetail", {
-    eventNum: eventNum,
-    totalNum: options.totalNum,
-    keyword: options.keyword,
-    aiType: options.aiType,
-    wLJobInfoId: options.wLJobInfoId,
-    status: options.status,
-    current: options.current,
-  });
-});
-
-function onPostMessage(data) {
-  if (data.type === "workback") {
-    // #ifdef MP-WEIXIN
-    if ("fun" in data && data.fun === "add") {
-      uni.setStorageSync("joinParams", {
-        type: "add",
-      });
-    }
-    // #endif
-
-    // #ifndef MP-WEIXIN
-    uni.setStorageSync("joinParams", {
-      type: "add",
-    });
-    uni.switchTab({
-      url: `/pages/work/index?addLog=111`,
-      // url: '/pages/work/index'
-    });
-    // #endif
-  } else if (data.type === "jumpMapNav") {
-    // #ifndef MP-WEIXIN
-    uni.navigateTo({
-      url: `/subPackages/workDetail/mapWork/index?currentItem=${data.eventNum}`,
-    });
-    // #endif
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.workDetailContainer {
-  width: 100%;
-  height: 100%;
-  background-size: cover;
-}
-</style>
diff --git a/uniapps/work-wx/src/subPackages/workDetail/mapWork/index.vue b/uniapps/work-wx/src/subPackages/workDetail/mapWork/index.vue
deleted file mode 100644
index f00d642..0000000
--- a/uniapps/work-wx/src/subPackages/workDetail/mapWork/index.vue
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
- * @Author       : yuan
- * @Date         : 2025-10-22 14:59:10
- * @LastEditors  : yuan
- * @LastEditTime : 2025-12-19 14:52:54
- * @FilePath     : \src\subPackages\workDetail\mapWork\index.vue
- * @Description  : 
- * Copyright 2025 OBKoro1, All Rights Reserved. 
- * 2025-10-22 14:59:10
--->
-<!-- 地图展示 -->
-<template>
-  <WebViewPlus
-    ref="sWebViewRef"
-    :src="`${viewUrl}`"
-    @webMessage="onPostMessage"
-  />
-</template>
-
-<script setup>
-import { getWebViewUrl } from "@/utils/index.js";
-import { onLoad } from "@dcloudio/uni-app";
-
-const sWebViewRef = ref(null);
-const viewUrl = ref("");
-
-onLoad((options) => {
-  const currentItem = options.currentItem;
-  viewUrl.value = getWebViewUrl("/mapWork", { currentItem: currentItem });
-});
-function onPostMessage(data) {
-  // #ifdef MP-WEIXIN
-  // #endif
-
-  // #ifndef MP-WEIXIN
-  if (data.type === "workDetailback") {
-    // uni.navigateTo({
-    //   url: '/subPackages/workDetail/index'
-    // });
-    uni.navigateBack({
-      delta: 1,
-    });
-  }
-
-  if (data.type === "browser") {
-    uni.navigateTo({
-      url:
-        "/subPackages/browser/index?url=" + encodeURIComponent(data.data.url),
-    });
-  }
-  // #endif
-}
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/uniapps/work-wx/src/subPackages/workDetail/photoMagnify/index.vue b/uniapps/work-wx/src/subPackages/workDetail/photoMagnify/index.vue
deleted file mode 100644
index fa220aa..0000000
--- a/uniapps/work-wx/src/subPackages/workDetail/photoMagnify/index.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-
-<!-- 照片放大 -->
-<template>
-  <view>
-     <WebViewPlus v-if="isApp" ref="sWebViewRef" :src="`${viewUrl}`" @webMessage="onPostMessage"/></view>
-</template>
-
-<script setup>
-  import {getWebViewUrl} from "@/utils/index.js";
-  import { onLoad } from '@dcloudio/uni-app';
-	const viewUrl = ref('')
-  onLoad( (options) => {
-  	const eventNum= options.eventNum;
-  	viewUrl.value = getWebViewUrl('/photoMagnify', {eventNum:eventNum})
-  });
-  const isApp = ref(false)
-  onShow(() => {
-    isApp.value = true
-  });
-
-  onHide(() => {
-    isApp.value = false
-  });
-</script>
-
-<style lang="scss" scoped></style>

--
Gitblit v1.9.3