2024年10月


title: Nuxt.js 应用中的 app:resolve 事件钩子详解
date: 2024/10/17
updated: 2024/10/17
author:
cmdragon

excerpt:
app:resolve 是 Nuxt.js 中的生命周期钩子,在解析 app 实例后调用。这个钩子允许开发者在应用完全初始化后执行一些自定义操作,比如注册插件、设置中间件或进行其他必要配置。

categories:

  • 前端开发

tags:

  • Nuxt
  • 钩子
  • app
  • resolve
  • 生命周期
  • 中间件
  • 插件


image
image

扫描
二维码
关注或者微信搜一搜:
编程智域 前端至全栈交流与成长

app:resolve
是 Nuxt.js 中的生命周期钩子,在解析 app 实例后调用。这个钩子允许开发者在应用完全初始化后执行一些自定义操作,比如注册插件、设置中间件或进行其他必要配置。


目录

  1. 概述
  2. app:resolve 钩子的详细说明
  3. 具体使用示例
  4. 应用场景
  5. 注意事项
  6. 关键要点
  7. 总结


1. 概述

app:resolve
钩子在应用的 app 实例解析完成后调用,它为开发者提供了一个良好的机会来配置或修改应用实例。这使开发者可以在不影响应用启动的情况下实现丰富的功能。

2. app:resolve 钩子的详细说明

2.1 钩子的定义与作用

  • 定义
    :
    app:resolve
    是 Nuxt.js 生命周期的一部分,用于在 app 实例完成解析后触发。
  • 作用
    : 允许开发者在应用的上下文中执行特定操作,如插件注册、全局中间件设置等。

2.2 调用时机

  • 执行环境
    : 该钩子只在客户端和服务器都可以执行的环境中触发。
  • 挂载时机
    : 当 Nuxt 应用已完成初始化,并准备加载页面或其他资源时,
    app:resolve
    钩子会被调用。

2.3 返回值与异常处理

  • 返回值: 该钩子并不返回任何值。
  • 异常处理: 在钩子中发生的任何异常应被捕获并适当处理,以防影响应用的正常运行。

3. 具体使用示例

3.1 基础用法示例

以下示例展示了如何在
app:resolve
钩子中注册全局中间件:

// plugins/appResolvePlugin.js
export default defineNuxtPlugin((nuxtApp) => {
    nuxtApp.hooks('app:resolve', () => {
        console.log('App instance has been resolved.');

        // 注册一个全局中间件
        nuxtApp.middleware.add('customMiddleware', (context) => {
            console.log('Custom middleware executed.');
        });
    });
});

在这个示例中,当 app 实例解析完成后,会输出一条日志并注册一个自定义的中间件。

3.2 与其他钩子结合使用

app:resolve
可以与其他钩子结合使用,以增强其功能:

// plugins/appResolvePlugin.js
export default defineNuxtPlugin((nuxtApp) => {
    nuxtApp.hooks('app:setup', () => {
        console.log('Setting up the app...');
    });

    nuxtApp.hooks('app:resolve', () => {
        console.log('App instance resolved. Ready to add additional plugins or settings.');

        // 更多初始化设置
        initializePlugins();
    });
});

在此示例中,我们在 app 设置完成后输出一条日志,并在 app 解析完成后执行更多的初始化逻辑。

4. 应用场景

  1. 注册全局中间件
    : 在 app 实例解析完成后设置全局中间件。
  2. 添加插件
    : 动态添加或配置第三方插件或库。
  3. 执行初始化逻辑
    : 在完成应用设置后执行其他的初始化任务。

5. 注意事项

  • 顺序依赖
    : 确保在钩子中执行的操作不依赖未初始化的状态或资源。
  • 安全性
    : 注意参数和环境的安全性,避免在钩子中执行潜在的危险操作。
  • 性能
    : 尽量避免在钩子中执行复杂或耗时的计算。

