使用动态模型创建web应用

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
应用实时监控服务-用户体验监控,每月100OCU免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 【9月更文挑战第5天】动态模型描述系统中对象间的交互和状态变化,重点关注事件驱动的行为。时序图清晰展示了请求处理流程,状态图则描绘了系统状态的转换过程。

1 简介动态模型(Dynamic Model)

动态模型用于描述系统的行为和交互,重点关注系统中对象之间的交互、事件驱动、状态变化等方面。它通常通过时序图、状态图等来展示对象之间的动态行为。

  • 在预约系统中的应用:

预约界面:

动态模型可以描述用户与系统之间的交互流程,例如用户填写预约信息、点击确认按钮后系统如何处理数据(调用后端服务、数据库交互等)。

数据库访问类:

动态模型可以描述数据库访问类如何响应系统事件,例如用户提交预约请求时,数据库访问类如何处理存储或查询操作。

医生列表:

动态模型可以描述用户请求医生列表时,系统如何查询数据库并返回医生列表,展示在用户界面上。

出诊时段表:

动态模型可以描述医生更新出诊时段时,如何与系统交互,并通知相应的预约模块刷新数据。

2 web框架中实现

在使用 Golang 的 Gin 框架实现预约系统时,我们可以分别实现界面、数据库访问、医生列表和出诊时段管理模块。

基本实现步骤如下:

    1. 安装依赖

确保已安装必要的依赖:

    go mod init appointment-system
    go get github.com/gin-gonic/gin
    go get gorm.io/driver/sqlite
    go get gorm.io/gorm
    1. 数据库模型

我们使用 GORM 库来进行数据库操作,使用 SQLite 作为数据库示例。

package main

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
    "log"
)

var db *gorm.DB

type Doctor struct {
    ID     uint   `gorm:"primaryKey"`
    Name   string `json:"name"`
    Email  string `json:"email"`
    Slots  []Slot `json:"slots"`
}

type Slot struct {
    ID        uint   `gorm:"primaryKey"`
    DoctorID  uint   `json:"doctor_id"`
    StartTime string `json:"start_time"`
    EndTime   string `json:"end_time"`
}

func initDB() {
    var err error
    db, err = gorm.Open(sqlite.Open("appointment.db"), &gorm.Config{})
    if err != nil {
        log.Fatal("Failed to connect to the database!")
    }

    // Migrate the schema
    db.AutoMigrate(&Doctor{}, &Slot{})
}
    1. Gin 路由和控制器

使用 Gin 框架来创建 API 端点,处理预约界面、医生列表和出诊时段管理。

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
    r := gin.Default()

    initDB()  // 初始化数据库

    // 路由
    r.POST("/appointment", createAppointment)
    r.GET("/doctors", getDoctors)
    r.POST("/doctors/:id/slots", addDoctorSlot)

    // 启动服务器
    r.Run(":8080")
}

type AppointmentRequest struct {
    DoctorID uint   `json:"doctor_id"`
    Name     string `json:"name"`
    Email    string `json:"email"`
    Date     string `json:"date"`
    Time     string `json:"time"`
}

处理预约请求

    func createAppointment(c *gin.Context) {
    var req AppointmentRequest

    if err := c.ShouldBindJSON(&req); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

检查医生是否存在

        var doctor Doctor
    if err := db.First(&doctor, req.DoctorID).Error; err != nil {
        c.JSON(http.StatusNotFound, gin.H{"error": "Doctor not found"})
        return
    }

简单模拟预约逻辑

        c.JSON(http.StatusOK, gin.H{
        "message": "Appointment created successfully",
        "doctor":  doctor.Name,
        "name":    req.Name,
        "email":   req.Email,
        "date":    req.Date,
        "time":    req.Time,
    })
}

获取医生列表

    func getDoctors(c *gin.Context) {
    var doctors []Doctor
    db.Preload("Slots").Find(&doctors)
    c.JSON(http.StatusOK, doctors)
}

添加出诊时段

func addDoctorSlot(c *gin.Context) {
    doctorID := c.Param("id")
    var slot Slot

    if err := c.ShouldBindJSON(&slot); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    slot.DoctorID = parseUint(doctorID)
    db.Create(&slot)

    c.JSON(http.StatusOK, gin.H{"message": "Slot added successfully"})
}

func parseUint(s string) uint {
    val, _ := strconv.ParseUint(s, 10, 32)
    return uint(val)
}

在该例子中动态模型关注系统中的对象如何响应事件、进行交互、以及状态的变化。

4 系统实现解释

预约界面:

用户通过 /appointment 端点提交预约请求。请求体包含预约信息(医生 ID、姓名、日期等)。
系统处理请求,验证医生的有效性,并返回预约结果。

数据库访问:

使用 GORM 处理数据库交互,医生和出诊时段信息被存储在 SQLite 数据库。
数据库的访问类通过 API 被调用,如 /doctors 获取医生列表,/doctors/:id/slots 添加医生的出诊时段。

医生列表:

用户可以通过 /doctors 端点获取医生列表,返回的信息包括医生的姓名和其关联的出诊时段。

出诊时段管理:

医生可以通过 /doctors/:id/slots 端点添加或更新自己的出诊时段。
系统会将这些出诊时段与医生关联,并存储到数据库中。

它通过时序图和状态图展示系统行为。

  • 事件驱动的系统交互:

