Jelajahi Sumber

首页接口字段对接

wkw 7 bulan lalu
induk
melakukan
d0557af691
2 mengubah file dengan 515 tambahan dan 95 penghapusan
  1. 312 67
      src/views/index/index.vue
  2. 203 28
      src/views/index/indexCompany.vue

+ 312 - 67
src/views/index/index.vue

@@ -5,7 +5,7 @@
 			<div :style="isTop==true?'background:#ffffff;box-shadow: 0 10px 8px rgba(153, 153, 153, 0.1);':''"
 				class="search flex align-center justify-center">
 				<div class="search-box flex align-center justify-between">
-					<div class="search-box-l flex align-center" @click="allCitys = true">
+					<div class="search-box-l flex align-center" @click="openCityDialog">
 						<el-image style="width: 16px; height: 18px;margin-right: 5px;"
 							src="/images/index/addressIcon.png" fit="cover" />
 						<el-text style="color: #00DD9A;font-size: 16px;margin-right: 10px;">{{city}}</el-text>
@@ -34,7 +34,7 @@
 							搜索
 						</div>
 					</div>
-					<!-- <div class="search-box-r flex align-center justify-center">
+					<div class="search-box-r flex align-center justify-center">
 						<el-image style="width: 20px; height: 30px;margin-right: 10px;" src="/images/index/phone.png"
 							fit="cover" />
 						<div class="search-box-r-c">
@@ -54,7 +54,7 @@
 								微信扫描二维码
 							</div>
 						</div>
-					</div> -->
+					</div>
 				</div>
 			</div>
 		</el-affix>
@@ -63,7 +63,7 @@
 			<div class="tabs-box">
 				<div @click="selectTabs(index)" :class="tabsCurr == index?'tabs-box-item-active':''"
 					class="tabs-box-item" v-for="(item,index) in tabs" :key="index">
-					{{item.value}}
+					{{item.name}}
 				</div>
 			</div>
 		</div>
@@ -190,23 +190,42 @@
 					v-for="(item,index) in recommendLists" :key="index">
 					<div class="list-box-item-title flex align-center justify-between">
 						<div class="list-box-item-title-name">
-							{{item.stationName}}
+							{{ item.ruleClassifyName }}
 						</div>
 						<div class="list-box-item-title-price">
-							{{item.salaryRange}}
+							{{ item.salaryRange }}
 						</div>
 					</div>
-					<div class="list-box-item-label flex align-center flex-wrap">
-						<div class="list-box-item-label-item" v-for="(ite,ind) in item.positionWelfare" :key="ind">
-							{{ite}}
+					<!-- 公司名称-公司人数 -->
+					<div class="list-box-item-title flex align-center justify-between">
+						<div style="margin: 10px 0;">
+							<span class="company-name" style="margin-right: 8rpx;">{{ item.company ?
+								item.company.companyName : '' }}</span>&nbsp;
+							<span class="company-people" v-if="item.company">{{ item.company ?
+								item.company.companyPeople : '0人' }}</span>
 						</div>
 					</div>
+					<!-- 职位标签 -->
+					<div class="gwList-box-item-box-label flex align-center flex-wrap">
+						<span class="job-tag">{{ item.education }}</span>
+						<span class="job-tag">{{ item.experience }}</span>
+						<span class="job-tag" v-for="(ite, ind) in parseWelfareTag(item.welfareTag)" :key="ind">{{ ite }}</span>
+					</div>
+					<!-- 公司简介-位置 -->
 					<div class="list-box-item-info flex align-center justify-between">
-						<div class="list-box-item-info-name">
-							{{item.company.companyName}}
+						<div class="gwList-box-item-box-info-l flex align-center">
+							<img :src="item.hr && item.hr.hrImg ? item.hr.hrImg : ''"
+								style="width: 40px;height: 40px;border-radius: 50%;" mode="">
+							</img>
+							<div class="company-info-text">
+								{{ item.user && item.user.userName || '未知' }}·{{ item.hr &&
+								item.hr.hrPosition || '未知' }}
+							</div>
+							<div v-if="item.respondTime" class="reply-time">{{ item.respondTime }}
+							</div>
 						</div>