6. 关键要点

  • app:resolve
    钩子是在 app 实例解析之后调用的,允许开发者进行最后的配置。
  • 合理使用该钩子可以增强应用的灵活性和可扩展性。
  • 该钩子可与其他钩子结合使用,以实现更丰富的功能。

7. 总结

app:resolve
钩子为 Nuxt.js 应用提供了一个在 app 实例解析后执行自定义操作的良好机会。通过使用此钩子,开发者可以更灵活地管理应用的生命周期和配置。

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:
编程智域 前端至全栈交流与成长
,阅读完整的文章:
Nuxt.js 应用中的 app:resolve 事件钩子详解 | cmdragon's Blog

往期文章归档:

1.简介

上一篇宏哥已经讲解和分享了如何通过引入jar包来搭建Java+Playwright自动化测试环境,这一种是比较老的方法,说白了就是过时的老古董,但是我们必须了解和知道,其实maven搭建无非也就是下载引入相关的jar包,只不过相比之下是简单方便了,了解其本质可以帮助我们更好的学习maven搭建环境。今天宏哥就来讲解和分享一下,如何通过引入maven来搭建Java+Playwright自动化测试环境。

Apache Maven
是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。由于现在企业和公司中Java的大部分项目都是基于Maven, 而且也是比较流行、方便、简单的一种方式。因此宏哥为了照顾到企业或者公司用的java项目中用到maven的童鞋或者小伙伴们,这里也简单的介绍和分享一下。在Maven项目中使用Playwright非常简单。废话不多说,直接进入今天的主题。

2.在eclipse中搭建maven

2.1安装maven

1.下载maven的bin,在apache官方网站可以下载。在Files下面下载对应的maven版本(官网的是最新版本),如下图所示:

2.查看maven对应的JDK版本,如下图所示:

3.进入maven对应的JDK版本,网址:http://maven.apache.org/docs/history.html。如下图所示:

4.下载的apache-maven-3.8.1.zip不需要安装,只需解压即可,将apache-maven-3.8.1解压到E盘根目录下,放在你本地电脑磁盘空间比较充足的磁盘,宏哥放在E盘,并解压,如下图所示:

2.2配置maven环境变量

1.设置三个环境变量,我的电脑>选择“属性”->“高级系统设置”->“环境变量”->“系统变量”->“新建”

MAVEN_HOME : C:\apache-maven-3.3.9
MAVEN : %MAVEN_HOME%\bin
MAVEN_OPTS : -Xms256m -Xmx512m

如下图所示:

2.在path最前面加上: %MAVEN%; 。要特别注意这里的分号,其实环境变量配置和JDK的差不多。

2.3验证maven是否安装成功

1.Cmd->mvn -version,成功则出现以下界面,如下图所示:

3.maven配置仓库

maven的仓库可以分为三种,如下图所示:

3.1配置本地仓库

1.建立手动仓库maven_repository,宏哥建立在F盘,如下图所示:

2.给Maven添加本地仓库:

作用:构建Maven项目时,首先会从本地库查找资源,如果本地库没有,Maven就会从远程库下载资源到本地库,下次使用的时候就不用再去远程库下载了。

localRepository节点用于配置本地仓库,本地仓库其实起到了一个缓存的作用,它的默认地址是 C:\Users\用户名.m2。
当我们从maven中获取jar包的时候,maven首先会在本地仓库中查找,如果本地仓库有则返回;如果没有则从远程仓库中获取包,并在本地库中保存。此外,我们在maven项目中运行mvn install,项目将会自动打包并安装到本地仓库中。

在Maven的安装路径中的conf文件夹中配置settings.xml:
在文中找到localRepository注释行,localRepository节点默认是被注释掉的,需要把它移到注释之外,然后将localRepository节点的值改为我们在上边创建的仓库的目录并添加如下:

<localRepository>F:\maven_repository</localRepository>  

3.2配置私服

给Maven配置mirror:mirror就是镜像, 主要提供一个方便地切换远程仓库地址的途径。在Maven的安装路径中的conf文件夹中配置settings.xml:在文中找到<mirrors>行并在其中添加如下:

