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

微信小程序中的模块化、组件化开发:完整指南

文章目录

  • 前言
  • 一、模块化与组件化开发的优势
    • 1.1模块化开发的优势
    • 1.2 组件化开发的优势
  • 二、组件的抽离标准及规范
    • 2.1 抽离组件的标准
    • 2.2 组件化开发规范
  • 三、模块化规范的种类及优劣比较
    • 3.1 CommonJS
    • 3.2 ES6 Modules
    • 3.3 优劣对比
  • 四、组件封装:全局组件、分包组件、页面独享组件
    • 4.1 全局组件
    • 4.2 分包组件
    • 4.3 页面独享组件
  • 五、工具类函数:全局工具类函数与页面独享工具类函数
    • 5.1 全局工具类函数
    • 5.2 全局工具类函数
  • 六、网络请求的二次封装
    • 6.1 请求封装的基本结构
    • 6.2 请求封装的扩展:自动添加 Token 和处理错误
    • 6.3 按照不同环境切换接口
  • 七、微信小程序中的事件总线与状态管理
    • 7.1 使用 EventBus 实现组件通信
    • 7.2 状态管理
      • 使用小程序自带的 globalData 进行状态管理
      • 基于事件通知机制的状态管理
      • 第三方状态管理库:mobx-miniprogram 和 redux
        • mobx-miniprogram 的使用
        • redux 的使用
  • 八、总结


前言

随着微信小程序的日益普及,其开发模式也逐渐趋于模块化与组件化。通过将业务逻辑拆分为独立的组件和模块,开发者可以更好地维护、扩展和复用代码。本篇文章将详细探讨微信小程序的模块化和组件化开发,涵盖组件的抽离标准、模块化规范的优劣比较、自定义组件的封装、工具类函数的封装、以及网络请求的二次封装等内容。文章力求清晰、完善,帮助开发者提升小程序开发的整体效率。


一、模块化与组件化开发的优势

1.1模块化开发的优势

•	代码复用:将通用的功能抽象为模块,多个页面可以直接调用,避免重复代码。
•	易于维护:模块化让代码的维护更具针对性,修改或优化某一功能时,只需关注对应的模块。
•	提高开发效率:通过将复杂的逻辑分割成小模块,可以多人协作,分工开发,加快项目进度。

1.2 组件化开发的优势

•	界面复用:通过组件的方式,可以将复用性较高的 UI 和交互逻辑进行封装,多个页面共享,减少重复开发。
•	分离关注点:组件化开发有助于将视图与业务逻辑分离,提高代码的可读性和可维护性。
•	灵活组合:组件可以像拼积木一样灵活地组合和嵌套,提升页面布局的灵活性。

二、组件的抽离标准及规范

2.1 抽离组件的标准

在微信小程序开发中,抽离组件是常见的开发实践。如何合理抽离组件,以下标准可以作为参考:

•	复用性高:当某个 UI 组件在多个页面中被频繁使用时,应该将其抽离成一个独立的组件。例如:按钮、输入框、列表项等。
•	逻辑独立:如果某个部分的业务逻辑独立且复杂,也应该将其封装为一个组件,便于后续维护。例如:地图选择器、日历组件等。
•	结构清晰:组件应尽量保持结构清晰、简单。一个组件应专注于实现单一功能,而不应承载过多的职责。复杂组件可以进一步拆分为多个子组件。
•	样式统一:组件中的样式应保持规范统一,避免与全局样式冲突,可以考虑使用 scoped 样式隔离组件的样式。

2.2 组件化开发规范

•	命名规范:组件的命名应语义化,便于阅读与理解。例如,buttonComponent 应明确表示为一个按钮组件。
•	合理的组件通信:组件间的通信应保持简洁明了,通常通过 props 和事件传递数据,避免父子组件耦合过多的逻辑。
•	状态管理:当组件的状态过于复杂时,可以考虑引入状态管理工具(如 MobX 或 Vuex),避免在组件中处理过多状态。

三、模块化规范的种类及优劣比较