-						<div class="list-box-item-info-price">
-							{{item.company.companyPeople}}
+						<div class="location-text">
+							{{ formatDistance(item.distance) }} {{ item.county }}
 						</div>
 					</div>
 				</div>
@@ -226,35 +245,55 @@
 		<el-dialog v-model="allCitys" :draggable="true" destroy-on-close align-center center>
 			<template #header>
 				<div class="my-header flex align-center">
-					<div class="my-header-title" style="font-weight: bold;">
-						切换城市
+					<div class="my-header-title" style="font-weight: bold">
+						城市选择
+					</div>
+					<div class="my-header-title flex" style="margin-left: 40px; width: 300px">
+						<el-input v-model="search" prefix-icon="Search" size="default" placeholder="请输入城市名称"
+							@keyup.enter="handleSearch()" class="inputClass">
+						</el-input>
+						<el-button @click="handleSearch" style="margin-left: 10px" type="primary">搜索</el-button>
 					</div>
 				</div>
 			</template>
-			<div class="citys">
-				<div class="citys-top">
-					<div class="citys-top-cityt flex align-center justify-between">
-						定位城市
-						<div @click="getLocation()" class="citys-top-cityt-r flex align-center">
-							<el-icon size="18">
-								<Location />
-							</el-icon>
-							重新定位
+			<div class="city flex align-center justify-center">
+				<div class="city-box">
+					<div class="city-box-city">
+						<div class="city-box-cityt flex align-center justify-between">
+							定位城市
+							<div @click="getLocation()" class="city-box-cityt-r flex align-center">
+								<el-icon :size="14" name="RefreshRight" />
+								重新定位
+							</div>
 						</div>
+						<div @click="selectCity(citys)" class="city-box-citys">{{ citys }}</div>
 					</div>
-					<div @click="selectCity(citys)" class="citys-top-citys">
-						{{citys}}
-					</div>
-				</div>
-				<div class="citys-top">
-					<div class="citys-top-cityt flex align-center justify-between">
-						其他城市
-					</div>
-				</div>
-				<div class="citys-item">
-					<div @click="selectCity(item.label)" v-for="(item,index) in cityList" :key="index"
-						class="citys-item-citys">
-						{{item.label}}
+					<div class="city-box-list">
+						<ul class="city-box-lists" style="overflow: auto">
+							<li class="city-box-lists-title">热门城市</li>
+							<li class="city-box-lists-title-cs flex align-center flex-wrap">
+								<div @click="selectCity(item)" class="city-box-lists-title-css"
+									v-for="(item, index) in rmCity" :key="index">
+									{{ item }}
+								</div>
+							</li>
+							<li v-for="(item, index) in cityGroupList" :key="index" class="city-box-lists-item">
+								<div v-if="item.city.length > 0">
+									<div class="city-box-lists-item-title">
+										{{ item.letter }}
+									</div>
+									<div class="flex align-center flex-wrap">
+										<div class="city-box-lists-item-titles flex align-center"
+											v-for="(ite, ind) in item.city" :key="ind">
+											<div @click="selectCity(ite)">
+												{{ ite }}
+											</div>
+										</div>
+									</div>
+								</div>
+							</li>
+							<el-empty v-if="cityGroupList.length == 0" description="暂无城市" />
+						</ul>
 					</div>
 				</div>
 			</div>
@@ -264,6 +303,7 @@
 
 <script>
 	import cityJs from '../../publicJs/city.js'
+	import citySelect from '../../publicJs/citySelect.js'
 	import axios from 'axios';
 	import jsonp from 'axios-jsonp'
 	import VueQrcode from 'vue-qrcode'
@@ -286,7 +326,7 @@
 				isTop: false,
 				searchBg: 'background:#ffffff',
 				tabsCurr: 0,
