Compare commits

...

3 Commits
main ... main

13 changed files with 455 additions and 0 deletions

6
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
# 디폴트 무시된 파일
/shelf/
/workspace.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

8
.idea/AcaMate_DB.iml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="DBE_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

15
.idea/dataSources.xml Normal file
View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="AcaMate@ipstein.myds.me" uuid="c981a77c-77fb-455d-a5c4-2393c7c48d2e">
<driver-ref>mariadb</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mariadb://ipstein.myds.me:8003/AcaMate</jdbc-url>
<jdbc-additional-properties>
<property name="database.introspection.mysql.dbe5060" value="true" />
</jdbc-additional-properties>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/AcaMate_DB.iml" filepath="$PROJECT_DIR$/.idea/AcaMate_DB.iml" />
</modules>
</component>
</project>

13
.idea/sqldialects.xml Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/scripts/AddIndex.sql" dialect="MariaDB" />
<file url="file://$PROJECT_DIR$/scripts/Chat.sql" dialect="MariaDB" />
<file url="file://$PROJECT_DIR$/scripts/Class.sql" dialect="MariaDB" />
<file url="file://$PROJECT_DIR$/scripts/Push.sql" dialect="MariaDB" />
<file url="file://$PROJECT_DIR$/scripts/Token.sql" dialect="MariaDB" />
<file url="file://$PROJECT_DIR$/scripts/User.sql" dialect="MariaDB" />
<file url="file://$PROJECT_DIR$/scripts/log.sql" dialect="MariaDB" />
<file url="PROJECT" dialect="MariaDB" />
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

91
scripts/AddIndex.sql Normal file
View File

@ -0,0 +1,91 @@
create table academy
(
bid char(6) not null
primary key,
business_name varchar(100) not null,
business_owner varchar(50) not null,
business_number varchar(20) not null,
business_date datetime not null,
business_address varchar(200) not null,
business_contact varchar(15) not null,
uid varchar(70) not null
);
create table payload
(
pid char(22) not null
primary key,
title varchar(100) not null,
subtitle varchar(100) null,
body varchar(255) not null,
alert_yn tinyint(1) default 1 not null,
category char(4) not null,
content text null
);
create table push_cabinet
(
uid varchar(70) not null,
pid char(22) not null,
send_date datetime not null,
check_yn tinyint(1) default 0 not null,
primary key (uid, pid),
constraint fk_pushcabinet_pid_to_payload
foreign key (pid) references payload (pid)
on update cascade on delete cascade,
constraint fk_pushcabinet_uid_to_user
foreign key (uid) references user (uid)
on update cascade on delete cascade
);
ALTER TABLE payload
ADD COLUMN bid CHAR(6) NOT NULL DEFAULT '000000' AFTER pid
;
ALTER TABLE payload
DROP PRIMARY KEY ,
ADD PRIMARY KEY (bid, pid)
;
ALTER TABLE payload
ADD CONSTRAINT fk_payload_bid_to_academy
FOREIGN KEY (bid) REFERENCES academy(bid)
ON UPDATE CASCADE ON DELETE CASCADE
;
# //------//
ALTER TABLE push_cabinet
ADD COLUMN bid CHAR(6) NOT NULL DEFAULT 'AA0000' AFTER uid
;
ALTER TABLE push_cabinet
DROP PRIMARY KEY,
ADD PRIMARY KEY (bid, uid, pid)
;
ALTER TABLE push_cabinet
DROP FOREIGN KEY fk_pushcabinet_pid_to_payload
;
ALTER TABLE push_cabinet
DROP FOREIGN KEY fk_pushcabinet_uid_to_user
;
ALTER TABLE push_cabinet
ADD CONSTRAINT fk_pushcabinet_payload
FOREIGN KEY (bid, pid) REFERENCES payload(bid, pid)
ON UPDATE CASCADE ON DELETE CASCADE
;
ALTER TABLE push_cabinet
ADD CONSTRAINT fk_pushcabinet_bid_to_academy
FOREIGN KEY (bid) REFERENCES academy(bid)
ON UPDATE CASCADE ON DELETE CASCADE
;

56
scripts/Chat.sql Normal file
View File

