当前位置: 首页 > news >正文

goframe开发一个企业网站 前端界面 拆分界面7

将页面拆出几个公用部分

在resource/template/front创建meta.html header.html footer.html

meta.html

<head><meta charset="utf-8"><meta content="width=device-width, initial-scale=1.0" name="viewport"><title>{{.configs}}   {{.configs.title}}|{{.configs.webname}}</title><meta name="keywords" content="{{.configs.keywords}}"><meta name="description" content="{{.configs.description}}"><!-- Favicons --><!-- Google Fonts --><link href="/resource/front/static/css/css2_swap.css" rel="stylesheet"><link rel="preconnect" href="https://fonts.googleapis.com/"><link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin=""><link href="/resource/front/static/css/css2-Comfortaawght700_swap.css" rel="stylesheet"><link href="/resource/front/static/css/css2-Poppinswght300400_swap.css" rel="stylesheet"><link href="/resource/front/static/css/css2-Poppinswght100200300400_swap.css" rel="stylesheet"><link href="/resource/front/static/css/css2-Robotoitalwght0100030004000500070009001900_swap.css" rel="stylesheet"><link href="/resource/front/static/css/css2-Playball_swap.css" rel="stylesheet"><!-- Vendor CSS Files --><link href="/resource/front/static/css/font-awesome.min.css" rel="stylesheet"><link href="/resource/front/static/css/bootstrap.min.css" rel="stylesheet"><link href="/resource/front/static/css/bootstrap-icons.css" rel="stylesheet"><link href="/resource/front/static/css/aos.css" rel="stylesheet"><link href="/resource/front/static/css/glightbox.min.css" rel="stylesheet"><link href="/resource/front/static/css/swiper-bundle.min.css" rel="stylesheet"><!-- Main CSS File --><link href="/resource/front/static/css/styles.css" rel="stylesheet">
</head>

header.html

<div id="preloader"></div>
<header id="header" class="single-page-header header d-flex align-items-center"><div class="container container-xl d-flex align-items-center justify-content-between"><a href="" class="logo d-flex align-items-center"><h1><span></span><span>{{.configs.webname}}</span></h1></a><nav id="navbar" class="navbar"><ul><li><a href="/">首页</a></li><li><a href="/service">服务</a></li><li class="dropdown"><a href="#"><span>项目</span><i class="bi bi-chevron-down dropdown-indicator"></i></a><ul><li><a href="/projects">Projects</a></li><li><a href="/project-details">Project Details</a></li></ul></li><li><a href="/about">关于</a></li><li><a href="/price">价格</a></li><li><a href="/testimonials">客户评价</a></li><li class="dropdown"><a href="#"><span>用户</span> <i class="bi bi-chevron-down dropdown-indicator"></i></a><ul><li><a href="/login">登陆</a></li><li><a href="/register">注册</a></li><li><a href="/faq">常见问题</a></li><li><a href="/team">团队</a></li><li><a href="/coming-soon">Coming Soon</a></li><li><a href="/terms">服务条款</a></li><li><a href="/policy">隐私条款</a></li><li><a href="/sample">Sample Page</a></li></ul></li><li><a href="/blogs">新闻</a></li><li><a href="/contact" class="main-button">联系我们</a></li></ul></nav><!-- navbar--><i class="mobile-nav-toggle mobile-nav-show bi bi-list"></i><i class="mobile-nav-toggle mobile-nav-hide d-none bi bi-x"></i></div>
</header><!-- End Header -->

footer.html


