基于SpringBoot+VUE的寵物醫(yī)院后臺(tái)管理系統(tǒng)【源碼開(kāi)源】【建議收藏】
今天給大家開(kāi)源一個(gè)基于SpringBoot+VUE的寵物醫(yī)院后臺(tái)管理系統(tǒng),系統(tǒng)基于腳手架工程,花了大概1周時(shí)間做出來(lái)的。
該系統(tǒng)完全開(kāi)源。
系統(tǒng)完美運(yùn)行,無(wú)任何的bug,技術(shù)較多,可以當(dāng)做
面試的項(xiàng)目或者作為畢設(shè)的項(xiàng)目。
通過(guò)本項(xiàng)目你可以學(xué)到:
- 項(xiàng)目是怎樣前后端分離的
- vue 是如何用于后臺(tái)管理的
- 如何用MyBaitsPlus 代碼生成器生成代碼的
- 單表增刪改查(包括分頁(yè)模糊查詢)
- 批量刪除
- 基于RBAC的權(quán)限管理是如何設(shè)計(jì)的
- 菜單管理又是如何實(shí)現(xiàn)的
- 文件上傳的實(shí)現(xiàn)
- 導(dǎo)入導(dǎo)出
- 主從表的數(shù)據(jù)是如何在前端呈現(xiàn)的
- …
獲取源碼的方式見(jiàn)文章底部。
為防止刷著刷著找不到,大家點(diǎn)贊、收藏文章。
具體的介紹如下所示。
1.技術(shù)介紹
核心技術(shù):SpringBoot+MyBatis-Plus;
前端:vue+elementui;
開(kāi)發(fā)工具:Idea,VS Code, Git;
數(shù)據(jù)庫(kù):mysql5.7;
2.系統(tǒng)設(shè)計(jì)
本系統(tǒng)考慮的應(yīng)用場(chǎng)景是在寵物店或?qū)櫸镝t(yī)院里, 主要有預(yù)約管理、藥品管理、訂單管理、充值管理等功能。
主要分了用戶、醫(yī)生和管理員三個(gè)角色。每個(gè)角色登錄系統(tǒng)會(huì)有不同的菜單功能呈現(xiàn),頁(yè)面中不同的角色有不同的權(quán)限。各角色可訪問(wèn)的菜單都由管理員進(jìn)行配置。
2.1系統(tǒng)功能設(shè)計(jì)
2.2預(yù)約流程
2.3就診流程
2.4商品流程
2.5充值流程
3.功能介紹
3.1登錄或注冊(cè)
沒(méi)有賬號(hào)可以注冊(cè)賬號(hào),當(dāng)前只開(kāi)放 普通用戶的注冊(cè)。對(duì)于醫(yī)生和管理員的注冊(cè),由系統(tǒng)管理員在管理段注冊(cè)。(默認(rèn)管理員的賬號(hào)和密碼都是 admin)
登錄之后,后臺(tái)會(huì)菜單和權(quán)限的配置生成相應(yīng)數(shù)據(jù)告知前端,前端進(jìn)入相應(yīng)的模塊。
4.用戶端
4.1就診預(yù)約
用戶可以查看所有醫(yī)生信息,并根據(jù)寵物病情選擇預(yù)約對(duì)應(yīng)的醫(yī)生預(yù)約排隊(duì)(即添加預(yù)約信息)。
4.2預(yù)約管理
用戶查看自己的預(yù)約信息,查看預(yù)約審核狀態(tài);并實(shí)現(xiàn)預(yù)約信息的添加,修改,刪除,查詢功能。
4.3藥品管理
用戶可以查詢治療寵物需要用到的所有藥品或食品,針對(duì)自己寵物需要用到的商品可以進(jìn)行訂購(gòu)(不能對(duì)商品實(shí)現(xiàn)添加,修改,刪除功能)。
4.4訂單管理
用戶可以查看自己的所有商品訂單,并實(shí)現(xiàn)修改,刪除,查詢功能,針未支付的訂單可以進(jìn)行支付,收到商品以后進(jìn)行確認(rèn)收貨。
4.5充值中心
用戶針對(duì)自己的賬戶進(jìn)行余額充值。每筆充值記錄及消費(fèi)記錄都可查詢到。
4.6個(gè)人中心
用戶可以查看自己的個(gè)人信息,并實(shí)現(xiàn)修改功能(例如:修改賬號(hào),密碼等)。
5.醫(yī)生端
醫(yī)生的注冊(cè)目前只能由管理員在管理員端進(jìn)行注冊(cè),暫不開(kāi)放自己注冊(cè)。
5.1預(yù)約管理
醫(yī)生可以查詢預(yù)約了自己的所有預(yù)約信息,實(shí)現(xiàn)預(yù)約信息的添加,修改,刪除,查詢功能。
5.2診斷管理
針對(duì)每一個(gè)自己診斷的寵物進(jìn)行記錄,方便下次診斷時(shí)查詢,實(shí)現(xiàn)就診記錄的添加,修改,刪除,查詢功能。
5.3.個(gè)人中心
醫(yī)生可以查看自己的個(gè)人信息,并實(shí)現(xiàn)修改功能(例如:修改賬號(hào),密碼等)。
(截圖可參見(jiàn)前面用戶端的)
6.管理員端
6.1.用戶管理
查詢所有普通用戶信息,實(shí)現(xiàn)普通用戶的添加,修改,刪除,查詢功能。
6.2.醫(yī)生管理
查詢所有醫(yī)生信息,實(shí)現(xiàn)醫(yī)生的添加,修改,刪除,查詢功能。
6.3.藥品管理
查詢所有治療寵物的藥品或食品信息,實(shí)現(xiàn)商品的添加,修改,刪除,查詢功能。
6.4.訂單管理
查詢用戶的所有訂單,針對(duì)已經(jīng)付款的訂單進(jìn)行發(fā)貨處理,針對(duì)已經(jīng)完成的訂單,以及未支付的訂單可以進(jìn)行刪除處理,不能修改用戶訂單。
6.5.科室管理
查詢科室信息,實(shí)現(xiàn)科室的添加,修改,刪除,查詢功能。
6.6.寵物種類(lèi)管理
查詢寵物種類(lèi)信息,實(shí)現(xiàn)科室的添加,修改,刪除,查詢功能。
6.7.個(gè)人中心
管理員查詢自己的個(gè)人信息,并可以實(shí)現(xiàn)修改功能(例如:修改賬號(hào),密碼等)。
(截圖可參見(jiàn)前面用戶端的)
7.核心代碼
/**
* <p>
* 訂單管理控制器
* </p>
*
* @author
* @since 2023-04-24
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@Resource
private IOrderBaseService orderBaseService;
@Resource
private IOrderItemService orderItemService;
@Resource
private IDrugService drugService;
@Resource
private IUserService userService;
private final String now = DateUtil.now();
// 新增或者更新
@PostMapping
public Result save(@RequestBody OrderDTO orderDTO) {
if (orderDTO.getItems() == null || orderDTO.getItems().size()<1) {
return Result.error(Constants.CODE_400, "參數(shù)錯(cuò)誤.訂單缺少項(xiàng)目信息");
}
if (StringUtils.isEmpty(orderDTO.getReceiverPhone())) {
return Result.error(Constants.CODE_400, "參數(shù)錯(cuò)誤.請(qǐng)?zhí)峁┦肇浫穗娫?);
}
if (StringUtils.isEmpty(orderDTO.getReceiverAddress())) {
return Result.error(Constants.CODE_400, "參數(shù)錯(cuò)誤.請(qǐng)?zhí)峁┦肇浫说刂?);
}
//判斷用戶是否存在
QueryWrapper<User> queryWrapperCustom = new QueryWrapper<>();
queryWrapperCustom.eq("username", orderDTO.getUserName());
queryWrapperCustom.eq("role", RoleEnum.ROLE_USER.toString());
User findUser = userService.getOne(queryWrapperCustom);
if (null == findUser) {
return Result.error(Constants.CODE_404, "用戶不存在");
}
if (orderDTO.getRemark() == null) {
orderDTO.setRemark("");
}
BigDecimal totalAmount = new BigDecimal(0);
OrderBase orderBase = new OrderBase();
orderBase.setStatus(OrderBase.OrderStatus.UN_PAY);
orderBase.setPayMode(OrderBase.PayMode.UNKNOWN);
orderBase.setPayVoucherNo("");
orderBase.setUserId(findUser.getId());
orderBase.setUserName(findUser.getUsername());
orderBase.setReceiverPhone(orderDTO.getReceiverPhone());
orderBase.setReceiverAddress(orderDTO.getReceiverAddress());
orderBase.setRemark(orderDTO.getRemark());
long oid = 0;
if (orderDTO.getId() == null) {
//添加操作
OrderIdGenerator orderIdGenerator = new OrderIdGenerator();
oid = orderIdGenerator.nextId(this);
orderDTO.setId(oid);
User currentUser = TokenUtils.getCurrentUser();
orderBase.setCreateName(currentUser.getUsername());
orderBase.setCreateBy(String.valueOf(currentUser.getId()));
orderBase.setCreateRole(currentUser.getRole());
orderBase.setCreateTime(new Date());
}else {
//更新操作
oid = orderDTO.getId();
//找出原訂單信息
OrderBase oldOrder = orderBaseService.getById(oid);
if (null == oldOrder) {
return Result.error(Constants.CODE_404, "訂單記錄不存在.id=" + oid);
}
//只有待支付狀態(tài)的訂單才 可以 修改
if (oldOrder.getStatus() != OrderBase.OrderStatus.UN_PAY) {
return Result.error(Constants.CODE_600, "只有待支付狀態(tài)的訂單才可以修改 .id=" + oid);
}
orderBase.setCreateName(oldOrder.getCreateName());
orderBase.setCreateBy(oldOrder.getCreateBy());
orderBase.setCreateRole(oldOrder.getCreateRole());
orderBase.setCreateTime(oldOrder.getCreateTime());
//刪除原來(lái)項(xiàng)目 表的內(nèi)容
orderItemService.delByOrderId(oid);
}
//先保存項(xiàng)目表
int seq = 0;
String orderOverview = "" ; // 訂單項(xiàng)目簡(jiǎn)要
for (OrderItem orderItem: orderDTO.getItems() ) {
orderItem.setOrderId(oid);
//處理 序號(hào)
seq++;
orderItem.setSeq(seq);
if (orderItem.getItemId() == null ) {
return Result.error(Constants.CODE_400, "參數(shù)錯(cuò)誤. 訂單項(xiàng)目id為Null");
};
if (orderItem.getQty() == null ) {
return Result.error(Constants.CODE_400, "參數(shù)錯(cuò)誤. 訂單項(xiàng)目數(shù)量為Null");
}
if (orderItem.getQty() <= 0 ) {
return Result.error(Constants.CODE_400, "參數(shù)錯(cuò)誤. 訂單項(xiàng)目數(shù)量必須大于0");
}
//數(shù)據(jù)庫(kù)中查找商品是否存在
Drug drug = drugService.getById(orderItem.getItemId());
if (null == drug) {
return Result.error(Constants.CODE_400, "參數(shù)錯(cuò)誤. 商品不存在. 項(xiàng)目id=" + orderItem.getItemId());
}
orderItem.setPrice(drug.getRetailPrice());
orderItem.setName(drug.getName() + " " + drug.getProductName());
orderItem.setUnit(drug.getUnit());
orderOverview += "|";
orderOverview += orderItem.getName();
//計(jì)算合計(jì)
totalAmount = totalAmount.add(orderItem.getPrice().multiply(new BigDecimal(orderItem.getQty())));
if (!orderItemService.save(orderItem)) {
return Result.error(Constants.CODE_600, "業(yè)務(wù)異常.無(wú)法保存某訂單的項(xiàng)目.項(xiàng)目id=" + orderItem.getItemId());
};
}
orderOverview += "|";
if (orderOverview.length()>128) {
orderOverview = orderOverview.substring(0,127);
}
orderBase.setId(oid);
orderBase.setOverview(orderOverview);
orderBase.setAmount(totalAmount);
//再保存主表的
if (orderBaseService.saveOrUpdate(orderBase)) {
return Result.success();
}else {
return Result.error(Constants.CODE_600, "業(yè)務(wù)異常.保存訂單主表失敗" );
}
}
@DeleteMapping("/{id}")
public Result delete(@PathVariable Long id) {
OrderBase orderBase = orderBaseService.getById(id);
if (null == orderBase ){
return Result.error(Constants.CODE_404, "訂單不存在. 訂單id=" + id );
}
//只能刪除未支付或已簽收的訂單
if (orderBase.getStatus()==OrderBase.OrderStatus.UN_PAY ||
orderBase.getStatus()==OrderBase.OrderStatus.SIGN ) {
;
}else {
return Result.error(Constants.CODE_600, "無(wú)效訂單狀態(tài).只能刪除未支付或已簽收的訂單");
}
//先刪除項(xiàng)目表的記錄
orderItemService.delByOrderId(id);
orderBaseService.removeById(id);
return Result.success();
}
@PostMapping("/del/batch")
public Result deleteBatch(@RequestBody List<Long> ids) {
//先刪除項(xiàng)目表的記錄
for (Long id: ids) {
orderItemService.delByOrderId(id);
}
orderBaseService.removeByIds(ids);
return Result.success();
}
@GetMapping
public Result findAll() {
return Result.success(orderBaseService.list());
}
@GetMapping("/{id}")
public Result findOne(@PathVariable Long id) {
return Result.success(orderBaseService.getById(id));
}
@GetMapping("/page")
public Result findPage(@RequestParam(defaultValue = "") String userName,
@RequestParam Integer pageNum,
@RequestParam Integer pageSize) {
QueryWrapper<OrderBase> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("create_time");
if (!"".equals(userName)) {
queryWrapper.like("user_name", userName);
}
User currentUser = TokenUtils.getCurrentUser();
if (currentUser.getRole().equals(RoleEnum.ROLE_USER.toString())) {
//普通用戶只能查看自己的預(yù)約記錄
queryWrapper.eq("user_id", currentUser.getId());
}
Object object = orderBaseService.page(new Page<>(pageNum, pageSize), queryWrapper);
return Result.success(object);
//return Result.success(orderBaseService.page(new Page<>(pageNum, pageSize), queryWrapper));
}
@GetMapping("/items/{id}")
public Result findOrderItems(@PathVariable Long id) {
//查找訂單項(xiàng)目列表
QueryWrapper<OrderItem> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("seq");
queryWrapper.eq("order_id", id);
return Result.success(orderItemService.list(queryWrapper));
}
/**
* 導(dǎo)出接口
*/
@GetMapping("/export")
public void export(HttpServletResponse response) throws Exception {
// 從數(shù)據(jù)庫(kù)查詢出所有的數(shù)據(jù)
List<OrderBase> list = orderBaseService.list();
// 在內(nèi)存操作,寫(xiě)出到瀏覽器
ExcelWriter writer = ExcelUtil.getWriter(true);
// 一次性寫(xiě)出list內(nèi)的對(duì)象到excel,使用默認(rèn)樣式,強(qiáng)制輸出標(biāo)題
writer.write(list, true);
// 設(shè)置瀏覽器響應(yīng)的格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
String fileName = URLEncoder.encode("OrderBase信息表", "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
ServletOutputStream out = response.getOutputStream();
writer.flush(out, true);
out.close();
writer.close();
}
/**
* excel 導(dǎo)入
* @param file
* @throws Exception
*/
@PostMapping("/import")
public Result imp(MultipartFile file) throws Exception {
InputStream inputStream = file.getInputStream();
ExcelReader reader = ExcelUtil.getReader(inputStream);
// 通過(guò) javabean的方式讀取Excel內(nèi)的對(duì)象,但是要求表頭必須是英文,跟javabean的屬性要對(duì)應(yīng)起來(lái)
List<OrderBase> list = reader.readAll(OrderBase.class);
orderBaseService.saveBatch(list);
return Result.success();
}
@PostMapping("/delivery/{id}")
public Result delivery(@PathVariable Long id) {
//發(fā)貨
//判斷訂單是否存在
OrderBase orderBase = orderBaseService.getById(id);
if (null == orderBase) {
return Result.error(Constants.CODE_404, "訂單不存在.訂單id=" + id);
}
//判斷訂單是否已經(jīng)支付
if (orderBase.getStatus() == OrderBase.OrderStatus.PAYED){
}else {
return Result.error(Constants.CODE_600, "訂單不是已支付狀態(tài), 不允許發(fā)貨.");
}
if (orderBaseService.updateDeliveryInfo(id, OrderBase.OrderStatus.DELIVERED, new Date()) >0) {
return Result.success(orderBaseService.getById(id));
}else {
return Result.error(Constants.CODE_600, "業(yè)務(wù)異常.更新訂單發(fā)貨信息失敗" );
}
}
@PostMapping("/sign/{id}")
public Result sign(@PathVariable Long id) {
//簽收,
//判斷訂單是否存在
OrderBase orderBase = orderBaseService.getById(id);
if (null == orderBase) {
return Result.error(Constants.CODE_404, "訂單不存在.訂單id=" + id);
}
//判斷訂單是否已經(jīng)支付
if (orderBase.getStatus() == OrderBase.OrderStatus.DELIVERED){
;
}else {
return Result.error(Constants.CODE_600, "訂單不是已發(fā)貨狀態(tài), 不允許簽收.");
}
if (orderBaseService.updateSignInfo(id, OrderBase.OrderStatus.SIGN, new Date())>0) {
return Result.success(orderBaseService.getById(id));
}else {
return Result.error(Constants.CODE_600, "業(yè)務(wù)異常.更新訂單簽收信息失敗" );
}
}
private User getUser() {
return TokenUtils.getCurrentUser();
}
}
/**
* <p>
* 預(yù)約管理控制器
* </p>
*
* @author
* @since 2023-04-23
*/
@RestController
@RequestMapping("/appointment")
public class AppointmentController {
@Resource
private IAppointmentService appointmentService;
@Resource
private IUserService userService;
@Resource
private IDoctorService doctorService;
private final String now = DateUtil.now();
// 新增或者更新
@PostMapping
public Result save(@RequestBody Appointment appointment) {
if (appointment.getAppointmentTime() == null) {
return Result.error(Constants.CODE_400, "參數(shù)錯(cuò)誤:請(qǐng)?zhí)峁╊A(yù)約時(shí)間");
}
//查找顧客信息
QueryWrapper<User> queryWrapperCustom = new QueryWrapper<>();
queryWrapperCustom.eq("username", appointment.getCustomName());
queryWrapperCustom.eq("role", RoleEnum.ROLE_USER.toString());
User findCustom = userService.getOne(queryWrapperCustom);
if (null == findCustom) {
return Result.error(Constants.CODE_404, "顧客不存在");
}
appointment.setCustomId(findCustom.getId());
appointment.setCustomName(findCustom.getUsername());
appointment.setCustomPhone(findCustom.getPhone());
//查找醫(yī)生信息
QueryWrapper<User> queryWrapperDoctor = new QueryWrapper<>();
queryWrapperDoctor.eq("username", appointment.getDoctorName());
queryWrapperDoctor.eq("role", RoleEnum.ROLE_DOCTOR.toString());
User findDoctor = userService.getOne(queryWrapperDoctor);
if (null == findDoctor) {
return Result.error(Constants.CODE_404, "醫(yī)生不存在");
}
appointment.setDoctorId(findDoctor.getId());
appointment.setDoctorName(findDoctor.getUsername());
appointment.setDoctorPhone(findDoctor.getPhone());
if (appointment.getRemark() == null) {
appointment.setRemark("");
}
if (appointment.getId() == null) {
//添加操作
appointment.setStatus(Appointment.AppointmentStatus.WAIT_AUDIT);
User currentUser = TokenUtils.getCurrentUser();
appointment.setCreateName(currentUser.getUsername());
appointment.setCreateBy(String.valueOf(currentUser.getId()));
appointment.setCreateRole(currentUser.getRole());
appointment.setCreateTime(new Date());
}else {
//更新操作
if (appointment.getStatus() == null) {
return Result.error(Constants.CODE_400, "參數(shù)錯(cuò)誤:請(qǐng)?zhí)峁╊A(yù)約狀態(tài)");
}
//不更新原 創(chuàng)建人信息
Appointment oldAppointment = appointmentService.getById(appointment.getId());
if (null==oldAppointment) {
return Result.error(Constants.CODE_404, "預(yù)約記錄不存在");
}
appointment.setCreateName(oldAppointment.getCreateName());
appointment.setCreateBy(oldAppointment.getCreateBy());
appointment.setCreateRole(oldAppointment.getCreateRole());
appointment.setCreateTime(oldAppointment.getCreateTime());
}
appointmentService.saveOrUpdate(appointment);
return Result.success();
}
@DeleteMapping("/{id}")
public Result delete(@PathVariable Long id) {
appointmentService.removeById(id);
return Result.success();
}
@PostMapping("/del/batch")
public Result deleteBatch(@RequestBody List<Long> ids) {
appointmentService.removeByIds(ids);
return Result.success();
}
// @GetMapping
// public Result findAll() {
// return Result.success(appointmentService.list());
// }
@GetMapping("/{id}")
public Result findOne(@PathVariable Long id) {
return Result.success(appointmentService.getById(id));
}
@GetMapping("/page")
public Result findPage(@RequestParam Integer pageNum,
@RequestParam Integer pageSize,
@RequestParam(defaultValue = "") String customName,
@RequestParam(defaultValue = "") String doctorName) {
QueryWrapper<Appointment> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("id");
if (!"".equals(customName)) {
queryWrapper.like("custom_name", customName);
}
if (!"".equals(doctorName)) {
queryWrapper.like("doctor_name", doctorName);
}
User currentUser = TokenUtils.getCurrentUser();
if (currentUser.getRole().equals(RoleEnum.ROLE_USER.toString())) {
//普通用戶只能查看自己的預(yù)約記錄
queryWrapper.eq("create_by", currentUser.getId());
}else if (currentUser.getRole().equals(RoleEnum.ROLE_DOCTOR.toString())) {
//醫(yī)生可以查看自己的記錄和 別人約自己的
queryWrapper.eq("create_by", currentUser.getId()).or().eq("doctor_id", currentUser.getId());
}
return Result.success(appointmentService.page(new Page<>(pageNum, pageSize), queryWrapper));
}
/**
* 導(dǎo)出接口
*/
@GetMapping("/export")
public void export(HttpServletResponse response) throws Exception {
// 從數(shù)據(jù)庫(kù)查詢出所有的數(shù)據(jù)
List<Appointment> list = appointmentService.list();
// 在內(nèi)存操作,寫(xiě)出到瀏覽器
ExcelWriter writer = ExcelUtil.getWriter(true);
// 一次性寫(xiě)出list內(nèi)的對(duì)象到excel,使用默認(rèn)樣式,強(qiáng)制輸出標(biāo)題
writer.write(list, true);
// 設(shè)置瀏覽器響應(yīng)的格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
String fileName = URLEncoder.encode("Appointment信息表", "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
ServletOutputStream out = response.getOutputStream();
writer.flush(out, true);
out.close();
writer.close();
}
/**
* excel 導(dǎo)入
* @param file
* @throws Exception
*/
@PostMapping("/import")
public Result imp(MultipartFile file) throws Exception {
InputStream inputStream = file.getInputStream();
ExcelReader reader = ExcelUtil.getReader(inputStream);
// 通過(guò) javabean的方式讀取Excel內(nèi)的對(duì)象,但是要求表頭必須是英文,跟javabean的屬性要對(duì)應(yīng)起來(lái)
List<Appointment> list = reader.readAll(Appointment.class);
appointmentService.saveBatch(list);
return Result.success();
}
private User getUser() {
return TokenUtils.getCurrentUser();
}
}
8.設(shè)計(jì)文檔
提供需求說(shuō)明和關(guān)鍵的業(yè)務(wù)數(shù)據(jù)庫(kù)表字典,很難得喔。
9.源碼獲取
如果你喜歡這個(gè)項(xiàng)目的話, 給個(gè)一鍵三連,點(diǎn)贊越多,往后提高更多的開(kāi)源項(xiàng)目, 謝謝大家,gitee鏈接附上。
后端:https://gitee.com/madifu/petHis-backend
前端:https://gitee.com/madifu/petHis-fontend-admin文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-466617.html
10.后記
在開(kāi)發(fā)這個(gè)系統(tǒng)時(shí),遇到過(guò)幾個(gè)坑,包括 VUE的,還有js 的,它們是怎么繞過(guò)去的,將另行文章做相關(guān)介紹。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-466617.html
到了這里,關(guān)于基于SpringBoot+VUE的寵物醫(yī)院后臺(tái)管理系統(tǒng)【源碼開(kāi)源】【建議收藏】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!