1.1功能模块实现

1.1.1整体结构

界面由两部分组成:左侧导航栏、右侧内容展示区。使用了 Bootstrap 5 的样式库,并结合了 ASP.NET MVC 的 @Html.ActionLink 和 Razor 条件判断语句来动态生成菜单项。

1.1.2导航栏功能模块

导航栏基础结构

导航栏基础结构使用 Bootstrap 的 navbar 类构建响应式导航栏。flex-column align-items-start 表示导航栏是垂直方向排列的。

响应式按钮

展示区显示折叠菜单按钮使用data-bs-toggle="collapse" 控制展开/收起。

动态菜单

根据用户登录状态和角色不同,显示不同的菜单项。

登录前:显示“登录”选项

登录后:设计用户角色:

店主功能用户管理、花卉管理、订单管理;普通用户功能购物车、订单界面、客服界面;管理员功能用户管理、花卉管理、花店订单管理。

商品搜索框

使用Ajax.BeginForm 实现异步搜索鲜花的功能,无需刷新页面即可更新商品列表。

3.1.2右侧内容展示区

主体内容容器使用 flex-grow-1 确保内容区域自动扩展以填满剩余空间。

@RenderBody() 是 MVC 布局页中的占位符,表示子页面的内容会在此处插入。

3.1.3主要功能模块

模块

功能说明

导航栏

实现响应式菜单,支持不同用户角色(管理员、店主、顾客)的不同菜单项。

权限控制

根据 Session 中的角色信息动态渲染菜单内容。

搜索功能

使用 AJAX 实现无刷新搜索,提升用户体验。

内容展示区

支持子页面内容动态加载,保持统一风格。

脚本管理

集中式引入常用脚本库,允许子页面添加自定义脚本。

 

3.2控制器介绍

3.2.1购物车控制器

通过多个Action 方法来实现添加、修改、删除购物车内容以及显示购物车信息等操作。

(1) Index()

获取当前登录用户的 ID。查询该用户的所有购物车条目,并包含关联的 Flowers 和 Users 数据。计算购物车中所有商品的总价(单价 × 数量),传递给视图。返回视图并展示购物车列表。依赖 Session["UserID"] 来判断当前用户。

(2) InsertCart(int flowerID)

判断用户是否登录(Session 是否存在 UserID)。判断用户身份是否是管理员或店主,如果是,则不允许购买。检查该用户是否已将此商品加入过购物车:若没有,新增一条记录;若有,将数量加一。保存更改后返回提示信息。使用了 JavaScript 提示框 (<script>alert(...)</script>) 并返回上一页。

(3) AddOne(int id)

根据 CartID 查找购物车条目。将商品数量加一。更新数据库状态并保存。

(4) MinusOne(int id)

同样根据 CartID 查找购物车条目。商品数量减一:若数量变为 0,则直接删除该条目;

否则更新数量。

(5) Delete(int id)

删除指定 ID 的购物车条目。保存更改后跳转回购物车首页。

3.2.2购物车控制器

用于处理与订单(Order)相关的操作。它使用了 ASP.NET MVC 框架,并结合 Entity Framework 实现对数据库中订单数据的访问和管理。

(1)Index()

功能:展示订单列表。权限控制:如果未登录(Session["RoleName"]为空),跳转到登录页。如果是“管理员”或“店主”,显示全部订单。如果是普通用户,则只显示当前用户的订单。

(2)UpdateOrderState(int id, int state)

功能:根据传入的状态值更新订单状态。参数说明:id: 订单IDstate: 状态码(应映射为枚举 OrderState)表示订单的状态。

3.3 技术介绍

3.3.1购买的倒计时功能

