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…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