系统基于 HTTP 请求触发不同的事件,这些事件会导致对象之间的交互,例如用户发起预约请求、系统查询医生信息、保存出诊时段等。

createAppointment 函数展示了用户-系统交互的动态流程。
当用户提交预约请求时,系统通过事件驱动的方式处理预约信息、查询医生数据,并返回响应。

  • 状态变化:

createAppointment 函数可以通过状态图展示其行为,例如从“接收请求”状态到“验证医生存在”状态,再到“创建预约”或“返回错误”的状态变化。

医生列表的管理和出诊时段的管理中,数据库访问类的状态也是动态的。
每个请求触发数据库操作,导致数据库中的状态(如医生时段数据的增加或修改)发生变化。

  • 对象之间的交互:

对象如 Doctor 和 Slot 之间的关联,体现在 addDoctorSlot 函数中。医生对象与出诊时段对象发生了关系,并且出诊时段的状态变化会影响到预约系统的可用性。
getDoctors 函数展示了医生列表和医生出诊时段的关联,系统在处理获取医生列表时,动态加载与医生相关的出诊时段。

  • 时序图展示系统流程:

时序图可以展示不同请求的处理流程。
例如 createAppointment 的时序图可能会展示:

    用户发送请求 -> 系统验证数据 -> 数据库查询医生 -> 返回预约结果的过程。

这些流程在代码中通过事件触发的函数调用清晰展现。

5. 使用和测试

启动 Gin 服务器后,可以使用 Postman 或 Curl 进行测试。

获取医生列表:

curl http://localhost:8080/doctors

提交预约请求:

curl -X POST http://localhost:8080/appointment -d '{"doctor_id":1, "name":"John Doe", "email":"john@example.com", "date":"2024-09-15", "time":"10:00"}' -H "Content-Type: application/json"

添加医生出诊时段:

curl -X POST http://localhost:8080/doctors/1/slots -d '{"start_time":"09:00", "end_time":"12:00"}' -H "Content-Type: application/json"

6 小结

该代码在通过事件驱动的 HTTP 请求触发系统对象的交互和状态变化体现了面向对象动态模型思想。
用户发起的请求使系统的各个对象(如医生、出诊时段、预约信息)发生变化,进而影响系统的整体状态。

目录
相关文章
|
2月前
|
JavaScript API 开发工具
(H5-Web3D-ThreeJS)在网页三维CAD中绘制窗户模型
本文介绍了如何使用mxcad3d在网页中创建一个简单的三维窗户模型。通过官方教程搭建环境,编写绘制窗户模型的代码,并在点击按钮后展示模型效果。最终模型包括窗框和玻璃部分,具备丰富的三维建模功能和便捷的API支持。
|
2月前
|
机器学习/深度学习 监控 数据挖掘
基于Django和百度飞桨模型的情感识别Web系统
基于Django和百度飞桨模型的情感识别Web系统
45 5
|
7月前
|
设计模式 存储 前端开发
MVC(模型-视图-控制器)是一种在Web应用程序开发中广泛使用的软件设计模式
【5月更文挑战第12天】MVC模式是Web应用开发中的常见设计模式,将逻辑、数据和界面分离,提升代码可维护性和重用性。模型处理数据逻辑,视图展示数据,控制器协调用户输入与模型视图交互。优点包括代码分离、易维护、可扩展和组件重用,促进高效灵活的开发。
71 2
|
4月前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
62 1
|
4月前
|
机器学习/深度学习 JSON API
【Python奇迹】FastAPI框架大显神通:一键部署机器学习模型,让数据预测飞跃至Web舞台,震撼开启智能服务新纪元!
【8月更文挑战第16天】在数据驱动的时代,高效部署机器学习模型至关重要。FastAPI凭借其高性能与灵活性,成为搭建模型API的理想选择。本文详述了从环境准备、模型训练到使用FastAPI部署的全过程。首先,确保安装了Python及相关库(fastapi、uvicorn、scikit-learn)。接着,以线性回归为例,构建了一个预测房价的模型。通过定义FastAPI端点,实现了基于房屋大小预测价格的功能,并介绍了如何运行服务器及测试API。最终,用户可通过HTTP请求获取预测结果,极大地提升了模型的实用性和集成性。
291 1
|
4月前
|
存储 数据库 开发者
Django Web架构:全面掌握Django模型字段(下)
Django Web架构:全面掌握Django模型字段(下)
67 2
|
4月前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
90 0
|
4月前
|
Apache 开发者 Java
Apache Wicket揭秘:如何巧妙利用模型与表单机制,实现Web应用高效开发?
【8月更文挑战第31天】本文深入探讨了Apache Wicket的模型与表单处理机制。Wicket作为一个组件化的Java Web框架,提供了多种模型实现,如CompoundPropertyModel等,充当组件与数据间的桥梁。文章通过示例介绍了模型创建及使用方法,并详细讲解了表单组件、提交处理及验证机制,帮助开发者更好地理解如何利用Wicket构建高效、易维护的Web应用程序。
61 0
|
4月前
|
存储 数据处理 数据库
Django Web架构:全面掌握Django模型字段(上)
Django Web架构:全面掌握Django模型字段(上)
54 0
|
5月前
|
机器学习/深度学习 数据可视化 前端开发
使用Stream实现Web应用,使用YOLOv8模型对图像进行目标检测为例。
使用Stream实现Web应用,使用YOLOv8模型对图像进行目标检测为例。
125 1