diff --git a/src/api/portal/city/index.ts b/src/api/portal/city/index.ts
new file mode 100644
index 0000000..0a45c20
--- /dev/null
+++ b/src/api/portal/city/index.ts
@@ -0,0 +1,41 @@
+import request from '@/config/axios'
+
+// 城市 VO
+export interface CityVO {
+ id: number // 主键ID
+ name: string // 城市名称
+ code: string // 城市编码
+}
+
+// 城市 API
+export const CityApi = {
+ // 查询城市分页
+ getCityPage: async (params: any) => {
+ return await request.get({ url: `/portal/city/page`, params })
+ },
+
+ // 查询城市详情
+ getCity: async (id: number) => {
+ return await request.get({ url: `/portal/city/get?id=` + id })
+ },
+
+ // 新增城市
+ createCity: async (data: CityVO) => {
+ return await request.post({ url: `/portal/city/create`, data })
+ },
+
+ // 修改城市
+ updateCity: async (data: CityVO) => {
+ return await request.put({ url: `/portal/city/update`, data })
+ },
+
+ // 删除城市
+ deleteCity: async (id: number) => {
+ return await request.delete({ url: `/portal/city/delete?id=` + id })
+ },
+
+ // 导出城市 Excel
+ exportCity: async (params) => {
+ return await request.download({ url: `/portal/city/export-excel`, params })
+ }
+}
\ No newline at end of file
diff --git a/src/api/portal/jobcategory/index.ts b/src/api/portal/jobcategory/index.ts
new file mode 100644
index 0000000..fdb8561
--- /dev/null
+++ b/src/api/portal/jobcategory/index.ts
@@ -0,0 +1,41 @@
+import request from '@/config/axios'
+
+// 职位类别 VO
+export interface JobCategoryVO {
+ id: number // 主键ID
+ name: string // 类别名称
+ parentId: number // 父类别ID
+}
+
+// 职位类别 API
+export const JobCategoryApi = {
+ // 查询职位类别分页
+ getJobCategoryPage: async (params: any) => {
+ return await request.get({ url: `/portal/job-category/page`, params })
+ },
+
+ // 查询职位类别详情
+ getJobCategory: async (id: number) => {
+ return await request.get({ url: `/portal/job-category/get?id=` + id })
+ },
+
+ // 新增职位类别
+ createJobCategory: async (data: JobCategoryVO) => {
+ return await request.post({ url: `/portal/job-category/create`, data })
+ },
+
+ // 修改职位类别
+ updateJobCategory: async (data: JobCategoryVO) => {
+ return await request.put({ url: `/portal/job-category/update`, data })
+ },
+
+ // 删除职位类别
+ deleteJobCategory: async (id: number) => {
+ return await request.delete({ url: `/portal/job-category/delete?id=` + id })
+ },
+
+ // 导出职位类别 Excel
+ exportJobCategory: async (params) => {
+ return await request.download({ url: `/portal/job-category/export-excel`, params })
+ }
+}
\ No newline at end of file
diff --git a/src/api/portal/jobpost/index.ts b/src/api/portal/jobpost/index.ts
new file mode 100644
index 0000000..5c310ce
--- /dev/null
+++ b/src/api/portal/jobpost/index.ts
@@ -0,0 +1,45 @@
+import request from '@/config/axios'
+
+// 职位 VO
+export interface JobPostVO {
+ id: number // 主键ID
+ title: string // 职位标题
+ description: string // 职位描述
+ requirement: string // 职位要求
+ cityId: number // 城市ID
+ jobCategoryId: number // 职位类别ID
+ publishTime: Date // 发布时间
+}
+
+// 职位 API
+export const JobPostApi = {
+ // 查询职位分页
+ getJobPostPage: async (params: any) => {
+ return await request.get({ url: `/portal/job-post/page`, params })
+ },
+
+ // 查询职位详情
+ getJobPost: async (id: number) => {
+ return await request.get({ url: `/portal/job-post/get?id=` + id })
+ },
+
+ // 新增职位
+ createJobPost: async (data: JobPostVO) => {
+ return await request.post({ url: `/portal/job-post/create`, data })
+ },
+
+ // 修改职位
+ updateJobPost: async (data: JobPostVO) => {
+ return await request.put({ url: `/portal/job-post/update`, data })
+ },
+
+ // 删除职位
+ deleteJobPost: async (id: number) => {
+ return await request.delete({ url: `/portal/job-post/delete?id=` + id })
+ },
+
+ // 导出职位 Excel
+ exportJobPost: async (params) => {
+ return await request.download({ url: `/portal/job-post/export-excel`, params })
+ }
+}
\ No newline at end of file
diff --git a/src/api/portal/news/index.ts b/src/api/portal/news/index.ts
new file mode 100644
index 0000000..78565c6
--- /dev/null
+++ b/src/api/portal/news/index.ts
@@ -0,0 +1,46 @@
+import request from '@/config/axios'
+
+// 新闻 VO
+export interface NewsVO {
+ id: number // 主键ID
+ newsTitle: string // 新闻标题
+ newsDesc: string // 新闻描述
+ newsContent: string // 新闻内容
+ newsPath: string // 新闻路径
+ coverImg: string // 封面图片
+ newsTypeId: number // 新闻类型ID
+ publishTime: Date // 发布时间
+}
+
+// 新闻 API
+export const NewsApi = {
+ // 查询新闻分页
+ getNewsPage: async (params: any) => {
+ return await request.get({ url: `/portal/news/page`, params })
+ },
+
+ // 查询新闻详情
+ getNews: async (id: number) => {
+ return await request.get({ url: `/portal/news/get?id=` + id })
+ },
+
+ // 新增新闻
+ createNews: async (data: NewsVO) => {
+ return await request.post({ url: `/portal/news/create`, data })
+ },
+
+ // 修改新闻
+ updateNews: async (data: NewsVO) => {
+ return await request.put({ url: `/portal/news/update`, data })
+ },
+
+ // 删除新闻
+ deleteNews: async (id: number) => {
+ return await request.delete({ url: `/portal/news/delete?id=` + id })
+ },
+
+ // 导出新闻 Excel
+ exportNews: async (params) => {
+ return await request.download({ url: `/portal/news/export-excel`, params })
+ }
+}
\ No newline at end of file
diff --git a/src/api/portal/newstype/index.ts b/src/api/portal/newstype/index.ts
new file mode 100644
index 0000000..e68f177
--- /dev/null
+++ b/src/api/portal/newstype/index.ts
@@ -0,0 +1,40 @@
+import request from '@/config/axios'
+
+// 新闻类型 VO
+export interface NewsTypeVO {
+ id: number // 主键ID
+ typeName: string // 类型名称
+}
+
+// 新闻类型 API
+export const NewsTypeApi = {
+ // 查询新闻类型分页
+ getNewsTypePage: async (params: any) => {
+ return await request.get({ url: `/portal/news-type/page`, params })
+ },
+
+ // 查询新闻类型详情
+ getNewsType: async (id: number) => {
+ return await request.get({ url: `/portal/news-type/get?id=` + id })
+ },
+
+ // 新增新闻类型
+ createNewsType: async (data: NewsTypeVO) => {
+ return await request.post({ url: `/portal/news-type/create`, data })
+ },
+
+ // 修改新闻类型
+ updateNewsType: async (data: NewsTypeVO) => {
+ return await request.put({ url: `/portal/news-type/update`, data })
+ },
+
+ // 删除新闻类型
+ deleteNewsType: async (id: number) => {
+ return await request.delete({ url: `/portal/news-type/delete?id=` + id })
+ },
+
+ // 导出新闻类型 Excel
+ exportNewsType: async (params) => {
+ return await request.download({ url: `/portal/news-type/export-excel`, params })
+ }
+}
\ No newline at end of file
diff --git a/src/api/portal/user/index.ts b/src/api/portal/user/index.ts
new file mode 100644
index 0000000..059b8fe
--- /dev/null
+++ b/src/api/portal/user/index.ts
@@ -0,0 +1,42 @@
+import request from '@/config/axios'
+
+// 用户 VO
+export interface UserVO {
+ id: number // 主键ID
+ username: string // 用户名
+ password: string // 密码
+ token: string // 登录token
+}
+
+// 用户 API
+export const UserApi = {
+ // 查询用户分页
+ getUserPage: async (params: any) => {
+ return await request.get({ url: `/portal/user/page`, params })
+ },
+
+ // 查询用户详情
+ getUser: async (id: number) => {
+ return await request.get({ url: `/portal/user/get?id=` + id })
+ },
+
+ // 新增用户
+ createUser: async (data: UserVO) => {
+ return await request.post({ url: `/portal/user/create`, data })
+ },
+
+ // 修改用户
+ updateUser: async (data: UserVO) => {
+ return await request.put({ url: `/portal/user/update`, data })
+ },
+
+ // 删除用户
+ deleteUser: async (id: number) => {
+ return await request.delete({ url: `/portal/user/delete?id=` + id })
+ },
+
+ // 导出用户 Excel
+ exportUser: async (params) => {
+ return await request.download({ url: `/portal/user/export-excel`, params })
+ }
+}
\ No newline at end of file
diff --git a/src/views/portal/city/CityForm.vue b/src/views/portal/city/CityForm.vue
new file mode 100644
index 0000000..94d1cd8
--- /dev/null
+++ b/src/views/portal/city/CityForm.vue
@@ -0,0 +1,98 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/views/portal/city/index.vue b/src/views/portal/city/index.vue
new file mode 100644
index 0000000..f258f87
--- /dev/null
+++ b/src/views/portal/city/index.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/portal/jobcategory/JobCategoryForm.vue b/src/views/portal/jobcategory/JobCategoryForm.vue
new file mode 100644
index 0000000..84c148b
--- /dev/null
+++ b/src/views/portal/jobcategory/JobCategoryForm.vue
@@ -0,0 +1,97 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/views/portal/jobcategory/index.vue b/src/views/portal/jobcategory/index.vue
new file mode 100644
index 0000000..d37a271
--- /dev/null
+++ b/src/views/portal/jobcategory/index.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/portal/jobpost/JobPostForm.vue b/src/views/portal/jobpost/JobPostForm.vue
new file mode 100644
index 0000000..e689eeb
--- /dev/null
+++ b/src/views/portal/jobpost/JobPostForm.vue
@@ -0,0 +1,124 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/views/portal/jobpost/index.vue b/src/views/portal/jobpost/index.vue
new file mode 100644
index 0000000..ae41d51
--- /dev/null
+++ b/src/views/portal/jobpost/index.vue
@@ -0,0 +1,241 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/portal/news/NewsForm.vue b/src/views/portal/news/NewsForm.vue
new file mode 100644
index 0000000..b3f0e6b
--- /dev/null
+++ b/src/views/portal/news/NewsForm.vue
@@ -0,0 +1,130 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/views/portal/news/index.vue b/src/views/portal/news/index.vue
new file mode 100644
index 0000000..d754179
--- /dev/null
+++ b/src/views/portal/news/index.vue
@@ -0,0 +1,252 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/portal/newstype/NewsTypeForm.vue b/src/views/portal/newstype/NewsTypeForm.vue
new file mode 100644
index 0000000..d3c610d
--- /dev/null
+++ b/src/views/portal/newstype/NewsTypeForm.vue
@@ -0,0 +1,92 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/views/portal/newstype/index.vue b/src/views/portal/newstype/index.vue
new file mode 100644
index 0000000..a6dedb3
--- /dev/null
+++ b/src/views/portal/newstype/index.vue
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/portal/user/UserForm.vue b/src/views/portal/user/UserForm.vue
new file mode 100644
index 0000000..aa1b2dc
--- /dev/null
+++ b/src/views/portal/user/UserForm.vue
@@ -0,0 +1,103 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/views/portal/user/index.vue b/src/views/portal/user/index.vue
new file mode 100644
index 0000000..38fd84b
--- /dev/null
+++ b/src/views/portal/user/index.vue
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file