dbmsv3 init...1

This commit is contained in:
choi.jh 2025-10-20 14:30:55 +09:00
parent 2d41a7e975
commit 4b64262234
12 changed files with 521 additions and 254 deletions

View File

@ -56,6 +56,20 @@ $routes->group('admin', ['namespace' => 'App\Controllers\Admin', 'filter' => 'au
$routes->group('search', ['namespace' => 'App\Controllers\Admin'], function ($routes) {
$routes->get('/', 'SearchController::index');
});
$routes->group('board', ['namespace' => 'App\Controllers\Admin'], function ($routes) {
$routes->get('/', 'BoardController::index');
$routes->get('create', 'BoardController::create_form');
$routes->post('create', 'BoardController::create');
$routes->get('modify/(:num)', 'BoardController::modify_form/$1');
$routes->post('modify/(:num)', 'BoardController::modify/$1');
$routes->get('view/(:num)', 'BoardController::view/$1');
$routes->get('delete/(:num)', 'BoardController::delete/$1');
$routes->get('toggle/(:num)/(:any)', 'BoardController::toggle/$1/$2');
$routes->post('batchjob', 'BoardController::batchjob');
$routes->post('batchjob_delete', 'BoardController::batchjob_delete');
$routes->get('download/(:alpha)', 'BoardController::download/$1');
$routes->get('latest', 'BoardController::latest');
});
//Customer 관련
$routes->group('customer', ['namespace' => 'App\Controllers\Admin\Customer'], function ($routes) {
$routes->group('client', ['namespace' => 'App\Controllers\Admin\Customer'], function ($routes) {

View File

@ -0,0 +1,47 @@
<?php
namespace App\Controllers\Admin;
use App\Services\BoardService;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
class BoardController extends AdminController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->content_title = lang("{$this->getService()->getClassName()}.title");
$this->class_path .= $this->getService()->getClassName();
// $this->view_path = '/admin/search';
}
public function getService(): BoardService
{
if (!$this->_service) {
$this->_service = new BoardService();
}
return $this->_service;
}
public function latest(): ResponseInterface
{
$this->getService()->setAction(__FUNCTION__);
$this->getService()->setFormFields();
//전달값정의
$this->getService()->setFormDatas($this->request->getGet());
$formDatas = $this->getSErvice()->getFormDatas();
$datas = [];
foreach (
$this->getService()->latest(
[
'category' => array_key_exists('category', $formDatas) && $formDatas['category'] ? $formDatas['category'] : 'notice'
],
array_key_exists('limit', $formDatas) ? $formDatas['limit'] : 3
) as $entity
) {
$datas[] = $entity->toArray();
}
return $this->response->setJSON($datas);
}
}

View File

@ -48,7 +48,8 @@
"PdXX5ghGi8ZK89G9OjtnQ",
"VN2Issjy8MFts5mr8-_9S",
"0SUAXsejoiaHZwmW8msS3",
"6lQ2M_5glzZEDHxKHx83G"
"6lQ2M_5glzZEDHxKHx83G",
"cN9peISo4OoJ1_xErNg5s"
],
"relationshipIds": [
"AH1dyESfueUlhcoiU6KsQ",
@ -1094,43 +1095,42 @@
"createAt": 1758759637696
}
},
"FfKKPJaDUSq_L0PzVw0qB": {
"id": "FfKKPJaDUSq_L0PzVw0qB",
"name": "osinfo",
"comment": "OS정보",
"cN9peISo4OoJ1_xErNg5s": {
"id": "cN9peISo4OoJ1_xErNg5s",
"name": "boardinfo",
"comment": "게시판정보",
"columnIds": [
"QdsS-0uL_5e3e06QA_j3Q",
"DJt6tYEL_T0gaWiKYG3xx",
"DSGSteH2BTfk7qHRhLwjO",
"PsRm4Fikl-4V0UP4zMDmc",
"J3W8i89XtySWfcPJMsDyW",
"ZMYQFNu7YhdsurJW_74qc",
"i0qqJAwb21-h-qVQwsJCL",
"s-UqSelR4i1Nkogv6fWsD"
"EUzTz63zrCQEb9T_HCQAf",
"Zocwj4zycTnOQ_7EUAe8f",
"Cf3iDo9RBYrQ6daeLoRJ1",
"yZm3jcTNVaYmF_uQEfcqP",
"y8ARb2M7vwx49Nh9AyDe3",
"QmTaq8IeGshe6v7YQwogt",
"EmCxKPyupmBph6T1YeEeL",
"iJ8TkaB0z_KgdaaBQSzXp"
],
"seqColumnIds": [
"QdsS-0uL_5e3e06QA_j3Q",
"DJt6tYEL_T0gaWiKYG3xx",
"DSGSteH2BTfk7qHRhLwjO",
"104uG3QE6lGMgJeJZdLbP",
"Si6K8JqHNqw_lz_1sDo6b",
"PsRm4Fikl-4V0UP4zMDmc",
"J3W8i89XtySWfcPJMsDyW",
"ZMYQFNu7YhdsurJW_74qc",
"i0qqJAwb21-h-qVQwsJCL",
"s-UqSelR4i1Nkogv6fWsD"
"EUzTz63zrCQEb9T_HCQAf",
"Zocwj4zycTnOQ_7EUAe8f",
"Cf3iDo9RBYrQ6daeLoRJ1",
"z5pbqehtfFOg2ggspUVdN",
"yZm3jcTNVaYmF_uQEfcqP",
"y8ARb2M7vwx49Nh9AyDe3",
"QmTaq8IeGshe6v7YQwogt",
"EmCxKPyupmBph6T1YeEeL",
"iJ8TkaB0z_KgdaaBQSzXp"
],
"ui": {
"x": 630.3796,
"y": 2570.6169,
"zIndex": 5440,
"x": 629.1139,
"y": 2607.3256,
"zIndex": 5388,
"widthName": 60,
"widthComment": 60,
"widthComment": 62,
"color": ""
},
"meta": {
"updateAt": 1758849630889,
"createAt": 1758760696242
"updateAt": 1760931455260,
"createAt": 1760931280848
}
}
},
@ -9215,186 +9215,6 @@
"createAt": 1758759927103
}
},
"QdsS-0uL_5e3e06QA_j3Q": {
"id": "QdsS-0uL_5e3e06QA_j3Q",
"tableId": "FfKKPJaDUSq_L0PzVw0qB",
"name": "uid",
"comment": "DISK정보",
"dataType": "INT",
"default": "",
"options": 11,
"ui": {
"keys": 1,
"widthName": 60,
"widthComment": 60,
"widthDataType": 60,
"widthDefault": 60
},
"meta": {
"updateAt": 1758760725178,
"createAt": 1758760723082
}
},
"DJt6tYEL_T0gaWiKYG3xx": {
"id": "DJt6tYEL_T0gaWiKYG3xx",
"tableId": "FfKKPJaDUSq_L0PzVw0qB",
"name": "title",
"comment": "",
"dataType": "VARCHAR(50)",
"default": "",
"options": 12,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 75,
"widthDefault": 60
},
"meta": {
"updateAt": 1758760723082,
"createAt": 1758760723082
}
},
"DSGSteH2BTfk7qHRhLwjO": {
"id": "DSGSteH2BTfk7qHRhLwjO",
"tableId": "FfKKPJaDUSq_L0PzVw0qB",
"name": "price",
"comment": "기본금액",
"dataType": "INT",
"default": "0",
"options": 8,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 60,
"widthDefault": 60
},
"meta": {
"updateAt": 1758760723082,
"createAt": 1758760723082
}
},
"104uG3QE6lGMgJeJZdLbP": {
"id": "104uG3QE6lGMgJeJZdLbP",
"tableId": "FfKKPJaDUSq_L0PzVw0qB",
"name": "stock",
"comment": "재고",
"dataType": "INT",
"default": "0",
"options": 8,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 60,
"widthDefault": 60
},
"meta": {
"updateAt": 1758760723083,
"createAt": 1758760723082
}
},
"Si6K8JqHNqw_lz_1sDo6b": {
"id": "Si6K8JqHNqw_lz_1sDo6b",
"tableId": "FfKKPJaDUSq_L0PzVw0qB",
"name": "format",
"comment": "포맷수",
"dataType": "INT",
"default": "0",
"options": 8,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 60,
"widthDefault": 60
},
"meta": {
"updateAt": 1758760723083,
"createAt": 1758760723083
}
},
"J3W8i89XtySWfcPJMsDyW": {
"id": "J3W8i89XtySWfcPJMsDyW",
"tableId": "FfKKPJaDUSq_L0PzVw0qB",
"name": "status",
"comment": "",
"dataType": "VARCHAR(20)",
"default": "'available'",
"options": 8,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 75,
"widthDefault": 60
},
"meta": {
"updateAt": 1758760723083,
"createAt": 1758760723083
}
},
"ZMYQFNu7YhdsurJW_74qc": {
"id": "ZMYQFNu7YhdsurJW_74qc",
"tableId": "FfKKPJaDUSq_L0PzVw0qB",
"name": "updated_at",
"comment": "",
"dataType": "TIMESTAMP",
"default": "",
"options": 0,
"ui": {
"keys": 0,
"widthName": 62,
"widthComment": 60,
"widthDataType": 65,
"widthDefault": 60
},
"meta": {
"updateAt": 1758760723083,
"createAt": 1758760723083
}
},
"i0qqJAwb21-h-qVQwsJCL": {
"id": "i0qqJAwb21-h-qVQwsJCL",
"tableId": "FfKKPJaDUSq_L0PzVw0qB",
"name": "created_at",
"comment": "",
"dataType": "TIMESTAMP",
"default": "CURRENT_TIMESTAMP",
"options": 8,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 65,
"widthDefault": 122
},
"meta": {
"updateAt": 1758760723083,
"createAt": 1758760723083
}
},
"s-UqSelR4i1Nkogv6fWsD": {
"id": "s-UqSelR4i1Nkogv6fWsD",
"tableId": "FfKKPJaDUSq_L0PzVw0qB",
"name": "deleted_at",
"comment": "",
"dataType": "TIMESTAMP",
"default": "",
"options": 0,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 65,
"widthDefault": 60
},
"meta": {
"updateAt": 1758760723083,
"createAt": 1758760723083
}
},
"0mMuq9X72PA3WvfurTA0d": {
"id": "0mMuq9X72PA3WvfurTA0d",
"tableId": "6lQ2M_5glzZEDHxKHx83G",
@ -9415,26 +9235,6 @@
"createAt": 1758762819102
}
},
"PsRm4Fikl-4V0UP4zMDmc": {
"id": "PsRm4Fikl-4V0UP4zMDmc",
"tableId": "FfKKPJaDUSq_L0PzVw0qB",
"name": "stock",
"comment": "재고",
"dataType": "INT",
"default": "0",
"options": 8,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 60,
"widthDefault": 60
},
"meta": {
"updateAt": 1758762826114,
"createAt": 1758762826113
}
},
"I8DumSwkLWz-Ve5_vc0uE": {
"id": "I8DumSwkLWz-Ve5_vc0uE",
"tableId": "B4qGh3KZsXHQ3_4EOgwJZ",
@ -9654,6 +9454,186 @@
"updateAt": 1760573707223,
"createAt": 1760573680816
}
},
"EUzTz63zrCQEb9T_HCQAf": {
"id": "EUzTz63zrCQEb9T_HCQAf",
"tableId": "cN9peISo4OoJ1_xErNg5s",
"name": "uid",
"comment": "게시판정보",
"dataType": "INT",
"default": "",
"options": 9,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 62,
"widthDataType": 60,
"widthDefault": 60
},
"meta": {
"updateAt": 1760931321549,
"createAt": 1760931303731
}
},
"Cf3iDo9RBYrQ6daeLoRJ1": {
"id": "Cf3iDo9RBYrQ6daeLoRJ1",
"tableId": "cN9peISo4OoJ1_xErNg5s",
"name": "title",
"comment": "",
"dataType": "VARCHAR",
"default": "",
"options": 0,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 60,
"widthDefault": 60
},
"meta": {
"updateAt": 1760931339249,
"createAt": 1760931303732
}
},
"z5pbqehtfFOg2ggspUVdN": {
"id": "z5pbqehtfFOg2ggspUVdN",
"tableId": "cN9peISo4OoJ1_xErNg5s",
"name": "price",
"comment": "기본금액",
"dataType": "INT",
"default": "0",
"options": 8,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 60,
"widthDefault": 60
},
"meta": {
"updateAt": 1760931303732,
"createAt": 1760931303732
}
},
"yZm3jcTNVaYmF_uQEfcqP": {
"id": "yZm3jcTNVaYmF_uQEfcqP",
"tableId": "cN9peISo4OoJ1_xErNg5s",
"name": "content",
"comment": "",
"dataType": "TEXT",
"default": "",
"options": 0,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 60,
"widthDefault": 60
},
"meta": {
"updateAt": 1760931366120,
"createAt": 1760931303732
}
},
"y8ARb2M7vwx49Nh9AyDe3": {
"id": "y8ARb2M7vwx49Nh9AyDe3",
"tableId": "cN9peISo4OoJ1_xErNg5s",
"name": "status",
"comment": "",
"dataType": "VARCHAR(20)",
"default": "'normal'",
"options": 8,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 75,
"widthDefault": 60
},
"meta": {
"updateAt": 1760931377524,
"createAt": 1760931303732
}
},
"QmTaq8IeGshe6v7YQwogt": {
"id": "QmTaq8IeGshe6v7YQwogt",
"tableId": "cN9peISo4OoJ1_xErNg5s",
"name": "updated_at",
"comment": "",
"dataType": "TIMESTAMP",
"default": "",
"options": 0,
"ui": {
"keys": 0,
"widthName": 62,
"widthComment": 60,
"widthDataType": 65,
"widthDefault": 60
},
"meta": {
"updateAt": 1760931303732,
"createAt": 1760931303732
}
},
"EmCxKPyupmBph6T1YeEeL": {
"id": "EmCxKPyupmBph6T1YeEeL",
"tableId": "cN9peISo4OoJ1_xErNg5s",
"name": "created_at",
"comment": "",
"dataType": "TIMESTAMP",
"default": "CURRENT_TIMESTAMP",
"options": 8,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 65,
"widthDefault": 122
},
"meta": {
"updateAt": 1760931303732,
"createAt": 1760931303732
}
},
"iJ8TkaB0z_KgdaaBQSzXp": {
"id": "iJ8TkaB0z_KgdaaBQSzXp",
"tableId": "cN9peISo4OoJ1_xErNg5s",
"name": "deleted_at",
"comment": "",
"dataType": "TIMESTAMP",
"default": "",
"options": 0,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 65,
"widthDefault": 60
},
"meta": {
"updateAt": 1760931303732,
"createAt": 1760931303732
}
},
"Zocwj4zycTnOQ_7EUAe8f": {
"id": "Zocwj4zycTnOQ_7EUAe8f",
"tableId": "cN9peISo4OoJ1_xErNg5s",
"name": "category",
"comment": "",
"dataType": "VARCHAR(20)",
"default": "'available'",
"options": 8,
"ui": {
"keys": 0,
"widthName": 60,
"widthComment": 60,
"widthDataType": 75,
"widthDefault": 60
},
"meta": {
"updateAt": 1760931405200,
"createAt": 1760931386493
}
}
},
"relationshipEntities": {

View File

@ -54,6 +54,36 @@ INSERT INTO `accountinfo` VALUES (1,1,988,0,'dddd',NULL,'www','2025-09-26',60000
/*!40000 ALTER TABLE `accountinfo` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `boardinfo`
--
DROP TABLE IF EXISTS `boardinfo`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `boardinfo` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`user_uid` int(11) NOT NULL,
`category` varchar(20) NOT NULL DEFAULT 'notice',
`title` varchar(255) NOT NULL,
`content` text DEFAULT NULL,
`status` varchar(20) NOT NULL DEFAULT 'available',
`updated_at` datetime DEFAULT NULL,
`created_at` datetime DEFAULT current_timestamp(),
`deleted_at` datetime DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `boardinfo`
--
LOCK TABLES `boardinfo` WRITE;
/*!40000 ALTER TABLE `boardinfo` DISABLE KEYS */;
/*!40000 ALTER TABLE `boardinfo` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `clientinfo`
--
@ -343,7 +373,7 @@ CREATE TABLE `payment` (
KEY `FK_serviceinfo_TO_payment` (`serviceinfo_uid`),
CONSTRAINT `FK_clientinfo_TO_payment` FOREIGN KEY (`clientinfo_uid`) REFERENCES `clientinfo` (`uid`),
CONSTRAINT `FK_serviceinfo_TO_payment` FOREIGN KEY (`serviceinfo_uid`) REFERENCES `serviceinfo` (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8 COMMENT='결제정보';
) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8 COMMENT='결제정보';
/*!40101 SET character_set_client = @saved_cs_client */;
--
@ -352,7 +382,7 @@ CREATE TABLE `payment` (
LOCK TABLES `payment` WRITE;
/*!40000 ALTER TABLE `payment` DISABLE KEYS */;
INSERT INTO `payment` VALUES (17,1,820,52,'prime_s68d4e145a474d',NULL,950000,'month','2025-09-25','account','paid','2025-10-16 00:57:48','2025-09-25 06:29:25',NULL),(18,1,1161,53,'itsolution_s68d4e1b6',NULL,800000,'month','2025-11-14',NULL,'unpaid','2025-10-16 00:58:10','2025-09-25 06:31:18',NULL),(19,1,820,52,'2G',NULL,40000,'onetime','2025-09-25',NULL,'unpaid','2025-09-25 08:27:17','2025-09-25 08:15:08',NULL),(20,1,1087,54,'gdidc_s68d4ff1b03fab',NULL,1800000,'month','2025-09-25',NULL,'unpaid','2025-10-16 00:58:28','2025-09-25 08:36:43',NULL),(21,1,820,52,'16G',NULL,300000,'onetime','2025-09-26',NULL,'unpaid',NULL,'2025-09-26 07:03:50',NULL),(22,1,820,52,'NVME 512G',NULL,120000,'onetime','2025-09-30','account','paid','2025-10-02 05:07:08','2025-09-30 00:56:19',NULL),(23,1,820,52,'NVME 512G',NULL,240000,'onetime','2025-09-30','account','paid','2025-10-02 05:07:08','2025-09-30 01:02:43',NULL),(24,1,820,52,'NVME 1T',NULL,150000,'onetime','2025-09-30',NULL,'unpaid',NULL,'2025-09-30 01:50:08',NULL),(28,1,820,52,'SSD 256G',NULL,160000,'onetime','2025-09-30',NULL,'unpaid',NULL,'2025-09-30 05:35:30',NULL),(29,1,820,56,'gdidc_s68dc70e2edb68',NULL,1550000,'month','2025-10-01',NULL,'unpaid','2025-10-16 06:45:46','2025-10-01 00:08:02',NULL),(32,1,819,57,'prime_s68dce40dd65df',NULL,650000,'month','2025-10-01',NULL,'unpaid','2025-10-16 01:04:24','2025-10-01 08:19:25',NULL),(33,1,820,52,'NVME 2T',NULL,180000,'onetime','2025-10-02',NULL,'unpaid',NULL,'2025-10-02 00:07:28',NULL),(34,1,711,58,'prime_s68ddf9a191864',NULL,1100000,'month','2025-10-02',NULL,'unpaid','2025-10-16 01:48:27','2025-10-02 04:03:45',NULL),(35,1,1185,59,'itsolution_s68e30467',NULL,900000,'month','2025-10-06','account','unpaid','2025-10-16 01:53:30','2025-10-05 23:51:03',NULL),(36,45,1185,59,'서버비',NULL,600000,'month','2025-11-06',NULL,'paid','2025-10-05 23:54:41','2025-10-05 23:53:43',NULL),(37,45,1185,59,'서버비',NULL,400000,'month','2025-11-06','account','paid','2025-10-05 23:57:23','2025-10-05 23:56:03',NULL),(38,45,1185,59,'도메인','도메인 구매',40000,'onetime','2025-10-06','account','paid','2025-10-05 23:57:23','2025-10-05 23:56:59',NULL),(39,45,1185,59,'서버비',NULL,400000,'month','2025-10-06','account','paid','2025-10-06 00:51:24','2025-10-06 00:48:36',NULL),(40,45,1185,59,'도메인',NULL,1000000,'onetime','2025-10-06','account','paid','2025-10-06 01:02:46','2025-10-06 00:54:59',NULL),(41,1,1186,60,'prime_s68e37906ad1bd',NULL,1100000,'month','2025-10-06','account','unpaid','2025-10-16 01:53:52','2025-10-06 08:08:38',NULL),(42,1,1186,61,'prime_s68e37b9e918a2',NULL,1300000,'month','2025-10-06','account','unpaid','2025-10-16 01:54:10','2025-10-06 08:19:42',NULL),(43,11,1186,60,'SSD 2T',NULL,600000,'onetime','2025-10-06','account','paid','2025-10-06 08:36:38','2025-10-06 08:25:57',NULL),(44,11,1186,60,'SSD 1T',NULL,400000,'onetime','2025-10-06','account','paid','2025-10-06 08:36:38','2025-10-06 08:31:15',NULL),(45,11,1186,61,'8G',NULL,50000,'onetime','2025-10-06','account','paid','2025-10-06 08:38:35','2025-10-06 08:34:46',NULL),(46,1,1186,61,'test.co.kr 도메인','test.co.kr 도메인',50000,'onetime','2025-10-14',NULL,'unpaid',NULL,'2025-10-14 02:24:26',NULL),(50,NULL,1161,53,'itsolution_s68d4e1b6',NULL,800000,'month','2025-10-14',NULL,'unpaid',NULL,'2025-10-14 08:28:35',NULL),(51,1,819,57,'테스트','테스트\r\n테스트\r\n테스트\r\n테스트',100000,'onetime','2025-10-15',NULL,'unpaid',NULL,'2025-10-15 03:35:39',NULL),(52,1,842,62,'prime_s68ef4901c563f',NULL,800000,'month','2025-10-15',NULL,'unpaid','2025-10-16 07:52:10','2025-10-15 07:10:57',NULL),(53,1,842,63,'itsolution_s68ef4cbd',NULL,400000,'month','2025-10-15',NULL,'unpaid','2025-10-16 01:54:36','2025-10-15 07:26:53',NULL),(54,1,820,56,'fffff','ffdgdfgdf',430000,'onetime','2025-10-15',NULL,'unpaid',NULL,'2025-10-15 07:33:28',NULL);
INSERT INTO `payment` VALUES (17,1,820,52,'prime_s68d4e145a474d',NULL,950000,'month','2025-09-25','account','paid','2025-10-16 00:57:48','2025-09-25 06:29:25',NULL),(18,1,1161,53,'itsolution_s68d4e1b6',NULL,800000,'month','2025-11-14',NULL,'unpaid','2025-10-16 00:58:10','2025-09-25 06:31:18',NULL),(19,1,820,52,'2G',NULL,40000,'onetime','2025-09-25',NULL,'unpaid','2025-09-25 08:27:17','2025-09-25 08:15:08',NULL),(20,1,1087,54,'gdidc_s68d4ff1b03fab',NULL,1800000,'month','2025-09-25',NULL,'unpaid','2025-10-16 00:58:28','2025-09-25 08:36:43',NULL),(21,1,820,52,'16G',NULL,300000,'onetime','2025-09-26',NULL,'unpaid',NULL,'2025-09-26 07:03:50',NULL),(22,1,820,52,'NVME 512G',NULL,120000,'onetime','2025-09-30','account','paid','2025-10-02 05:07:08','2025-09-30 00:56:19',NULL),(23,1,820,52,'NVME 512G',NULL,240000,'onetime','2025-09-30','account','paid','2025-10-02 05:07:08','2025-09-30 01:02:43',NULL),(24,1,820,52,'NVME 1T',NULL,150000,'onetime','2025-09-30',NULL,'unpaid',NULL,'2025-09-30 01:50:08',NULL),(28,1,820,52,'SSD 256G',NULL,160000,'onetime','2025-09-30',NULL,'unpaid',NULL,'2025-09-30 05:35:30',NULL),(29,1,820,56,'gdidc_s68dc70e2edb68',NULL,1550000,'month','2025-10-01',NULL,'unpaid','2025-10-16 06:45:46','2025-10-01 00:08:02',NULL),(32,1,819,57,'prime_s68dce40dd65df',NULL,650000,'month','2025-10-01',NULL,'unpaid','2025-10-16 01:04:24','2025-10-01 08:19:25',NULL),(33,1,820,52,'NVME 2T',NULL,180000,'onetime','2025-10-02',NULL,'unpaid',NULL,'2025-10-02 00:07:28',NULL),(34,1,711,58,'prime_s68ddf9a191864',NULL,1100000,'month','2025-10-02',NULL,'unpaid','2025-10-16 01:48:27','2025-10-02 04:03:45',NULL),(35,1,1185,59,'itsolution_s68e30467',NULL,900000,'month','2025-10-06','account','unpaid','2025-10-16 01:53:30','2025-10-05 23:51:03',NULL),(36,45,1185,59,'서버비',NULL,600000,'month','2025-11-06',NULL,'paid','2025-10-05 23:54:41','2025-10-05 23:53:43',NULL),(37,45,1185,59,'서버비',NULL,400000,'month','2025-11-06','account','paid','2025-10-05 23:57:23','2025-10-05 23:56:03',NULL),(38,45,1185,59,'도메인','도메인 구매',40000,'onetime','2025-10-06','account','paid','2025-10-05 23:57:23','2025-10-05 23:56:59',NULL),(39,45,1185,59,'서버비',NULL,400000,'month','2025-10-06','account','paid','2025-10-06 00:51:24','2025-10-06 00:48:36',NULL),(40,45,1185,59,'도메인',NULL,1000000,'onetime','2025-10-06','account','paid','2025-10-06 01:02:46','2025-10-06 00:54:59',NULL),(41,1,1186,60,'prime_s68e37906ad1bd',NULL,1100000,'month','2025-10-06','account','unpaid','2025-10-16 01:53:52','2025-10-06 08:08:38',NULL),(42,1,1186,61,'prime_s68e37b9e918a2',NULL,1300000,'month','2025-10-06','account','unpaid','2025-10-16 01:54:10','2025-10-06 08:19:42',NULL),(43,11,1186,60,'SSD 2T',NULL,600000,'onetime','2025-10-06','account','paid','2025-10-06 08:36:38','2025-10-06 08:25:57',NULL),(44,11,1186,60,'SSD 1T',NULL,400000,'onetime','2025-10-06','account','paid','2025-10-06 08:36:38','2025-10-06 08:31:15',NULL),(45,11,1186,61,'8G',NULL,50000,'onetime','2025-10-06','account','paid','2025-10-06 08:38:35','2025-10-06 08:34:46',NULL),(46,1,1186,61,'test.co.kr 도메인','test.co.kr 도메인',50000,'onetime','2025-10-14',NULL,'unpaid',NULL,'2025-10-14 02:24:26',NULL),(50,NULL,1161,53,'itsolution_s68d4e1b6',NULL,800000,'month','2025-10-14',NULL,'unpaid',NULL,'2025-10-14 08:28:35',NULL),(51,1,819,57,'테스트','테스트\r\n테스트\r\n테스트\r\n테스트',100000,'onetime','2025-10-15',NULL,'unpaid',NULL,'2025-10-15 03:35:39',NULL),(52,1,842,62,'prime_s68ef4901c563f',NULL,800000,'month','2025-10-15',NULL,'unpaid','2025-10-16 07:52:10','2025-10-15 07:10:57',NULL),(53,1,842,63,'itsolution_s68ef4cbd',NULL,400000,'month','2025-10-15',NULL,'unpaid','2025-10-16 01:54:36','2025-10-15 07:26:53',NULL),(54,1,820,56,'fffff','ffdgdfgdf',430000,'onetime','2025-10-15',NULL,'unpaid',NULL,'2025-10-15 07:33:28',NULL),(55,1,1155,64,'[2543E-M32/13.220.20.25] 2025년 10월 서비스비용',NULL,900000,'month','2025-10-17',NULL,'unpaid',NULL,'2025-10-17 06:22:15',NULL);
/*!40000 ALTER TABLE `payment` ENABLE KEYS */;
UNLOCK TABLES;
@ -464,7 +494,7 @@ CREATE TABLE `serverinfo` (
LOCK TABLES `serverinfo` WRITE;
/*!40000 ALTER TABLE `serverinfo` DISABLE KEYS */;
INSERT INTO `serverinfo` VALUES (17,1186,61,'2526A-M1','normal','C03PA19','13.220.20.5','UBUNTU24.04','HP DL360 Gen6',1000000,'2025-08-31 15:00:00','2025-10-02 15:00:00','occupied','2025-10-16 01:54:10','2025-09-22 02:19:25',NULL),(18,1161,53,'2537B-M18','normal','C03PA08','13.220.20.28','UBUNTU24.04','HP DL360 Gen7',400000,'2025-09-01 15:00:00','2025-10-01 15:00:00','occupied','2025-10-16 00:58:10','2025-09-22 02:21:51',NULL),(19,1087,54,'2528C-M19','normal','C03PA06','13.220.20.10','WINDOWS2008R2','HP DL360 Gen8',800000,'2025-09-02 15:00:00','2025-10-12 15:00:00','occupied','2025-10-16 00:58:28','2025-09-22 02:22:14',NULL),(20,820,52,'2529D-M20','normal','C03PA07','13.220.20.27','CENTOS9','HP DL360 Gen9',600000,'2025-09-03 15:00:00','2025-10-01 15:00:00','occupied','2025-10-16 00:57:48','2025-09-22 02:22:39',NULL),(21,1186,60,'2520Z-M21','vpn','C03PA17','13.220.20.30','WINDOWS2016R2','HP DL360 Gen10',700000,'2025-09-04 15:00:00','2025-10-01 15:00:00','occupied','2025-10-16 01:53:52','2025-09-22 02:23:08',NULL),(22,820,56,'2530Z-M22','dedicated','C03PA16','23.125.207.27','WINDOWS2019R2','Hitach HA3000',800000,'2025-09-05 15:00:00','2025-09-29 15:00:00','occupied','2025-10-16 06:45:46','2025-09-22 02:23:36',NULL),(23,819,57,'JPN-S23','event','C03PA01','13.220.20.1','CENTOS9','INTEL I5',200000,'2025-10-01 15:00:00',NULL,'occupied','2025-10-16 01:04:24','2025-10-01 08:16:56',NULL),(24,1087,54,'JPN-S24','alternative','C03PA14','13.220.20.122','WINDOWS2008R2','INTEL I7',200000,'2025-10-01 15:00:00','2025-10-12 15:00:00','occupied','2025-10-16 00:58:44','2025-10-01 08:52:19',NULL),(25,NULL,NULL,'2548E-M25','alternative',NULL,'13.220.20.94',NULL,'HP DL360 Gen8',700000,'2025-09-30 15:00:00','2025-10-15 15:00:00','available','2025-10-15 23:21:11','2025-10-02 03:55:46',NULL),(26,NULL,NULL,'2547C-M26','alternative',NULL,NULL,NULL,'HP DL360 Gen7',500000,'2025-09-30 15:00:00','2025-10-02 15:00:00','available','2025-10-03 01:00:57','2025-10-02 03:58:53',NULL),(27,711,58,'2548D-M27','normal','C03PA15','13.220.20.63','WINDOWS11','HP DL360 Gen8',900000,'2025-10-01 15:00:00',NULL,'occupied','2025-10-16 01:48:27','2025-10-02 04:02:16',NULL),(31,1185,59,'2412E-M29','normal','C03PA21','13.220.20.34','DEBIAN10','HP DL360 Gen9',500000,'2025-10-03 15:00:00',NULL,'occupied','2025-10-16 01:53:30','2025-10-03 01:08:32',NULL),(32,NULL,NULL,'2543E-M32','normal','C01PA45','13.220.20.25','UBUNTU22.04','HP DL360 Gen6',500000,'2025-10-03 15:00:00',NULL,'available','2025-10-17 06:12:06','2025-10-03 01:10:09',NULL),(55,NULL,NULL,'KCS-M33','alternative',NULL,'28.23.54.22',NULL,'KCS',150000,'2025-10-01 15:00:00','2025-10-16 15:00:00','available','2025-10-17 02:33:55','2025-10-03 05:32:51',NULL),(63,842,62,'254D9-M56','defence','C02PA09','13.220.20.9','CENTOS9','HP DL360 Gen9',400000,'2025-10-08 15:00:00',NULL,'occupied','2025-10-16 01:54:24','2025-10-15 07:06:56',NULL),(64,842,63,'2549D-M64','normal','C03PA02','13.220.20.7','UBUNTU24.04','HP DL360 Gen9',400000,'2025-10-08 15:00:00',NULL,'occupied','2025-10-16 01:54:36','2025-10-15 07:23:19',NULL);
INSERT INTO `serverinfo` VALUES (17,1186,61,'2526A-M1','normal','C03PA19','13.220.20.5','UBUNTU24.04','HP DL360 Gen6',1000000,'2025-08-31 15:00:00','2025-10-02 15:00:00','occupied','2025-10-16 01:54:10','2025-09-22 02:19:25',NULL),(18,1161,53,'2537B-M18','normal','C03PA08','13.220.20.28','UBUNTU24.04','HP DL360 Gen7',400000,'2025-09-01 15:00:00','2025-10-01 15:00:00','occupied','2025-10-16 00:58:10','2025-09-22 02:21:51',NULL),(19,1087,54,'2528C-M19','normal','C03PA06','13.220.20.10','WINDOWS2008R2','HP DL360 Gen8',800000,'2025-09-02 15:00:00','2025-10-12 15:00:00','occupied','2025-10-16 00:58:28','2025-09-22 02:22:14',NULL),(20,820,52,'2529D-M20','normal','C03PA07','13.220.20.27','CENTOS9','HP DL360 Gen9',600000,'2025-09-03 15:00:00','2025-10-01 15:00:00','occupied','2025-10-16 00:57:48','2025-09-22 02:22:39',NULL),(21,1186,60,'2520Z-M21','vpn','C03PA17','13.220.20.30','WINDOWS2016R2','HP DL360 Gen10',700000,'2025-09-04 15:00:00','2025-10-01 15:00:00','occupied','2025-10-16 01:53:52','2025-09-22 02:23:08',NULL),(22,820,56,'2530Z-M22','dedicated','C03PA16','23.125.207.27','WINDOWS2019R2','Hitach HA3000',800000,'2025-09-05 15:00:00','2025-09-29 15:00:00','occupied','2025-10-16 06:45:46','2025-09-22 02:23:36',NULL),(23,819,57,'JPN-S23','event','C03PA01','13.220.20.1','CENTOS9','INTEL I5',200000,'2025-10-01 15:00:00',NULL,'occupied','2025-10-16 01:04:24','2025-10-01 08:16:56',NULL),(24,1087,54,'JPN-S24','alternative','C03PA14','13.220.20.122','WINDOWS2008R2','INTEL I7',200000,'2025-10-01 15:00:00','2025-10-12 15:00:00','occupied','2025-10-16 00:58:44','2025-10-01 08:52:19',NULL),(25,NULL,NULL,'2548E-M25','alternative',NULL,'13.220.20.94',NULL,'HP DL360 Gen8',700000,'2025-09-30 15:00:00','2025-10-15 15:00:00','available','2025-10-15 23:21:11','2025-10-02 03:55:46',NULL),(26,NULL,NULL,'2547C-M26','alternative',NULL,NULL,NULL,'HP DL360 Gen7',500000,'2025-09-30 15:00:00','2025-10-02 15:00:00','available','2025-10-03 01:00:57','2025-10-02 03:58:53',NULL),(27,711,58,'2548D-M27','normal','C03PA15','13.220.20.63','WINDOWS11','HP DL360 Gen8',900000,'2025-10-01 15:00:00',NULL,'occupied','2025-10-16 01:48:27','2025-10-02 04:02:16',NULL),(31,1185,59,'2412E-M29','normal','C03PA21','13.220.20.34','DEBIAN10','HP DL360 Gen9',500000,'2025-10-03 15:00:00',NULL,'occupied','2025-10-16 01:53:30','2025-10-03 01:08:32',NULL),(32,1155,64,'2543E-M32','normal','C01PA45','13.220.20.25','UBUNTU22.04','HP DL360 Gen6',500000,'2025-10-03 15:00:00',NULL,'occupied','2025-10-17 06:22:15','2025-10-03 01:10:09',NULL),(55,NULL,NULL,'KCS-M33','alternative',NULL,'28.23.54.22',NULL,'KCS',150000,'2025-10-01 15:00:00','2025-10-16 15:00:00','available','2025-10-17 02:33:55','2025-10-03 05:32:51',NULL),(63,842,62,'254D9-M56','defence','C02PA09','13.220.20.9','CENTOS9','HP DL360 Gen9',400000,'2025-10-08 15:00:00',NULL,'occupied','2025-10-16 01:54:24','2025-10-15 07:06:56',NULL),(64,842,63,'2549D-M64','normal','C03PA02','13.220.20.7','UBUNTU24.04','HP DL360 Gen9',400000,'2025-10-08 15:00:00',NULL,'occupied','2025-10-16 01:54:36','2025-10-15 07:23:19',NULL);
/*!40000 ALTER TABLE `serverinfo` ENABLE KEYS */;
UNLOCK TABLES;
@ -547,7 +577,7 @@ CREATE TABLE `serviceinfo` (
CONSTRAINT `FK_clientinfo_TO_serviceinfo` FOREIGN KEY (`clientinfo_uid`) REFERENCES `clientinfo` (`uid`),
CONSTRAINT `FK_payment_TO_serviceinfo` FOREIGN KEY (`payment_uid`) REFERENCES `payment` (`uid`),
CONSTRAINT `FK_serverinfo_TO_serviceinfo` FOREIGN KEY (`serverinfo_uid`) REFERENCES `serverinfo` (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8 COMMENT='서비스정보';
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8 COMMENT='서비스정보';
/*!40101 SET character_set_client = @saved_cs_client */;
--
@ -556,7 +586,7 @@ CREATE TABLE `serviceinfo` (
LOCK TABLES `serviceinfo` WRITE;
/*!40000 ALTER TABLE `serviceinfo` DISABLE KEYS */;
INSERT INTO `serviceinfo` VALUES (52,1,820,20,17,'prime_s68d4e145a474d','prime','chiba',100000,300000,'2025-09-25',100000,950000,'2025-09-25',NULL,'test1234\r\ntesst2123','available','2025-10-16 00:57:48','2025-09-25 06:29:25',NULL),(53,1,1161,18,18,'itsolution_s68d4e1b6','itsolution','chiba',100000,300000,'2025-11-14',0,800000,'2025-09-25',NULL,NULL,'available','2025-10-16 00:58:10','2025-09-25 06:31:18',NULL),(54,1,1087,19,20,'gdidc_s68d4ff1b03fab','gdidc','chiba',300000,300000,'2025-09-25',100000,1800000,'2025-09-25',NULL,NULL,'available','2025-10-16 00:58:28','2025-09-25 08:36:43',NULL),(56,1,820,22,29,'gdidc_s68dc70e2edb68','gdidc','chiba',100000,300000,'2025-10-01',0,1550000,'2025-10-01',NULL,NULL,'available','2025-10-16 06:45:46','2025-10-01 00:08:02',NULL),(57,1,819,23,32,'prime_s68dce40dd65df','prime','chiba',100000,300000,'2025-10-01',100000,650000,'2025-10-01',NULL,NULL,'available','2025-10-16 01:04:24','2025-10-01 08:19:25',NULL),(58,1,711,27,34,'prime_s68ddf9a191864','prime','chiba',100000,300000,'2025-10-02',200000,1100000,'2025-10-02',NULL,NULL,'available','2025-10-16 01:48:27','2025-10-02 04:03:45',NULL),(59,1,1185,31,35,'itsolution_s68e30467','itsolution','chiba',100000,300000,'2025-10-06',0,900000,'2025-10-06',NULL,NULL,'available','2025-10-16 01:53:30','2025-10-05 23:51:03',NULL),(60,1,1186,21,41,'prime_s68e37906ad1bd','prime','chiba',100000,300000,'2025-10-06',0,1100000,'2025-10-06',NULL,'test / test\r\n','available','2025-10-16 01:53:52','2025-10-06 08:08:38',NULL),(61,1,1186,17,42,'prime_s68e37b9e918a2','prime','chiba',100000,300000,'2025-10-06',100000,1300000,'2025-10-06',NULL,NULL,'available','2025-10-16 01:54:10','2025-10-06 08:19:42',NULL),(62,1,842,63,52,'prime_s68ef4901c563f','prime','chiba',100000,300000,'2025-10-15',0,800000,'2025-10-15',NULL,NULL,'available','2025-10-16 07:52:10','2025-10-15 07:10:57',NULL),(63,1,842,64,53,'itsolution_s68ef4cbd','itsolution','chiba',100000,300000,'2025-10-15',400000,400000,'2025-10-15',NULL,NULL,'available','2025-10-16 01:54:36','2025-10-15 07:26:53',NULL);
INSERT INTO `serviceinfo` VALUES (52,1,820,20,17,'prime_s68d4e145a474d','prime','chiba',100000,300000,'2025-09-25',100000,950000,'2025-09-25',NULL,'test1234\r\ntesst2123','available','2025-10-16 00:57:48','2025-09-25 06:29:25',NULL),(53,1,1161,18,18,'itsolution_s68d4e1b6','itsolution','chiba',100000,300000,'2025-11-14',0,800000,'2025-09-25',NULL,NULL,'available','2025-10-16 00:58:10','2025-09-25 06:31:18',NULL),(54,1,1087,19,20,'gdidc_s68d4ff1b03fab','gdidc','chiba',300000,300000,'2025-09-25',100000,1800000,'2025-09-25',NULL,NULL,'available','2025-10-16 00:58:28','2025-09-25 08:36:43',NULL),(56,1,820,22,29,'gdidc_s68dc70e2edb68','gdidc','chiba',100000,300000,'2025-10-01',0,1550000,'2025-10-01',NULL,NULL,'available','2025-10-16 06:45:46','2025-10-01 00:08:02',NULL),(57,1,819,23,32,'prime_s68dce40dd65df','prime','chiba',100000,300000,'2025-10-01',100000,650000,'2025-10-01',NULL,NULL,'available','2025-10-16 01:04:24','2025-10-01 08:19:25',NULL),(58,1,711,27,34,'prime_s68ddf9a191864','prime','chiba',100000,300000,'2025-10-02',200000,1100000,'2025-10-02',NULL,NULL,'available','2025-10-16 01:48:27','2025-10-02 04:03:45',NULL),(59,1,1185,31,35,'itsolution_s68e30467','itsolution','chiba',100000,300000,'2025-10-06',0,900000,'2025-10-06',NULL,NULL,'available','2025-10-16 01:53:30','2025-10-05 23:51:03',NULL),(60,1,1186,21,41,'prime_s68e37906ad1bd','prime','chiba',100000,300000,'2025-10-06',0,1100000,'2025-10-06',NULL,'test / test\r\n','available','2025-10-16 01:53:52','2025-10-06 08:08:38',NULL),(61,1,1186,17,42,'prime_s68e37b9e918a2','prime','chiba',100000,300000,'2025-10-06',100000,1300000,'2025-10-06',NULL,NULL,'available','2025-10-16 01:54:10','2025-10-06 08:19:42',NULL),(62,1,842,63,52,'prime_s68ef4901c563f','prime','chiba',100000,300000,'2025-10-15',0,800000,'2025-10-15',NULL,NULL,'available','2025-10-16 07:52:10','2025-10-15 07:10:57',NULL),(63,1,842,64,53,'itsolution_s68ef4cbd','itsolution','chiba',100000,300000,'2025-10-15',400000,400000,'2025-10-15',NULL,NULL,'available','2025-10-16 01:54:36','2025-10-15 07:26:53',NULL),(64,1,1155,32,NULL,'gdidc_s68f1e0977ed19','gdidc','chiba',100000,300000,'2025-10-17',0,900000,'2025-10-17',NULL,NULL,'available','2025-10-17 06:22:15','2025-10-17 06:22:15',NULL);
/*!40000 ALTER TABLE `serviceinfo` ENABLE KEYS */;
UNLOCK TABLES;
@ -705,4 +735,4 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-10-17 15:20:20
-- Dump completed on 2025-10-20 13:32:57

View File

@ -0,0 +1,13 @@
<?php
namespace App\Entities;
use App\Entities\CommonEntity;
use App\Models\BoardModel as Model;
class BoardEntity extends CommonEntity
{
const PK = Model::PK;
const TITLE = Model::TITLE;
const DEFAULT_STATUS = STATUS['AVAILABLE'];
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Helpers;
use App\Models\BoardModel;
class BoardHelper extends CommonHelper
{
public function __construct()
{
parent::__construct();
$this->setTitleField(BoardModel::TITLE);
}
public function getFieldView(string $field, mixed $value, array $viewDatas, array $extras = []): string|null
{
switch ($field) {
case 'content':
if (in_array($viewDatas['control']['action'], ['view', 'index'])) {
$value = html_entity_decode($value, ENT_QUOTES, 'UTF-8');
}
break;
default:
$value = parent::getFieldView($field, $value, $viewDatas, $extras);
break;
}
if (is_array($value)) {
throw new \Exception(__METHOD__ . "에서 오류: {$field}의 값이 Array형태입니다");
}
return $value;
}
}

View File

@ -308,7 +308,7 @@ class CommonHelper
case 'content':
case 'detail':
case 'history':
// $extras['class'] = array_key_exists('class', $extras) ? $extras['class'] . ' tinymce' : 'tinymce';
$extras['class'] = array_key_exists('class', $extras) ? $extras['class'] . ' tinymce' : 'tinymce';
$form = form_textarea($field, $value ?? "", [
"class" => "form-control",
'style' => 'width:100%;',
@ -357,18 +357,6 @@ class CommonHelper
case 'deleted_at':
$value = $value ? date("Y-m-d", strtotime($value)) : "";
break;
case 'price':
case 'amount':
$value = number_format($value) . "";
break;
case 'description':
case 'content':
case 'history':
case 'detail':
if (in_array($viewDatas['control']['action'], ['view', 'index'])) {
$value = nl2br($value);
}
break;
default:
if (in_array($field, $viewDatas['control']['actionFilters'])) {
if (str_contains($field, "_uid")) {

22
app/Language/en/Board.php Normal file
View File

@ -0,0 +1,22 @@
<?php
return [
'title' => "게시판정보",
'label' => [
'uid' => "번호",
'category' => "구분",
'title' => "제목",
'content' => "내용",
'status' => "상태",
'updated_at' => "수정일",
'created_at' => "작성일",
'deleted_at' => "삭제일",
],
"CATEGORY" => [
"notice" => "공지사항",
],
"STATUS" => [
STATUS['AVAILABLE'] => "사용중",
STATUS['PAUSE'] => "일시정지",
STATUS['TERMINATED'] => "삭제",
],
];

46
app/Models/BoardModel.php Normal file
View File

@ -0,0 +1,46 @@
<?php
namespace App\Models;
use App\Entities\BoardEntity;
class BoardModel extends CommonModel
{
const TABLE = "boardinfo";
const PK = "uid";
const TITLE = "title";
protected $table = self::TABLE;
protected $primaryKey = self::PK;
protected $returnType = BoardEntity::class;
protected $allowedFields = [
"uid",
"category",
"title",
"content",
"status",
"updated_at"
];
public function __construct()
{
parent::__construct();
}
public function getFormRule(string $action, string $field): string
{
if (is_array($field)) {
throw new \Exception(__FUNCTION__ . "=> field가 array 입니다.\n" . var_export($field, true));
}
switch ($field) {
case "category":
case "title":
$rule = "required|trim|string";
break;
case "content":
$rule = "permit_empty|string";
break;
default:
$rule = parent::getFormRule($action, $field);
break;
}
return $rule;
}
}

View File

@ -0,0 +1,50 @@
<?php
namespace App\Services;
use App\Helpers\BoardHelper;
use App\Models\BoardModel;
class BoardService extends CommonService
{
public function __construct()
{
parent::__construct(new BoardModel(), new BoardHelper());
$this->addClassName('Board');
}
public function getFormFields(): array
{
return [
'category',
'title',
'content',
'status',
];
}
public function getFormFilters(): array
{
return [
'category',
'status',
];
}
public function getIndexFields(): array
{
return [
'category',
'title',
'status',
'created_at',
];
}
public function getBatchjobFields(): array
{
return ['category', 'status'];
}
public function latest(array $where, int $limit = 3): array
{
$this->getModel()->limit($limit);
return $this->getEntities($where);
}
//기본 기능부분
}

View File

@ -1,6 +1,9 @@
<div class="accordion-item">
<a href="/admin/user"><?= ICONS['MEMBER'] ?> 계정 관리</a>
</div>
<div class="accordion-item">
<a href="/admin/board"><?= ICONS['CLOUD'] ?> 게시판 관리</a>
</div>
<div class="accordion-item">
<a href="/admin/mylog"><?= ICONS['HISTORY'] ?> Log 관리</a>
</div>

View File

@ -1,4 +1,11 @@
<!-- top start -->
<style>
/* dropdown 크기 및 스크롤 개선 */
#noticeList {
max-height: 300px;
overflow-y: auto;
}
</style>
<nav class="navbar navbar-expand-lg fixed-top" style="background-color:#E7E7E7; border-top:1px solid darkgray; border-bottom:1px solid darkgray;">
<div class="container-fluid">
<nav class="nav"><a class="navbar-brand" href="/admin">DBMS 관리</a></nav>
@ -10,6 +17,20 @@
<button type="submit" class="btn btn-default border border-dark"><?= ICONS['SEARCH'] ?></button>
<?= form_close(); ?>
</li>
<li class="nav-item" style="background-color:white; margin-left:20px; font-size:12px;">
<!-- 🔔 공지 영역 -->
<ul class="navbar-nav ms-auto">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="noticeDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
🔔 공지사항 <span id="notice-count" class="badge bg-danger">0</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="noticeDropdown" id="noticeList">
<li class="dropdown-item text-muted">불러오는 ...</li>
</ul>
</li>
</ul>
<!-- 🔔 공지 영역 -->
</li>
<li class="nav-item" style="background-color:white; margin-left:20px; font-size:12px;">
📋:클립보드COPY , 📌:실서비스서버 , ✔️:대체서버->실서비스서버 교체 , 🔄:대체서버등록 , <?= ICONS['MONTH'] ?>:월비용 , <?= ICONS['ONETIME'] ?>:일회성<BR>
<?= ICONS['SERVER_ITEM_SWITCH'] ?>:스위치 , <?= ICONS['SERVER_ITEM_IP'] ?>:IP , <?= ICONS['SERVER_ITEM_OS'] ?>:OS , <?= ICONS['SERVER_ITEM_SOFTWARE'] ?>:소프트웨어 , <?= ICONS['SERVER_ITEM_CS'] ?>:CS ,
@ -48,17 +69,39 @@
</div>
</nav>
<script>
document.addEventListener('DOMContentLoaded', () => {
const params = new URLSearchParams(location.search);
const customer_keyword = params.get('customer_keyword');
if (keyword)
document.querySelector('input[name="customer_keyword"]').value = customer_keyword;
});
//전체검색용
document.addEventListener('DOMContentLoaded', () => {
const params = new URLSearchParams(location.search);
const keyword = params.get('keyword');
if (keyword)
document.querySelector('input[name="keyword"]').value = keyword;
});
//공지사항용
document.addEventListener("DOMContentLoaded", function() {
async function loadNotices() {
try {
const res = await fetch("/admin/board/latest");
const notices = await res.json();
const notice_list = document.getElementById("noticeList");
const notice_count = document.getElementById("notice-count");
notice_list.innerHTML = "";
if (notices.length === 0) {
notice_list.innerHTML = '<li class="dropdown-item text-muted">공지 없음</li>';
return;
}
notice_count.innerHTML = notices.length;
notices.forEach(n => {
const item = document.createElement("li");
item.classList.add("dropdown-item");
item.innerHTML = `<small class="text-muted">[${n.created_at.date.replace(/\.\d+$/, '')}]</small> ${n.title}<br>`;
notice_list.appendChild(item);
});
} catch (err) {
console.error("공지 불러오기 실패:", err);
}
}
loadNotices(); // 최초 로드
setInterval(loadNotices, 10000); // 10초마다 갱신
});
</script>
<!-- top end -->