获取DOM元素:通过document.querySelector('.btn-gradient') 和 document.getElementById('countdown') 分别获取按钮和倒计时提示框的引用。禁用按钮:当函数开始执行时,首先禁用了按钮防止重复点击,并且改变了按钮的文字内容为带有旋转图标的“处理中…”以给用户视觉反馈。初始化倒计时:将倒计时设定为3秒,并将这个数值显示在倒计时框内。定时器逻辑:使用setInterval()方法每秒更新一次倒计时:减少剩余时间,并更新倒计时框中的数字。应用了一个名为countdown-pulse的CSS类,用于实现数字的跳动效果。根据剩余时间动态调整背景颜色,提供更丰富的视觉体验。当倒计时结束(即seconds小于等于0),清除定时器,恢复按钮的状态,并导航到购物车页面。

JS代码解释

function addToCart(flowerId) {

    // 获取按钮和倒计时元素

    var button = document.querySelector('.btn-gradient');

    var countdown = document.getElementById('countdown');

 

    // 禁用按钮并改变按钮文本为加载状态

    button.disabled = true;

    button.innerHTML = '<i class="fa fa-spinner fa-spin"></i> 处理中...';

 

    // 显示倒计时框并应用动画效果

    countdown.style.display = 'inline-block';

    countdown.classList.add('countdown-show');

 

    let seconds = 3; // 设置倒计时秒数

    const numberElement = countdown.querySelector('.countdown-number'); // 获取倒计时数字元素

    numberElement.textContent = seconds; // 初始化倒计时数字

 

    // 开始定时器,每秒更新一次

    const timer = setInterval(() => {

        seconds--; // 每次循环减少一秒

        numberElement.textContent = seconds; // 更新倒计时数字

        numberElement.classList.add('countdown-pulse'); // 添加跳动动画类

 

        // 动态修改背景颜色以增加视觉效果

        countdown.style.background = `linear-gradient(145deg,

            hsl(${seconds * 40}, 70%, 60%),

            #a363d9)`;

 

        // 在每次添加跳动动画类之后短暂延迟移除它,创建脉冲效果

        setTimeout(() => {

            numberElement.classList.remove('countdown-pulse');

        }, 200);

 

        // 如果倒计时结束

        if (seconds <= 0) {

            clearInterval(timer); // 清除定时器

            countdown.classList.remove('countdown-show'); // 移除动画效果

            setTimeout(() => {

                countdown.style.display = 'none'; // 隐藏倒计时框

                button.disabled = false; // 启用按钮

                button.innerHTML = '立即购买'; // 恢复按钮文本

                window.location.href = '@Url.Action("InsertCart","Cart",new { flowerID=Model.FlowerId})'; // 跳转至购物车页面

            }, 500);

        }

    }, 1000); // 每隔一秒钟调用一次回调函数

}

3.3.2花卉类别选择功能介绍

视图模型绑定

当前页面绑定了一个 Flowers 类型的集合数据,用于展示默认或筛选后的花卉列表。

@model IEnumerable<FlowerShop.Models.Flowers>

HTML结构的下拉菜单

使用了 ViewBag.flowerType 提供所有花卉类型的选项。每个 <option> 的 value 是花卉类型的 ID,提交后作为参数传给后台搜索方法。

<select id="flowerTypeSelect" name="flowertype" onchange="this.form.submit();">

    <option value="" disabled selected>选择花卉类型</option>

    @foreach (var flowertype in ViewBag.flowerType as List<FlowerShop.Models.FlowerTypes>)

    {

        <option value="@flowertype.FlowerTypeId">@flowertype.FlowerTypeName</option>

    }

</select>

Ajax 异步请求

表单使用了 Ajax.BeginForm 实现无刷新提交。提交时调用控制器 FlowersController 中的 SearchFlowerList(int? flowertype) 方法。返回结果更新到 #GoodShow 容器中,不会重新加载整个页面。

@using (Ajax.BeginForm("SearchFlowerList", "Flowers", new AjaxOptions { ... }))

 

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

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

相关文章

C++ Qt6 CMake qml文件启动方式说明

在Qt6之后,Qt程序默认使用CMake进行构建,当然也可以使用qmake, 本篇博客介绍Qt6.8之前和Qt6.8版本中QtQuick程序的启动方式。 在QtQuick程序main.cpp里qml的文件启动分为两种:(1)直接加载qml文件,(2)加载qml模块,下面分别介绍这两种启动方式。 方式1:直接启动qml文…

