Commit c7b6030418156a16b841298553848078427b7285

Authored by xingyu
1 parent 2d5571bc

feat: 添加消息图标面板

yudao-ui-admin-vue3/src/layout/components/Message/index.ts 0 → 100644
  1 +import Message from './src/Message.vue'
  2 +
  3 +export { Message }
yudao-ui-admin-vue3/src/layout/components/Message/src/Message.vue 0 → 100644
  1 +<template>
  2 + <div class="message">
  3 + <el-popover placement="bottom" :width="310" trigger="click">
  4 + <template #reference>
  5 + <el-badge :value="noticeList.length" class="item">
  6 + <Icon icon="ep:bell" :size="18" class="cursor-pointer" />
  7 + </el-badge>
  8 + </template>
  9 + <el-tabs v-model="activeName">
  10 + <el-tab-pane label="通知(5)" name="first">
  11 + <div class="message-list">
  12 + <template v-for="item in noticeList" :key="item.id">
  13 + <div class="message-item">
  14 + <img src="@/assets/imgs/avatar.gif" alt="" class="message-icon" />
  15 + <div class="message-content">
  16 + <span class="message-title">{{ item.title }}</span>
  17 + <span class="message-date">{{ item.date }}</span>
  18 + </div>
  19 + </div>
  20 + </template>
  21 + </div>
  22 + </el-tab-pane>
  23 + <el-tab-pane label="消息(0)" name="second">
  24 + <div class="message-list">
  25 + <template v-for="item in messageList" :key="item.id">
  26 + <div class="message-item">
  27 + <img src="@/assets/imgs/avatar.gif" alt="" class="message-icon" />
  28 + <div class="message-content">
  29 + <span class="message-title">{{ item.title }}</span>
  30 + <span class="message-date">{{ item.date }}</span>
  31 + </div>
  32 + </div>
  33 + </template>
  34 + </div>
  35 + </el-tab-pane>
  36 + <el-tab-pane label="代办(0)" name="third">
  37 + <div class="message-list">
  38 + <template v-for="item in needList" :key="item.id">
  39 + <div class="message-item">
  40 + <img src="@/assets/imgs/avatar.gif" alt="" class="message-icon" />
  41 + <div class="message-content">
  42 + <span class="message-title">{{ item.title }}</span>
  43 + <span class="message-date">{{ item.date }}</span>
  44 + </div>
  45 + </div>
  46 + </template>
  47 + </div>
  48 + </el-tab-pane>
  49 + </el-tabs>
  50 + </el-popover>
  51 + </div>
  52 +</template>
  53 +
  54 +<script setup lang="ts">
  55 +import { ref } from 'vue'
  56 +import { ElTabs, ElTabPane, ElPopover, ElBadge } from 'element-plus'
  57 +
  58 +const activeName = ref('first')
  59 +
  60 +const noticeList = ref([
  61 + { id: 1, title: '版本升级1', date: '2022-12-12 10:00:00' },
  62 + { id: 2, title: '版本升级2', date: '2022-12-12 10:00:00' },
  63 + { id: 3, title: '版本升级3', date: '2022-12-12 10:00:00' },
  64 + { id: 4, title: '版本升级4', date: '2022-12-12 10:00:00' },
  65 + { id: 5, title: '版本升级5', date: '2022-12-12 10:00:00' }
  66 +])
  67 +const messageList = ref([
  68 + { id: 1, title: '加班1', date: '2022-12-12 10:00:00' },
  69 + { id: 2, title: '加班2', date: '2022-12-12 10:00:00' },
  70 + { id: 3, title: '加班3', date: '2022-12-12 10:00:00' },
  71 + { id: 4, title: '加班4', date: '2022-12-12 10:00:00' },
  72 + { id: 5, title: '加班5', date: '2022-12-12 10:00:00' }
  73 +])
  74 +const needList = ref([
  75 + { id: 1, title: '审批1', date: '2022-12-12 10:00:00' },
  76 + { id: 2, title: '审批2', date: '2022-12-12 10:00:00' },
  77 + { id: 3, title: '审批3', date: '2022-12-12 10:00:00' },
  78 + { id: 4, title: '审批4', date: '2022-12-12 10:00:00' },
  79 + { id: 5, title: '审批5', date: '2022-12-12 10:00:00' }
  80 +])
  81 +</script>
  82 +
  83 +<style scoped lang="scss">
  84 +.message-empty {
  85 + display: flex;
  86 + flex-direction: column;
  87 + align-items: center;
  88 + justify-content: center;
  89 + height: 260px;
  90 + line-height: 45px;
  91 +}
  92 +.message-list {
  93 + display: flex;
  94 + flex-direction: column;
  95 + .message-item {
  96 + display: flex;
  97 + align-items: center;
  98 + padding: 20px 0;
  99 + border-bottom: 1px solid var(--el-border-color-light);
  100 + &:last-child {
  101 + border: none;
  102 + }
  103 + .message-icon {
  104 + width: 40px;
  105 + height: 40px;
  106 + margin: 0 20px 0 5px;
  107 + }
  108 + .message-content {
  109 + display: flex;
  110 + flex-direction: column;
  111 + .message-title {
  112 + margin-bottom: 5px;
  113 + }
  114 + .message-date {
  115 + font-size: 12px;
  116 + color: var(--el-text-color-secondary);
  117 + }
  118 + }
  119 + }
  120 +}
  121 +</style>
