bzkf3 2 gadi atpakaļ
vecāks
revīzija
9f80b8e682

+ 96 - 0
ci/index.html

@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
+    <title>当阳市中小学“爱问”在线辅导平台</title>
+    <script src="../js/mui.min.js"></script>
+    <link href="../css/mui.min.css" rel="stylesheet"/>
+    <link rel="stylesheet" href="../static/icon/iconfont.css">
+    <link rel="stylesheet" href="../static/animate/animate.css">
+    <link rel="stylesheet" href="../static/layui/css/layui.css">
+    <link rel="stylesheet" type="text/css" href="../css/main.css?v=20210915"/>
+    <link rel="stylesheet" type="text/css" href="../css/index.css?v=20221102"/>
+</head>
+
+<body>
+
+<script type="text/javascript">
+    // mui.init()
+</script>
+<!-- <header class="mui-bar mui-bar-nav" style="background:rgba(0,62,238,1);">
+        <h1 id="paperHeaderTitle" class="mui-title" style="color:#fff;">当阳市中小学“爱问”在线辅导平台</h1>
+</header> -->
+<div class="mui-content">
+    <div id="root" class="indexPage" v-clock>
+      <div class="logoPart">
+        <img src="../image/dyImg/indexLogo.png" alt="">
+      </div>
+      <div class="scrollNews">
+        <div class="scrollNews_left">课表</div>
+         <!-- <div class="scrollNews_middle">{{topNews.ni_title}}</div> -->
+          <div class="scrollNews_middle">
+              <div v-for="item in topNews" class="text-overflow" @click="toDetail(item.ni_id)">{{item.ni_title}}</div>
+          </div>
+        <div class="scrollNews_right" @click="toMore">更多</div>
+      </div>
+      <div class="fourthLink">
+        <div class="singleItem" v-for="(item,index) in bigItem" :key="index" @click="handleTab(item)">
+          <div class="tempimg"><img :src="item.tempimgUrl" alt=""></div>
+          <p>{{item.nameText}}</p>
+        </div>
+        <div class="singleItem" onclick="window.location.href = './course_health_m.html'">
+          <div class="tempimg"><img src="../image/dyImg/iconShow4.png" alt=""></div>
+          <p style="font-size: 12px;">心理健康(beta)</p>
+        </div>
+      </div>
+      <div class="recodeList" v-show="false">
+        <p class="listTitle">推荐列表</p>
+        <div class="singleClass">
+          <div class="singleClass_left">
+            vedio
+          </div>
+          <div class="singleClass_right">
+            <p class="info1">小学语文</p>
+            <p class="info2">每周六集中线上直播</p>
+            <p class="info3">直播时间:9:00-10:00</p>
+          </div>
+        </div>
+        <div class="singleClass">
+          <div class="singleClass_left">
+            vedio
+          </div>
+          <div class="singleClass_right">
+            <p class="info1">小学语文</p>
+            <p class="info2">每周六集中线上直播</p>
+            <p class="info3">直播时间:9:00-10:00</p>
+          </div>
+        </div>
+        <div class="singleClass">
+          <div class="singleClass_left">
+            vedio
+          </div>
+          <div class="singleClass_right">
+            <p class="info1">小学语文</p>
+            <p class="info2">每周六集中线上直播</p>
+            <p class="info3">直播时间:9:00-10:00</p>
+          </div>
+        </div>
+
+      </div>
+    </div>
+
+</div>
+</body>
+<script src="../js/jquery.min.js"></script>
+<script src="../js/vue.min.js"></script>
+<script src="../static/layui/layui.js"></script>
+<script src="../js/config.js?v=20200918"></script>
+<script src="../js/request.js?v=20200918"></script>
+<script src="../js/public.js"></script>
+<script src="../js/element.js?v=20210810"></script>
+<script src="../js/index.js?v=20221101"></script>
+
+</html>

+ 6 - 6
public/config.js

@@ -1,7 +1,7 @@
 // 本地开发环境
 const local = {
-  api: ' https://openapi.dev.bozedu.net/',
-  oss: ' https://openapi.dev.bozedu.net/',
+  api: 'https://openapi.dev.bozedu.net/',
+  oss: 'https://openapi.dev.bozedu.net/',
   uc: 'https://uc.dev.bozedu.net/',
 }
 
