vue-cli init

This commit is contained in:
2025-08-15 16:25:44 +08:00
parent e81805b4c0
commit 8e22afd798
590 changed files with 103286 additions and 213 deletions
+27
View File
@@ -0,0 +1,27 @@
import { mapState } from 'vuex'
import store from "@/store"
// 尝试将用户在根目录中的store/index.js的vuex的state变量,全部加载到全局变量中
let $uStoreKey = [];
try{
$uStoreKey = store.state ? Object.keys(store.state) : [];
}catch(e){
}
export default {
beforeCreate() {
// 将vuex方法挂在到$u中
// 使用方法为:如果要修改vuex的state中的user.name变量为"史诗" => this.$u.vuex('user.name', '史诗')
// 如果要修改vuex的state的version变量为1.0.1 => this.$u.vuex('version', '1.0.1')
this.$u.vuex = (name, value) => {
this.$store.commit('$uStore', {
name,value
})
}
},
computed: {
// 将vuex的state中的所有变量,解构到全局混入的mixin中
...mapState($uStoreKey)
}
}
+255
View File
@@ -0,0 +1,255 @@
/**
* Copyright (c) 2013-Now http://aidex.vip All rights reserved.
*/
import config from '@/common/config.js';
import util from '@/common/util.js';
import Vue from 'vue'
import Vuex from 'vuex'
import { audioManager } from '@/utils/audioManager'
import dayjs from 'dayjs'
Vue.use(Vuex)
let lifeData = {};
try{
// 尝试获取本地是否存在lifeData变量,第一次启动APP时是不存在的
lifeData = uni.getStorageSync('lifeData');
}catch(e){
}
// 初始化API URL
function initApiUrl() {
if (config.isDevelopment) {
// 开发环境:从存储读取,如果没有则使用测试环境
try {
const savedApiUrl = uni.getStorageSync('ApiUrl');
return savedApiUrl || config.devApiUrlOptions[0].value;
} catch (e) {
console.log('读取存储的 apiurl 失败', e);
return config.devApiUrlOptions[0].value;
}
} else {
// 生产环境:使用固定的生产URL
return config.productionApiUrl;
}
}
// 需要永久存储,且下次APP启动需要取出的,在state中的变量名
let saveStateKeys = ['vuex_user', 'vuex_token', 'vuex_remember', 'vuex_locale','vuex_isAgent', 'vuex_notificationEnabled'];
// 保存变量到本地存储中
const saveLifeData = function(key, value){
// 判断变量名是否在需要存储的数组中
if(saveStateKeys.indexOf(key) != -1) {
// 获取本地存储的lifeData对象,将变量添加到对象中
let tmp = uni.getStorageSync('lifeData');
// 第一次打开APP,不存在lifeData变量,故放一个{}空对象
tmp = tmp ? tmp : {};
tmp[key] = value;
// 执行这一步后,所有需要存储的变量,都挂载在本地的lifeData对象中
uni.setStorageSync('lifeData', tmp);
}
}
// 简化 vuex 操作,文档:https://uviewui.com/components/vuexDetail.html
const store = new Vuex.Store({
state: {
// 如果上面从本地获取的lifeData对象下有对应的属性,就赋值给state中对应的变量
// 加上vuex_前缀,是防止变量名冲突,也让人一目了然
vuex_user: lifeData.vuex_user ? lifeData.vuex_user : {userName: 'Aidex'},
vuex_token: lifeData.vuex_token ? lifeData.vuex_token : '',
vuex_remember: lifeData.vuex_remember ? lifeData.vuex_remember : '',
vuex_locale: lifeData.vuex_locale ? lifeData.vuex_locale : '',
vuex_isAgent: lifeData.vuex_isAgent ? lifeData.vuex_isAgent : '',
// 如果vuex_version无需保存到本地永久存储,无需lifeData.vuex_version方式
vuex_config: config,
// 自定义tabbar数据
// 新增通知相关状态
vuex_notificationEnabled: lifeData.vuex_notificationEnabled != null ? lifeData.vuex_notificationEnabled : true,
vuex_deliveryIds: [], // 存储已知的配布单ID
vuex_messageList: [], // 存储消息列表
vuex_notificationAudio: null,
vuex_pollingTimer: null,
apiurl: initApiUrl() // 根据环境初始化URL
},
mutations: {
$uStore(state, payload) {
// 判断是否多层级调用,state中为对象存在的情况,诸如user.info.score = 1
let nameArr = payload.name.split('.');
let saveKey = '';
let len = nameArr.length;
if(len >= 2) {
let obj = state[nameArr[0]];
for(let i = 1; i < len - 1; i ++) {
obj = obj[nameArr[i]];
}
obj[nameArr[len - 1]] = payload.value;
saveKey = nameArr[0];
} else {
// 单层级变量,在state就是一个普通变量的情况
state[payload.name] = payload.value;
saveKey = payload.name;
}
// 保存变量到本地,见顶部函数定义
saveLifeData(saveKey, state[saveKey])
},
// 新增通知相关 mutation
setPollingTimer(state, timer) {
state.vuex_pollingTimer = timer;
},
setNotificationAudio(state, audio) {
state.vuex_notificationAudio = audio;
},
SET_API_URL(state, url) {
// 生产环境不允许修改URL
if (!config.isDevelopment) {
console.warn('生产环境不允许修改API URL');
return;
}
state.apiurl = url
// 同时保存到本地存储
uni.setStorageSync('ApiUrl', url)
}
},
actions: {
// 初始化通知
initNotification({ state, commit, dispatch }) {
// 创建音频实例
const audio = uni.createInnerAudioContext();
audio.src = '/static/audio/ninyouxindepeibudan.mp3';
// 监听音频播放错误
audio.onError((res) => {
console.error('Audio error:', res.errMsg);
});
// 监听音频播放结束
audio.onEnded(() => {
console.log('Audio playback completed');
});
commit('setNotificationAudio', audio);
if(!state.vuex_notificationEnabled || !uni.getStorageSync("RemoteTokenData").token) return
dispatch('stopPolling');
// 开始轮询
dispatch('startPolling');
// 监听网络状态
uni.onNetworkStatusChange(function(res) {
if (res.isConnected) {
dispatch('startPolling');
} else {
dispatch('stopPolling');
}
});
},
// 开始轮询
startPolling({ state, commit, dispatch }) {
if (state.vuex_pollingTimer || !state.vuex_notificationEnabled) return;
const timer = setInterval(() => {
dispatch('checkNewDeliveries');
}, 20 * 1000);
// }, 1 * 1000);
commit('setPollingTimer', timer);
},
// 停止轮询
stopPolling({ state, commit }) {
if (state.vuex_pollingTimer) {
clearInterval(state.vuex_pollingTimer);
commit('setPollingTimer', null);
}
},
// 检查新配布单
async checkNewDeliveries({ state, commit, dispatch }) {
uni.request({
url: util.apiurl + "/product/fpmArrangeOrder/getFpmArrangeOrderList",
method: "GET",
header: {
platform: "2",
Authorization: uni.getStorageSync("RemoteTokenData").token,
},
data: {
business_status_ids: '1,2', // 根据tab传递对应的状态组合
page: 1,
size: 10,
},
success: (res) => {
console.log('res',res)
if (res.data.code != 0) {
throw new Error('检查配布单失败');
}
console.log("data", res.data.data.list);
const data = res.data.data.list
// 获取所有配布单ID
const newDeliveryIds = data.map(item => item.id);
// 找出新增的配布单ID
const newIds = newDeliveryIds.filter(id => !state.vuex_deliveryIds.includes(id));
console.log("newIds", newIds.length);
// 如果有新增配布单,触发通知
if (newIds.length > 0) {
// 播放声音
audioManager.play()
// 触发振动
uni.vibrateLong();
// 显示通知消息
// uni.showToast({
// title: `有${newIds.length}个新的配布单待处理`,
// icon: 'none',
// });
// 构建新的消息列表项
const newMessages = data.filter(item => newIds.includes(item.id)).map((item) => ({
title: '新配布单通知',
content: `销售单号:${item.order_no}`,
path: `/pages/saleship/salepickscandetail?billid=${item.id}`,
time: dayjs().format('HH:mm')
}));
const newList = [...newMessages, ...state.vuex_messageList]
// 更新消息列表
commit('$uStore', {
name: 'vuex_messageList',
value: newList
});
uni.setTabBarBadge({
index: 0,
text: `${newList.length}`
});
}
// 使用 $uStore 方式更新状态
commit('$uStore', {
name: 'vuex_deliveryIds',
value: newDeliveryIds
});
},
fail: (error) => {
console.log('error',error)
if (error.code === 401 || error.errMsg.includes('Failed to connect')) {
dispatch('stopPolling');
}
},
complete: () => {
},
});
},
updateApiUrl({ commit }, url) {
commit('SET_API_URL', url)
}
},
getters: {
apiurl: state => state.apiurl
}
})
export default store