<mirror>
     <id>nexus-aliyun</id>
     <mirrorOf>*</mirrorOf>
     <name>Nexus aliyun</name>
     <url>http://maven.aliyun.com/nexus/content/groups/public</url>
 </mirror>

注: 千万注意, 只可配置一个(另一个要注释!) 不然两个可能发生冲突 ,导致jar包下不下来 !!!

mirror相当于拦截器,将对远程仓库的请求重定向到mirror指定的地址,如上面的代码将对central的请求重定向到http://maven.aliyun.com/nexus/content/groups/public/。

4.在eclipse中安装maven插件

1.打开Eclipse,进入help -- >Install New Software...点Add按钮输入:

Name:m2e
location:http://download.eclipse.org/technology/m2e/releases

如下图所示:

2.点击“OK”后,等相关应用下载好以后,选中点击“next”,如下图所示:

3.点击next直到安装完成。设置Maven插件所关联的Maven程序:选择Eclipse菜单栏的Window-->Preferences-->Maven--Installations菜单项, 点击add,如下图所示:

4.点击add,选择Maven的具体安装目录,如下图所示:

5.选择好目录,添加好maven的安装目录,如下图所示:

6.选中maven的安装目录,点击“OK”,如下图所示:

5.设置自定义的本地仓库

1.选择Eclipse菜单栏的Window-->Preferences-->Maven--UserSettings菜单项, 修改为我们自定义仓库位置下的settings.xml文件, 修改好后点击OK按钮。如下图所示:

6.查看是否maven设置成功

查看是否maven设置成功:file - new - other - maven ,出现maven project表示配置成功,如下图所示:

7.eclipse中新建maven项目

1.依次点击eclipse的file - new - other ,如下图所示:

2.在搜索框输入关键字“maven”,然后选中“maven project”,如下图所示:

3.选择创建后的工作区——项目存放的地址。如下图所示:

4.选择Maven项目的模板也叫项目类型(quikstart或者webapp等等),,如果选择create a simple project,则跳过了下面的步骤,也就不存在这个问题了,但是如果需要选择项目类型,则不能勾选create a simple project)如下图所示:

5.宏哥为了省事,直接选中create a simple project,点击next,输入Group Id和Artifact Id。如下图所示:

6.点击“Finish”,查看新建的maven项目,如下图所示:

到此,创建maven项目成功!!!

8.maven项目加载playwright依赖jar

8.1加载playwright依赖

maven项目加载playwright依赖就不想上一篇java项目加载playwright那么费事需要把jar包引入到项目下,maven项目只需要将相关的jar包依赖配置到pom.xml文件中就会自动加载了。因此要给上面创建的maven项目中加载playwright依赖jar包,只需在pom.xml中引入playwright的jar包即可;具体步骤如下:

1.查看maven仓库:
http://mvnrepository.com/
如下图所示:

2.搜索playwright, 输入playwright,点击“Search”,如下图所示:

3.点击“
Playwright Main Library
”,查看自己需要的playwright版本,playwright我们都会选择最新的(宏哥这里用1.40.0举例一下,最新可能有bug,老的可能有些方法不支持,宏哥这里选择一个不新也不旧的),如下图所示:

4.下载playwright-1.40.0版本,点1.40.0进入页面后,只需要单击下边的编码就自动全选复制了。如下图所示:

<!--https://mvnrepository.com/artifact/com.microsoft.playwright/playwright-->
<dependency>
    <groupId>com.microsoft.playwright</groupId>
    <artifactId>playwright</artifactId>
    <version>1.40.0</version>
</dependency>

5.copy到maven项目中的pom.xml中,如下图所示:

6.playwright的jar包maven会自动加载,从右边路径可以看到jar的路径在本地仓库。如下图所示:

需要其他的jar包只需配置到pom.xml中即可!是不是比之前介绍的方法简单多了哈!

8.2修改jdk版本

