笔记

232 阅读4分钟

download.csdn.net/download/si…

poe.com/ 

react+vite前端架构 功能(build)

 优化 devops??(docker git k8s jenkins nginx) 

微前端 bff?? 

fastapi flask 百炼流式输出(日志 重复问题等) 

postgresql 账号密码登录 

阿里云短信登录 SSO登录?? 

Apollo配置中心 

登录权限 

密码加密 

表单提交 

sql注入 

手机号验证码登录(防刷,存内存) 

apollo 阿里云 

堡垒机 

nginx 

表单邮箱 

联调python 

sql 

oss 

手机 pc适配判断 

navigator.userAgent h5(混合开发?) 

sqlalchemy 

中英文切换

from omegaconf import OmegaConf

  • 功能:导入 OmegaConf 模块,这是一个用于处理配置文件(例如 YAML)的库,提供了灵活的配置管理功能。

 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

  1. __file__:

    • 这个特殊变量包含当前脚本的路径。它用于确定脚本的目录。
  2. os.path.dirname(__file__):

    • os.path.dirname 函数返回当前脚本所在目录的路径。
  3. os.path.join(os.path.dirname(__file__), '..'):

    • os.path.join 函数将当前脚本的目录与 '..'(表示上级目录)连接起来,形成上级目录的路径。
  4. os.path.abspath(...):

    • os.path.abspath 函数将相对路径转换为绝对路径,从而确保后续操作不会受到当前工作目录的影响。
  5. sys.path.append(...):

  • sys.path 是一个列表,包含 Python 解释器查找模块的路径。使用 append 方法将上级目录的绝对路径添加到这个列表中,使得 Python 可以在该目录中查找模块。

    class LoadScene: _instance = None # 类变量 _instance 被初始化为 None,用于存储 LoadScene 类的单例实例。 def new(cls, *args, **kwargs): if cls._instance is None: cls._instance = super(LoadScene, cls).new(cls) # 这一行代码是实现单例模式的关键部分 return cls._instance

def __new__(cls, *args, **kwargs):

__new__ 方法详解

1. 定义与作用

  • __new__ 是一个特殊的方法,用于创建类的实例。它在实例化对象时被调用,负责分配内存并返回一个新的对象。
  • 语法为 def __new__(cls, *args, **kwargs):,其中 cls 是当前类的引用,而 *args**kwargs 分别用于接收位置参数和关键字参数。

2. 实例化过程

  • 在 Python 中,实例化一个对象的过程分为两个主要步骤:

    1. 调用 __new__ 方法:分配内存并创建一个新的对象。
    2. 调用 __init__ 方法:初始化这个新对象的属性。
  • __new__ 方法必须返回一个实例(通常是 cls),而 __init__ 方法则不需要返回值。

3. 与 __init__ 的区别

  • __new__:
    • 负责创建对象并返回实例。
    • 在类的实例化过程中第一个被调用。
    • 可以用于创建类的子类实例或实现单例模式。
  • __init__:
    • 负责初始化对象的属性,设置实例的初始状态。
    • __new__ 返回实例后被调用。
    • 通常不返回任何值(返回 None)。

4. 使用场景

  • 单例模式:确保某个类只有一个实例。例如,在配置管理、数据库连接等场景中,单例模式可以避免创建多个相同的对象。

  • 元类:在创建类的实例时,可能需要控制类的创建逻辑,比如在元类中使用 __new__

  • 定制实例创建:可以在 __new__ 中添加逻辑,比如根据某些条件返回不同的实例。

示例

以下是一个更完整的示例,展示了 __new__ 方法的用法:

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

    def __init__(self, value):
        # 只初始化一次
        if not hasattr(self, 'initialized'):
            self.value = value
            self.initialized = True

# 测试
s1 = Singleton(1)
s2 = Singleton(2)

print(s1.value)  # 输出: 1
print(s2.value)  # 输出: 1
print(s1 is s2)  # 输出: True,s1 和 s2 是同一个实例

cls._instance = super(LoadScene, cls).new(cls)

1. super(LoadScene, cls)

  • 功能:获取 LoadScene 的父类的代理对象。
  • 作用super() 函数用于在类的继承层次中向上查找。它可以调用父类的方法。
  • LoadScene:这是当前类的名称,表示你希望从哪个类获取父类的方法。
  • cls:通常在类方法(如 __new____init__)中,cls 是对当前类的引用,允许你使用该类的上下文。