@@ -9,8 +9,8 @@ const local = {
 const development = {
   web_pc: 'https://dyawdev.bozedu.top/',
 
-  api: ' https://openapi.dev.bozedu.net/',
-  oss: ' https://openapi.dev.bozedu.net/',
+  api: 'https://openapi.dev.bozedu.net/',
+  oss: 'https://openapi.dev.bozedu.net/',
   uc: 'https://uc.dev.bozedu.net/',
 }
 
@@ -18,8 +18,8 @@ const development = {
 const production = {
   web_pc: 'https://dyaw.bozedu.net/',
 
-  api: ' https://openapi.bozedu.net/',
-  oss: ' https://openapi.bozedu.net/',
+  api: 'https://openapi.bozedu.net/',
+  oss: 'https://openapi.bozedu.net/',
   uc:'https://uc.bozedu.net/',
 }
 

+ 1 - 0
src/components/rtc-dialog/index.vue

@@ -45,6 +45,7 @@ defineExpose({
   open(d: type_dyaw_xlfw_zxhd, _mode: 'audio' | 'video') {
     if (isOpen) return;
     // isOpen = true
+    mins = false
     dyaw_xlfw_zxhd = d
     reqDate = {
       dxz_id: dyaw_xlfw_zxhd.dxz_id,

+ 1 - 2
src/pages/admin/home.vue

@@ -8,8 +8,7 @@ const imgSrc = (await request({
 const teacherList = (await request({
   url: '/dyaw/xlfw_pbgl_pb/index',
   data: {
-    // dxpp_date: (new Date('2023-4-2')).getTime()
-    // dxpp_date: Date.now()
+    dxpp_date: Date.now()
   }
 })).data?.page_data
 

+ 1 - 1
src/pages/student/home.vue

@@ -8,7 +8,7 @@ const imgSrc = (await request({
 const teacherList = (await request({
   url: '/dyaw/xlfw_pbgl_pb/index',
   data: {
-    // dxpp_date: Date.now()
+    dxpp_date: Date.now()
   }
 })).data?.page_data
 

+ 31 - 78
src/pages/teacher/consult.vue

@@ -1,94 +1,47 @@
-<script setup lang="ts">
+<script setup lang='ts'>
 import type { type_dyaw_xlfw_zxhd, type_dyaw_xlfw_zxhd_log, type_archives_item } from '~/types';
-import { Search } from '@element-plus/icons-vue'
 import user from '~/store/user';
-import router from '@/router';
-let dyaw_xlfw_zxhd = $ref<type_dyaw_xlfw_zxhd | undefined>()
-let dyaw_xlfw_zxhd_list = $ref<type_dyaw_xlfw_zxhd[] | undefined>()
-
-
-
-const searchValue = $ref('搜索')
-watch(
-  () => searchValue,
-  async (val, oldVal) => {
-    if (oldVal === '搜索') return;
-    dyaw_xlfw_zxhd_list = (await request({
-      url: '/dyaw/xlfw_zxhd/index',
-      data: {
-        dxz_tea_user_id: user.user_id,
-        dxz_stu_user_realname: searchValue === '搜索' ? undefined : searchValue,
-        limit: 20,
-        last_msg: 1
+import type { TSocketRes } from '~/utils/ws';
+import { type } from 'os';
+// ==========
+// chat audio/video
+// ==========
+
+let RtcDialogRef = $ref<typeof import("~/components/rtc-dialog/index.vue")['default']>()
+
+const ws2 = createSocket(
+  { teacher: user.user_id, student: '*' },
+  {
+    message(socketRes: TSocketRes<type_dyaw_xlfw_zxhd_log & { operate: CHAT_OPERATION }>) {
+      if (socketRes.from_client_name.endsWith('student')) {
+        // infoList.push(socketRes.content)
+        if (socketRes.content.dxzl_tea_user_id === user.user_id) {
+          console.log('RtcDialogRef : ', RtcDialogRef)
+          RtcDialogRef!.publisher(socketRes.content)
+        }
       }
-    })).data.page_data
+    }
   }
 )
+onMounted(() => {
+  RtcDialogRef!.init(ws2)
+})
 
-
-// let timer: NodeJS.Timeout;
-// (async function loop() {
-//   dyaw_xlfw_zxhd_list = (await request({
-//     url: '/dyaw/xlfw_zxhd/index',
-//     data: {
-//       dxz_tea_user_id: user.user_id,
-//       dxz_stu_user_realname: searchValue === '搜索' ? undefined : searchValue,
-//       limit: 20,
-//       last_msg: 1
-//     }
-//   })).data.page_data
-//   if (dyaw_xlfw_zxhd !== undefined) {
-//     const temp = dyaw_xlfw_zxhd_list!.find(item => item.dxz_stu_user_id === dyaw_xlfw_zxhd!.dxz_stu_user_id)
-//     if (temp?.dxz_id !== dyaw_xlfw_zxhd?.dxz_id) {
-//       dyaw_xlfw_zxhd = temp
-//     }
-//   }
-
-//   timer = setTimeout(async () => {
-//     await loop();
-//   }, 60 * 1000);
-// })();
-
-function handleClickStuCard(stu: type_dyaw_xlfw_zxhd) {
-  sessionStorage.setItem('dyaw_xlfw_zxhd', JSON.stringify(stu))
-  router.push({
-    name: 'teacher_consult_chat',
-  })
+function openRtcDialog(dyaw_xlfw_zxhd: type_dyaw_xlfw_zxhd, type: 'audio' | 'video') {
+  RtcDialogRef!.open(dyaw_xlfw_zxhd, type)
 }
 
 
 
-// onBeforeUnmount(() => {
-//   clearInterval(timer)
-// })
 
-function onClickLeft() {
-  router.back()
-}
 
+const updateFnList = $ref<Function[]>([])
+function emitUpdateInfo(info: type_dyaw_xlfw_zxhd_log, isUpdate?: boolean) {
+  updateFnList.forEach(fn => fn(info, isUpdate))
+}
 </script>
 
 <template>
-  <van-nav-bar title="咨询页面" left-text="" left-arrow @click-left="onClickLeft"
-    style="--van-nav-bar-background:#397FF6;--van-nav-bar-icon-color:#fff;--van-nav-bar-title-text-color:#fff;--van-nav-bar-title-font-size:18px;--van-nav-bar-text-color:#fff;" />
-  <div class="p-10px flex-auto flex flex-col justify-start bg-white space-y-4">
-    <el-input autocomplete="off" name="searchValue" v-model="searchValue" size="large" :prefix-icon="Search"
-      @focus="searchValue = ''" clearable placeholder="搜索"
-      :style="`${searchValue === '搜索' && '--ep-input-text-color:var(--ep-text-color-placeholder);'}`"></el-input>
-
-    <remote-list url="/dyaw/xlfw_zxhd/index" loop :d="{
-      dxz_tea_user_id: user.user_id,
-      dxz_stu_user_realname: searchValue === '搜索' ? undefined : searchValue,
-      limit: 20,
-      last_msg: 1
-    }" class="mt-2 flex-auto">
-      <template #default="{ row: item }">
-        <chat-stu-card :d="item" @click="handleClickStuCard(item)" class="h-68px"
-          style="border-bottom: 1px solid #f3f4f6;"></chat-stu-card>
-      </template>
-    </remote-list>
-  </div>
+  <RouterView @openRtcDialog="openRtcDialog" :update-fn-list="updateFnList"></RouterView>
+  <rtc-dialog ref="RtcDialogRef" @update-info="emitUpdateInfo"></rtc-dialog>
 </template>
-
-<style scoped lang="scss">
-</style>

+ 35 - 24
src/pages/teacher/chat-list.vue

@@ -13,9 +13,11 @@ import { showConfirmDialog, showSuccessToast, showFailToast } from 'vant';
 let dyaw_xlfw_zxhd = $ref<type_dyaw_xlfw_zxhd>(JSON.parse(sessionStorage.getItem('dyaw_xlfw_zxhd')!))
 let dyaw_xlfw_zxhd_list = $ref<type_dyaw_xlfw_zxhd[] | undefined>()
 
+const emits = defineEmits<{
+  (event: 'openRtcDialog', dyaw_xlfw_zxhd: type_dyaw_xlfw_zxhd, type: 'audio' | 'video'): void;
+}>()
 
-
-
+const props = defineProps<{updateFnList:Function[]}>()
 
 let infoList = $ref<Array<type_dyaw_xlfw_zxhd_log>>([])
 let inputValue = $ref('')
@@ -266,34 +268,36 @@ function handleQueryArchives() {
 // chat audio/video
 // ==========
 
-let RtcDialogRef = $ref<typeof import("~/components/rtc-dialog/index.vue")['default']>()
-
-const ws2 = createSocket(
-  { teacher: user.user_id, student: '*' },
-  {
-    message(socketRes: TSocketRes<type_dyaw_xlfw_zxhd_log & { operate: CHAT_OPERATION }>) {
-      if (socketRes.from_client_name.endsWith('student')) {
-        // infoList.push(socketRes.content)
-        if (socketRes.content.dxzl_tea_user_id === user.user_id) {
-          console.log('RtcDialogRef : ', RtcDialogRef)
-          RtcDialogRef!.publisher(socketRes.content)
-        }
-      }
-    }
-  }
-)
-onMounted(() => {
-  RtcDialogRef!.init(ws2)
-})
+// let RtcDialogRef = $ref<typeof import("~/components/rtc-dialog/index.vue")['default']>()
+
+// const ws2 = createSocket(
+//   { teacher: user.user_id, student: '*' },
+//   {
+//     message(socketRes: TSocketRes<type_dyaw_xlfw_zxhd_log & { operate: CHAT_OPERATION }>) {
+//       if (socketRes.from_client_name.endsWith('student')) {
+//         // infoList.push(socketRes.content)
+//         if (socketRes.content.dxzl_tea_user_id === user.user_id) {
+//           console.log('RtcDialogRef : ', RtcDialogRef)
+//           RtcDialogRef!.publisher(socketRes.content)
+//         }
+//       }
+//     }
+//   }
+// )
+// onMounted(() => {
+//   RtcDialogRef!.init(ws2)
+// })
 
 
 
 async function handleAudioChatStart() {
-  RtcDialogRef!.open(dyaw_xlfw_zxhd, 'audio')
+  // RtcDialogRef!.open(dyaw_xlfw_zxhd, 'audio')
+  emits('openRtcDialog', dyaw_xlfw_zxhd, 'audio')
 }
 
 async function handleVideoChatStart() {
-  RtcDialogRef!.open(dyaw_xlfw_zxhd, 'video')
+  // RtcDialogRef!.open(dyaw_xlfw_zxhd, 'video')
+  emits('openRtcDialog', dyaw_xlfw_zxhd, 'video')
 }
 
 function emitUpdateInfo(info: type_dyaw_xlfw_zxhd_log, isUpdate?: boolean) {
@@ -308,6 +312,13 @@ function emitUpdateInfo(info: type_dyaw_xlfw_zxhd_log, isUpdate?: boolean) {
   }
 }
 
+props.updateFnList.push(emitUpdateInfo)
+
+onBeforeUnmount(() => {
+  props.updateFnList.splice(0)
+})
+
+
 const router = useRouter()
 function onClickLeft() {
   router.back()
@@ -386,7 +397,7 @@ let showRightArchives = $ref(false)
 
 
 
-  <rtc-dialog ref="RtcDialogRef" @update-info="emitUpdateInfo"></rtc-dialog>
+  <!-- <rtc-dialog ref="RtcDialogRef" @update-info="emitUpdateInfo"></rtc-dialog> -->
 </template>
 
 <style scoped lang="scss">

+ 98 - 0
src/pages/teacher/consult/consult.vue

@@ -0,0 +1,98 @@
+<script setup lang="ts">
+import type { type_dyaw_xlfw_zxhd, type_dyaw_xlfw_zxhd_log, type_archives_item } from '~/types';
+import { Search } from '@element-plus/icons-vue'
+import user from '~/store/user';
+import router from '@/router';
+let dyaw_xlfw_zxhd = $ref<type_dyaw_xlfw_zxhd | undefined>()
+let dyaw_xlfw_zxhd_list = $ref<type_dyaw_xlfw_zxhd[] | undefined>()
+
+const emits = defineEmits<{
+  (event: 'openRtcDialog', dyaw_xlfw_zxhd: type_dyaw_xlfw_zxhd, type: 'audio' | 'video'): void;
+}>()
+
+const props = defineProps<{updateFnList:Function[]}>()
+
+const searchValue = $ref('搜索')
+watch(
+  () => searchValue,
+  async (val, oldVal) => {
+    if (oldVal === '搜索') return;
+    dyaw_xlfw_zxhd_list = (await request({
+      url: '/dyaw/xlfw_zxhd/index',
+      data: {
+        dxz_tea_user_id: user.user_id,
+        dxz_stu_user_realname: searchValue === '搜索' ? undefined : searchValue,
+        limit: 20,
+        last_msg: 1
+      }
+    })).data.page_data
+  }
+)
+
+
+// let timer: NodeJS.Timeout;
+// (async function loop() {
+//   dyaw_xlfw_zxhd_list = (await request({
+//     url: '/dyaw/xlfw_zxhd/index',
+//     data: {
+//       dxz_tea_user_id: user.user_id,
+//       dxz_stu_user_realname: searchValue === '搜索' ? undefined : searchValue,
+//       limit: 20,
+//       last_msg: 1
+//     }
+//   })).data.page_data
+//   if (dyaw_xlfw_zxhd !== undefined) {
+//     const temp = dyaw_xlfw_zxhd_list!.find(item => item.dxz_stu_user_id === dyaw_xlfw_zxhd!.dxz_stu_user_id)
+//     if (temp?.dxz_id !== dyaw_xlfw_zxhd?.dxz_id) {
+//       dyaw_xlfw_zxhd = temp
+//     }
+//   }
+
+//   timer = setTimeout(async () => {
+//     await loop();
+//   }, 60 * 1000);
+// })();
+
+function handleClickStuCard(stu: type_dyaw_xlfw_zxhd) {
+  sessionStorage.setItem('dyaw_xlfw_zxhd', JSON.stringify(stu))
+  router.push({
+    name: 'teacher_consult_chat',
+  })
+}
+
+
+
+// onBeforeUnmount(() => {
+//   clearInterval(timer)
+// })
+
+function onClickLeft() {
+  router.back()
+}
+
+</script>
+
+<template>
+  <van-nav-bar title="咨询页面" left-text="" left-arrow @click-left="onClickLeft"
+    style="--van-nav-bar-background:#397FF6;--van-nav-bar-icon-color:#fff;--van-nav-bar-title-text-color:#fff;--van-nav-bar-title-font-size:18px;--van-nav-bar-text-color:#fff;" />
+  <div class="p-10px flex-auto flex flex-col justify-start bg-white space-y-4">
+    <el-input autocomplete="off" name="searchValue" v-model="searchValue" size="large" :prefix-icon="Search"
+      @focus="searchValue = ''" clearable placeholder="搜索"
+      :style="`${searchValue === '搜索' && '--ep-input-text-color:var(--ep-text-color-placeholder);'}`"></el-input>
+
+    <remote-list url="/dyaw/xlfw_zxhd/index" loop :d="{
+      dxz_tea_user_id: user.user_id,
+      dxz_stu_user_realname: searchValue === '搜索' ? undefined : searchValue,
+      limit: 20,
+      last_msg: 1
+    }" class="mt-2 flex-auto">
+      <template #default="{ row: item }">
+        <chat-stu-card :d="item" @click="handleClickStuCard(item)" class="h-68px"
+          style="border-bottom: 1px solid #f3f4f6;"></chat-stu-card>
+      </template>
+    </remote-list>
+  </div>
+</template>
+
+<style scoped lang="scss">
+</style>

+ 55 - 7
src/pages/teacher/personal.vue

@@ -1,7 +1,8 @@
 <script setup lang='ts'>
 import user from '~/store/user';
 import { showSuccessToast, showFailToast } from 'vant';
-// import MUploader from '~/components/m-uploader/index.vue';
+import { REQUEST } from '~/utils/request'
+import { resolveFileString } from '~/utils/helper'
 
 const router = useRouter()
 function onClickLeft() {
@@ -17,6 +18,14 @@ const filterObj = (obj: { [x: string]: any; }, prefix: string) => {
         newObj[key] = obj[key] * 1
         continue
       }
+      if (key === 'dxp_user_avatar') {
+        newObj[key] = [{ url: obj[key] }]
+        continue
+      }
+      if (key === 'dxp_wx_qrcode') {
+        newObj[key] = [{ url: obj[key] }]
+        continue
+      }
       newObj[key] = obj[key]
     }
   }
@@ -47,7 +56,10 @@ async function onClickRight() {
       url: '/dyaw/xlfw_pbgl/edit',
       data: {
         dxp_id: form.dxp_id,
-        dyaw_xlfw_pbgl: form
+        dyaw_xlfw_pbgl: Object.assign({}, form, {
+          dxp_user_avatar: form.dxp_user_avatar[0]?.url,
+          dxp_wx_qrcode: form.dxp_wx_qrcode[0]?.url,
+        })
       }
     }).then(res => {
       if (res.code === '1') {
@@ -62,6 +74,40 @@ async function onClickRight() {
   readonly = !readonly
 
 }
+
+const handleAfterRead = (fileProxy) => {
+  fileProxy.status = 'uploading'
+  fileProxy.message = '上传中...'
+  const { file } = fileProxy
+  REQUEST.upload({
+    url: '/upload/main/file',
+    data: { filedata: file },
+  }).then((res) => {
+    console.log('res :>> ', res)
+    if (res.code === '1') {
+      // fileList.value.push(res.data)
+      fileProxy.url = `${window.GLOBAL_CONFIG.oss}/${res.data.url}`
+      fileProxy.res = {
+        name: res.data.file_name,
+        url: fileProxy.url,
+        origin: res.data.url,
+      }
+      fileProxy.status = 'done'
+      fileProxy.message = ''
+
+      // emits('update:part', fileList.map((item) => item.res.name + ',' + item.res.url).join(';'))
+      // emits('update:part', fileList.map((item) => item.res.name + ',' + item.res.url).join(';'))
+      // emits('update:modelValue', fileList.map(item => `${item.res.name},${item.res.origin}`).join(';'))
+      // emits('update:modelValue', fileList.map(item => `${item.res.origin}`).join(';'))
+    }
+    else {
+      fileProxy.status = 'failed'
+      fileProxy.message = '上传失败'
+    }
+  }).catch((err) => {
+    console.error(err)
+  })
+}
 </script>
 
 <template>
@@ -74,7 +120,8 @@ async function onClickRight() {
       <van-cell-group>
         <van-field name="头像" label="头像">
           <template #input>
-            <m-uploader v-model="form.dxp_user_avatar" :max-count="1" />
+            <van-uploader :readonly="readonly" :deletable="!readonly" v-model="form.dxp_user_avatar"
+              :after-read="handleAfterRead" :max-count="1" />
           </template>
         </van-field>
         <van-field v-model="form.dxp_user_name" name="账号" label="账号" :rules="[{ required: true, message: '请填写账号' }]" />
@@ -84,12 +131,13 @@ async function onClickRight() {
           :rules="[{ required: true, message: '请填写正确的联系电话', pattern: /^1[3456789]\d{9}$/ }]" />
         <van-field name="微信二维码" label="微信二维码">
           <template #input>
-            <m-uploader v-model="form.dxp_wx_qrcode" :max-count="1" />
+            <van-uploader :readonly="readonly" :deletable="!readonly" v-model="form.dxp_wx_qrcode"
+              :after-read="handleAfterRead" :max-count="1" />
           </template>
         </van-field>
-        <van-field v-model="form.dxp_bzxcs" name="被咨询次数" label="被咨询次数" readonly />
-        <van-field v-model="form.dxp_jdsc" name="接待时长" label="接待时长" readonly />
-        <van-field name="平均星级" label="平均星级" readonly>
+        <van-field v-model="form.dxp_bzxcs" name="被咨询次数" label="被咨询次数" readonly :disabled="!readonly" />
+        <van-field v-model="form.dxp_jdsc" name="接待时长" label="接待时长" readonly :disabled="!readonly" />
+        <van-field name="平均星级" label="平均星级" readonly :disabled="!readonly" >
           <template #input>
             <van-rate v-model="form.dxp_pjxj" readonly />
           </template>

+ 13 - 6
src/router/routes/teacher.ts

@@ -15,12 +15,19 @@ export default {
     {
       path: 'consult',
       name: 'teacher_consult',
-      component: () => import('@/pages/teacher/consult.vue')
-    },
-    {
-      path: 'clist',
-      name: 'teacher_consult_chat',
-      component: () => import('@/pages/teacher/chat-list.vue')
+      component: () => import('@/pages/teacher/consult.vue'),
+      redirect: { name: 'teacher_consult_list' },
+      children: [
+        {
+          path: 'consult',
+          name: 'teacher_consult_list',
+          component: () => import('@/pages/teacher/consult/consult.vue')
+        },
+        {
+          path: 'clist',
+          name: 'teacher_consult_chat',
+          component: () => import('@/pages/teacher/consult/chat-list.vue')
+        },]
     },
     {
       path: 'archives',