瀏覽代碼

跟新公司后台管理平台

丁烨烨 5 月之前
父節點
當前提交
2904a3df49
共有 10 個文件被更改,包括 678 次插入56 次删除
  1. 2 1
      .env.development
  2. 1 1
      index.html
  3. 6 6
      package.json
  4. 二進制
      public/logo.png
  5. 5 5
      src/store/modules/user.js
  6. 121 38
      src/views/gwnrgl/cpzx/index.vue
  7. 504 0
      src/views/gwnrgl/dwgl/index.vue
  8. 36 2
      src/views/gwnrgl/xwgl/index.vue
  9. 1 1
      src/views/kfxt/kf/index.vue
  10. 2 2
      vite.config.js

+ 2 - 1
.env.development

@@ -7,6 +7,7 @@ VITE_APP_ENV = 'development'
 # 中科盛阳管理系统/开发环境
 VITE_APP_BASE_API = '/dev-api'
 
-VITE_APP_BASE_URL = 'http://localhost:8040'
+//VITE_APP_BASE_URL = 'http://localhost:8040'
+VITE_APP_BASE_URL = 'http://192.168.110.235:8040'
 
 VITE_APP_BASE_WS_URL = 'ws://localhost:8081/ws'

+ 1 - 1
index.html

@@ -6,7 +6,7 @@
   <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
   <meta name="renderer" content="webkit">
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-  <link rel="icon" href="/favicon.ico">
+  <link rel="icon" href="/logo.png">
   <title>中科盛阳管理系统</title>
   <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
   <style>

+ 6 - 6
package.json

