10:科室排班日期+科室排班详细数据+搭建平台用户系统前端环境

本文详细介绍了医疗预约系统中查看科室排班数据的接口实现,包括数据统计和详细信息展示,以及前端页面的整合。同时,讨论了服务端渲染的重要性,介绍了Nuxt.js在搭建前端环境中的应用,以及如何进行静态数据整合和首页数据显示。此外,还涵盖了医院数据接口的设计和实现,以及页面动态加载和SEO优化的相关内容。
摘要由CSDN通过智能技术生成

内容介绍

 

1、查看科室排班日期统计数据

 

2、查看科室排班详细数据

 

3、搭建平台用户系统前端环境

 

4、首页静态数据整合

 

5、首页数据显示接口

 

6、首页数据显示前端

 

 

 

 

查看科室排班日期统计数据

1确认需求

2、实现接口

1)分析接口

*参数:page、limit、hoscode、depcode

*返回值:R(Map(total、List<BookingScheduleRuleVo>。。。))

(2)创建controller

@Api(tags = "排班管理")

  @RestController

@RequestMapping("/admin/hosp/schedule")

  public class ScheduleController {

    @Autowired

    private ScheduleService scheduleService;

    

    //根据医院编号  科室编号 ,查询排班规则数据

    @ApiOperation(value ="查询排班规则统计数据")

    @GetMapping("getScheduleRule/{page}/{limit}/{hoscode}/{depcode}")

    public R getScheduleRule(@PathVariable long page,

                             @PathVariable long limit,

                             @PathVariable String hoscode,

                             @PathVariable String depcode) {

        Map<String,Object> map = scheduleService.getScheduleRule(page,limit,hoscode,depcode);

        return R.ok().data(map);

    }

  }

(3)如果是mysql如何实现

#根据医院编号 和 科室编号 ,查询排班规则统计数据,带分页带排序

SELECT s.workDate,COUNT(id) AS docCount,

SUM(s.reservedNumber) AS reservedNumber,

SUM(s.availableNumber) AS availableNumber

 FROM SCHEDULE s

WHERE  s.hoscode = '医院编号' AND s.depcode = '科室编号'

GROUP BY s.workDate

ORDER BY s.workDate

LIMIT XXXX;

 

c404fd11c2d34bebbd3c598ec6a448e4.png

(4)梳理service实现步骤

//查询排班规则统计数据

  @Override

  public Map<String, Object> getScheduleRule(long page, long limit,

                                           String hoscode, String depcode) {

    //1创建返回对象

    //2根据医院编码、科室编码筛选,根据排班日期、带排序带分页聚合查询(List)

    //3根据医院编码、科室编码筛选,根据排班日期、聚合查询(total)

    //4遍历集合根据排班日期推算出周几

    //5把查询数据存入返回对象

    //6补全数据

    return null;

  }
(5)导入日期工具依赖

<dependency>

    <groupId>joda-time</groupId>

    <artifactId>joda-time</artifactId>

  </dependency>
(6)实现接口方法

@Autowired

  private MongoTemplate mongoTemplate;

  @Autowired

  private HospitalService hospitalService;


//查询排班规则统计数据

  @Override

  public Map<String, Object> getScheduleRule(long page, long limit,

                                           String hoscode, String depcode) {

    //1创建返回对象

    Map<String, Object> result = new HashMap<>();

    //2根据医院编码、科室编码筛选,根据排班日期、带排序带分页聚合查询(List)

    //2.1封装筛选条件

    Criteria criteria = Criteria.where("hoscode").is(hoscode)

            .and("depcode").is(depcode);

    //2.2创建聚合查询对象

    Aggregation agg =Aggregation.newAggregation(

            //2.2.1设置筛选条件

            Aggregation.match(criteria),

            //2.2.2设置聚合字段,查询收集字段

            Aggregation.group("workDate")

                    .first("workDate").as("workDate")

                    .count().as("docCount")

                    .sum("reservedNumber").as("reservedNumber")

                    .sum("availableNumber").as("availableNumber"),

            //2.2.3设置排序

            Aggregation.sort(Sort.Direction.ASC,"workDate"),

            //2.2.4设置分页

            Aggregation.skip((page-1)*limit),

            Aggregation.limit(limit)

    );

    //2.3进行聚合查询(list)

    AggregationResults<BookingScheduleRuleVo> aggregate = mongoTemplate.aggregate(agg, Schedule.class, BookingScheduleRuleVo.class);

    List<BookingScheduleRuleVo> bookingScheduleRuleVoList = aggregate.getMappedResults();

    //3根据医院编码、科室编码筛选,根据排班日期、聚合查询(total)

    //3.1创建聚合查询对象

    Aggregation aggTotal =Aggregation.newAggregation(

            //2.2.1设置筛选条件

            Aggregation.match(criteria),

            //2.2.2设置聚合字段,查询收集字段

            Aggregation.group("workDate")

    );

    //3.2进行聚合查询(total)

    AggregationResults<BookingScheduleRuleVo> aggregateTotal = mongoTemplate.aggregate(aggTotal, Schedule.class, BookingScheduleRuleVo.class);

    List<BookingScheduleRuleVo> totalResults = aggregateTotal.getMappedResults();

    int total = totalResults.size();

    //4遍历集合根据排班日期推算出周几

    for (BookingScheduleRuleVo bookingScheduleRuleVo : bookingScheduleRuleVoList) {

        Date workDate = bookingScheduleRuleVo.getWorkDate();

        String dayOfWeek =this.getDayOfWeek(new DateTime(workDate));

        bookingScheduleRuleVo.setDayOfWeek(dayOfWeek);

    }

    //5把查询数据存入返回对象

    result.put("bookingScheduleRuleList",bookingScheduleRuleVoList);

    result.put("total",total);

    //6补全数据

    //获取医院名称

    String hosName = hospitalService.getHospName(hoscode);

    //其他基础数据

    Map<String, String> baseMap = new HashMap<>();

    baseMap.put("hosname",hosName);

    result.put("baseMap",baseMap);

    return result;

  }


