粤嵌实训医疗项目(小组开发)--day05

目录

一、医生功能模块

------------前端实现------------

------------后端接口------------

功能一:分页查询医生基础信息(介绍MybatisPlus如何使用分页)

功能二:根据搜索栏名称查找对应医生(讲解自定义查询集)

功能三: 实现获取医生的详细信息

功能四:实现预约功能

功能五:根据医生科室查询医生

收获与反思


一、医生功能模块

模块需求:

本模块设计,我负责后端接口开发,另一位成员负责前端开发。

------------前端实现------------

<template><div><div style="margin: 20px 0px;"><el-row><el-col :span="10" class="center"><!-- 输入标签组件 --><el-input v-model="search" @focus="focus" @blur="blur" @keyup.enter.native="searchHandler"placeholder="搜索医生名称" clearable><el-button slot="append" icon="el-icon-search" id="search" @click="searchHandler"></el-button></el-input><!---设置z-index优先级,防止被走马灯效果遮挡--><el-card @mouseenter="enterSearchBoxHanlder" v-if="isSearch" class="box-card" id="search-box"style="position:absolute;z-index:15"><dl v-if="isHistorySearch"><dt class="search-title" v-show="history">历史搜索</dt><dt class="remove-history" v-show="history" @click="removeAllHistory"><i class="el-icon-delete"></i>清空历史记录</dt><el-tag v-for="search in historySearchList" :key="search.id" closable :type="search.type"@close="closeHandler(search)" @click="searchistory(search)"style="margin-right:5px; margin-bottom:5px;">{{ search.name }}</el-tag><dt class="search-title">热门搜索</dt><dd v-for="search in hotSearchList" :key="search.id">{{ search }}</dd></dl><dl v-if="isSearchList"><dd v-for="search in searchList" :key="search.id">{{ search }}</dd></dl></el-card></el-col></el-row><el-dialog title="简介" :visible.sync="introductionDialog" width="30%"><el-form ref="form" :model="form" label-width="80px"><el-form-item label="头像"><!-- action表示为上传文件的url   --><el-upload class="avatar-uploader"><img v-if="imageUrl" :src="imageUrl" class="avatar" /><i v-else class="el-icon-plus avatar-uploader-icon"></i></el-upload></el-form-item><el-form-item label="姓名"><h2>{{ form.name }}</h2></el-form-item><el-form-item label="个人简介"><p>{{ form.introduction }}</p></el-form-item></el-form></el-dialog><el-dialog title="预约" :visible.sync="appointmentDialog1" width="40%"><el-calendar v-model="value"><div slot="dateCell" slot-scope="{ data }" @click="allcalendar(data)" class="temp"><span>{{ data.day.split("-")[2] }}</span></div></el-calendar></el-dialog><el-dialog title="预约" :visible.sync="appointmentDialog2" width="40%"><el-table :data="bookTime" style="width: 100%"><el-table-column label="日期" width="180"><template slot-scope="scope"><i class="el-icon-time"></i><span style="margin-left: 10px">{{ scope.row.time }}</span></template></el-table-column><el-table-column label="剩余" width="180"><template slot-scope="scope"><el-popover trigger="hover" placement="top"><p>人数: {{ scope.row.Remain }}</p><div slot="reference" class="name-wrapper"><el-tag size="medium">{{ scope.row.Remain }}</el-tag></div></el-popover></template></el-table-column><el-table-column label="操作"><template slot-scope="scope"><el-button size="mini" @click="handleBooktime(scope.$index, scope.row)">预约</el-button></template></el-table-column></el-table></el-dialog></div><el-table :data="tableData" border style="width: 100%"><el-table-column prop="major" label="科室" sortable width="180" column-key="date" :filters="[{ text: '内科', value: '内科' },{ text: '妇科', value: '妇科专业' },{ text: '儿科', value: '儿科' },{ text: '外科', value: '外科手术' }]" :filter-method="filterHandler"></el-table-column><el-table-column prop="host_id" label="医生编号" width="120"></el-table-column><el-table-column prop="name" label="医生名称" width="120"></el-table-column><el-table-column prop="image" label="医生帅照" width="120"></el-table-column><el-table-column prop="phone" label="电话" width="300"></el-table-column><el-table-column fixed="right" label="操作" width="100"><template slot-scope="scope"><el-button @click="handleCheck(scope.row)" type="text" size="small">查看</el-button><el-button @click="handleBook(scope.row)" type="text" size="small">预约</el-button></template></el-table-column></el-table><!-- 定义一个分页标签 --><div><el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="pageNum":page-sizes="[3, 8, 15, 30]" :page-size="3" layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination></div></div>
</template><script>
import RandomUtil from "../utils/randomUtil";
import Store from "../utils/store";
//导入request工具
import request from "@/utils/request";
export default {data() {return {search: "", //当前输入框的值isFocus: false, //是否聚焦hotSearchList: ["暂无热门搜索"], //热门搜索数据historySearchList: [], //历史搜索数据searchList: ["暂无数据"], //搜索返回数据,history: false,bookDoctor: '',bookTime: [{time: "8:00~9:00",Remain: 3,},],introductionDialog: false,appointmentDialog1: false,appointmentDialog2: false,total: 0,pageNum: 1,pageSize: 3,value: new Date(),imageUrl: 'https://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg',types: ["", "success", "info", "warning", "danger"], //搜索历史tag式样tableData: [],form: {doctorId: '',department: '',name: '',province: '',city: '',address: '',culture: '',phone: '',image: '',sex: '',age: '',introduction: '',},};},// 通过在生命周期创建时候就使用查询方法created() {this.query();},methods: {focus() {this.isFocus = true;this.historySearchList =Store.loadHistory() == null ? [] : Store.loadHistory();this.history = this.historySearchList.length == 0 ? false : true;},blur() {var self = this;this.searchBoxTimeout = setTimeout(function () {self.isFocus = false;}, 300);},enterSearchBoxHanlder() {clearTimeout(this.searchBoxTimeout);},searchHandler() {//随机生成搜索历史tag式样let n = RandomUtil.getRandomNumber(0, 5);//发起一个异步请求,查询分类的数据request// get表示指定请求地址 和 请求参数.get("/vaccinum/doctor/SerchByName", {params: {pageNum: this.pageNum,pageSize: this.pageSize,name: this.search,},})// then表示请求后的回调函数.then((res) => {console.log(res);// 把后台的响应的数据赋值给data中的tableDatathis.tableData = res.list;this.form = res.list;this.total = res.total;});let exist =this.historySearchList.filter(value => {return value.name == this.search;}).length == 0? false: true;if (!exist) {this.historySearchList.push({ name: this.search, type: this.types[n] });Store.saveHistory(this.historySearchList);}this.history = this.historySearchList.length == 0 ? false : true;},closeHandler(search) {this.historySearchList.splice(this.historySearchList.indexOf(search), 1);Store.saveHistory(this.historySearchList);clearTimeout(this.searchBoxTimeout);if (this.historySearchList.length == 0) {this.history = false;}},searchistory(search) {this.search = search.name;},removeAllHistory() {Store.removeAllHistory();},// 执行搜索函数,将后端数据展示出来query() {//发起一个异步请求,查询分类的数据request// get表示指定请求地址 和 请求参数.get("/vaccinum/doctor/list", {params: {pageNum: this.pageNum,pageSize: this.pageSize,},})// then表示请求后的回调函数.then((res) => {console.log(res);// 把后台的响应的数据赋值给data中的tableDatathis.tableData = res.list;this.form = res.list;this.total = res.total;});},handleCheck(row) {console.log(row);this.introductionDialog = true;this.doctorId = row.doctorId;this.form.department = row.department;this.form.name = row.name;this.form.province = row.province;this.form.city = row.city;this.form.address = row.address;this.form.culture = row.culture;this.form.phone = row.phone;this.form.image = row.image;this.form.introduction = row.introduction;},handleBook(row) {console.log(row);this.bookDoctor = row.name;this.appointmentDialog1 = true;},handleBooktime(index,row){// TODO 向后端发送用户提交的预约信息console.log(row.time);this.bookTime[index].Remain=this.bookTime[index].Remain-1;},//筛选功能实现函数resetDateFilter() {this.$refs.filterTable.clearFilter('date');},clearFilter() {this.$refs.filterTable.clearFilter();},formatter(row, column) {return row.address;},filterTag(value, row) {return row.tag === value;},filterHandler(value, row, column) {const property = column['property'];return row[property] === value;},//修改单页数据数量handleSizeChange(val) {this.pageSize = val;this.query();},//跳转页码handleCurrentChange(val) {console.log(val);this.pageNum = val;this.query();},// 日历触发事件allcalendar(data) {const loading = this.$loading({// lock: true,  //加上这个 页面点击日历的时候会莫名其妙抖动一下 因为我界面上有滚动条,所以我注释了text: "Loading",spinner: "el-icon-loading",background: "rgba(0, 0, 0, 0.7)",});setTimeout(() => {this.value = data.day; //取到你需要的日期data.day//需要用到这日期做啥事,比如做为调接口的参数request// get表示指定请求地址 和 请求参数.get("/doctor/freetime", {params: {name: this.bookDoctor,date: data.day,},})// then表示请求后的回调函数.then((res) => {console.log(res);});this.appointmentDialog1 = false;this.appointmentDialog2 = true;loading.close();}, 500);},},computed: {isHistorySearch() {return this.isFocus && !this.search;},isSearchList() {return this.isFocus && this.search;},isSearch() {return this.isFocus;}},};</script><style>
.left {margin-left: 200px;
}.center {margin-top: 15px;margin-left: 200px;
}#search {background-color: #616cee;border-radius: 0%;
}.search-title {color: #bdbaba;font-size: 15px;margin-bottom: 5px;
}.remove-history {color: #bdbaba;font-size: 15px;float: right;margin-top: -22px;
}#search-box {width: 555px;height: 300px;margin-top: 0px;padding-bottom: 20px;
}.avatar-uploader .el-upload {border: 1px dashed #d9d9d9;border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;
}.avatar-uploader .el-upload:hover {border-color: #409eff;
}.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 178px;height: 178px;line-height: 178px;text-align: center;
}.avatar {width: 178px;height: 178px;display: block;
}.temp {padding: 20px;
}
</style>

