vue3-admin-gpt 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue3-admin-gpt",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "A Vue3 admin template with Element Plus and Rspack",
5
5
  "author": "pxq555",
6
6
  "license": "MIT",
@@ -47,13 +47,13 @@
47
47
  "mitt": "^3.0.1",
48
48
  "mockjs": "^1.1.0",
49
49
  "nprogress": "^0.2.0",
50
+ "pinia": "^3.0.4",
50
51
  "qs": "^6.14.1",
51
52
  "screenfull": "^6.0.2",
52
53
  "vue": "^3.5.27",
53
54
  "vue-echarts": "^8.0.1",
54
55
  "vue-router": "^5.0.2",
55
- "vuedraggable": "^2.24.3",
56
- "vuex": "^4.1.0"
56
+ "vuedraggable": "^2.24.3"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@babel/core": "^7.29.0",
@@ -2,7 +2,7 @@
2
2
  * @description 路由守卫,目前两种模式:all模式与intelligence模式
3
3
  */
4
4
  import router from "@/router";
5
- import store from "@/store";
5
+ import { useUserStore, useRoutesStore } from "@/store";
6
6
  import VabProgress from "nprogress";
7
7
  import "nprogress/nprogress.css";
8
8
  import getPageTitle from "@/utils/pageTitle";