-				tabs: [],
+				tabs: [{ name: '全日制', id: 1 },{ name: '兼职', id: 0 },{ name: '校招', id: 2 }, { name: '社招', id: 3 }],
 				bannerType: [], //岗位分类
 				recommendList: [], //推荐岗位
 				recommendLists: [], //最新岗位
@@ -299,6 +339,10 @@
 				longitude: '',
 				latitude: '',
 				cityList: cityJs, //所有的城市
+				//城市选择弹框相关
+				search: '', //城市搜索关键字
+				cityGroupList: [], //按字母分组的城市列表
+				rmCity: [], //热门城市列表
 				jobTypeList: {}, //求职意向第一个
 				loading: false,
 				loadings: false,
@@ -319,8 +363,6 @@
 			if (inviterCode) {
 				localStorage.setItem('inviterCode', inviterCode)
 			}
-			//工作性质
-			this.getTabsList();
 			//app下载地址
 			this.getAppDown()
 			//获取热门搜索
@@ -435,36 +477,38 @@
 					data = {
 						page: 1,
 						limit: 9,
-						postType: this.tabs.length > 0 ? this.tabs[this.tabsCurr].value : '', //工作性质
+						postType: this.tabs[this.tabsCurr].id, //工作性质
 						ruleClassifyName: this.jobTypeList.ruleClassifyName, //岗位名称
 						screen: 1, //1推荐 2最新
-						city: this.city == '全国' ? '' : this.city, //城市
-						salaryRange: '', //薪资范围
+						city: this.city || '', //城市
+						salaryRange: this.formatSalaryRange(this.jobTypeList.salaryRange), //薪资范围
 						education: '', //学历
 						experience: '', //经验
-						industry: this.jobTypeList.industry, //行业
+						industry:'', //行业
+						preference: this.jobTypeList.industry || '',//偏好
 						companyPeople: '', //公司规模
 						lng: this.longitude,
 						lat: this.latitude,
-						userId: localStorage.getItem('userId') ? localStorage.getItem('userId') : ''
+						// userId: localStorage.getItem('userId') ? localStorage.getItem('userId') : ''
 					}
 				} else {
 					this.loadings = true
 					data = {
 						page: 1,
 						limit: 9,
-						postType: this.tabs.length > 0 ? this.tabs[this.tabsCurr].value : '', //工作性质
+						type: this.tabs[this.tabsCurr].id, //工作性质
 						ruleClassifyName: '', //岗位名称
 						screen: 2, //1推荐 2最新
-						city: this.city, //城市
+						city: this.city || '', //城市
 						salaryRange: '', //薪资范围
 						education: '', //学历
 						experience: '', //经验
 						industry: '', //行业
+						preference: '',//偏好
 						companyPeople: '', //公司规模
 						lng: this.longitude,
 						lat: this.latitude,
-						userId: localStorage.getItem('userId') ? localStorage.getItem('userId') : ''
+						// userId: localStorage.getItem('userId') ? localStorage.getItem('userId') : ''
 					}
 				}
 
@@ -492,22 +536,6 @@
 					}
 				})
 			},
-			//获取工作性质
-			getTabsList() {
-				let data = {
-					type: '工作性质'
-				}
-				this.$Request.get('/app/dict/list', {
-					params: data
-				}).then(res => {
-					if (res.code == 0) {
-						this.tabs = res.data
-						//定位
-						this.getLocation();
-
-					}
-				})
-			},
 			//获取求职意向
 			getJobYx() {
 				this.$Request.get('/app/intention/getIntentionList').then(res => {
@@ -517,7 +545,7 @@
 								this.jobTypeList = item
 							}
 						})
-						this.getTabsList()
+						this.getLocation();
 					}
 				})
 			},
@@ -530,6 +558,60 @@
 				this.getRecommendJob(1)
 				this.getRecommendJob(2)
 			},