*相关工具

//换算周几

  private String getDayOfWeek(DateTime dateTime) {

    String dayOfWeek = "";

    switch (dateTime.getDayOfWeek()) {

        case DateTimeConstants.SUNDAY:

            dayOfWeek = "周日";

            break;

        case DateTimeConstants.MONDAY:

            dayOfWeek = "周一";

            break;

        case DateTimeConstants.TUESDAY:

            dayOfWeek = "周二";

            break;

        case DateTimeConstants.WEDNESDAY:

            dayOfWeek = "周三";

            break;

        case DateTimeConstants.THURSDAY:

            dayOfWeek = "周四";

            break;

        case DateTimeConstants.FRIDAY:

            dayOfWeek = "周五";

            break;

        case DateTimeConstants.SATURDAY:

            dayOfWeek = "周六";

        default:

            break;

    }

    return dayOfWeek;

  }


*相关接口

//根据hoscode获取医院名称

  @Override

  public String getHospName(String hoscode) {

    Hospital hospital = hospitalRepository.getByHoscode(hoscode);

    return hospital.getHosname();

  }

(7)测试

e311d02ad7344fa1b38ec30e406c7178.png

 

3、对接前端

(1)创建api接口文件

在api/yygh创建schedule.js

import request from '@/utils/request'



const api_name = '/admin/hosp/schedule'



export default {

    //查询排班规则统计数据

    getScheduleRule(page,limit,hoscode,depcode) {

        return request({

            url: `${api_name}/getScheduleRule/${page}/${limit}/${hoscode}/${depcode}`,

            method: 'get'

        })

    }

}

(2)改造页面

<!-- 排班日期 分页 -->

          <el-tag

            v-for="(item,index) in bookingScheduleList"

            :key="item.id"

            @click="selectDate(item.workDate, index)"

            :type="index == activeIndex ? '' : 'info'"

            style="height: 60px;margin-right: 5px;margin-right:15px;cursor:pointer;"

          >

            {{ item.workDate }} {{ item.dayOfWeek }}

            <br>

            {{ item.availableNumber }} / {{ item.reservedNumber }}

          </el-tag>



          <!-- 分页 -->

          <el-pagination

            :current-page="page"

            :total="total"

            :page-size="limit"

            class="pagination"

            layout="prev, pager, next"

            @current-change="getPage"

          ></el-pagination>

(3)改造js

<script>

import hospApi from "@/api/yygh/hosp";

import scheduleApi from "@/api/yygh/schedule";



export default {

  data() {

    return {

      data: [], //科室集合

      defaultProps: {

        //默认支柱属性

        children: "children",

        label: "depname"

      },

      hoscode: "", //医院编码

      activeIndex: 0, //选中索引号

      depcode: null, //选中科室编码

      depname: null, //选中科室名称

      workDate: null, //选中排班日期



      bookingScheduleList: [], //排班日期统计集合

      baseMap: {}, //基础展示对象



      page: 1, // 当前页

      limit: 7, // 每页个数

      total: 0 // 总页码

    };

  },

  created() {

    this.hoscode = this.$route.params.hoscode;

    this.fetchData();

  },

  methods: {

    //查询科室数据

    fetchData() {

      hospApi.getDeptByHoscode(this.hoscode).then(response => {

        this.data = response.data.list;

        //默认选中第一个小科室信息

        this.depcode = this.data[0].children[0].depcode;

        this.depname = this.data[0].children[0].depname;

        //排班日期统计分页方法

        this.getPage();

      });

    },

    //点击一个科室触发

    handleNodeClick(node) {

      //如果大科室返回

      if (node.children) {

        return;

      }

      //设置选中科室信息

      this.depcode = node.depcode;

      this.depname = node.depname;

      //排班日期统计分页方法

      this.getPage();

    },

    //排班日期统计分页方法

    getPage(page = 1) {

      //设置参数

      this.page = page;

      this.workDate = null;

      this.activeIndex = 0;

      //调用排班日期统计方法

      this.getBookingScheduleList();

    },

    //调用排班日期统计方法

    getBookingScheduleList() {

      scheduleApi

        .getScheduleRule(this.page, this.limit, this.hoscode, this.depcode)

        .then(response => {

          this.bookingScheduleList = response.data.bookingScheduleRuleList

          this.total = response.data.total

          this.baseMap = response.data.baseMap



          if(this.workDate == null){

              this.workDate  = this.bookingScheduleList[0].workDate

          }

          //......



        });

    },

    //点选某一天

    selectDate(workDate, index){

        this.workDate  = workDate

        this.activeIndex = index

        //......

    }



  }

};

