项目问题参考答案

news2025/7/19 16:53:04

文章目录

    • 项目业务的功能:
      • 1 完成部门管理模块(大致有药剂部门,诊疗部门、护理部门,后勤部门),
      • 2.在药品搜索模块,根据业务的需求,我封装了正则实现了模糊搜索,防抖工具函数,减少了请求,优化了项目
    • 3. excel的导入导出
    • 4. 登录模块
    • 5 无感刷新的实现
    • 6权限管理
    • 7按钮权限
    • 8 模块拆分
      • 9. 后端返回的二进行文件流数据如何处理

项目业务的功能:

  • 本系统主要包括7大板块,功能模块主要有门诊医生工作站,部门管理,医疗设备,医技科室,住院管理,药库药房,财务核算等模块,在门诊部中可以进行现场挂号,收费,退号等,当挂号收费完毕后医生可以进行问诊,开处方药,同时门诊医生可以开具检查项,只有开具检查项后医技医生才能进行此项检查,,也可以按照病人的情况来决定是否进行住院等,我主要负责部门管理,药库药房,系统管理的研发,参与项目v1.0到v2.0的迭代

1 完成部门管理模块(大致有药剂部门,诊疗部门、护理部门,后勤部门),

  • 我封装了Data-tree函数,通过递归将列表的数据进行转化为树结构,并搭配element-UI的Tree组件实现部门管理
let data = [
  { id: 0, pId: null, name: '生物' },
  { id: 1, pId: 0, name: '动物' },
  { id: 2, pId: 0, name: '植物' },
  { id: 3, pId: 0, name: '微生物' },
  { id: 4, pId: 1, name: '哺乳动物' },
  { id: 5, pId: 1, name: '卵生动物' },
  { id: 6, pId: 2, name: '种子植物' },
  { id: 7, pId: 2, name: '蕨类植物' },
]
  • 每个对象中id是唯一的,但不同对象的pId可以相同,可根据pId找到其父元素
export const arrayTwotree = (data, pid = '') => {
  
   // filter 过滤,查找子对象
  const tree = data.filter(item => item. === pid)
  tree.forEach(item => {
       //如果id与pid相同说明带有pid的对象是id这个对象的children 进行递归处理
    item.children = arrayTwotree(data, item.id)
  })
  return tree
}

2.在药品搜索模块,根据业务的需求,我封装了正则实现了模糊搜索,防抖工具函数,减少了请求,优化了项目

  • 详解防抖_.debounce(getUsername(),1000) , - 手写防抖
// 防抖的关键在于定时器的开始与清零
		function debounce(callback,delaytime){
			// 定义计时器
			let timer=null
			return function(){
				//如果定时器不是null 则需要重新计时
				if (timer!=null) {
					clearTimeout(timer)
					
				}
				//如果定时器还是空 ,则开始倒计时
				timer=setTimeout(()=>{
					callback&&callback()
				}, delaytime)

			}
		}
  • 节流_.throttle(getusername(),1000)