+			//打开城市选择弹框
+			openCityDialog() {
+				this.allCitys = true;
+			},
+			//打开城市选择弹框
+			openCityDialog() {
+				this.allCitys = true;
+				this.search = '';
+				//获取热门城市列表
+				this.getRmCityList();
+				//获取按字母分组的城市列表
+				this.getCityGroupList();
+			},
+			//获取热门城市列表
+			getRmCityList() {
+				let data = {
+					limitCount: 10
+				};
+				this.$Request
+					.get('/app/postPush/getHotCity', { params: data })
+					.then(res => {
+						if (res.code == 0) {
+							this.rmCity = res.data;
+						}
+					});
+			},
+			//获取按字母分组的城市列表
+			getCityGroupList(keyword = '') {
+				const grouped = {};
+				// 过滤:如果有关键字,就按城市名模糊匹配
+				const filtered = keyword
+					? cityJs.filter(item => item.label.includes(keyword))
+					: cityJs;
+
+				// 遍历城市数据
+				filtered.forEach(item => {
+					// 按字母分组
+					const letterObj = citySelect.getFirstLetter(item.label);
+					const letter = letterObj.firstletter.toUpperCase();
+					if (!grouped[letter]) grouped[letter] = [];
+					grouped[letter].push(item.label);
+				});
+
+				// 生成按字母分组的城市列表
+				const sortedLetters = Object.keys(grouped).sort();
+				this.cityGroupList = sortedLetters.map(letter => ({
+					letter,
+					city: grouped[letter]
+				}));
+			},
+			//搜索城市
+			handleSearch() {
+				this.getCityGroupList(this.search.trim());
+			},
 			//使用jsonp请求从腾讯地图获取经纬度
 			getLocation() {
 				let data = {
@@ -611,12 +693,42 @@
 			change(e) {
 				this.isTop = e
 			},
+			formatSalaryRange(range) {
+				if (!range || !range.includes('-')) return range
+
+				const [min, max] = range.split('-').map(v => parseInt(v.trim()))
+				if (isNaN(min) || isNaN(max)) return range
+
+				// 除以1000并去掉小数点后多余的0
+				const formatNum = num => {
+					const val = num / 1000
+					return val % 1 === 0 ? val.toFixed(0) + 'k' : val.toFixed(1) + 'k'
+				}
+
+				return `${formatNum(min)}-${formatNum(max)}`
+			},
+			parseWelfareTag(tagStr) {
+				return tagStr ? tagStr.split(';').filter(Boolean) : []
+			},
+			formatDistance(distance) {
+				if (distance == null || distance === '') return ''
+				const num = parseFloat(distance)
+				if (isNaN(num)) return ''
+				// 小于1000显示米,否则显示千米
+				if (num < 1000) {
+					return `${num}m`
+				} else {
+					const km = num / 1000
+					// 去掉多余的小数(保留一位小数)
+					const formatted = km % 1 === 0 ? km.toFixed(0) : km.toFixed(1)
+					return `${formatted}km`
+				}
+			},
 		},
 	}
 </script>
 <style lang="scss" scoped>
 	$marginTop-60: 120px;
-
 	.searchLabel {
 		width: 100%;
 
@@ -734,10 +846,11 @@
 				color: #333333;
 				cursor: pointer;
 				flex-shrink: 0;
-				margin-right: 30px;
+				
 			}
 
 			.search-box-c {
+				margin:0 30px;
 				flex: 1;
 				// width: 70vw;
 				height: 100%;
@@ -1147,4 +1260,136 @@
 
 		}
 	}