</script>

 

(4)测试

dfa5f2f64c88467ea18d13aff6371a9f.png

 

查看科室排班详细数据

1、需求分析

70dc847aba614613923d542dc82b6f14.png

  1. 根据医院、科室、排班日期查询排班列表
  2. 翻译字段

2、实现接口

(1)分析接口

*参数:hoscode、depcode、workDate

*返回值:R(List<Schedule>)

(2)实现controller

//根据医院编号 、科室编号和工作日期,查询排班详细信息

  @ApiOperation(value = "查询排班详细信息")

  @GetMapping("getScheduleDetail/{hoscode}/{depcode}/{workDate}")

  public R getScheduleDetail( @PathVariable String hoscode,

                            @PathVariable String depcode,

                            @PathVariable String workDate) {

    List<Schedule> list = scheduleService

            .getScheduleDetail(hoscode,depcode,workDate);

    return R.ok().data("list",list);

  }

(3)实现service

//查询排班详细信息集合

  @Override

  public List<Schedule> getScheduleDetail(String hoscode, String depcode, String workDate) {

    //1调用方法查询数据

    List<Schedule>  scheduleList =

            scheduleRepository.getByHoscodeAndDepcodeAndWorkDate(

                    hoscode,depcode,new DateTime(workDate).toDate()

            );

    //2遍历集合翻译字段

    scheduleList.forEach(item->{

        this.packSchedule(item);

    });

  

    return scheduleList;

  }

(4)查询接口

  @Repository

  public interface ScheduleRepository extends MongoRepository<Schedule,String> {

    //根据hoscodehosScheduleId查询排班信息

    Schedule getByHoscodeAndHosScheduleId(String hoscode, String hosScheduleId);

    //根据医院编号 、科室编号和工作日期,查询排班详细信息

    List<Schedule> getByHoscodeAndDepcodeAndWorkDate(String hoscode, String depcode, Date workDate);

  }

 

(5)测试

1981c786287f4ac6a455995d7b24ad93.png

3、对接前端

(1)创建api

//查询排班详情

    getScheduleDetail(hoscode, depcode, workDate) {

        return request({

            url: `${api_name}/getScheduleDetail/${hoscode}/${depcode}/${workDate}`,

            method: 'get'

        })

    }

(2)添加页面元素

<el-table v-loading="listLoading" :data="scheduleList" border fit highlight-current-row>

            <el-table-column label="序号" width="60" align="center">

              <template slot-scope="scope">{{ scope.$index + 1 }}</template>

            </el-table-column>

            <el-table-column label="职称" width="150">

              <template slot-scope="scope">{{ scope.row.title }} | {{ scope.row.docname }}</template>

            </el-table-column>

            <el-table-column label="号源时间" width="80">

              <template slot-scope="scope">{{ scope.row.workTime == 0 ? "上午" : "下午" }}</template>

            </el-table-column>

            <el-table-column prop="reservedNumber" label="可预约数" width="80"/>

            <el-table-column prop="availableNumber" label="剩余预约数" width="100"/>

            <el-table-column prop="amount" label="挂号费(元)" width="90"/>

            <el-table-column prop="skill" label="擅长技能"/>

          </el-table>

(3)改造js

