diff --git a/package.json b/package.json index af84be34..b0e8f1f3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue3-element-admin", "private": true, - "version": "2.6.0", + "version": "2.6.1", "scripts": { "preinstall": "npx only-allow pnpm", "dev": "vite serve --mode development", @@ -46,9 +46,8 @@ "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "5.1.10", "axios": "^1.4.0", - "codemirror": "^5.65.13", "echarts": "^5.2.2", - "element-plus": "^2.3.9", + "element-plus": "^2.3.12", "lodash-es": "^4.17.21", "mockjs": "^1.1.0", "nprogress": "^0.2.0", @@ -56,8 +55,9 @@ "path-to-regexp": "^6.2.0", "pinia": "^2.0.33", "screenfull": "^6.0.0", + "sockjs-client": "1.6.1", "sortablejs": "^1.15.0", - "terser": "^5.19.3", + "stompjs": "^2.3.3", "vue": "^3.3.4", "vue-i18n": "9.2.2", "vue-router": "^4.2.0", @@ -67,11 +67,12 @@ "@commitlint/cli": "^17.6.3", "@commitlint/config-conventional": "^17.6.3", "@iconify-json/ep": "^1.1.10", - "@types/codemirror": "^5.60.7", "@types/lodash": "^4.14.195", "@types/nprogress": "^0.2.0", "@types/path-browserify": "^1.0.0", + "@types/sockjs-client": "^1.5.1", "@types/sortablejs": "^1.15.1", + "@types/stompjs": "^2.3.5", "@typescript-eslint/eslint-plugin": "^5.59.6", "@typescript-eslint/parser": "^5.59.6", "autoprefixer": "^10.4.14", @@ -89,7 +90,6 @@ "postcss-html": "^1.5.0", "postcss-scss": "^4.0.6", "prettier": "^2.8.8", - "rollup-plugin-visualizer": "^5.9.2", "sass": "^1.58.3", "stylelint": "^15.10.2", "stylelint-config-html": "^1.1.0", @@ -103,8 +103,7 @@ "unplugin-auto-import": "^0.15.3", "unplugin-icons": "^0.16.1", "unplugin-vue-components": "^0.24.1", - "vite": "^4.4.2", - "vite-plugin-compression": "^0.5.1", + "vite": "^4.4.9", "vite-plugin-mock": "^3.0.0", "vite-plugin-svg-icons": "^2.0.1", "vue-tsc": "^1.7.0 " diff --git a/src/components/TagInput/index.vue b/src/components/TagInput/index.vue deleted file mode 100644 index 92b4129b..00000000 --- a/src/components/TagInput/index.vue +++ /dev/null @@ -1,510 +0,0 @@ - - - - diff --git a/src/components/TagInput/util.ts b/src/components/TagInput/util.ts deleted file mode 100644 index f216e311..00000000 --- a/src/components/TagInput/util.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * getRePosFromStr 正则匹配字段返回位置信息 - * */ -export function getRePosFromStr(text: any = "", re: any = /\$.+?\$/g) { - const lines = text.split("\n"); - const positions: any = []; - let m; - for (let i = 0; i < lines.length; i++) { - const l = lines[i]; - while ((m = re.exec(l)) !== null) { - const tag = m[0].substring(1, m[0].length - 1); - positions.push({ - line: i, - start: m.index, - stop: m.index + m[0].length, - tag, - }); - } - } - return positions; -} -/** - * 输入框模式 - */ -export enum MODE { - // 文本 - TEXT = 1, - // 公式 - FORMULA, - // 只允许选择tag - ONLYTAG, - // 日期 - DATE, -} diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index 0de8378a..14a64e9e 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -28,7 +28,7 @@ const tagsViewStore = useTagsViewStore(); } .fixed-header + .app-main { - padding-top: 50px; + padding-top: 34px; } .hasTagsView { @@ -42,4 +42,31 @@ const tagsViewStore = useTagsViewStore(); padding-top: 84px; } } + +.isMix { + .app-main { + height: calc(100vh - 50px); + overflow-y: auto; + } + + .hasTagsView { + .app-main { + /* 84 = navbar + tags-view = 50 + 34 */ + height: calc(100vh - 84px); + } + + .fixed-header + .app-main { + min-height: calc(100vh - 50px); + padding-top: 34px; + } + } +} + +.isTop { + .hasTagsView { + .fixed-header + .app-main { + padding-top: 34px; + } + } +} diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue index f66ac1d1..d370b269 100644 --- a/src/layout/components/Settings/index.vue +++ b/src/layout/components/Settings/index.vue @@ -5,14 +5,32 @@ import { useAppStore } from "@/store/modules/app"; import IconEpSunny from "~icons/ep/sunny"; import IconEpMoon from "~icons/ep/moon"; import { useRoute } from "vue-router"; - +import defaultSettings from "@/settings"; /** * 暗黑模式 */ const settingsStore = useSettingsStore(); const permissionStore = usePermissionStore(); const appStore = useAppStore(); + const isDark = useDark(); +console.log("isDark1", isDark.value); + +watch( + () => defaultSettings.theme, + (newVal: string) => { + if ( + (newVal == "dark" && isDark.value == false) || + (newVal == "light" && isDark.value == true) + ) { + toggleDark(); + console.log("isDark2", isDark.value); + } + } +); + +computed(() => {}); + const toggleDark = () => useToggle(isDark); function findOutermostParent(tree: any[], findName: string) { diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue index 3f4c6401..96a3c57e 100644 --- a/src/layout/components/Sidebar/Logo.vue +++ b/src/layout/components/Sidebar/Logo.vue @@ -10,6 +10,8 @@ defineProps({ }, }); +const layout = computed(() => settingsStore.layout); + const logo = ref(new URL(`../../../assets/logo.png`, import.meta.url).href); @@ -25,9 +27,6 @@ const logo = ref(new URL(`../../../assets/logo.png`, import.meta.url).href); to="/" > - vue3-element-admin { + + diff --git a/src/settings.ts b/src/settings.ts index 02920e10..8531e7ca 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,10 +1,11 @@ -// 系统设置 +/** + * 系统设置 + */ interface DefaultSettings { /** * 系统title */ title: string; - /** * 是否显示设置 */ @@ -22,21 +23,21 @@ interface DefaultSettings { */ sidebarLogo: boolean; /** - * 导航栏布局 + * 导航栏布局(left|top|mix) */ layout: string; /** - * 主题模式 + * 主题模式(dark|light) */ theme: string; /** - * 布局大小 + * 布局大小(default |large |small) */ size: string; /** - * 语言 + * 语言( zh-cn| en) */ language: string; } @@ -47,16 +48,10 @@ const defaultSettings: DefaultSettings = { tagsView: true, fixedHeader: false, sidebarLogo: true, - layout: "mix", - /** - * 主题模式 - * - * dark:暗黑模式 - * light: 明亮模式 - */ - theme: "dark", - size: "default", // default |large |small - language: "zh-cn", // zh-cn| en + layout: "mix", // 默认混合模式 + theme: "dark", // 默认暗黑模式 + size: "default", + language: "zh-cn", }; export default defaultSettings; diff --git a/src/store/modules/settings.ts b/src/store/modules/settings.ts index 908359c3..1caaed74 100644 --- a/src/store/modules/settings.ts +++ b/src/store/modules/settings.ts @@ -1,15 +1,18 @@ import { defineStore } from "pinia"; import defaultSettings from "@/settings"; -import { useStorage } from "@vueuse/core"; export const useSettingsStore = defineStore("setting", () => { // state const tagsView = useStorage("tagsView", defaultSettings.tagsView); const showSettings = ref(defaultSettings.showSettings); - const fixedHeader = ref(defaultSettings.fixedHeader); const sidebarLogo = ref(defaultSettings.sidebarLogo); + const fixedHeader = useStorage( + "fixedHeader", + defaultSettings.fixedHeader + ); + const layout = useStorage("layout", defaultSettings.layout); // actions @@ -31,8 +34,6 @@ export const useSettingsStore = defineStore("setting", () => { case "layout": layout.value = value; break; - default: - break; } } diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index 66958b81..7e0a26c2 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -83,14 +83,11 @@ } } - .left-wrap { - .svg-icon { - margin-top: -2px; - margin-right: 12px; - } - } - .hideSidebar { + .left-wrap { + width: 54px; + } + .sidebar-container { width: 54px !important; @@ -100,7 +97,7 @@ .header { .logo-wrap { - width: 63px !important; + width: 54px !important; transition: transform 0.28s; } } diff --git a/src/views/demo/taginput.vue b/src/views/demo/taginput.vue deleted file mode 100644 index 9301bb05..00000000 --- a/src/views/demo/taginput.vue +++ /dev/null @@ -1,105 +0,0 @@ - - - diff --git a/src/views/demo/websocket.vue b/src/views/demo/websocket.vue index ce54afc2..ffbc4c7a 100644 --- a/src/views/demo/websocket.vue +++ b/src/views/demo/websocket.vue @@ -4,7 +4,9 @@ import { sendToAll, sendToUser } from "@/api/websocket"; // 点对点消息列 import { useUserStore } from "@/store/modules/user"; -import { useWebSocket } from "@vueuse/core"; +import SockJS from "sockjs-client"; // 报错 global is not defined 换成下面的引入 +// import SockJS from "sockjs-client/dist/sockjs.min.js"; +import Stomp from "stompjs"; const inputVal = ref("初始内容"); @@ -13,58 +15,6 @@ const p2pMsgs = ref(["接收到一条点对线消息"]); const userId = useUserStore().userId; -const { data, status, close, send, open } = useWebSocket( - "ws://localhost:8989/ws", - { - onConnected(ws) { - console.log("订阅主题"); - // 连接建立后发送订阅消息 - ws.send(JSON.stringify({ type: "subscribe", topic: "/topic/all" })); - }, - onMessage(ws, event) { - // 获取接收到的消息内容 - const message = event.data; - - // 处理消息内容 - console.log("Received message:", message); - }, - } -); - -// 监听 WebSocket 连接状态变化 -watch(status, (newStatus) => { - if (newStatus === "OPEN") { - // 连接已打开,订阅主题 - console.log(" 连接已打开,订阅主题"); - const subscribeMessage = { - type: "subscribe", - channel: "/topic/all", - }; - send(JSON.stringify(subscribeMessage)); - } else if (newStatus === "CLOSED") { - // 连接已关闭,执行相应的清理操作 - // ... - } -}); - -// 监听 WebSocket 接收到的消息 -watch(data, (newData) => { - console.log("Received data:", newData); - - // 解析消息体 - const message = JSON.parse(newData); - - // 判断消息主题并处理 - if (message.topic === "topic1") { - // 处理来自 topic1 的消息 - console.log("Received message from topic1:", message); - } else if (message.topic === "topic2") { - // 处理来自 topic2 的消息 - console.log("Received message from topic2:", message); - } - // 可以根据需要添加更多的判断逻辑来处理其他主题的消息 -}); - function handleSendToAll() { sendToAll(inputVal.value); } @@ -72,7 +22,24 @@ function handleSendToAll() { function handleSendToUser() { sendToUser(userId, inputVal.value); } -onMounted(() => {}); + +let stompClient: Stomp.Client; + +function initWebSocket() { + stompClient = Stomp.overWS("ws://localhost:8989/ws"); + + stompClient.connect({}, () => { + console.log("连接成功"); + + stompClient.subscribe("/topic/all", (res) => { + console.log("订阅响应"); + }); + }); +} + +onMounted(() => { + initWebSocket(); +});