<!-- Footer -->
<footer id="footer" class="main-footer"><div class="container"><div class="footer-content"><div class="row"><div class="col-lg-4 col-md-6 col-sm-12 footer-column"><div class="logo-widget footer-widget"><a href="" class="logo d-flex align-items-center"><h1><span>{{.configs.webname}}</span></h1></a><div class="text"><p>Lorem ipsum dolor amet consectetur adi pisicing elit sed eiusm tempor incididunt ut labore dolore magna aliqua enim ad minim veniam quis.nostrud exercita.laboris nisi ut aliquip ea commodo conse quatuis aute irure.</p></div><ul class="footer-social"><li><a href="#"><i class="fa fa-facebook"></i></a></li><li><a href="#"><i class="fa fa-twitter"></i></a></li><li><a href="#"><i class="fa fa-google"></i></a></li></ul></div></div><div class="col-lg-3 col-md-6 col-sm-12 offset-lg-2 footer-column"><div class="service-widget footer-widget"><div class="footer-title">Services</div><ul class="list"><li><a href="#">Web Design</a></li><li><a href="#">App Developemnt</a></li><li><a href="#">Cloud Services</a></li><li><a href="#">Domain adn Hosting</a></li><li><a href="#">Seo Optimization</a></li><li><a href="#">Social Media</a></li></ul></div></div><div class="col-lg-3 col-md-6 col-sm-12 footer-column"><div class="contact-widget footer-widget"><div class="footer-title">Contacts</div><div class="text"><p>{{.configs.province}}</p><p>{{.configs.address}}</p><p>{{.configs.phone}}</p><p>{{.configs.email}}</p></div></div></div></div></div></div>
</footer>
<!-- main-footer end -->
<div class="footer-bottom"><div class="container"><div class="row"><div class="col-lg-6 col-md-6 col-sm-12 column"><div class="copyright">Copyright &copy; 2024.{{.configs.companyname}} All rights reserved.</div></div><div class="col-lg-6 col-md-6 col-sm-12 column"><ul class="footer-nav"><li><a href="#">Terms of Service</a></li><li><a href="#">Privacy Policy</a></li></ul></div></div></div>
</div>
<!-- End Footer -->

这样修改不用每页都去改写相关的部分。公用部分减少了代码编写的繁杂。
在这里插入图片描述

将前端公用的数据写入到redis

好的,我来帮您组织这个完整的配置中间件实现。

  1. 首先创建 internal/logic/config/config.go:
package configimport ("context""github.com/gogf/gf/v2/frame/g"
)type sConfig struct{}var Service = new(sConfig)// GetConfigs 获取所有配置
func (s *sConfig) GetConfigs(ctx context.Context) (g.Map, error) {// 从Redis获取配置configs, err := g.Redis().Do(ctx, "HGETALL", "web_config")if err != nil {return nil, err}// 如果Redis中没有数据,从数据库获取并存入Redisif configs.IsEmpty() {return s.syncConfigsToRedis(ctx)}return configs.Map(), nil
}// syncConfigsToRedis 同步配置到Redis
func (s *sConfig) syncConfigsToRedis(ctx context.Context) (g.Map, error) {// 从数据库获取配置var configs g.Maperr := g.DB().Model("web_config").Scan(&configs)if err != nil {return nil, err}// 存入Redisif len(configs) > 0 {_, err = g.Redis().Do(ctx, "HMSET", "web_config", configs)if err != nil {return nil, err}// 设置过期时间(例如24小时)_, err = g.Redis().Do(ctx, "EXPIRE", "web_config", 24*3600)if err != nil {return nil, err}}return configs, nil
}
  1. 创建 internal/middleware/config.go:
package middlewareimport ("web/internal/logic/config""github.com/gogf/gf/v2/frame/g""github.com/gogf/gf/v2/net/ghttp"
)func Config(r *ghttp.Request) {ctx := r.GetCtx()configs, err := config.Service.GetConfigs(ctx)if err != nil {r.Response.WriteJson(g.Map{"code": -1,"message": err.Error(),})return}// 将配置存储到请求中,供后续使用r.SetCtxVar("configs", configs)r.Middleware.Next()
}
  1. cmd/cmd.go 中注册中间件:
package cmdimport ("web/internal/middleware""github.com/gogf/gf/v2/frame/g""github.com/gogf/gf/v2/net/ghttp"
)func initRouter() {s := g.Server()// 注册全局中间件s.Use(middleware.Config)// ... 其他路由配置 ...
}
  1. 在控制器中使用配置:
package frontimport ("github.com/gogf/gf/v2/frame/g""github.com/gogf/gf/v2/container/gvar"
)type Controller struct{}func (c *Controller) getConfigs(ctx g.Ctx) g.Map {configs := g.RequestFromCtx(ctx).GetCtxVar("configs")return configs.Map()
}

功能说明:

  1. 配置服务层 (logic/config)

    • 提供配置获取的核心逻辑
    • 实现 Redis 缓存机制
    • 当 Redis 无数据时自动从数据库同步
    • 支持配置的自动更新
  2. 中间件 (middleware/config)

    • 在每个请求开始时加载配置
    • 将配置信息注入到请求上下文
    • 处理错误情况并返回适当的响应
  3. 路由注册 (cmd/cmd.go)

    • 全局注册配置中间件
    • 确保所有请求都能访问配置信息