+	.city {
+		width: 100%;
+		height: 500px;
+
+		.city-box {
+			width: 100%;
+			padding: 0 20px;
+			height: 100%;
+		}
+
+		.city-box-city {
+			.city-box-cityt {
+				width: 100%;
+				font-weight: bold;
+
+				.city-box-cityt-r {
+					font-weight: 500;
+					color: #999999;
+					font-size: 12px;
+					cursor: pointer;
+				}
+			}
+
+			.city-box-citys {
+				background-color: #F2F2F7;
+				width: fit-content;
+				padding: 4px 10px;
+				margin-top: 10px;
+				cursor: pointer;
+				border-radius: 4px;
+			}
+
+			.city-box-citys:hover {
+				background-color: #00DD9A;
+				color: #FFFFFF;
+			}
+		}
+
+		.city-box-list {
+			width: 100%;
+			height: 420px;
+			margin-top: 20px;
+			overflow-y: scroll;
+		}
+
+		.city-box-lists {
+			width: 100%;
+			height: 100%;
+			list-style: none;
+			padding: 0;
+			margin: 0;
+		}
+
+		.city-box-lists-title {
+			font-weight: bold;
+
+		}
+
+		.city-box-lists-title-css {
+			background-color: #F2F2F7;
+			width: fit-content;
+			padding: 4px 10px;
+			margin-top: 10px;
+			cursor: pointer;
+			border-radius: 4px;
+			margin-right: 20px;
+			margin-bottom: 20px;
+		}
+
+		.city-box-lists-title-css:hover {
+			background-color: #00DD9A;
+			color: #FFFFFF;
+		}
+
+		.city-box-lists-item-title {
+			font-weight: bold;
+		}
+
+		.city-box-lists-item-titles {
+			background-color: #F2F2F7;
+			width: fit-content;
+			padding: 4px 10px;
+			margin-top: 10px;
+			cursor: pointer;
+			border-radius: 4px;
+			margin-right: 20px;
+			margin-bottom: 20px;
+		}
+
+		.city-box-lists-item-titles:hover {
+			background-color: #00DD9A;
+			color: #FFFFFF;
+		}
+	}
+	.company-name,.company-people{
+		font-size: 14px;
+		font-weight: 400;
+		color: rgba(156, 164, 171, 1);
+	}
+	.gwList-box-item-box-label{
+		padding: 0 20px;
+		gap: 12px;
+		.job-tag{
+			padding: 4px;
+			background: rgba(198, 198, 198, 0.1);
+			border-radius: 4px;
+			font-size: 12px;
+			font-weight: 400;
+			color: rgba(153, 153, 153, 1);
+		}
+	}
+	.gwList-box-item-box-info-l{
+		.company-info-text{
+			margin: 0 10px;
+			color: rgba(156, 164, 171, 1);
+			font-size: 12px;
+			font-weight: 400;
+		}
+		.reply-time{
+			border-radius: 4px;
+			background: rgba(236, 225, 253, 1);
+			padding: 4px;
+			color: rgba(106.94, 84.63, 214.02, 0.96);
+			font-size: 12px;
+			font-weight: 400;
+		}
+	}
+	.location-text{
+		color: rgba(156, 164, 171, 1);
+		font-size: 12px;
+		font-weight: 400;
+	}
 </style>

+ 203 - 28
src/views/index/indexCompany.vue

@@ -5,7 +5,7 @@
 			<div :style="isTop==true?'background:#ffffff;box-shadow: 0 10px 8px rgba(153, 153, 153, 0.1);':''"
 				class="search flex align-center justify-center">
 				<div class="search-box flex align-center justify-between">
-					<div class="search-box-l flex align-center" @click="allCitys = true">
+					<div class="search-box-l flex align-center" @click="openCityDialog">
 						<el-image style="width: 16px; height: 18px;margin-right: 5px;"
 							src="/images/index/addressIcon.png" fit="cover" />
 						<el-text style="color: #00DD9A;font-size: 16px;margin-right: 10px;">{{city}}</el-text>
@@ -34,8 +34,6 @@
 						</div>
 						<div class="search-box-r-rq">
 							<div class="search-box-r-rq-img">
-								<!-- <VueQrcode type="image/png" :color="qrColor" :value="options" :margin="0"
-									errorCorrectionLevel="quartile" :width="size" /> -->
 								<img :src="options" style="width: 160px;height: auto;" />
 							</div>
 
@@ -231,35 +229,55 @@
 		<el-dialog v-model="allCitys" :draggable="true" destroy-on-close align-center center>
 			<template #header>
 				<div class="my-header flex align-center">
