Unity的Excel转表工具
该Excel工具主要由Python语言完成,版本为3.x
主要功能:
1.转换后的数据存储结构为二进制。
2.excel文件可以选择多种数据类型:int、float、string、一维(int、float、string)、二维int、Map(int/int、int/string、int/float、string/int、string/float)
3.多个字段串联作为一个Key、单个字段作为一个Key
4.导出二进制(Unity使用),导出json(服务器使用)。
主要代码(Unity部分):
Config.py
# --------------------------------Excel--------------------------------
# Excel文件目录
EXCEL_DIR = "./Excel/"# excel文件的后缀
EXCEL_EXT = ".xlsx"# unity表格字段的过滤
UNITY_TABLE_FIELD_FILTER = ["cs", "c", "CS", "C"]# 服务器表格字段的过滤
SERVER_TABLE_FIELD_FILTER = ["cs", "s", "CS", "S"]# key的修饰符名字
KEY_MODIFIER_NAME = "KEY"# --------------------------------Unity--------------------------------# 数据文件名
DataFileName = "Tables.bytes"# 数据生成路径
UnityDataDir = "./../BilliardGame/Assets/Res/Tables/"# 代码生成路径
UnityCodeDir = "./../BilliardGame/Assets/Scripts/Billiard/Plugin/TableGenerate/"# --------------------------------Go--------------------------------# 数据文件名
JsonFileName = "table.json"# 代码生成路径
GoCodeDir = "./"
Excel2Unity.py
import os
import xlrd
from Config import EXCEL_DIR
from Config import EXCEL_EXT
from Config import UNITY_TABLE_FIELD_FILTER
from Config import UnityDataDir
from ConfigDataGen import ConfigDataGen
from UnityCodeGen import UnityCodeGenclass Excel2Unity:# 构造函数def __init__(self):self.mExcelFiles = [] # 所有的excel文件# 外部处理函数def Process(self):self.RecursiveSearchExcel(EXCEL_DIR)self.ProcessExcelExportUnity()# 递归查找文件def RecursiveSearchExcel(self, path):for pathdir in os.listdir(path): # 遍历当前目录fullpath = os.path.join(path, pathdir)if os.path.isdir(fullpath):self.RecursiveSearchExcel(fullpath)elif os.path.isfile(fullpath):if os.path.splitext(fullpath)[1] == EXCEL_EXT:self.mExcelFiles.append(fullpath)# 处理excel文件def ProcessExcelExportUnity(self):allbytesdata = bytes()# 处理每个文件for filename in self.mExcelFiles:print("导出Unity-文件名:%s" %filename)data = xlrd.open_workbook(filename)table = data.sheets()[0]fields = self.FilterFieldData(table, UNITY_TABLE_FIELD_FILTER)#增加多语言配置languageKeys = ["EN"]languageTables = []for x in data.sheets():if x != table and x.name in languageKeys:languageTables.append(x)# 数据cfgbytes = ConfigDataGen.Process(fields, table, languageTables)allbytesdata += cfgbytes# 代码UnityCodeGen.Process(filename, fields, table, languageTables)# 后处理ConfigDataGen.Save(allbytesdata, UnityDataDir)UnityCodeGen.GenConfigMangerCode(self.mExcelFiles)# 筛选字段数据def FilterFieldData(self, table, fieldfilter):fields = []for index in range(table.ncols):row = table.cell(1, index).valuefor field in fieldfilter:if row == field:fields.append(index)return fields
UnityCodeGen.py
import os
from FieldFormat import FieldFormat
from Config import KEY_MODIFIER_NAME
from Config import EXCEL_DIR
from Config import UnityCodeDir
class UnityCodeGen:@staticmethoddef Tab(count):return " " * count;# 代码生成函数@staticmethoddef Process(filepath, fields, table, languageTables):# -----------------------table cfg class-----------------------filecontent = "\n"filecontent += "//-----------------------------------------------\n"filecontent += "// 生成代码不要修改\n"filecontent += "//-----------------------------------------------\n"filecontent += "\n"filecontent += "using System.Collections.Generic;\n"filecontent += "using System.IO;\n"filecontent += "using System.Text;\n"filecontent += "using UnityEngine;\n"filecontent += "\n"tablebasename = os.path.basename(filepath)tablebasename = tablebasename.split(".")[0]tablebasename = tablebasename.split("_")[0]tableclassname = tablebasename + "Cfg"filecontent += "public class " + tableclassname + "\n"filecontent += "{\n"for index in fields:fielddesc = table.cell(0, index).valuefieldtype = table.cell(2, index).valuefieldname = table.cell(3, index).valuefieldvar = FieldFormat.Type2format[fieldtype][1]filecontent += UnityCodeGen.Tab(1) + "public " + fieldvar + " " + fieldname + ";"filecontent += UnityCodeGen.Tab(1) + "// " + fielddesc + "\n"for x in languageTables:for xcol in range(x.ncols):if x.cell(3, xcol).value == table.cell(3, index).value :filecontent += UnityCodeGen.Tab(1) + "public " + "string" + " " + x.name + fieldname + ";"filecontent += UnityCodeGen.Tab(1) + "// " + fielddesc + "\n" # Deserialize函数filecontent += "\n"filecontent += UnityCodeGen.Tab(1) + "public void Deserialize (DynamicPacket packet)\n"filecontent += UnityCodeGen.Tab(1) + "{\n"for index in fields:fielddesc = table.cell(0, index).valuefieldtype = table.cell(2, index).valuefieldname = table.cell(3, index).valuefieldfunc = FieldFormat.Type2format[fieldtype][2]filecontent += UnityCodeGen.Tab(2) + fieldname + " = " + fieldfunc + ";\n"for x in languageTables:for xcol in range(x.ncols):if x.cell(3, xcol).value == table.cell(3, index).value :filecontent += UnityCodeGen.Tab(2) + x.name + fieldname + " = " + fieldfunc + ";\n"filecontent += UnityCodeGen.Tab(1) + "}\n"transposed = {}if len(languageTables) > 0:for i in range(languageTables[0].ncols):new_row = []for sheet in languageTables:new_row.append(sheet.name)transposed[languageTables[0].cell(3, i).value] = new_row for name in transposed:filecontent += UnityCodeGen.Tab(1) + "public string Get{0}\n".format(name,tableclassname)filecontent += UnityCodeGen.Tab(1) + "{\n"filecontent += UnityCodeGen.Tab(2) + "get\n"filecontent += UnityCodeGen.Tab(2) + "{\n"filecontent += UnityCodeGen.Tab(3) + "if(MultilingualUtil.CurrentLanguage == 0)\n"filecontent += UnityCodeGen.Tab(3) + "{\n"filecontent += UnityCodeGen.Tab(4) + "return {0};\n".format(name)filecontent += UnityCodeGen.Tab(3) + "}\n"for index in range(len(transposed[name])):filecontent += UnityCodeGen.Tab(3) + "if(MultilingualUtil.CurrentLanguage == (LANGUAGE_TYPE){0})\n".format(index+1)filecontent += UnityCodeGen.Tab(3) + "{\n"filecontent += UnityCodeGen.Tab(4) + "return {0};\n".format(transposed[name][index] + name)filecontent += UnityCodeGen.Tab(3) + "}\n"filecontent += UnityCodeGen.Tab(3) + "return null;\n"filecontent += UnityCodeGen.Tab(2) + "}\n"filecontent += UnityCodeGen.Tab(1) + "}\n"filecontent += "}\n"# -----------------------table cfg manager class-----------------------filecontent += "\n"tableclassmgrname = tablebasename + "CfgMgr"filecontent += "public class " + tableclassmgrname + "\n"filecontent += "{\n"filecontent += UnityCodeGen.Tab(1) + "private static " + tableclassmgrname + " mInstance;\n"filecontent += UnityCodeGen.Tab(1) + "\n"filecontent += UnityCodeGen.Tab(1) + "public static " + tableclassmgrname + " Instance\n"filecontent += UnityCodeGen.Tab(1) + "{\n"filecontent += UnityCodeGen.Tab(2) + "get\n"filecontent += UnityCodeGen.Tab(2) + "{\n"filecontent += UnityCodeGen.Tab(3) + "if (mInstance == null)\n"filecontent += UnityCodeGen.Tab(3) + "{\n"filecontent += UnityCodeGen.Tab(4) + "mInstance = new " + tableclassmgrname + "();\n"filecontent += UnityCodeGen.Tab(3) + "}\n"filecontent += UnityCodeGen.Tab(3) + "\n"filecontent += UnityCodeGen.Tab(3) + "return mInstance;\n"filecontent += UnityCodeGen.Tab(2) + "}\n"filecontent += UnityCodeGen.Tab(1) + "}\n"# 获得keylistkeylist = []for index in fields:value = table.cell(4, index).valueif value == KEY_MODIFIER_NAME:keylist.append(index)# 根据keylist判断keylen = keylist.__len__()uselist = (keylen != 1)filecontent += "\n"if uselist:filecontent += UnityCodeGen.Tab(1) + "private List<{0}> mList = new List<{0}>();\n".format(tableclassname)else:fieldtype = table.cell(2, keylist[0]).valuekeytype = FieldFormat.Type2format[fieldtype][1]filecontent += UnityCodeGen.Tab(1) + "private Dictionary<{0}, {1}> mDict = new Dictionary<{0}, {1}>();\n".format(keytype, tableclassname)filecontent += UnityCodeGen.Tab(1) + "\n"if uselist:filecontent += UnityCodeGen.Tab(1) + "public List<{0}> List\n".format(tableclassname)else:filecontent += UnityCodeGen.Tab(1) + "public Dictionary<{0}, {1}> Dict\n".format(keytype, tableclassname)filecontent += UnityCodeGen.Tab(1) + "{\n"if uselist:filecontent += UnityCodeGen.Tab(2) + "get {return mList;}\n"else:filecontent += UnityCodeGen.Tab(2) + "get {return mDict;}\n"filecontent += UnityCodeGen.Tab(1) + "}\n"# Deserialize函数filecontent += "\n"filecontent += UnityCodeGen.Tab(1) + "public void Deserialize (DynamicPacket packet)\n"filecontent += UnityCodeGen.Tab(1) + "{\n"filecontent += UnityCodeGen.Tab(2) + "int num = (int)packet.PackReadInt32();\n"filecontent += UnityCodeGen.Tab(2) + "for (int i = 0; i < num; i++)\n"filecontent += UnityCodeGen.Tab(2) + "{\n"filecontent += UnityCodeGen.Tab(3) + tableclassname + " item = new " + tableclassname + "();\n"filecontent += UnityCodeGen.Tab(3) + "item.Deserialize(packet);\n"if uselist:filecontent += UnityCodeGen.Tab(3) + "mList.Add(item);\n"else:keyname = table.cell(3, keylist[0]).valuefilecontent += UnityCodeGen.Tab(3) + "if (mDict.ContainsKey(item.{0}))\n".format(keyname)filecontent += UnityCodeGen.Tab(3) + "{\n"filecontent += UnityCodeGen.Tab(4) + "mDict[item.{0}] = item;\n".format(keyname)filecontent += UnityCodeGen.Tab(3) + "}\n"filecontent += UnityCodeGen.Tab(3) + "else\n"filecontent += UnityCodeGen.Tab(3) + "{\n"filecontent += UnityCodeGen.Tab(4) + "mDict.Add(item.{0}, item);\n".format(keyname)filecontent += UnityCodeGen.Tab(3) + "}\n"filecontent += UnityCodeGen.Tab(2) + "}\n"filecontent += UnityCodeGen.Tab(1) + "}\n"# GetData函数if keylen == 1: # 有一个key值使用dict取值fieldtype = table.cell(2, keylist[0]).valuekeytype = FieldFormat.Type2format[fieldtype][1]keyname = table.cell(3, keylist[0]).valuefilecontent += UnityCodeGen.Tab(1) + "\n"filecontent += UnityCodeGen.Tab(1) + "public {0} GetDataBy{1}({2} {3})\n".format(tableclassname, keyname, keytype, keyname.lower())filecontent += UnityCodeGen.Tab(1) + "{\n"filecontent += UnityCodeGen.Tab(2) + "if(mDict.ContainsKey({0}))\n".format(keyname.lower())filecontent += UnityCodeGen.Tab(2) + "{\n"filecontent += UnityCodeGen.Tab(3) + "return mDict[{0}];\n".format(keyname.lower())filecontent += UnityCodeGen.Tab(2) + "}\n"filecontent += UnityCodeGen.Tab(2) + "\n"filecontent += UnityCodeGen.Tab(2) + "return null;\n"filecontent += UnityCodeGen.Tab(1) + "}\n"elif keylen > 1: # 有多个key值filecontent += UnityCodeGen.Tab(1) + "\n"filecontent += UnityCodeGen.Tab(1) + "public " + tableclassname + " GetDataBy"keycount = 0for keyindex in keylist:keyval = table.cell(3, keyindex).valuefilecontent += keyvalif keycount < (keylen - 1):filecontent += "And"keycount += 1filecontent += "("keycount = 0for keyindex in keylist:keytype = table.cell(2, keyindex).valuekeytype = FieldFormat.Type2format[keytype][1]keyval = table.cell(3, keyindex).valuekeyval = keyval.lower()filecontent += keytype + " " + keyvalif keycount < (keylen - 1):filecontent += ", "keycount += 1filecontent += ")\n"filecontent += UnityCodeGen.Tab(1) + "{\n"filecontent += UnityCodeGen.Tab(2) + "foreach (" + tableclassname + " data in mList)\n"filecontent += UnityCodeGen.Tab(2) + "{\n"filecontent += UnityCodeGen.Tab(3) + "if ("keycount = 0for keyindex in keylist:keyval1 = table.cell(3, keyindex).valuekeyval2 = keyval1.lower()filecontent += "data." + keyval1 + " == " + keyval2if keycount < (keylen - 1):filecontent += " && "keycount += 1filecontent += ")\n"filecontent += UnityCodeGen.Tab(3) + "{\n"filecontent += UnityCodeGen.Tab(4) + "return data;\n"filecontent += UnityCodeGen.Tab(3) + "}\n"filecontent += UnityCodeGen.Tab(2) + "}\n"filecontent += UnityCodeGen.Tab(2) + "\n"filecontent += UnityCodeGen.Tab(2) + "return null;\n"filecontent += UnityCodeGen.Tab(1) + "}\n"for name in transposed:filecontent += UnityCodeGen.Tab(1) + "public string GetMultiLang{0}({1} cfg)\n".format(name,tableclassname)filecontent += UnityCodeGen.Tab(1) + "{\n"filecontent += UnityCodeGen.Tab(2) + "if(MultilingualUtil.CurrentLanguage == 0)\n"filecontent += UnityCodeGen.Tab(2) + "{\n"filecontent += UnityCodeGen.Tab(3) + "return cfg.{0};\n".format(name)filecontent += UnityCodeGen.Tab(2) + "}\n"for index in range(len(transposed[name])):filecontent += UnityCodeGen.Tab(2) + "if(MultilingualUtil.CurrentLanguage == (LANGUAGE_TYPE){0})\n".format(index+1)filecontent += UnityCodeGen.Tab(2) + "{\n"filecontent += UnityCodeGen.Tab(3) + "return cfg.{0};\n".format(transposed[name][index] + name)filecontent += UnityCodeGen.Tab(2) + "}\n"filecontent += UnityCodeGen.Tab(2) + "return null;\n"filecontent += UnityCodeGen.Tab(1) + "}\n"filecontent += "}\n"# 保存path = filepath.replace(EXCEL_DIR, "")path = UnityCodeDir + pathpath = os.path.splitext(path)[0]path = path.split("_")[0]path = path + "Cfg" + ".cs"# 生成文件目录, 不重复创建目录filedir = os.path.dirname(path)if os.path.exists(filedir) == False:os.makedirs(filedir)file = open(path, "wb")file.write(filecontent.encode())file.close()# 生成配置管理类@staticmethoddef GenConfigMangerCode(files):path = UnityCodeDir + "ConfigManager.cs"filecontent = "\n"filecontent += "//-----------------------------------------------\n"filecontent += "// 生成代码不要修改\n"filecontent += "//-----------------------------------------------\n"filecontent += "\n"filecontent += "using System.Collections;\n"filecontent += "using System.Collections.Generic;\n"filecontent += "using UnityEngine;\n"filecontent += "using System.IO;\n"filecontent += "\n"filecontent += "public class ConfigManager\n"filecontent += "{\n"# 生成字段for file in files:tablebasename = os.path.basename(file)tablebasename = tablebasename.split(".")[0]tablebasename = tablebasename.split("_")[0]filecontent += UnityCodeGen.Tab(1) + "public static " + tablebasename + "CfgMgr "filecontent += "_"+tablebasename+"CfgMgr"filecontent += " = " +tablebasename+"CfgMgr.Instance; \n"# Deserialize函数filecontent += UnityCodeGen.Tab(1) + "private static void Deserialize(DynamicPacket dynamicPacket)\n"filecontent += UnityCodeGen.Tab(1) + "{\n"for file in files:tablebasename = os.path.basename(file)tablebasename = tablebasename.split(".")[0]tablebasename = tablebasename.split("_")[0]filecontent += UnityCodeGen.Tab(2) + tablebasename + "CfgMgr.Instance.Deserialize(dynamicPacket);\n"filecontent += UnityCodeGen.Tab(1) + "}\n"# LoadCsv函数filecontent += UnityCodeGen.Tab(1) + "\n"filecontent += UnityCodeGen.Tab(1) + "public static void LoadConfig(string cfgdatapath)\n"filecontent += UnityCodeGen.Tab(1) + "{\n"filecontent += UnityCodeGen.Tab(2) + "FileStream fileStream = new FileStream(cfgdatapath, FileMode.Open, FileAccess.Read);\n"filecontent += UnityCodeGen.Tab(2) + "BinaryReader binaryReader = new BinaryReader(fileStream);\n"filecontent += UnityCodeGen.Tab(2) + "int cnt = binaryReader.ReadInt32();\n"filecontent += UnityCodeGen.Tab(2) + "byte[] bytes = binaryReader.ReadBytes(cnt);\n"filecontent += UnityCodeGen.Tab(2) + "DynamicPacket dynamicPacket = new DynamicPacket(bytes);\n"filecontent += UnityCodeGen.Tab(2) + "Deserialize(dynamicPacket);\n"filecontent += UnityCodeGen.Tab(2) + "binaryReader.Close();\n"filecontent += UnityCodeGen.Tab(2) + "fileStream.Close();\n"filecontent += UnityCodeGen.Tab(1) + "}\n"# LoadCsv函数filecontent += UnityCodeGen.Tab(1) + "\n"filecontent += UnityCodeGen.Tab(1) + "public static void LoadConfig(byte[] bytes)\n"filecontent += UnityCodeGen.Tab(1) + "{\n"filecontent += UnityCodeGen.Tab(2) + "byte[] newBytes = new byte[bytes.Length];\n"filecontent += UnityCodeGen.Tab(2) + "for (int i = 4; i < bytes.Length; i++)\n"filecontent += UnityCodeGen.Tab(2) + "{\n"filecontent += UnityCodeGen.Tab(3) + "newBytes[i - 4] = bytes[i];\n"filecontent += UnityCodeGen.Tab(2) + "}\n"filecontent += UnityCodeGen.Tab(2) + "DynamicPacket dynamicPacket = new DynamicPacket(newBytes);\n"filecontent += UnityCodeGen.Tab(2) + "Deserialize(dynamicPacket);\n"filecontent += UnityCodeGen.Tab(1) + "}\n"filecontent += "}\n"# 保存file = open(path, "wb")file.write(filecontent.encode())file.close()
完整项目链接:https://github.com/dazhu-z/UnityExcelTool
如果遇到打开文件失败类的问题