因为playwright的Java需要Java8以上,所以需要重新配置jdk。如下图所示:

1.右键JRE System Library[JavaSe-1.7] ->properties。如下图所示:

2.选择javaSE-1.8,如下图所示:

3.点击“OK”后,就变成JavaSE-1.8了,如下图所示:

好了,至此,基于maven的ava+Playwright自动化测试环境搭建就搭建成功了。

9.牛刀小试

上边已经介绍完环境的搭建,下边就仿照官方示例,写一个基本的入门代码看看环境是否搭建成功。

9.1代码设计

9.2参考代码

packagecom.bjhg.playwright;import com.microsoft.playwright.*;importjava.nio.file.Paths;/***@author北京-宏哥
*
* @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)
*
* 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-2-环境准备与搭建-基于Maven(详细教程)
*
* 2024年6月30日
*/ public classTest_Playwright {public static voidmain(String[] args) {try (Playwright playwright =Playwright.create()) {
Browser browser
=playwright.chromium().launch();
Page page
=browser.newPage();
page.navigate(
"https://www.baidu.com/");
page.screenshot(
new Page.ScreenshotOptions().setPath(Paths.get("example.png")));
System.out.println(page.title());
}
}

}

9.3运行代码

1.运行代码,右键Run AS,就可以看到控制台输出(会下载
Playwright
包并安装适用于
Chromium、Firefox

WebKit
的浏览器二进制文件,如果没有看到就是上一篇搭建已经下载了,需要删除文件,再次运行代码),如下图所示:

2.运行代码,控制台打印。如下图所示:

3.在代码根目录找到截图,如下图所示:

10.小结

1.必须先下载并安装JDK,配置JDK的环境变量JAVA_HOME,否则maven将无法使用。

2.eclipse安装maven插件后必须重新定位maven到本地maven目录。

3.宏哥带你看一下,是否将相关playwright的依赖下载到本地仓库(宏哥已经创建项目并运行了),如下图所示:

4.运行代码后,打开下载文件目录(下载
Playwright
包并安装适用于
Chromium、Firefox

WebKit
的浏览器二进制文件),如下图所示:

5.Eclipse开发工具创建的maven项目的左上角都有一个大写的蓝色M,如下图所示:

这一篇绝大多数主要就是关于maven的,后边关于playwright的很简单,有了上一篇的宏哥的各种填坑和基础,相信熟悉maven的小伙伴或者童鞋们应该就能快速的将环境搭建好了,而且结合上一篇和这一篇的相关知识,应该很快就理解学废了吧。

好了,今天就分享到这里!仅供大家学习和参考,今天时间不早了,又要和大家说再见了,感谢你耐心地听宏哥絮叨!!!

1. 使用 Beego 实现静态文件下载

Beego 是一个强大的 Go Web 框架,提供了处理静态文件的功能。通过简单的配置,我们可以将本地文件夹作为静态资源目录,并为用户提供下载链接。

1.1 配置静态文件路径

首先,在
main.go
中,我们使用
SetStaticPath
将本地的
staticfiles
目录映射为可以通过 URL 访问的静态资源路径。

packagemainimport("github.com/beego/beego/v2/server/web")funcmain() {//设置静态资源路径,映射 /staticfiles 到本地 ./staticfiles 文件夹
    web.SetStaticPath("/staticfiles", "./staticfiles")
web.Run()
}

通过这段代码,我们将本地的
./staticfiles
目录映射到
http://localhost:8080/staticfiles
,用户可以通过该 URL 直接访问文件。

2. 文件目录展示与下载功能

接下来,为了让用户能够方便地浏览文件目录并下载文件,我们需要实现一个控制器来展示指定目录下的文件列表,并生成对应的下载链接。

2.1 实现控制器

在 Beego 中,控制器负责处理路由请求。我们创建一个
FileController
,其中定义了
Get
方法来读取指定目录,并将文件列表传递给模板。

