无人机管理后台前端(已迁走)
chenyao
2025-06-09 29e0c506e02098f2689da7a17b2ee66b575ef8f3
feat: 跳转门户
4 files modified
1 files added
413 ■■■■ changed files
.env.development 7 ●●●● patch | view | raw | blame | history
.env.production 3 ●●●●● patch | view | raw | blame | history
src/assets/images/mh.png patch | view | raw | blame | history
src/page/index/top/index.vue 5 ●●●●● patch | view | raw | blame | history
src/views/system/userinfo.vue 398 ●●●● patch | view | raw | blame | history
.env.development
@@ -10,8 +10,11 @@
VITE_APP_BASE=/manage
# 服务地址
#VITE_APP_URL = https://wrj.shuixiongit.com/api
VITE_APP_URL= http://192.168.1.7
VITE_APP_URL = https://wrj.shuixiongit.com/api
# VITE_APP_URL= http://192.168.1.7
#新大屏地址
VITE_APP_DASHBOARD_URL = 'https://wrj.shuixiongit.com/command-center-dashboard/'
# 域名
VITE_APP_AREA_NAME = https://wrj.shuixiongit.com
.env.production
@@ -17,6 +17,9 @@
# 域名
VITE_APP_AREA_NAME = https://aisky.org.cn
#新大屏地址
VITE_APP_DASHBOARD_URL = 'https://aisky.org.cn/command-center-dashboard/'
# ws地址
VITE_APP_WS_API_URL = wss://aisky.org.cn
src/assets/images/mh.png
src/page/index/top/index.vue
@@ -15,6 +15,7 @@
        <top-lock v-if="setting.lock"/>
        <top-qna title="帮助中心"/>
        <top-full v-if="setting.fullscreen" title="全屏"/>
        <img @click="jumpMH" src="@/assets/images/mh.png" alt="进入门户" title="进入门户" width="20" height="20">
      </div>
      <div class="top-user">
        <img class="top-bar__img" :src="userInfo.avatar " />