在微信小程序中,模块化开发主要通过 JavaScript 文件的导入导出实现。常见的模块化方案有:

3.1 CommonJS

•	优点:
•	微信小程序原生支持 CommonJS 规范,无需额外配置。
•	使用简单,语法清晰:module.exports 和 require。
•	缺点:
•	模块是同步加载的,某些情况下会影响性能。
•	难以支持 Tree Shaking,无法进行未使用代码的删除。

3.2 ES6 Modules

•	优点:
•	采用静态分析,支持 Tree Shaking,能优化代码体积。
•	支持异步加载,性能更佳。
•	语法更加简洁,使用 import/export。
•	缺点:
•	需要小程序项目配置 TypeScript 或者 Babel 来支持,增加了开发的复杂度。

3.3 优劣对比

•	如果项目对性能要求较高,并且需要在构建时剔除未使用代码,建议采用 ES6 Modules 方案。
•	如果是小型项目,或开发者不想增加构建复杂度,选择 CommonJS 更为合适。

四、组件封装:全局组件、分包组件、页面独享组件

微信小程序允许开发者封装不同类型的组件,适应不同的使用场景。我们可以根据组件的使用范围和用途来封装以下几类组件:

4.1 全局组件

全局组件是可以在整个小程序的任何页面中使用的组件,适合一些通用性强的组件,比如导航栏、弹窗、底部导航等。

全局组件的封装:

// 在 app.json 中配置全局组件路径
{"usingComponents": {"custom-nav": "/components/custom-nav/custom-nav"}
}

通过这种方式,custom-nav 组件可以在任意页面中直接引用。

4.2 分包组件

分包组件仅在特定的分包中使用。当项目较大时,将不同业务逻辑拆分为多个分包模块,可以优化小程序的启动速度。对于分包内专属的组件,可以将其放在分包内部。

// 在分包内的 package.json 中配置分包组件路径
{"usingComponents": {"sub-nav": "/subpackageA/components/sub-nav/sub-nav"}
}

4.3 页面独享组件

页面独享组件是仅在某个页面中使用的组件,这些组件通常只与当前页面逻辑相关,适合不需要复用的组件。

// 在页面的 index.json 中配置
{"usingComponents": {"page-button": "/pages/index/components/page-button/page-button"}
}

优缺点对比:

•	全局组件:最大程度复用,但过度使用会增加小程序的初始化体积。
•	分包组件:提高小程序启动性能,但维护时需要注意组件的划分和路径管理。
•	页面独享组件:维护简单,适合专属业务逻辑,但复用性较差。

五、工具类函数:全局工具类函数与页面独享工具类函数

5.1 全局工具类函数

// utils/dateTimeUtils.ts
export const formatDate = (date: Date, format: string = "YYYY-MM-DD") => {// 实现代码return formattedDate;
}

使用时通过 import 导入:

import { formatDate } from '../../utils/dateTimeUtils';

5.2 全局工具类函数

当工具类函数仅在某个页面内使用时,可以将其封装在页面文件夹下,不需要放到全局工具类中。这样可以避免全局工具类函数的冗余。

// pages/index/utils/indexPageUtils.ts
export const handleIndexPageLogic = () => {// 实现代码
}

优缺点对比:

•	全局工具类函数:方便调用和复用,但如果过度膨胀会导致工具函数复杂,难以维护。
•	页面独享工具类函数:轻量级、易维护,但局限于页面内部,不能跨页面复用。

六、网络请求的二次封装

微信小程序的网络请求可以通过 wx.request 实现,但是直接调用会导致代码重复,并且缺乏统一的错误处理和状态管理。通过对 wx.request 进行二次封装,我们可以提高代码的复用性,并针对不同的环境(开发、测试、生产)切换请求地址。

6.1 请求封装的基本结构

