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

内容介绍

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

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

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

4、首页静态数据整合

5、首页数据显示接口

6、首页数据显示前端

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

1确认需求

2、实现接口

1)分析接口

*参数:pagelimithoscodedepcode

*返回值:RMaptotalList<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;

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)测试

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)测试

查看科室排班详细数据

1、需求分析

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

2、实现接口

1)分析接口

*参数:hoscodedepcodeworkDate

*返回值:RList<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<SchedulescheduleList =

            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)测试

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)测试

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

1、相关概念

1)服务端渲染

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

2SEO

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

2、什么是NUXT

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

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

1)获取工程包

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

yygh_site

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

4)下载依赖

5)启动工程

npm run dev

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

1)获取工程包

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

3)启动工程

npm run dev

4、工程目录介绍

1)资源目录 assets

 用于组织未编译的静态资源如 LESSSASS 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、页面组成

2、添加静态资源

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、页面

首页数据显示接口

1、准备工作

2、分析接口

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

*参数:page,limit, HospitalQueryVo

*返回值:R(Page)

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

*参数:hosname

*返回值:RList<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、测试

首页数据显示前端

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>

4、实现js功能

1)需求

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>

猜你喜欢

转载自blog.csdn.net/leader_song/article/details/131993673