2. __new__(cls)

  • 功能:调用父类的 __new__ 方法。
  • 作用
    • __new__ 是一个特殊的方法,用于创建类的实例。它返回一个新的实例,通常是通过调用父类的 __new__ 方法来实现。

3. cls._instance = ...

  • 功能:将创建的新实例赋值给类变量 _instance

  • 目的:确保 _instance 始终持有 LoadScene 类的唯一实例,从而实现单例模式。

    @classmethod def get_instance(cls): if cls._instance is None: cls._instance = LoadScene() return cls._instance

1. @classmethod 装饰器

  • 功能:将 get_instance 方法定义为类方法。
  • 作用:类方法的第一个参数是类本身(通常用 cls 表示),而不是实例对象。这使得可以通过类来调用该方法,而不必首先创建实例。

2. if cls._instance is None:

  • 功能:检查类变量 _instance 是否为 None
  • 目的:判断是否需要创建一个新的 LoadScene 实例。

3. cls._instance = LoadScene()

  • 功能:如果 _instanceNone,则创建一个新的 LoadScene 实例,并将其赋值给 _instance
  • 作用:确保 LoadScene 只有一个实例,从而实现单例模式。

4. return cls._instance

  • 功能:返回当前类的单例实例。

  • 用途:无论多少次调用 get_instance 方法,返回的都是同一个实例。

for equipment in scene.get('Equipment', []):

这一行代码的作用是遍历 scene 对象中的 Equipment 列表。以下是这行代码的详细解析:

代码解析

  1. scene.get('Equipment', []):

    • scene 是一个字典,get 方法用于安全地访问字典中的 Equipment 键。

    • 如果 Equipment 键存在,它将返回对应的值(通常是一个列表)。

    • 如果 Equipment 键不存在,get 方法将返回默认值 [](一个空列表)。

    • 这样做可以避免在尝试访问一个不存在的键时抛出 KeyError 异常。

    "scripts": { 用于运行测试。在这里,它只会输出一个错误信息,表示没有指定测试,然后退出,返回状态码 1,表示失败。 "test": "echo "Error: no test specified" && exit 1",

    -r: 这是 Node.js 的一个选项,表示在执行脚本之前预加载一个模块。dotenv/config: 这是 dotenv 模块的一个子模块,用于自动加载 .env 文件中的环境变量。这意味着在执行后面的脚本(如 devServer/index.js)时,环境变量已经被加载并可用。 "devserver": "node -r dotenv/config devServer/index.js" },

    module.exports = { name: "test", // 本项目构建后资源服务端口,多个项目同时启动时请配置为不同端口 port: 9601, /* * 按需发版配置 * * 默认打开,发版时一定要填写要发布的模块,开发时会构建所有模块 * 防止发示例代码到开发和测试环境上 * e.g. * "pages/home" * "modules/todoList" / releaseEntries: [], /* * webpack 构建钩子 * @param {import('@hi/cli').WebpackChain} webpackConfig */ buildConfig(webpackConfig) { // 用于修改webpack构建配置 // 处理 .less 文件的规则 const lessRule = webpackConfig.module.rule("less").test(/.less/);//创建了一个规则,用于匹配所有以.less结尾的文件。rule(less)是给这个规则命名。lessRule.use("styleloader").loader("styleloader");//这段代码添加了styleloader。它将CSS插入到DOM中的<style>标签中。lessRule.use("cssloader").loader("cssloader");//这里添加了cssloader,它解析CSS文件中的@importurl()语句,使得可以在JavaScript中引入CSS//添加了lessloader,用于将Less文件转换为CSS。这里还有一些选项://sourceMap:true:启用源映射,便于调试。//modifyVars:允许在Less文件中动态修改变量(需在外部定义)。//javascriptEnabled:true:允许使用JavaScript语法,通常用于启用动态样式。lessRule.use("lessloader").loader("lessloader").options(sourceMap:true,//modifyVars:modifyVars,//javascriptEnabled:true,);//使用fileloader来处理这些图像文件。//limit:100000表示如果文件小于100KB,则会被转为base64格式;否则将会以文件的形式输出。//name定义了输出文件的路径和名称格式。//esModule:false使得fileloader输出的路径可用于CommonJS模块。webpackConfig.module.rule("img").test(/(˙pngjpe?ggifwebpicosvgmp4apk)(\?.)?/); // 创建了一个规则,用于匹配所有以 .less 结尾的文件。rule('less') 是给这个规则命名。 lessRule.use("style-loader").loader("style-loader"); // 这段代码添加了 style-loader。它将 CSS 插入到 DOM 中的 <style> 标签中。 lessRule.use("css-loader").loader("css-loader"); // 这里添加了 css-loader,它解析 CSS 文件中的 @import 和 url() 语句,使得可以在 JavaScript 中引入 CSS。 // 添加了 less-loader,用于将 Less 文件转换为 CSS。这里还有一些选项: // sourceMap: true: 启用源映射,便于调试。 // modifyVars: 允许在 Less 文件中动态修改变量(需在外部定义)。 // javascriptEnabled: true: 允许使用 JavaScript 语法,通常用于启用动态样式。 lessRule.use("less-loader").loader("less-loader").options({ sourceMap: true, // modifyVars: modifyVars, // javascriptEnabled: true, }); // 使用 file-loader 来处理这些图像文件。 // limit: 100000 表示如果文件小于 100KB,则会被转为 base64 格式;否则将会以文件的形式输出。 // name 定义了输出文件的路径和名称格式。 // esModule: false 使得 file-loader 输出的路径可用于 CommonJS 模块。 webpackConfig.module .rule("img") .test(/\.(png|jpe?g|gif|webp|ico|svg|mp4|apk)(\?.*)?/) //为图像文件(如 PNG、JPEG、GIF 等)设置了 Webpack 规则 .use("file-loader") .loader("file-loader") .options({ limit: 100000, name: assets/imgs/[name].[ext], esModule: false, }); // 设置路径别名 webpackConfig.resolve.alias.set("@", path.join(__dirname, "./")); },};

    sudo: required // 表示需要使用 sudo 权限来运行构建。这通常用于需要特定系统权限的服务。 dist: trusty // 指定使用 Ubuntu Trusty (14.04) 作为构建环境的基础镜像

    language: node_js // 指定使用 Node.js 作为编程语言

    services:

    • docker // 指定构建时需要的服务。在这里,启用了 Docker 服务。

    node_js:

    • "12"

    cache: yarn // 启用对 yarn 缓存的支持,以加快后续构建的速度。

    env: // 定义全局环境变量 global:

    • NODE_ENV="production" // 设置为 "production",用于指示运行环境。
    • PROJECT="projectName" // 设置项目名称,确保与 project.js 中的 name 一致
    • PACKAGE_VERSION="v1.1.${TRAVIS_BUILD_NUMBER}" // 设置包版本,包含 Travis 构建号,以确保版本唯一性

    before_install: // 在安装依赖之前执行的命令。 //npm config set: 设置 npm 使用的私有注册表 URL。npm config list: 列出当前的 npm 配置,以确保正确设置

    • npm config set @hi:registry iservice.schneider-electric.cn/nexus/repos…
    • npm config list after_install: //在依赖安装之后执行的命令。
    • npm list // 列出已安装的 npm 包,以确认依赖是否正确安装。

    before_deploy: // 在部署之前执行的命令

    • export ARTIFACT_NAME="PROJECTapp{PROJECT}-app-{TRAVIS_BRANCH}-${PACKAGE_VERSION}.zip"
    • yarn build
    • cd ./dist
    • cat release.json //打印 release.json 的内容,通常用于确认构建信息
    • zip -r ../${ARTIFACT_NAME} * // 用于递归地将当前目录中的所有文件和子目录打包成一个 ZIP 文件
    • cd ../
    • 'curl -o upload.sh -H "Authorization: token GITHUBTOKEN"{GITHUB_TOKEN}" {GITHUB_UPLOAD_SCRIPT}'
    • chmod a+x ./upload.sh

    deploy:

    • provider: script skip_cleanup: true on: all_branches: true script:
      • ./upload.sh ./ARTIFACTNAME{ARTIFACT_NAME} {PROJECT} TRAVISBRANCHapp{TRAVIS_BRANCH} app {PACKAGE_VERSION} OSSBUCKET{OSS_BUCKET} {OSS_KEY} ${OSS_SECRET}