------------后端接口------------

功能一:分页查询医生基础信息(介绍MybatisPlus如何使用分页)

//    接口
//    TODO:接口功能:查询医生一般信息
@RequestMapping("/list")
public String query(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "2") Integer pageSize) throws JsonProcessingException {// 创建分页对象Page<Doctor> page = new Page<>(pageNum, pageSize);// 执行分页查询IPage<Doctor> doctorIPage = doctorService.page(page);// 从分页对象中获取分页数据和总记录数List<Doctor> pageInfoList = doctorIPage.getRecords();long total = doctorIPage.getTotal();// 构造返回的医生信息列表List<DoctorSummary> doctorSummaryList = new ArrayList<>();for (Doctor doctor:pageInfoList){doctorSummaryList.add(new DoctorSummary(doctor.getHostId(),doctor.getName(),doctor.getPhone(),doctor.getImage(),doctor.getMajor()));}// 返回医生不敏感信息的信息return JsonTool.writeValueAsString(doctorSummaryList);
}

收获:MyBatis-Plus的分页插件与MyBatis的PageHelper的区别和使用。

区别:

  • 使用范围:

    • MyBatis-Plus 是一个全面的持久层框架,提供了更多的 CRUD 操作和通用的数据库操作,同时包含了一些方便的工具类和增强功能。
    • PageHelper 是一个简单且专注于分页功能的插件,主要用于处理基本的分页查询需求,不包含其他复杂的数据库操作。
  • 使用方式:

    • MyBatis-Plus 的分页插件是内置在框架中的,无需额外引入依赖,可以直接使用其中的 Page 类进行分页查询,并且提供了丰富的分页查询方法。
    • PageHelper 需要单独引入依赖,根据具体的项目和需求选择相应的版本。使用 PageHelper 需要在 MyBatis 的配置文件中进行配置,并通过拦截器实现分页功能。
  • API 和功能支持:

    • MyBatis-Plus 提供了更多的 API 和功能,如分页查询、排序、条件查询、自定义查询等。同时也支持 Lambda 表达式来简化条件查询的编写。
    • PageHelper 的功能相对较为简单,主要提供了基本的分页功能,可以通过设置分页参数进行分页查询。

