Merge branch 'dev' of https://git.hanasys.jp/qcast3/onsitesurvey into feature/suitable

This commit is contained in:
Daseul Kim 2025-05-21 09:56:54 +09:00
commit 7fa03e0713
11 changed files with 228 additions and 78 deletions

View File

@ -10,8 +10,8 @@ NEXT_PUBLIC_QSP_API_URL=http://1.248.227.176:8120
NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:38080 NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:38080
#QPARTNER 로그인 api #QPARTNER 로그인 api
#DB_HOST=202.218.61.226 DB_HOST=202.218.61.226
#DB_USER=readonly DB_USER=readonly
#DB_PASSWORD=aAjmFW12iHKW84l1 DB_PASSWORD=aAjmFW12iHKW84l1
#DB_DATABASE=qpartners DB_DATABASE=qpartners
#DB_PORT=3306 DB_PORT=3306

View File

@ -8,8 +8,8 @@ NEXT_PUBLIC_QSP_API_URL=http://1.248.227.176:8120
NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:38080 NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:38080
#QPARTNER 로그인 api #QPARTNER 로그인 api
#DB_HOST=202.218.61.226 DB_HOST=202.218.61.226
#DB_USER=readonly DB_USER=readonly
#DB_PASSWORD=aAjmFW12iHKW84l1 DB_PASSWORD=aAjmFW12iHKW84l1
#DB_DATABASE=qpartners DB_DATABASE=qpartners
#DB_PORT=3306 DB_PORT=3306

View File