// 节流固定的时间进行触发
		inputEl.oninput = throttle(inputChange, 2000)
		// 封装节流  :关键在于: 节流阀 以及时间间隔
		//1 如果不触发函数则节流阀关闭状态
		// 当你触发这个函数时先把节流阀关闭 然后在默认的时间间隔中打开
		function throttle(callback, delaytime) {
			let state=true   //节流阀打开
			return function(){
				if (!state) {  //当节流阀关闭,则直接退出该函数
					return;         //callback不执行
				}else{
					//如果节流阀打开先把节流阀关闭
					//然后设置时间间隔后在自动打开
					state = false       
					setTimeout(() => {
						callback && callback()
						state = true
					}, delaytime)
				}
			}

3. excel的导入导出

  • 导入:就是用fileReader将文件转化为ArrayBuffer,在调用xlsx第三方包read()方法转成workbook,由于fileReader是异步函数,所以使用promise.all进行处理,读取多个文件

导入详细解答

  1. 我封装了一个全局组件uploadExcel组件
  2. 在这个组件中,我结合element-ui组件库中的el-upload上传文件组件进行二次处理
<el-upload
  action=‘’
  accept=“xlsx/.xls”  // 指定文件类型
  on-change          //文件状态的改变
</el-upload>
  1. 当文件状态改变要进行导入时,调用fileReader方法把文件转换为二进制的数据(这里封装了一个Promise异步函数,只有resolve(成功)时才会进行文件的读取)
  2. 调用xlsx中内置的read方法 并指定类型进行文件数据的读取
  3. 利用xlsx中内置的sheet_to_json方法进行数据格式的转换(转成JSON数据格式)

导出函数,
1. 调用表格中的@selection-change事件会拿到选中的数据,
2. 把拿到的选中的数据进行中英文的map切换
3. 调用xlsx中内置的方法,把数据转换为sheet格式
4. 新建一个表格使用xlsx里面内置的utils。book_new()方法创建
5. 利用book_append_sheet方法向表格插入数据
6. 调用writeFile方法把数据写入当前文件
在这里插入图片描述

4. 登录模块

  • 包括登录前的数据收集和校验,
    1. 点击登录按钮通过dispatch调用vuex里面的actions发送aixos请求给服务器,后台返回响应状态码判断是否成功,失败则提示用户,
    1. 成功则将返回数据中的token持久化并同步到 Vuex;
    1. 对后续需要携带 Token 的接口在请求拦截器处进行统一处理;对 Token 过期的情况配合后端我做了无感刷新处理机制,提升用户使用网站的体验;结合路由导航守卫对登录后才能访问的内页实现了界面访问控制的功能

5 无感刷新的实现

  • 弄两个token,一个负责鉴权的 token:access_token,一个负责刷新token:refresh_token,
  • 每次请求的时候都带上这两个token,再由后端拦截器判断,先判断鉴权token是否有效,
  • 如果有效就访问,无效就判断刷新token是否有效,有效就返回指定状态码,
  • 然后让我根据状态码调用刷新token的接口,如果刷新token失效,就提示重新
    在这里插入图片描述

6权限管理

  • 首先会有一个超级管理员,进行角色权限的分配,
  • 当用户登录跳转首页时,在路由前置守卫中,判断是否携带token,并调用dispatch在actions中发送用户信息请求了并保存在vuex中,
  • 获取vuex中的用户权限信息的数组,筛选路由配置中name标识,
  • 是否在当前用户信息数组中,然后通过add-router动态添加路由,显示能访问的菜单页面

7按钮权限

  • 解决方案一:

    • 1.定义一个全局方法,配合v-if实现
    • 思路:在用户登录成功后,获取用户的按钮权限(数组格式),存储到store中,然后在工具类中定义一个公共函数hasIsEdit,在按钮中调用hasIsEdit()函数,把传入的关键字和store的按钮权限进行对比,看看是否存在,如果存在就显示,不存在就隐藏
  • 解决方案二

    ①定义一个全局自定义指令:按钮级别的权限只需要在main.js里封装一个全局的指令或方法,这个方法只做一件事情,接收后端返回的标识,也就是该用户所拥有按钮级别权限的数组。
    ②拿到标识后,内部判断一下这个标识在不在该数组里面,不在就把该按钮的样式设置隐藏。
    ③在需要做按钮权限的地方调用:值为和后端约定的权限标识。

// 控制页面中按钮的级别
Vue.directive('allow', {   // binding是个形参,接收调用自定义指令的标识进行判断
  inserted: function(el, binding) {
    // 1. 首先需要获取到vuex中用户按钮级别的权限信息
    console.log(binding, 'bindingbinding')
    const points = store.state.user.userInfo.roles.points
    // 2. 根据使用指令传过来的权限标识, 判断用户拥有按钮级别的权限
    if (!points.includes(binding.value)) {
      el.style.display = 'none'
    }
  }
})
<button v-allow="'import_excel'">删除用户信息</button>
//import_excel 是和后端约定的按钮权限标识

8 模块拆分

在这里插入图片描述

  1. 模块拆分主要分为 production:生产环境
  2. development:开发环境
  3. 公共资源
3.	公共资源  主要放置loader与resolve: {
4.	        extensions: ['.js', '.vue', '.json'],
5.	        alias: {
6.	            'vue$': 'vue/dist/vue.esm.js',
7.	            '@': path.join(__dirname, '../src')
8.	        }
9.	    },
  1. 开发环境:主要放置deverserve 跨域的代理
  2. 生产环境:主要放置css压缩,JS压缩
// css压缩
optimize-css-assets-webpack-plugin
 //dist压缩包
 "zip-webpack-plugin": "^4.0.1"
//生产环境 copy静态资源
 "copy-webpack-plugin": "^11.0.0"

具体参考

9. 后端返回的二进行文件流数据如何处理

  1. 先创建将一个a交钱

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享105个NET源码ASP源码,总有一款适合您

分享105个NET源码&#xff0c;总有一款适合您 源码下载链接&#xff1a;https://pan.baidu.com/s/1zFMIHX6juXdR2CaHMEr5mQ?pwdf5hz 提取码&#xff1a;f5hz 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后…

力扣(LeetCode)81. 搜索旋转排序数组 II(C++)

线性探测二分查找 本题和 力扣(LeetCode)33. 搜索旋转排序数组(C) 的唯一区别是有重复元素&#xff0c;思考我们之前的二分条件&#xff0c;是根据 nums[0]nums[0]nums[0] 和 nums[mid]nums[mid]nums[mid] 判断 midmidmid 哪一端有序&#xff0c;但是现在可能出现 nums[0]nums…

Metabase学习教程:视图-7

创建数据透视表 了解如何使用Metabase中的不同数据库创建透视表。 什么是透视表&#xff1f;数据透视表是一种汇总和分组数据的表格方式。它们是分析师工具箱中的一个有价值的工具&#xff0c;因为它们是展示和重新安排大量信息的有效方法。它们的工作原理如下&#xff1a; …

中华传统文化题材网页设计主题:基于HTML+CSS设计放飞青春梦想网页【学生网页设计作业源码】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

应用ceph块存储(ceph-13.2.10)

记录&#xff1a;334 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;部署ceph-13.2.10集群。应用ceph块设备(ceph block device)&#xff1b;主要是创建ceph块存储、块存储分区、在线扩容、离线缩容、删除块存储等操作。 版本&#xff1a; 操作系统&#xff1a;CentOS…

gateway网关转发请求到nacos不同namespace和不同group下服务实例源码改造

问题 gateway转发请求到微服务&#xff0c;报错误页面&#xff0c;错误信息如下所示: There was an unexpected error (typeService Unavailable, status503). Unable to find instance xxx 报错信息显示找不到应用实例。即gateway无法在nacos实例中获取到路由配置的对应实例…

2021 XV6 5:Copy-on-Write Fork

目录 1.概述 2.修改uvmcopy 3.修改trap.c 4.引用计数机制 5.修改copyout 6.结果 1.概述 首先&#xff0c;这是一个很有意义的性能优化方案。 提出的背景是&#xff0c;如果我们每次fork的时候&#xff0c;都完整分配一系列物理页把父进程的内容拷贝进来&#xff0c;是一…

【SpringBoot】定制⾃⼰的 Health Indicator

Spring Boot ⾃带的 Health Indicator ⽬的 检查应⽤程序的运⾏状态 状态 DOWN - 503OUT_OF_SERVICE - 503UP - 200UNKNOWN - 200 机制 通过 HealthIndicatorRegistry 收集信息HealthIndicator 实现具体检查逻辑 配置项 management.health.defaults.enabledtrue|falsem…

【学习笔记】Reids的哨兵机制

【学习笔记】Reids的哨兵机制 文章目录【学习笔记】Reids的哨兵机制前言什么是哨兵机制&#xff1f;如何判断主库是否挂掉&#xff1f;主从库的切换和消息的通知前言 什么是哨兵机制&#xff1f; 哨兵机制&#xff08;sentinel&#xff09; 是Redis解决高可用的一种解决方案&a…

视频会议解决方案-最新全套文件

视频会议解决方案-最新全套文件一、建设背景二、建设思路业务挑战三、建设方案四、获取 - 视频会议全套最新解决方案合集一、建设背景 随着中国经济的迅速发展&#xff0c;很多企业的发展也进入快车道&#xff0c;分支机构越来越多&#xff0c;形成了遍布全国范围甚至全球范围…

Echarts:惊艳的Map

大家在网上看天气预报的时候应该就看到过在中国地图上显示不同省份的温度&#xff0c;并根据温度的高低显示不同的颜色&#xff0c;又或者看到各个省份的新冠肺炎新增人数&#xff0c;根据不同的新增人数显示不同的颜色之类的图像。这些&#xff0c;使用echarts中的map就可以实…

python实现灰色关联法(GRA)

原文&#xff1a;https://mp.weixin.qq.com/s/Uuri-FqRWk3V5CH7XrjArg 1 灰色关联分析法简介 白色系统是指信息完全明确的系统&#xff0c;黑色系统是指信息不完全明确的系统&#xff0c;而灰色系统是介于白色与黑色系统之间的系统&#xff0c;是指系统内部信息和特征是部分已…

IDEA设置和相关快捷键记录汇总

IDEA设置和相关快捷键 前言 Java 开发 现在基本都是使用 IDEA 作为开发工具&#xff0c;IDEA 有很多设置和常用的快捷键&#xff0c;熟悉之后能更好的提高开发效率&#xff0c;这里总结了下从慕课网的内容 开发工具IDEA从入门到爱不释手-慕课网 (imooc.com)&#xff0c;摘录做…

Kafka - 04 Java客户端实现消息发送和订阅

1. Kafka测试命令行操作 1. 主题命令行操作 在上一节中我们安装了Kafka单机环境和集群环境&#xff0c;这一节来测试下Linux环境安装Kafka后的命令行操作。 我们之前在用Windows环境安装Kafka Kafka应用场景|基础架构|Windows安装|命令行操作 和命令行操作时&#xff0c;讲到…

哪种类型的蓝牙耳机好?超高性价比蓝牙耳机推荐

朋友让我推荐蓝牙耳机的时候&#xff0c;总是喜欢问哪款蓝牙耳机的性能更强&#xff0c;想要直接入手那款性能更强的蓝牙耳机&#xff0c;以此节省对比的时间。但是用户自行进行对比的步骤&#xff0c;显然是不能省的&#xff0c;所以推荐这四款高性价比的蓝牙耳机&#xff0c;…

华为云桌面Workspace,让你的办公更加舒适惬意

在各行各业转型的过程中&#xff0c;企业对于线上办公的需求不断增多&#xff0c;越来越需要一个云办公平台&#xff0c;为企业更好实现数字化网络化办公降本增效。正逢佳节之际&#xff0c;在此为各大企业推荐一个高效的办公神器——华为云桌面Workspace。相信作为企业决策者的…

详解设计模式:抽象工厂模式

工厂方法模式&#xff0c;又称工厂模式、多态工厂模式和虚拟构造器模式&#xff0c;通过工厂父类定义负责创建产品的公共接口&#xff0c;子类负责生产具体对象。可以理解为简单工程模式的升级&#xff0c;解决简单工厂模式的弊端。 &#xff5e; 本篇内容包括&#xff1a;关于…

Executors-四种创建线程的手段

1 Executors.newCachedThreadPool() 从构造方法可以看出&#xff0c;它创建了一个可缓存的线程池。当有新的任务提交时&#xff0c;有空闲线程则直接处理任务&#xff0c;没有空闲线程则创建新的线程处理任务&#xff0c;队列中不储存任务。线程池不对线程池大小做限制&#x…

ESP三相SVPWM控制器的simulink仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB程序 1.算法描述 SVPWM则以三相的合成矢量为出发点&#xff0c;其基本思想为&#xff1a;在数学意义上的abc轴也好&#xff0c;αβ轴也好&#xff0c;其产生的电压都应该等于dq轴合成的那个电压。那么只要让…

swiper在动态创建dom过程中的问题:数据从后端请求回来后加载到页面上,dom加载完发现swiper没用了

怎么动态创建div标签&#xff1a; 要轮播的数据是后端返回的&#xff0c;所以我们要发ajax请求接收数据&#xff1b; 下面演示的是已经接收回来的数据&#xff0c;动态创建div标签&#xff1a; setTimeout(()>{var list ["aaa","bbb","ccc&quo…