@@ -105,6 +106,10 @@
        })
      })
    },
    jumpMH () {
      const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
          window.open(`${adminUrl}#/wel/gatewayPage`, '_blank')
    },
  },
}
</script>
src/views/system/userinfo.vue
@@ -1,130 +1,154 @@
<template>
  <div>
    <basic-container>
      <avue-form
        ref="form"
        :option="option"
        v-model="form"
        @tab-click="handleTabClick"
        @submit="handleSubmit"
  <div class="user-info-new">
    <div class="titleBoxs">
      <div
        class="titleItem"
        :class="index === checked ? 'activeItem' : ''"
        v-for="(item, index) in titleList"
        :key="index"
        @click="titleClick(item, index)"
      >
        {{ item }}
      </div>
    </div>
    <!-- 个人信息 -->
    <div class="message" v-if="checked === 0">
      <div class="info">
        <div class="section">
          <el-form label-width="120px">
            <el-form-item label="头像:">
              <el-upload
                class="avatar-uploader"
                :http-request="customUpload"
                :show-file-list="false"
                :before-upload="beforeAvatarUpload"
                :disabled="uploadLoading"
                action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
              >
                <img v-if="userInfo.avatar" :src="userInfo.avatar" class="avatar" />
                <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
      >
        <template #email="{ disabled, size }">
            <el-input
            id="adfsdafdsf"
              type="text"
              :disabled="disabled"
              :size="size"
              v-model="form.email"
              placeholder="请输入邮箱"
              :readonly="readonly"
              @focus="readonly = false"
            >
            </el-input>
                <template #tip>
                  <div class="upload-tip">只能上传jpg/png用户头像,且不超过500kb</div>
        </template>
      </avue-form>
    </basic-container>
              </el-upload>
              <!-- <el-dialog v-model="dialogVisible">
                                <img w-full :src="dialogImageUrl" alt="Preview Image" />
                            </el-dialog> -->
            </el-form-item>
          </el-form>
        </div>
        <div class="section">
          <el-form :model="userInfo" label-width="120px">
            <el-form-item label="姓名:">
              <el-input
                class="ztzf-input"
                :style="{ width: pxToRem(230) }"
                v-model="userInfo.realName"
                disabled
              />
            </el-form-item>
            <!--                        <el-form-item label="昵称:">
                                                    <el-input class="ztzf-input" v-model="userInfo.name" />
                                                </el-form-item>-->
            <el-form-item label="所属单位:">
              <el-input class="ztzf-input" v-model="userInfo.deptName" disabled />
            </el-form-item>
            <el-form-item label="手机号:">
              <el-input class="ztzf-input" v-model="userInfo.phone" />
            </el-form-item>
            <el-form-item label="邮箱:">
              <el-input class="ztzf-input" v-model="userInfo.email" />
            </el-form-item>
          </el-form>
        </div>
      </div>
      <div class="butn">
        <!-- <img @click="reset" :style="{ marginRight: pxToRem(23) }" :src="cancel1" alt="" />
                <img @click="submit" :style="{ marginRight: pxToRem(23) }" :src="publish1" alt="" /> -->
        <el-button type="primary" @click="submit" style="margin-right: 10px">提交</el-button>
        <el-button @click="reset">重置</el-button>
      </div>
    </div>
    <!-- 修改密码 -->
    <div class="passwordBox" v-else-if="checked === 1">
      <div class="password">
        <el-form :model="passwordForm" label-width="120px">
          <el-form-item label="原始密码:" prop="oldPassword">
            <el-input
              class="ztzf-input"
              v-model="passwordForm.oldPassword"
              type="password"
              show-password
            />
          </el-form-item>
          <el-form-item label="新密码:" prop="newPassword">
            <el-input
              class="ztzf-input"
              v-model="passwordForm.newPassword"
              type="password"
              show-password
            />
          </el-form-item>
          <el-form-item label="确认密码:" prop="newPassword1">
            <el-input
              class="ztzf-input"
              v-model="passwordForm.newPassword1"
              type="password"
              show-password
            />
          </el-form-item>
        </el-form>
      </div>
      <div class="butn">
        <!-- <img @click="reset" :style="{ marginRight: pxToRem(23) }" :src="cancel1" alt="" />
                <img @click="submit" :style="{ marginRight: pxToRem(23) }" :src="publish1" alt="" /> -->
        <el-button type="primary" @click="submit" style="margin-right: 10px">提交</el-button>
        <el-button @click="reset">重置</el-button>
      </div>
    </div>
    <!-- 密钥上传 -->
    <div class="upload-file" v-else-if="checked === 2">
      <img v-if="isSuccess === 'success'" :src="uploadSuccess" alt="" />
      <img v-if="isSuccess === 'error'" :src="uploadError" alt="" />
      <el-upload
        action="/upload"
        accept=".lic"
        :show-file-list="false"
        :before-upload="handleUpload"
      >
        <div class="upload-btn">密钥上传</div>
      </el-upload>
      <div class="password-time">密钥有效期:{{ passwordTime || '永久有效' }}</div>
    </div>
  </div>