@ -1,5 +1,4 @@
import { NextResponse } from 'next/server' import { NextResponse } from 'next/server'
import { axiosInstance } from '@/libs/axios' import { axiosInstance } from '@/libs/axios'
export async function POST(req: Request) { export async function POST(req: Request) {

View File

@ -1,8 +1,8 @@
import { sessionOptions } from '@/libs/session' import type { SessionData } from '@/types/Auth'
import { SessionData } from '@/types/Auth'
import { getIronSession } from 'iron-session'
import { cookies } from 'next/headers' import { cookies } from 'next/headers'
import { NextResponse } from 'next/server' import { NextResponse } from 'next/server'
import { getIronSession } from 'iron-session'
import { sessionOptions } from '@/libs/session'
export async function GET(request: Request) { export async function GET(request: Request) {
const cookieStore = await cookies() const cookieStore = await cookies()

View File

@ -1,12 +1,10 @@
import type { SessionData } from '@/types/Auth'
import { cookies } from 'next/headers' import { cookies } from 'next/headers'
import { NextResponse } from 'next/server' import { NextResponse } from 'next/server'
import { getIronSession } from 'iron-session' import { getIronSession } from 'iron-session'
import { axiosInstance } from '@/libs/axios' import { axiosInstance } from '@/libs/axios'
import { sessionOptions } from '@/libs/session' import { sessionOptions } from '@/libs/session'
import type { SessionData } from '@/types/Auth'
export async function POST(request: Request) { export async function POST(request: Request) {
const { loginId, pwd } = await request.json() const { loginId, pwd } = await request.json()
@ -14,7 +12,7 @@ export async function POST(request: Request) {
loginId, loginId,
pwd, pwd,
}) })
// console.log('🚀 ~ result ~ result:', result) console.log('🚀 ~ result ~ result:', result.data)
if (result.data.result.code === 200) { if (result.data.result.code === 200) {
const cookieStore = await cookies() const cookieStore = await cookies()
@ -59,8 +57,6 @@ export async function POST(request: Request) {
session.role = 'Admin_Sub' session.role = 'Admin_Sub'
} else if (result.data.data.groupId === '70000' && result.data.data.builderNo !== null) { } else if (result.data.data.groupId === '70000' && result.data.data.builderNo !== null) {
session.role = 'Builder' session.role = 'Builder'
} else if (result.data.data.groupId === '90000' && result.data.data.builderNo !== null) {
session.role = 'Partner'
} else { } else {
session.role = 'User' session.role = 'User'
} }
@ -70,5 +66,50 @@ export async function POST(request: Request) {
await session.save() await session.save()
} }
return NextResponse.json({ code: 200, message: 'Login is Succecss!!', result: result.data.data }) const resultForSession = {
LANG_CD: result.data.data.langCd,
CURR_PAGE: result.data.data.currPage,
ROW_COUNT: result.data.data.rowCount,
START_ROW: result.data.data.startRow,
END_ROW: result.data.data.endRow,
COMP_CD: result.data.data.compCd,
AGENCY_STORE_ID: result.data.data.agencyStoreId,
STORE_ID: result.data.data.storeId,
STORE_NM: result.data.data.storeNm,
USER_ID: result.data.data.userId,
CATEGORY: result.data.data.category,
USER_NM: result.data.data.userNm,
USER_NM_KANA: result.data.data.userNmKana,
TEL_NO: result.data.data.telNo,
FAX: result.data.data.fax,
EMAIL: result.data.data.email,
LAST_EDIT_USER: result.data.data.lastEditUser,
STORE_GUBUN: result.data.data.storeGubun,
PW_CURR: result.data.data.pwCurr,
PWD_INIT_YN: result.data.data.pwdInitYn,
APPR_STAT_CD: result.data.data.apprStatCd,
LOGIN_FAIL_CNT: result.data.data.loginFailCnt,
LOGIN_FAIL_MIN_YN: result.data.data.loginFailMinYn,
PRICE_VIEW_STAT_CD: result.data.data.priceViewStatCd,
GROUP_ID: result.data.data.groupId,
STORE_LVL: result.data.data.storeLvl,
CUST_CD: result.data.data.custCd,
BUILDER_NO: result.data.data.builderNo,
IS_LOGGED_IN: true,
ROLE: '',
}
if (result.data.data.userId === 'T01') {
resultForSession.ROLE = 'T01'
} else if (result.data.data.groupId === '60000') {
resultForSession.ROLE = 'Admin'
} else if (result.data.data.groupId === '70000' && result.data.data.builderNo === null) {
resultForSession.ROLE = 'Admin_Sub'
} else if (result.data.data.groupId === '70000' && result.data.data.builderNo !== null) {
resultForSession.ROLE = 'Builder'
} else {
resultForSession.ROLE = 'User'
}
return NextResponse.json({ code: 200, message: 'Login is Succecss!!', result: resultForSession })
} }

View File

@ -1,49 +1,131 @@
import type { SessionData } from '@/types/Auth'
import { NextResponse } from 'next/server' import { NextResponse } from 'next/server'
import { cookies } from 'next/headers'
import { getIronSession } from 'iron-session'
import executeQuery from '@/libs/partner' import executeQuery from '@/libs/partner'
import { sessionOptions } from '@/libs/session'
export async function GET(request: Request) { export async function POST(request: Request) {
// const sqls = `SELECT const cookieStore = await cookies()
// r.data_id, const session = await getIronSession<SessionData>(cookieStore, sessionOptions)
// u.id AS user_id, const { loginId, pwd } = await request.json()
// u.login_id AS user_login_id,
// u.password AS user_password, const sql = `
// u.user_name AS user_name, SELECT
// u.user_name_kana AS user_name_kana, r.data_id,
// u.sei AS user_sei, u.id AS user_id,
// u.mei AS user_mei, u.login_id AS user_login_id,
// u.sei_kana AS user_sei_kana, u.password AS user_password,
// u.mei_kana AS user_mei_kana, u.user_name AS user_name,
// u.user_tel AS user_tel, u.user_name_kana AS user_name_kana,
// u.user_fax AS user_fax, u.sei AS user_sei,
// u.status AS user_status, u.mei AS user_mei,
// u.seko_id AS user_seko_id, u.sei_kana AS user_sei_kana,
// u.seko_limit AS user_seko_limit, u.mei_kana AS user_mei_kana,
// s.id AS supplier_id, u.user_tel AS user_tel,
// s.code AS supplier_code, u.user_fax AS user_fax,
// s.name AS supplier_name, u.status AS user_status,
// s.name_kana AS supplier_name_kana, u.seko_id AS user_seko_id,
// s.kind AS supplier_kind u.seko_limit AS user_seko_limit,
// FROM s.id AS supplier_id,
// R_DATA r s.code AS supplier_code,
// JOIN s.name AS supplier_name,
// M_USER u ON r.data_id = u.id s.name_kana AS supplier_name_kana,
// JOIN s.kind AS supplier_kind
// M_SUPPLIER s ON r.relation_id = s.id FROM
// WHERE R_DATA r
// u.status = '1' JOIN
// AND M_USER u ON r.data_id = u.id
// u.seko_id is not null JOIN
// AND M_SUPPLIER s ON r.relation_id = s.id
// u.seko_limit > now() WHERE
// AND u.status = '1'
// s.kind = '4' AND
// AND u.seko_id is not null
// u.login_id = ? AND
// AND u.seko_limit > now()
// u.password = ? AND
// ` s.kind = '4'
const sql = 'SELECT * FROM M_USER' AND
const data = await executeQuery(sql, []) u.login_id = ?
console.log('🚀 ~ GET ~ data:', data) AND
return NextResponse.json(data) u.password = ?
`
// const sql = 'SELECT * FROM M_USER'
const data = (await executeQuery(sql, [loginId, pwd])) as any[]
console.log('🚀 ~ POST ~ data:', data)
if (data.length > 0) {
console.log('start session edit!')
session.langCd = null
session.currPage = null
session.rowCount = null
session.startRow = null
session.endRow = null
session.compCd = null
session.agencyStoreId = null
session.storeId = data[0].supplier_code
session.storeNm = data[0].supplier_name
session.userId = data[0].user_login_id
session.category = data[0].supplier_name
session.userNm = `${data[0].user_sei} ${data[0].user_mei}`
session.userNmKana = `${data[0].user_sei_kana} ${data[0].user_mei_kana}`
session.telNo = data[0].tel
session.fax = data[0].fax
session.email = data[0].user_login_id
session.lastEditUser = null
session.storeGubun = null
session.pwCurr = null
session.pwdInitYn = null
session.apprStatCd = null
session.loginFailCnt = null
session.loginFailMinYn = null
session.priceViewStatCd = null
session.groupId = null
session.storeLvl = null
session.custCd = null
session.builderNo = data[0].user_seko_id
session.isLoggedIn = true
session.role = 'Partner'
console.log('end session edit!')
await session.save()
}
// qsp 유저 데이터 모양과 맞춰서 변환
const result = {
LANG_CD: null,
CURR_PAGE: null,
ROW_COUNT: null,
START_ROW: null,
END_ROW: null,
COMP_CD: null,
AGENCY_STORE_ID: null,
STORE_ID: data[0].supplier_code,
STORE_NM: data[0].supplier_name,
USER_ID: data[0].user_login_id,
CATEGORY: data[0].supplier_name,
USER_NM: `${data[0].user_sei} ${data[0].user_mei}`,
USER_NM_KANA: `${data[0].user_sei_kana} ${data[0].user_mei_kana}`,
TEL_NO: data[0].tel,
FAX: data[0].fax,
EMAIL: data[0].user_login_id,
LAST_EDIT_USER: null,
STORE_GUBUN: null,
PW_CURR: null,
PWD_INIT_YN: null,
APPR_STAT_CD: null,
LOGIN_FAIL_CNT: null,
LOGIN_FAIL_MIN_YN: null,
PRICE_VIEW_STAT_CD: null,
GROUP_ID: null,
STORE_LVL: null,
CUST_CD: null,
BUILDER_NO: data[0].user_seko_id,
IS_LOGGED_IN: true,
ROLE: 'Partner',
}
return NextResponse.json({ code: 200, message: 'Partner Login is Succecss!!', result })
} }

View File

@ -3,10 +3,8 @@
import type { SessionData } from '@/types/Auth' import type { SessionData } from '@/types/Auth'
import { useEffect, useReducer, useState } from 'react' import { useEffect, useReducer, useState } from 'react'
import { useRouter } from 'next/navigation' import { useRouter } from 'next/navigation'
import { useLocalStorage } from 'usehooks-ts' import { useLocalStorage } from 'usehooks-ts'
import { useQuery } from '@tanstack/react-query' import { useQuery } from '@tanstack/react-query'
import { axiosInstance } from '@/libs/axios' import { axiosInstance } from '@/libs/axios'
import { useSessionStore } from '@/store/session' import { useSessionStore } from '@/store/session'
@ -48,7 +46,14 @@ export default function Login() {
} = useQuery<LoginData, Error>({ } = useQuery<LoginData, Error>({
queryKey: ['login', 'account'], queryKey: ['login', 'account'],
queryFn: async () => { queryFn: async () => {
const { data } = await axiosInstance('').post<LoginData>(`/api/auth`, { let url = ''
if (!isPartners) {
url = '/api/auth'
} else {
url = '/api/partner'
}
const { data } = await axiosInstance('').post<LoginData>(`${url}`, {
loginId: account.loginId, loginId: account.loginId,
pwd: account.pwd, pwd: account.pwd,
}) })
@ -68,6 +73,7 @@ export default function Login() {
indivisualData: account.pwd, indivisualData: account.pwd,
}) })
// 세션 정보 저장 // 세션 정보 저장
console.log('🚀 ~ Login ~ loginData:', loginData)
setSession({ setSession({
...session, ...session,
...loginData?.result, ...loginData?.result,

View File

@ -57,9 +57,11 @@ export default function MemberInformationPopup() {
<input type="text" className="input-frame" defaultValue={session.builderNo ?? ''} disabled /> <input type="text" className="input-frame" defaultValue={session.builderNo ?? ''} disabled />
</div> </div>
</div> </div>
<button className="btn-frame n-blue icon" onClick={handlePwReset}> {session.role !== 'Partner' && (
<i className="btn-arr"></i> <button className="btn-frame n-blue icon" onClick={handlePwReset}>
</button> <i className="btn-arr"></i>
</button>
)}
</div> </div>
</div> </div>
</div> </div>

View File

@ -114,9 +114,11 @@ export default function Header() {
<li className="side-nav-item"> <li className="side-nav-item">
<button onClick={() => router.push('/inquiry/regist')}>1:1お問い合わせ登録</button> <button onClick={() => router.push('/inquiry/regist')}>1:1お問い合わせ登録</button>
</li> </li>
<li className="side-nav-item"> {session.role !== 'Partner' && (
<button onClick={() => router.push('/pw-reset')}></button> <li className="side-nav-item">
</li> <button onClick={() => router.push('/pw-reset')}></button>
</li>
)}
</ul> </ul>
</nav> </nav>
<div className="side-nav-footer"> <div className="side-nav-footer">

View File

@ -75,8 +75,19 @@ export const transformObjectKeys = (obj: any): any => {
if (obj !== null && typeof obj === 'object') { if (obj !== null && typeof obj === 'object') {
return Object.keys(obj).reduce((acc: any, key: string) => { return Object.keys(obj).reduce((acc: any, key: string) => {
const camelKey = snakeToCamel(key) let transformedKey = key
acc[camelKey] = transformObjectKeys(obj[key])
// Handle uppercase snake_case (e.g., USER_NAME -> userName)
if (/^[A-Z_]+$/.test(key)) {
transformedKey = snakeToCamel(key)
}
// Handle single uppercase word (e.g., ROLE -> role)
else if (/^[A-Z]+$/.test(key)) {
transformedKey = key.toLowerCase()
}
// Preserve existing camelCase
acc[transformedKey] = transformObjectKeys(obj[key])
return acc return acc
}, {}) }, {})
} }

View File

@ -1,7 +1,7 @@
'use client' 'use client'
import { useEffect } from 'react' import { useEffect } from 'react'
import { usePathname } from 'next/navigation' import { usePathname, useRouter } from 'next/navigation'
import { useHeaderStore } from '@/store/header' import { useHeaderStore } from '@/store/header'
import { usePopupController } from '@/store/popupController' import { usePopupController } from '@/store/popupController'
@ -22,12 +22,19 @@ interface EdgeProviderProps {
} }
export default function EdgeProvider({ children, sessionData }: EdgeProviderProps) { export default function EdgeProvider({ children, sessionData }: EdgeProviderProps) {
const router = useRouter()
const pathname = usePathname() const pathname = usePathname()
const { setBackBtn } = useHeaderStore() const { setBackBtn } = useHeaderStore()
const { reset } = useSideNavState() const { reset } = useSideNavState()
const { setAlertMsg, setAlertBtn, setAlert, setAlert2, setAlert2BtnYes, setAlert2BtnNo } = usePopupController() const { setAlertMsg, setAlertBtn, setAlert, setAlert2, setAlert2BtnYes, setAlert2BtnNo } = usePopupController()
const { session, setSession } = useSessionStore() const { session, setSession } = useSessionStore()
if (pathname === '/login') {
if (session?.isLoggedIn) {
router.push('/')
}
}
/** /**
* *
* *