2026-09-23 15:15:02 +08:00

199 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Vuex → Pinia Store 映射文档(v8.0.vue3)
全部 22 个 Vuex 模块(`src/store/module/` 21 个 + `src/pages/plugin/kefu/store.js`)已转换为 Pinia setup store。
`src/store/index.js` 现仅导出挂载了 `pinia-plugin-persistedstate` 的 pinia 实例,**不再 import 任何模块**(避免循环依赖)。
## 通用机械替换规则(页面迁移速查)
| Vuex 写法 | Pinia 写法 |
| --- | --- |
| `this.$store.state.menus.childMenuList` | `useMenusStore().childMenuList`(组件内建议 `storeToRefs(useMenusStore())` 解构) |
| `this.$store.commit('menus/getmenusNav', x)` | `useMenusStore().getmenusNav(x)` |
| `this.$store.dispatch('order/getOrderTabs', x)` | `useOrderStore().getOrderTabs(x)`(返回原 Promise) |
| `this.$store.getters['user/messageUnreadCount']` | `useUserStore().messageUnreadCount` |
| `...mapMutations('media', ['setDevice'])` | `const mediaStore = useMediaStore()` 后直接 `mediaStore.setDevice('Mobile')` |
| `...mapState('themeConfig', [...])` | `storeToRefs(useThemeConfigStore())` |
| 非命名空间模块(user/app):`commit('setUserId', x)` / `getters['errorCount']` | `useUserStore().setUserId(x)` / `useAppStore().errorCount`(函数名不变,仅去掉根级调用形式) |
| store 内互访:`rootState.user` | `useUserStore()`(在函数/computed 内部按需调用) |
- store id 与原 Vuex 模块名完全一致(`'user'`、`'mobildConfig'`(历史拼写,保持)…)。
- 持久化:原 vuex-persist 以单一 key `vuex` 持久化 16 个模块;现改用 `pinia-plugin-persistedstate`,**每个 store 独立 key(默认为 store id)、localStorage**。旧 `vuex` 缓存不会迁移,首次访问需重新登录/初始化,属预期。
- 所有 mutation 转为普通函数、action 转为普通/异步函数,**默认 `this.$store.dispatch` 的返回值语义保持**(原来返回 Promise 的仍返回 Promise)。
- 原 `state.xxx = ...` 全部改为 `xxx.value = ...`,函数内逻辑逐行保留。
## 重命名汇总(页面替换时必看)
| store | 原 mutation/getter 名 | 新函数名 | 原因 |
| --- | --- | --- | --- |
| menus | `childMenuList` | `setChildMenuList` | 与 state 字段 `childMenuList` 同名冲突(layout 组件 6 处调用) |
| userInfo | `userInfo` | `setUserInfo` | 与 state 字段同名冲突 |
| userInfo | `uniqueAuth` | `setUniqueAuth` | 同名冲突 |
| userInfo | `name` | `setName` | 同名冲突 |
| userInfo | `avatar` | `setAvatar` | 同名冲突 |
| userInfo | `access` | `setAccess` | 同名冲突 |
| userInfo | `logo` | `setLogo` | 同名冲突 |
| userInfo | `logoSmall` | `setLogoSmall` | 同名冲突 |
| userInfo | `version` | `setVersion` | 同名冲突 |
| userInfo | `newOrderAudioLink` | `setNewOrderAudioLink` | 同名冲突 |
| upgrade | getter `toggleStatus` | (删除,直接用 `store.toggleStatus`) | 恒等 getter,与 state 字段同名冲突,值完全一致 |
其余全部 mutation/action/getter **名字保持不变**。部分函数的形参名有调整(如 `setAccess(val)`、`TOGGLE_STATUS(status)`),仅因形参遮蔽同名 ref,调用方按位置传参不受影响。
## 行为差异备注(均为原有死代码/笔误的显式化)
1. **menu 模块 `filterSider`/`filterHeader`(computed)**:原引用 `rootState.user.info` / `rootState.admin.user.info`(`admin` 模块不存在,历史笔误,实际意图为 user 模块)。已统一改为 `useUserStore().info`。注意 user store 本身没有 `info` 字段,这两个 getter 与原版一致属死代码(全库无引用),一旦被求值会抛 TypeError(与原 Vuex 行为相同)。
2. **`userInfo/getMenusNavList` action**:原文件未 import `menusApi`(且 commit 的 `getmenusNav` mutation 在该模块不存在),全库无 dispatch 调用。现补上 import 使其可用,并移除指向不存在 mutation 的 commit。
3. **`listenFullscreen`/`toggleFullscreen`(userLevel、order、integralOrder)**:原内部 `commit('setFullscreen', x)` 指向的 mutation 从未存在(Vuex 下仅产生 unknown mutation 警告、实际 no-op),已移除该调用,screenfull 逻辑保留。
4. **mobildConfig 模块级模板**:模块顶部默认模板变量 `bottomMenu` 改名 `defaultBottomMenu`(避免与 state 字段 `bottomMenu` 遮蔽),store 对外 API 不变。
5. **app 模块**:私有辅助函数 `closePage` 从模块顶层移入 setup 内部(原本就不是 mutation/action,未导出)。
6. **`user/setAccess`、`user/setUserId` 等**:user 模块原为非命名空间,页面里可能是 `commit('setAccess', x)`(无前缀),替换为 `useUserStore().setAccess(x)`。
## 各 Store 明细
### 1. useUserStore — `src/store/module/user.js`(id: `user`,persist: true;原模块非命名空间)
- state:`userName`、`userId`、`avatarImgPath`、`access`、`hasGetInfo`、`unreadCount`、`messageUnreadList`、`messageReadedList`、`messageTrashList`、`messageContentStore`
- getter→computed:`messageUnreadCount`、`messageReadedCount`、`messageTrashCount`
- 函数(原 mutation):`setAvatar`、`setUserId`、`setUserName`、`setAccess`、`setHasGetInfo`、`setMessageCount`、`setMessageUnreadList`、`setMessageReadedList`、`setMessageTrashList`、`updateMessageContentStore`、`moveMsg`
- 函数(原 action):`getUnreadMessageCount`(空实现,原注释代码已丢弃)
### 2. useAppStore — `src/store/module/app.js`(id: `app`,persist: true;原模块非命名空间)
- state:`breadCrumbList`、`tagNavList`、`homeRoute`、`local`、`errorList`、`adminTitle`、`hasReadErrorPage`
- getter→computed:`errorCount`
- 函数(原 mutation):`setBreadCrumb`、`setAdminTitle`、`setHomeRoute`、`setTagNavList`、`closeTag`、`addTag`、`setLocal`、`addError`、`setHasReadErrorLoggerStatus`、`clearAll`
- 函数(原 action):`addErrorLog`(内部 `rootState.user` → `useUserStore()`)
### 3. useMenusStore — `src/store/module/menus.js`(id: `menus`,persist: true)
- state:`menusName`(初值仍从 localStorage `menuList` 读取)、`openMenus`、`childMenuList`、`oneLvMenus`、`oneLvRoutes`
- 函数(原 mutation):`getmenusNav`、`setopenMenus`、`setOneLvMenus`、`setOneLvRoute`、`setChildMenuList`(原名 `childMenuList`)
- 函数(原 action):`getMenusNavList`
### 4. useMenuStore — `src/store/module/menu.js`(id: `menu`,persist: true)
- state:`header`、`oneMenuName`、`sider`、`headerName`、`activePath`、`openNames`
- getter→computed:`filterSider`、`filterHeader`、`currentHeader`、`hideSider`(见行为差异备注 1)
- 函数(原 mutation):`setSider`、`setOpenMenuName`、`setHeader`、`setHeaderName`、`setActivePath`、`setOpenNames`
### 5. useUserInfoStore — `src/store/module/userInfo.js`(id: `userInfo`,persist: true)
- state:`userInfo`、`uniqueAuth`、`name`、`avatar`、`access`、`logo`、`logoSmall`、`version`、`newOrderAudioLink`、`pageName`、`uploadListDataswiperBg`、`uploadListDatamenus`、`uploadListDataactivity`、`uploadListDatarecommend`、`uploadListDataadsRecommend`、`txtListData`
- 函数(原 mutation,名字不变):`uploadListswiperBg`、`uploadListmenus`、`uploadListrecommend`、`uploadListactivity`、`uploadListadsRecommend`、`txtList`、`setPageName`、`userRealName`、`userRealHeadPic`
- 函数(原 mutation,已改名):`setUserInfo`(原 `userInfo`)、`setUniqueAuth`(原 `uniqueAuth`)、`setName`(原 `name`)、`setAvatar`(原 `avatar`)、`setAccess`(原 `access`)、`setLogo`(原 `logo`)、`setLogoSmall`(原 `logoSmall`)、`setVersion`(原 `version`)、`setNewOrderAudioLink`(原 `newOrderAudioLink`)
- 函数(原 action):`getMenusNavList`(死代码,见备注 2)
### 6. useUserInfosStore — `src/store/module/userInfos.js`(id: `userInfos`,**无 persist**)
- state:`userInfos`
- 函数(原 mutation):`getUserInfos`
- 函数(原 action):`setUserInfos`
### 7. useUserLevelStore — `src/store/module/userLevel.js`(id: `userLevel`,persist: true)
- state:`taskId`、`levelId`、`categoryId`
- 函数(原 mutation):`getTaskId`、`getlevelId`、`getCategoryId`
- 函数(原 action):`listenFullscreen`、`toggleFullscreen`(见备注 3)
### 8. useOrderStore — `src/store/module/order.js`(id: `order`,persist: true)
- state:`orderStatus`、`orderTime`、`orderNum`、`orderType`、`fieldKey`、`orderChartType`、`isDels`、`delIdList`、`iconsaaaa`、`orderPayType`、`real_name`
- 函数(原 mutation):`getOrderStatus`、`getOrderType`、`getOrderTime`、`getOrderNum`、`getfieldKey`、`setOrderKeyword`、`onChangeTabs`、`onChangeChart`、`getIsDel`、`getisDelIdListl`、`resetSearch`
- 函数(原 action):`getOrderTabs`、`listenFullscreen`、`toggleFullscreen`
### 9. useMediaStore — `src/store/module/media.js`(id: `media`,persist: true)
- state:`isMobile`、`isTablet`、`isDesktop`、`isFullscreen`
- 函数(原 mutation):`setDevice(type)`(type ∈ Mobile/Tablet/Desktop)
### 10. useGoodSelectStore — `src/diy/store/legacy/goodSelect.js`(id: `goodSelect`,**无 persist**)
- state:`periphery`、`activeName`、`defaultConfig`、`component`(DIY 默认配置大对象,内容与原版逐字一致)
- 函数(原 mutation):`setConfig`、`upDataGoodList`、`updataConfig`
### 11. useMorenStore — `src/diy/store/legacy/moren.js`(id: `moren`,**无 persist**)
- state:`activeName`、`defaultConfig`、`component`(内容与原版逐字一致)
- 函数(原 mutation):`setConfig`、`upDataName`、`upDataGoodList`、`updataConfig`
### 12. useShoppingStore — `src/diy/store/legacy/shopping.js`(id: `shopping`,**无 persist**)
- state:`activeName`、`defaultConfig`、`component`(内容与原版逐字一致)
- 函数(原 mutation):`setConfig`、`updataConfig`
### 13. useFreshStore — `src/diy/store/legacy/fresh.js`(id: `fresh`,**无 persist**)
- state:`activeName`、`defaultConfig`、`component`(内容与原版逐字一致)
- 函数(原 mutation):`setConfig`、`updataConfig`
### 14. useIntegralOrderStore — `src/store/module/integralOrder.js`(id: `integralOrder`,persist: true)
- state:`orderStatus`、`orderTime`、`orderNum`、`orderType`、`fieldKey`、`orderChartType`、`isDels`、`delIdList`、`iconsaaaa`、`orderPayType`
- 函数(原 mutation):`getOrderStatus`、`getOrderType`、`getOrderTime`、`getOrderNum`、`getfieldKey`、`onChangeTabs`、`onChangeChart`、`getIsDel`、`getisDelIdListl`
- 函数(原 action):`getOrderTabs`(直接 `resolve(true)`)、`listenFullscreen`、`toggleFullscreen`
### 15. useMobildConfigStore — `src/diy/store/mobildConfig.js`(id: `mobildConfig`,persist: true)
- state:`configName`、`pageTitle`、`pageName`、`pageShow`、`pageColor`、`pagePic`、`pageColorPicker`、`pageTabVal`、`pagePicUrl`、`defaultArray`、`bottomMenu`、`pageFooter`(默认值与原版逐字一致)
- 函数(原 mutation,全部保名):`FOOTER`、`UPBOTTOMMENU`、`ADDARRAY`、`DELETEARRAY`、`ARRAYREAST`、`defaultArraySort`、`UPDATEARR`、`SETCONFIGNAME`、`SETEMPTY`、`UPTITLE`、`UPNAME`、`UPSHOW`、`UPCOLOR`、`UPPIC`、`UPPICKER`、`UPRADIO`、`UPPICURL`、`footUpdata`、`footStatus`(空实现,原即空)、`footType`、`footBottom`、`footPageUpdata`、`bottomMenuUpdata`、`RESET_BOTTOM_MENU`、`titleUpdata`、`nameUpdata`、`showUpdata`、`colorUpdata`、`picUpdata`、`pickerUpdata`、`radioUpdata`、`picurlUpdata`
- 函数(原 action):`getData`(空实现)
- 模块级默认模板变量改名 `defaultBottomMenu`(见备注 4)
### 16. useUpgradeStore — `src/store/module/upgrade.js`(id: `upgrade`,persist: true)
- state:`toggleStatus`
- 函数(原 mutation):`TOGGLE_STATUS`
- 原 getter `toggleStatus` 为恒等 getter,直接使用 `useUpgradeStore().toggleStatus`
### 17. useLayoutStore — `src/store/module/layout.js`(id: `layout`,persist: true)
- state:`menuCollapse`
- 函数(原 mutation):`changeCol`
### 18. useThemeConfigStore — `src/store/module/themeConfig.js`(id: `themeConfig`,persist: true)
- state:`themeConfig`(默认值与原版逐字一致)
- 函数(原 mutation):`getThemeConfig(data)`(整体替换)
- 函数(原 action):`setThemeConfig(data)`
### 19. useRoutesListStore — `src/store/module/routesList.js`(id: `routesList`,persist: true)
- state:`routesList`
- 函数(原 mutation):`getRoutesList`
- 函数(原 action):`setRoutesList`
### 20. useTagsViewRoutesStore — `src/store/module/tagsViewRoutes.js`(id: `tagsViewRoutes`,**无 persist**)
- state:`tagsViewRoutes`
- 函数(原 mutation):`getTagsViewRoutes`
- 函数(原 action):`setTagsViewRoutes`
### 21. useKeepAliveNamesStore — `src/store/module/keepAliveNames.js`(id: `keepAliveNames`,persist: true)
- state:`keepAliveNames`
- 函数(原 mutation):`getCacheKeepAlive`
- 函数(原 action):`setCacheKeepAlive`
### 22. useKefuStore — `src/pages/plugin/kefu/store.js`(id: `kefu`,persist: true)
- state:`kefuInfo`
- 函数(原 mutation):`setInfo`
- 函数(原 action):`logoutKefu({ confirm, vm })`
- 原在 `src/store/index.js` 注册,现独立导出 `useKefuStore`,使用方直接 `import { useKefuStore } from '@/pages/plugin/kefu/store'`
## DIY 组件聚合器(require.context → import.meta.glob)
`src/diy/components/legacy/diyComponents/index.js`、`src/diy/components/mobilePage/index.js`、`src/diy/components/mobileConfig/index.js`、`src/diy/components/mobileConfigRight/index.js` 四个文件均已改为:
```js
const modules = import.meta.glob('./*.vue', { eager: true });
const obj = {};
Object.keys(modules).forEach((key) => {
obj[key.replace(/(\.\/|\.vue)/g, '')] = modules[key].default;
});
export default obj;
```
键名规则与原 `path.basename(key, '.vue')` 完全一致:`./c_is_show.vue` → `c_is_show`。原四个文件均为**非递归**扫描(`require.context('./', false, ...)`),故 glob 用 `./*.vue`(不含子目录),导出名/默认导出结构不变。