使用MyBatisPlus的方法,如下:
1.引入mybatis-plus依赖

        <!--mybatis-plus插件--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1.tmp</version></dependency>

2.进行配置,在config包下写对应配置类,按照如下代码进行配置

@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {// 创建 MybatisPlusInterceptor 对象MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 创建并添加 PaginationInnerInterceptor 分页拦截器PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();interceptor.addInnerInterceptor(paginationInnerInterceptor);// 返回 MybatisPlusInterceptor 对象,作为一个 Bean 注入到 Spring 容器中return interceptor;}
}

 3.在控制层使用插件(通过案例代码解析插件使用步骤)

  1. 创建分页对象 Page<Doctor> page = new Page<>(pageNum, pageSize);

    • pageNum 表示当前页码,指定要查询的页数。
    • pageSize 表示每页显示的记录数,指定每页要展示多少条数据。通过这两个参数,可以确定分页查询的起始位置和返回的记录数量。
  2. 执行分页查询 IPage<Doctor> doctorIPage = doctorService.page(page);

    • doctorService.page(page) 是调用 doctorService 中的 page 方法来执行分页查询操作。
    • IPage<Doctor> 是 MyBatis-Plus 框架提供的分页结果对象,其中包含了分页查询的结果数据和总记录数。
  3. 从分页对象中获取分页数据和总记录数:

    • List<Doctor> pageInfoList = doctorIPage.getRecords(); 获取当前页的数据列表。
    • long total = doctorIPage.getTotal(); 获取查询结果的总记录数。