packagecontrollersimport("os"
    "github.com/beego/beego/v2/server/web")type FileController struct{
web.Controller
}
//@router /getfiles [get] func (c *FileController) Get() {//要展示的目录路径 dirPath := "./staticfiles" //读取目录内容 files, err :=os.ReadDir(dirPath)if err !=nil {
c.Data[
"error"] = "无法读取目录:" +err.Error()
c.TplName
= "error.tpl" return}//将文件列表传递给模板 c.Data["files"] =files
c.Data[
"directory"] =dirPath
c.TplName
= "directory.tpl"}

在上面的代码中,
os.ReadDir
函数用于读取
staticfiles
目录下的所有文件和文件夹。若发生错误,则渲染
error.tpl
模板并显示错误信息。否则,将文件列表传递给
directory.tpl
模板进行展示。

ns := beego.NewNamespace("/v1",
beego.NSNamespace(
"/file",
beego.NSInclude(
&controllers.FileController{})),
)
beego.AddNamespace(ns)

将这个Contorller注册到router中

2.2 模板文件展示目录

为了展示文件列表并提供下载功能,我们创建一个简单的 HTML 模板
views/directory.tpl
,将文件名展示给用户,并为每个文件生成对应的下载链接。

<!DOCTYPE html>
<htmllang="en">
<head>
    <metacharset="UTF-8">
    <title>文件目录</title>
</head>
<body>
    <h1>下载文件</h1>
    <ul>{{range .files}}
{{if not .IsDir}}
<li> <ahref="/staticfiles/{{.Name}}"download="{{.Name}}">{{.Name}}</a> </li>{{end}}
{{end}}
</ul> </body> </html>

在这个模板中,使用 Go 模板语法遍历从控制器传递来的
files
列表。对于每个文件,生成一个
<a>
标签,并使用
download
属性提供文件下载。

3. 错误处理页面

如果在读取目录时发生错误,我们会渲染一个错误页面
views/error.tpl
。该页面展示错误信息,并提示用户返回或重试。

<!DOCTYPE html>
<htmllang="en">
<head>
    <metacharset="UTF-8">
    <title>错误页面</title>
    <style>body{font-family:Arial, sans-serif;margin:50px;
        }.error-container{max-width:600px;margin:auto;padding:20px;border:1px solid #f5c6cb;background-color:#f8d7da;color:#721c24;
        }h1{color:#721c24;
        }
    </style>
</head>
<body>
    <divclass="error-container">
        <h1>发生错误</h1>
        <p>{{.error}}</p>
        <p>请返回并重试。</p>
    </div>
</body>
</html>

该模板通过
{{.error}}
渲染从控制器传递的错误信息,并通过简单的样式使其更加易于理解。

4. 使用 Docker 映射静态文件夹

为了使文件夹的管理更加灵活,并且在容器化应用中实现静态文件的持久化存储,我们可以通过 Docker 将本地文件夹映射到容器内部。

4.1 Docker 映射文件夹


docker-compose.yml
中,我们通过
volumes
选项将主机上的
staticfiles
文件夹映射到容器中的
/app/staticfiles
目录。

version: '3'
services:
web:
image: your-beego-image
ports:
- "8080:8080"
volumes:
- /d/commanddemo/staticfiles:/app/staticfiles

在这里,
/d/commanddemo/staticfiles
是主机上的文件夹路径,
/app/staticfiles
是容器内部的路径。通过这种方式,主机和容器中的文件可以保持同步,任何对文件的更新都会立即反映在容器内。

5. 运行 Beego 项目

完成上述步骤后,您可以运行 Beego 项目。访问
http://localhost:8080/getfiles
,您将看到目录中的文件列表,并可以直接下载这些文件。

大家好,我是 V 哥。在鸿蒙 NEXT 开发中,
@Styles
装饰器是一种非常有用的方法,用于定义可重用的样式。这使得开发者可以将多条样式设置提炼成一个方法,以便在多个组件中复用,从而提高代码的可维护性和可读性。以下是
@Styles
装饰器的详细用法和应用场景案例。