data() {

    return {

      data: [], //科室集合

      defaultProps: {

        //默认支柱属性

        children: "children",

        label: "depname"

      },

      hoscode: "", //医院编码

      activeIndex: 0, //选中索引号

      depcode: null, //选中科室编码

      depname: null, //选中科室名称

      workDate: null, //选中排班日期



      bookingScheduleList: [], //排班日期统计集合

      baseMap: {}, //基础展示对象



      page: 1, // 当前页

      limit: 7, // 每页个数

      total: 0, // 总页码

      listLoading: true,

      scheduleList: []

    };

  },

  created() {

    this.hoscode = this.$route.params.hoscode;

    this.fetchData();

  },

  methods: {

    //查询科室数据

    fetchData() {

      hospApi.getDeptByHoscode(this.hoscode).then(response => {

        this.data = response.data.list;

        //默认选中第一个小科室信息

        this.depcode = this.data[0].children[0].depcode;

        this.depname = this.data[0].children[0].depname;

        //排班日期统计分页方法

        this.getPage();

      });

    },

    //点击一个科室触发

    handleNodeClick(node) {

      //如果大科室返回

      if (node.children) {

        return;

      }

      //设置选中科室信息

      this.depcode = node.depcode;

      this.depname = node.depname;

      //排班日期统计分页方法

      this.getPage();

    },

    //排班日期统计分页方法

    getPage(page = 1) {

      //设置参数

      this.page = page;

      this.workDate = null;

      this.activeIndex = 0;

      this.scheduleList = [];

      //调用排班日期统计方法

      this.getBookingScheduleList();

    },

    //调用排班日期统计方法

    getBookingScheduleList() {

      scheduleApi

        .getScheduleRule(this.page, this.limit, this.hoscode, this.depcode)

        .then(response => {

          this.bookingScheduleList = response.data.bookingScheduleRuleList;

          this.total = response.data.total;

          this.baseMap = response.data.baseMap;



          if (this.workDate == null) {

            this.workDate = this.bookingScheduleList[0].workDate;

          }

          //获取排班明细集合

          this.getScheduleList();

        });

    },

    //点选某一天

    selectDate(workDate, index) {

      this.workDate = workDate;

      this.activeIndex = index;

      //获取排班明细集合

      this.getScheduleList();

    },

    //获取排班明细集合

    getScheduleList() {

      scheduleApi

        .getScheduleDetail(this.hoscode, this.depcode, this.workDate)

        .then(response => {

          console.log(response)

          this.scheduleList = response.data.list;

          this.listLoading = false;

        });

    }

  }

 

 

(4)测试

8632caa3d56c42e5b6e5446efe386d4e.png

 

 

 

搭建平台用户系统前端环境

1、相关概念

(1)服务端渲染

服务端渲染又称SSR (Server Side Render)是在服务端完成页面的内容,而不是在客户端通过AJAX获取数据。

(2)SEO

服务器端渲染(SSR)的优势主要在于:更好的 SEO,由于搜索引擎爬虫抓取工具可以直接查看完全渲染的页面。

 

2、什么是NUXT

Nuxt.js 是一个基于 Vue.js 的轻量级应用框架,可用来创建服务端渲染 (SSR) 应用,也可充当静态站点引擎生成静态站点应用,具有优雅的代码结构分层和热加载等特性。

48eddee1bfdb4e0aa803b43caa0052d2.png

 

2、创建前端工程(标准步骤)

(1)获取工程包

760df8a2a412496590a711197038b619.png

(2)解压后,找到目录,修改工程名,复制到开发目录

yygh_site

9ef92b9f718b44d0b2a065d35bb72f39.png

(3)修改配置文件,插值表达式改成字符串

e7b006a59ec043dcad05cb4bd85e2e30.png

58d598d422c6415889703964bb97fc50.png

(4)下载依赖

(5)启动工程

npm run dev

 

3、创建前端工程(快捷步骤)

(1)获取工程包

9c9824af25ca4bbf8b7fcd7e0670f18f.png

(2)解压后,复制到开发目录

(3)启动工程

npm run dev

fbf098cfae90432e81c72e5db54c27b8.png

ec4ec62155fc4a1dbf74bd9b228275a2.png

 

4、工程目录介绍

(1)资源目录 assets

 用于组织未编译的静态资源如 LESS、SASS 或 JavaScript。

(2)布局目录 layouts

用于组织应用的布局组件。

(3)页面目录 pages

存放前台系统所有页面内容,和layouts下组件整合完整页面

 

5、封装axios

(1)安装

npm install axios

(2)创建utils文件夹,创建request.js

import axios from 'axios'

import { MessageBox, Message } from 'element-ui'

// 创建axios实例

const service = axios.create({

    baseURL: 'http://localhost:8200/',

    timeout: 15000 // 请求超时时间

})

// http request 拦截器

service.interceptors.request.use(

    config => {

    // token 先不处理,后续使用时在完善

    return config

},

  err => {

    return Promise.reject(err)

})

// http response 拦截器

service.interceptors.response.use(

    response => {

        if (response.data.code !== 20000) {

            Message({

                message: response.data.message,

                type: 'error',

                duration: 5 * 1000

            })

            return Promise.reject(response.data)

        } else {

            return response.data

        }

    },

    error => {

        return Promise.reject(error.response)

})

export default service

 

 

 

首页静态数据整合

1、页面组成

7ffb229234c0482093a555dede529026.png

 

 

2、添加静态资源

610d48f0fc974da0a9dec36953f6d4b3.png

 

 

3、整合布局页面

(1)提取头文件

创建layouts/myheader.vue文件