总结:

  • Page<Doctor> 对象是 MyBatis-Plus 提供的分页对象,用于指定当前页码和每页显示的记录数。
  • IPage<Doctor> 对象是分页查询的结果对象,包含了分页查询的数据列表和总记录数。
  • 通过 getRecords() 方法可以获取当前页的数据列表。
  • 通过 getTotal() 方法可以获取查询结果的总记录数。

下面介绍IPage的常用方法获取分页信息:

方法描述
long getTotal()获取查询结果的总记录数。
List<T> getRecords()获取当前页的数据列表。
int getCurrent()获取当前页码。
int getSize()获取每页显示的记录数。
int getPages()获取总页数。
default boolean hasPrevious()判断是否有上一页。
default boolean hasNext()判断是否有下一页。
List<OrderItem> orders()获取排序的字段和排序方式。可以用于在分页查询时设置排序规则。

Api接口测试结果:

前端功能显示:

3条每页展示

8条每页展示


功能二:根据搜索栏名称查找对应医生(讲解自定义查询集)

//  TODO:根据搜索栏查找对应医生@RequestMapping("/SerchByName")public String SerchByName(@RequestParam("name")String name,@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "8") Integer pageSize) throws JsonProcessingException {
//        创建分页对象Page<Doctor> page = new Page<>(pageNum,pageSize);
//        自定义查询QueryWrapper<Doctor> wrapper = new QueryWrapper<>();wrapper.eq("name",name);//        创建分页结果对象IPage<Doctor> iPage = doctorService.page(page,wrapper);List<Doctor> list = iPage.getRecords();List<DoctorSummary> doctorSummaryList = new ArrayList<>();for (Doctor doctor:list){doctorSummaryList.add(new DoctorSummary(doctor.getHostId(),doctor.getName(),doctor.getPhone(),doctor.getImage(),doctor.getMajor()));}return JsonTool.writeValueAsString(doctorSummaryList);}

收获:学习查询模块的使用(QueryWrapper)

使用步骤(三层框架)

1.首先创建QueryWrapper对象

2.通过调用对象内部方法完善自定义查询的条件,以下是常用的方法

方法名说明
eq设置等于条件
ne设置不等于条件
gt设置大于条件
ge设置大于等于条件
lt设置小于条件
le设置小于等于条件
between设置范围条件
like设置模糊查询条件
in设置包含在列表中的条件
orderByAsc设置升序排序字段
orderByDesc设置降序排序字段
and设置并且连接的条件
or设置或者连接的条件
last直接拼接在 SQL 语句的最后
select设置要查询的字段
groupBy设置分组字段
having设置聚合条件

3.通过自动注入对应的service层,实现对应的操作

MyBatisPlus扩展下service层的所有快捷方法:

方法名作用
save保存实体对象到数据库
saveBatch批量保存实体对象到数据库
removeById根据ID删除数据库中的记录
removeByMap根据条件删除数据库中的记录
remove根据条件删除数据库中的记录
removeByIds根据ID列表批量删除数据库中的记录
updateById根据ID更新数据库中的记录
update根据条件更新数据库中的记录
updateBatchById根据ID列表批量更新数据库中的记录
saveOrUpdate如果存在则更新,否则保存实体对象到数据库
getById根据ID从数据库中查询对应的记录
listByIds根据ID列表从数据库中查询对应的记录
listByMap根据条件从数据库中查询对应的记录
getOne根据条件从数据库中查询一条记录
getMap根据条件从数据库中查询一条记录,并返回Map形式的结果
getObj根据条件从数据库中查询一条记录,并通过自定义函数进行映射转换
count计算数据库中符合条件的记录数量
list根据条件从数据库中查询多条记录
page根据条件从数据库中分页查询记录
listMaps根据条件从数据库中查询多条记录,并以Map形式返回结果
listObjs根据条件从数据库中查询多条记录,并返回Object类型的结果列表
pageMaps根据条件从数据库中分页查询记录,并以Map形式返回结果
getBaseMapper获取基础的Mapper接口,用于执行底层的数据库操作
getEntityClass获取实体类的Class对象
query创建一个QueryChainWrapper对象,用于构建查询条件
lambdaQuery创建一个LambdaQueryChainWrapper对象,用于构建Lambda表达式查询条件
ktQuery创建一个KtQueryChainWrapper对象,用于构建Kotlin DSL查询条件
ktUpdate创建一个KtUpdateChainWrapper对象,用于构建Kotlin DSL更新条件
update创建一个UpdateChainWrapper对象,用于构建更新条件
lambdaUpdate创建一个LambdaUpdateChainWrapper对象,用于构建Lambda表达式更新条件
saveOrUpdate如果存在则根据条件更新数据库中的记录,否则保存实体对象到数据库

api调试结果:

前端功能显示:


功能三: 实现获取医生的详细信息

代码如下:

//    TODO:获取医生的详细信息@RequestMapping("/getDetail")public String getDetail(@RequestParam("id") Integer id) throws JsonProcessingException {QueryWrapper<Doctor> wrapper = new QueryWrapper<>();wrapper.eq("id",id);Doctor doctorServiceById = doctorService.getOne(wrapper);DoctorDetailSummary doctorDetailSummary =new DoctorDetailSummary(doctorServiceById.getHostId(),doctorServiceById.getName(),doctorServiceById.getPhone(),doctorServiceById.getImage(),doctorServiceById.getMajor(),doctorServiceById.getSchool());return JsonTool.writeValueAsString(doctorDetailSummary);}

这个功能需要前端在展示医生基础数据时候,还能进行查看更多详细但是不敏感的信息。

api测试结果:

前端功能实现展示:
 


功能四:实现预约功能

@RestController
@RequestMapping("/vaccinum/registration")
public class RegistrationController {@AutowiredIRegistrationService registrationService;ObjectMapper JSon_Tool = new ObjectMapper();@RequestMapping("/insert")public String register(Registration registration) throws JsonProcessingException {HashMap map = new HashMap();boolean save = registrationService.save(registration);map.put("flag",save);return JSon_Tool.writeValueAsString(map);}
}


功能五:根据医生科室查询医生

//  TODO:根据医院的科室查询对应医生@RequestMapping("/SerchByMajor")public String SerchByMajor(@RequestParam("major") String major,@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "8") Integer pageSize) throws JsonProcessingException {HashMap map = new HashMap<>();Page<Doctor> page = new Page<>(pageNum,pageSize);QueryWrapper<Doctor> wrapper = new QueryWrapper<>();wrapper.eq("major",major);IPage<Doctor> iPage = doctorService.page(page,wrapper);List<Doctor> list = iPage.getRecords();//        获取信息List<DoctorSummary> doctorSummaryList = new ArrayList<>();for (Doctor doctor:list){doctorSummaryList.add(new DoctorSummary(doctor.getHostId(),doctor.getName(),doctor.getPhone(),doctor.getImage(),doctor.getMajor()));}map.put("list",doctorSummaryList);map.put("total",iPage.getTotal());return JsonTool.writeValueAsString(doctorSummaryList);}

 Apifox测试:

注意:

