js2ts: user_info
- moment js 사용 대상 제거 - sha512 추가 - 비어있는 func.js 제거
This commit is contained in:
@@ -19,7 +19,6 @@ require(__DIR__.'/../vendor/autoload.php');
|
|||||||
<?=WebUtil::printJS('../d_shared/common_path.js') ?>
|
<?=WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||||
<?=WebUtil::printJS('../js/vendors.js') ?>
|
<?=WebUtil::printJS('../js/vendors.js') ?>
|
||||||
<?=WebUtil::printJS('../js/common.js') ?>
|
<?=WebUtil::printJS('../js/common.js') ?>
|
||||||
<?=WebUtil::printJS('../js/func.js')?>
|
|
||||||
<?=WebUtil::printJS('../js/admin_member.js')?>
|
<?=WebUtil::printJS('../js/admin_member.js')?>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -33,8 +33,6 @@ $acl = $session->acl;
|
|||||||
<?=WebUtil::printJS('../d_shared/common_path.js') ?>
|
<?=WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||||
<?=WebUtil::printJS('../js/vendors.js') ?>
|
<?=WebUtil::printJS('../js/vendors.js') ?>
|
||||||
<?=WebUtil::printJS('../js/common.js') ?>
|
<?=WebUtil::printJS('../js/common.js') ?>
|
||||||
<?=WebUtil::printJS('../e_lib/moment.min.js')?>
|
|
||||||
<?=WebUtil::printJS('../js/func.js')?>
|
|
||||||
<?=WebUtil::printJS('../js/entrance.js')?>
|
<?=WebUtil::printJS('../js/entrance.js')?>
|
||||||
|
|
||||||
<?php if ($userGrade >= 5 || $acl): ?>
|
<?php if ($userGrade >= 5 || $acl): ?>
|
||||||
|
|||||||
@@ -20,10 +20,6 @@ require(__DIR__.'/../vendor/autoload.php');
|
|||||||
<!-- 액션 -->
|
<!-- 액션 -->
|
||||||
<?=WebUtil::printJS('../d_shared/common_path.js') ?>
|
<?=WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||||
<?=WebUtil::printJS('../js/vendors.js') ?>
|
<?=WebUtil::printJS('../js/vendors.js') ?>
|
||||||
<?=WebUtil::printJS('../js/common.js') ?>
|
|
||||||
<?=WebUtil::printJS('../e_lib/sha512.min.js')?>
|
|
||||||
<?=WebUtil::printJS('../e_lib/moment.min.js')?>
|
|
||||||
<?=WebUtil::printJS('../js/func.js')?>
|
|
||||||
<?=WebUtil::printJS('../js/user_info.js')?>
|
<?=WebUtil::printJS('../js/user_info.js')?>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
"bootstrap": "^4.6.0",
|
"bootstrap": "^4.6.0",
|
||||||
"core-js": "^3.16.1",
|
"core-js": "^3.16.1",
|
||||||
"jquery": "^3.6.0",
|
"jquery": "^3.6.0",
|
||||||
|
"js-sha512": "^0.8.0",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"luxon": "^2.0.2",
|
"luxon": "^2.0.2",
|
||||||
"vue": "^3.2.2"
|
"vue": "^3.2.2"
|
||||||
|
|||||||
+379
@@ -0,0 +1,379 @@
|
|||||||
|
import { setAxiosXMLHttpRequest } from "../hwe/ts/util/setAxiosXMLHttpRequest";
|
||||||
|
import $ from 'jquery';
|
||||||
|
import 'bootstrap';
|
||||||
|
import axios from 'axios';
|
||||||
|
import { DateTime } from "luxon";
|
||||||
|
import { DATE_TIME_FORMAT, getDateTimeNow } from "../hwe/ts/util/getDateTimeNow";
|
||||||
|
import { sha512 } from "js-sha512";
|
||||||
|
import { convertFormData } from "../hwe/ts/util/convertFormData";
|
||||||
|
import { InvalidResponse } from "../hwe/ts/defs";
|
||||||
|
import { unwrap } from "./util";
|
||||||
|
|
||||||
|
type ResultUserInfo = {
|
||||||
|
result: true,
|
||||||
|
id: number,
|
||||||
|
name: string,
|
||||||
|
grade: string,
|
||||||
|
picture: string,
|
||||||
|
global_salt: string,
|
||||||
|
join_date: string,
|
||||||
|
third_use: boolean,
|
||||||
|
acl: string,
|
||||||
|
oauth_type: 'NONE' | 'KAKAO',
|
||||||
|
token_valid_until?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
function fillUserInfo(result: ResultUserInfo | InvalidResponse) {
|
||||||
|
if (!result.result) {
|
||||||
|
alert(result.reason);
|
||||||
|
location.href = 'entrance.php';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#slot_id').html(result.id.toString());
|
||||||
|
$('#slot_nickname').html(result.name);
|
||||||
|
$('#slot_grade').html(result.grade);
|
||||||
|
$('#slot_acl').html(result.acl);
|
||||||
|
$('#slot_icon').attr('src', result.picture);
|
||||||
|
$('#global_salt').val(result.global_salt);
|
||||||
|
$('#slot_join_date').html(result.join_date);
|
||||||
|
$('#slot_third_use').html(result.third_use ? '○' : '×');
|
||||||
|
if (result.third_use) {
|
||||||
|
$('#third_use_disallow').show();
|
||||||
|
}
|
||||||
|
$('#slot_oauth_type').text(result.oauth_type);
|
||||||
|
if (result.oauth_type != 'NONE') {
|
||||||
|
$('#slot_token_valid_until').text(unwrap(result.token_valid_until));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$('#slot_token_valid_until').parent().html('');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function changeIconPreview(this: HTMLFormElement) {
|
||||||
|
const $preview = $(this) as JQuery<HTMLFormElement>;
|
||||||
|
console.log($preview);
|
||||||
|
|
||||||
|
const filename = $preview[0].files[0].name;
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = function (e) {
|
||||||
|
$('#slot_new_icon').attr('src', unwrap(unwrap(e.target).result).toString()).css('visibility', 'visible');
|
||||||
|
}
|
||||||
|
|
||||||
|
reader.readAsDataURL($preview[0].files[0]);
|
||||||
|
|
||||||
|
$('#image_upload_filename').val(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
type IconResponse = {
|
||||||
|
result: true,
|
||||||
|
servers: [string, string][]
|
||||||
|
};
|
||||||
|
|
||||||
|
async function deleteIcon() {
|
||||||
|
let result: InvalidResponse | IconResponse;
|
||||||
|
try {
|
||||||
|
const response = await axios({
|
||||||
|
url: 'j_icon_delete.php',
|
||||||
|
responseType: 'json',
|
||||||
|
method: 'post'
|
||||||
|
});
|
||||||
|
result = response.data;
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
alert(`아이콘 삭제를 실패했습니다: ${e}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!result.result) {
|
||||||
|
alert(result.reason);
|
||||||
|
location.reload();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
showAdjustServerModal(result.servers);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function disallowThirdUse() {
|
||||||
|
try {
|
||||||
|
await axios({
|
||||||
|
url: 'j_disallow_third_use.php',
|
||||||
|
method: 'post',
|
||||||
|
responseType: 'json'
|
||||||
|
});
|
||||||
|
alert('철회했습니다.');
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
alert('알 수 없는 이유로 철회를 실패했습니다.');
|
||||||
|
}
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showAdjustServerModal(serverList: [string, string][]) {
|
||||||
|
|
||||||
|
const $form = $('#chooseServerForm');
|
||||||
|
$form.empty();
|
||||||
|
|
||||||
|
for (const [serverKey, serverKorName] of serverList) {
|
||||||
|
const $item = $(`<div style="display:inline-block;margin-right:7px;" class="custom-control custom-checkbox">\
|
||||||
|
<input type="checkbox" checked class="custom-control-input" name="${serverKey}" id="switch_${serverKey}">\
|
||||||
|
<label class="custom-control-label" for="switch_${serverKey}">${serverKorName}</label>\
|
||||||
|
</div>`);
|
||||||
|
$form.append($item);
|
||||||
|
}
|
||||||
|
|
||||||
|
const $modal = $('#chooseServer');
|
||||||
|
$modal.modal({
|
||||||
|
backdrop: 'static'
|
||||||
|
});
|
||||||
|
$modal.on('hidden.bs.modal', function () {
|
||||||
|
location.reload();
|
||||||
|
return;
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#modal-apply").off("click").on("click", async function () {
|
||||||
|
const events: Promise<unknown>[] = [];
|
||||||
|
$form.find('input:checked').each(function () {
|
||||||
|
const $input = $(this);
|
||||||
|
const server = $input.attr('name');
|
||||||
|
|
||||||
|
console.log(server);
|
||||||
|
|
||||||
|
events.push(axios({
|
||||||
|
url: `../${server}/j_adjust_icon.php`,
|
||||||
|
method: 'post',
|
||||||
|
responseType: 'json',
|
||||||
|
}));
|
||||||
|
})
|
||||||
|
|
||||||
|
for (const p of events) {
|
||||||
|
try {
|
||||||
|
await p;
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
//서버 폐쇄등으로 접근하지 못할 수도 있음.
|
||||||
|
console.error(e, p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
alert('적용되었습니다.');
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async function changeIcon(this: HTMLFormElement) {
|
||||||
|
const $icon = $('#image_upload') as JQuery<HTMLFormElement>;
|
||||||
|
|
||||||
|
if ($icon[0].files.length == 0) {
|
||||||
|
alert('파일을 선택해주세요');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let result: InvalidResponse | IconResponse;
|
||||||
|
try {
|
||||||
|
const response = await axios({
|
||||||
|
url: 'j_icon_change.php',
|
||||||
|
method: 'post',
|
||||||
|
responseType: 'json',
|
||||||
|
data: new FormData(this)
|
||||||
|
});
|
||||||
|
result = response.data;
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
alert('알 수 없는 이유로 아이콘 업로드를 실패했습니다.');
|
||||||
|
location.reload();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!result.result) {
|
||||||
|
alert(result.reason);
|
||||||
|
location.reload();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
showAdjustServerModal(result.servers);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function changePassword() {
|
||||||
|
const old_pw = $('#current_pw').val() as string;
|
||||||
|
const new_pw = $('#new_pw').val() as string;
|
||||||
|
const new_pw_confirm = $('#new_pw_confirm').val() as string;
|
||||||
|
|
||||||
|
if (!old_pw) {
|
||||||
|
alert('이전 비밀번호를 입력해야 합니다.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (new_pw.length < 6) {
|
||||||
|
alert('비밀번호 길이는 6글자 이상이어야 합니다.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new_pw != new_pw_confirm) {
|
||||||
|
alert('입력 값이 일치하지 않습니다.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const global_salt = $('#global_salt').val();
|
||||||
|
|
||||||
|
const old_password = sha512(global_salt + old_pw + global_salt);
|
||||||
|
const new_password = sha512(global_salt + new_pw + global_salt);
|
||||||
|
|
||||||
|
let result: InvalidResponse;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await axios({
|
||||||
|
url: 'j_change_password.php',
|
||||||
|
method: 'post',
|
||||||
|
responseType: 'json',
|
||||||
|
data: convertFormData({
|
||||||
|
old_pw: old_password,
|
||||||
|
new_pw: new_password
|
||||||
|
})
|
||||||
|
});
|
||||||
|
result = response.data;
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
alert(`알 수 없는 이유로 비밀번호를 바꾸지 못했습니다.: ${e}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!result.result) {
|
||||||
|
alert(result.reason);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
alert('비밀번호를 바꾸었습니다');
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function deleteMe() {
|
||||||
|
const pw = $('#delete_pw').val() as string;
|
||||||
|
|
||||||
|
if (!pw) {
|
||||||
|
alert('비밀번호를 입력해야 합니다.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const global_salt = $('#global_salt').val();
|
||||||
|
|
||||||
|
const password = sha512(global_salt + pw + global_salt);
|
||||||
|
|
||||||
|
let data: InvalidResponse;
|
||||||
|
try {
|
||||||
|
const response = await axios({
|
||||||
|
url: 'j_delete_me.php',
|
||||||
|
responseType: 'json',
|
||||||
|
method: 'post',
|
||||||
|
data: convertFormData({
|
||||||
|
pw: password
|
||||||
|
})
|
||||||
|
});
|
||||||
|
data = response.data;
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
alert(`회원 탈퇴에 실패했습니다.: ${e}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data.result) {
|
||||||
|
alert(data.reason);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
alert('탈퇴 처리되었습니다.');
|
||||||
|
location.href = '../';
|
||||||
|
}
|
||||||
|
|
||||||
|
async function extendAuth() {
|
||||||
|
const validUntil = $('#slot_token_valid_until').html();
|
||||||
|
const availableAt = DateTime.fromFormat(validUntil, DATE_TIME_FORMAT).minus({ days: 5 }).toFormat(DATE_TIME_FORMAT);
|
||||||
|
const now = getDateTimeNow();
|
||||||
|
|
||||||
|
if (now < availableAt) {
|
||||||
|
alert(`${availableAt}부터 초기화할 수 있습니다.`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!confirm('로그아웃됩니다. 진행할까요?')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let result: InvalidResponse;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await axios({
|
||||||
|
url: '../oauth_kakao/j_reset_token.php',
|
||||||
|
method: 'post',
|
||||||
|
responseType: 'json'
|
||||||
|
})
|
||||||
|
result = response.data;
|
||||||
|
} catch (e) {
|
||||||
|
alert(`알 수 없는 이유로 로그인 토큰 연장에 실패했습니다. : ${e}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!result.result){
|
||||||
|
alert(result.reason);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
alert('초기화했습니다. 다시 로그인해 주십시오.');
|
||||||
|
location.href = '../';
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
setAxiosXMLHttpRequest();
|
||||||
|
$('#slot_icon, #slot_new_icon').attr('src', window.pathConfig.sharedIcon + '/default.jpg');
|
||||||
|
|
||||||
|
axios({
|
||||||
|
url: 'j_get_user_info.php',
|
||||||
|
method: 'post',
|
||||||
|
responseType: 'json'
|
||||||
|
}).then(result => {
|
||||||
|
fillUserInfo(result.data);
|
||||||
|
}, () => {
|
||||||
|
alert('알 수 없는 이유로, 회원 정보를 불러오지 못했습니다.');
|
||||||
|
location.href = 'entrance.php';
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#image_upload').on('change', changeIconPreview);
|
||||||
|
|
||||||
|
$('#btn_remove_icon').on('click', function () {
|
||||||
|
if (confirm('아이콘을 제거할까요?')) {
|
||||||
|
void deleteIcon();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#third_use_disallow').on('click', function () {
|
||||||
|
if (confirm('개인정보 3자 제공 동의를 철회할까요?')) {
|
||||||
|
void disallowThirdUse();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#change_pw_form').on('submit', function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
void changePassword();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#change_icon_form').on('submit', function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
void changeIcon.apply(this as HTMLFormElement);
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#delete_me_form').on('submit', function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
if (confirm('한 달 동안 재 가입할 수 없습니다. 정말로 탈퇴할까요?')) {
|
||||||
|
void deleteMe();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#expand_login_token').on('click', extendAuth);
|
||||||
|
})
|
||||||
+1
-1
@@ -87,7 +87,7 @@ module.exports = [
|
|||||||
entry: {
|
entry: {
|
||||||
'common': './ts/common_deprecated.ts',
|
'common': './ts/common_deprecated.ts',
|
||||||
'entrance': './ts/entrance.ts',
|
'entrance': './ts/entrance.ts',
|
||||||
//test: './ts/test.ts',
|
'user_info': './ts/user_info.ts',
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
filename: '[name].js',
|
filename: '[name].js',
|
||||||
|
|||||||
Reference in New Issue
Block a user