<template>

  <div class="header-container">

    <div class="wrapper">

      <!-- logo -->

      <div class="left-wrapper v-link selected">

        <img style="width: 50px" width="50" height="50" src="~assets/images/logo.png">

        <span class="text">尚医通 预约挂号统一平台</span>

      </div>

      <!-- 右侧 -->

      <div class="right-wrapper">

        <span class="v-link clickable">帮助中心</span>

        <span class="v-link clickable" @click="dialogUserFormVisible = true">登录/注册</span>

      </div>

    </div>

  </div>

</template>

<script>

export default {};

</script>

(2)提取尾文件

创建layouts/myfooter.vue文件

<template>

  <div class="footer-container">

    <div class="wrapper">

      <div><span class="record">京ICP备atguigu号</span><span

        class="phone">www.atguigu.com</span></div>

      <div class="right"><span

        class="v-link clickable"> 联系我们 </span><span

        class="v-link clickable"> 合作伙伴 </span><span

        class="v-link clickable"> 用户协议 </span><span

        class="v-link clickable"> 隐私协议 </span></div>

    </div>

  </div>

</template>



<script>

export default {



}

</script>



(3)整合到默认布局

修改layouts/default.vue文件

<template>

  <div class="app-container">

    <div id="main">

      <!-- 公共头 -->

      <myheader/>

      <div class="main-container">

        <el-scrollbar class='page-component__scroll'>

          <!-- 内容区域 -->

          <nuxt/>

        </el-scrollbar>

      </div>

      <!-- 公共底 -->

      <myfooter/>

    </div>

  </div>

</template>

<script>

import '~/assets/css/app.css'

import '~/assets/css/chunk.css'

import '~/assets/css/iconfont.css'

import '~/assets/css/main.css'



import myheader from './myheader'

import myfooter from './myfooter'



export default {



  components: {

    myheader,myfooter

  },



  mounted() {

    window.document.getElementById("__nuxt").classList.add("app-container")

    window.document.getElementById("__layout").classList.add("app-container")

  }

}

</script>



4、修改首页面

修改pages/index.vue文件

