user.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. import { login, getUserInfo, setSelfInfo,login2 } from '@/api/user'
  2. import { jsonInBlacklist } from '@/api/jwt'
  3. import router from '@/router/index'
  4. import { ElLoading, ElMessage } from 'element-plus'
  5. import { defineStore } from 'pinia'
  6. import { ref, computed, watch } from 'vue'
  7. import { useRouterStore } from './router'
  8. import {getSpotList,search,getTab} from '@/api/mes/job'
  9. import {getMachineMac} from '@/api/jixiaoguanli/jitairibaobiao'
  10. // import { setUserInfo, setToken, ClearStorage } from 'store' // 本地存储操作相关
  11. export const useUserStore = defineStore('user', () => {
  12. const loadingInstance = ref(null)
  13. const userInfo = ref({
  14. uuid: '',
  15. nickName: '',
  16. headerImg: '',
  17. authority: {},
  18. sideMode: 'dark',
  19. activeColor: 'var(--el-color-primary)',
  20. baseColor: '#fff'
  21. })
  22. const token = ref(window.localStorage.getItem('token') || '')
  23. const setUserInfo = (val) => {
  24. userInfo.value = val
  25. }
  26. const setToken = (val) => {
  27. token.value = val
  28. }
  29. const NeedInit = () => {
  30. token.value = ''
  31. window.localStorage.removeItem('token')
  32. localStorage.clear()
  33. router.push({ name: 'Init', replace: true })
  34. }
  35. const ResetUserInfo = (value = {}) => {
  36. userInfo.value = {
  37. ...userInfo.value,
  38. ...value
  39. }
  40. }
  41. /* 获取用户信息*/
  42. const GetUserInfo = async() => {
  43. const res = await getUserInfo()
  44. if (res.code === 0) {
  45. setUserInfo(res.data.userInfo)
  46. }
  47. return res
  48. }
  49. /* 登录*/
  50. const LoginIn = async(loginInfo) => {
  51. loadingInstance.value = ElLoading.service({
  52. fullscreen: true,
  53. text: '登录中,请稍候...',
  54. })
  55. try {
  56. const res = await login(loginInfo)
  57. if (res.code === 0) {
  58. setUserInfo(res.data.user)
  59. setToken(res.data.token)
  60. const routerStore = useRouterStore()
  61. await routerStore.SetAsyncRouter()
  62. const asyncRouters = routerStore.asyncRouters
  63. asyncRouters.forEach(asyncRouter => {
  64. router.addRoute(asyncRouter)
  65. })
  66. if (!router.hasRoute(userInfo.value.authority.defaultRouter)) {
  67. ElMessage.error('请联系管理员进行授权')
  68. } else {
  69. await router.replace({ name: userInfo.value.authority.defaultRouter })
  70. }
  71. loadingInstance.value.close()
  72. const isWin = ref(/windows/i.test(navigator.userAgent))
  73. if (isWin.value) {
  74. window.localStorage.setItem('osType', 'WIN')
  75. } else {
  76. window.localStorage.setItem('osType', 'MAC')
  77. }
  78. return true
  79. }
  80. } catch (e) {
  81. loadingInstance.value.close()
  82. }
  83. loadingInstance.value.close()
  84. }
  85. // 定义全局变量
  86. const Machine = ref(''); // 机台号
  87. const MAC = ref(''); // MAC地址
  88. // 封装获取MAC地址的函数
  89. const fetchMACAddress = async () => {
  90. try {
  91. const response = await fetch("http://127.0.0.1:8090/init");
  92. const res = await response.json();
  93. if (res.macAddress) {
  94. MAC.value = res.macAddress.match(/.{1,2}/g).join("-");
  95. console.log('自动获取物理地址:', MAC.value);
  96. return MAC.value;
  97. } else {
  98. throw new Error('无法获取MAC地址');
  99. }
  100. } catch (error) {
  101. throw new Error('获取MAC地址失败:' + error.message);
  102. }
  103. };
  104. // 获取机器MAC列表,并设置Machine.value
  105. const getMachineMaclist = async (macAddress) => {
  106. console.log("macAddress:", macAddress);
  107. try {
  108. const response = await getMachineMac({ sys_sbID: macAddress });
  109. console.log("response:", response);
  110. if (response.code === 7) {
  111. console.log("未登录或非法访问");
  112. return;
  113. }
  114. if (!response.data) {
  115. console.log("未能获取响应数据,请检查请求或网络连接。");
  116. return;
  117. }
  118. if (response.data.sys_sbID === macAddress) {
  119. Machine.value = response.data.机台号;
  120. console.log("获取到的机台号:", Machine.value);
  121. } else {
  122. console.log("该电脑未绑定 MAC 地址");
  123. }
  124. } catch (error) {
  125. console.error("获取机台号失败:", error.message);
  126. }
  127. };
  128. // 获取MAC地址并格式化
  129. const GetAddr = async () => {
  130. try {
  131. const macAddress = await fetchMACAddress();
  132. await getMachineMaclist(macAddress);
  133. // 如果未获取到机台号,使用默认值 CF01
  134. if (!Machine.value) {
  135. Machine.value = 'CF01';
  136. console.warn("未获取到机台号,使用默认机台号 CF01");
  137. }
  138. // 进行登录操作
  139. await proceedWithLogin();
  140. } catch (error) {
  141. handleGlobalError("初始化失败", error);
  142. }
  143. };
  144. // 处理登录逻辑
  145. const proceedWithLogin = async () => {
  146. let machineId = Machine.value;
  147. // 将机台号格式化为指定形式
  148. machineId = machineId.replace(/([A-Za-z]{2})\d{2}$/, "$101");
  149. const loginInfo = {
  150. username: machineId,
  151. password: "123456",
  152. captcha: "443188",
  153. captchaId: "0FZfnUtAOrdXvTETkJRc",
  154. openCaptcha: false,
  155. };
  156. console.log("准备登录,登录信息:", loginInfo);
  157. await LoginIn2(loginInfo);
  158. };
  159. // 登录处理实现
  160. const LoginIn2 = async (loginInfo) => {
  161. let loadingInstance;
  162. try {
  163. // 显示加载提示
  164. loadingInstance = ElLoading.service({
  165. fullscreen: true,
  166. text: '登录中,请稍候...',
  167. });
  168. const res = await login2(loginInfo);
  169. if (res.code === 0) {
  170. console.log("登录成功:", res);
  171. // 设置用户信息和Token
  172. setUserInfo(res.data.user);
  173. setToken(res.data.token);
  174. // 设置动态路由
  175. const routerStore = useRouterStore();
  176. await routerStore.SetAsyncRouter();
  177. const asyncRouters = routerStore.asyncRouters;
  178. for (const asyncRouter of asyncRouters) {
  179. await router.addRoute(asyncRouter);
  180. }
  181. // 再次获取MAC并校验
  182. const response = await getMachineMac({ sys_sbID: MAC.value });
  183. if (!response.data) {
  184. ClearStorage(); // 清理本地存储
  185. } else {
  186. const userInfo = res.data.user;
  187. if (!router.hasRoute(userInfo.authority.defaultRouter)) {
  188. ElMessage.error('请联系管理员进行授权');
  189. } else {
  190. await router.replace({ name: userInfo.authority.defaultRouter });
  191. }
  192. // 设置系统类型
  193. const isWin = /windows/i.test(navigator.userAgent);
  194. window.localStorage.setItem('osType', isWin ? 'WIN' : 'MAC');
  195. // 登录成功后刷新页面,只刷新一次
  196. if (!localStorage.getItem('pageRefreshed')) {
  197. localStorage.setItem('pageRefreshed', 'true');
  198. setTimeout(() => {
  199. location.reload(); // 刷新页面
  200. }, 1000);
  201. }
  202. return true;
  203. }
  204. } else {
  205. throw new Error('登录失败:' + res.message);
  206. }
  207. } catch (error) {
  208. handleGlobalError("登录时发生错误", error);
  209. } finally {
  210. loadingInstance?.close();
  211. }
  212. };
  213. // 全局错误处理函数
  214. const handleGlobalError = (message, error) => {
  215. console.error(message, error);
  216. ElMessage.error(message);
  217. };
  218. // 调用GetAddr获取MAC地址和机台号,并进行登录
  219. GetAddr();
  220. // const getMachineMaclist = async (macAddress) => {
  221. // try {
  222. // console.log("Fetching MAC details for:", macAddress);
  223. // const response = await getMachineMac({ sys_sbID: macAddress });
  224. // console.log(response)
  225. // if (response?.data?.机台号) {
  226. // Machine.value = response.data.机台号;
  227. // console.log("获取到的机台号:", Machine.value);
  228. // } else {
  229. // console.warn("未获取到有效的机台号,可能是初次登录");
  230. // }
  231. // } catch (error) {
  232. // handleGlobalError("获取机器MAC列表时出错", error);
  233. // }
  234. // };
  235. /* 登出*/
  236. const LoginOut = async() => {
  237. const res = await jsonInBlacklist()
  238. if (res.code === 0) {
  239. token.value = ''
  240. sessionStorage.clear()
  241. localStorage.clear()
  242. router.push({ name: 'Login', replace: true })
  243. window.location.reload()
  244. }
  245. }
  246. /* 清理数据 */
  247. const ClearStorage = async() => {
  248. token.value = ''
  249. sessionStorage.clear()
  250. localStorage.clear()
  251. }
  252. /* 设置侧边栏模式*/
  253. const changeSideMode = async(data) => {
  254. const res = await setSelfInfo({ sideMode: data })
  255. if (res.code === 0) {
  256. userInfo.value.sideMode = data
  257. ElMessage({
  258. type: 'success',
  259. message: '设置成功'
  260. })
  261. }
  262. }
  263. const mode = computed(() => userInfo.value.sideMode)
  264. const sideMode = computed(() => {
  265. if (userInfo.value.sideMode === 'dark') {
  266. return '#191a23'
  267. } else if (userInfo.value.sideMode === 'light') {
  268. return '#fff'
  269. } else {
  270. return userInfo.value.sideMode
  271. }
  272. })
  273. const baseColor = computed(() => {
  274. if (userInfo.value.sideMode === 'dark') {
  275. return '#fff'
  276. } else if (userInfo.value.sideMode === 'light') {
  277. return '#191a23'
  278. } else {
  279. return userInfo.value.baseColor
  280. }
  281. })
  282. const activeColor = computed(() => {
  283. return 'var(--el-color-primary)'
  284. })
  285. watch(() => token.value, () => {
  286. window.localStorage.setItem('token', token.value)
  287. })
  288. return {
  289. userInfo,
  290. token,
  291. NeedInit,
  292. ResetUserInfo,
  293. GetUserInfo,
  294. LoginIn,
  295. LoginIn2,
  296. LoginOut,
  297. changeSideMode,
  298. mode,
  299. sideMode,
  300. setToken,
  301. baseColor,
  302. activeColor,
  303. loadingInstance,
  304. ClearStorage
  305. }
  306. })