-					<div class="my-header-title" style="font-weight: bold;">
-						切换城市
+					<div class="my-header-title" style="font-weight: bold">
+						城市选择
+					</div>
+					<div class="my-header-title flex" style="margin-left: 40px; width: 300px">
+						<el-input v-model="search" prefix-icon="Search" size="default" placeholder="请输入城市名称"
+							@keyup.enter="handleSearch()" class="inputClass">
+						</el-input>
+						<el-button @click="handleSearch" style="margin-left: 10px" type="primary">搜索</el-button>
 					</div>
 				</div>
 			</template>
-			<div class="citys">
-				<div class="citys-top">
-					<div class="citys-top-cityt flex align-center justify-between">
-						定位城市
-						<div @click="getLocation()" class="citys-top-cityt-r flex align-center">
-							<el-icon size="18">
-								<Location />
-							</el-icon>
-							重新定位
+			<div class="city flex align-center justify-center">
+				<div class="city-box">
+					<div class="city-box-city">
+						<div class="city-box-cityt flex align-center justify-between">
+							定位城市
+							<div @click="getLocation()" class="city-box-cityt-r flex align-center">
+								<el-icon :size="14" name="RefreshRight" />
+								重新定位
+							</div>
 						</div>
+						<div @click="selectCity(citys)" class="city-box-citys">{{ citys }}</div>
 					</div>
-					<div @click="selectCity(citys)" class="citys-top-citys">
-						{{citys}}
-					</div>
-				</div>
-				<div class="citys-top">
-					<div class="citys-top-cityt flex align-center justify-between">
-						其他城市
-					</div>
-				</div>
-				<div class="citys-item">
-					<div @click="selectCity(item.label)" v-for="(item,index) in cityList" :key="index"
-						class="citys-item-citys">
-						{{item.label}}
+					<div class="city-box-list">
+						<ul class="city-box-lists" style="overflow: auto">
+							<li class="city-box-lists-title">热门城市</li>
+							<li class="city-box-lists-title-cs flex align-center flex-wrap">
+								<div @click="selectCity(item)" class="city-box-lists-title-css"
+									v-for="(item, index) in rmCity" :key="index">
+									{{ item }}
+								</div>
+							</li>
+							<li v-for="(item, index) in cityGroupList" :key="index" class="city-box-lists-item">
+								<div v-if="item.city.length > 0">
+									<div class="city-box-lists-item-title">
+										{{ item.letter }}
+									</div>
+									<div class="flex align-center flex-wrap">
+										<div class="city-box-lists-item-titles flex align-center"
+											v-for="(ite, ind) in item.city" :key="ind">
+											<div @click="selectCity(ite)">
+												{{ ite }}
+											</div>
+										</div>
+									</div>
+								</div>
+							</li>
+							<el-empty v-if="cityGroupList.length == 0" description="暂无城市" />
+						</ul>
 					</div>
 				</div>
 			</div>
@@ -269,6 +287,7 @@
 
 <script>
 	import cityJs from '../../publicJs/city.js'
+	import citySelect from '../../publicJs/citySelect.js'
 	import axios from 'axios';
 	import jsonp from 'axios-jsonp'
 	import VueQrcode from 'vue-qrcode'
@@ -305,6 +324,10 @@
 				loading: false,
 				loadings: false,
 				bannerListuser: [], //企业端轮播图
+				//城市选择弹框相关
+				search: '', //城市搜索关键字
+				cityGroupList: [], //按字母分组的城市列表
+				rmCity: [], //热门城市列表
 			}
 		},
 		computed: {
@@ -479,6 +502,62 @@
 				this.getRecommendJob(1)
 				this.getRecommendJob(2)
 			},