// utils/http.ts
const BASE_URL = {dev: "https://dev.example.com/api",test: "https://test.example.com/api",prod: "https://prod.example.com/api"
};const currentEnv = 'dev'; // 根据环境切换export const request = (options: wx.RequestOption): Promise<any> => {return new Promise((resolve, reject) => {wx.request({...options,url: `${BASE_URL[currentEnv]}${options.url}`,success: (res) => {if (res.statusCode === 200) {resolve(res.data);} else {reject(res.data);}},fail: (err) => {reject(err);}});});
};

6.2 请求封装的扩展:自动添加 Token 和处理错误

我们可以进一步扩展请求封装,在每次请求时自动添加用户的身份认证 token,并统一处理错误。

// utils/http.ts
export const request = (options: wx.RequestOption): Promise<any> => {const token = wx.getStorageSync('token');return new Promise((resolve, reject) => {wx.request({...options,url: `${BASE_URL[currentEnv]}${options.url}`,header: {Authorization: `Bearer ${token}`,...options.header,},success: (res) => {if (res.statusCode === 200) {resolve(res.data);} else {reject(res.data);}},fail: (err) => {reject(err);}});});
};

6.3 按照不同环境切换接口

通常会根据开发、测试、生产等不同环境切换接口。可以通过配置文件或环境变量来实现:

// config.ts
const ENV = {development: {baseUrl: 'https://dev.example.com',},production: {baseUrl: 'https://prod.example.com',},
};export const getEnvConfig = () => {return process.env.NODE_ENV === 'production' ? ENV.production : ENV.development;
};

七、微信小程序中的事件总线与状态管理

在小程序中,当页面与页面、组件与组件之间需要进行复杂的通信时,可以引入事件总线(event bus)来实现组件之间的解耦。

7.1 使用 EventBus 实现组件通信

// utils/eventBus.ts
class EventBus {events = {};on(event, listener) {if (!this.events[event]) {this.events[event] = [];}this.events[event].push(listener);}emit(event, data) {const listeners = this.events[event];if (listeners) {listeners.forEach(listener => listener(data));}}off(event) {delete this.events[event];}
}export const eventBus = new EventBus();

使用示例:

// 页面 A
eventBus.emit('updateData', { name: '微信小程序' });// 页面 B
eventBus.on('updateData', (data) => {console.log(data.name); // 输出:微信小程序
});

7.2 状态管理

在大型或复杂的微信小程序项目中,页面与页面之间、组件与组件之间的状态管理和通信问题,往往是开发过程中不可避免的难点。虽然我们可以通过页面传参、globalData 全局变量等方式在小程序中管理状态,但这些方式在面对复杂的项目时显得力不从心。

微信小程序没有内置类似 Vuex 或 MobX 这样强大的状态管理库,但在实际开发中,可以通过几种常见的状态管理工具来实现统一的状态管理,以确保状态同步、数据传递清晰、项目结构简洁易维护。

使用小程序自带的 globalData 进行状态管理

微信小程序中的 App() 实例提供了一个全局对象 globalData,它可以用于存储一些全局共享的数据,比如用户信息、系统配置等。

示例:

// app.ts
App({globalData: {userInfo: null,isLoggedIn: false,}
});

在小程序的任意页面中可以通过 getApp() 获取全局数据:

// pages/index/index.ts
const app = getApp();
console.log(app.globalData.userInfo);  // 访问全局用户信息

优缺点:

•	优点:globalData 的使用非常简单,不需要额外引入第三方库。
•	缺点:无法高效地进行数据响应式更新。如果全局状态更新,必须手动刷新页面或使用事件通知来告知变化。

基于事件通知机制的状态管理

我们可以通过事件通知的方式来实现不同页面、组件之间的状态共享。这种方式基于发布-订阅模式,即当某个状态变化时,通过事件通知所有监听该事件的页面或组件。

实现一个简单的 eventBus:

// utils/eventBus.ts
class EventBus {events = {};on(event, listener) {if (!this.events[event]) {this.events[event] = [];}this.events[event].push(listener);}emit(event, data) {if (this.events[event]) {this.events[event].forEach((listener) => listener(data));}}off(event) {delete this.events[event];}
}export const eventBus = new EventBus();

使用:

// 页面A
import { eventBus } from '../../utils/eventBus';Page({onLoad() {eventBus.emit('updateUserInfo', { name: '张三', age: 25 });}
});// 页面B
import { eventBus } from '../../utils/eventBus';Page({onLoad() {eventBus.on('updateUserInfo', (data) => {console.log(data.name); // 输出 '张三'});}
});

优缺点:

•	优点:事件总线的实现非常轻量,且页面与页面之间通信解耦明显。
•	缺点:事件管理较为分散,不利于大型项目的维护。事件名称的管理在项目逐渐变大时会变得混乱,可能会出现命名冲突等问题。

第三方状态管理库:mobx-miniprogram 和 redux

微信官方提供了 mobx-miniprogram,这是专为小程序优化的 MobX 版本,具有轻量、响应式更新的特点。除此之外,也可以通过 redux 库来管理状态。

mobx-miniprogram 的使用

MobX 是一个以响应式数据驱动的状态管理库,通过定义“可观察的”状态数据,当这些数据发生变化时,所有使用它的组件都会自动更新。mobx-miniprogram 可以帮助我们高效地管理小程序中的全局状态,并且通过响应式更新机制大幅简化了状态同步的难度。

安装 mobx-miniprogram:

在项目根目录下运行:

npm install mobx-miniprogram mobx-miniprogram-bindings

实现一个简单的全局状态管理:

// store/counter.ts
import { observable } from 'mobx-miniprogram';export const store = observable({count: 0,increment() {this.count++;},decrement() {this.count--;},
});

在页面中使用:

// pages/index/index.ts
import { createStoreBindings } from 'mobx-miniprogram-bindings';
import { store } from '../../store/counter';Page({onLoad() {this.storeBindings = createStoreBindings(this, {store,fields: ['count'], // 将 count 字段绑定到页面数据中actions: ['increment', 'decrement'], // 绑定操作方法});},onUnload() {this.storeBindings.destroy();},handleIncrement() {this.increment();  // 点击调用自增方法},
});

优缺点:

•	优点:
•	MobX 提供了响应式的数据流,可以在状态改变时自动更新视图。
•	支持复杂的应用场景,适合中大型项目。
•	缺点:
•	学习成本较高,开发者需要理解 MobX 的基本原理。
•	对于简单的小程序项目来说,MobX 可能显得过于笨重。
redux 的使用

redux 是一个广泛使用的状态管理库。它通过集中式的状态管理,提供了单一数据源(Store),并通过纯函数 Reducer 更新状态。微信小程序中也可以使用 redux,不过需要通过第三方库 wx-redux 来实现。

基本使用方式:

安装依赖:

npm install redux wx-redux

定义 reducer 和 action:

// store/reducer.ts
const initialState = {count: 0,
};export const reducer = (state = initialState, action) => {switch (action.type) {case 'INCREMENT':return { count: state.count + 1 };case 'DECREMENT':return { count: state.count - 1 };default:return state;}
};// store/actions.ts
export const increment = () => ({ type: 'INCREMENT' });
export const decrement = () => ({ type: 'DECREMENT' });

配置 Store:

// store/index.ts
import { createStore } from 'redux';
import { reducer } from './reducer';export const store = createStore(reducer);

在小程序页面中使用:

// pages/index/index.ts
import { connect } from 'wx-redux';
import { store } from '../../store';
import { increment, decrement } from '../../store/actions';Page(connect(state => ({ count: state.count }), // 映射全局状态到页面{ increment, decrement }, // 映射 actions 到页面
)(store, {handleIncrement() {this.increment();  // 点击调用自增方法},
}));

优缺点:

•	优点:
•	Redux 的状态管理逻辑清晰,通过 Reducer 函数可以轻松控制状态的变化。
•	Redux 有强大的开发工具支持,可以查看每次状态变化的日志,方便调试。
•	缺点:
•	对于简单的小程序项目,Redux 的引入会显得过于复杂。
•	需要较多的样板代码,包括 Action、Reducer 和 Store 的配置。

八、总结

通过模块化和组件化开发,微信小程序可以大幅提升开发效率、降低维护成本。本文详细介绍了如何封装组件、工具类函数、以及网络请求的二次封装,同时分析了不同的模块化规范及组件的优缺点。无论是开发小型项目还是大型应用,合理的模块化与组件化设计都能够让项目变得更加健壮、可维护性更强。

希望这篇文章能帮助开发者深入理解微信小程序的模块化与组件化开发,并在实际开发中应用这些规范与技巧,提高项目开发效率。

相关文章:

微信小程序中的模块化、组件化开发:完整指南

文章目录 前言一、模块化与组件化开发的优势1.1模块化开发的优势1.2 组件化开发的优势 二、组件的抽离标准及规范2.1 抽离组件的标准2.2 组件化开发规范 三、模块化规范的种类及优劣比较3.1 CommonJS3.2 ES6 Modules3.3 优劣对比 四、组件封装&#xff1a;全局组件、分包组件、…...

9.第二阶段x86游戏实战2-初识易语言

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...

Cortex-A7:__disable_irq和GIC_DisableIRQ、__enable_irq和GIC_EnableIRQ的区别(1)API介绍

0 相关资料 ARM Generic Interrupt Controller Architecture version 2.0.pdf 1 API介绍 1.1 __disable_irq __disable_irq函数的作用是失能IRQ&#xff0c;也就是不响应中断。实现代码如下&#xff1a; /**\brief Disable IRQ Interrupts\details Disables IRQ interrupt…...

MATLAB在嵌入式系统设计中的最佳实践

嵌入式系统设计是一个复杂的过程&#xff0c;涉及硬件和软件的紧密集成。MATLAB提供了一套全面的解决方案&#xff0c;从算法开发到代码生成&#xff0c;再到硬件验证&#xff0c;极大地简化了这一过程。本文将探讨使用MATLAB进行嵌入式系统设计的最佳实践&#xff0c;包括模型…...

wpf 使用Oxyplot 库制作图表示例

方法&#xff1a; InitTable 方法&#xff1a;负责初始化图表模型&#xff0c;包括设置图表的样式、坐标轴、系列和注释。这个方法包括多个 Init 方法的调用&#xff0c;表示图表的初始化过程可以分步骤进行。 InitGoalPoint 方法&#xff1a;当前未实现&#xff0c;但预留了子…...

CSS3中的@media查询

CSS3的media查询是一种强大的功能&#xff0c;允许我们根据不同的媒体类型和设备特性来应用不同的样式规则。这使得我们能够创建响应式设计&#xff0c;确保网站或应用在各种设备和屏幕尺寸上都能提供良好的用户体验。本文将详细探讨media查询的定义、语法、使用场景及常见问题…...

fly专享

要逐步熟悉实验中的各个步骤&#xff0c;下面是详细的说明&#xff0c;包括如何下载软件以及相关操作步骤。 1. 熟悉VMware 15虚拟机的使用 步骤说明&#xff1a; 下载VMware Workstation 15&#xff1a; 打开浏览器&#xff0c;访问VMware官方网站&#xff1a;VMware Workst…...

初识Linux · 进程(3)

目录 前言&#xff1a; 进程的创建 前言&#xff1a; 继上文介绍了着重介绍了进程的内部属性&#xff0c;以及在操作系统层面进程如何被组织起来的&#xff0c;如何调用系统接口&#xff0c;有关task_struct&#xff0c;进程的部分理解等&#xff0c;今天&#xff0c;我们就…...

【spring】spring bean对象生命周期,spring容器如何管理bean,spring容器的名称是叫什么

【spring】spring bean对象生命周期&#xff0c;spring容器如何管理bean&#xff0c;spring容器的名称是叫什么 DefaultListableBeanFactory开始 spring 容器 DefaultListableBeanFactory DefaultListableBeanFactory是Spring的核心BeanFactory实现&#xff0c;它负责Bean的创…...

基于51单片机的电饭锅控制系统proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1CGyg6uPhFI0MeaBWwe_HAg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…...

创建dataSource错误

说明&#xff1a;记录一次启动项目时的异常&#xff0c;如下&#xff1a; Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2024-09-14 23:27:27.338 ERROR 42260 --- [ main] o.s.boot.SpringA…...

为解决bypy大文件上传报错—获取百度云文件直链并使用Aria2上传文件至服务器

问题描述 一方面组内的服务器的带宽比较小&#xff0c;另一方面使用bypy方式进行大文件(大于15G)上传时会报错&#xff08;虽然有时可以成功上传&#xff0c;但是不稳定&#xff09;&#xff1a; 解决方式 总体思路: 获得云盘需要下载文件的直链复制直链到服务器中使用自带…...

53.9k star 提升命令行效率的模糊搜索神器--fzf

fzf简介 作为Linux/Unix命令行的重度用户,你是否还在使用繁琐的管道命令与复杂选项组合来过滤文件和数据?其实我们有一个更简单高效的选择 - fzf。 fzf是一个开源的通用模糊搜索工具,可以大幅度提升命令行的使用体验。它的查询运行速度极快,支持预览选中的文件内容,还能与各…...

项目需求 | MySQL增量备份与恢复的完整操作指南

目录 一、MySql数据库增量备份的工作原理 1、全量备份与增量备份 2、增量备份原理 二、进行增量备份 步骤1&#xff1a;启用二进制日志 使用 SHOW VARIABLES 命令查看二进制日志状态 步骤2&#xff1a;执行增量备份脚本 三、使用增量备份恢复损坏的数据库 步骤1&#…...

判断当前环境是否为docker容器下

判断当前环境是否为docker容器下 webshell后或登录到系统后台&#xff0c;判断是否为docker容器可使用如下方法&#xff1a; 方式一&#xff1a;使用ls -alh命令查看是否存在.dockerenv来判断是否在docker容器环境内 ls -alh /.dockerenv如下图无.dockerenv文件&#xff0c;所…...

深入理解FastAPI中的root_path:提升API部署灵活性的关键配置

在Web开发领域&#xff0c;FastAPI因其高性能、易于使用和类型提示功能而备受开发者喜爱。然而&#xff0c;当涉及到在生产环境中部署FastAPI应用程序时&#xff0c;我们常常需要面对一些挑战&#xff0c;比如如何正确处理代理服务器添加的路径前缀。这时&#xff0c;root_path…...

QLORA:高效微调量化大型语言模型

人工智能咨询培训老师叶梓 转载标明出处 传统的16位精度微调需要超过780GB的GPU内存&#xff0c;对于参数量极大的模型&#xff0c;如65B&#xff08;即650亿参数&#xff09;的模型&#xff0c;在资源有限的情况下大模型的微调几乎是不可能的。华盛顿大学的研究者团队提出了一…...

CesiumJS+SuperMap3D.js混用实现可视域分析 S3M图层加载 裁剪区域绘制

版本简介&#xff1a; cesium&#xff1a;1.99&#xff1b;Supermap3D&#xff1a;SuperMap iClient JavaScript 11i(2023)&#xff1b; 官方下载文档链家&#xff1a;SuperMap技术资源中心|为您提供全面的在线技术服务 示例参考&#xff1a;support.supermap.com.cn:8090/w…...

Fish-Speech 部署安装指南

Fish Speech 是由 Fish Audio 团队开发的一款开源文本转语音&#xff08;TTS&#xff09;模型&#xff0c;它在多语言支持和性能方面取得了显著的突破。根据证据显示&#xff0c;Fish Speech 最新版本为 1.4 版本&#xff0c;该版本不仅提升了对多种语言的支持&#xff0c;还大…...

Excel 国产化替换新方案

前言 在当前数字化转型和信创&#xff08;信息技术应用创新&#xff09;战略背景下&#xff0c;企业对于安全性、自主可控性和高效办公工具的需求日益增加。作为一款国产自主研发的高性能表格控件&#xff0c;SpreadJS 正成为替换 Excel 的最佳选择。它不仅全面支持国产化认证…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...