user.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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. // try {
  107. console.log("macAddress:",macAddress)
  108. const response = await getMachineMac({ sys_sbID: macAddress });
  109. if (response.code === 7) {console.log("未登录或非法访问");return;}
  110. if (response.data.机台号 === macAddress) {
  111. Machine.value = response.data.机台号;
  112. console.log("获取到的机台号:", Machine.value);
  113. }else{
  114. if (response.data === null) {
  115. console.log("未能获取响应数据,请检查请求或网络连接。");
  116. return;
  117. }
  118. if (response.code === 7) {
  119. console.log("未登录或非法访问,已忽略该提示");
  120. return;
  121. }
  122. if (response.data.机台号 === undefined) {
  123. console.log("该电脑未绑定 MAC 地址");
  124. return;
  125. }
  126. }
  127. if (response.data === null) {
  128. console.log("未能获取响应数据,请检查请求或网络连接。");
  129. return;
  130. }
  131. if (response.data.机台号 === undefined) {
  132. console.log("该电脑未绑定 MAC 地址");
  133. return;
  134. }
  135. };
  136. // 获取MAC地址并格式化
  137. const GetAddr = async () => {
  138. const macAddress = await fetchMACAddress();
  139. await getMachineMaclist(macAddress);
  140. // 如果未获取到机台号,使用默认值 CF01
  141. if (!Machine.value) {
  142. Machine.value = 'CF01';
  143. console.warn("未获取到机台号,使用默认机台号 CF01");
  144. }
  145. // 进行登录操作
  146. await proceedWithLogin();
  147. };
  148. // 处理登录逻辑
  149. const proceedWithLogin = async () => {
  150. let machineId = Machine.value;
  151. // 匹配任意两位字母或字母数字开头,后面是两位数字,且后缀不是01的情况
  152. machineId = machineId.replace(/([A-Za-z]{2})\d{2}$/, "$101");
  153. const loginInfo = {
  154. username: machineId, // 修改后的机台号
  155. password: "123456",
  156. captcha: "443188",
  157. captchaId: "0FZfnUtAOrdXvTETkJRc",
  158. openCaptcha: false,
  159. };
  160. console.log(loginInfo); // 输出结果进行验证
  161. console.log("准备登录,登录信息:", loginInfo);
  162. await LoginIn2(loginInfo); // 进行登录操作
  163. };
  164. // 登录处理实现
  165. const LoginIn2 = async (loginInfo) => {
  166. let loadingInstance;
  167. try {
  168. // 显示加载提示
  169. loadingInstance = ElLoading.service({
  170. fullscreen: true,
  171. text: '登录中,请稍候...',
  172. });
  173. const res = await login2(loginInfo);
  174. if (res.code === 0) {
  175. // 登录成功
  176. console.log("登录成功:", res);
  177. // 设置用户信息和Token
  178. setUserInfo(res.data.user);
  179. setToken(res.data.token);
  180. // 设置动态路由
  181. const routerStore = useRouterStore();
  182. await routerStore.SetAsyncRouter();
  183. const asyncRouters = routerStore.asyncRouters;
  184. for (const asyncRouter of asyncRouters) {
  185. await router.addRoute(asyncRouter);
  186. }
  187. // 再次获取MAC并校验
  188. const response = await getMachineMac({ sys_sbID: MAC.value });
  189. if (response.data === null) {
  190. ClearStorage(); // 清理本地存储
  191. } else {
  192. // 检查默认路由是否存在
  193. const userInfo = res.data.user;
  194. if (!router.hasRoute(userInfo.authority.defaultRouter)) {
  195. ElMessage.error('请联系管理员进行授权');
  196. } else {
  197. // 跳转到默认路由
  198. await router.replace({ name: userInfo.authority.defaultRouter });
  199. }
  200. // 处理系统类型
  201. const isWin = /windows/i.test(navigator.userAgent);
  202. window.localStorage.setItem('osType', isWin ? 'WIN' : 'MAC');
  203. return true;
  204. }
  205. } else {
  206. // 登录失败
  207. throw new Error('登录失败:' + res.message);
  208. }
  209. } catch (error) {
  210. throw new Error('登录时发生错误:' + error.message);
  211. } finally {
  212. // 关闭加载提示
  213. loadingInstance?.close();
  214. }
  215. };
  216. // 全局错误处理函数
  217. const handleGlobalError = (message, error) => {
  218. console.error(message, error);
  219. ElMessage.error(message);
  220. };
  221. // 调用GetAddr获取MAC地址和机台号,并进行登录
  222. GetAddr();
  223. // const getMachineMaclist = async (macAddress) => {
  224. // try {
  225. // console.log("Fetching MAC details for:", macAddress);
  226. // const response = await getMachineMac({ sys_sbID: macAddress });
  227. // console.log(response)
  228. // if (response?.data?.机台号) {
  229. // Machine.value = response.data.机台号;
  230. // console.log("获取到的机台号:", Machine.value);
  231. // } else {
  232. // console.warn("未获取到有效的机台号,可能是初次登录");
  233. // }
  234. // } catch (error) {
  235. // handleGlobalError("获取机器MAC列表时出错", error);
  236. // }
  237. // };
  238. /* 登出*/
  239. const LoginOut = async() => {
  240. const res = await jsonInBlacklist()
  241. if (res.code === 0) {
  242. token.value = ''
  243. sessionStorage.clear()
  244. localStorage.clear()
  245. router.push({ name: 'Login', replace: true })
  246. window.location.reload()
  247. }
  248. }
  249. /* 清理数据 */
  250. const ClearStorage = async() => {
  251. token.value = ''
  252. sessionStorage.clear()
  253. localStorage.clear()
  254. }
  255. /* 设置侧边栏模式*/
  256. const changeSideMode = async(data) => {
  257. const res = await setSelfInfo({ sideMode: data })
  258. if (res.code === 0) {
  259. userInfo.value.sideMode = data
  260. ElMessage({
  261. type: 'success',
  262. message: '设置成功'
  263. })
  264. }
  265. }
  266. const mode = computed(() => userInfo.value.sideMode)
  267. const sideMode = computed(() => {
  268. if (userInfo.value.sideMode === 'dark') {
  269. return '#191a23'
  270. } else if (userInfo.value.sideMode === 'light') {
  271. return '#fff'
  272. } else {
  273. return userInfo.value.sideMode
  274. }
  275. })
  276. const baseColor = computed(() => {
  277. if (userInfo.value.sideMode === 'dark') {
  278. return '#fff'
  279. } else if (userInfo.value.sideMode === 'light') {
  280. return '#191a23'
  281. } else {
  282. return userInfo.value.baseColor
  283. }
  284. })
  285. const activeColor = computed(() => {
  286. return 'var(--el-color-primary)'
  287. })
  288. watch(() => token.value, () => {
  289. window.localStorage.setItem('token', token.value)
  290. })
  291. return {
  292. userInfo,
  293. token,
  294. NeedInit,
  295. ResetUserInfo,
  296. GetUserInfo,
  297. LoginIn,
  298. LoginIn2,
  299. LoginOut,
  300. changeSideMode,
  301. mode,
  302. sideMode,
  303. setToken,
  304. baseColor,
  305. activeColor,
  306. loadingInstance,
  307. ClearStorage
  308. }
  309. })