+			//打开城市选择弹框
+			openCityDialog() {
+				this.allCitys = true;
+				// 确保在打开弹框时获取热门城市列表和按字母分组的城市列表
+				// 这里可以添加相应的API调用或数据处理逻辑
+			},
+			//打开城市选择弹框
+			openCityDialog() {
+				this.allCitys = true;
+				this.search = '';
+				//获取热门城市列表
+				this.getRmCityList();
+				//获取按字母分组的城市列表
+				this.getCityGroupList();
+			},
+			//获取热门城市列表
+			getRmCityList() {
+				let data = {
+					limitCount: 10
+				};
+				this.$Request
+					.get('/app/postPush/getHotCity', { params: data })
+					.then(res => {
+						if (res.code == 0) {
+							this.rmCity = res.data;
+						}
+					});
+			},
+			//获取按字母分组的城市列表
+			getCityGroupList(keyword = '') {
+				const grouped = {};
+				// 过滤:如果有关键字,就按城市名模糊匹配
+				const filtered = keyword
+					? cityJs.filter(item => item.label.includes(keyword))
+					: cityJs;
+
+				// 遍历城市数据
+				filtered.forEach(item => {
+					// 按字母分组
+					const letterObj = citySelect.getFirstLetter(item.label);
+					const letter = letterObj.firstletter.toUpperCase();
+					if (!grouped[letter]) grouped[letter] = [];
+					grouped[letter].push(item.label);
+				});
+
+				// 生成按字母分组的城市列表
+				const sortedLetters = Object.keys(grouped).sort();
+				this.cityGroupList = sortedLetters.map(letter => ({
+					letter,
+					city: grouped[letter]
+				}));
+			},
+			//搜索城市
+			handleSearch() {
+				this.getCityGroupList(this.search.trim());
+			},
 			//使用jsonp请求从腾讯地图获取经纬度
 			getLocation() {
 				let data = {
@@ -673,10 +752,12 @@
 				font-size: 16px;
 				color: #333333;
 				cursor: pointer;
+				flex-shrink: 0;
 			}
 
 			.search-box-c {
-				width: 55vw;
+				flex: 1;
+				margin: 0 30px;
 				height: 100%;
 				background-color: #00DD9A;
 				border-radius: 12px;
@@ -1127,4 +1208,98 @@
 			cursor: pointer;
 		}
 	}
+	.city {
+		width: 100%;
+		height: 500px;
+
+		.city-box {
+			width: 100%;
+			padding: 0 20px;
+			height: 100%;
+		}
+
+		.city-box-city {
+			.city-box-cityt {
+				width: 100%;
+				font-weight: bold;
+
+				.city-box-cityt-r {
+					font-weight: 500;
+					color: #999999;
+					font-size: 12px;
+					cursor: pointer;
+				}
+			}
+
+			.city-box-citys {
+				background-color: #F2F2F7;
+				width: fit-content;
+				padding: 4px 10px;
+				margin-top: 10px;
+				cursor: pointer;
+				border-radius: 4px;
+			}
+
+			.city-box-citys:hover {
+				background-color: #00DD9A;
+				color: #FFFFFF;
+			}
+		}
+
+		.city-box-list {
+			width: 100%;
+			height: 420px;
+			margin-top: 20px;
+			overflow-y: scroll;
+		}
+
+		.city-box-lists {
+			width: 100%;
+			height: 100%;
+			list-style: none;
+			padding: 0;
+			margin: 0;
+		}
+
+		.city-box-lists-title {
+			font-weight: bold;
+
+		}
+
+		.city-box-lists-title-css {
+			background-color: #F2F2F7;
+			width: fit-content;
+			padding: 4px 10px;
+			margin-top: 10px;
+			cursor: pointer;
+			border-radius: 4px;
+			margin-right: 20px;
+			margin-bottom: 20px;
+		}
+
+		.city-box-lists-title-css:hover {
+			background-color: #00DD9A;
+			color: #FFFFFF;
+		}
+
+		.city-box-lists-item-title {
+			font-weight: bold;
+		}
+
+		.city-box-lists-item-titles {
+			background-color: #F2F2F7;
+			width: fit-content;
+			padding: 4px 10px;
+			margin-top: 10px;
+			cursor: pointer;
+			border-radius: 4px;
+			margin-right: 20px;
+			margin-bottom: 20px;
+		}
+
+		.city-box-lists-item-titles:hover {
+			background-color: #00DD9A;
+			color: #FFFFFF;
+		}
+	}
 </style>