| | |
| | | pwErr:'Please enter your password', |
| | | loginSuccessful:'User login successful', |
| | | loginErr:'The account or password is incorrect', |
| | | connectErr:'server connection failed', |
| | | connectErr:'Login timed out, please login again', |
| | | user:'User', |
| | | password:'Pass', |
| | | SysName:'North Glass ERP System', |
| | |
| | | titleFirst:"Welcome ", |
| | | titleLast:' to use North Glass ERP system!' |
| | | }, |
| | | error:{ |
| | | Code_401:'The user does not have this permission', |
| | | Code_402:'Login timed out, please login again' |
| | | }, |
| | | basicData:{ |
| | | create:'New Order', |
| | | review:"Review", |
| | |
| | | pwErr:'请输入你的密码', |
| | | loginSuccessful:'登录成功', |
| | | loginErr:'账号或密码错误', |
| | | connectErr:'服务器连接失败', |
| | | connectErr:'登录超时,请重新登录', |
| | | user:'用户', |
| | | password:'密码', |
| | | SysName:'北玻自动化ERP管理系统', |
| | |
| | | titleFirst:"欢迎 ", |
| | | titleLast:' 使用北玻ERP系统!' |
| | | }, |
| | | error:{ |
| | | Code_401:'用户暂无此权限', |
| | | Code_402:'登录超时,请重新登录' |
| | | }, |
| | | basicData:{ |
| | | create:'创建', |
| | | review:"审核", |
| | |
| | | const store=userInfo() |
| | | |
| | | const router = useRouter() |
| | | const user = null |
| | | const userStore = useUserInfoStore() |
| | | const user = userStore.user.userName |
| | | watch(()=>userStore.responseCode,(newVal) => { |
| | | switch (newVal){ |
| | | case 401:{ |
| | | ElMessage.warning(t('error.Code_401')) |
| | | break |
| | | } |
| | | case 402:{ |
| | | ElMessage.warning(t('error.Code_402')) |
| | | router.push("/login") |
| | | break |
| | | } |
| | | default:{ |
| | | break |
| | | } |
| | | } |
| | | } |
| | | ) |
| | | //userStore.user.userName |
| | | store.createWebSocket(); |
| | | async function quit(){ |
| | | function quit(){ |
| | | userStore.$patch({ |
| | | user:null |
| | | }) |
| | | await request.post("/userInfo/logout").then((res) => { |
| | | |
| | | }).catch((e)=>{ |
| | | |
| | | }).finally(()=>{ |
| | | request.post('/userInfo/logout').finally(()=>{ |
| | | router.push("/login") |
| | | }) |
| | | |
| | | // |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | //提取模块列表 |
| | | let menuList=$ref([]) |
| | | request.get(`/menu/getMenu/${lang}`).then((res) => { |
| | | if(res.code==200){ |
| | | menuList= deepClone(res.data) |
| | | }else{ |
| | | ElMessage.warning(res.msg) |
| | | router.push("/login") |
| | | } |
| | | }).catch((e)=>{ |
| | | ElMessage.warning(t('main.connectErr')) |
| | | router.push("/login") |
| | | onMounted(()=>{ |
| | | request.get(`/menu/getMenu/${lang}`).then((res) => { |
| | | |
| | | if(res.code==200){ |
| | | menuList= deepClone(res.data) |
| | | } |
| | | }) |
| | | |
| | | }) |
| | | |
| | | |
| | | //获取菜单列表 |
| | | let menuItemList=$ref([]) |
| | | request.get(`/menuItem/getMenuItem/${lang}`).then((res) => { |
| | |
| | | import {createWebSocket, global_callback1} from "@/utils/webSocket"; |
| | | |
| | | export default defineStore("userInfo",{ |
| | | state: () =>{ |
| | | let user=ref({ |
| | | userName:null, |
| | | userId:null |
| | | }) |
| | | return { |
| | | user |
| | | } |
| | | }, |
| | | state: () =>({ |
| | | user:ref({ |
| | | userName:null, |
| | | userId:null |
| | | }), |
| | | responseCode:null |
| | | }), |
| | | actions:{ |
| | | createWebSocket(){ |
| | | createWebSocket(global_callback1) |
| | | }, |
| | | setResponseCode(cede){ |
| | | this.responseCode=cede |
| | | } |
| | | |
| | | }, |
| | |
| | | // 可以在接口响应后统一处理结果 |
| | | request.interceptors.response.use( |
| | | response => { |
| | | let res = response.data; |
| | | let res = response.data |
| | | //传递报错信息,把报错信息传递到pinia中 |
| | | userStore.setResponseCode(parseInt(res.code)) |
| | | if(res.code!=='200'){ |
| | | return Promise.reject(res.code) |
| | | } |
| | | |
| | | // 如果是返回的文件 |
| | | if (response.config.responseType === 'blob') { |
| | | return res |
| | |
| | | <script lang="ts" setup> |
| | | import {onMounted, onUnmounted, reactive, ref} from "vue" |
| | | import {useRoute, useRouter} from 'vue-router' |
| | | import {useRouter,useRoute } from 'vue-router' |
| | | import type {FormInstance, FormRules} from 'element-plus' |
| | | import {ElMessage} from "element-plus"; |
| | | import {Avatar, Lock} from '@element-plus/icons-vue' |
| | | import { ElMessage } from "element-plus"; |
| | | import { Lock,Avatar } from '@element-plus/icons-vue' |
| | | import request from '@/utils/request' |
| | | import userInfo from '@/stores/userInfo' |
| | | import {useI18n} from 'vue-i18n' |
| | | import { sendSock, createWebSocket, closeSock,global_callback1 } from "@/utils/webSocket" |
| | | import { useI18n } from 'vue-i18n' |
| | | import i18n from "@/lang/index" |
| | | //语言获取 |
| | | const { t } = useI18n() |
| | | let language = ref(localStorage.getItem('lang') || 'zh') |
| | |
| | | router.push('/main') |
| | | ElMessage.success(t('login.loginSuccessful')) |
| | | } else { |
| | | ElMessage.error(t('login.loginErr')) |
| | | ElMessage.error(res['msg']) |
| | | loginLoadings.value=false |
| | | return false |
| | | } |
| | |
| | | package com.example.erp.config; |
| | | |
| | | import cn.dev33.satoken.stp.StpInterface; |
| | | import com.example.erp.service.userInfo.PermissionRoleService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.ArrayList; |
| | |
| | | */ |
| | | @Component // 打开此注解,保证此类被springboot扫描,即可完成sa-token的自定义权限验证扩展 |
| | | public class StpInterfaceImpl implements StpInterface { |
| | | private final PermissionRoleService permissionRoleService; |
| | | |
| | | public StpInterfaceImpl(PermissionRoleService permissionRoleService) { |
| | | this.permissionRoleService = permissionRoleService; |
| | | } |
| | | |
| | | /** |
| | | * 返回一个账号所拥有的权限码集合 |
| | | */ |
| | | @Override |
| | | public List<String> getPermissionList(Object loginId, String loginType) { |
| | | // 本list仅做模拟,实际项目中要根据具体业务逻辑来查询权限 |
| | | List<String> list = new ArrayList<>(); |
| | | /*List<String> list = new ArrayList<>(); |
| | | list.add("101"); |
| | | list.add("user.add"); |
| | | list.add("user.update"); |
| | | list.add("user.get"); |
| | | // list.add("user.delete"); |
| | | list.add("art.*"); |
| | | return list; |
| | | list.add("art.*");*/ |
| | | |
| | | return permissionRoleService.getUserPermission(Integer.parseInt((String) loginId)); |
| | | } |
| | | /** |
| | | * 返回一个账号所拥有的角色标识集合 |
| | |
| | | import lombok.Data; |
| | | @Data //用于接受前端登录额user信息 |
| | | public class UserDTO { |
| | | private Integer id; |
| | | private String userId; |
| | | private String pass; |
| | | private String token; |
New file |
| | |
| | | package com.example.erp.entity.userInfo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class PermissionBasic { |
| | | @TableId(type = IdType.AUTO) |
| | | private Integer id; |
| | | private String page; |
| | | private String permission; |
| | | private String state; |
| | | } |
New file |
| | |
| | | package com.example.erp.entity.userInfo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class PermissionRole { |
| | | @TableId(type = IdType.AUTO) |
| | | private Integer id; |
| | | private Integer roleId; |
| | | private Integer permissionId; |
| | | |
| | | } |
New file |
| | |
| | | package com.example.erp.entity.userInfo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class Role { |
| | | @TableId(type = IdType.AUTO) |
| | | private String id; |
| | | private String role; |
| | | } |
| | |
| | | private String userName; |
| | | private String address; |
| | | private String phone; |
| | | private Integer roleId; |
| | | private String createTime; |
| | | private String updateTime; |
| | | private Integer state; |
New file |
| | |
| | | package com.example.erp.mapper.userInfo; |
| | | |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Mapper |
| | | public interface PermissionRoleMapper { |
| | | List<String> getUserPermission(Integer loginId); |
| | | } |
New file |
| | |
| | | package com.example.erp.service.userInfo; |
| | | |
| | | import com.baomidou.dynamic.datasource.annotation.DS; |
| | | import com.example.erp.mapper.userInfo.PermissionRoleMapper; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.List; |
| | | |
| | | @DS("user_info") |
| | | @Service |
| | | public class PermissionRoleService { |
| | | private final PermissionRoleMapper permissionRoleMapper; |
| | | |
| | | public PermissionRoleService(PermissionRoleMapper permissionRoleMapper) { |
| | | this.permissionRoleMapper = permissionRoleMapper; |
| | | } |
| | | |
| | | public List<String> getUserPermission(Integer loginId) { |
| | | return permissionRoleMapper.getUserPermission(loginId); |
| | | |
| | | } |
| | | } |
| | |
| | | User user = userMapper.selectOne(new QueryWrapper<User>(). |
| | | eq("login_name", userDTO.getUserId()).eq("password", userDTO.getPass())); |
| | | if(user!=null){ |
| | | StpUtil.login(userDTO.getUserId()); |
| | | StpUtil.login(user.getId()); |
| | | userDTO.setPass(null); |
| | | userDTO.setId(user.getId()); |
| | | userDTO.setUserName(user.getUserName()); |
| | | userDTO.setToken(StpUtil.getTokenValue()); |
| | | return userDTO; |
| | | }else{ |