由于这里没有和前端沟通好,前端直接使用了elementUi中自带的种类查询,这样会导致一个问题,那就是后端给的数据在前端筛选,导致分页功能无法正常使用。

如图:

3条每页的数据只有两条,甚至一条或者空,这是因为,在前端访问后端并返回数据时候,这个页面是固定数据的3条每一页。而elementUi在此基础上进行筛选,三条数据中major==外科手术的只有两条,那么就保留两条。


收获与反思

收获:

本次我负责后端的接口开发,这次的模块功能开发,

1.让我了解了MybatisPlus的分页是如何实现的,与一般的MyBatis的区别之处。

2.然后就是自定义结果集(QueryWrapper)的基本使用。

3.MyBatisPlus提供的快速方法,进行一些基本的了解

反思:

  • 第一,代码需要规范,与前端交接时候,前端代码应该有条理性,前端模块开发中函数设计分区块,即前端自行处理的区块,和后端交互的函数区块需要分开。并且注意在函数前加上注释。否则若只给后端前端的代码,后端只能看到一坨捆绑的线团。不知所云。
  • 第二,并且需要基于事实实现对应的功能。根据数据库实际的列去实现,这里前端做的预约功能虽然看似合理,但是缺少了对应的信息填写表格。
  • 第三, 后端方面的问题,第一,返回的格式类型应该以map形式传递,这样能保证传输格式的灵活性。这里一开始就仅仅传递一个链表返回,并未考虑可能有其它参数需要返回。
  • 第四,如果写好了开发文档,请前端务必按照开发文档中来做,这里我后端其实还实现一个功能,根据科室进行查找对应的医生,但是前端中使用组件的方式,
  • 最后,在前后端的开发中一定一定要保持交流,任何的改动都需要跟对方谈好,否则会给双方带来极大的困扰!!!

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

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

相关文章

【Cocos新手进阶】父级预制体中的数据列表,在子预制体中的控制方法!

本篇文章主要讲解&#xff0c;cocos中在预制体操作过程中&#xff0c;父级预制体生成的数据列表中&#xff0c;绑定了子预制体中的事件&#xff0c;在子预制体的时间中如何控制上级列表的具体操作教程。 日期&#xff1a;2023年11月10日 作者&#xff1a;任聪聪 一、实际效果情…

k8s-Pod控制器

一、Pod控制器 1.Pod控制器及其功用 Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层&#xff0c;确保pod资源符合预期的状态&#xff0c;pod的资源出现故障时&#xff0c;会尝试进行重启&#xff0c;当根据重启…

企业安全—三保一评

0x00 前言 本篇主要是讲解三保一评的基础知识&#xff0c;以及对为什么要进行这些内容的原因进行总结。 0x01 整体 1.概述 三保分别是&#xff0c;分保&#xff0c;等保&#xff0c;关保。 分保就是指涉密信息系统的建设使用单位根据分级保护管理办法和有关标准&#xff0c…

植物补光灯,哪种效果好?

室内种植物有诸多好处&#xff1a;空间装饰、吸收有害物质、释放氧气&#xff0c;使室内空气更加清新&#xff1b;植物的蒸腾作用可以增加室内的湿度&#xff0c;改善秋冬季干燥的室内环境&#xff0c;可谓是天然的加湿器。 然而由于缺乏太阳光&#xff0c;在室内养植并不是一…

服装展示服务预约小程序的内容如何

互联网电商深入&#xff0c;很多服装商家开始线上卖货经营、会员管理及私域营销等&#xff0c;这也是当今商家们的一个优选项&#xff0c;当然除了直接卖货以外&#xff0c;展示和预约、客户交互也同样是不少商家需要的。 那么商家通过服装展示预约小程序能够实现什么效果呢&a…

被腾讯云感动哭了,5年内都不用再买服务器了!

我一直在寻找一个稳定、高效、可靠的云服务器提供商&#xff0c;以支持我的个人网站和业务。最近&#xff0c;我发现了腾讯云&#xff0c;它提供了一款非常优惠的2核4G云服务器&#xff0c;而且可以用超低的价格一次性购买5年的服务期限&#xff01;看到这么贴心的腾讯云&#…

小程序订单中心path设置本次审核不通过,审核原因:小程序尚未发布,无法审核。

