Browse Source

1、提交代理代码

qmj 2 tháng trước cách đây
mục cha
commit
e95a9d6215

+ 1 - 1
.env.development

@@ -1,5 +1,5 @@
 # 页面标题
-VITE_APP_TITLE = 若依管理系统
+VITE_APP_TITLE = 代理管理系統
 
 # 开发环境配置
 VITE_APP_ENV = 'development'

+ 1 - 1
.env.production

@@ -1,5 +1,5 @@
 # 页面标题
-VITE_APP_TITLE = 若依管理系统
+VITE_APP_TITLE = 代理管理系統
 
 # 生产环境配置
 VITE_APP_ENV = 'production'

+ 1 - 1
.env.staging

@@ -1,5 +1,5 @@
 # 页面标题
-VITE_APP_TITLE = 若依管理系统
+VITE_APP_TITLE = 代理管理系統
 
 # 生产环境配置
 VITE_APP_ENV = 'staging'

+ 53 - 24
src/api/menu.js

@@ -1,25 +1,26 @@
 // import request from '@/utils/request'
 
-// 获取路由 - 现在使用静态配置,不再从后端获
+// 獲取路由 - 現在使用靜態配置,不再從後端獲
 export const getRouters = () => {
     return Promise.resolve({
         data: [
+
             {
-                path: '/',
+                path: '/user',
                 component: 'Layout',
-                redirect: '/index',
+                redirect: '/user/myuser',
                 meta: {
                     icon:"system",
                     link: null,
                     noCache: false,
-                    title:"我的会员",
+                    title:"我的會員",
                 },
                 children: [
                     {
                         path: 'myuser',
                         component: 'agent/myuser',
                         name: 'myuser',
-                        meta: {title: '我的会员', icon: 'dashboard', affix: true},
+                        meta: {title: '我的會員', icon: 'dashboard', affix: true},
                         children: []
                     },
                     {
@@ -32,7 +33,7 @@ export const getRouters = () => {
                 ]
             },
             {
-                path:"/",
+                path:"/authUp",
                 component: "Layout",
                 redirect: "noRedirect",
                 alwaysShow: true,
@@ -40,15 +41,43 @@ export const getRouters = () => {
                     icon:"system",
                     link: null,
                     noCache: false,
-                    title:"会员授权上传",
+                    title:"會員授權上傳",
 
                 },
                 children: [
                     {
-                        path: 'userContact',
+                        path: 'authUp/userContact',
                         component: 'agent/userContact',
                         name: 'userContact',
-                        meta: {title: '会员联络人', icon: 'dashboard', affix: true},
+                        meta: {title: '會員聯絡人', icon: 'dashboard', affix: true},
+                        children: []
+                    },
+                    {
+                        path: 'authUp/position',
+                        component: 'agent/position',
+                        name: 'position',
+                        meta: {title: '會員定位資訊', icon: 'dashboard', affix: true},
+                        children: []
+                    },
+                    {
+                        path: 'authUp/image',
+                        component: 'agent/image',
+                        name: 'image',
+                        meta: {title: '會員圖片', icon: 'dashboard', affix: true},
+                        children: []
+                    },
+                    {
+                        path: 'authUp/call',
+                        component: 'agent/call',
+                        name: 'call',
+                        meta: {title: '通話記錄', icon: 'dashboard', affix: true},
+                        children: []
+                    },
+                    {
+                        path: 'authUp/sms',
+                        component: 'agent/sms',
+                        name: 'sms',
+                        meta: {title: '簡訊記錄', icon: 'dashboard', affix: true},
                         children: []
                     },
                 ]
@@ -60,28 +89,28 @@ export const getRouters = () => {
 }
 
 /* 
-  菜单配置说明:
+  菜單配置說明:
   
-  - path: 路由路
-  - component: 组件路径(对应 views 目录下的 .vue 文件)
-  - name: 路由名
-  - redirect: 重定向路
-  - meta: 元信息
-    - title: 菜单标题
-    - icon: 图标名称(对应 src/icons/svg 目录下的图标
-    - roles: 权限角色(可选
+  - path: 路由路
+  - component: 組件路徑(對應 views 目錄下的 .vue 文件)
+  - name: 路由名
+  - redirect: 重定向路
+  - meta: 元資訊
+    - title: 菜單標題
+    - icon: 圖標名稱(對應 src/icons/svg 目錄下的圖標
+    - roles: 權限角色(可選
   
-  如何添加新菜
-  1. 在 views 目录下创建对应的 .vue 文件
-  2. 在 children 数组中添加新的菜单项
-  3. component 路径要匹配 views 目录下的文件路径
+  如何添加新菜
+  1. 在 views 目錄下創建對應的 .vue 文件
+  2. 在 children 數組中添加新的菜單項
+  3. component 路徑要匹配 views 目錄下的文件路徑
   
-  示例:添加一个新的 "个人中心" 菜单
+  示例:添加一個新的 "個人中心" 菜單
   {
     path: 'profile',
     component: 'system/user/profile/index',
     name: 'Profile',
-    meta: { title: '人中心', icon: 'user' },
+    meta: { title: '人中心', icon: 'user' },
     children: []
   }
 */

+ 9 - 0
src/api/system/call.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function getCallPageList(query) {
+    return request({
+        url: '/app/authUpload/getCallPageList',
+        method: 'get',
+        params: query
+    })
+}

+ 9 - 0
src/api/system/image.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function getImagePageList(query) {
+    return request({
+        url: '/app/authUpload/getImagePageList',
+        method: 'get',
+        params: query
+    })
+}

+ 9 - 0
src/api/system/position.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function getPositionPageList(query) {
+    return request({
+        url: '/app/authUpload/getPositionPageList',
+        method: 'get',
+        params: query
+    })
+}

+ 9 - 0
src/api/system/sms.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function getSmsPageList(query) {
+    return request({
+        url: '/app/authUpload/getSmsPageList',
+        method: 'get',
+        params: query
+    })
+}

BIN
src/assets/images/background.png


+ 3 - 3
src/components/Breadcrumb/index.vue

@@ -33,9 +33,9 @@ function getBreadcrumb() {
     matched = route.matched.filter((item) => item.meta && item.meta.title)
   }
   // 判断是否为首页
-  if (!isDashboard(matched[0])) {
-    matched = [{ path: "/index", meta: { title: "首页" } }].concat(matched)
-  }
+  // if (!isDashboard(matched[0])) {
+  //   matched = [{ path: "/index", meta: { title: "首页" } }].concat(matched)
+  // }
   levelList.value = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
 }
 function findPathNum(str, char = "/") {

+ 1 - 1
src/permission.js

@@ -20,7 +20,7 @@ router.beforeEach((to, from, next) => {
     to.meta.title && useSettingsStore().setTitle(to.meta.title)
     /* has token*/
     if (to.path === '/login') {
-      next({ path: '/' })
+      next({ path: '/user/myuser' })
       NProgress.done()
     } else if (isWhiteList(to.path)) {
       next()

+ 3 - 10
src/router/index.js

@@ -58,17 +58,10 @@ export const constantRoutes = [
     hidden: true
   },
   {
-    path: '',
+    path: '/',
     component: Layout,
-    redirect: '/index',
-    children: [
-      {
-        path: '/index',
-        component: () => import('@/views/index'),
-        name: 'Index',
-        meta: { title: '首页', icon: 'dashboard', affix: true }
-      }
-    ]
+    redirect: '/user/myuser',
+    hidden: true
   },
   {
     path: '/user',

+ 171 - 0
src/views/agent/call.vue

@@ -0,0 +1,171 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="80px">
+      <el-form-item label="所屬用戶" prop="username">
+        <el-input
+            v-model="queryParams.username"
+            placeholder="請輸入所屬用戶"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </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-table v-loading="loading" :data="callList">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="id" align="center" prop="id" />
+      <el-table-column label="用戶ID" align="center" prop="userId" />
+      <el-table-column label="所屬用戶" align="center" prop="userName" />
+      <el-table-column label="電話號碼" align="center" prop="phoneNumber" />
+      <el-table-column label="通話類型" align="center" prop="callType">
+        <template #default="{ row }">
+          <span>{{ callTypeText(row.callType) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="通話開始時間" align="center" prop="startTime" />
+      <el-table-column label="通話時長" align="center" prop="duration" />
+      <el-table-column label="通訊錄名稱" align="center" prop="contactName" />
+      <el-table-column label="操作" align="center" width="140" class-name="small-padding fixed-width">
+        <template #default="{ row }">
+          <el-tooltip content="查看" placement="top">
+            <el-button link type="primary" icon="View" @click.stop="handleView(row)"></el-button>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    <el-dialog :title="title" v-model="open" width="600px" append-to-body>
+      <el-form ref="formRef" :model="form"  label-width="80px">
+        <el-form-item label="用戶id" prop="userId">
+          <el-input v-model="form.userId" placeholder="請輸入用戶id" />
+        </el-form-item>
+        <el-form-item label="所屬用戶" prop="userName">
+          <el-input v-model="form.userName" />
+        </el-form-item>
+        <el-form-item label="電話號碼" prop="phoneNumber">
+          <el-input v-model="form.phoneNumber" placeholder="請輸入電話號碼" />
+        </el-form-item>
+        <el-form-item label="通話開始時間" prop="startTime">
+          <el-input v-model="form.startTime" placeholder="請輸入通話開始時間" />
+        </el-form-item>
+        <el-form-item label="通話時長" prop="duration">
+          <el-input v-model="form.duration" placeholder="請輸入通話時長" />
+        </el-form-item>
+        <el-form-item label="通訊錄名稱" prop="contactName">
+          <el-input v-model="form.contactName" placeholder="請輸入通訊錄名稱" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {ref, reactive, getCurrentInstance, onMounted, nextTick} from 'vue'
+import {getCallPageList} from '@/api/system/call.js'
+const { proxy } = getCurrentInstance()
+const { sys_show_hide, sys_normal_disable } = proxy.useDict("sys_show_hide", "sys_normal_disable")
+
+const callList = ref([])
+const total = ref(0)
+const title = ref("")
+const open = ref(false)
+const form = ref({})
+const formRef = ref()
+const loading = ref(true)
+const queryFormRef = ref()
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 10,
+  username: null,
+})
+onMounted(()=>{
+  getList()
+})
+
+const  callTypeText=(type)=> {
+  switch (type) {
+    case 1:
+    case '1':
+      return '呼入';
+    case 2:
+    case '2':
+      return '呼出';
+    case 3:
+    case '3':
+      return '未接';
+    case 5:
+    case '5':
+      return '挂断';
+    default:
+      return type;
+  }
+}
+// 表单重设
+const reset = () => {
+  form.value = {
+    id: null,
+    phoneNumber: null,
+    callType: null,
+    startTime: null,
+    duration: null,
+    contactName: null,
+    createTime: null,
+    userId: null,
+    userName:null,
+  }
+  if (formRef.value) {
+    formRef.value.resetFields()
+  }
+}
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNum = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+const getList = () => {
+  loading.value = true
+  const params = {
+    pageNum: queryParams.pageNum,
+    pageSize: queryParams.pageSize,
+    userName: queryParams.username,
+  }
+  getCallPageList(params).then(response => {
+    callList.value = response.data.records
+    total.value = response.data.total
+    loading.value = false
+  })
+}
+
+/** 查看按钮操作 */
+const handleView = (row) => {
+  reset()
+  form.value = {...row}
+  open.value = true
+  title.value = "查看圖片資訊"
+  nextTick(() => {
+    if (formRef.value) formRef.value.clearValidate && formRef.value.clearValidate()
+  })
+}
+// 取消按钮
+const cancel = () => {
+  open.value = false
+  reset()
+}
+</script>
+<style scoped lang="scss">
+
+</style>

+ 137 - 0
src/views/agent/image.vue

@@ -0,0 +1,137 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="80px">
+      <el-form-item label="所屬用戶" prop="username">
+        <el-input
+            v-model="queryParams.username"
+            placeholder="請輸入所屬用戶"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </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-table v-loading="loading" :data="imageList">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="id" align="center" prop="id" />
+      <el-table-column label="用戶id" align="center" prop="userId" />
+      <el-table-column label="所屬用戶" align="center" prop="userName" />
+      <el-table-column label="圖片" align="center" prop="url" >
+        <template #default="{ row }">
+          <image-preview :src="row.url" :width="80" :height="80"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="圖片時間" align="center" prop="createDate" />
+      <el-table-column label="操作" align="center" width="140" class-name="small-padding fixed-width">
+        <template #default="{ row }">
+          <el-tooltip content="查看" placement="top">
+            <el-button link type="primary" icon="View" @click.stop="handleView(row)"></el-button>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    <el-dialog :title="title" v-model="open" width="600px" append-to-body>
+      <el-form ref="formRef" :model="form"  label-width="80px">
+        <el-form-item label="用戶id" prop="userId">
+          <el-input v-model="form.userId" placeholder="請輸入用戶id" />
+        </el-form-item>
+        <el-form-item label="所屬用戶" prop="userName">
+          <el-input v-model="form.userName" />
+        </el-form-item>
+        <el-form-item label="圖片" prop="url">
+          <image-upload :limit="1" v-model="form.url"/>
+        </el-form-item>
+        <el-form-item label="圖片時間" prop="createDate">
+          <el-input v-model="form.createDate" placeholder="請輸入圖片時間" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {ref, reactive, getCurrentInstance, onMounted, nextTick} from 'vue'
+import {getImagePageList} from '@/api/system/image.js'
+
+
+const imageList = ref([])
+const total = ref(0)
+const title = ref("")
+const open = ref(false)
+const form = ref({})
+const formRef = ref()
+const loading = ref(true)
+const queryFormRef = ref()
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 10,
+  username: null,
+})
+onMounted(()=>{
+  getList()
+})
+// 表单重设
+const reset = () => {
+  form.value = {
+    id: null,
+    url: null,
+    createDate: null,
+    userId: null
+  }
+  if (formRef.value) {
+    formRef.value.resetFields()
+  }
+}
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNum = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+const getList = () => {
+  loading.value = true
+  const params = {
+    pageNum: queryParams.pageNum,
+    pageSize: queryParams.pageSize,
+    userName: queryParams.username,
+  }
+  getImagePageList(params).then(response => {
+    imageList.value = response.data.records
+    total.value = response.data.total
+    loading.value = false
+  })
+}
+
+/** 查看按钮操作 */
+const handleView = (row) => {
+  reset()
+  form.value = {...row}
+  open.value = true
+  title.value = "查看圖片資訊"
+  nextTick(() => {
+    if (formRef.value) formRef.value.clearValidate && formRef.value.clearValidate()
+  })
+}
+// 取消按钮
+const cancel = () => {
+  open.value = false
+  reset()
+}
+</script>
+<style scoped lang="scss">
+
+</style>

+ 9 - 8
src/views/agent/income.vue

@@ -4,7 +4,7 @@
       <el-table-column label="id" align="center" prop="id" />
       <el-table-column label="代理id" align="center" prop="agentId" />
       <el-table-column label="借款id" align="center" prop="orderId" />
-      <el-table-column label="用id" align="center" prop="loanUserId" />
+      <el-table-column label="用id" align="center" prop="loanUserId" />
       <el-table-column label="借款金额" align="center" prop="loanAmount" />
       <el-table-column label="收益" align="center" prop="income" />
       <el-table-column label="操作" align="center" width="140" class-name="small-padding fixed-width">
@@ -15,23 +15,24 @@
         </template>
       </el-table-column>
     </el-table>
-    <!-- 添加或修改代理收益对话框 -->
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    <!-- 添加或修改代理收益對話框 -->
     <el-dialog :title="title" v-model="open" width="500px" append-to-body>
       <el-form ref="formRef" :model="form" label-width="80px">
         <el-form-item label="代理id" prop="agentId">
-          <el-input v-model="form.agentId" placeholder="请输入代理id" />
+          <el-input v-model="form.agentId" placeholder="請輸入代理id" />
         </el-form-item>
         <el-form-item label="借款id" prop="orderId">
-          <el-input v-model="form.orderId" placeholder="请输入借款id" />
+          <el-input v-model="form.orderId" placeholder="請輸入借款id" />
         </el-form-item>
-        <el-form-item label="用id" prop="loanUserId">
-          <el-input v-model="form.loanUserId" placeholder="请输入用户id" />
+        <el-form-item label="用id" prop="loanUserId">
+          <el-input v-model="form.loanUserId" placeholder="請輸入用戶id" />
         </el-form-item>
         <el-form-item label="借款金额" prop="loanAmount">
-          <el-input v-model="form.loanAmount" placeholder="请输入借款金额" />
+          <el-input v-model="form.loanAmount" placeholder="請輸入借款金額" />
         </el-form-item>
         <el-form-item label="收益" prop="income">
-          <el-input v-model="form.income" placeholder="请输入收益" />
+          <el-input v-model="form.income" placeholder="請輸入收益" />
         </el-form-item>
 
       </el-form>

+ 14 - 14
src/views/agent/myuser.vue

@@ -1,32 +1,32 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryFormRef" :inline="true" v-show="showSearch" label-width="80px">
-      <el-form-item label="用户名称" prop="username">
+      <el-form-item label="用戶名稱" prop="username">
         <el-input
             v-model="queryParams.username"
-            placeholder="请输入用户名称"
+            placeholder="請輸入用戶名稱"
             clearable
             @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="用户昵称" prop="nickname">
+      <el-form-item label="用戶暱稱" prop="nickname">
         <el-input
             v-model="queryParams.nickname"
-            placeholder="请输入用户昵称"
+            placeholder="請輸入用戶暱稱"
             clearable
             @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="手机号码" prop="phone">
+      <el-form-item label="手機號碼" prop="phone">
         <el-input
             v-model="queryParams.phone"
-            placeholder="请输入手机号码"
+            placeholder="請輸入手機號碼"
             clearable
             @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="是否代理" prop="isAgent">
-        <el-select v-model="queryParams.isAgent" placeholder="请选择是否为代理" clearable style="width: 240px">
+      <el-form-item label="是否代理" prop="isAgent">
+        <el-select v-model="queryParams.isAgent" placeholder="請選擇是否為代理" clearable style="width: 240px">
           <el-option
               label="是"
               :value="true"
@@ -37,8 +37,8 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="状态" prop="status">
-        <el-select v-model="queryParams.status" placeholder="用户状态" clearable style="width: 240px">
+      <el-form-item label="狀態" prop="status">
+        <el-select v-model="queryParams.status" placeholder="用戶狀態" clearable style="width: 240px">
           <el-option
               v-for="dict in sys_normal_disable"
               :key="dict.value"
@@ -47,17 +47,17 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="所代理ID" prop="agentId">
+      <el-form-item label="所代理ID" prop="agentId">
         <el-input
             v-model="queryParams.agentId"
-            placeholder="请输入所属代理ID"
+            placeholder="請輸入所屬代理ID"
             clearable
             @keyup.enter="handleQuery"
         />
       </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-button type="primary" icon="Search" @click="handleQuery">搜</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重</el-button>
       </el-form-item>
     </el-form>
 

+ 141 - 0
src/views/agent/position.vue

@@ -0,0 +1,141 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="80px">
+      <el-form-item label="所屬用戶" prop="username">
+        <el-input
+            v-model="queryParams.username"
+            placeholder="請輸入所屬用戶"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </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-table v-loading="loading" :data="positionList">
+      <el-table-column label="id" align="center" prop="id"/>
+      <el-table-column label="用戶id" align="center" prop="userId"/>
+      <el-table-column label="所屬用戶" align="center" prop="userName"/>
+      <el-table-column label="經度" align="center" prop="longitude"/>
+      <el-table-column label="緯度" align="center" prop="latitude"/>
+      <el-table-column label="備註" align="center" prop="notes"/>
+      <el-table-column label="操作" align="center" width="140" class-name="small-padding fixed-width">
+        <template #default="{ row }">
+          <el-tooltip content="查看" placement="top">
+            <el-button link type="primary" icon="View" @click.stop="handleView(row)"></el-button>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    <el-dialog :title="title" v-model="open" width="600px" append-to-body>
+      <el-form ref="formRef" :model="form"  label-width="80px">
+        <el-form-item label="用戶id" prop="userId">
+          <el-input v-model="form.userId" placeholder="請輸入用戶id" />
+        </el-form-item>
+        <el-form-item label="用戶名稱" prop="userName">
+          <el-input v-model="form.userName"  />
+        </el-form-item>
+        <el-form-item label="經度" prop="longitude">
+          <el-input v-model="form.longitude" placeholder="請輸入經度" />
+        </el-form-item>
+        <el-form-item label="緯度" prop="latitude">
+          <el-input v-model="form.latitude" placeholder="請輸入緯度" />
+        </el-form-item>
+        <el-form-item label="備註" prop="notes">
+          <el-input v-model="form.notes" placeholder="請輸入備註" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {ref, reactive, getCurrentInstance, onMounted, nextTick} from 'vue'
+import {getPositionPageList} from '@/api/system/position.js'
+
+const positionList = ref([])
+const total = ref(0)
+const title = ref("")
+const open = ref(false)
+const form = ref({})
+const formRef = ref()
+const loading = ref(true)
+const queryFormRef = ref()
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 10,
+  username: null,
+})
+
+
+onMounted(()=>{
+  getList()
+})
+// 表单重设
+const reset = () => {
+  form.value = {
+    id: null,
+    userId: null,
+    longitude: null,
+    latitude: null,
+    notes: null,
+    userName: null
+  }
+  if (formRef.value) {
+    formRef.value.resetFields()
+  }
+}
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNum = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+const getList = () => {
+  loading.value = true
+  const params = {
+    pageNum: queryParams.pageNum,
+    pageSize: queryParams.pageSize,
+    userName: queryParams.username,
+  }
+  getPositionPageList(params).then(response => {
+    positionList.value = response.data.records
+    total.value = response.data.total
+    loading.value = false
+  })
+}
+
+/** 查看按钮操作 */
+const handleView = (row) => {
+  reset()
+  form.value = {...row}
+  open.value = true
+  title.value = "查看定位資訊"
+  nextTick(() => {
+    if (formRef.value) formRef.value.clearValidate && formRef.value.clearValidate()
+  })
+}
+// 取消按钮
+const cancel = () => {
+  open.value = false
+  reset()
+}
+
+
+</script>
+<style scoped lang="scss">
+
+</style>

+ 218 - 0
src/views/agent/sms.vue

@@ -0,0 +1,218 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="80px">
+      <el-form-item label="所屬用戶" prop="username">
+        <el-input
+            v-model="queryParams.username"
+            placeholder="請輸入所屬用戶"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </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-table v-loading="loading" :data="smsList">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="id" align="center" prop="id" />
+      <el-table-column label="用戶id" align="center" prop="userId" />
+      <el-table-column label="所屬用戶" align="center" prop="userName" />
+      <el-table-column label="簡訊類型" align="center" prop="smsType">
+        <template #default="{ row }">
+          <span>{{ smsTypeText(row.smsType) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="對方號碼" align="center" prop="phoneNumber" />
+      <el-table-column label="簡訊內容" align="center" prop="content" width="200">
+        <template #default="{ row }">
+          <div class="content-cell-text">{{ row.content }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="簡訊時間" align="center" prop="smsTime" />
+      <el-table-column label="操作" align="center" width="140" class-name="small-padding fixed-width">
+        <template #default="{ row }">
+          <el-tooltip content="查看" placement="top">
+            <el-button link type="primary" icon="View" @click.stop="handleView(row)"></el-button>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    <el-dialog :title="title" v-model="open" width="600px" append-to-body>
+      <el-form ref="formRef" :model="form"  label-width="80px">
+          <el-form-item label="用戶id" prop="userId">
+            <el-input v-model="form.userId" placeholder="請輸入用戶id" />
+          </el-form-item>
+          <el-form-item label="所屬用戶" prop="userName">
+            <el-input v-model="form.userName" />
+          </el-form-item>
+          <el-form-item label="對方號碼" prop="phoneNumber">
+            <el-input v-model="form.phoneNumber" placeholder="請輸入對方號碼" />
+          </el-form-item>
+          <el-form-item label="簡訊內容">
+            <el-input type="textarea" autosize="{minRows:4}" pla v-model="form.content"/>
+          </el-form-item>
+          <el-form-item label="簡訊時間" prop="smsTime">
+            <el-input v-model="form.smsTime" placeholder="請輸入簡訊時間" />
+          </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {ref, reactive, getCurrentInstance, onMounted, nextTick} from 'vue'
+import {getSmsPageList} from '@/api/system/sms.js'
+const { proxy } = getCurrentInstance()
+const { sys_show_hide, sys_normal_disable } = proxy.useDict("sys_show_hide", "sys_normal_disable")
+
+const smsList = ref([])
+const total = ref(0)
+const title = ref("")
+const open = ref(false)
+const form = ref({})
+const formRef = ref()
+const loading = ref(true)
+const queryFormRef = ref()
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 10,
+  username: null,
+})
+onMounted(()=>{
+  getList()
+})
+
+const smsTypeText = (type)=> {
+  switch (type) {
+    case 1:
+    case '1':
+      return '接收';
+    case 2:
+    case '2':
+      return '發送';
+    default:
+      return type;
+  }
+}
+// 表单重设
+const reset = () => {
+  form.value = {
+    id: null,
+    userId: null,
+    smsType: null,
+    phoneNumber: null,
+    userName:null,
+    content: null,
+    smsTime: null,
+    createTime: null
+  }
+  if (formRef.value) {
+    formRef.value.resetFields()
+  }
+}
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNum = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+const getList = () => {
+  loading.value = true
+  const params = {
+    pageNum: queryParams.pageNum,
+    pageSize: queryParams.pageSize,
+    userName: queryParams.username,
+  }
+  getSmsPageList(params).then(response => {
+    smsList.value = response.data.records
+    total.value = response.data.total
+    loading.value = false
+  })
+}
+
+/** 查看按钮操作 */
+const handleView = (row) => {
+  reset()
+  form.value = {...row}
+  open.value = true
+  title.value = "查看簡訊資訊"
+  nextTick(() => {
+    if (formRef.value) formRef.value.clearValidate && formRef.value.clearValidate()
+  })
+}
+// 取消按钮
+const cancel = () => {
+  open.value = false
+  reset()
+}
+</script>
+<style scoped lang="scss">
+.content-cell {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  width: 100%;
+}
+
+.content-cell-text {
+  height: 40px;
+  line-height: 20px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+  word-break: break-all;
+  width: 100%;
+}
+</style>
+
+<style lang="scss">
+.sms-content-tooltip {
+  background: transparent !important;
+  border: none !important;
+  box-shadow: none !important;
+  padding: 0 !important;
+  max-width: 300px !important;
+  
+  &.el-tooltip__popper {
+    background: transparent !important;
+  }
+  
+  .el-tooltip__popper__inner {
+    background: transparent !important;
+    color: #333 !important;
+    padding: 12px !important;
+    border-radius: 4px !important;
+    max-width: 300px !important;
+    max-height: 300px !important;
+    min-width: 300px !important;
+    min-height: 300px !important;
+    overflow-y: auto !important;
+    word-wrap: break-word !important;
+    word-break: break-all !important;
+    line-height: 1.5 !important;
+    text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.8), -1px -1px 2px rgba(255, 255, 255, 0.8) !important;
+    display: flex !important;
+    align-items: center !important;
+    justify-content: center !important;
+  }
+  
+  .el-popper__arrow {
+    display: none !important;
+  }
+}
+</style>

+ 57 - 27
src/views/agent/userContact.vue

@@ -1,10 +1,10 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryFormRef" :inline="true"  label-width="80px">
+    <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="80px">
       <el-form-item label="所屬用戶" prop="username">
         <el-input
             v-model="queryParams.username"
-            placeholder="请输入所屬用戶"
+            placeholder="請輸入所屬用戶"
             clearable
             @keyup.enter="handleQuery"
         />
@@ -12,23 +12,23 @@
       <el-form-item label="聯絡人名稱" prop="name">
         <el-input
             v-model="queryParams.name"
-            placeholder="请输入聯絡人名稱"
+            placeholder="請輸入聯絡人名稱"
             clearable
             @keyup.enter="handleQuery"
         />
       </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-button type="primary" icon="Search" @click="handleQuery">搜</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重</el-button>
       </el-form-item>
     </el-form>
     <el-table v-loading="loading" :data="contactList">
-      <el-table-column label="id" align="center" prop="id" />
-      <el-table-column label="用戶id" align="center" prop="userId" />
-      <el-table-column label="所屬用戶" align="center" prop="userName" />
-      <el-table-column label="聯絡人名稱" align="center" prop="name" />
-      <el-table-column label="聯絡電話" align="center" prop="phones" />
-      <el-table-column label="創建時間" align="center" prop="createTime" />
+      <el-table-column label="id" align="center" prop="id"/>
+      <el-table-column label="用戶id" align="center" prop="userId"/>
+      <el-table-column label="所屬用戶" align="center" prop="userName"/>
+      <el-table-column label="聯絡人名稱" align="center" prop="name"/>
+      <el-table-column label="聯絡電話" align="center" prop="phones"/>
+      <el-table-column label="創建時間" align="center" prop="createTime"/>
       <el-table-column label="操作" align="center" width="140" class-name="small-padding fixed-width">
         <template #default="{ row }">
           <el-tooltip content="查看" placement="top">
@@ -37,36 +37,62 @@
         </template>
       </el-table-column>
     </el-table>
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    <!-- 新增或修改会员对话框 -->
+    <el-dialog :title="title" v-model="open" width="600px" append-to-body>
+      <el-form ref="formRef" :model="form"  label-width="80px">
+        <el-form-item label="用戶id" prop="userId">
+          <el-input v-model="form.userId" placeholder="請輸入用戶id" />
+        </el-form-item>
+        <el-form-item label="所屬用戶" prop="userName">
+          <el-input v-model="form.userName" />
+        </el-form-item>
+        <el-form-item label="聯絡人名稱" prop="name">
+          <el-input v-model="form.name" placeholder="請輸入聯絡人名稱" />
+        </el-form-item>
+        <el-form-item label="聯絡電話" prop="phones">
+          <el-input v-model="form.phones" placeholder="請輸入內容" />
+        </el-form-item>
+        <el-form-item label="創建時間" prop="createTime">
+          <el-input v-model="form.createTime" placeholder="請輸入內容" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 <script setup>
-import { ref, reactive, getCurrentInstance, onMounted, nextTick } from 'vue'
+import {ref, reactive, getCurrentInstance, onMounted, nextTick} from 'vue'
 import {getContactPageList} from "@/api/system/userContact.js"
 
 const title = ref("")
 const open = ref(false)
 const form = ref({})
-const formRef=ref()
-const loading=ref(true)
+const formRef = ref()
+const loading = ref(true)
 const queryParams = reactive({
   pageNum: 1,
   pageSize: 10,
   username: null,
   name: null,
 })
-const contactList =ref([])
-const total=ref(0)
+const contactList = ref([])
+const total = ref(0)
 const queryFormRef = ref()
 
-onMounted(()=>{
+onMounted(() => {
   getList()
 })
-const getList=()=>{
+const getList = () => {
   loading.value = true
   const params = {
     pageNum: queryParams.pageNum,
     pageSize: queryParams.pageSize,
-    username: queryParams.username,
+    userName: queryParams.username,
     name: queryParams.name,
   }
   getContactPageList(params).then(response => {
@@ -90,12 +116,12 @@ const resetQuery = () => {
 // 表单重设
 const reset = () => {
   form.value = {
-      id: null,
-      userId: null,
-      name: null,
-      phones: null,
-      createTime: null,
-      userName:null,
+    id: null,
+    userId: null,
+    name: null,
+    phones: null,
+    createTime: null,
+    userName: null,
   }
   if (formRef.value) {
     formRef.value.resetFields()
@@ -104,14 +130,18 @@ const reset = () => {
 /** 查看按钮操作 */
 const handleView = (row) => {
   reset()
-  form.value = { ...row }
+  form.value = {...row}
   open.value = true
   title.value = "查看聯絡人"
   nextTick(() => {
     if (formRef.value) formRef.value.clearValidate && formRef.value.clearValidate()
   })
 }
-
+// 取消按钮
+const cancel = () => {
+  open.value = false
+  reset()
+}
 </script>
 <style scoped lang="scss">
 

+ 4 - 4
src/views/login.vue

@@ -77,8 +77,8 @@ const router = useRouter()
 const { proxy } = getCurrentInstance()
 
 const loginForm = ref({
-  username: "admin",
-  password: "admin123",
+  username: "",
+  password: "",
   rememberMe: false,
   code: "",
   uuid: ""
@@ -126,7 +126,7 @@ function handleLogin() {
           }
           return acc
         }, {})
-        router.push({ path: redirect.value || "/", query: otherQueryParams })
+        router.push({ path: "/user/myuser", query: otherQueryParams })
       }).catch(() => {
         loading.value = false
         // 重新获取验证码
@@ -169,7 +169,7 @@ getCookie()
   justify-content: center;
   align-items: center;
   height: 100%;
-  background-image: url("../assets/images/login-background.jpg");
+  background-image: url("../assets/images/background.png");
   background-size: cover;
 }
 .title {