字符串 “asdasjkfkasgfgshaahsfaf” 经过哈夫曼编码之后存储比特数是多少?

要计算字符串 “asdasjkfkasgfgshaahsfaf” 经过哈夫曼编码后的存储比特数&#xff0c;需按以下步骤进行&#xff1a;步骤 1&#xff1a;统计字符出现频率先统计字符串中每个字符的出现次数&#xff1a;a&#xff1a;出现 6 次s&#xff1a;出现 6 次d&#xff1a;出现 1 次j&a…

什么是游戏盾(高防版)?

随着网络游戏产业的快速发展&#xff0c;游戏服务器的安全问题日益受到关注。DDoS攻击、CC攻击等网络威胁常常导致游戏卡顿、断线甚至服务器宕机&#xff0c;严重影响玩家体验。游戏盾&#xff08;高防版&#xff09;是一种专为游戏业务设计的网络安全防护服务&#xff0c;集成…

openGauss数据库在CentOS 7 中的单机部署与配置

部署 版本选择 通过openGuass官网下载地址 &#xff0c;我们可以看到它支持x86_64与Aarch64两种平台&#xff0c;又分成openEuler 22、openEuler 20、Centos 7以及Docker 版本。 进入CentOS 7标签&#xff0c;看到又分成企业版、轻量版、极简版与分布式镜像版。 本文只讨论…

HTTP响应状态码详解

HTTP 响应状态码&#xff08;HTTP Status Code&#xff09;是服务器在响应客户端请求时返回的 3 位数字代码&#xff0c;用于表示请求的处理状态。以下是常见的 HTTP 状态码及其含义&#xff1a; 1xx&#xff08;信息性状态码&#xff09; 表示请求已被接收&#xff0c;需要继…

Pytorch中register_buffer和torch.nn.Parameter的异同

说下register_buffer和Parameter的异同 相同点方面描述追踪都会被加入 state_dict&#xff08;模型保存时会保存下来&#xff09;。与 Module 的绑定都会随着模型移动到 cuda / cpu / float() 等而自动迁移。都是 nn.Module 的一部分都可以通过模块属性访问&#xff0c;如 self…

吉吉巳资源整站源码完整打包,适用于搭建资源聚合/整合类站点,全网独家,拿来就用

想要搭建一个资源整合站点&#xff0c;如影视聚合类站点、资讯聚合类站点、图集聚合类站点等&#xff0c;需要花费大量的时间来查找合适的系统或源码。然后要去测试&#xff0c;修复bug&#xff0c;一直到能够正常的运营使用&#xff0c;花费的时间绝对不短&#xff0c;今天分享…

嵌入式学习的第三十五天-进程间通信-HTTP

TCP/IP协议模型&#xff1a;应用层&#xff1a;HTTP;传输层&#xff1a;TCP UDP;网络层&#xff1a;IPv4 IPv6网络接口层一、HTTP协议1. 万维网WWW(World Wide Web) 世界范围内的&#xff0c;联机式的信息储藏所。 万维网解决了获取互联网上的数据时需要解决的以下问题&#x…

es 和 lucene 的区别

1. Lucene 是“发动机”&#xff0c;ES 是“整车”Lucene&#xff1a;只是一个 Java 库&#xff0c;提供倒排索引、分词、打分等底层能力。你必须自己写代码处理索引创建、更新、删除、分片、分布式、故障恢复、API 封装等所有逻辑。Elasticsearch&#xff1a;基于 Lucene 的分…

AS32S601 系列 MCU芯片GPIO Sink/Source 能力测试方法

一、引言随着电子技术的飞速发展&#xff0c;微控制器&#xff08;MCU&#xff09;在工业控制、汽车电子、商业航天等众多领域得到了广泛应用。国科安芯推出的AS32S601 系列 MCU 以其卓越的性能和可靠性&#xff0c;成为了众多设计工程师的首选之一。为了确保其在实际应用中的稳…

JAVA-08(2025.07.24学习记录)

