왼쪽 주매뉴 API 적용

This commit is contained in:
daniel LEE 2024-11-17 08:48:39 +09:00
parent 8503ef4f3c
commit 2635c22f27
9 changed files with 253 additions and 30 deletions

View File

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true"> <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="pub" uuid="48fe1c90-2c8b-4422-ab16-143a998890c0"> <data-source source="LOCAL" name="pub@leejk0523.com" uuid="ba69e241-137d-4c9f-b047-5010d887b198">
<driver-ref>mariadb</driver-ref> <driver-ref>mariadb</driver-ref>
<synchronize>true</synchronize> <synchronize>true</synchronize>
<imported>true</imported> <imported>true</imported>
<remarks>$PROJECT_DIR$/java/src/main/resources/application.properties</remarks> <remarks>$PROJECT_DIR$/java/src/main/resources/application.properties</remarks>
<jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver> <jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mariadb://localhost:3306/pub</jdbc-url> <jdbc-url>jdbc:mariadb://leejk0523.com:3306/pub</jdbc-url>
<jdbc-additional-properties> <jdbc-additional-properties>
<property name="com.intellij.clouds.kubernetes.db.host.port" /> <property name="com.intellij.clouds.kubernetes.db.host.port" />
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" /> <property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />

View File

@ -3,6 +3,7 @@ package com.leejk0523.javavue.login.controller;
import com.leejk0523.javavue.login.service.UserLoginService; import com.leejk0523.javavue.login.service.UserLoginService;
import com.leejk0523.javavue.login.vo.In; import com.leejk0523.javavue.login.vo.In;
import com.leejk0523.javavue.login.vo.Member; import com.leejk0523.javavue.login.vo.Member;
import com.leejk0523.javavue.login.vo.Out;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -16,7 +17,7 @@ public class UserLoginController {
private final UserLoginService userLoginService; private final UserLoginService userLoginService;
@PostMapping("/api/login") @PostMapping("/api/login")
private ResponseEntity<Member> login(@RequestBody In in) { private ResponseEntity<Out> login(@RequestBody In in) {
final var authorization = userLoginService.login(in); final var authorization = userLoginService.login(in);
if (Objects.isNull(authorization)) { if (Objects.isNull(authorization)) {

View File

@ -3,13 +3,17 @@ package com.leejk0523.javavue.login.dao;
import com.leejk0523.javavue.login.vo.AdminMember; import com.leejk0523.javavue.login.vo.AdminMember;
import com.leejk0523.javavue.login.vo.In; import com.leejk0523.javavue.login.vo.In;
import com.leejk0523.javavue.login.vo.Member; import com.leejk0523.javavue.login.vo.Member;
import com.leejk0523.javavue.model.AsaAdminMember; import com.leejk0523.javavue.login.vo.Out;
import com.leejk0523.javavue.model.QAsaAdminMember; import com.leejk0523.javavue.model.*;
import com.querydsl.core.types.Projections; import com.querydsl.core.types.Projections;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Component @Component
public class UserLoginDao extends QuerydslRepositorySupport { public class UserLoginDao extends QuerydslRepositorySupport {
@ -34,4 +38,80 @@ public class UserLoginDao extends QuerydslRepositorySupport {
.where(asaAdminMember.adminId.eq(in.getMemberId())) .where(asaAdminMember.adminId.eq(in.getMemberId()))
.fetchOne(); .fetchOne();
} }
public List<Out.Menu> findAllMenuByAdminId(String adminId) {
final var menu = QAsaMenu.asaMenu;
final var permission = QAsaPermission.asaPermission;
final var adminSiteRoleRel = QAsaAdminSiteRoleRel.asaAdminSiteRoleRel;
return from(menu)
.innerJoin(adminSiteRoleRel).on(
menu.siteId.eq(adminSiteRoleRel.siteId)
)
.innerJoin(permission).on(
adminSiteRoleRel.siteId.eq(permission.siteId)
.and(adminSiteRoleRel.roleCode.eq(permission.roleCode))
.and(menu.menuId.eq(permission.menuId))
)
.distinct()
.select(Projections.bean(
Out.Menu.class,
menu.menuId,
menu.upMenuId,
menu.menuName,
menu.menuType,
menu.menuDepth,
menu.menuOrder,
menu.menuUrl
))
.where(
adminSiteRoleRel.adminId.eq(adminId)
.and(adminSiteRoleRel.siteId.eq("admin"))
.and(menu.menuType.ne(AsaMenu.Type.API))
.and(menu.menuStatus.eq(AsaMenu.Status.ENABLED))
)
.orderBy(menu.menuDepth.asc(), menu.menuOrder.asc())
.fetch();
}
public List<Out.PermitApi> findAllPermitApiByAdminId(String adminId) {
final var menu = QAsaMenu.asaMenu;
final var permission = QAsaPermission.asaPermission;
final var adminSiteRoleRel = QAsaAdminSiteRoleRel.asaAdminSiteRoleRel;
return from(menu)
.innerJoin(adminSiteRoleRel).on(
menu.siteId.eq(adminSiteRoleRel.siteId)
)
.innerJoin(permission).on(
adminSiteRoleRel.siteId.eq(permission.siteId)
.and(adminSiteRoleRel.roleCode.eq(permission.roleCode))
.and(menu.menuId.eq(permission.menuId))
)
.distinct()
.select(Projections.bean(
Out.PermitApi.class,
menu.menuUrl
))
.where(
adminSiteRoleRel.adminId.eq(adminId)
.and(adminSiteRoleRel.siteId.eq("admin"))
.and(menu.menuType.eq(AsaMenu.Type.API))
)
.fetch();
}
public List<AsaRole> findRoleCodeByAdminId(String adminId) {
final var adminSiteRole = QAsaAdminSiteRoleRel.asaAdminSiteRoleRel;
final var role = QAsaRole.asaRole;
return from(adminSiteRole)
.innerJoin(role).on(adminSiteRole.roleCode.eq(role.roleCode)
.and(adminSiteRole.siteId.eq(role.siteId))
)
.select(role)
.where(adminSiteRole.adminId.eq(adminId))
.fetch();
}
} }

View File

@ -7,5 +7,5 @@ import com.leejk0523.javavue.login.vo.Member;
import com.leejk0523.javavue.login.vo.Out; import com.leejk0523.javavue.login.vo.Out;
public interface UserLoginService { public interface UserLoginService {
Member login(In in); Out login(In in);
} }

View File

@ -3,16 +3,57 @@ package com.leejk0523.javavue.login.service;
import com.leejk0523.javavue.login.dao.UserLoginDao; import com.leejk0523.javavue.login.dao.UserLoginDao;
import com.leejk0523.javavue.login.vo.In; import com.leejk0523.javavue.login.vo.In;
import com.leejk0523.javavue.login.vo.Member; import com.leejk0523.javavue.login.vo.Member;
import com.leejk0523.javavue.login.vo.Out;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class UserLoginServiceImpl implements UserLoginService { public class UserLoginServiceImpl implements UserLoginService {
private final UserLoginDao userLoginDAO; private final UserLoginDao userLoginDAO;
@Override @Override
public Member login(In in) { public Out login(In in) {
return userLoginDAO.findByMemberId(in); var member = userLoginDAO.findByMemberId(in);
var menuList = getMenuList(member.getMemberId());
var permitApiList = userLoginDAO.findAllPermitApiByAdminId(member.getMemberId());
return Out.builder()
.memberNo(member.getMemberNo())
.memberName(member.getMemberName())
.menuList(menuList)
.permitApiList(permitApiList)
.authenticated(true)
.build();
}
private List<Out.Menu> getMenuList(String adminId) {
final var menuList = userLoginDAO.findAllMenuByAdminId(adminId);
final var root = menuList.stream()
.filter(menu -> menu.getMenuDepth().equals(1))
.collect(Collectors.toList());
for (var parent : root) {
nestedMenuList(menuList, parent);
}
return root;
}
private void nestedMenuList(List<Out.Menu> list, Out.Menu parent) {
final var children = list.stream()
.filter(child -> Objects.nonNull(child.getUpMenuId())
&& child.getUpMenuId().equals(parent.getMenuId()))
.collect(Collectors.toList());
parent.setChildren(children.isEmpty() ? null : children);
for (var child : children) {
nestedMenuList(list, child);
}
} }
} }

View File

@ -0,0 +1,46 @@
package com.leejk0523.javavue.model;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import jakarta.persistence.*;
import java.io.Serializable;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "asa_admin_site_role_rel")
@IdClass(AsaAdminSiteRoleRel.Key.class)
public class AsaAdminSiteRoleRel {
@Id
@Size(max = 50)
@NotNull
@Column(name = "ADMIN_ID", nullable = false, length = 50)
private String adminId;
@Id
@Size(max = 20)
@NotNull
@Column(name = "SITE_ID", nullable = false, length = 20)
private String siteId;
@Id
@Size(max = 500)
@Column(name = "ROLE_CODE", length = 100)
private String roleCode;
@Data
public static class Key implements Serializable {
private String adminId;
private String siteId;
private String roleCode;
}
}

View File

@ -0,0 +1,45 @@
package com.leejk0523.javavue.model;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import jakarta.persistence.*;
import java.io.Serializable;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ASA_PERMISSION")
@IdClass(AsaPermission.Key.class)
public class AsaPermission {
@Id
@Size(max = 100)
@NotNull
@Column(name = "ROLE_CODE", nullable = false, length = 100)
private String roleCode;
@Id
@Size(max = 100)
@Column(name = "MENU_ID", length = 100, nullable = false)
private String menuId;
@Id
@Size(max = 20)
@NotNull
@Column(name = "SITE_ID", nullable = false, length = 20)
private String siteId;
@Data
public static class Key implements Serializable {
private String roleCode;
private String menuId;
private String siteId;
}
}

View File

@ -1,9 +1,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { useAuthStore } from '~/stores/login';
const authStore = useAuthStore();
const { loginResponse } = storeToRefs(authStore);
const selectedKeys = ref<string[]>([]); const selectedKeys = ref<string[]>([]);
</script> </script>
<template> <template>
<a-menu v-model:selected-keys="selectedKeys" mode="inline" theme="dark"> <a-menu v-model:selected-keys="selectedKeys" mode="inline" theme="dark">
<!-- <layout-left-menu-item :menu-list="authorization.menuList" />--> <layout-left-menu-item :menu-list="loginResponse.menuList" />
</a-menu> </a-menu>
</template> </template>

View File

@ -1,26 +1,31 @@
<script setup lang="ts"> <script setup lang="ts">
import type { AuthorizationMenuType } from '~/types/login';
defineProps<{
menuList: AuthorizationMenuType[]
}>();
</script> </script>
<template> <template>
<!-- <template v-for="menu in menuList" :key="menu.menuId">--> <template v-for="menu in menuList" :key="menu.menuId">
<!-- <a-menu-item :key="menu.menuId" v-if="!menu.children">--> <a-menu-item :key="menu.menuId" v-if="!menu.children">
<!-- <nuxt-link :to="menu.menuUrl">{{ menu.menuName }}</nuxt-link>--> <nuxt-link :to="menu.menuUrl">{{ menu.menuName }}</nuxt-link>
<!-- </a-menu-item>--> </a-menu-item>
<!-- <a-sub-menu :key="menu.menuId" v-if="menu.children">--> <a-sub-menu :key="menu.menuId" v-if="menu.children">
<!-- <template #title>{{ menu.menuName }}</template>--> <template #title>{{ menu.menuName }}</template>
<!-- <template v-for="child in menu.children">--> <template v-for="child in menu.children">
<!-- <template v-if="!child.children">--> <template v-if="!child.children">
<!-- <a-menu-item :key="child.menuId">--> <a-menu-item :key="child.menuId">
<!-- <nuxt-link :to="child.menuUrl">{{ child.menuName }}</nuxt-link>--> <nuxt-link :to="child.menuUrl">{{ child.menuName }}</nuxt-link>
<!-- </a-menu-item>--> </a-menu-item>
<!-- </template>--> </template>
<!-- <template v-if="child.children">--> <template v-if="child.children">
<!-- <a-sub-menu :key="child.menuId">--> <a-sub-menu :key="child.menuId">
<!-- <template #title>{{ child.menuName }}</template>--> <template #title>{{ child.menuName }}</template>
<!-- <layout-left-menu-item :menu-list="child.children" />--> <layout-left-menu-item :menu-list="child.children" />
<!-- </a-sub-menu>--> </a-sub-menu>
<!-- </template>--> </template>
<!-- </template>--> </template>
<!-- </a-sub-menu>--> </a-sub-menu>
<!-- </template>--> </template>
</template> </template>