</template>
<script>
import option from '@/option/user/info';
import { getUserInfo, updateInfo, updatePassword } from '@/api/system/user';
<script setup>
import { pxToRem } from '@/utils/rem';
import { useStore } from 'vuex';
import { ElMessage } from 'element-plus';
import { getToken } from '@/utils/auth';
import md5 from 'js-md5';
import func from '@/utils/func';
import { validatenull } from '@/utils/validate';
import defaultAva from '@/assets/images/defaultava.png';
export default {
  data() {
    return {
      index: 0,
      option: option,
      form: {  },
      readonly: true
    };
  },
  created() {
    this.handleWitch();
  },
  methods: {
    handleSubmit(form, done) {
      if (this.index === 0) {
        form.name = form.realName;
        updateInfo(form).then(
          res => {
            if (res.data.success) {
              this.$message({
                type: 'success',
                message: '修改信息成功!',
              });
            } else {
              this.$message({
                type: 'error',
                message: res.data.msg,
              });
            }
            done();
          },
          error => {
            window.console.log(error);
            done();
          }
        );
      } else {
        updatePassword(md5(form.oldPassword), md5(form.newPassword), md5(form.newPassword1)).then(
          res => {
            if (res.data.success) {
              this.$message({
                type: 'success',
                message: '修改密码成功,请重新登录!',
              });
              this.$store.dispatch('LogOut').then(() => {
                this.$router.push({ path: '/login' })
              })
            } else {
              this.$message({
                type: 'error',
                message: res.data.msg,
              });
            }
            done();
          },
          error => {
            window.console.log(error);
            done();
          }
        );
      }
    },
    handleWitch() {
      if (this.index === 0) {
        getUserInfo().then(res => {
          const user = res.data.data;
          this.form = {
            id: user.id,
            avatar: user.avatar ? user.avatar :defaultAva,
            name: user.name,
            realName: user.realName,
            phone: user.phone,
            email: user.email,
          };
        });
      }
    },
import request from '@/axios';
import { getUserInfo, updateInfo, updatePassword } from '@/api/system/user';
import { findLicenseDate } from '@/api/system/dict';
import { uploadLicense } from '@/api/license/uploadLicense';
import uploadSuccess from '@/assets/images/uoload-success.png';
import uploadError from '@/assets/images/upload-error.png';
import cancel1 from '@/assets/images/task/cancel1.png';
import publish1 from '@/assets/images/task/publish1.png';
const store = useStore()
const token = getToken()
const userinforShow = defineModel('show')
const userInfoAs = computed(() => store.state.user.userInfo)
const titleList = ref(['个人信息', '修改密码', '密钥上传'])
const checked = ref(0)
const uploadUrl = computed(() => `${import.meta.env.VITE_APP_API_URL}/blade-resource/oss/endpoint/put-file`)
const store = useStore();
const token = getToken();
const userinforShow = defineModel('show');
const userInfoAs = computed(() => store.state.user.userInfo);
const titleList = ref(['个人信息', '修改密码', '密钥上传']);
const checked = ref(0);
const uploadUrl = computed(
  () => `${import.meta.env.VITE_APP_API_URL}/blade-resource/oss/endpoint/put-file`
);
// 表单数据
const userInfo = ref({
    id: '',
@@ -134,74 +158,74 @@
    phone: '',
    email: '',
    deptName: '',
})
});
// 校验手机号
const validatePhone = () => {
    const phoneRegex = /^1[3-9]\d{9}$/
  const phoneRegex = /^1[3-9]\d{9}$/;
    if (!phoneRegex.test(userInfo.value.phone)) {
        ElMessage.error('请输入正确的手机号码')
        return false
    ElMessage.error('请输入正确的手机号码');
    return false;
    }
    return true
}
  return true;
};
const passwordForm = ref({
    oldPassword: '',
    newPassword: '',
    newPassword1: '',
})
});
// 头像
const beforeAvatarUpload = file => {
    const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'
    const isLt500KB = file.size / 1024 < 500
  const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
  const isLt500KB = file.size / 1024 < 500;
    if (!isJpgOrPng) {
        ElMessage.error('头像图片只能是 JPG/PNG 格式!')
        return false
    ElMessage.error('头像图片只能是 JPG/PNG 格式!');
    return false;
    }
    if (!isLt500KB) {
        ElMessage.error('头像图片大小不能超过 500KB!')
        return false
    ElMessage.error('头像图片大小不能超过 500KB!');
    return false;
    }
    return true
}
const uploadLoading = ref(false)
  return true;
};
const uploadLoading = ref(false);
const customUpload = async options => {
    const { file } = options
    uploadLoading.value = true
  const { file } = options;
  uploadLoading.value = true;
    const formData = new FormData()
    formData.append('file', file) // 根据后端API调整字段名
  const formData = new FormData();
  formData.append('file', file); // 根据后端API调整字段名
    try {
        const res = await request.post('/blade-resource/oss/endpoint/put-file', formData, {
            headers: {
                'Content-Type': 'multipart/form-data',
            },
        })
    });
        if (res.data.code === 200) {
            ElMessage.success('头像上传成功')
            userInfo.value.avatar = res.data.data.link
            return res.data
      ElMessage.success('头像上传成功');
      userInfo.value.avatar = res.data.data.link;
      return res.data;
        } else {
            throw new Error(res.data.msg || '上传失败')
      throw new Error(res.data.msg || '上传失败');
        }
    } catch (error) {
        ElMessage.error(error.response?.data?.msg || error.message || '上传失败')
        return Promise.reject(error)
    ElMessage.error(error.response?.data?.msg || error.message || '上传失败');
    return Promise.reject(error);
    } finally {
        uploadLoading.value = false
    uploadLoading.value = false;
    }
}
};
const titleClick = (item, index) => {
    checked.value = index
  checked.value = index;
    if (index === 2) {
        getFindLicenseDate()
    getFindLicenseDate();
    }
}
};
const getUserInfoData = () => {
    getUserInfo().then(res => {
        const user = res.data.data
    const user = res.data.data;
        userInfo.value = {
            id: user.id,
            avatar: user.avatar,
@@ -210,22 +234,22 @@
            phone: user.phone,
            email: user.email,
            deptName: user.deptName,
        }
    })
}
const emit = defineEmits(['logout'])
    };
  });
};
const emit = defineEmits(['logout']);
const submit = () => {
    if (checked.value === 0) {
        // if (!validatePhone()) return
        userInfo.value.name = userInfo.value.realName
    userInfo.value.name = userInfo.value.realName;
        updateInfo(userInfo.value).then(res => {
            if (res.data.code === 200) {
                ElMessage.success('修改信息成功!')
                userinforShow.value = false
        ElMessage.success('修改信息成功!');
        userinforShow.value = false;
            } else {
                ElMessage.error(res.msg)
        ElMessage.error(res.msg);
            }
        })
    });
    } else if (checked.value === 1) {
        updatePassword(
            md5(passwordForm.value.oldPassword),
@@ -233,64 +257,64 @@
            md5(passwordForm.value.newPassword1)
        ).then(res => {
            if (res.data.code === 200) {
                ElMessage.success('修改密码成功!')
        ElMessage.success('修改密码成功!');
                // 调用父组件方法
                userinforShow.value = false
                emit('logout')
        userinforShow.value = false;
        emit('logout');
            } else {
                ElMessage.error(res.msg)
        ElMessage.error(res.msg);
            }
        })
    });
    }
}
};
const reset = () => {
    if (checked.value === 0) {
        getUserInfoData()
        userinforShow.value = false
    getUserInfoData();
    userinforShow.value = false;
    } else if (checked.value === 1) {
        passwordForm.value = {
            id: userInfoAs.value.userId,
            oldPassword: '',
            newPassword: '',
            newPassword1: '',
    };
    userinforShow.value = false;
        }
        userinforShow.value = false
    }
}
const isSuccess = ref('')
const passwordTime = ref('')
};
const isSuccess = ref('');
const passwordTime = ref('');
const handleUpload = file => {
    const formData = new FormData()
    formData.append('file', file)
  const formData = new FormData();
  formData.append('file', file);
    uploadLicense(formData)
        .then(res => {
            if (res.data.code !== 200) return ElMessage.error('上传失败')
            ElMessage.success('上传成功')
            isSuccess.value = 'success'
            getFindLicenseDate()
      if (res.data.code !== 200) return ElMessage.error('上传失败');
      ElMessage.success('上传成功');
      isSuccess.value = 'success';
      getFindLicenseDate();
        })
        .catch(err => {
            isSuccess.value = 'error'
            ElMessage.error('上传失败')
        })
}
      isSuccess.value = 'error';
      ElMessage.error('上传失败');
    });
};
const getFindLicenseDate = () => {
    findLicenseDate()
        .then(res => {
            if (res.data.code !== 0) return ElMessage.error('获取失败')
            passwordTime.value = res.data.data
      if (res.data.code !== 0) return ElMessage.error('获取失败');
      passwordTime.value = res.data.data;
        })
        .catch(err => {
            ElMessage.error('获取失败')
        })
}
      ElMessage.error('获取失败');
    });
};
// const dialogImageUrl = ref('')
// const dialogVisible = ref(false)
// const handlePictureCardPreview = () => {}
// const handleRemove = () => {}
onMounted(() => {
    getUserInfoData()
})
  getUserInfoData();
});
</script>
<style scoped lang="scss">
.user-info-new {