@Styles
装饰器的使用说明

  1. 仅支持通用属性和事件
    :当前
    @Styles
    仅适用于通用属性和事件,不支持特定于某个组件的属性或事件。
  2. 不支持参数

    @Styles
    方法不能带有参数。例如,以下是一个错误的使用示例:
   @Styles function globalStyles(value: number) {
     .width(value)
   }

正确的做法是不带参数:

   @Styles function globalStyles() {
     .width(150)
     .height(100)
     .backgroundColor(Color.Pink)
   }
  1. 定义位置

    @Styles
    可以定义在组件内或全局。在全局定义时,需要在方法名前添加
    function
    关键字;在组件内定义时,则不需要。
   // 全局定义
   @Styles function globalStyles() {
     .width(150)
     .height(100)
     .backgroundColor(Color.Pink)
   }

   // 组件内定义
   @Component
   struct FancyComponent {
     @Styles myStyle() {
       .width(200)
       .height(100)
       .backgroundColor(Color.Yellow)
     }
   }
  1. 访问组件内部状态
    :定义在组件内的
    @Styles
    可以通过
    this
    访问组件的常量和状态变量,并可以在
    @Styles
    里通过事件来改变状态变量的值。
   @Component
   struct MyComponent {
     @State heightValue: number = 100
     @Styles myStyle() {
       .height(this.heightValue)
       .backgroundColor(Color.Yellow)
       .onClick(() => {
         this.heightValue = 200
       })
     }
   }
  1. 优先级
    :组件内
    @Styles
    的优先级高于全局
    @Styles
    。框架会优先查找当前组件内的
    @Styles
    ,如果找不到,则会全局查找。

来看一个案例

以下是一个使用
@Styles
装饰器的示例,展示了如何在全局和组件内定义样式,并在组件中使用这些样式。

// 定义全局样式
@Styles function globalStyles() {
  .width(150)
  .height(100)
  .backgroundColor(Color.Pink)
}

@Entry
@Component
struct StyleUse {
  @State heightValue: number = 100
  // 定义组件内样式
  @Styles myStyle() {
    .width(200)
    .height(this.heightValue)
    .backgroundColor(Color.Yellow)
    .onClick(() => {
      this.heightValue = 200
    })
  }

  build() {
    Column({ space: 10 }) {
      // 使用全局样式
      Text('FancyA').globalStyles().fontSize(30)
      // 使用组件内样式
      Text('FancyB').myStyle().fontSize(30)
    }
  }
}

在这个案例中,我们定义了一个全局样式
globalStyles
和一个组件内样式
myStyle
。在
StyleUse
组件的
build
方法中,我们使用这些样式来设置两个
Text
组件的样式。这展示了如何通过
@Styles
装饰器复用样式,使得代码更加简洁和易于维护。

如何使用 @Styles 装饰器来优化我的组件代码?

使用
@Styles
装饰器可以显著优化你的组件代码,使其更加简洁、可维护,并减少重复的样式代码。以下是如何使用
@Styles
装饰器来优化组件代码的步骤和示例:

1. 识别重复的样式代码

首先,你需要识别在多个组件中重复使用的样式代码。这些可能是通用的布局样式、颜色、字体大小等。

2. 定义
@Styles
方法

将这些重复的样式代码提炼到一个或多个
@Styles
方法中。你可以在组件内部或全局定义这些方法。

  • 组件内样式
    :如果样式仅在单个组件中使用,可以在该组件内部定义
    @Styles
    方法。
  • 全局样式
    :如果样式在多个组件中使用,可以定义为全局
    @Styles
    方法。

3. 应用
@Styles
方法

在组件的
build
方法中,通过方法调用的方式应用这些
@Styles
方法到相应的 UI 组件上。

4. 使用状态和事件

如果需要,你可以在
@Styles
方法中使用组件的状态和事件处理器,使样式可以根据组件的状态动态变化。