<template>

  <div class="home page-component">

    <el-carousel indicator-position="outside">

      <el-carousel-item v-for="item in 2" :key="item">

        <img src="~assets/images/web-banner1.png" alt>

      </el-carousel-item>

    </el-carousel>

    <!-- 搜索 -->

    <div class="search-container">

      <div class="search-wrapper">

        <div class="hospital-search">

          <el-autocomplete

            class="search-input"

            prefix-icon="el-icon-search"

            v-model="state"

            :fetch-suggestions="querySearchAsync"

            placeholder="点击输入医院名称"

            @select="handleSelect"

          >

            <span slot="suffix" class="search-btn v-link highlight clickable selected">搜索</span>

          </el-autocomplete>

        </div>

      </div>

    </div>

    <!-- bottom -->

    <div class="bottom">

      <div class="left">

        <div class="home-filter-wrapper">

          <div class="title">医院</div>

          <div>

            <div class="filter-wrapper">

              <span class="label">等级:</span>

              <div class="condition-wrapper">

                <span class="item v-link highlight clickable selected">全部</span>

                <span class="item v-link clickable">三级医院</span>

                <span class="item v-link clickable">二级医院</span>

                <span class="item v-link clickable">一级医院</span>

              </div>

            </div>

            <div class="filter-wrapper">

              <span class="label">地区:</span>

              <div class="condition-wrapper">

                <span class="item v-link highlight clickable selected">全部</span>

                <span class="item v-link clickable">东城区</span>

                <span class="item v-link clickable">西城区</span>

                <span class="item v-link clickable">朝阳区</span>

                <span class="item v-link clickable">丰台区</span>

                <span class="item v-link clickable">石景山区</span>

                <span class="item v-link clickable">海淀区</span>

                <span class="item v-link clickable">门头沟区</span>

                <span class="item v-link clickable">房山区</span>

                <span class="item v-link clickable">通州区</span>

                <span class="item v-link clickable">顺义区</span>

                <span class="item v-link clickable">昌平区</span>

                <span class="item v-link clickable">大兴区</span>

                <span class="item v-link clickable">怀柔区</span>

                <span class="item v-link clickable">平谷区</span>

                <span class="item v-link clickable">密云区</span>

                <span class="item v-link clickable">延庆区</span>

              </div>

            </div>

          </div>

        </div>

        <div class="v-scroll-list hospital-list">

          <div class="v-card clickable list-item">

            <div class>

              <div class="hospital-list-item hos-item" index="0">

                <div class="wrapper">

                  <div class="hospital-title">北京协和医院</div>

                  <div class="bottom-container">

                    <div class="icon-wrapper">

                      <span class="iconfont"></span>

                      三级甲等

                    </div>

                    <div class="icon-wrapper">

                      <span class="iconfont"></span>

                      每天8:30放号

                    </div>

                  </div>

                </div>

                <img src="images/23176337663806575.png" alt="北京协和医院" class="hospital-img">

              </div>

            </div>

          </div>

          <div class="v-card clickable list-item space">

            <div class>

              <div class="hospital-list-item hos-item" index="0">

                <div class="wrapper">

                  <div class="hospital-title">北京协和医院</div>

                  <div class="bottom-container">

                    <div class="icon-wrapper">

                      <span class="iconfont"></span>

                      三级甲等

                    </div>

                    <div class="icon-wrapper">

                      <span class="iconfont"></span>

                      每天8:30放号

                    </div>

                  </div>

                </div>

                <img src="images/23176337663806575.png" alt="北京协和医院" class="hospital-img">

              </div>

            </div>

          </div>

          <div class="v-card clickable list-item">

            <div class>

              <div class="hospital-list-item hos-item" index="0">

                <div class="wrapper">

                  <div class="hospital-title">北京协和医院</div>

                  <div class="bottom-container">

                    <div class="icon-wrapper">

                      <span class="iconfont"></span>

                      三级甲等

                    </div>

                    <div class="icon-wrapper">

                      <span class="iconfont"></span>

                      每天8:30放号

                    </div>

                  </div>

                </div>

                <img src="images/23176337663806575.png" alt="北京协和医院" class="hospital-img">

              </div>

            </div>

          </div>

        </div>

      </div>

      <div class="right">

        <div class="common-dept">

          <div class="header-wrapper">

            <div class="title">常见科室</div>

            <div class="all-wrapper">

              <span>全部</span>

              <span class="iconfont icon"></span>

            </div>

          </div>

          <div class="content-wrapper">

            <span class="item v-link clickable dark">神经内科</span>

            <span class="item v-link clickable dark">消化内科</span>

            <span class="item v-link clickable dark">呼吸内科</span>

            <span class="item v-link clickable dark">内科</span>

            <span class="item v-link clickable dark">神经外科</span>

            <span class="item v-link clickable dark">妇科</span>

            <span class="item v-link clickable dark">产科</span>

            <span class="item v-link clickable dark">儿科</span>

          </div>

        </div>

        <div class="space">

          <div class="header-wrapper">

            <div class="title-wrapper">

              <div class="icon-wrapper">

                <span class="iconfont title-icon"></span>

              </div>

              <span class="title">平台公告</span>

            </div>

            <div class="all-wrapper">

              <span>全部</span>

              <span class="iconfont icon"></span>

            </div>

          </div>

          <div class="content-wrapper">

            <div class="notice-wrapper">

              <div class="point"></div>

              <span class="notice v-link clickable dark">关于延长北京大学国际医院放假的通知</span>

            </div>

            <div class="notice-wrapper">

              <div class="point"></div>

              <span class="notice v-link clickable dark">北京中医药大学东方医院部分科室医生门诊医</span>

            </div>

            <div class="notice-wrapper">

              <div class="point"></div>

              <span class="notice v-link clickable dark">武警总医院号源暂停更新通知</span>

            </div>

          </div>

        </div>

        <div class="suspend-notice-list space">

          <div class="header-wrapper">

            <div class="title-wrapper">

              <div class="icon-wrapper">

                <span class="iconfont title-icon"></span>

              </div>

              <span class="title">停诊公告</span>

            </div>

            <div class="all-wrapper">

              <span>全部</span>

              <span class="iconfont icon"></span>

            </div>

          </div>

          <div class="content-wrapper">

            <div class="notice-wrapper">

              <div class="point"></div>

              <span class="notice v-link clickable dark">中国人民解放军总医院第六医学中心(原海军总医院)呼吸内科门诊停诊公告</span>

            </div>

            <div class="notice-wrapper">

              <div class="point"></div>

              <span class="notice v-link clickable dark">首都医科大学附属北京潞河医院老年医学科门诊停诊公告</span>

            </div>

            <div class="notice-wrapper">

              <div class="point"></div>

              <span class="notice v-link clickable dark">中日友好医院中西医结合心内科门诊停诊公告</span>

            </div>

          </div>

        </div>

      </div>

    </div>

  </div>

</template>

<script>

export default {};

</script>

5、页面

4d58029a1c744c35a48a814d22fcdb5f.png

 

2612c98007884176b788abe4f3f89ada.png

 

 

 

 

 

首页数据显示接口

1、准备工作

e5412e8059c14e3682d88177baeb30d7.png

2、分析接口

(1)带条件、带分页查询医院信息,翻译字段

*参数:page,limit, HospitalQueryVo

*返回值:R(Page)

(2)根据医院名称模糊查询医院列表

*参数:hosname

*返回值:R(List<Hospital>)

 

3、创建controller

@Api(tags = "医院显示接口")

  @RestController

