123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- <template>
- <t-layout class="app-container">
- <t-header class="app-nav">
- <t-head-menu
- theme="light"
- :default-value="menuValue"
- @change="changeHandler"
- >
- <template #logo>
- <img src="../assets/logo.png" height="32" alt="logo" />
- </template>
- <t-menu-item value="homeIndex"> 首页 </t-menu-item>
- <t-menu-item value="runDataIndex"> 运行数据 </t-menu-item>
- <t-menu-item value="logsDataIndex"> 日志数据 </t-menu-item>
- <template #operations>
- <t-space>
- <t-tooltip placement="bottom" content="全屏">
- <t-button
- theme="default"
- shape="square"
- variant="text"
- @click="toggleFullScreen"
- >
- <t-icon name="fullscreen-2" size="24" />
- </t-button>
- </t-tooltip>
- <t-button theme="default" variant="text">
- <template #icon>
- <t-icon
- class="header-user-avatar"
- name="user-circle"
- size="18"
- />
- </template>
- {{ userName }}
- </t-button>
- </t-space>
- <t-button theme="default" variant="text" @click="updatedPassword">
- <template #icon>
- <t-icon class="header-user-avatar" name="edit" />
- </template>
- 修改密码
- </t-button>
- <t-button variant="text" @click="handleLogout">
- <template #icon><t-icon name="poweroff" /></template>
- 退出登录
- </t-button>
- </template>
- </t-head-menu>
- </t-header>
- <t-content class="app-content">
- <div class="app-main">
- <router-view v-slot="{ Component }">
- <transition name="fade" mode="out-in">
- <keep-alive>
- <component :is="Component" />
- </keep-alive>
- </transition>
- </router-view>
- </div>
- </t-content>
- <!-- 修改密码 -->
- <t-dialog
- header="修改密码"
- v-model:visible="visible"
- :cancel-btn="null"
- :confirm-btn="null"
- >
- <t-form
- ref="form"
- :data="formData"
- :rules="rules"
- @reset="onReset"
- @submit="onSubmit"
- >
- <t-form-item label="原密码" name="oldPasswd">
- <t-input
- v-model="formData.oldPasswd"
- :readonly="true"
- type="password"
- ></t-input>
- </t-form-item>
- <t-form-item label="新密码" name="passwd">
- <t-input v-model="formData.passwd" type="password"></t-input>
- </t-form-item>
- <t-form-item label="确认密码" name="surePassword">
- <t-input v-model="formData.surePassword" type="password"></t-input>
- </t-form-item>
- <t-form-item>
- <t-space size="small">
- <t-button theme="primary" type="submit">确定</t-button>
- <t-button theme="default" variant="base" type="reset"
- >取消</t-button
- >
- </t-space>
- </t-form-item>
- </t-form>
- </t-dialog>
- </t-layout>
- </template>
- <script lang="ts" setup>
- import { ref, computed, reactive, nextTick } from 'vue';
- import screenfull from 'screenfull';
- import { useUserStore } from '@/store';
- import { useRouter, useRoute } from 'vue-router';
- import { editPassword } from '@/api/login';
- import { MessagePlugin } from 'tdesign-vue-next';
- const route = useRoute();
- const { push } = useRouter();
- const userStore = useUserStore();
- const isFullscreen = ref(false);
- const menuValue = computed(() => route.name);
- const userName = computed(() => userStore.userInfo.nickname || '');
- const visible = ref(false);
- const form = ref(null);
- const passwordValidator = (val) => {
- if (val === userStore.userInfo.passwd) {
- return { result: false, message: '新密码不能和旧密码一致', type: 'error' };
- }
- return true;
- };
- const rePasswordValidator = (val) => {
- if (val !== formData.passwd) {
- return { result: false, message: '两次密码不一致', type: 'error' };
- }
- return true;
- };
- const formData = reactive({
- username: '',
- oldPasswd: '',
- passwd: '',
- surePassword: '',
- });
- const rules = {
- passwd: [
- { required: true, message: '新密码必填' },
- { validator: passwordValidator },
- ],
- surePassword: [
- { required: true, message: '确认密码必填' },
- { validator: rePasswordValidator },
- ],
- };
- const changeHandler = (active: string) => {
- push({ name: active });
- };
- /** 全屏切换 */
- const toggleFullScreen = () => {
- isFullscreen.value = !isFullscreen.value;
- if (menuValue.value == 'homeIndex') {
- screenfull.toggle(document.querySelector('.home-container'));
- } else {
- screenfull.toggle();
- }
- };
- /**修改密码 */
- const updatedPassword = () => {
- visible.value = true;
- nextTick(() => {
- form.value.clearValidate();
- formData.username = userStore.userInfo.username;
- formData.oldPasswd = userStore.userInfo.passwd;
- formData.passwd = '';
- formData.surePassword = '';
- });
- };
- const onSubmit = async ({ validateResult, firstError, e }) => {
- e.preventDefault();
- if (validateResult === true) {
- const { username, oldPasswd, passwd } = formData;
- const resp = await editPassword({ username, oldPasswd, passwd });
- MessagePlugin.success(resp.data);
- userStore.userInfo.passwd = passwd;
- setTimeout(() => {
- visible.value = false;
- form.value.reset();
- }, 500);
- } else {
- console.log('Validate Errors: ', firstError, validateResult);
- }
- };
- /**取消 */
- const onReset = () => {
- visible.value = false;
- };
- /** 退出登录 */
- const handleLogout = async () => {
- await userStore.logout();
- push({
- path: '/login',
- });
- };
- </script>
- <style lang="less" scoped>
- .app-container {
- width: 100%;
- height: 100vh;
- }
- .app-nav {
- padding: 0 25px;
- border-bottom: 1px solid #e5e6eb;
- }
- .app-content {
- padding: 20px 28px;
- box-sizing: border-box;
- .app-main {
- width: 100%;
- height: 100%;
- background: #fff;
- border-radius: 6px;
- // padding: 15px;
- // box-sizing: border-box;
- }
- }
- :deep(.t-button--variant-text) {
- padding: 0 10px;
- }
- .operations-dropdown-container-item {
- width: 100%;
- display: flex;
- align-items: center;
- :deep(.t-dropdown__item-text) {
- display: flex;
- align-items: center;
- }
- .t-icon {
- font-size: var(--td-comp-size-xxxs);
- margin-right: var(--td-comp-margin-s);
- }
- }
- </style>
|