使用方式:

  1. 在模板中使用:
<title>{{.configs.title}}</title>
<meta name="keywords" content="{{.configs.keywords}}">
  1. 在控制器中使用:
configs := g.RequestFromCtx(ctx).GetCtxVar("configs").Map()
title := configs["title"]

注意事项:

  1. 确保 Redis 配置正确
  2. 数据库中需要有对应的 web_config 表
  3. 建议添加配置更新接口,更新后清除 Redis 缓存
  4. 可以根据需要调整 Redis 缓存时间

这样的设计可以:

  • 减少数据库访问压力
  • 提高配置访问速度
  • 保持配置的一致性
  • 方便在整个应用中使用配置

相关文章:

goframe开发一个企业网站 前端界面 拆分界面7

将页面拆出几个公用部分 在resource/template/front创建meta.html header.html footer.html meta.html <head><meta charset"utf-8"><meta content"widthdevice-width, initial-scale1.0" name"viewport"><title>{{.…...

Postman断言与依赖接口测试详解!

在接口测试中&#xff0c;断言是不可或缺的一环。它不仅能够自动判断业务逻辑的正确性&#xff0c;还能确保接口的实际功能实现符合预期。Postman作为一款强大的接口测试工具&#xff0c;不仅支持发送HTTP请求和接收响应&#xff0c;还提供了丰富的断言功能&#xff0c;帮助测试…...

github打不开网络问题

当打开github出现超时或者网络不能访问的情况时&#xff0c;我们进行如下方法解决&#xff1a; 1&#xff0c;ping gitbub.com查看域名分析的DNS IP C:\Users\86156>ping github.com 正在 Ping github.com [20.205.243.166] 具有 32 字节的数据: 来自 20.205.243.166 的回复…...

智能教育工具:基于SpringBoot的在线试题库

1 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让时间变得更加地宝贵化&#xff0c;因为每天的…...

typescript 如何跳过ts类型检查?

文章目录 前言any类型条件判断进行使用断言加注释跳过ts检查 前言 typescript 的使用&#xff0c;虽然让代码更加规范&#xff0c;利于维护&#xff0c;但也给开发带来很多麻烦。为了跳过很多ts的类型检查&#xff0c;大家也是费尽心思&#xff0c;下面就介绍一些常用的方式&a…...

详解ReentrantLock--三种加锁方式

目录 介绍AQS: 直观方式解释加锁的流程&#xff1a; Node是什么&#xff1a;它里面有什么属性呢 图解队列的排队过程&#xff1a; 源码分析三种加锁流程&#xff1a; 我们先讲解一下非公平锁的加锁流程&#xff1a; Lock()方式加锁&#xff1a; 在源码里对于Lock()的解…...

SQL 基础语法(一)

文章目录 1. SQL 分类2. 数据库操作3. 数据表操作4. 增删改操作5. 查询操作6. 用户管理7. 权限控制 1. SQL 分类 2. 数据库操作 #创建数据库 create database if not exists test;#查询所有数据库 show databases;#查询当前数据库 select database();#删除数据库 drop databas…...

Python酷库之旅-第三方库Pandas(190)

目录 一、用法精讲 881、pandas.Index.is_方法 881-1、语法 881-2、参数 881-3、功能 881-4、返回值 881-5、说明 881-6、用法 881-6-1、数据准备 881-6-2、代码示例 881-6-3、结果输出 882、pandas.Index.min方法 882-1、语法 882-2、参数 882-3、功能 882-4、…...

Spring学习笔记_19——@PostConstruct @PreDestroy

PostConstruct && PreDestroy 1. 介绍 PostConstruct注解与PreDestroy注解都是JSR250规范中提供的注解。 PostConstruct注解标注的方法可以在创建Bean后在为属性赋值后&#xff0c;初始化Bean之前执行。 PreDestroy注解标注的方法可以在Bean销毁之前执行。 2. 依赖…...

《云计算网络技术与应用》实训8-1:OpenvSwitch简单配置练习

1.按《云计算网络技术与应用》实训5-1进行环境配置&#xff0c;安装好OVS 2.开启OVS虚拟交换机 3.创建一个网桥br0 4.查看网桥列表 5.把ens34网卡连接到网桥br0上 6. 查看网桥br0所有端口 7.列出网卡ens34连接的所有网桥列表 8.查看OVS网络状态 9.将网桥br0上连接的网卡ens34删…...

【架构艺术】服务架构稳定性的基础保障

一个产品随着不断研发&#xff0c;其服务架构的复杂度会越来越高。随着产品的用户体量变大&#xff0c;为了保证产品能够长线运营&#xff0c;就需要保证整个服务架构的稳定性。因此&#xff0c;今天这篇文章&#xff0c;就从实操的角度&#xff0c;粗浅讨论一下&#xff0c;服…...

Python中使用pip换源的详细指南

在Python开发过程中&#xff0c;我们经常需要安装各种第三方库。pip是Python的包管理工具&#xff0c;用于安装和管理Python库。然而&#xff0c;由于网络原因&#xff0c;有时访问默认的Python包索引&#xff08;PyPI&#xff09;可能会比较慢。这时&#xff0c;我们可以通过更…...

一站打包国际智慧教育自主学练软件资源

&#x1f451;&#x1f31f;一站打包国际智慧教育自主学练软件与资源平台&#xff0c;欧美学校正在使用&#xff0c;不出国就可以学&#x1f452;&#x1f388; &#x1f49b; 多元学练&#xff1a;我们正在使用的自主学练软件是美国学校一线教师使用的&#xff0c;涵盖了英语…...

用股票API获取高频行情数据来实现数据分析和量化

用股市API获取高频行情来实现数据分析和量化 使用股市API是一种有效的方式来获取高频行情数据&#xff0c;以便进行行情数据分析和量化交易。Python是一种广泛应用于金融数据领域的编程语言&#xff0c;它提供了丰富的库和工具&#xff0c;可用于与股市API进行交互。通过调用股…...

C++ | Leetcode C++题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; class Solution { public:int countArrangement(int n) {vector<int> f(1 << n);f[0] 1;for (int mask 1; mask < (1 << n); mask) {int num __builtin_popcount(mask);for (int i 0; i < n; i) {if (mask &am…...

【RabbitMQ】01-RabbitMQ

1. MQ MQ可以有更好的并发性。 2. 安装 docker run \-e RABBITMQ_DEFAULT_USERitheima \-e RABBITMQ_DEFAULT_PASS123321 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network hm-net\-d \rabbitmq:3.8-management3. 结构 4. 数据…...

使用 ADB 在某个特定时间点点击 Android 设备上的某个按钮

前提条件 安装 ADB&#xff1a;确保你已经在计算机上安装了 Android SDK&#xff08;或单独的 ADB&#xff09;。并将其添加到系统环境变量中&#xff0c;以便你可以在命令行中运行 adb。 USB调试&#xff1a;确保 Android 设备已启用 USB 调试模式。这可以在设备的“设置” -…...

【随笔】对于开发者而言,你对什么事情感到失落?亦或者你上一次感到有成就感是什么时候?你遇到过怎样格局的老板?

这是博主的一篇随笔文章&#xff0c;一起和大家聊聊工作上的一些事和一些感受&#xff0c;我觉得我们这个群体&#xff0c;同样有很多优秀的、幽默的人。只不过有些表达和沟通并不是我们擅长的&#xff0c;包括博主也是&#xff0c;这是我们的劣势和缺点。没关系&#xff0c;这…...

【LeetCode】两数之和返回两数下标、数组形式整数相加

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO 1.两数之和返回两数下标 题目&#xff1a;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输…...

Kubernetes中的secrets存储

华子目录 2.secrets2.1secrets功能介绍2.2secrets的创建2.2.1从文件创建2.2.2编写yaml文件 2.3secret的使用案例2.3.1将secret挂载到volume中2.3.2设置子目录映射secret密钥2.3.3将secret设置为环境变量2.3.4存储docker register的认证信息spec.imagePullSecrets[] 2.secrets …...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...

[特殊字符] Spring Boot底层原理深度解析与高级面试题精析

一、Spring Boot底层原理详解 Spring Boot的核心设计哲学是约定优于配置和自动装配&#xff0c;通过简化传统Spring应用的初始化和配置流程&#xff0c;显著提升开发效率。其底层原理可拆解为以下核心机制&#xff1a; 自动装配&#xff08;Auto-Configuration&#xff09; 核…...