@RequestMapping("/api/hosp/hospital")

  public class HospitalApiController {

  

    @Autowired

    private HospitalService hospitalService;

  

    @ApiOperation(value = "带条件带分页医院列表查询")

    @GetMapping("{page}/{limit}")

    public R index(

            @PathVariable Integer page,

            @PathVariable Integer limit,

            HospitalQueryVo hospitalQueryVo) {

        Page<Hospital> pageModel = hospitalService

                .selectPage(page, limit, hospitalQueryVo);

        return R.ok().data("pageModel",pageModel);

    }

  

    @ApiOperation(value = "根据医院名称获取医院列表")

    @GetMapping("findByHosname/{hosname}")

    public R findByHosname(

            @PathVariable String hosname) {

        List<Hospital> list = hospitalService.findByHosnameLike(hosname);

        return R.ok().data("list",list);

    }

  

  }

4、实现service

//根据医院名称获取医院列表

  @Override

  public List<Hospital> findByHosnameLike(String hosname) {

    List<Hospital> list = hospitalRepository.getByHosnameLike(hosname);

    return list;

  }

*创建接口

@Repository

  public interface HospitalRepository extends MongoRepository<Hospital,String> {

    //根据hoscode查询mongo,获取医院信息

    Hospital getByHoscode(String hoscode);

    //根据医院名称获取医院列表

    List<Hospital> getByHosnameLike(String hosname);

  }

5、测试

1e0890b5164c4c2a8666b17981f476b4.png

 

7ad8634d98ad416884ca9b2dc84d921e.png

 

d9efb7f673694b4b9b53f30efb181429.png

首页数据显示前端

 

 

1、创建api

(1)创建api文件夹,创建/api/hospital.js

import request from '@/utils/request'



const api_name = '/api/hosp/hospital'



export default {

    //带条件带分页查询医院列表

    getHospPage(page, limit, searchObj) {

        return request({

            url: `${api_name}/${page}/${limit}`,

            method: 'get',

            params: searchObj

        })

    }

}

(2)复制后台前端dict.js

import request from '@/utils/request'



const api_name = '/admin/cmn/dict'



export default {

    dictList(id) {//数据字典列表

      return request ({

        url: `${api_name}/findChildData/${id}`,

        method: 'get'

      })

    },

    //根据dictCode获取下级节点

    findByDictCode(dictCode) {

      return request ({

        url: `${api_name}/findByDictCode/${dictCode}`,

        method: 'get'

      })

    }

}



2、修改页面

pages/index.vue组件