优化示例

假设你有一个应用,其中多个页面都有需要显示警告信息的
Text
组件,警告信息的样式在所有页面中都是一致的:红色、加粗、字体大小为16。

步骤 1:定义全局
@Styles
方法

// 定义全局警告样式
@Styles function warningStyle() {
  .fontSize(16)
  .fontWeight(FontWeight.Bold)
  .fontColor(Color.Red)
}

步骤 2:在组件中使用
@Styles
方法

@Entry
@Component
struct WarningMessage {
  build() {
    Column() {
      // 使用全局警告样式
      Text('这是一条警告信息').warningStyle()
    }
  }
}

在这个示例中,我们定义了一个全局的警告样式
warningStyle
,并在
WarningMessage
组件中应用了这个样式。这样,无论在应用的哪个部分需要显示警告信息,都可以简单地调用
.warningStyle()
方法来应用这个样式,而不需要重复编写样式代码。

总结

通过使用
@Styles
装饰器,你可以将样式逻辑从组件的业务逻辑中分离出来,使得代码更加清晰和易于管理。这不仅减少了代码的重复,也使得样式的修改和维护变得更加集中和高效。轻舟已过万重山,鸿蒙势头不可挡。关注威哥爱编程,一起混进鸿蒙生态。

前言

本系统的设计目标是帮助中小企业乃至大型企业实现仓库操作的自动化与数字化,从而提升工作效率,降低成本,并最终实现业务增长。项目采用 Vue 3 + TS + .NET 7 等前沿框架进行开发,为企业提供一套现代化的仓库管理解决方案。

项目介绍

ModernWMS 是一款开源的简易完整仓库管理系统,源于我们多年 ERP 项目实施经验的积累。

我们将原有的商业系统中的 WMS 功能独立出来,免费对外开放,在帮助广大中小企业提升仓库管理效率。该系统支持跨平台运行,实现一处编码即可多处使用,极大地降低了维护成本和技术门槛。

当然,以下是简洁优化后的版本:

项目特点

  • 代码开源:遵循 Apache 2.0 协议,完全开源的仓库管理系统。
  • 开箱即用:具备完整的开发部署流程,安装后立即可用。
  • 流程精简:保留核心功能——收货、发货、库存管理及仓内作业,易于上手,减少学习成本。
  • 降本增效:几乎零成本投入,提升工作效率,增强企业竞争力。
  • 社区活跃:采用前沿技术框架,拥有活跃的技术社区和专业团队维护。

项目环境

Linux 操作系统

  • Ubuntu 18.04 (LTS), 20.04 (LTS), 22.04 (LTS)
  • CentOS Stream 8, 9
  • RHEL 8 (8.7), 9 (9.1)
  • Debian 10, 11
  • openSUSE 15

Windows 操作系统

  • Windows 10 版本 1607 及以上
  • Windows Server 2012 及以上

项目部署

Linux

1、下载源码

cd /tmp/wget https://gitee.com/modernwms/ModernWMS/repository/archive/master.zip

2、安装 .NET SDK 和 Node.js

wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt
-get update && sudo apt-get install -y dotnet-sdk-7.0curl-fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - sudo apt install -y nodejs
sudo apt
-get install gcc g++make
sudo npm install
-g yarn

3、编译前端和后端

sudo apt install unzip
cd
/tmp/ && unzip master.zip && cd ./ModernWMS-master
mkdir
-p frontend backend
cd frontend
sed
-i 's#http://127.0.0.1#http://前部署服务器的IP地址#g' ./.env.production
yarn
&&yarn build
cp
-rf dist/*../frontend/
cd ../backend/
sudo dotnet publish
cp -rf ModernWMS/bin/Debug/net7.0/publish/* ../backend/
cp -rf ModernWMS/wms.db ../backend/

4、安装并启动 Nginx

cd /tmp/wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz && cd nginx-1.18.0./configure --prefix=/etc/nginx --with-http_secure_link_module --with-http_stub_status_module --with-http_realip_module --without-http_rewrite_module --without-http_gzip_module
make
&&make install
cp
-rf /ModernWMS/frontend/*/etc/nginx/html/
nohup /etc/nginx/sbin/nginx -g 'daemon off;'
cd /ModernWMS/backend/
dotnet ModernWMS.dll --urls
http://0.0.0.0:20011