@ -0,0 +1,56 @@
CREATE TABLE chat_room
(
cid CHAR(16) NOT NULL PRIMARY KEY, -- 채팅방 구분 코드: 6(bid) + 6(yyyyMMdd) + 4(숫자 카운트)
bid CHAR(6) NOT NULL, -- 학원 구분 코드
name TEXT NOT NULL, -- 채팅방 이름
type CHAR(4) NOT NULL, -- 채팅방 유형 (1:1, 그룹 등)
create_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 생성 일자
open_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 오픈 일자
close_date DATETIME, -- 중지 일자 (채팅방 종료 처리)
FOREIGN KEY (bid) REFERENCES academy (bid) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE chat_join
(
cid CHAR(16) NOT NULL, -- 채팅방 구분 코드
uid VARCHAR(70) NOT NULL, -- 사용자 구분 코드
join_date DATETIME NOT NULL, -- 채팅방 입장 시간
mid CHAR(36), -- 마지막 확인한 메시지 ID
is_notice BOOLEAN DEFAULT TRUE, -- 알림 설정 여부
PRIMARY KEY (cid, uid),
FOREIGN KEY (cid) REFERENCES chat_room (cid) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (uid) REFERENCES user (uid) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (mid) REFERENCES chat_message (mid) ON UPDATE CASCADE
);
CREATE TABLE chat_message
(
mid CHAR(36) NOT NULL PRIMARY KEY, -- 메시지 구분 코드(UUID)
cid CHAR(16) NOT NULL, -- 채팅방 구분 코드
uid VARCHAR(70) NOT NULL, -- 사용자 구분 코드
create_date DATETIME NOT NULL, -- 메시지 작성 일자
content TEXT NOT NULL, -- 메시지 내용
is_hidden BOOLEAN NOT NULL DEFAULT FALSE, -- 가리기 여부
media_url TEXT, -- 첨부 파일 링크
read_count INT NOT NULL DEFAULT 0, -- 읽은 사람 수
blind BOOLEAN NOT NULL DEFAULT FALSE, -- 신고로 인해 블라인드 처리 여부
check_report BOOLEAN NOT NULL DEFAULT FALSE, -- 신고 검토 여부
FOREIGN KEY (cid) REFERENCES chat_room (cid) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (uid) REFERENCES user (uid) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX idx_chat_message_cid ON chat_message(cid);
CREATE INDEX idx_chat_message_cid_create_date ON chat_message(cid, create_date);
CREATE INDEX idx_chat_message_uid_cid ON chat_message(uid, cid);
CREATE TABLE report_list
(
cid CHAR(16) NOT NULL, -- 채팅방 구분 코드
uid VARCHAR(70) NOT NULL, -- 신고자 사용자 코드
mid CHAR(36) NOT NULL, -- 신고된 메시지 ID
report TEXT, -- 신고 사유
PRIMARY KEY (cid, uid, mid),
FOREIGN KEY (cid) REFERENCES chat_room (cid) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (uid) REFERENCES user (uid) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (mid) REFERENCES chat_message (mid) ON DELETE CASCADE ON UPDATE CASCADE
);

69
scripts/Class.sql Normal file
View File

@ -0,0 +1,69 @@
CREATE TABLE `class_info` (
`id` CHAR(10) NOT NULL COMMENT '강의 구분 코드 (AMC+4숫자+3대문자)',
`name` VARCHAR(100) NOT NULL COMMENT '강의 제목',
`uid` CHAR(70) NOT NULL COMMENT '담당 선생님 구분 코드',
`start_date` DATETIME NOT NULL COMMENT '강의 시작일',
`end_date` DATETIME DEFAULT NULL COMMENT '강의 종료일',
`day` TINYINT NOT NULL COMMENT '수업 요일 비트(월요일 부터 가장 좌측 비트)',
`start_time` CHAR(4) NOT NULL COMMENT '수업 시작 시간',
`end_time` CHAR(4) NOT NULL COMMENT '수업 종료 시간',
PRIMARY KEY (`id`),
CONSTRAINT `fk_class_teacher_uid`
FOREIGN KEY (`uid`) REFERENCES `user`(`uid`)
ON UPDATE CASCADE
ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='강의(클래스) 정보';
CREATE TABLE `class_map` (
`cid` CHAR(10) NOT NULL COMMENT '강의 구분 코드',
`uid` CHAR(70) NOT NULL COMMENT '학생(유저) 구분 코드',
PRIMARY KEY (`cid`, `uid`),
KEY `idx_uid` (`uid`),
CONSTRAINT `fk_map_class_cid`
FOREIGN KEY (`cid`) REFERENCES class_info(`id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `fk_map_class_uid`
FOREIGN KEY (`uid`) REFERENCES `user`(`uid`)
ON UPDATE CASCADE
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='학생-강의(클래스) 맵핑';
CREATE TABLE `class_attendance` (
`cid` CHAR(10) NOT NULL COMMENT '강의 구분 코드',
`uid` CHAR(70) NOT NULL COMMENT '학생(유저) 구분 코드',
`attendace_date` DATETIME NOT NULL COMMENT '출석 일자',
`attendance_state` TINYINT(1) NOT NULL COMMENT '출석 상태 (0=출석, 1=결석, 2=지각, 3=조퇴, 4=기타)',
PRIMARY KEY (`cid`, `uid`, `attendace_date`),
KEY `idx_uid_date` (`uid`, `attendace_date`),
CONSTRAINT `fk_class_attendance_cid`
FOREIGN KEY (`cid`) REFERENCES class_info(`id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `fk_class_attendance_uid`
FOREIGN KEY (`uid`) REFERENCES `user`(`uid`)
ON UPDATE CASCADE
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='강의별 학생 출석 정보';
INSERT INTO class_info(id, name, uid, start_date, end_date, day, start_time, end_time)
VALUES
('AMC0000AAA','수학','AMksg345220250401','2025-06-20',NULL,124,'1800','1900'),
('AMC0000AAB','영어','AMksg345220250401','2025-06-20',NULL,124,'1900','2000'),
('AMC0000AAC','국어','AMksg345220250401','2025-06-20',NULL,124,'2000','2100'),
('AMC0000AAD','과학','AMksg345220250401','2025-06-20',NULL,124,'2100','2200'),
('AMC0000AAE','사회','AMksg345220250401','2025-06-20',NULL,124,'2200','2300');
INSERT INTO class_map(cid, uid)
VALUES
('AMC0000AAA', 'AMsdk20250612'),
('AMC0000AAB', 'AMsdk20250612'),
('AMC0000AAC', 'AMsdk20250612'),
('AMC0000AAD', 'AMsdk20250612');
# INSERT INTO class_attendance(cid, uid, attendace_date, attendance_state)
# VALUES
# ('AMC0000AAA', 'AMsdk20250612')

117
scripts/Push.sql Normal file
View File

@ -0,0 +1,117 @@
CREATE TABLE payload (
pid CHAR(22) NOT NULL PRIMARY KEY ,
title VARCHAR(100) NOT NULL ,
subtitle VARCHAR(100) ,
body VARCHAR(255) NOT NULL ,
alert_yn BOOLEAN NOT NULL DEFAULT TRUE,
category CHAR(4) NOT NULL ,
content TEXT
);
CREATE TABLE push_cabinet (
uid CHAR(6) NOT NULL ,
pid CHAR(22) NOT NULL ,
send_date DATETIME NOT NULL ,
check_yn BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY (uid, pid),
CONSTRAINT fk_pushcabinet_uid_to_user FOREIGN KEY (uid)
REFERENCES user(uid)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT fk_pushcabinet_pid_to_payload FOREIGN KEY (pid)
REFERENCES payload(pid)
ON UPDATE CASCADE
ON DELETE CASCADE
);
INSERT INTO payload(pid, title, subtitle, body, category, content)
VALUES (
'AP202503054Q81114002W7',
'PUSH 확인 TEST',
'PUSH 확인 TEST - SUB',
'PUSH를 테스트하기 위해서 작성된 내용입니다. TEST 메시지입나다.',
'PC00',
NULL
);
INSERT INTO payload(pid, title, subtitle, body, category, content)
VALUES (
'AP202503051S41516009J9',
'PUSH 확인 TEST2',
NULL,
'PUSH를 테스트하기 위해서 작성된 두번째 내용입니다. 두번째 TEST 메시지입나다.',
'PC00',
NULL
);
ALTER TABLE push_cabinet DROP FOREIGN KEY fk_pushcabinet_uid_to_user;
ALTER TABLE push_cabinet
ADD CONSTRAINT fk_pushcabinet_uid_to_user
FOREIGN KEY (uid) REFERENCES user(uid)
ON UPDATE CASCADE ON DELETE CASCADE;
CREATE TABLE log_push (
bid CHAR(6) NOT NULL ,
pid CHAR(22) NOT NULL ,
create_date DATETIME NOT NULL ,
modify_date DATETIME NOT NULL ,
create_uid VARCHAR(70) NOT NULL ,
modify_uid VARCHAR(70) NOT NULL ,
PRIMARY KEY (bid, pid),
CONSTRAINT fk_logpush_to_payload FOREIGN KEY (bid, pid)
REFERENCES payload(bid, pid)
ON UPDATE CASCADE
ON DELETE CASCADE
);
SELECT cabinet.uid, cabinet.pid, cabinet.send_date, payload.title
FROM
(select push_cabinet.pid, push_cabinet.uid, push_cabinet.send_date FROM push_cabinet where uid = 'AMsean.kim20241201') As cabinet
inner JOIN
(select payload.title, payload.pid FROM payload) as payload
on cabinet.pid = payload.pid
order by send_date
;
CREATE TABLE push_cabinet
(
id INT AUTO_INCREMENT PRIMARY KEY, -- 대리 키로 추가
uid VARCHAR(70) NOT NULL,
bid CHAR(6) DEFAULT 'AA0000' NOT NULL,
pid CHAR(22) NOT NULL,
send_date DATETIME NOT NULL,
check_yn TINYINT(1) DEFAULT 0 NOT NULL,
content TEXT, -- 커스텀 이벤트 내용 저장 (필요 시 TEXT나 VARCHAR로 조정)
CONSTRAINT fk_pushcabinet_bid_to_academy
FOREIGN KEY (bid) REFERENCES academy (bid)
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT fk_pushcabinet_payload
FOREIGN KEY (bid, pid) REFERENCES payload (bid, pid)
ON UPDATE CASCADE ON DELETE CASCADE
);
-- 조회 성능 향상을 위해 pid 컬럼에 대한 인덱스 추가 (필요 시 uid, send_date 등의 인덱스도 고려)
CREATE INDEX idx_pushcabinet_pid ON push_cabinet (pid);
ALTER TABLE push_cabinet
ADD CONSTRAINT fk_pushcabinet_bid_to_academy
FOREIGN KEY (bid) REFERENCES academy (bid)
ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE push_cabinet
ADD CONSTRAINT fk_pushcabinet_payload
FOREIGN KEY (bid, pid) REFERENCES payload (bid, pid)
ON UPDATE CASCADE ON DELETE CASCADE;

10
scripts/Token.sql Normal file
View File

@ -0,0 +1,10 @@
CREATE TABLE token (
uid varchar(70) not null primary key ,
refresh_token text not null ,
create_date datetime not null ,
expire_date datetime not null ,
revoke_date datetime,
constraint fk_token_uid_to_user foreign key (uid) references user (uid) on update cascade on delete cascade
);

18
scripts/User.sql Normal file
View File

@ -0,0 +1,18 @@
CREATE TABLE api_header (
specific_id VARCHAR(255) PRIMARY KEY NOT NULL ,
connect_date DATETIME NOT NULL ,
h_key CHAR(18) NOT NULL,
h_value TEXT NOT NULL
);
# INSERT INTO api_header(specific_id, connect_date, h_key, h_value)
# VALUES (2025-03-19,'iOS_AM_Connect_Key','');
# INSERT INTO api_header(h_key, h_value)
# VALUES ('And_AM_Connect_Key','');
#
# INSERT INTO api_header(h_key, h_value)
# VALUES ('Web_AM_Connect_Key','');
SHOW TABLE STATUS WHERE Name = 'permission';

38
scripts/log.sql Normal file
View File

@ -0,0 +1,38 @@
create table log_push
(
bid char(6) not null,
pid char(22) not null,
create_date datetime not null,
create_uid varchar(70) not null,
log text null,
lid int auto_increment
primary key
);
create table log_user
(
bid char(6) not null,
pid char(22) not null,
create_date datetime not null,
create_uid varchar(70) not null,
log text null,
lid int auto_increment
primary key
);
create table log_project
(
lid int auto_increment primary key,
create_date datetime not null default NOW(),
log text null
);
create table log_chat
(
lid int auto_increment primary key,
create_date datetime not null,
create_uid varchar(70) not null,
cid CHAR(16) NOT NULL,
log text null
);