小程序尚未发布&#xff0c;无法审核。 先按照这篇文章把小程序审核通过&#xff0c;小程序版本审核未通过&#xff0c;需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path&#xff0c;请设置后再提交代码审核 小程序审核通过后&#xff0c;发布…

React进阶之路(三)-- Hooks

文章目录 Hooks概念理解什么是HooksHooks解决了什么问题 useState基础使用状态的读取和修改组件的更新过程使用规则回调函数作为参数 useEffect什么是函数副作用基础使用依赖项控制执行时机清理副作用发送网络请求 useRefUseContext Hooks概念理解 什么是Hooks Hooks的本质&am…

力扣每日一道系列 --- LeetCode 88. 合并两个有序数组

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 思路1&#xff1a;暴力求解思路2&#xff1a;原地合并 LeetCode 88. 合并两个有序数组…

修改Android Studio默认的gradle目录

今天看了一下&#xff0c;gradle在C盘占用了40多G。我C盘是做GHOST的&#xff0c;放在这里不方便。所以就要修改。 新建目录名&#xff08;似乎无必要&#xff09; ANDROID_SDK_HOMEG:\SOFTWARES\android-sdk GRADLE_USER_HOMEG:\SOFTWARES\.gradle 修改目录 File->Setti…

C# 异步日志记录类,方便下次使用,不用重复造轮子

先定义接口类&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 异常 {internal interface ILog{Task WriteErrorLog(string message);Task WriteInfoLog(string message);Task W…

Git 安全警告修复手册:解决 `fatal: detected dubious ownership in repository at ` 问题 ️

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

2.HTML中常用浏览器

2.常用浏览器 2.1 什么是浏览器 浏览器是网页显示&#xff0c;运行的平台。常用的浏览器有IE&#xff0c;火狐&#xff0c;谷歌&#xff0c;Safari和Opera等 平时成为五大浏览器 2.2 浏览器内核 浏览器内核&#xff08;渲染引擎&#xff09;&#xff1a;负责读取网页内容&…

Java算法(五):手写数组逆置API方法,实现数组逆置。 while实现 for循环实现

Java算法&#xff08;五&#xff09; while 循环实现 需求&#xff1a; 已知一个数组&#xff0c;arr {11, 22, 33, 44, 55};使用程序实现把数组中的元素交换位置。 交换后的数组为 arr {55, 44, 33, 22, 11}; 并在控制台输出交换后的数组元素。 代码示例 package com.…

【Proteus仿真】【Arduino单片机】数码管显示

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用TM1637、共阳数码管等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示数字、字符。 二、软件设计 /* 作者&#xff1a;嗨小易&am…

Spring Cloud Config、Apollo、Nacos和Archaius对比

一、适应场景 Spring Cloud Config、Apollo、Nacos、Archaius这四个配置中心在功能和使用场景上有所差异。 1.Spring Cloud Config Spring Cloud Config是Spring Cloud官方提供的分布式系统的外部配置中心。它提供了服务器和客户端支持&#xff0c;可以集中管理不同环境、不同集…

AI时代如何提升自己晋升力

要在AI时代提升职场晋升力&#xff0c;采取以下详细策略&#xff1a; 终身学习的实践&#xff1a; 专业课程&#xff1a; 定期参加在线课程或研讨会&#xff0c;如Coursera、edX等&#xff0c;学习最新的AI技术和行业动态。行业资讯&#xff1a; 订阅相关的行业杂志、博客&…

基于SSM的学院就业信息网设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

奇异矩阵、非奇异矩阵

对于一个方阵A&#xff1a; 如果A的行列式等于0&#xff0c;称矩阵A为奇异矩阵如果A的行列式不等于0&#xff0c;称A 非奇异矩阵 也就是说&#xff0c;对于方阵A&#xff0c;如果它是满秩的&#xff0c;即它的秩等于矩阵的阶数&#xff0c;就是非奇异矩阵&#xff1b;如果秩小…

​怎么测试websocket接口

在部分业务中&#xff0c;我们需要使用长连接&#xff0c;我们可以使用http长连接或者websocket&#xff0c;开发结束后难免会遇到测试问题&#xff0c;这里推荐2个&#xff0c;一个是postman&#xff0c;一个是网站 postman 测试网站 测这边推荐测试网站&#xff0c;支持ws/w…