Windows

1、下载源码

cd C:\
wget
-Uri https://gitee.com/modernwms/ModernWMS/repository/archive/master.zip -OutFile master.zip Expand-Archive -Path C:\master.zip -DestinationPath C:\

2、安装 .NET SDK 和 Node.js

wget -Uri https://download.visualstudio.microsoft.com/download/pr/35660869-0942-4c5d-8692-6e0d4040137a/4921a36b578d8358dac4c27598519832/dotnet-sdk-7.0.101-win-x64.exe -OutFile dotnet-sdk-7.0.101-win-x64.exe
.\dotnet
-sdk-7.0.101-win-x64.exe /install /quiet /norestart
wget
-Uri https://nodejs.org/dist/v16.13.1/node-v16.13.1-x64.msi -OutFile node-v16.13.1-x64.msi
msiexec
/i .\node-v16.13.1-x64.msi /passive /norestart
npm install
-g yarn

3、编译前端和后端

md C:\ModernWMS\frontend
md C:\ModernWMS\backend
cd C:\ModernWMS
-master\backend
dotnet publish
Copy-Item -Path "C:\ModernWMS-master\backend\ModernWMS\bin\Debug\net7.0\publish\*" -Destination "C:\ModernWMS\backend\" -RecurseCopy-Item -Path "C:\ModernWMS-master\backend\ModernWMS\wms.db" -Destination "C:\ModernWMS\backend\"cd C:\ModernWMS-master\frontend
yarn
yarn build
Copy-Item -Path "C:\ModernWMS-master\frontend\dist\*" -Destination "C:\ModernWMS\frontend\" -Recurse

4、安装并启动 Nginx

cd C:\
wget
-Uri http://nginx.org/download/nginx-1.16.1.zip -OutFile nginx-1.16.1.zipExpand-Archive -Path C:\nginx-1.16.1.zip -DestinationPath C:\Copy-Item -Path "C:\ModernWMS\frontend\*" -Destination "C:\nginx-1.16.1\html\" -Recurse
cd C:\nginx
-1.16.1\Start-Process.\nginx.exe
cd C:\ModernWMS\backend
dotnet ModernWMS.dll
--urls http://0.0.0.0:20011

项目访问

1、本地或服务器访问

打开浏览器,输入以下地址之一:

  • http://127.0.0.1:20011

  • http://部署电脑的IP地址:20011

初始账号:
admin
,密码:
1

2、无需部署的免费体验

如果暂时不想进行本地部署,也可以直接在线体验:
https://wmsonline.ikeyly.com/#/login

项目效果

1、登录页面

2、首页页面

3、库存管理

4、统计分析

5、基础设置

6、移动端页面

项目手册

为了帮助大家更好地理解和使用 ModernWMS,我们准备了一份详尽的操作手册。

基本操作指南:提供了系统各个模块的基本操作方法,帮助您快速熟悉界面和常用功能。

常见问题解答:汇总了用户在使用过程中可能遇到的问题及其解决方案,帮助您及时排除故障,保证系统的稳定运行。

项目地址

项目愿景

在制造业领域深耕多年,我们深知对于中小型企业的管理需求尤为迫切,但市场上大型系统的高昂价格往往令企业望而却步,这给企业的转型带来了不小的挑战。

因此,我们希望将这套轻量化的仓库管理系统开源,并免费提供给大家使用,以解决80%的管理需求。经过不断的提炼,系统仅包含最基础和最核心的功能,便于快速上手。只要拥有一台电脑,就可以轻松部署并运行自己的仓库管理系统!

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号
[DotNet技术匠]
社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!