diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index d1530933..5d7e57f3 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,15 +1,19 @@
{
"recommendations": [
- "voorjaar.windicss-intellisense",
+ "christian-kohler.path-intellisense",
"vscode-icons-team.vscode-icons",
"davidanson.vscode-markdownlint",
"stylelint.vscode-stylelint",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
- "vue.volar",
+ "mrmlnc.vscode-less",
"lokalise.i18n-ally",
+ "redhat.vscode-yaml",
+ "csstools.postcss",
"mikestead.dotenv",
"eamodio.gitlens",
- "antfu.iconify"
+ "antfu.iconify",
+ "antfu.unocss",
+ "Vue.volar"
]
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 469e4017..3a9abed7 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -102,14 +102,12 @@
"i18n-ally.displayLanguage": "zh-CN",
"i18n-ally.enabledFrameworks": ["vue", "react"],
"cSpell.words": [
- "vben",
- "windicss",
- "tailwind",
+ "xingyu",
+ "yudao",
+ "unocss",
"browserslist",
- "tailwindcss",
"esnext",
- "antv",
- "tinymce",
+ "unplugin",
"qrcode",
"sider",
"pinia",
@@ -123,8 +121,9 @@
"codemirror",
"iconify",
"commitlint",
- "vditor",
+ "videojs",
"echarts",
+ "wangeditor",
"cropperjs",
"logicflow",
"vueuse",
@@ -132,8 +131,7 @@
"lintstagedrc",
"brotli",
"sider",
- "pnpm",
- "antd"
+ "pnpm"
],
"vetur.format.scriptInitialIndent": true,
"vetur.format.styleInitialIndent": true,
diff --git a/README.md b/README.md
index dc69a06d..eb93ac38 100644
--- a/README.md
+++ b/README.md
@@ -24,7 +24,7 @@
* 改换 saas,自动引入等功能
* 使用 Element Plus 免费开源的中后台模版,具备如下特性:
-![首页](preview/home.png)
+![首页](public/home.png)
* **最新技术栈**:使用 Vue3、Vite4 等前端前沿技术开发
* **TypeScript**: 应用程序级 JavaScript 的语言
@@ -39,15 +39,15 @@
| 框架 | 说明 | 版本 |
|----------------------------------------------------------------------|------------------|--------|
| [Vue](https://staging-cn.vuejs.org/) | Vue 框架 | 3.3.4 |
-| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.3.9 |
-| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.3.7 |
-| [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 5.0.4 |
-| [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.1.4 |
-| [vueuse](https://vueuse.org/) | 常用工具集 | 10.2.0 |
+| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.4.7 |
+| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.3.8 |
+| [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 5.1.6 |
+| [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.1.6 |
+| [vueuse](https://vueuse.org/) | 常用工具集 | 10.2.1 |
| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.2.2 |
-| [vue-router](https://router.vuejs.org/) | Vue 路由 | 4.2.1 |
-| [windicss](https://cn.windicss.org/) | 下一代工具优先的 CSS 框架 | 3.5.6 |
-| [iconify](https://icon-sets.iconify.design/) | 在线图标库 | 3.1.0 |
+| [vue-router](https://router.vuejs.org/) | Vue 路由 | 4.2.4 |
+| [unocss](https://uno.antfu.me/) | 原子 css | 0.54.0 |
+| [iconify](https://icon-sets.iconify.design/) | 在线图标库 | 3.1.1 |
| [wangeditor](https://www.wangeditor.com/) | 富文本编辑器 | 5.1.23 |
## 开发工具
@@ -56,14 +56,14 @@
| 插件名 | 功能 |
|-------------------------------|--------------------------|
-| TypeScript Vue Plugin (Volar) | 用于 TypeScript 的 Vue 插件 |
+| TypeScript Vue Plugin (Volar) | 用于 TypeScript 的 Vue 插件 |
| Vue Language Features (Volar) | Vue3.0 语法支持 |
-| WindiCSS IntelliSense | 自动完成、语法突出显示、代码折叠和构建等高级功能 |
-| Iconify IntelliSense | Iconify 预览和搜索 |
-| i18n Ally | 国际化智能提示 |
+| unocss | unocss for vscode |
+| Iconify IntelliSense | Iconify 预览和搜索 |
+| i18n Ally | 国际化智能提示 |
| Stylelint | Css 格式化 |
-| Prettier | 代码格式化 |
-| ESLint | 脚本代码检查 |
+| Prettier | 代码格式化 |
+| ESLint | 脚本代码检查 |
| DotENV | env 文件高亮 |
## 内置功能
diff --git a/build/vite/index.ts b/build/vite/index.ts
index d5b6a4ac..02067107 100644
--- a/build/vite/index.ts
+++ b/build/vite/index.ts
@@ -1,7 +1,6 @@
import { resolve } from 'path'
import Vue from '@vitejs/plugin-vue'
import VueJsx from '@vitejs/plugin-vue-jsx'
-import WindiCSS from 'vite-plugin-windicss'
import progress from 'vite-plugin-progress'
import EslintPlugin from 'vite-plugin-eslint'
import PurgeIcons from 'vite-plugin-purge-icons'
@@ -15,6 +14,7 @@ import viteCompression from 'vite-plugin-compression'
import topLevelAwait from 'vite-plugin-top-level-await'
import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
+import UnoCSS from 'unocss/vite'
export function createVitePlugins() {
const root = process.cwd()
@@ -27,7 +27,7 @@ export function createVitePlugins() {
return [
Vue(),
VueJsx(),
- WindiCSS(),
+ UnoCSS(),
progress(),
PurgeIcons(),
ElementPlus({}),
diff --git a/build/vite/optimize.ts b/build/vite/optimize.ts
index 1ee3d280..d34e1b37 100644
--- a/build/vite/optimize.ts
+++ b/build/vite/optimize.ts
@@ -8,7 +8,7 @@ const include = [
'pinia',
'dayjs',
'qrcode',
- 'windicss',
+ 'unocss',
'vue-router',
'vue-types',
'vue-i18n',
diff --git a/package.json b/package.json
index c37df50c..e6be32f8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "yudao-ui-admin-vue3",
- "version": "1.7.3-snapshot",
+ "version": "1.8.0-snapshot",
"description": "基于vue3、vite4、element-plus、typesScript",
"author": "xingyu",
"private": false,
@@ -32,12 +32,12 @@
"@element-plus/icons-vue": "^2.1.0",
"@form-create/designer": "^3.1.0",
"@form-create/element-ui": "^3.1.17",
- "@iconify/iconify": "^3.1.0",
+ "@iconify/iconify": "^3.1.1",
"@videojs-player/vue": "^1.0.0",
- "@vueuse/core": "^10.2.0",
+ "@vueuse/core": "^10.2.1",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.10",
- "@zxcvbn-ts/core": "^3.0.2",
+ "@zxcvbn-ts/core": "^3.0.3",
"animate.css": "^4.1.1",
"axios": "^1.4.0",
"benz-amr-recorder": "^1.1.5",
@@ -45,79 +45,82 @@
"camunda-bpmn-moddle": "^7.0.1",
"cropperjs": "^1.5.13",
"crypto-js": "^4.1.1",
- "dayjs": "^1.11.8",
+ "dayjs": "^1.11.9",
"diagram-js": "^11.6.0",
- "echarts": "^5.4.2",
+ "echarts": "^5.4.3",
"echarts-wordcloud": "^2.1.0",
- "element-plus": "2.3.7",
- "fast-xml-parser": "^4.2.4",
+ "element-plus": "2.3.8",
+ "fast-xml-parser": "^4.2.6",
"highlight.js": "^11.8.0",
"intro.js": "^7.0.1",
"jsencrypt": "^3.3.2",
"lodash-es": "^4.17.21",
"min-dash": "^4.1.1",
- "mitt": "^3.0.0",
+ "mitt": "^3.0.1",
"nprogress": "^0.2.0",
- "pinia": "^2.1.4",
+ "pinia": "^2.1.6",
"qrcode": "^1.5.3",
"qs": "^6.11.2",
"steady-xml": "^0.1.0",
"url": "^0.11.1",
- "video.js": "^8.3.0",
+ "video.js": "^7.21.5",
"vue": "3.3.4",
"vue-dompurify-html": "^4.1.4",
"vue-i18n": "9.2.2",
- "vue-router": "^4.2.2",
- "vue-types": "^5.0.4",
+ "vue-router": "^4.2.4",
+ "vue-types": "^5.1.1",
"vuedraggable": "^4.1.0",
"web-storage-cache": "^1.1.1",
"xml-js": "^1.6.11"
},
"devDependencies": {
- "@commitlint/cli": "^17.6.5",
- "@commitlint/config-conventional": "^17.6.5",
- "@iconify/json": "^2.2.80",
- "@intlify/unplugin-vue-i18n": "^0.11.0",
+ "@commitlint/cli": "^17.6.7",
+ "@commitlint/config-conventional": "^17.6.7",
+ "@iconify/json": "^2.2.95",
+ "@intlify/unplugin-vue-i18n": "^0.12.2",
"@purge-icons/generated": "^0.9.0",
"@types/intro.js": "^5.1.1",
- "@types/lodash-es": "^4.17.7",
- "@types/node": "^20.3.1",
+ "@types/lodash-es": "^4.17.8",
+ "@types/node": "^20.4.0",
"@types/nprogress": "^0.2.0",
- "@types/qrcode": "^1.5.0",
+ "@types/qrcode": "^1.5.1",
"@types/qs": "^6.9.7",
- "@typescript-eslint/eslint-plugin": "^5.59.11",
- "@typescript-eslint/parser": "^5.59.11",
- "@vitejs/plugin-legacy": "^4.0.4",
+ "@typescript-eslint/eslint-plugin": "^6.2.0",
+ "@typescript-eslint/parser": "^6.2.0",
+ "@unocss/transformer-variant-group": "^0.51.4",
+ "@vitejs/plugin-legacy": "^4.1.1",
"@vitejs/plugin-vue": "^4.2.3",
"@vitejs/plugin-vue-jsx": "^3.0.1",
+ "@vue-macros/volar": "^0.12.3",
"autoprefixer": "^10.4.14",
"bpmn-js": "^8.9.0",
"bpmn-js-properties-panel": "^0.46.0",
- "consola": "^3.1.0",
- "eslint": "^8.43.0",
- "eslint-config-prettier": "^8.8.0",
+ "consola": "^3.2.3",
+ "eslint": "^8.46.0",
+ "eslint-config-prettier": "^8.9.0",
"eslint-define-config": "^1.21.0",
- "eslint-plugin-prettier": "^4.2.1",
- "eslint-plugin-vue": "^9.15.0",
- "lint-staged": "^13.2.2",
- "postcss": "^8.4.24",
+ "eslint-plugin-prettier": "^5.0.0",
+ "eslint-plugin-vue": "^9.15.1",
+ "lint-staged": "^13.2.3",
+ "postcss": "^8.4.27",
"postcss-html": "^1.5.0",
"postcss-scss": "^4.0.6",
- "prettier": "^2.8.8",
+ "prettier": "^3.0.0",
"rimraf": "^5.0.1",
- "rollup": "^3.25.1",
- "sass": "^1.63.5",
- "stylelint": "^15.8.0",
- "stylelint-config-recommended": "^12.0.0",
- "stylelint-config-recommended-vue": "^1.4.0",
- "stylelint-config-standard": "^33.0.0",
+ "rollup": "^3.27.0",
+ "sass": "^1.64.1",
+ "stylelint": "^15.10.2",
+ "stylelint-config-recommended": "^13.0.0",
+ "stylelint-config-recommended-vue": "^1.5.0",
+ "stylelint-config-standard": "^34.0.0",
"stylelint-order": "^6.0.3",
- "terser": "^5.18.1",
- "typescript": "5.0.4",
- "unplugin-auto-import": "^0.16.4",
- "unplugin-element-plus": "^0.7.1",
+ "terser": "^5.19.2",
+ "typescript": "5.1.6",
+ "unocss": "^0.54.0",
+ "unplugin-auto-import": "^0.16.6",
+ "unplugin-element-plus": "^0.7.2",
"unplugin-vue-components": "^0.25.1",
- "vite": "4.3.9",
+ "vite": "4.4.7",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-ejs": "^1.6.4",
"vite-plugin-eslint": "^1.8.1",
@@ -125,9 +128,7 @@
"vite-plugin-purge-icons": "^0.9.2",
"vite-plugin-svg-icons": "^2.0.1",
"vite-plugin-top-level-await": "^1.3.1",
- "vite-plugin-windicss": "^1.9.0",
- "vue-tsc": "^1.8.1",
- "windicss": "^3.5.6"
+ "vue-tsc": "^1.8.8"
},
"license": "MIT",
"repository": {
diff --git a/preview/home.png b/public/home.png
old mode 100755
new mode 100644
similarity index 100%
rename from preview/home.png
rename to public/home.png
diff --git a/src/api/login/index.ts b/src/api/login/index.ts
index 536f6a66..b65a90cf 100644
--- a/src/api/login/index.ts
+++ b/src/api/login/index.ts
@@ -37,11 +37,6 @@ export const getInfo = () => {
return request.get({ url: '/system/auth/get-permission-info' })
}
-// 路由
-export const getAsyncRoutes = () => {
- return request.get({ url: '/system/auth/list-menus' })
-}
-
//获取登录验证码
export const sendSmsCode = (data: SmsCodeVO) => {
return request.post({ url: '/system/auth/send-sms-code', data })
diff --git a/src/api/mall/promotion/combination/combinationactivity.ts b/src/api/mall/promotion/combination/combinationactivity.ts
index 1e211c86..71d5d2a4 100644
--- a/src/api/mall/promotion/combination/combinationactivity.ts
+++ b/src/api/mall/promotion/combination/combinationactivity.ts
@@ -1,6 +1,8 @@
import request from '@/config/axios'
import { Sku, Spu } from '@/api/mall/product/spu'
+// TODO @puhui999: combinationActivity.ts
+
export interface CombinationActivityVO {
id?: number
name?: string
diff --git a/src/components/ContentDetailWrap/src/ContentDetailWrap.vue b/src/components/ContentDetailWrap/src/ContentDetailWrap.vue
index 298202b1..a9eacc01 100644
--- a/src/components/ContentDetailWrap/src/ContentDetailWrap.vue
+++ b/src/components/ContentDetailWrap/src/ContentDetailWrap.vue
@@ -28,7 +28,7 @@ onMounted(() => {
diff --git a/src/components/Cropper/src/CopperModal.vue b/src/components/Cropper/src/CopperModal.vue
index 12151813..27052b8a 100644
--- a/src/components/Cropper/src/CopperModal.vue
+++ b/src/components/Cropper/src/CopperModal.vue
@@ -222,7 +222,9 @@ $prefix-cls: #{$namespace}-cropper-am;
transparent 75%,
rgb(0 0 0 / 25%) 0
);
- background-position: 0 0, 12px 12px;
+ background-position:
+ 0 0,
+ 12px 12px;
background-size: 24px 24px;
}
diff --git a/src/components/Descriptions/src/Descriptions.vue b/src/components/Descriptions/src/Descriptions.vue
index 0baa396c..06e1096a 100644
--- a/src/components/Descriptions/src/Descriptions.vue
+++ b/src/components/Descriptions/src/Descriptions.vue
@@ -71,14 +71,14 @@ const toggleClick = () => {
diff --git a/src/components/Dialog/src/Dialog.vue b/src/components/Dialog/src/Dialog.vue
index c1114d36..5fd298bb 100644
--- a/src/components/Dialog/src/Dialog.vue
+++ b/src/components/Dialog/src/Dialog.vue
@@ -99,13 +99,19 @@ const dialogStyle = computed(() => {
diff --git a/src/components/Editor/src/Editor.vue b/src/components/Editor/src/Editor.vue
index 3b2013d1..d972552d 100644
--- a/src/components/Editor/src/Editor.vue
+++ b/src/components/Editor/src/Editor.vue
@@ -164,7 +164,6 @@ const handleChange = (editor: IDomEditor) => {
// 组件销毁时,及时销毁编辑器
onBeforeUnmount(() => {
const editor = unref(editorRef.value)
- if (editor === null) return
// 销毁,并移除 editor
editor?.destroy()
@@ -181,12 +180,12 @@ defineExpose({
-
+
({}) // 元素 businessObject 镜像,提
const conditionFormVisible = ref(false) // 流转条件设置
const formVisible = ref(false) // 表单配置
const bpmnElement = ref()
-const timer = ref()
+
provide('prefix', props.prefix)
provide('width', props.width)
const bpmnInstances = () => (window as any)?.bpmnInstances
-const initModels = () => {
- // console.log(props, 'props')
- // console.log(props.bpmnModeler, 'sakdjjaskdsajdkasdjkadsjk')
- // 初始化 modeler 以及其他 moddle
- // nextTick(() => {
- if (!props.bpmnModeler) {
+
+// 监听 props.bpmnModeler 然后 initModels
+const unwatchBpmn = watch(
+ () => props.bpmnModeler,
+ () => {
// 避免加载时 流程图 并未加载完成
- timer.value = setTimeout(() => initModels(), 10)
- return
- }
- if (timer.value) {
- clearTimeout(timer.value)
+ if (!props.bpmnModeler) {
+ console.log('缺少props.bpmnModeler')
+ return
+ }
+
+ console.log('props.bpmnModeler 有值了!!!')
const w = window as any
w.bpmnInstances = {
modeler: props.bpmnModeler,
@@ -137,12 +137,16 @@ const initModels = () => {
replace: props.bpmnModeler.get('replace'),
selection: props.bpmnModeler.get('selection')
}
- }
- console.log(bpmnInstances(), 'window.bpmnInstances')
- getActiveElement()
- // })
-}
+ console.log(bpmnInstances(), 'window.bpmnInstances')
+ getActiveElement()
+ unwatchBpmn()
+ },
+ {
+ immediate: true
+ }
+)
+
const getActiveElement = () => {
// 初始第一个选中元素 bpmn:Process
initFormOnChanged(null)
@@ -190,11 +194,7 @@ const initFormOnChanged = (element) => {
)
formVisible.value = elementType.value === 'UserTask' || elementType.value === 'StartEvent'
}
-onMounted(() => {
- setTimeout(() => {
- initModels()
- }, 100)
-})
+
onBeforeUnmount(() => {
const w = window as any
w.bpmnInstances = null
diff --git a/src/hooks/web/useTable.ts b/src/hooks/web/useTable.ts
index 3f0d5055..361dd678 100644
--- a/src/hooks/web/useTable.ts
+++ b/src/hooks/web/useTable.ts
@@ -136,9 +136,7 @@ export const useTable = (config?: UseTableConfig) => {
})
if (res) {
tableObject.tableList = (res as unknown as ResponseType).list
- if ((res as unknown as ResponseType).total) {
- tableObject.total = (res as unknown as ResponseType).total as unknown as number
- }
+ tableObject.total = (res as unknown as ResponseType).total ?? 0
}
},
setProps: async (props: TableProps = {}) => {
diff --git a/src/layout/components/AppView.vue b/src/layout/components/AppView.vue
index fe480b55..ffdf11f5 100644
--- a/src/layout/components/AppView.vue
+++ b/src/layout/components/AppView.vue
@@ -18,26 +18,33 @@ const tagsViewStore = useTagsViewStore()
const getCaches = computed((): string[] => {
return tagsViewStore.getCachedViews
})
+
+const tagsView = computed(() => appStore.getTagsView)
{
:class="$attrs.class"
:color="color"
:size="18"
- class="cursor-pointer"
+ class="cursor-pointer !p-0"
icon="ion:language-sharp"
/>
diff --git a/src/layout/components/Logo/src/Logo.vue b/src/layout/components/Logo/src/Logo.vue
index 72620168..71856fff 100644
--- a/src/layout/components/Logo/src/Logo.vue
+++ b/src/layout/components/Logo/src/Logo.vue
@@ -62,8 +62,7 @@ watch(
:class="[
prefixCls,
layout !== 'classic' ? `${prefixCls}__Top` : '',
- 'flex !h-[var(--logo-height)] items-center cursor-pointer justify-center relative',
- 'dark:bg-[var(--el-bg-color)]'
+ 'flex !h-[var(--logo-height)] items-center cursor-pointer pl-8px relative decoration-none overflow-hidden'
]"
to="/"
>
diff --git a/src/layout/components/Menu/src/Menu.vue b/src/layout/components/Menu/src/Menu.vue
index 73f48fd6..51d0c61b 100644
--- a/src/layout/components/Menu/src/Menu.vue
+++ b/src/layout/components/Menu/src/Menu.vue
@@ -138,15 +138,6 @@ $prefix-cls: #{$namespace}-menu;
position: relative;
transition: width var(--transition-time-02);
- &:after {
- position: absolute;
- top: 0;
- right: 0;
- height: 100%;
- border-left: 1px solid var(--left-menu-border-color);
- content: '';
- }
-
:deep(.#{$elNamespace}-menu) {
width: 100% !important;
border-right: none;
diff --git a/src/layout/components/Message/src/Message.vue b/src/layout/components/Message/src/Message.vue
index 2e0f246a..fbcccd7f 100644
--- a/src/layout/components/Message/src/Message.vue
+++ b/src/layout/components/Message/src/Message.vue
@@ -35,9 +35,12 @@ onMounted(() => {
// 首次加载小红点
getUnreadCount()
// 轮询刷新小红点
- setInterval(() => {
- getUnreadCount()
- }, 1000 * 60 * 2)
+ setInterval(
+ () => {
+ getUnreadCount()
+ },
+ 1000 * 60 * 2
+ )
})
diff --git a/src/layout/components/Setting/src/Setting.vue b/src/layout/components/Setting/src/Setting.vue
index 28fc45c5..00d0a8fe 100644
--- a/src/layout/components/Setting/src/Setting.vue
+++ b/src/layout/components/Setting/src/Setting.vue
@@ -44,7 +44,6 @@ const setHeaderTheme = (color: string) => {
setCssVar('--top-header-bg-color', color)
setCssVar('--top-header-text-color', textColor)
setCssVar('--top-header-hover-color', textHoverColor)
- setCssVar('--top-tool-border-color', topToolBorderColor)
appStore.setTheme({
topHeaderBgColor: color,
topHeaderTextColor: textColor,
diff --git a/src/layout/components/TabMenu/src/TabMenu.vue b/src/layout/components/TabMenu/src/TabMenu.vue
index a5a58ad2..061c5a39 100644
--- a/src/layout/components/TabMenu/src/TabMenu.vue
+++ b/src/layout/components/TabMenu/src/TabMenu.vue
@@ -139,7 +139,7 @@ export default defineComponent({
id={`${variables.namespace}-menu`}
class={[
prefixCls,
- 'relative bg-[var(--left-menu-bg-color)] top-1px z-3000',
+ 'relative bg-[var(--left-menu-bg-color)] top-1px z-3000 layout-border__right',
{
'w-[var(--tab-menu-max-width)]': !unref(collapse),
'w-[var(--tab-menu-min-width)]': unref(collapse)
@@ -195,7 +195,7 @@ export default defineComponent({