From 99a7a6c2cd57cbc9739e76be27dfdb9fdea7a599 Mon Sep 17 00:00:00 2001
From: helen <zhushui060631@163.com>
Date: Tue, 17 Dec 2024 16:11:00 +0800
Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=86=B2=E7=AA=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/api/manage/hotel/index.ts            |  63 ++++
 src/api/manage/hotel/types.ts            | 156 +++++++++
 src/views/manage/accommodation/index.vue | 400 -----------------------
 src/views/manage/hotel/index.vue         | 265 +++++++++++++++
 src/views/manage/noteManage/index.vue    |   9 +
 5 files changed, 493 insertions(+), 400 deletions(-)
 create mode 100644 src/api/manage/hotel/index.ts
 create mode 100644 src/api/manage/hotel/types.ts
 delete mode 100644 src/views/manage/accommodation/index.vue
 create mode 100644 src/views/manage/hotel/index.vue

diff --git a/src/api/manage/hotel/index.ts b/src/api/manage/hotel/index.ts
new file mode 100644
index 0000000..8772738
--- /dev/null
+++ b/src/api/manage/hotel/index.ts
@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { HotelVO, HotelForm, HotelQuery } from '@/api/manage/hotel/types';
+
+/**
+ * 查询住宿列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listHotel = (query?: HotelQuery): AxiosPromise<HotelVO[]> => {
+  return request({
+    url: '/manage/hotel/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询住宿详细
+ * @param id
+ */
+export const getHotel = (id: string | number): AxiosPromise<HotelVO> => {
+  return request({
+    url: '/manage/hotel/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增住宿
+ * @param data
+ */
+export const addHotel = (data: HotelForm) => {
+  return request({
+    url: '/manage/hotel',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改住宿
+ * @param data
+ */
+export const updateHotel = (data: HotelForm) => {
+  return request({
+    url: '/manage/hotel',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除住宿
+ * @param id
+ */
+export const delHotel = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/manage/hotel/' + id,
+    method: 'delete'
+  });
+};
diff --git a/src/api/manage/hotel/types.ts b/src/api/manage/hotel/types.ts
new file mode 100644
index 0000000..d737c29
--- /dev/null
+++ b/src/api/manage/hotel/types.ts
@@ -0,0 +1,156 @@
+export interface HotelVO {
+  /**
+   * 用户ID
+   */
+  id: string | number;
+
+  /**
+   * 住宿商家名称
+   */
+  name: string;
+
+  /**
+   * 联系方式
+   */
+  number: string;
+
+  /**
+   * 状态 0-未发布 1-审核中 2-发布
+   */
+  status: number;
+
+  /**
+   * 经度
+   */
+  longitude: number;
+
+  /**
+   * 纬度
+   */
+  latitude: number;
+
+  /**
+   * 省份编码
+   */
+  province: number;
+
+  /**
+   * 市级编码
+   */
+  city: number;
+
+  /**
+   * 区县编码
+   */
+  county: number;
+
+  /**
+   * 更新者
+   */
+  updateBy: number;
+
+  /**
+   * 更新时间
+   */
+  updateTime: string;
+
+}
+
+export interface HotelForm extends BaseEntity {
+  /**
+   * 用户ID
+   */
+  id?: string | number;
+
+  /**
+   * 住宿商家名称
+   */
+  name?: string;
+
+  /**
+   * 联系方式
+   */
+  number?: string;
+
+  /**
+   * 状态 0-未发布 1-审核中 2-发布
+   */
+  status?: number;
+
+  /**
+   * 经度
+   */
+  longitude?: number;
+
+  /**
+   * 纬度
+   */
+  latitude?: number;
+
+  /**
+   * 省份编码
+   */
+  province?: number;
+
+  /**
+   * 市级编码
+   */
+  city?: number;
+
+  /**
+   * 区县编码
+   */
+  county?: number;
+
+}
+
+export interface HotelQuery extends PageQuery {
+
+  /**
+   * 住宿商家名称
+   */
+  name?: string;
+
+  /**
+   * 联系方式
+   */
+  number?: string;
+
+  /**
+   * 状态 0-未发布 1-审核中 2-发布
+   */
+  status?: number;
+
+  /**
+   * 经度
+   */
+  longitude?: number;
+
+  /**
+   * 纬度
+   */
+  latitude?: number;
+
+  /**
+   * 省份编码
+   */
+  province?: number;
+
+  /**
+   * 市级编码
+   */
+  city?: number;
+
+  /**
+   * 区县编码
+   */
+  county?: number;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+
diff --git a/src/views/manage/accommodation/index.vue b/src/views/manage/accommodation/index.vue
deleted file mode 100644
index 1356937..0000000
--- a/src/views/manage/accommodation/index.vue
+++ /dev/null
@@ -1,400 +0,0 @@
-<template>
-  <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
-      <div v-show="showSearch" class="mb-[10px]">
-        <el-card shadow="hover">
-          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
-            <el-form-item label="住宿商家名称" prop="id">
-              <el-input v-model="queryParams.id" placeholder="请输入住宿商家名称" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-            <el-form-item label="发布状态" prop="tagId">
-              <!-- <el-input v-model="queryParams.tagId" placeholder="请输入标签" clearable @keyup.enter="handleQuery" /> -->
-              <el-select v-model="queryParams.tagId" placeholder="请选择发布状态" style="width: 240px" @keyup.enter="handleQuery">
-                <el-option v-for="item in statusoptions" :key="item.value" :label="item.label" :value="item.value" />
-              </el-select>
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-            </el-form-item>
-          </el-form>
-        </el-card>
-      </div>
-    </transition>
-
-    <el-card shadow="never">
-      <template #header>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button v-hasPermi="['manage:notebook:add']" type="primary" plain icon="Plus" @click="handleAdd">新增 </el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button v-hasPermi="['manage:notebook:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"
-              >修改
-            </el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button v-hasPermi="['manage:notebook:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"
-              >删除
-            </el-button>
-          </el-col>
-          <!-- <el-col :span="1.5">
-            <el-button v-hasPermi="['manage:notebook:export']" type="warning" plain icon="Download"
-              @click="handleExport">导出 </el-button>
-          </el-col> -->
-          <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar>
-        </el-row>
-      </template>
-
-      <el-table v-loading="loading" :data="notebookList" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column v-if="true" label="ID" align="center" prop="id" />
-        <el-table-column label="住宿商家名称" align="center" prop="title" />
-        <el-table-column label="商家图片" align="center" prop="cover">
-          <template #default="scope">
-            <image-preview :src="scope.row.cover" :width="50" :height="50" />
-            <!-- <image-preview :src="scope.row.productImageUrl" /> -->
-          </template>
-        </el-table-column>
-        <el-table-column label="商家地理位置" align="center" prop="cover" />
-        <el-table-column label="联系方式" align="center" prop="status" />
-        <el-table-column label="发布状态" align="center" prop="status">
-          <template #default="scope">
-            <el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag>
-            <el-tag v-if="scope.row.status == 1" type="success">审核中</el-tag>
-            <el-tag v-if="scope.row.status == 2" type="primary">发布</el-tag>
-
-            <!-- <image-preview :src="scope.row.productImageUrl" /> -->
-          </template>
-        </el-table-column>
-        <el-table-column label="操作人" align="center" prop="updateByName" show-overflow-tooltip />
-        <el-table-column label="操作时间" align="center" prop="updateTime" width="200px" />
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-          <template #default="scope">
-            <el-tooltip content="编辑" placement="top">
-              <el-button v-hasPermi="['manage:notebook:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="发布" placement="top">
-              <el-button v-hasPermi="['manage:notebook:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['manage:notebook:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-            </el-tooltip>
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
-    </el-card>
-    <!-- 添加或修改笔记对话框 -->
-    <el-dialog v-model="dialog.visible" :title="dialog.title" width="60%" append-to-body>
-      <el-form ref="notebookFormRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="住宿商家名称" prop="title">
-          <el-input v-model="form.title" placeholder="请输入住宿商家名称" style="width: 300px" />
-        </el-form-item>
-        <el-form-item label="联系电话" prop="tagId">
-          <el-input v-model="form.tagId" placeholder="请输入联系电话" />
-        </el-form-item>
-        <el-form-item label="商家照片" prop="cover">
-          <imageUpload :model-value="form.cover" :file-size="20" />
-        </el-form-item>
-        <el-form-item label="地理位置" prop="introduce">
-          <el-input v-model="searchLocation" type="text" placeholder="请输入地址信息" @keyup.enter="debouncedSearch" />
-        </el-form-item>
-        <tlbs-map
-          ref="map"
-          style="margin-left: 80px"
-          api-key="
-6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO"
-          :center="center"
-          :zoom="zoom"
-          :control="control"
-          @click="onClick"
-        >
-          <tlbs-multi-marker :geometries="geometries" :styles="styles" :options="mapoptions" />
-        </tlbs-map>
-      </el-form>
-      <template #footer>
-        <div style="display: flex; justify-content: space-between">
-          <div>
-            <el-button :loading="buttonLoading" type="primary" @click="submitForm">预 览</el-button>
-            <el-button @click="cancel">存草稿</el-button>
-          </div>
-          <div>
-            <el-button @click="cancel">取 消</el-button>
-            <el-button :loading="buttonLoading" type="primary" @click="submitForm">提 交</el-button>
-          </div>
-        </div>
-      </template>
-    </el-dialog>
-    <!--    笔记详情-->
-    <el-dialog v-model="concentdialog.visible" title="笔记详情" width="50%" append-to-body>
-      <div>{{ form.title }}</div>
-      <div>{{ form.content }}</div>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup name="Notebook" lang="ts">
-import { listNotebook, getNotebook, delNotebook, addNotebook, updateNotebook } from '@/api/manage/notebook';
-import { NotebookVO, NotebookQuery, NotebookForm } from '@/api/manage/notebook/types';
-import { debounce } from '@/utils/debounce';
-import { jsonp } from 'vue-jsonp';
-const map = ref(null);
-const center = ref({ lat: 39.145902, lng: 117.17546 });
-const zoom = ref(20);
-const onClick = (e: Event) => {
-  console.log(e);
-};
-const control = reactive({
-  scale: {},
-  zoom: {
-    position: 'topLeft'
-  }
-});
-const searchLocation = ref(''); // 搜索地点
-
-const geometries = ref([{ styleId: 'marker', position: { lat: 39.145902, lng: 117.17546 } }]);
-const styles = reactive({
-  marker: {
-    width: 20,
-    height: 30,
-    anchor: { x: 10, y: 30 }
-  }
-});
-const mapoptions = reactive({
-  minZoom: 5,
-  maxZoom: 20
-});
-//输入位置,搜索位置
-const performSearch = async (text) => {
-  // 这里简单模拟延迟,模拟真实的异步请求耗时
-  // await new Promise((resolve) => setTimeout(resolve, 500));
-  // 假设这里根据输入的文本去查找匹配的数据,实际中替换成真实逻辑
-  if (text === '') {
-    console.log('搜索内容为空');
-  } else {
-    console.log('搜索内容为:', text);
-    // 调用腾讯地图API进行搜索,并展示在地图上
-    // geocoder(text).then((result) => {
-    //   console.log(result);
-    // });
-    jsonp('https://apis.map.qq.com/ws/geocoder/v1', {
-      address: text,
-      key: '6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO',
-      output: 'jsonp'
-    }).then((data) => {
-      console.log(data);
-      center.value.lat = data.result.location.lat;
-      center.value.lng = data.result.location.lng;
-      geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }];
-      console.log(map.value);
-    });
-  }
-};
-const debouncedSearch = debounce(performSearch, 300); // 创建防抖后的搜索函数,延迟设为300毫秒
-
-// 监听输入框内容变化,调用防抖后的搜索函数
-watch(searchLocation, (newValue) => {
-  debouncedSearch(newValue);
-});
-const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-
-const notebookList = ref<NotebookVO[]>([]);
-const buttonLoading = ref(false);
-const loading = ref(true);
-const showSearch = ref(true);
-const ids = ref<Array<string | number>>([]);
-const single = ref(true);
-const multiple = ref(true);
-const total = ref(0);
-
-const queryFormRef = ref<ElFormInstance>();
-const notebookFormRef = ref<ElFormInstance>();
-const value = ref('');
-
-const options = [
-  {
-    value: 'Option1',
-    label: 'Option1'
-  },
-  {
-    value: 'Option2',
-    label: 'Option2'
-  },
-  {
-    value: 'Option3',
-    label: 'Option3'
-  },
-  {
-    value: 'Option4',
-    label: 'Option4'
-  },
-  {
-    value: 'Option5',
-    label: 'Option5'
-  }
-];
-const statusoptions = [
-  {
-    value: '1',
-    label: '全部'
-  },
-  {
-    value: '2',
-    label: '已发布'
-  },
-  {
-    value: '3',
-    label: '未发布'
-  }
-];
-const dialog = reactive<DialogOption>({
-  visible: false,
-  title: ''
-});
-const concentdialog = reactive<DialogOption>({
-  visible: false
-});
-const initFormData: NotebookForm = {
-  id: undefined,
-  userid: undefined,
-  title: undefined,
-  content: undefined,
-  cover: undefined,
-  status: undefined,
-  tagId: undefined
-};
-const data = reactive<PageData<NotebookForm, NotebookQuery>>({
-  form: { ...initFormData },
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    id: undefined,
-    userid: undefined,
-    title: undefined,
-    content: undefined,
-    cover: undefined,
-    status: undefined,
-    tagId: undefined,
-    params: {}
-  },
-  rules: {
-    id: [{ required: true, message: '笔记ID不能为空', trigger: 'blur' }],
-    title: [{ required: true, message: '攻略名称不能为空', trigger: 'blur' }],
-    content: [{ required: true, message: '攻略内容不能为空', trigger: 'blur' }],
-    cover: [{ required: true, message: '笔记封面不能为空', trigger: 'blur' }],
-    status: [{ required: true, message: '帐号状态不能为空', trigger: 'change' }],
-    tagId: [{ required: true, message: '标签不能为空', trigger: 'blur' }],
-    longitude: [{ required: true, message: '经度不能为空', trigger: 'blur' }],
-    latitude: [{ required: true, message: '纬度不能为空', trigger: 'blur' }]
-  }
-});
-
-const { queryParams, form, rules } = toRefs(data);
-
-/** 查询笔记列表 */
-const getList = async () => {
-  loading.value = true;
-  const res = await listNotebook(queryParams.value);
-  notebookList.value = res.rows;
-  total.value = res.total;
-  loading.value = false;
-};
-
-/** 取消按钮 */
-const cancel = () => {
-  reset();
-  dialog.visible = false;
-};
-
-/** 表单重置 */
-const reset = () => {
-  form.value = { ...initFormData };
-  notebookFormRef.value?.resetFields();
-};
-
-/** 搜索按钮操作 */
-const handleQuery = () => {
-  queryParams.value.pageNum = 1;
-  getList();
-};
-
-/** 重置按钮操作 */
-const resetQuery = () => {
-  queryFormRef.value?.resetFields();
-  handleQuery();
-};
-
-/** 多选框选中数据 */
-const handleSelectionChange = (selection: NotebookVO[]) => {
-  ids.value = selection.map((item) => item.id);
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
-};
-
-/** 新增按钮操作 */
-const handleAdd = () => {
-  reset();
-  dialog.visible = true;
-  dialog.title = '添加住宿商家';
-};
-
-/** 修改按钮操作 */
-const handleUpdate = async (row?: NotebookVO) => {
-  reset();
-  const _id = row?.id || ids.value[0];
-  const res = await getNotebook(_id);
-  Object.assign(form.value, res.data);
-  dialog.visible = true;
-  dialog.title = '修改住宿商家';
-};
-const contenttext = async (row?: NotebookVO) => {
-  const _id = row?.id;
-  const res = await getNotebook(_id);
-  Object.assign(form.value, res.data);
-  concentdialog.visible = true;
-};
-/** 提交按钮 */
-const submitForm = () => {
-  notebookFormRef.value?.validate(async (valid: boolean) => {
-    if (valid) {
-      buttonLoading.value = true;
-      if (form.value.id) {
-        await updateNotebook(form.value).finally(() => (buttonLoading.value = false));
-      } else {
-        await addNotebook(form.value).finally(() => (buttonLoading.value = false));
-      }
-      console.log(form.value.cover);
-
-      proxy?.$modal.msgSuccess('操作成功');
-      // dialog.visible = false;
-      await getList();
-    }
-  });
-};
-
-/** 删除按钮操作 */
-const handleDelete = async (row?: NotebookVO) => {
-  const _ids = row?.id || ids.value;
-  await proxy?.$modal.confirm('是否确认删除笔记编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
-  await delNotebook(_ids);
-  proxy?.$modal.msgSuccess('删除成功');
-  await getList();
-};
-
-/** 导出按钮操作 */
-const handleExport = () => {
-  proxy?.download(
-    'manage/notebook/export',
-    {
-      ...queryParams.value
-    },
-    `notebook_${new Date().getTime()}.xlsx`
-  );
-};
-
-onMounted(() => {
-  getList();
-});
-</script>
diff --git a/src/views/manage/hotel/index.vue b/src/views/manage/hotel/index.vue
new file mode 100644
index 0000000..dc07b9c
--- /dev/null
+++ b/src/views/manage/hotel/index.vue
@@ -0,0 +1,265 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="120px">
+            <el-form-item label="住宿商家名称" prop="name">
+              <el-input v-model="queryParams.name" placeholder="请输入住宿商家名称" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="发布状态" prop="status">
+              <el-select v-model="queryParams.tagId" placeholder="请选择发布状态" style="width: 200px" @keyup.enter="handleQuery">
+                <el-option label="未发布" value="0" />
+                <el-option label="审核中" value="1" />
+                <el-option label="已发布" value="2" />
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button v-hasPermi="['manage:hotel:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button v-hasPermi="['manage:hotel:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button v-hasPermi="['manage:hotel:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"
+              >删除</el-button
+            >
+          </el-col>
+          <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" :data="hotelList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column v-if="true" label="用户ID" align="center" prop="id" />
+        <el-table-column label="住宿商家名称" align="center" prop="name" />
+        <el-table-column label="商家图片" align="center" prop="name" />
+        <el-table-column label="商家地理位置" align="center" prop="name" />
+        <el-table-column label="联系方式" align="center" prop="number" />
+        <el-table-column label="状态" align="center" prop="status">
+          <template #default="scope">
+            <el-tag v-if="scope.roe.status == 2" type="primary">已发布</el-tag>
+            <el-tag v-if="scope.roe.status == 1" type="success">审核中</el-tag>
+            <el-tag v-if="scope.roe.status == 0" type="info">未发布</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="更新者" align="center" prop="updateBy" />
+        <el-table-column label="更新时间" align="center" prop="updateTime" width="180">
+          <template #default="scope">
+            <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-tooltip content="修改" placement="top">
+              <el-button v-hasPermi="['manage:hotel:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
+            </el-tooltip>
+            <el-tooltip content="删除" placement="top">
+              <el-button v-hasPermi="['manage:hotel:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改住宿对话框 -->
+    <el-dialog v-model="dialog.visible" :title="dialog.title" width="50%" append-to-body>
+      <el-form ref="hotelFormRef" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="住宿商家名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入住宿商家名称" style="width: 300px" />
+        </el-form-item>
+        <el-form-item label="联系电话" prop="number">
+          <el-input v-model="form.number" placeholder="请输入联系电话" style="width: 300px" />
+        </el-form-item>
+        <el-form-item label="商家图片" prop="number">
+          <el-input v-model="form.number" placeholder="请输入商家图片" style="width: 300px" />
+        </el-form-item>
+        <el-form-item label="商家地理位置" prop="number">
+          <el-input v-model="form.number" placeholder="请输入商家地理位置" style="width: 300px" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Hotel" lang="ts">
+import { listHotel, getHotel, delHotel, addHotel, updateHotel } from '@/api/manage/hotel';
+import { HotelVO, HotelQuery, HotelForm } from '@/api/manage/hotel/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const hotelList = ref<HotelVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+
+const queryFormRef = ref<ElFormInstance>();
+const hotelFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: HotelForm = {
+  id: undefined,
+  name: undefined,
+  number: undefined,
+  status: undefined,
+  longitude: undefined,
+  latitude: undefined,
+  province: undefined,
+  city: undefined,
+  county: undefined
+};
+const data = reactive<PageData<HotelForm, HotelQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    name: undefined,
+    number: undefined,
+    status: undefined,
+    longitude: undefined,
+    latitude: undefined,
+    province: undefined,
+    city: undefined,
+    county: undefined,
+    params: {}
+  },
+  rules: {
+    id: [{ required: true, message: '用户ID不能为空', trigger: 'blur' }],
+    name: [{ required: true, message: '住宿商家名称不能为空', trigger: 'blur' }],
+    number: [{ required: true, message: '联系方式不能为空', trigger: 'blur' }],
+    status: [{ required: true, message: '状态 0-未发布 1-审核中 2-发布不能为空', trigger: 'change' }],
+    longitude: [{ required: true, message: '经度不能为空', trigger: 'blur' }],
+    latitude: [{ required: true, message: '纬度不能为空', trigger: 'blur' }],
+    province: [{ required: true, message: '省份编码不能为空', trigger: 'blur' }],
+    city: [{ required: true, message: '市级编码不能为空', trigger: 'blur' }],
+    county: [{ required: true, message: '区县编码不能为空', trigger: 'blur' }]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询住宿列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listHotel(queryParams.value);
+  hotelList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  hotelFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: HotelVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = '添加住宿';
+};
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: HotelVO) => {
+  reset();
+  const _id = row?.id || ids.value[0];
+  const res = await getHotel(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = '修改住宿';
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  hotelFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateHotel(form.value).finally(() => (buttonLoading.value = false));
+      } else {
+        await addHotel(form.value).finally(() => (buttonLoading.value = false));
+      }
+      proxy?.$modal.msgSuccess('操作成功');
+      dialog.visible = false;
+      await getList();
+    }
+  });
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: HotelVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除住宿编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delHotel(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'manage/hotel/export',
+    {
+      ...queryParams.value
+    },
+    `hotel_${new Date().getTime()}.xlsx`
+  );
+};
+
+onMounted(() => {
+  getList();
+});
+</script>
diff --git a/src/views/manage/noteManage/index.vue b/src/views/manage/noteManage/index.vue
index 858c614..e948de1 100644
--- a/src/views/manage/noteManage/index.vue
+++ b/src/views/manage/noteManage/index.vue
@@ -91,9 +91,18 @@
         <el-table-column label="操作时间" align="center" prop="updateTime" width="200px" />
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
+<<<<<<< HEAD
             <el-tooltip content="修改" placement="top">
               <el-button v-hasPermi="['manage:notebook:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
             </el-tooltip>
+=======
+            <el-tooltip content="编辑" placement="top">
+              <el-button v-hasPermi="['manage:notebook:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
+            </el-tooltip>
+<!--            <el-tooltip content="发布" placement="top">-->
+<!--              <el-button v-hasPermi="['manage:notebook:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>-->
+<!--            </el-tooltip>-->
+>>>>>>> 59bcf39 (住宿管理)
             <el-tooltip content="删除" placement="top">
               <el-button v-hasPermi="['manage:notebook:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
             </el-tooltip>