可以先创建对应文件夹
相关文章:
Unity的Excel转表工具
该Excel工具主要由Python语言完成,版本为3.x 主要功能: 1.转换后的数据存储结构为二进制。 2.excel文件可以选择多种数据类型:int、float、string、一维(int、float、string)、二维int、Map(int/int、in…...
静态随机存储器(SRAM):高速缓存的奥秘
目录 基本的静态存储单元阵列 基本的SRAM逻辑结构 1. 概述 2. SRAM阵列 3. 行选择器(Row Decoder) 4. 列选择器(Column Decoder) 5. 读写电路 6. 控制电路 7. 工作过程 SRAM的读/写时序 SRAM 结构概述 读操作时序 读…...
Linux CentOS 7 服务器集群硬件常用查看命令
(一)查看内核:uname -a [rootcdh1 ~]# uname -a Linux cdh1.macro.com 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux(二)查看系统:cat /etc/redhat-releas…...
《Windows API每日一练》5.4 键盘消息和字符集
本节我们将通过实例来说明不同国家的语言、字符集和字体之间的差异,以及Windows系统是如何处理的。 本节必须掌握的知识点: 第31练:显示键盘消息 非英语键盘问题 字符集和字体 第32练:显示默认字体信息 第33练:创建逻…...
【uniapp】uniapp开发微信小程序入门教程
HBuilderx中uniapp开发微信小程序入门教程 一、 环境搭建 1. HBuilderx下载安装 HBuilderx下载安装地址 2. 微信开发者工具下载安装 微信开发者工地址具下载安装 二、创建uniapp项目 选择:文件>新建>项目>uni-app 输入项目名称>选择默认模板>…...
Python爬虫项目集:豆瓣电影排行榜top250
关于整理日常练习的一些爬虫小练习,可用作学习使用。 爬取项目以学习为主,尽可能使用更多的模块进行练习,而不是最优解。 爬虫概要 示例python 库爬取模块request解析模块BeautifulSoup存储类型list(方便存入数据库)…...
34-Openwrt uhttpd与rpcd
uhttpd作为一个简单的web服务器,其代码量并不多,而且组织结构比较清楚。和其它网络服务器差不多,其main函数进行一些初始化(首先parse config-file,然后parse argv),然后进入一个循环࿰…...
uni app 树状结构数据展示
树状数据展示,可以点击item 将点击数据给父组件 ,满足自己需求。不喜勿喷,很简单可以根据自己需求改哈,不要问,点赞收藏就好。其实可以和上一篇文章uni app 自定义 带popup弹窗的input组件-CSDN博客结合使用ÿ…...
KVM在线yum源部署-centos 7
一、虚拟化简介 虚拟化就是操作系统里嵌套操作系统,一台服务器买回来,可能只是用作一个http服务,资源不能充分利用,而虚拟化的诞生有效解决了这个问题,以硬件资源上使用虚拟化,实现单硬件多系统,充分挖掘硬件性能,节能增效。同时通过多年的改进发展,虚拟化进化成云服务…...
TSF的服务发现与Consul有何区别?
TSF(腾讯服务框架)和Consul都是用于服务发现的工具,但它们在设计理念、功能特性、集成方式等方面存在一些区别。 ### 设计理念和目标 **Consul** 是一个开源的工具,用于服务发现、配置和分段。它提供了一种简单的方式来注册和发现服务,以及健康检查和键值存储功能。Consul…...
kotlin集合框架
1、集合框架的接口类型对比 2、不可变和可变List fun main() {// 不可变List - 不能删除或添加元素val intList: List<Int> listOf(1,2,3)intList.forEach{println(it) // 1 2 3}println("")// 可变List - 可以删除或添加元素val mutableList mutableListO…...
服务器(Linux系统的使用)——自学习梳理
root表示用户名 后是机器的名字 ~表示文件夹,刚上来是默认的用户目录 ls -a 可以显示出隐藏的文件 蓝色的表示文件夹 白色的是文件 ll -a 查看详细信息 total表示所占磁盘总大小 一般以KB为单位 d开头表示文件夹 -代表文件 后面得三组rwx分别对应管理员用户-组…...
竞赛选题 python+opencv+深度学习实现二维码识别
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 pythonopencv深度学习实现二维码识别 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:3分 该项目较为新颖&…...
Java读取指定 JAR 包路径中的 git.properties 文件
Java读取指定 JAR 包路径中的 git.properties 文件 在上述代码中,首先打开 JAR 文件,获取 git.properties 文件的 JarEntry 对象,如果存在该条目,就获取其输入流进行后续的读取和处理。具体的读取和处理逻辑需要根据您的实际需求在…...
逻辑回归(Logistic Regression)及其在机器学习中的应用
🚀时空传送门 🔍逻辑回归原理📕Sigmoid函数🎈逻辑回归模型 📕损失函数与优化🎈损失函数🚀优化算法 🔍逻辑回归的应用场景🍀使用逻辑回归预测客户流失使用scikit-learn库实…...
【计算机视觉】人脸算法之图像处理基础知识【七】
直方图均衡化 直方图均衡化是一种常用的图像处理技术,用于改善图像的对比度,特别是在图像的细节被埋没在暗部或亮部区域时。通过重新分配图像的像素强度值,使得图像的整体对比度增强,从而让更多的细节变得可见。 import cv2 imp…...
家政预约小程序14权限配置
目录 1 创建用户2 创建角色3 启用登录4 实现退出总结 我们现在小程序端的功能基本开发好了,小程序开发好之后需要给运营人员提供管理后台,要分配账号、配置权限,我们本篇就介绍一下权限如何分配。 1 创建用户 在微搭中,用户分为内…...
解决 vue 项目一直出现 sockjs-node/info?t=问题
其实如果是在开发环境,应该是开发的时候网络环境变更导致,比如你切换无线网络,导致开发服务器的IP地址换了,这样开发服务器会不知道如何确定访问源。开发环境中关闭npm dev server,然后重新npm run serve重新构建服务环…...
麒麟信安系统关闭core文件操作
在使用麒麟信安系统时,如果应用程序运行过程中崩溃了,此时并不会导致内核崩溃,只会在tmp目录下产生崩溃数据,如下图 不过tmp目录下的分区容量有限,当崩溃的应用core文件过大时将会占用tmp空间,导致tmpfs分区…...
微信小程序轮播图
效果图 详情可见 微信小程序 参照:swiper | uni-app官网 代码: <!--轮播图-- > <swiper interval"2000" autoplay"true" circular"true" style"height: 300px;"><swiper-item style&qu…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
