首页 > 所有文章 > 行业 >文章详情

mvc ip 获取(本地ip)

时间:2024-02-13 10:48:38 浏览量:319

以下文章来源于非正式解决方案 ,作者winlion

非正式解决方案

思考链接价值,非正式解决方案,既扯高大上如人工智能、大数据,也关注码农日常如分布式、java和golang,每天分享瞎想的东西。

目录结构说明如下

名称内容model模型层目录,类比Java 中的entityview视图层,存放所有templete模板ctrl控制器层, 存放全部控制器service服务层,类比Java里面的servicehtml一些静态资源页面util核心工具包,Md5加密,返回数据封装等asset静态资源目录,存放js/css/image等args封装全部请求参数对象mnt上传文件的存放目录app.dev.conf开发环境配置文件app.prod.conf生产环境配置文件start.sh/start.bat启动脚本build.sh/build.bat打包脚本main.go主应用程序文件

主程序主要做各种初始化工作

使用配置文件开发包,如github.com/Unknwon/goconfig 包。

调用案列

使用github.com/fsnotify/fsnotify包,装时候注意,一个函数里面如果有参数共享,应该放到一个携程里。

fsnotify 支持很多种事件监听,一般在 Write 事件刷新配置文件

系统级配置参数 假设修改了会影响整个应用,需要另起服务的我们称之为系统级配置,修改了参数,往需要进行相应的操作。如修改了数据库连接地址,需要重置数据库连接操作。修改了应用服务器端口,则需要重启应用服务。

用户级配置参数 如微信公众号 appsecret,每次调用的时候会从配置中获取,因此只需要重新加载数据即可。

需要将配置文件内容缓存到 map 中。 需要考虑到 map 的并发操作。

在如上代码中,常用角色变量 ROLE_USER和ROLE_ADMIN 定义在同一个文件中,便于阅读。

实体和表结构对应,一定要定义 Form 和 Json tag。这样可以提高系统适用性,为什么呢?因为可以适配前端以各种 Content-Type 提交数据如。后端统一用该实体接收数据即可。

约定统一使用驼峰式或者下划线标记。如下,建议使用驼峰式。

如下几点需要注意

关联便于代码管理和阅读。模板位置 /view/demo/index.html,模板内容如下。

外部调用方法如下,大家能很自然知道模板文件位置。

主要是为了程序员生活更美好(早点下班 偷懒)。

外部调用方法如下,大家能很自然知道模板文件位置。

为什么要添加调试模式支持?因为调试模式状态下,我们修改来了页面模板,需要立即看到页面内容,而不需要重启应用。核心代码如下,即在调试模式状态下,每次请求都重新解析模板。

由上可见,调试模式效率是非常低的,我们不应该在生产环境采用调试模式。

应用场景是在每个页面中都需要使用 session 中的用户 ID 数据。方法是在 RegisterPage 函数内部模板templete.ExecuteTemplate(w, tplname, nil)处秀修改成如下代码

前端模板调用代码如下

返回结果

在 RegisterPage 方法内定义一个 funMap

main.go 中初始化

前端模板调用代码如下

返回结果

主要使用场景是分角色菜单,用户

其他页面统一调用,进行角色菜单等控制。

控制器层主要处理对外接口

所有参数都需要可预期在一个结构体里面。这样整个系统编程将变得非常简单。在上 面函数中,通过如下代码实现参数绑定

其中 args.AuthArg 对象定义如下

args 作用是存放一切请求参数。每个业务都建议定义一个 arg。每个 arg 都有一个公共属性 PageArg。PageArg 定义如下

大体结构如下

以 BindJson 为例子

可能大家更关心 BindForm,篇幅太长,大家可以移步

一般封装一个底层 JSON,然后根据返回成功或失败响应对应的 code

以订单管理为例

一般需要构建如下几类函数,具体随业务而定

名称内容Create添加Update修改Search搜索,返回列表Find返回某一个对象Delete删除buildCond构建条件函数Count符合某一条件的记录数目

我们可以用类似于如下函数来统一管理查询条件,该函数输出参数,输出一个 session。

条件规范化可以让应用更灵活,让业务更清晰。如果不规范,楼主曾经经历的教训可能也会撞上你。

数据库建议使用 xorm。 在 server 包目录下新建 init.go 在其中实现数据库的初始化

main.go 中初始化数据库

具体使用可以参考 Xorm

在每一个 ctrl 中都定义一个 Router 函数

这些函数调用了 Router 方法,该方法本质上是对 http.HanderFunc 的封装

定义路由注册函数

注册路由 在 main.go 中完成路由注册

解决思路如下 首先在 ctrl/base.go 里面定义一个 map

接着定义路由绑定函数

首先需要定义默认路由。RegisterRegExRouter() 中定义了默认路由 http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request)。任何找不到的路由都会进入这个。

在路由注册中初始化

现在我们可以在控制器页面通过 RegExRouter 添加正则路由啦

客户端请求

响应数据

在如上所示中定义了 notfound 函数,当没有任何一个匹配对象时候,进入这个函数。

我们可以在 Router 方法里面实现拦截器功能,主要用来做鉴权,日志记录等

我主要在 Router 函数上下功夫,一种可用的设计是利用携程,如下

需要注意的是要先把数据 copy 出来,然后才能利用携程,否则 fun 函数里面取出的数据是空的。

session、日志,可以引用第三方包。 鉴权可以参考拦截器。 安全,防 xss 攻击可以参考拦截器。 代码获取在公众号回复:golang框架