yudao-ui-admin-vue3/src/layout/components/Setting/src/Setting.vue
@@ -122,6 +122,8 @@ const copyConfig = async () =&gt; { @@ -122,6 +122,8 @@ const copyConfig = async () =&gt; {
122 size: ${appStore.getSize}, 122 size: ${appStore.getSize},
123 // 多语言图标 123 // 多语言图标
124 locale: ${appStore.getLocale}, 124 locale: ${appStore.getLocale},
  125 + // 消息图标
  126 + message: ${appStore.getMessage},
125 // 标签页 127 // 标签页
126 tagsView: ${appStore.getTagsView}, 128 tagsView: ${appStore.getTagsView},
127 // 标签页图标 129 // 标签页图标
yudao-ui-admin-vue3/src/layout/components/Setting/src/components/InterfaceDisplay.vue
@@ -57,6 +57,13 @@ const localeChange = (show: boolean) =&gt; { @@ -57,6 +57,13 @@ const localeChange = (show: boolean) =&gt; {
57 appStore.setLocale(show) 57 appStore.setLocale(show)
58 } 58 }
59 59
  60 +// 消息图标
  61 +const message = ref(appStore.getMessage)
  62 +
  63 +const messageChange = (show: boolean) => {
  64 + appStore.setMessage(show)
  65 +}
  66 +
60 // 标签页 67 // 标签页
61 const tagsView = ref(appStore.getTagsView) 68 const tagsView = ref(appStore.getTagsView)
62 69
@@ -165,6 +172,11 @@ watch( @@ -165,6 +172,11 @@ watch(
165 </div> 172 </div>
166 173
167 <div class="flex justify-between items-center"> 174 <div class="flex justify-between items-center">
  175 + <span class="text-14px">{{ t('setting.messageIcon') }}</span>
  176 + <ElSwitch v-model="message" @change="messageChange" />
  177 + </div>
  178 +
  179 + <div class="flex justify-between items-center">
168 <span class="text-14px">{{ t('setting.tagsView') }}</span> 180 <span class="text-14px">{{ t('setting.tagsView') }}</span>
169 <ElSwitch v-model="tagsView" @change="tagsViewChange" /> 181 <ElSwitch v-model="tagsView" @change="tagsViewChange" />
170 </div> 182 </div>
yudao-ui-admin-vue3/src/layout/components/ToolHeader.vue
1 <script lang="tsx"> 1 <script lang="tsx">
2 import { defineComponent, computed } from 'vue' 2 import { defineComponent, computed } from 'vue'
  3 +import { Message } from '@/layout/components//Message'
3 import { Collapse } from '@/layout/components/Collapse' 4 import { Collapse } from '@/layout/components/Collapse'
4 -import { LocaleDropdown } from '@/layout/components/LocaleDropdown'  
5 -import { SizeDropdown } from '@/layout/components/SizeDropdown'  
6 import { UserInfo } from '@/layout/components/UserInfo' 5 import { UserInfo } from '@/layout/components/UserInfo'
7 import { Screenfull } from '@/layout/components/Screenfull' 6 import { Screenfull } from '@/layout/components/Screenfull'
8 import { Breadcrumb } from '@/layout/components/Breadcrumb' 7 import { Breadcrumb } from '@/layout/components/Breadcrumb'
  8 +import { SizeDropdown } from '@/layout/components/SizeDropdown'
  9 +import { LocaleDropdown } from '@/layout/components/LocaleDropdown'
9 import { useAppStore } from '@/store/modules/app' 10 import { useAppStore } from '@/store/modules/app'
10 import { useDesign } from '@/hooks/web/useDesign' 11 import { useDesign } from '@/hooks/web/useDesign'
11 12
@@ -33,6 +34,9 @@ const layout = computed(() =&gt; appStore.getLayout) @@ -33,6 +34,9 @@ const layout = computed(() =&gt; appStore.getLayout)
33 // 多语言图标 34 // 多语言图标
34 const locale = computed(() => appStore.getLocale) 35 const locale = computed(() => appStore.getLocale)
35 36
  37 +// 消息图标
  38 +const message = computed(() => appStore.getMessage)
  39 +
36 export default defineComponent({ 40 export default defineComponent({
37 name: 'ToolHeader', 41 name: 'ToolHeader',
38 setup() { 42 setup() {
@@ -66,6 +70,9 @@ export default defineComponent({ @@ -66,6 +70,9 @@ export default defineComponent({
66 color="var(--top-header-text-color)" 70 color="var(--top-header-text-color)"
67 ></LocaleDropdown> 71 ></LocaleDropdown>
68 ) : undefined} 72 ) : undefined}
  73 + {message.value ? (
  74 + <Message class="hover-trigger" color="var(--top-header-text-color)"></Message>
  75 + ) : undefined}
69 <UserInfo class="hover-trigger"></UserInfo> 76 <UserInfo class="hover-trigger"></UserInfo>
70 </div> 77 </div>
71 </div> 78 </div>
yudao-ui-admin-vue3/src/locales/en.ts
@@ -80,6 +80,7 @@ export default { @@ -80,6 +80,7 @@ export default {
80 screenfullIcon: 'Screenfull icon', 80 screenfullIcon: 'Screenfull icon',
81 sizeIcon: 'Size icon', 81 sizeIcon: 'Size icon',
82 localeIcon: 'Locale icon', 82 localeIcon: 'Locale icon',
  83 + messageIcon: 'Message icon',
83 tagsView: 'Tags view', 84 tagsView: 'Tags view',
84 logo: 'Logo', 85 logo: 'Logo',
85 greyMode: 'Grey mode', 86 greyMode: 'Grey mode',
yudao-ui-admin-vue3/src/locales/zh-CN.ts
@@ -80,6 +80,7 @@ export default { @@ -80,6 +80,7 @@ export default {
80 screenfullIcon: '全屏图标', 80 screenfullIcon: '全屏图标',
81 sizeIcon: '尺寸图标', 81 sizeIcon: '尺寸图标',
82 localeIcon: '多语言图标', 82 localeIcon: '多语言图标',
  83 + messageIcon: '消息图标',
83 tagsView: '标签页', 84 tagsView: '标签页',
84 logo: '标志', 85 logo: '标志',
85 greyMode: '灰色模式', 86 greyMode: '灰色模式',
yudao-ui-admin-vue3/src/store/modules/app.ts
@@ -18,6 +18,7 @@ interface AppState { @@ -18,6 +18,7 @@ interface AppState {
18 screenfull: boolean 18 screenfull: boolean
19 size: boolean 19 size: boolean
20 locale: boolean 20 locale: boolean
  21 + message: boolean
21 tagsView: boolean 22 tagsView: boolean
22 tagsViewIcon: boolean 23 tagsViewIcon: boolean
23 logo: boolean 24 logo: boolean
@@ -53,6 +54,7 @@ export const useAppStore = defineStore(&#39;app&#39;, { @@ -53,6 +54,7 @@ export const useAppStore = defineStore(&#39;app&#39;, {
53 screenfull: true, // 全屏图标 54 screenfull: true, // 全屏图标
54 size: true, // 尺寸图标 55 size: true, // 尺寸图标
55 locale: true, // 多语言图标 56 locale: true, // 多语言图标
  57 + message: true, // 消息图标
56 tagsView: true, // 标签页 58 tagsView: true, // 标签页
57 tagsViewIcon: true, // 是否显示标签图标 59 tagsViewIcon: true, // 是否显示标签图标
58 logo: true, // logo 60 logo: true, // logo
@@ -121,6 +123,9 @@ export const useAppStore = defineStore(&#39;app&#39;, { @@ -121,6 +123,9 @@ export const useAppStore = defineStore(&#39;app&#39;, {
121 getLocale(): boolean { 123 getLocale(): boolean {
122 return this.locale 124 return this.locale
123 }, 125 },
  126 + getMessage(): boolean {
  127 + return this.message
  128 + },
124 getTagsView(): boolean { 129 getTagsView(): boolean {
125 return this.tagsView 130 return this.tagsView
126 }, 131 },
@@ -195,6 +200,9 @@ export const useAppStore = defineStore(&#39;app&#39;, { @@ -195,6 +200,9 @@ export const useAppStore = defineStore(&#39;app&#39;, {
195 setLocale(locale: boolean) { 200 setLocale(locale: boolean) {
196 this.locale = locale 201 this.locale = locale
197 }, 202 },
  203 + setMessage(message: boolean) {
  204 + this.message = message
  205 + },
198 setTagsView(tagsView: boolean) { 206 setTagsView(tagsView: boolean) {
199 this.tagsView = tagsView 207 this.tagsView = tagsView
200 }, 208 },