@@ -24,7 +24,9 @@ VabProgress.configure({
24
24
 
25
25
  router.beforeEach(async (to, from, next) => {
26
26
  if (progressBar) VabProgress.start();
27
- let hasToken = store.getters["user/accessToken"];
27
+ const userStore = useUserStore();
28
+ const routesStore = useRoutesStore();
29
+ let hasToken = userStore.accessToken;
28
30
 
29
31
  if (!loginInterception) hasToken = true;
30
32
 
@@ -34,8 +36,8 @@ router.beforeEach(async (to, from, next) => {
34
36
  if (progressBar) VabProgress.done();
35
37
  } else {
36
38
  const hasPermissions =
37
- store.getters["user/permissions"] &&
38
- store.getters["user/permissions"].length > 0;
39
+ userStore.permissions &&
40
+ userStore.permissions.length > 0;
39
41
  if (hasPermissions) {
40
42
  next();
41
43
  } else {
@@ -43,10 +45,10 @@ router.beforeEach(async (to, from, next) => {
43
45
  let permissions;
44
46
  if (!loginInterception) {
45
47
  //settings.js loginInterception为false时,创建虚拟权限
46
- await store.dispatch("user/setPermissions", ["admin"]);
48
+ await userStore.setPermissions(["admin"]);
47
49
  permissions = ["admin"];
48
50
  } else {
49
- permissions = await store.dispatch("user/getUserInfo");
51
+ permissions = await userStore.getUserInfo();
50
52
  if (!permissions) {
51
53
  throw new Error("获取用户权限失败");
52
54
  }
@@ -54,12 +56,11 @@ router.beforeEach(async (to, from, next) => {
54
56
 
55
57
  let accessRoutes = [];
56
58
  if (authentication === "intelligence") {
57
- accessRoutes = await store.dispatch(
58
- "routes/setRoutes",
59
+ accessRoutes = await routesStore.setRoutes(
59
60
  permissions
60
61
  );
61
62
  } else if (authentication === "all") {
62
- accessRoutes = await store.dispatch("routes/setAllRoutes");
63
+ accessRoutes = await routesStore.setAllRoutes();
63
64
  }
64
65
 
65
66
  // 确保accessRoutes是数组
@@ -78,7 +79,7 @@ router.beforeEach(async (to, from, next) => {
78
79
  } catch (error) {
79
80
  console.error("路由守卫错误:", error);
80
81
  ElMessage.error(error.message || "发生错误,请重新登录");
81
- await store.dispatch("user/resetAccessToken");
82
+ await userStore.resetAccessToken();
82
83
  next(`/login?redirect=${to.path}`);
83
84
  if (progressBar) VabProgress.done();
84
85
  }
@@ -13,10 +13,10 @@
13
13
  </template>
14
14
 
15
15
  <script>
16
- import { mapActions, mapGetters } from "vuex";
17
16
  import { copyright, footerCopyright, keepAliveMaxNum, title } from "@/config";
18
17
  import { CopyDocument } from "@element-plus/icons-vue";
19
18
  import eventBus from "@/utils/eventBus";
19
+ import { useTabsBarStore, useSettingsStore } from "@/store";
20
20
 
21
21
  export default {
22
22
  name: "VabAppMain",
@@ -32,13 +32,17 @@ export default {
32
32
  keepAliveMaxNum,
33
33
  routerView: true,
34
34
  footerCopyright,
35
+ tabsBarStore: useTabsBarStore(),
36
+ settingsStore: useSettingsStore(),
35
37
  };
36
38
  },
37
39
  computed: {
38
- ...mapGetters({
39
- visitedRoutes: "tabsBar/visitedRoutes",
40
- device: "settings/device",
41
- }),
40
+ visitedRoutes() {
41
+ return this.tabsBarStore.visitedRoutes;
42
+ },
43
+ device() {
44
+ return this.settingsStore.device;
45
+ },
42
46
  cachedRoutes() {
43
47
  const cachedRoutesArr = [];
44
48
  this.visitedRoutes.forEach((item) => {
@@ -70,9 +74,9 @@ export default {
70
74
  },
71
75
  mounted() {},
72
76
  methods: {
73
- ...mapActions({
74
- foldSideBar: "settings/foldSideBar",
75
- }),
77
+ foldSideBar() {
78
+ this.settingsStore.foldSideBar();
79
+ },
76
80
  // 重新加载路由视图
77
81
  reloadRouterView() {
78
82
  this.routerView = false;
@@ -50,7 +50,6 @@
50
50
 
51
51
  <script setup>
52
52
  import { computed } from "vue";
53
- import { useStore } from "vuex";
54
53
  import { useRouter, useRoute } from "vue-router";
55
54
  import { ElMessage } from "element-plus";
56
55
  import { recordRoute } from "@/config";
@@ -61,19 +60,21 @@ import {
61
60
  Link,
62
61
  SwitchButton,
63
62
  } from "@element-plus/icons-vue";
63
+ import { useUserStore, useSettingsStore } from "@/store";
64
64
 
65
65
  defineOptions({
66
66
  name: "VabAvatar",
67
67
  });
68
68
 
69
- const store = useStore();
70
69
  const router = useRouter();
71
70
  const route = useRoute();
71
+ const userStore = useUserStore();
72
+ const settingsStore = useSettingsStore();
72
73
 
73
74
  // 计算属性
74
- const avatar = computed(() => store.getters["user/avatar"]);
75
- const username = computed(() => store.getters["user/username"]);
76
- const layout = computed(() => store.getters["settings/layout"]);
75
+ const avatar = computed(() => userStore.avatar);
76
+ const username = computed(() => userStore.username);
77
+ const layout = computed(() => settingsStore.layout);
77
78
  const isHorizontalLayout = computed(() => layout.value === "horizontal");
78
79
 
79
80
  // 方法
@@ -100,7 +101,7 @@ const settings = () => {
100
101
  };
101
102
 
102
103
  const logout = () => {
103
- store.dispatch("user/logout");
104
+ userStore.logout();
104
105
  if (recordRoute) {
105
106
  const fullPath = route.fullPath;
106
107
  router.push(`/login?redirect=${fullPath}`);
@@ -14,20 +14,23 @@
14
14
  </div>
15
15
  </template>
16
16
  <script>
17
- import { mapGetters } from "vuex";
17
+ import { useSettingsStore } from "@/store";
18
18
 
19
19
  export default {
20
20
  name: "VabLogo",
21
21
  data() {
22
22
  return {
23
23
  title: this.$baseTitle,
24
+ settingsStore: useSettingsStore(),
24
25
  };
25
26
  },
26
27
  computed: {
27
- ...mapGetters({
28
- logo: "settings/logo",
29
- layout: "settings/layout",
30
- }),
28
+ logo() {
29
+ return this.settingsStore.logo;
30
+ },
31
+ layout() {
32
+ return this.settingsStore.layout;
33
+ },
31
34
  },
32
35
  };
33
36
  </script>
@@ -30,21 +30,21 @@
30
30
 
31
31
  <script setup>
32
32
  import { ref, computed, onBeforeUnmount } from "vue";
33
- import { useStore } from "vuex";
34
33
  import { Refresh } from "@element-plus/icons-vue";
34
+ import { useSettingsStore } from "@/store";
35
35
 
36
36
  defineOptions({
37
37
  name: "VabNav",
38
38
  });
39
39
 
40
- const store = useStore();
40
+ const settingsStore = useSettingsStore();
41
41
  const pulse = ref(false);
42
42
  let timeOutID = null;
43
43
 
44
- const collapse = computed(() => store.getters["settings/collapse"]);
44
+ const collapse = computed(() => settingsStore.collapse);
45
45
 
46
46
  const handleCollapse = () => {
47
- store.dispatch("settings/changeCollapse");
47
+ settingsStore.changeCollapse();
48
48
  };
49
49
 
50
50
  const refreshRoute = async () => {
@@ -21,19 +21,20 @@
21
21
  <script setup>
22
22
  import variables from "@/styles/variables.scss";
23
23
  import { computed } from "vue";
24
- import { useStore } from "vuex";
25
24
  import { useRoute } from "vue-router";
26
25
  import { defaultOopeneds } from "@/config";
26
+ import { useSettingsStore, useRoutesStore } from "@/store";
27
27
 
28
28
  defineOptions({
29
29
  name: "VabSide",
30
30
  });
31
31
 
32
- const store = useStore();
33
32
  const route = useRoute();
33
+ const settingsStore = useSettingsStore();
34
+ const routesStore = useRoutesStore();
34
35
 
35
- const collapse = computed(() => store.getters["settings/collapse"]);
36
- const routes = computed(() => store.getters["routes/routes"]);
36
+ const collapse = computed(() => settingsStore.collapse);
37
+ const routes = computed(() => routesStore.routes);
37
38
 
38
39
  const defaultOpens = computed(() => {
39
40
  // 使用配置文件中的defaultOopeneds
@@ -53,7 +53,6 @@
53
53
 
54
54
  <script>
55
55
  import path from "path";
56
- import { mapGetters } from "vuex";
57
56
  import {
58
57
  ArrowDown,
59
58
  CircleClose,
@@ -71,6 +70,7 @@ import {
71
70
  List,
72
71
  Odometer,
73
72
  } from "@element-plus/icons-vue";
73
+ import { useTabsBarStore, useRoutesStore } from "@/store";
74
74
 
75
75
  export default {
76
76
  name: "VabTabs",
@@ -95,20 +95,24 @@ export default {
95
95
  return {
96
96
  affixtabs: [],
97
97
  tabActive: "",
98
+ tabsBarStore: useTabsBarStore(),
99
+ routesStore: useRoutesStore(),
98
100
  };
99
101
  },
100
102
 
101
103
  computed: {
102
- ...mapGetters({
103
- visitedRoutes: "tabsBar/visitedRoutes",
104
- routes: "routes/routes",
105
- }),
104
+ visitedRoutes() {
105
+ return this.tabsBarStore.visitedRoutes;
106
+ },
107
+ routes() {
108
+ return this.routesStore.routes;
109
+ },
106
110
  },
107
111
  watch: {
108
112
  $route: {
109
113
  handler(route) {
110
- this.inittabs();
111
- this.addtabs();
114
+ this.initTabs();
115
+ this.addTab();
112
116
  let tabActive = "";
113
117
  this.visitedRoutes.forEach((item, index) => {
114
118
  if (item.path === this.$route.path) {
@@ -131,8 +135,7 @@ export default {
131
135
  view = item;
132
136
  }
133
137
  });
134
- const { visitedRoutes } = await this.$store.dispatch(
135
- "tabsBar/delRoute",
138
+ const { visitedRoutes } = await this.tabsBarStore.delRoute(
136
139
  view
137
140
  );
138
141
  if (this.isActive(view)) {
@@ -159,7 +162,7 @@ export default {
159
162
  isAffix(tag) {
160
163
  return tag.meta && tag.meta.affix;
161
164
  },
162
- filterAffixtabs(routes, basePath = "/") {
165
+ filterAffixTabs(routes, basePath = "/") {
163
166
  let tabs = [];
164
167
  routes.forEach((route) => {
165
168
  if (route.meta && route.meta.affix) {
@@ -172,26 +175,26 @@ export default {
172
175
  });
173
176
  }
174
177
  if (route.children) {
175
- const temptabs = this.filterAffixtabs(route.children, route.path);
176
- if (temptabs.length >= 1) {
177
- tabs = [...tabs, ...temptabs];
178
+ const tempTabs = this.filterAffixTabs(route.children, route.path);
179
+ if (tempTabs.length >= 1) {
180
+ tabs = [...tabs, ...tempTabs];
178
181
  }
179
182
  }
180
183
  });
181
184
  return tabs;
182
185
  },
183
- inittabs() {
184
- const affixtabs = (this.affixtabs = this.filterAffixtabs(this.routes));
186
+ initTabs() {
187
+ const affixtabs = (this.affixtabs = this.filterAffixTabs(this.routes));
185
188
  for (const tag of affixtabs) {
186
189
  if (tag.name) {
187
- this.$store.dispatch("tabsBar/addVisitedRoute", tag);
190
+ this.tabsBarStore.addVisitedRoute(tag);
188
191
  }
189
192
  }
190
193
  },
191
- addtabs() {
194
+ addTab() {
192
195
  const { name } = this.$route;
193
196
  if (name) {
194
- this.$store.dispatch("tabsBar/addVisitedRoute", this.$route);
197
+ this.tabsBarStore.addVisitedRoute(this.$route);
195
198
  }
196
199
  return false;
197
200
  },
@@ -221,8 +224,7 @@ export default {
221
224
  // this.$baseEventBus.$emit('reloadrouter-view')
222
225
  },
223
226
  async closeSelectedTag(view) {
224
- const { visitedRoutes } = await this.$store.dispatch(
225
- "tabsBar/delRoute",
227
+ const { visitedRoutes } = await this.tabsBarStore.delRoute(
226
228
  view
227
229
  );
228
230
  if (this.isActive(view)) {
@@ -231,21 +233,19 @@ export default {
231
233
  },
232
234
  async closeOtherstabs() {
233
235
  const view = await this.toThisTag();
234
- await this.$store.dispatch("tabsBar/delOthersRoutes", view);
236
+ await this.tabsBarStore.delOthersRoutes(view);
235
237
  },
236
238
  async closeLefttabs() {
237
239
  const view = await this.toThisTag();
238
- await this.$store.dispatch("tabsBar/delLeftRoutes", view);
240
+ await this.tabsBarStore.delLeftRoutes(view);
239
241
  },
240
242
  async closeRighttabs() {
241
243
  const view = await this.toThisTag();
242
- await this.$store.dispatch("tabsBar/delRightRoutes", view);
244
+ await this.tabsBarStore.delRightRoutes(view);
243
245
  },
244
246
  async closeAlltabs() {
245
247
  const view = await this.toThisTag();
246
- const { visitedRoutes } = await this.$store.dispatch(
247
- "tabsBar/delAllRoutes"
248
- );
248
+ const { visitedRoutes } = await this.tabsBarStore.delAllRoutes();
249
249
  if (this.affixtabs.some((tag) => tag.path === view.path)) {
250
250
  return;
251
251
  }
@@ -153,9 +153,9 @@
153
153
  </template>
154
154
 
155
155
  <script>
156
- import { mapActions, mapGetters } from "vuex";
157
156
  import { layout as defaultLayout } from "@/config";
158
157
  import { Brush, Picture, Grid, Setting } from "@element-plus/icons-vue";
158
+ import { useSettingsStore } from "@/store";
159
159
 
160
160
  export default {
161
161
  name: "VabTheme",
@@ -174,15 +174,22 @@ export default {
174
174
  header: "fixed",
175
175
  tabsBar: "",
176
176
  },
177
+ settingsStore: useSettingsStore(),
177
178
  };
178
179
  },
179
180
  computed: {
180
- ...mapGetters({
181
- layout: "settings/layout",
182
- header: "settings/header",
183
- tabsBar: "settings/tabsBar",
184
- themeBar: "settings/themeBar",
185
- }),
181
+ layout() {
182
+ return this.settingsStore.layout;
183
+ },
184
+ header() {
185
+ return this.settingsStore.header;
186
+ },
187
+ tabsBar() {
188
+ return this.settingsStore.tabsBar;
189
+ },
190
+ themeBar() {
191
+ return this.settingsStore.themeBar;
192
+ },
186
193
  },
187
194
  created() {
188
195
  // 在created钩子中初始化主题
@@ -198,11 +205,15 @@ export default {
198
205
  }
199
206
  },
200
207
  methods: {
201
- ...mapActions({
202
- changeLayout: "settings/changeLayout",
203
- changeHeader: "settings/changeHeader",
204
- changeTabsBar: "settings/changeTabsBar",
205
- }),
208
+ changeLayout(layout) {
209
+ this.settingsStore.changeLayout(layout);
210
+ },
211
+ changeHeader(header) {
212
+ this.settingsStore.changeHeader(header);
213
+ },
214
+ changeTabsBar(tabsBar) {
215
+ this.settingsStore.changeTabsBar(tabsBar);
216
+ },
206
217
  handleIsMobile() {
207
218
  return document.body.getBoundingClientRect().width - 1 < 992;
208
219
  },
@@ -50,17 +50,19 @@
50
50
 
51
51
  <script setup>
52
52
  import { ref, computed, onBeforeUnmount } from "vue";
53
- import { useStore } from "vuex";
54
53
  import { useRoute } from "vue-router";
55
54
  import variables from "@/styles/variables.scss";
56
55
  import { Refresh } from "@element-plus/icons-vue";
56
+ import { useRoutesStore, useTabsBarStore, useSettingsStore } from "@/store";
57
57
 
58
58
  defineOptions({
59
59
  name: "VabTop",
60
60
  });
61
61
 
62
- const store = useStore();
63
62
  const route = useRoute();
63
+ const routesStore = useRoutesStore();
64
+ const tabsBarStore = useTabsBarStore();
65
+ const settingsStore = useSettingsStore();
64
66
 
65
67
  // 响应式数据
66
68
  const pulse = ref(false);
@@ -68,9 +70,9 @@ const menuTrigger = ref("hover");
68
70
  let timeOutID = null;
69
71
 
70
72
  // 计算属性
71
- const routes = computed(() => store.getters["routes/routes"]);
72
- const visitedRoutes = computed(() => store.getters["tabsBar/visitedRoutes"]);
73
- const collapse = computed(() => store.getters["settings/collapse"]);
73
+ const routes = computed(() => routesStore.routes);
74
+ const visitedRoutes = computed(() => tabsBarStore.visitedRoutes);
75
+ const collapse = computed(() => settingsStore.collapse);
74
76
  const defaultOpens = computed(() => []);
75
77
 
76
78
  const activeMenu = computed(() => {
@@ -51,21 +51,21 @@
51
51
 
52
52
  <script setup>
53
53
  import { ref, computed, onBeforeMount, onBeforeUnmount, onMounted, nextTick } from "vue";
54
- import { useStore } from "vuex";
54
+ import { useSettingsStore } from "@/store";
55
55
  import { tokenName } from "@/config";
56
56
  import { debounce } from "lodash";
57
57
 
58
- const store = useStore();
58
+ const settingsStore = useSettingsStore();
59
59
 
60
60
  const oldLayout = ref("");
61
61
  const controller = ref(new window.AbortController());
62
62
  let timeOutID = null;
63
63
 
64
- const layout = computed(() => store.getters["settings/layout"]);
65
- const tabsBar = computed(() => store.getters["settings/tabsBar"]);
66
- const collapse = computed(() => store.getters["settings/collapse"]);
67
- const header = computed(() => store.getters["settings/header"]);
68
- const device = computed(() => store.getters["settings/device"]);
64
+ const layout = computed(() => settingsStore.layout);
65
+ const tabsBar = computed(() => settingsStore.tabsBar);
66
+ const collapse = computed(() => settingsStore.collapse);
67
+ const header = computed(() => settingsStore.header);
68
+ const device = computed(() => settingsStore.device);
69
69
 
70
70
  const classObj = computed(() => {
71
71
  return {
@@ -74,7 +74,7 @@ const classObj = computed(() => {
74
74
  });
75
75
 
76
76
  const handleFoldSideBar = () => {
77
- store.dispatch("settings/foldSideBar");
77
+ settingsStore.foldSideBar();
78
78
  };
79
79
 
80
80
  const handleIsMobile = () => {
@@ -86,24 +86,24 @@ const handleResize = debounce(() => {
86
86
  const isMobile = handleIsMobile();
87
87
  if (isMobile) {
88
88
  //横向布局时如果是手机端访问那么改成纵向版
89
- store.dispatch("settings/changeLayout", "vertical");
89
+ settingsStore.changeLayout("vertical");
90
90
  } else {
91
- store.dispatch("settings/changeLayout", oldLayout.value);
91
+ settingsStore.changeLayout(oldLayout.value);
92
92
  }
93
93
 
94
- store.dispatch("settings/toggleDevice", isMobile ? "mobile" : "desktop");
94
+ settingsStore.toggleDevice(isMobile ? "mobile" : "desktop");
95
95
  }
96
96
  }, 100);
97
97
 
98
98
  onBeforeMount(() => {
99
99
  window.addEventListener("resize", handleResize);
100
-
100
+
101
101
  // 页面加载时检查是否有保存的路由信息
102
102
  const savedRoute = sessionStorage.getItem('currentRoute');
103
103
  if (savedRoute) {
104
104
  try {
105
105
  const routeInfo = JSON.parse(savedRoute);
106
- // 这里可以添加恢复路由状态的逻辑,比如重新设置Vuex中的路由状态
106
+ // 这里可以添加恢复路由状态的逻辑,比如重新设置Pinia中的路由状态
107
107
  console.log('恢复保存的路由信息:', routeInfo);
108
108
  // 清除保存的路由信息
109
109
  sessionStorage.removeItem('currentRoute');
@@ -148,17 +148,17 @@ oldLayout.value = layout.value;
148
148
  const isMobile = handleIsMobile();
149
149
  if (isMobile) {
150
150
  //横向布局时如果是手机端访问那么改成纵向版
151
- store.dispatch("settings/changeLayout", "vertical");
151
+ settingsStore.changeLayout("vertical");
152
152
  } else {
153
- store.dispatch("settings/changeLayout", oldLayout.value);
153
+ settingsStore.changeLayout(oldLayout.value);
154
154
  }
155
- store.dispatch("settings/toggleDevice", isMobile ? "mobile" : "desktop");
155
+ settingsStore.toggleDevice(isMobile ? "mobile" : "desktop");
156
156
  if (isMobile) {
157
157
  timeOutID = setTimeout(() => {
158
- store.dispatch("settings/foldSideBar");
158
+ settingsStore.foldSideBar();
159
159
  }, 2000);
160
160
  } else {
161
- store.dispatch("settings/openSideBar");
161
+ settingsStore.openSideBar();
162
162
  }
163
163
 
164
164
  nextTick(() => {
package/src/main.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { createApp } from "vue";
2
+ import { createPinia } from "pinia";
2
3
  import App from "./App.vue";
3
4
  import router from "./router";
4
- import store from "@/store"; // 导入Vuex store
5
5
  import plugins from "./plugins";
6
6
  // 导入布局组件注册函数
7
7
  import { registerLayoutComponents } from "@/layouts/export";
@@ -14,8 +14,9 @@ import { title } from "@/config";
14
14
  // 创建应用实例
15
15
  const app = createApp(App);
16
16
 
17
- // 使用Vuex
18
- app.use(store);
17
+ // 使用Pinia
18
+ const pinia = createPinia();
19
+ app.use(pinia);
19
20
 
20
21
  app.use(router);
21
22
 
@@ -74,7 +74,7 @@ export const asyncRoutes = [
74
74
  redirect: "/example/index",
75
75
  name: "Example",
76
76
  alwaysShow: true,
77
- meta: { title: "路由案例", icon: "box-open", defaultOpen: true },
77
+ meta: { title: "开发指南", icon: "box-open", defaultOpen: true },
78
78
  children: [
79
79
  {
80
80
  path: "index",
@@ -85,6 +85,15 @@ export const asyncRoutes = [
85
85
  icon: "document",
86
86
  },
87
87
  },
88
+ {
89
+ path: "pinia",
90
+ name: "PiniaGuideIndex",
91
+ component: () => import("@/views/pinia-guide/index"),
92
+ meta: {
93
+ title: "Pinia 使用教程",
94
+ icon: "setting",
95
+ },
96
+ },
88
97
  ]
89
98
  },
90
99
  {
@@ -1,26 +1,10 @@
1
1
  /**
2
- * @description 导入所有 vuex 模块,自动加入namespaced:true,用于解决vuex命名冲突,请勿修改。
3
- * @description 这是一个兼容层,允许项目逐步从Vuex迁移到Pinia
2
+ * @description Pinia store 入口文件,导出所有 store 模块
4
3
  */
5
4
 
6
- import { createStore } from 'vuex'
7
-
8
- // modules目录导入所有模块
9
- const files = require.context('./modules', false, /\.js$/)
10
- const modules = {}
11
-
12
- files.keys().forEach((key) => {
13
- modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default
14
- })
15
-
16
- // 为所有模块添加namespaced
17
- Object.keys(modules).forEach((key) => {
18
- modules[key]['namespaced'] = true
19
- })
20
-
21
- // 创建store
22
- const store = createStore({
23
- modules,
24
- })
25
-
26
- export default store
5
+ export { useUserStore } from './modules/user'
6
+ export { useSettingsStore } from './modules/settings'
7
+ export { useRoutesStore } from './modules/routes'
8
+ export { useTabsBarStore } from './modules/tabsBar'
9
+ export { useTableStore } from './modules/table'
10
+ export { useErrorLogStore } from './modules/errorLog'