diff --git a/hwe/ts/PageCityInfo.vue b/hwe/ts/PageCityInfo.vue
new file mode 100644
index 00000000..03ccd214
--- /dev/null
+++ b/hwe/ts/PageCityInfo.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/hwe/ts/build_exports.json b/hwe/ts/build_exports.json
index 3db70d2b..75a718f6 100644
--- a/hwe/ts/build_exports.json
+++ b/hwe/ts/build_exports.json
@@ -27,6 +27,7 @@
"v_board": "v_board.ts",
"v_cachedMap": "v_cachedMap",
"v_chiefCenter": "v_chiefCenter.ts",
+ "v_cityInfo": "v_cityInfo.ts",
"v_NPCControl": "v_NPCControl.ts",
"v_join": "v_join.ts",
"v_main": "v_main.ts",
diff --git a/hwe/ts/v_cityInfo.ts b/hwe/ts/v_cityInfo.ts
new file mode 100644
index 00000000..78bd00df
--- /dev/null
+++ b/hwe/ts/v_cityInfo.ts
@@ -0,0 +1,16 @@
+import { createApp } from 'vue'
+import { auto500px } from './util/auto500px';
+import { htmlReady } from './util/htmlReady';
+import { insertCustomCSS } from './util/customCSS';
+import PageCityInfo from './PageCityInfo.vue';
+import { installVue3Components } from './util/installVue3Components';
+auto500px();
+
+declare const query: {
+ cityID?: number
+};
+
+htmlReady(() => {
+ insertCustomCSS();
+});
+installVue3Components(createApp(PageCityInfo, query)).mount('#app');
diff --git a/hwe/v_cityInfo.php b/hwe/v_cityInfo.php
new file mode 100644
index 00000000..5bed2452
--- /dev/null
+++ b/hwe/v_cityInfo.php
@@ -0,0 +1,43 @@
+setReadOnly();
+
+$cityID = Util::getReq('cityID', 'int');
+?>
+
+
+
+
+
+
+
+
+ = UniqueConst::$serverName ?>: 도시 정보
+ = WebUtil::printStaticValues([
+ 'staticValues' => [
+ 'serverName' => UniqueConst::$serverName,
+ 'serverNick' => DB::prefix(),
+ 'serverID' => UniqueConst::$serverID,
+ 'mapName' => GameConst::$mapName,
+ 'unitSet' => GameConst::$unitSet,
+ ],
+ 'query' => [
+ 'cityID' => $cityID,
+ ]
+ ], false) ?>
+ = WebUtil::printJS('../d_shared/common_path.js') ?>
+ = WebUtil::printCSS('../d_shared/common.css') ?>
+
+ = WebUtil::printDist('vue', 'v_cityInfo', true) ?>
+
+
+
+
+
+
+
\ No newline at end of file