面向对象类package com.mm;public class Person {/*** 名词-属性*/String name;int age;double height;/*** 动词-方法*/public void sleep(String add) {System.out.println("我在" add "睡觉");}public String introduce() {return "我的名字是&q…

地下隧道管廊结构健康监测系统 测点的布设及设备选型

隧道监测背景 隧道所处地下环境复杂&#xff0c;在施工过程中会面临围堰变形、拱顶沉降、净空收敛、初衬应力变化、土体塌方等多种危险情况。在隧道营运过程中&#xff0c;也会受到材料退化、地震、人为破坏等因素影响&#xff0c;引发隧道主体结构的劣化和损坏&#xff0c;若不…

node.js卸载与安装超详细教程

文章目录一、卸载Step1&#xff1a;通过控制面板删除node版本Step2&#xff1a;删除node的安装目录Step3&#xff1a;查找.npmrc文件是否存在&#xff0c;有就删除。Step4&#xff1a;查看以下文件是否存在&#xff0c;有就删除Step5&#xff1a;打开系统设置&#xff0c;检查系…

飞算JavaAI“删除接口信息” 功能:3 步清理冗余接口,让管理效率翻倍

在飞算JavaAI的接口设计与管理流程中&#xff0c;“删除接口信息” 功能为用户提供了灵活调整接口方案的便利。该功能的存在&#xff0c;让用户能够在接口生命周期的前期&#xff08;审核阶段&#xff09;及时清理无需创建的接口&#xff0c;保证接口管理的简洁性与高效性。一、…

行业热点丨SimLab解决方案如何高效应对3D IC多物理场与ECAD建模挑战?

半导体行业正快速超越传统2D封装技术&#xff0c;积极采用 3D集成电路&#xff08;3D ICs&#xff09;和2.5D 先进封装等方案。这些技术通过异构芯粒、硅中介层和复杂多层布线实现更高性能与集成度。然而&#xff0c;由于电子计算机辅助设计&#xff08;ECAD&#xff09;数据规…

2025暑期—05神经网络-BP网络

按误差反向传播(简称误差反传)训练的多层前馈网络线性回归或者分类不需要使用神经元&#xff0c;原有最小二程即可。求解J依次变小。使用泰勒展开&#xff0c;只看第一阶。偏导是确定的&#xff0c;需要让J小于0的delta WkWk构造完成后 J&#xff08;Wk1&#xff09;已知&#…

qml的信号槽机制

qml的信号槽机制和qtwidget差不多&#xff0c;但是使用方法不一样&#xff0c;qtwidget一般直接用connect函数把信号和槽一绑定就完事了&#xff0c;qml分为自动绑定和手动绑定。信号自动绑定在一个组件里面定义一个信号&#xff0c;用signal定义&#xff0c;当事件触发&#x…

Unity国际版下载链接分享(非c1国内版)

转载Unity国际版下载链接分享&#xff08;非c1国内版&#xff09; - 哔哩哔哩 大家平时使用Unity注意一下会发现&#xff0c;现在我们下载的Unity版本号后面都一个c1&#xff0c;但是大家在B站学习时大神UP主们使用的Unity版本号大都是没有c1的。 例如&#xff1a;我在用的是…

第4章唯一ID生成器——4.1 分布式唯一ID

在复杂的系统中&#xff0c;每个业务实体都需要使用ID做唯一标识&#xff0c;以方便进行数据操作。例如&#xff0c;每个用户都有唯一的用户ID&#xff0c;每条内容都有唯一的内容ID&#xff0c;甚至每条内容下的每条评论都有唯一的评论ID。 4.1.1 全局唯一与UUID 在互联网还未…

图论水题日记

cf1805D 题意 给定一棵树&#xff0c;规定dis(u,v)≥kdis(u,v) \geq kdis(u,v)≥k时(u,v)(u,v)(u,v)之间存在一条无向边&#xff0c;求k(1,2,...n)k(1,2,...n)k(1,2,...n)时图中的连通块个数 思路 前置知识&#xff1a;树上一点到其最远的点一定是树直径的两个端点之一若一个点…