@@ -1,8 +1,8 @@
 {
-  "name": "ruoyi",
+  "name": "zksy",
   "version": "3.9.0",
   "description": "中科盛阳管理系统",
-  "author": "若依",
+  "author": "中科盛阳信息科技有限公司",
   "license": "MIT",
   "type": "module",
   "scripts": {
@@ -19,10 +19,10 @@
     "@element-plus/icons-vue": "2.3.1",
     "@vueup/vue-quill": "1.2.0",
     "@vueuse/core": "13.3.0",
-    "axios": "1.9.0",
+    "axios": "1.12.0",
     "clipboard": "2.0.11",
     "echarts": "5.6.0",
-    "element-plus": "2.10.7",
+    "element-plus": "2.11.3",
     "file-saver": "2.0.5",
     "fuse.js": "6.6.2",
     "js-beautify": "1.14.11",
@@ -41,10 +41,10 @@
   "devDependencies": {
     "@vitejs/plugin-vue": "5.2.4",
     "sass-embedded": "1.89.1",
-    "unocss": "^66.5.1",
+    "unocss": "^66.5.10",
     "unplugin-auto-import": "0.18.6",
     "unplugin-vue-setup-extend-plus": "1.0.1",
-    "vite": "6.3.5",
+    "vite": "7.1.11",
     "vite-plugin-compression": "0.5.1",
     "vite-plugin-svg-icons": "2.0.1"
   },

二進制
public/logo.png


+ 5 - 5
src/store/modules/user.js

@@ -54,11 +54,11 @@ const useUserStore = defineStore(
             this.nickName = user.nickName
             this.avatar = avatar
             /* 初始密码提示 */
-            if(res.isDefaultModifyPwd) {
-              ElMessageBox.confirm('您的密码还是初始密码,请修改密码!',  '安全提示', {  confirmButtonText: '确定',  cancelButtonText: '取消',  type: 'warning' }).then(() => {
-                router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
-              }).catch(() => {})
-            }
+            // if(res.isDefaultModifyPwd) {
+            //   ElMessageBox.confirm('您的密码还是初始密码,请修改密码!',  '安全提示', {  confirmButtonText: '确定',  cancelButtonText: '取消',  type: 'warning' }).then(() => {
+            //     router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
+            //   }).catch(() => {})
+            // }
             /* 过期密码提示 */
             if(!res.isDefaultModifyPwd && res.isPasswordExpired) {
               ElMessageBox.confirm('您的密码已过期,请尽快修改密码!',  '安全提示', {  confirmButtonText: '确定',  cancelButtonText: '取消',  type: 'warning' }).then(() => {

+ 121 - 38
src/views/gwnrgl/cpzx/index.vue

@@ -58,6 +58,9 @@ const formData = reactive({
   productName: '',
   productDetails: '',
   productUrl: '',
+  isCore: 0,
+  productIntroduction:'',
+  productScene:''
 })
 
 const quillOptions = {
@@ -84,22 +87,65 @@ const quillOptions = {
   placeholder: '请输入产品详情...',
 }
 
+
+// const getImagesFromContent = (content) => {
+//   if (!content) return []
+//
+//   const delta = typeof content === 'string' ?
+//       quillRef.value?.clipboard?.convert(content) :
+//       content
+//   const images = []
+//
+//   if (delta && delta.ops) {
+//     delta.ops.forEach(op => {
+//       if (op.insert && op.insert.image) {
+//         images.push(op.insert.image)
+//       }
+//     })
+//   }
+//
+//   return images
+// }
+
 // 新增:获取富文本中的所有图片
 const getImagesFromContent = (content) => {
   if (!content) return []
 
-  const delta = typeof content === 'string' ?
-      quillRef.value?.clipboard?.convert(content) :
-      content
-
+  let delta = null
+  // 分两种情况处理:HTML字符串 / Quill Delta对象
+  if (typeof content === 'string') {
+    // 情况1:content是HTML字符串 → 优先用DOM解析提取图片,兼容Quill未初始化的场景
+    try {
+      // 创建临时DOM元素解析HTML
+      const tempDiv = document.createElement('div')
+      tempDiv.innerHTML = content
+      const imgElements = tempDiv.querySelectorAll('img')
+      // 直接提取所有img标签的src属性
+      return Array.from(imgElements).map(img => img.src).filter(src => src)
+    } catch (e) {
+      console.warn('解析HTML图片失败,降级使用Quill转换:', e)
+      // 降级方案:尝试用Quill的clipboard转换
+      if (quillRef.value?.clipboard) {
+        delta = quillRef.value.clipboard.convert(content) || { ops: [] }
+      } else {
+        return [] // Quill未初始化,直接返回空
+      }
+    }
+  } else {
+    // 情况2:content是Delta对象 → 直接使用
+    delta = content
+  }
+  // 处理Delta对象提取图片
   const images = []
-  if (delta && delta.ops) {
+  if (delta && delta.ops && Array.isArray(delta.ops)) {
     delta.ops.forEach(op => {
-      if (op.insert && op.insert.image) {
+      // 兼容Quill的image embed格式:op.insert是对象且包含image属性
+      if (op.insert && typeof op.insert === 'object' && op.insert.image) {
         images.push(op.insert.image)
       }
     })
   }
+
   return images
 }
 
@@ -122,8 +168,8 @@ const onEditorReady = (quill) => {
         ElMessage.error('请选择图片文件')
         return
       }
-      if (file.size > 5 * 1024 * 1024) {
-        ElMessage.error('图片大小不能超过5MB')
+      if (file.size > 10 * 1024 * 1024) {
+        ElMessage.error('图片大小不能超过10MB')
         return
       }
 
@@ -219,8 +265,8 @@ const handleCoverUpload = (event) => {
   }
 
   // 验证文件大小 (5MB)
-  if (file.size > 5 * 1024 * 1024) {
-    ElMessage.error('图片大小不能超过5MB')
+  if (file.size > 10 * 1024 * 1024) {
+    ElMessage.error('图片大小不能超过10MB')
     return
   }
 
@@ -295,7 +341,7 @@ const handleAdd = () => {
   dialogVisible.value = true
 }
 
-// 编辑新闻
+// 编辑产品
 const handleEdit = async (row) => {
   dialogTitle.value = '编辑产品'
   isEdit.value = true
@@ -305,10 +351,13 @@ const handleEdit = async (row) => {
     ElMessage.error(res.msg)
     return
   }
-  if(res.data.isSpecial){
-    res.data.isSpecial = 1
-  }else{
-    res.data.isSpecial = 0
+
+  console.log(1111,res.data.isCore)
+
+  if (res.data.isCore === '0') {
+    res.data.isCore = 0
+  } else {
+    res.data.isCore = 1
   }
   Object.assign(formData, res.data)
   coverFile.value = null
@@ -413,6 +462,10 @@ const handleSave = async () => {
     submitData.append('productType', formData.productType)
     submitData.append('productCategory', formData.productCategory)
     submitData.append('productDetails', formData.productDetails)
+    submitData.append('productModel', formData.productModel)
+    submitData.append('isCore', formData.isCore)
+    submitData.append('productIntroduction', formData.productIntroduction)
+    submitData.append('productScene', formData.productScene)
 
     // 如果有新的封面文件,添加到FormData
     if (coverFile.value) {
@@ -434,7 +487,7 @@ const handleSave = async () => {
       const actualInsertedImages = currentImages.filter(img => !originalImages.value.includes(img))
 
       // console.log('实际删除的图片:', actualDeletedImages)
-      // console.log('实际新增的图片:', actualInsertedImages)
+      console.log('实际新增的图片:', actualInsertedImages)
 
       // 发送图片变化信息给后端
       if (actualDeletedImages.length > 0) {
@@ -445,7 +498,7 @@ const handleSave = async () => {
       }
     } else {
       // 新增模式:所有图片都是新增的
-      const currentImages = getImagesFromContent(quillRef.value.getContents())
+      const currentImages = getImagesFromContent(quillRef.value.getContents());
       if (currentImages.length > 0) {
         submitData.append('insertedImages', JSON.stringify(currentImages))
       }
@@ -476,7 +529,6 @@ const handleSave = async () => {
     dialogVisible.value = false
     getList()
   } catch (error) {
-    console.error('保存失败:', error)
     ElMessage.error('保存失败')
   } finally {
     uploadLoading.value = false
@@ -491,6 +543,10 @@ const resetForm = () => {
     productCategory: '',
     productDetails: '',
     productUrl: '',
+    productModel: '',
+    isCore:0,
+    productIntroduction:'',
+    productScene:''
   })
   coverFile.value = null
   if (fileInputRef.value) {
@@ -541,10 +597,10 @@ const handleDialogClose = () => {
       <el-row :gutter="20">
         <el-col :span="6">
           <el-select
-            v-model="searchParams.productCategory"
-            placeholder="请选择产品分类"
-            clearable
-            @keyup.enter="getList"
+              v-model="searchParams.productCategory"
+              placeholder="请选择产品分类"
+              clearable
+              @keyup.enter="getList"
           >
             <el-option label="软件产品" value="软件产品"/>
             <el-option label="硬件产品" value="硬件产品"/>
@@ -552,18 +608,18 @@ const handleDialogClose = () => {
         </el-col>
         <el-col :span="6">
           <el-input
-            v-model="searchParams.productType"
-            placeholder="请输入产品类型"
-            clearable
-            @keyup.enter="getList"
+              v-model="searchParams.productType"
+              placeholder="请输入产品类型"
+              clearable
+              @keyup.enter="getList"
           />
         </el-col>
         <el-col :span="6">
           <el-input
-            v-model="searchParams.productName"
-            placeholder="请输入产品名称"
-            clearable
-            @keyup.enter="getList"
+              v-model="searchParams.productName"
+              placeholder="请输入产品名称"
+              clearable
+              @keyup.enter="getList"
           />
         </el-col>
         <el-col :span="6">
@@ -597,10 +653,18 @@ const handleDialogClose = () => {
         class="w-full"
     >
       <el-table-column type="selection" width="55"/>
-      <el-table-column prop="productCategory" label="产品分类" min-width="200"/>
-      <el-table-column prop="productType" label="产品类型" width="120" />
-      <el-table-column prop="productName" label="产品名称" width="120" />
-      <el-table-column prop="productUrl" label="产品封面" width="120">
+      <el-table-column prop="productCategory" label="产品分类"/>
+      <el-table-column prop="productType" label="产品类型"/>
+      <el-table-column prop="productModel" label="产品型号" width="220"/>
+      <el-table-column prop="productName" label="产品名称" width="320"/>
+      <el-table-column prop="isSpecial" label="核心产品" width="100">
+        <template #default="{ row }">
+          <el-tag :type="row.isCore === '1' ? 'danger' : 'info'">
+            {{ row.isCore === '1' ? '是' : '否' }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="productUrl" label="产品封面">
         <template #default="{ row }">
           <!-- 修改图片预览方式,使用自定义点击事件 -->
           <div v-if="row.productUrl" class="cursor-pointer" @click="handleImagePreview(row.productUrl)">
@@ -613,13 +677,13 @@ const handleDialogClose = () => {
           <span v-else class="text-gray-400">无图片</span>
         </template>
       </el-table-column>
-      <el-table-column prop="createBy" label="创建人" width="120"/>
-      <el-table-column prop="createTime" label="创建时间" width="180">
+      <el-table-column prop="createBy" label="创建人"/>
+      <el-table-column prop="createTime" label="创建时间">
         <template #default="{ row }">
           {{ row.createTime ? new Date(row.createTime).toLocaleString() : '-' }}
         </template>
       </el-table-column>
-      <el-table-column label="操作" width="200" fixed="right">
+      <el-table-column label="操作" width="300" fixed="right">
         <template #default="{ row }">
           <el-button size="small" @click="handleView(row)">
             <Eye class="w-4 h-4 mr-1"/>
@@ -672,6 +736,25 @@ const handleDialogClose = () => {
         <el-form-item label="产品名称" required>
           <el-input v-model="formData.productName" placeholder="请输入产品名称"/>
         </el-form-item>
+        <el-form-item label="产品描述" required>
+          <label for="name" class="text-white-100 text-sm font-medium text-gray-700">描述存在多条时请用“ · ”符号隔开</label>
+          <el-input v-model="formData.productIntroduction" placeholder="请输入产品描述"/>
+        </el-form-item>
+        <el-form-item label="使用场景" required>
+          <el-input v-model="formData.productScene" placeholder="请输入使用场景"/>
+        </el-form-item>
+        <el-form-item label="产品型号" required>
+          <el-input v-model="formData.productModel" placeholder="请输入产品型号"/>
+        </el-form-item>
+        <el-form-item label="核心产品">
+          <el-switch
+              v-model="formData.isCore"
+              :active-value="1"
+              :inactive-value="0"
+              active-text="是"
+              inactive-text="否"
+          />
+        </el-form-item>
 
         <!-- 修改新闻封面上传组件 -->
         <el-form-item label="产品封面">
@@ -727,7 +810,7 @@ const handleDialogClose = () => {
       </template>
     </el-dialog>
 
-    <!-- 添加图片预览对话框 -->
+      <!-- 添加图片预览对话框 -->
     <el-dialog
         v-model="imagePreviewVisible"
         title="图片预览"

+ 504 - 0
src/views/gwnrgl/dwgl/index.vue

@@ -0,0 +1,504 @@
+<template>
+  <div class="point-management-container">
+    <!-- 搜索区域 -->
+    <div class="search-form">
+      <el-form :model="searchForm" inline @submit.prevent="handleSearch">
+        <el-form-item label="姓名">
+          <el-input
+              v-model="searchForm.name"
+              placeholder="请输入姓名"
+              clearable
+              @input="handleSearch"
+          />
+        </el-form-item>
+        <el-form-item label="联系方式">
+          <el-input
+              v-model="searchForm.phone"
+              placeholder="请输入手机号"
+              clearable
+              @input="handleSearch"
+          />
+        </el-form-item>
+        <el-form-item label="所属区域">
+          <el-input
+              v-model="searchForm.marker"
+              placeholder="请输入所属区域"
+              clearable
+              @input="handleSearch"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleSearch">搜索</el-button>
+          <el-button @click="handleResetSearch">重置</el-button>
+          <el-button type="primary" @click="handleAdd">新增点位</el-button>
+          <!--          <el-button-->
+          <!--              type="danger"-->
+          <!--              @click="handleBatchDelete"-->
+          <!--              :disabled="!selectedIds.length"-->
+          <!--          >-->
+          <!--            批量删除-->
+          <!--          </el-button>-->
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <!-- 点位列表 -->
+    <el-table
+        v-loading="loading"
+        :data="filteredPointList"
+        border
+        stripe
+        @selection-change="handleSelectionChange"
+        style="width: 100%; margin-top: 20px"
+    >
+      <el-table-column type="selection" width="55"/>
+      <el-table-column prop="name" label="姓名" min-width="100"/>
+      <el-table-column prop="phone" label="联系方式" min-width="150"/>
+      <el-table-column prop="marker" label="所属区域" min-width="120"/>
+      <el-table-column prop="longitude" label="经度" min-width="120"/>
+      <el-table-column prop="latitude" label="纬度" min-width="120"/>
+      <el-table-column label="操作" min-width="200">
+        <template #default="scope">
+          <el-button type="primary" size="small" @click="handleView(scope.row)">查看</el-button>
+          <el-button type="warning" size="small" @click="handleEdit(scope.row)">编辑</el-button>
+          <el-button type="danger" size="small" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <div class="mt-4 flex justify-end">
+      <el-pagination
+          v-model:current-page="pagination.pageNum"
+          v-model:page-size="pagination.pageSize"
+          :page-sizes="[10, 20, 50, 100]"
+          :total="total"
+          layout="total, sizes, prev, pager, next, jumper"
+          @size-change="handleSizeChange"
+          @current-change="handlePageChange"
+      />
+    </div>
+
+    <!-- 点位表单弹窗 -->
+    <el-dialog
+        v-model="dialogVisible"
+        :title="dialogTitle"
+        width="500px"
+        :close-on-click-modal="false"
+    >
+      <el-form
+          ref="pointFormRef"
+          :model="pointForm"
+          :rules="formRules"
+          label-width="80px"
+      >
+        <el-form-item label="姓名" prop="name">
+          <el-input
+              v-model="pointForm.name"
+              placeholder="请输入姓名"
+              :disabled="dialogType === 'view'"
+          />
+        </el-form-item>
+        <el-form-item label="联系方式" prop="phone">
+          <el-input
+              v-model="pointForm.phone"
+              placeholder="请输入手机号"
+              :disabled="dialogType === 'view'"
+          />
+        </el-form-item>
+        <el-form-item label="所属区域" prop="marker">
+          <el-input
+              v-model="pointForm.marker"
+              placeholder="请输入所属区域"
+              :disabled="dialogType === 'view'"
+          />
+        </el-form-item>
+        <el-form-item label="经度" prop="longitude">
+          <el-input
+              v-model="pointForm.longitude"
+              placeholder="请输入经度(范围:-180~180)"
+              :disabled="dialogType === 'view'"
+          />
+        </el-form-item>
+        <el-form-item label="纬度" prop="latitude">
+          <el-input
+              v-model="pointForm.latitude"
+              placeholder="请输入纬度(范围:-90~90)"
+              :disabled="dialogType === 'view'"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="dialogVisible = false">取消</el-button>
+        <el-button
+            type="primary"
+            @click="handleSubmit"
+            v-if="dialogType !== 'view'"
+        >
+          确认
+        </el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {ref, reactive, computed, onMounted} from 'vue'
+import {ElMessage, ElMessageBox} from 'element-plus'
+import request from "@/utils/request.js"
+
+const loading = ref(false)
+const total = ref(0)
+// 模拟初始数据
+const pointList = ref([])
+
+// 分页参数
+const pagination = reactive({
+  pageNum: 1,
+  pageSize: 10
+})
+
+// 搜索表单数据
+const searchForm = reactive({
+  name: '',
+  phone: '',
+  marker: ''
+})
+
+// 筛选后的点位列表(计算属性)
+const filteredPointList = computed(() => {
+  // 若无搜索条件,返回原始列表
+  if (!searchForm.name && !searchForm.phone && !searchForm.marker) {
+    return pointList.value
+  }
+
+  // 根据搜索条件过滤
+  return pointList.value.filter(item => {
+    // 姓名模糊匹配(忽略大小写)
+    const nameMatch = searchForm.name
+        ? item.name.toLowerCase().includes(searchForm.name.toLowerCase())
+        : true
+
+    // 联系方式模糊匹配
+    const phoneMatch = searchForm.phone
+        ? item.phone.includes(searchForm.phone)
+        : true
+
+    // 所属区域模糊匹配(忽略大小写)
+    const markerMatch = searchForm.marker
+        ? item.marker.toLowerCase().includes(searchForm.marker.toLowerCase())
+        : true
+
+    return nameMatch && phoneMatch && markerMatch
+  })
+})
+
+// 表单相关
+const pointFormRef = ref(null)
+const pointForm = reactive({
+  id: '',
+  name: '',
+  phone: '',
+  marker: '',
+  longitude: '',
+  latitude: ''
+})
+
+// 弹窗相关
+const dialogVisible = ref(false)
+const dialogType = ref('add') // add:新增 edit:编辑 view:查看
+const currentItem = ref(null)
+const dialogTitle = computed(() => {
+  const titleMap = {
+    add: '新增点位',
+    edit: '编辑点位',
+    view: '查看点位'
+  }
+  return titleMap[dialogType.value] || '点位信息'
+})
+
+// 批量选择的ID列表
+const selectedIds = ref([])
+
+// 表单校验规则
+const formRules = reactive({
+  name: [
+    {required: true, message: '请输入姓名', trigger: 'blur'}
+  ],
+  phone: [
+    {required: true, message: '请输入联系方式', trigger: 'blur'},
+    {pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur'}
+  ],
+  marker: [
+    {required: true, message: '请输入所属区域', trigger: 'blur'}
+  ],
+  longitude: [
+    {required: true, message: '请输入经度', trigger: 'blur'},
+    {
+      validator: (rule, value, callback) => {
+        const num = Number(value)
+        if (isNaN(num) || num < -180 || num > 180) {
+          callback(new Error('请输入-180到180之间的有效经度'))
+        } else {
+          callback()
+        }
+      },
+      trigger: 'blur'
+    }
+  ],
+  latitude: [
+    {required: true, message: '请输入纬度', trigger: 'blur'},
+    {
+      validator: (rule, value, callback) => {
+        const num = Number(value)
+        if (isNaN(num) || num < -90 || num > 90) {
+          callback(new Error('请输入-90到90之间的有效纬度'))
+        } else {
+          callback()
+        }
+      },
+      trigger: 'blur'
+    }
+  ]
+})
+
+// 表格选择事件
+const handleSelectionChange = (val) => {
+  selectedIds.value = val.map(item => item.id)
+}
+
+// 重置表单
+const resetForm = () => {
+  pointFormRef.value?.resetFields()
+  Object.assign(pointForm, {
+    id: '',
+    name: '',
+    phone: '',
+    marker: '',
+    longitude: '',
+    latitude: ''
+  })
+}
+
+// 新增点位
+const handleAdd = () => {
+  dialogType.value = 'add'
+  resetForm()
+  dialogVisible.value = true
+}
+
+// 查看点位
+const handleView = (row) => {
+  dialogType.value = 'view'
+  Object.assign(pointForm, {...row})
+  dialogVisible.value = true
+}
+
+// 编辑点位
+const handleEdit = (row) => {
+  dialogType.value = 'edit'
+  Object.assign(pointForm, {...row})
+  dialogVisible.value = true
+  getById(row.id)
+}
+
+// 删除单个点位
+const handleDelete = (row) => {
+  ElMessageBox.confirm(
+      '此操作将永久删除该点位, 是否继续?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }
+  ).then(async () => {
+    const res = await request.post("/locationInfor/deleteBatch", [row.id])
+    if (res.code !== 200) {
+      ElMessage.error(res.msg)
+      return false
+    }
+    ElMessage.success(res.msg)
+    if (res) {
+      getList()
+    }
+  }).catch(() => {
+    ElMessage({
+      type: 'info',
+      message: '已取消删除'
+    })
+  })
+}
+
+// 批量删除
+const handleBatchDelete = () => {
+  ElMessageBox.confirm(
+      '此操作将永久删除选中的点位, 是否继续?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }
+  ).then(() => {
+    pointList.value = pointList.value.filter(item => !selectedIds.value.includes(item.id))
+    selectedIds.value = []
+    ElMessage({
+      type: 'success',
+      message: '批量删除成功!'
+    })
+  }).catch(() => {
+    ElMessage({
+      type: 'info',
+      message: '已取消删除'
+    })
+  })
+}
+
+
+// 获取列表数据
+const getList = async () => {
+  loading.value = true
+  try {
+    const res = await request.get("/locationInfor/findByPage", {
+      params: {
+        pageNum: pagination.pageNum,
+        pageSize: pagination.pageSize,
+      }
+    })
+    if (res.code !== 200) {
+      ElMessage.error(res.msg)
+      return
+    }
+    pointList.value = res.data.records
+    total.value = res.data.total
+  } catch (error) {
+    ElMessage.error('获取数据失败')
+  } finally {
+    loading.value = false
+  }
+}
+
+
+//根据Id查询单个
+const getById = async (id) => {
+  const res = await request.get("/locationInfor/getById/" + id)
+  if (res.code !== 200) {
+    ElMessage.error(res.msg)
+    return
+  }
+  currentItem.value = res.data
+}
+
+// 提交表单(新增/编辑)
+const handleSubmit = async () => {
+  try {
+    // 表单校验
+    await pointFormRef.value?.validate()
+    let res
+    if (dialogType.value === 'add') {
+      res = await request.post("/locationInfor/save", {
+        name: pointForm.name,
+        phone: pointForm.phone,
+        marker: pointForm.marker,
+        longitude: pointForm.longitude,
+        latitude: pointForm.latitude
+      }, {
+        headers: {
+          'Content-Type': 'application/json'
+        }
+      })
+      ElMessage.success(res.msg)
+    } else if (dialogType.value === 'edit') {
+      // 编辑:更新对应数据
+      res = await request.post("/locationInfor/update", {
+        id: currentItem.value.id,
+        name: pointForm.name,
+        phone: pointForm.phone,
+        marker: pointForm.marker,
+        longitude: pointForm.longitude,
+        latitude: pointForm.latitude
+      }, {
+        headers: {
+          'Content-Type': 'application/json'
+        }
+      })
+      ElMessage.success(res.msg)
+    }
+
+    // 关闭弹窗并重置
+    dialogVisible.value = false
+    resetForm()
+  } catch (error) {
+    console.error('表单校验失败:', error)
+  }
+  await getList()
+}
+
+// 搜索操作
+const handleSearch = () => {
+  // 计算属性会自动根据searchForm变化更新列表,此处可添加额外逻辑(如提示、加载状态等)
+  const count = filteredPointList.value.length
+  ElMessage.info(`共搜索到 ${count} 个点位`)
+}
+
+// 重置搜索
+const handleResetSearch = () => {
+  // 清空搜索表单
+  Object.assign(searchForm, {
+    name: '',
+    phone: '',
+    marker: ''
+  })
+
+  pagination.pageNum = 1
+  ElMessage.info('搜索条件已重置')
+}
+
+
+// 分页改变
+const handlePageChange = (page) => {
+  pagination.pageNum = page
+  getList()
+}
+
+const handleSizeChange = (size) => {
+  pagination.pageSize = size
+  pagination.pageNum = 1
+  getList()
+}
+onMounted(() => {
+  getList()
+})
+</script>
+
+<style scoped>
+.point-management-container {
+  padding: 20px;
+}
+
+.header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 10px;
+}
+
+.header h2 {
+  margin: 0;
+}
+
+.header-actions {
+  display: flex;
+}
+
+.el-button + .el-button {
+  margin-left: 10px;
+}
+
+.search-form {
+  padding: 15px;
+  background: #f5f7fa;
+  border-radius: 4px;
+  margin-bottom: 10px;
+}
+</style>

+ 36 - 2
src/views/gwnrgl/xwgl/index.vue

@@ -47,6 +47,9 @@ const pagination = reactive({
 const formData = reactive({
   id: '',
   newsName: '',
+  newsDesc: '',
+  newsAuthor: '',
+  newsCategory: '',
   newsDetails: '',
   newsUrl: '',
   releaseTime: '',
@@ -384,6 +387,11 @@ const handleSave = async () => {
     submitData.append('newsDetails', formData.newsDetails)
     submitData.append('isSpecial', formData.isSpecial)
     submitData.append('releaseTime', formData.releaseTime)
+    submitData.append('newsCategory', formData.newsCategory)
+    submitData.append('newsDesc', formData.newsDesc)
+    submitData.append('newsAuthor', formData.newsAuthor)
+
+
 
     // 如果有新的封面文件,添加到FormData
     if (coverFile.value) {
@@ -458,6 +466,9 @@ const resetForm = () => {
   Object.assign(formData, {
     id: '',
     newsName: '',
+    newsDesc: '',
+    newsAuthor: '',
+    newsCategory: '',
     newsDetails: '',
     newsUrl: '',
     releaseTime: '',
@@ -530,6 +541,8 @@ const handleDialogClose = () => {
     >
       <el-table-column type="selection" width="55"/>
       <el-table-column prop="newsName" label="新闻名称" min-width="200"/>
+      <el-table-column prop="newsDesc" label="新闻描述" width="220"/>
+      <el-table-column prop="newsCategory" label="新闻类型" min-width="200"/>
       <el-table-column prop="releaseTime" label="发布时间" min-width="200"/>
       <el-table-column prop="newsUrl" label="新闻图片" width="120">
         <template #default="{ row }">
@@ -551,12 +564,15 @@ const handleDialogClose = () => {
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column prop="createBy" label="创建人" width="120"/>
+<!--      <el-table-column prop="createBy" label="创建人" width="120"/>-->
+      <el-table-column prop="newsAuthor" label="创建作者" width="120"/>
+
       <el-table-column prop="createTime" label="创建时间" width="180">
         <template #default="{ row }">
           {{ row.createTime ? new Date(row.createTime).toLocaleString() : '-' }}
         </template>
       </el-table-column>
+
       <el-table-column label="操作" width="200" fixed="right">
         <template #default="{ row }">
           <el-button size="small" @click="handleView(row)">
@@ -601,7 +617,25 @@ const handleDialogClose = () => {
         <el-form-item label="新闻名称" required>
           <el-input v-model="formData.newsName" placeholder="请输入新闻名称"/>
         </el-form-item>
-
+        <el-form-item label="新闻描述" required>
+          <el-input v-model="formData.newsDesc" placeholder="请输入新闻描述"/>
+        </el-form-item>
+        <el-form-item label="新闻类型" required>
+          <el-select v-model="formData.newsCategory" placeholder="请选择新闻类型">
+            <el-option label="行内新闻" value="行内新闻"/>
+            <el-option label="公司新闻" value="公司新闻"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="新闻作者" required>
+          <el-select v-model="formData.newsAuthor" placeholder="请选择新闻发布作者">
+            <el-option label="总经办" value="总经办"/>
+            <el-option label="市场营销部" value="市场营销部"/>
+            <el-option label="交付售后部" value="交付售后部"/>
+            <el-option label="综合管理部" value="综合管理部"/>
+            <el-option label="技术开发部门" value="技术开发部门"/>
+            <el-option label="产品与解决方案部" value="产品与解决方案部"/>
+          </el-select>
+        </el-form-item>
         <el-form-item label="发布时间" required>
           <el-date-picker
               v-model="formData.releaseTime"

+ 1 - 1
src/views/kfxt/kf/index.vue

@@ -62,7 +62,7 @@ const showBrowserNotification = (title, body, icon = null) => {
   if (notificationPermission.value === 'granted') {
     const notification = new Notification(title, {
       body,
-      icon: icon || '/favicon.ico',
+      icon: icon || '/logo.png',
       tag: 'chat-message' // 防止重复通知
     })
 

+ 2 - 2
vite.config.js

@@ -2,8 +2,8 @@ import {defineConfig, loadEnv} from 'vite'
 import path from 'path'
 import createVitePlugins from './vite/plugins'
 
-// const baseUrl = 'http://192.168.110.235:8040' // 后端接口
-const baseUrl = 'http://localhost:8040' // 后端接口
+const baseUrl = 'http://192.168.110.235:8040' // 后端接口
+// const baseUrl = 'http://localhost:8040' // 后端接口
 // const baseUrl = 'http://47.107.107.47:8040' // 后端接口
 
 // https://vitejs.dev/config/