| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 | <template>  <div>    <!-- <div class="m-setting-fix">      <div class="item">        <div class="item-child" @click="operator(1)">          <el-icon size="30" color="#3698fd" style="margin-bottom: 8px"><brush /></el-icon>          主题配置        </div>        <div class="item-child item-child2" @click="operator(2)">          <el-icon size="30" color="#3698fd" style="margin-bottom: 8px"><Link /></el-icon>          源码拷贝        </div>      </div>    </div> -->    <el-drawer        v-model="drawer" title="主题配置" size="300px">      <div class="theme-item">        <label>导航栏布局</label>        <el-select            v-model="layout"            placeholder="请选择"            style="width: 150px"            @change="(val) => changeSwitch('mode',val)"        >          <el-option label="纵向" value="vertical"></el-option>          <el-option label="横向" value="horizontal"></el-option>          <el-option label="分栏" value="columns"></el-option>        </el-select>      </div>      <div class="theme-item">        <label>主题颜色</label>        <el-color-picker v-model="primary" :predefine="predefineColor" @change="changePrimary" />      </div>      <div class="theme-item">        <label>暗黑模式</label>        <switch-dark></switch-dark>      </div>      <div class="theme-item">        <label>灰色模式</label>        <el-switch v-model="gray" @change="(val) => changeGrayWeak('gray',val)" />      </div>      <div class="theme-item">        <label>色弱模式</label>        <el-switch v-model="weak" @change="(val) => changeGrayWeak('weak',val)" />      </div>      <div class="theme-item">        <label>标签栏</label>        <el-switch v-model="showTag" @change="(val) => changeSwitch('showTag',val)" />      </div>      <div class="theme-item">        <label>侧边栏 Logo</label>        <el-switch v-model="showLogo" @change="(val) => changeSwitch('showLogo',val)" />      </div>      <div class="theme-item">        <label>保持一个子菜单的展开</label>        <el-switch v-model="uniqueOpened" @change="(val) => changeSwitch('uniqueOpened',val)" />      </div>      <div class="theme-item">        <label>固定header</label>        <el-switch v-model="fixedHeader" @change="(val) => changeSwitch('fixedHeader',val)" />      </div>    </el-drawer>  </div></template><script lang="ts" setup>  import {computed, ref,watch} from 'vue'  import {ElMessage} from "element-plus";  import {openLoading,closeLoading} from "@/utils/element"  import SwitchDark from '@/components/SwitchDark/index.vue'  import {PRIMARY_COLOR} from "@/config/index";  import {useSettingStore} from "@/store/modules/setting"  const SettingStore = useSettingStore()  const layout = ref(SettingStore.themeConfig.mode)  const showTag = ref(SettingStore.themeConfig.showTag)  const showLogo = ref(SettingStore.themeConfig.showLogo)  const uniqueOpened = ref(SettingStore.themeConfig.uniqueOpened)  const primary = ref(SettingStore.themeConfig.primary)  const fixedHeader = ref(SettingStore.themeConfig.fixedHeader)  const gray = ref(SettingStore.themeConfig.gray)  const weak = ref(SettingStore.themeConfig.weak)  const drawer = computed({    get() {      return SettingStore.themeConfig.showSetting;    },    set() {      changeSwitch('showSetting',!SettingStore.themeConfig.showSetting)    }  })  // 预定义主题颜色  const predefineColor = [    '#409EFF', '#1890ff', '#304156','#212121','#11a983', '#13c2c2', '#6959CD', '#f5222d'  ];  const operator = (type) => {    switch (type) {      case 1:        drawer.value = true        return      case 2:        window.open('https://github.com/zouzhibin/vue-admin-perfect')        return    }  }  // 进行配置  const changeSwitch = (key,val) => {    SettingStore.setThemeConfig({key, val})    if(key==='mode'){      openLoading()      setTimeout(()=>{        closeLoading()      },600)    }  }  // 监听布局变化  watch(      () => layout.value,      () => {        const body = document.body as HTMLElement;        body.setAttribute("class", `layout-${layout.value}`);      },      { immediate: true }  );  // 修改主题颜色  const changePrimary = (val)=>{    if (!val) {      primary.value = val = PRIMARY_COLOR;      ElMessage({ type: "success", message: `主题颜色已重置为 ${PRIMARY_COLOR}` });    }    document.documentElement.style.setProperty("--el-color-primary", val);    changeSwitch('primary',val)  }  // 修改灰色模式  const changeGrayWeak = (type,val)=>{    const body = document.documentElement as HTMLElement;    if (!val) return body.setAttribute("style", "");    if (type === "gray") body.setAttribute("style", "filter: grayscale(1)");    if (type === "weak") body.setAttribute("style", "filter: invert(80%)");    changeSwitch(type,val)  }</script><style lang="scss" scoped>::v-deep(.el-drawer__header){  border-bottom: 1px solid #ebeef5;  padding: 15px 20px 14px;  margin-bottom: 0;}  .m-setting-fix {    position: fixed;    top: 50%;    right: 0;    z-index: 999;    padding: 10px 0 0 0;    margin: 0;    text-align: center;    cursor: pointer;    background: #fff;    border: 1px solid #dcdfe6;    border-top-left-radius: 5.5px;    border-bottom-left-radius: 5.5px;    box-shadow: 0 0 50px 0 rgb(82 63 105 / 15%);    transform: translateY(-50%);    .item {      display: flex;      flex-direction: column;      align-items: center;      justify-content: center;      padding: 0 8px 10px 10px;      margin: 0;      list-style: none;    }    .item-child {      color: #3698fd;      width: 60px;      height: 60px;      /*padding-top: 10px;*/      text-align: center;      display: flex;      flex-direction: column;      background: #f6f8f9;      align-items: center;      justify-content: center;      border-radius: 5.5px;      font-size: 12px;      background: #ebf5ff;      transition: color 0.15s ease, background-color 0.15s ease, border-color 0.15s ease,        box-shadow 0.15s ease;    }    .item-child2 {      margin-top: 10px;      color: #b37feb;      background: #f7f2fd;      transition: color 0.15s ease, background-color 0.15s ease, border-color 0.15s ease,        box-shadow 0.15s ease;    }  }:deep(.el-drawer__title) {    font-weight: bold;    color: black;  }  .theme-item {    width: 100%;    display: flex;    margin-bottom: 15px;    align-items: center;    font-size: 14px;    color: black;    justify-content: space-between;  }</style>
 |