<template>

  <div class="home page-component">

    <el-carousel indicator-position="outside">

      <el-carousel-item v-for="item in 2" :key="item">

        <img src="~assets/images/web-banner1.png" alt>

      </el-carousel-item>

    </el-carousel>

    <!-- 搜索 -->

    <div class="search-container">

      <div class="search-wrapper">

        <div class="hospital-search">

          <el-autocomplete

            class="search-input"

            prefix-icon="el-icon-search"

            v-model="hosname"

            :fetch-suggestions="querySearchAsync"

            placeholder="点击输入医院名称"

            @select="handleSelect"

          >

            <span slot="suffix" class="search-btn v-link highlight clickable selected">搜索</span>

          </el-autocomplete>

        </div>

      </div>

    </div>

    <!-- bottom -->

    <div class="bottom">

      <div class="left">

        <div class="home-filter-wrapper">

          <div class="title">医院</div>

          <div>

            <div class="filter-wrapper">

              <span class="label">等级:</span>

              <div class="condition-wrapper">

                <span

                  class="item v-link clickable"

                  :class="hostypeActiveIndex == index ? 'selected' : ''"

                  v-for="(item,index) in hostypeList"

                  :key="item.id"

                  @click="hostypeSelect(item.value, index)"

                >{{ item.name }}</span>

              </div>

            </div>

            <div class="filter-wrapper">

              <span class="label">地区:</span>

              <div class="condition-wrapper">

                <span

                  class="item v-link clickable"

                  :class="provinceActiveIndex == index ? 'selected' : ''"

                  v-for="(item,index) in districtList"

                  :key="item.id"

                  @click="districtSelect(item.value, index)"

                >{{ item.name }}</span>

              </div>

            </div>

          </div>

        </div>

        <div class="v-scroll-list hospital-list">

          <div class="v-card clickable list-item" v-for="item in list" :key="item.id">

            <div class>

              <div class="hospital-list-item hos-item" index="0" @click="show(item.hoscode)">

                <div class="wrapper">

                  <div class="hospital-title">{{ item.hosname }}</div>

                  <div class="bottom-container">

                    <div class="icon-wrapper">

                      <span class="iconfont"></span>

                      {{ item.param.hostypeString }}

                    </div>

                    <div class="icon-wrapper">

                      <span class="iconfont"></span>

                      每天{{ item.bookingRule.releaseTime }}放号

                    </div>

                  </div>

                </div>

                <img

                  :src="'data:image/jpeg;base64,'+item.logoData"

                  :alt="item.hosname"

                  class="hospital-img"

                >

              </div>

            </div>

          </div>

        </div>

      </div>

      <div class="right">

        <div class="common-dept">

          <div class="header-wrapper">

            <div class="title">常见科室</div>

            <div class="all-wrapper">

              <span>全部</span>

              <span class="iconfont icon"></span>

            </div>

          </div>

          <div class="content-wrapper">

            <span class="item v-link clickable dark">神经内科</span>

            <span class="item v-link clickable dark">消化内科</span>

            <span class="item v-link clickable dark">呼吸内科</span>

            <span class="item v-link clickable dark">内科</span>

            <span class="item v-link clickable dark">神经外科</span>

            <span class="item v-link clickable dark">妇科</span>

            <span class="item v-link clickable dark">产科</span>

            <span class="item v-link clickable dark">儿科</span>

          </div>

        </div>

        <div class="space">

          <div class="header-wrapper">

            <div class="title-wrapper">

              <div class="icon-wrapper">

                <span class="iconfont title-icon"></span>

              </div>

              <span class="title">平台公告</span>

            </div>

            <div class="all-wrapper">

              <span>全部</span>

              <span class="iconfont icon"></span>

            </div>

          </div>

          <div class="content-wrapper">

            <div class="notice-wrapper">

              <div class="point"></div>

              <span class="notice v-link clickable dark">关于延长北京大学国际医院放假的通知</span>

            </div>

            <div class="notice-wrapper">

              <div class="point"></div>

              <span class="notice v-link clickable dark">北京中医药大学东方医院部分科室医生门诊医</span>

            </div>

            <div class="notice-wrapper">

              <div class="point"></div>

              <span class="notice v-link clickable dark">武警总医院号源暂停更新通知</span>

            </div>

          </div>

        </div>

        <div class="suspend-notice-list space">

          <div class="header-wrapper">

            <div class="title-wrapper">

              <div class="icon-wrapper">

                <span class="iconfont title-icon"></span>

              </div>

              <span class="title">停诊公告</span>

            </div>

            <div class="all-wrapper">

              <span>全部</span>

              <span class="iconfont icon"></span>

            </div>

          </div>

          <div class="content-wrapper">

            <div class="notice-wrapper">

              <div class="point"></div>

              <span class="notice v-link clickable dark">中国人民解放军总医院第六医学中心(原海军总医院)呼吸内科门诊停诊公告</span>

            </div>

            <div class="notice-wrapper">

              <div class="point"></div>

              <span class="notice v-link clickable dark">首都医科大学附属北京潞河医院老年医学科门诊停诊公告</span>

            </div>

            <div class="notice-wrapper">

              <div class="point"></div>

              <span class="notice v-link clickable dark">中日友好医院中西医结合心内科门诊停诊公告</span>

            </div>

          </div>

        </div>

      </div>

    </div>

  </div>

</template>

3、js初步实现

<script>

import hospApi from '@/api/hospital'

import dictApi from '@/api/dict'



export default {

   //服务端渲染异步,显示医院列表

   asyncData({params,error}){

     return hospApi.getHospPage(1, 10, null).then(response=>{

       return{

         list:response.data.pageModel.content,

         pages: response.data.pageModel.totalPages

       }

     })

   }



};

</script>

e933f56aba2c47f585502bd8c1039290.png

 

 

4、实现js功能

(1)需求

9be74f202e304250b5fb69dded1b5fb1.png

 

 

(2)实现js

<script>

import hospApi from "@/api/hospital";

import dictApi from "@/api/dict";



export default {

  //服务端渲染异步,显示医院列表

  asyncData({ params, error }) {

    return hospApi.getHospPage(1, 10, null).then(response => {

      return {

        list: response.data.pageModel.content,

        pages: response.data.pageModel.totalPages

      };

    });

  },

  data() {

    return {

      searchObj: {}, //查询条件

      page: 1,

      limit: 10,



      hosname: "", //医院名称

      hostypeList: [], //医院等级集合

      districtList: [], //地区集合



      hostypeActiveIndex: 0, //选中等级索引号

      provinceActiveIndex: 0 //选中地区索引号

    };

  },

  created() {

    this.init();

  },

  methods: {

    //初始化方法

    init() {

      //初始化医院等级集合

      dictApi.findByDictCode("Hostype").then(response => {

        //1初始化医院等级集合

        this.hostypeList = [];

        //2向集合存入“全部”选项

        this.hostypeList.push({ name: "全部", value: "" });

        //3遍历查询结果,存入集合

        for (let i = 0; i < response.data.list.length; i++) {

          this.hostypeList.push(response.data.list[i]);

        }

      });



      //初始化地区集合

      dictApi.findByDictCode("Beijing").then(response => {

        //1初始化地区集合

        this.districtList = [];

        //2向集合存入“全部”选项

        this.districtList.push({ name: "全部", value: "" });

        //3遍历查询结果,存入集合

        for (let i in response.data.list) {

          this.districtList.push(response.data.list[i]);

        }

      });

    }

  }

};

</script>

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值