电力设备模块更换APP开发文档

news/2024/11/14 13:01:37/文章来源:https://www.cnblogs.com/lyqfs/p/18543207

电力设备模块更换APP开发文档
一、开发背景:
根据公司指示,有一批设备要进行内置模块安装,同时设备信息要和新装的模块信息进行绑定,即在现场换装的过程中,要记录模块的信息(资产编码)与设备的信息(资产编码),通过信息上传后,到达主站,由后台人员进行信息绑定。
前期,此项工作都是由施工人员对现场的条码进行抄写、拍照上传,但由于工作过程中容易出现失误,或者施工人员书写不规范,遗漏等等问题,造成设备绑定时频频出现错误情况,因此,特开发此App,目的是减轻施工人员的工作量,同时,避免因施工人员误操作或者手写错误,造成不必要的麻烦。
二、系统框架:

系统搭设:
本系统手机端搭设APP软件一套,用于信息采集,数据临时储存、数据上传、数据查询、参数设置以及人员注册、登陆等内容。当数据采集完毕后,会在本地手机中进行存储,等网络畅通或者工作完成后,由施工人员进行上传操作,此时,数据会按照一定的格式进行编码,通过WebService提供的接口上传到服务器中。
服务器端采用WebService来进行数据的接收和处理,将现场的数据信息按照一定的编码格式进行解码,然后储存到数据库中;同时,也能够满足后台管理端的数据请求,按照一定的编码将请求的数据进行编码,提供给后台人员进行查阅和下载。
后台管理端负责将请求的数据进行解码,完成数据查阅和下载,同时,也需要完成部分系统设置,参数、人员、权限等的管理行为。
三、详细说明:
1.结构说明:
本系统采用C#编程语言,数据库为SQLServer数据库,手机本地数据库采用Sqlite数据库。
手机端采用Xamarin.Forms+MVVM形式进行开发,主要包含条形码扫描、数据信息录入、信息查询、数据编码、解码等功能。数据本地存储采用Sqlite数据库进行本地数据暂存,数据采集完毕后需要对数据进行暂存,必要时对数据进行提取,并执行上传操作。
客户机端采用WPF+MVVM的形式进行开发,同时设计C#—Excel的数据操作功能,包括信息读取和写入,数据保存、编码及解码等功能。
服务器端使用腾讯云服务器,通过IIS服务搭建Web服务,对手机端及客户机端的数据请求和数据传输进行接收和信息发送,来完成数据的转存和读取,并响应数据读取的相关请求。
2.系统特点:
2.1.本套系统主要采用MVVM模式,实现代码与界面的分离;
2.2.系统手机端采用版本更新的模式,实现版本的自主更新下载,避免版本错乱问题;
2.3.整个系统架构采用MVVM+三层架构的主要模式,后期易于代码的二次开发和漏洞修改;
2.4.系统开发语言采用C#语言,开发简单,易于维护;
2.5.远程数据库采用SqlServer数据库,可存储大容量的数据记录;
2.6.数据库部分全部采用存储过程,软件开发过程中未使用一条SQL语句;
2.7.手机端本地数据库采用Sqlite进行临时性存储,通过增删改查完成数据的基本操作;

3.软件效果:
3.1.手机端效果:
界面效果

3.2.客户端效果:

3.3.服务端效果:
WebService效果

3.4.服务端效果:

4.部分代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CommandService;
using System.Collections.ObjectModel;
using Xamarin.Forms;
using StringService;
using System.Xml.Linq;
using System.IO;
using Xamarin.Essentials;
using System.Threading;
//using SocketService;
using System.Net.Sockets;
using DataBaseService.SqliteHelper;
using PropertyChangeService;
using ModuleInstall.Services;
using AppTools_WS;
using Models;
namespace ModuleInstall.ViewModels
{
public class MainPageViewModel : PropertyChangedHelper
{
private Taiqu _tq = new Taiqu();
private Meter _meter = new Meter();
private User _User = new User();

    private Recorder _recorder = new Recorder();private MainCommand _meterScanCmd, _moduleScanCmd, _saveCmd, _uploadCmd;private Action<string> _callBack;//private Dal_Module _dalModule = new Dal_Module();/// <summary>/// 用于计数功能,记录设备列表增加的行数;/// </summary>public int Count { set; get; } = 0;public int Index { set; get; } = 0;public bool IsEnabled { set; get; }public string TqName { set { _tq.Name = value; PropertyChange(nameof(TqName)); } get { return _tq.Name; } }public string MeterNum { set { _meter.MeterNum = value; PropertyChange(nameof(MeterNum)); } get { return _meter.MeterNum; } }public string ModuleNum { set { _meter.ModuleNum = value; PropertyChange(nameof(ModuleNum)); } get { return _meter.ModuleNum; } }public string Account { set { _User.Account = value; PropertyChange(nameof(Account)); } get { return _User.Account; } }public string Address { set { _recorder.Address = value; PropertyChange(nameof(Address)); } get { return _recorder.Address; } }public MainCommand MeterScanCmd { get { return _meterScanCmd; } }public MainCommand ModuleScanCmd { get { return _moduleScanCmd; } }public MainCommand SaveCmd { get { return _saveCmd; } }public MainCommand UploadCmd { get { return _uploadCmd; } }public int ScrollIndex { set; get; }public ObservableCollection<Meter> Meters { set; get; } = new ObservableCollection<Meter>();private SqliteHelper Helper;public MainPageViewModel(){}public MainPageViewModel(Action<string> action){InitDatabase();//初始化数据库;_callBack = action;//回调函数进入;_meterScanCmd = new MainCommand(MeterScan);_moduleScanCmd = new MainCommand(ModuleScan);_saveCmd = new MainCommand(Save);_uploadCmd = new MainCommand(Upload2);if (!File.Exists(SystemSettingPageViewModel.filePath) || new FileInfo(SystemSettingPageViewModel.filePath).Length == 0){_callBack("更换台区、人员操作前,请先进行系统设置!");}}/// <summary>/// Json数据读取;从字符串读取到Object(必须为Object)对象;/// </summary>/// <param name="filePath"></param>/// <returns></returns>public SettingModel JsonRead(string filePath){string jsonStr;try{using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)){using (StreamReader sr = new StreamReader(fs)){jsonStr = sr.ReadToEnd();}}return new JsonConvertHelper<SettingModel>().ToObject(jsonStr); //JsonConvert.DeserializeObject<SettingModel>(jsonStr);}catch (Exception ex){throw ex;}}public void InitDatabase(){Helper= new SqliteHelper();}/// <summary>/// 获取指定电能表资产的Id号/// </summary>/// <param name="meterNum"></param>/// <returns></returns>int GetMeterId(string meterNum){int flag;try{flag = Helper.GetMeterId(meterNum);}catch (Exception ex){throw ex;}return flag;}/// <summary>/// 获取指定台区名称的台区Id号;/// </summary>/// <param name="tqName"></param>/// <returns></returns>int GetTqId(string tqName){return Helper.GetTqId(tqName);}/// <summary>/// 获取从本地配置信息中读取的/// </summary>/// <returns></returns>int GetUserId(string Account){///从本地配置文件中获取姓名;return Helper.GetUserId(Account);}/// <summary>/// 电能表扫码方法,扫码后,将码加入到Meters集合列表;/// </summary>/// 定义电表数量,模块数量public int MeterCount = 0, ModuleCount = 0;async void MeterScan(){try{bool flag = false;//判断扫码重复的标志;string num = await new ScanToString().BoxScan();if (num.Length > 15){for (int i = 0; i < Meters.Count; i++){if (Meters[i].MeterNum == num){flag = true;//如果,Meters集合中,存在此模块条码信息,则资产重复,标志为true;}}if (!flag){//var meter = Meters.Where(m => m.ModuleNum == "").First();if (MeterCount>=ModuleCount){Meters.Insert(0,new Meter() { MeterNum = num });MeterCount++;}else{Meters[ModuleCount-MeterCount-1].MeterNum = num;//当前序号处的模块条码由空修改为当前扫描的条码;MeterCount++;               //Count++;//计数指针位增加,后期删除时,指针不能小于0;//Meters.OrderBy<Meter,int>(Meter => Meter.Id).Min();}_callBack(null);//回调函数,更新ListView//num = await new ScanToString().BoxScan();}}}catch{throw;}}async void ModuleScan(){try{bool flag = false;//判断扫码重复的标志;string num = await new ScanToString().BoxScan();if (num.Length > 15){for (int i = 0; i < Meters.Count; i++){if (Meters[i].ModuleNum == num){flag = true;//如果,Meters集合中,存在此模块条码信息,则资产重复,标志为true;}}if (!flag){//var meter = Meters.Where(m => m.ModuleNum == "").First();if(MeterCount<=ModuleCount){Meters.Insert(0,new Meter() { ModuleNum = num });ModuleCount++;}else{Meters[MeterCount-ModuleCount-1].ModuleNum = num;//当前序号处的模块条码由空修改为当前扫描的条码;ModuleCount++;    //Count++;//计数指针位增加,后期删除时,指针不能小于0;//Meters.OrderBy<Meter,int>(Meter => Meter.Id).Min();}_callBack(null);//回调函数,更新ListView //num = await new ScanToString().BoxScan();}}}catch{throw;}}/// <summary>/// 删除本地数据库中的表与模块信息(同时删除);如果不删除,加表,保存,或者在删除,中间回出现问题;/// </summary>/// <param name="meter"></param>public void MeterDelete(string meter){int meterid = Helper.GetMeterId(meter);int recorderId = Helper.GetRecorderId(meterid);if(meterid >0)Helper.Delete<Meter>(meterid);if(recorderId>0)Helper.Delete<Recorder>(recorderId);}/// <summary>/// 保存到本地/// </summary>void Save(){bool isSave = false;try{if (Meters.Count > 0){SettingModel setModel =null;try{setModel = JsonRead(SystemSettingPageViewModel.filePath);}catch{_callBack("更换台区、人员操作前,请先进行系统设置!");//回调函数,显示提示信息;}Account = setModel.Account;TqName = setModel.TqName;Address = setModel.Address;int tqid = GetTqId(TqName);foreach (var meter in Meters){if (meter.ModuleNum != null){meter.TqId = tqid;//判断是否在数据库中存在此表资产,如果不存在,返回结果为0,则添加资产if (GetMeterId(meter.MeterNum) == 0){Helper.Insert<Meter>(meter);Helper.Insert<Recorder>(new Recorder(){MeterId = GetMeterId(meter.MeterNum),UserId = GetUserId(Account),IsUpload = false,//上传标志为false,上传以后更改为true;SaveTime = DateTime.Now,Address = Address});}}else{_callBack("数据结构不完整,请补充完整后保存!");break;}isSave = true;}///-------------还需要确认,两种资产不能够进入//Console.WriteLine("--------------------------------------------保存成功!--------------------------------------");if(isSave){_callBack("数据保存成功!");}}else{_callBack("数据不能为空,请重试操作!");}}catch (NullReferenceException){_callBack("更换台区、人员操作前,请先进行系统设置!");}catch (Exception ex){_callBack($"{ex.ToString()}");}}/// <summary>///第一版: 上传数据到远程服务器,需要从本地数据库中读取,直接操作远程数据库插入数据/// </summary>void Upload1(){////读取本地数据库中的为上传信息,IsUpload==false,转换成Json字符串;////string meterStr=null,recorderStr = null;//ObservableCollection<Recorder> recorders = Helper.GetRecorders(false);//if (recorders.Count > 0)//{//    foreach (var recorder in recorders)//    {//        _meter = Helper.GetMeter(recorder.MeterId);//        ModuleNum = _meter.ModuleNum;//        MeterNum = _meter.MeterNum;//        _dalModule.ModuleAdd(ModuleNum, MeterNum, TqName, Account, recorder.SaveTime, Address);//        //----------------此处需要在本地保存一下,更改一下上传状态;-------------------//        recorder.IsUpload = true;//        Helper.Update(recorder);//更新一下上传状态;//         //recorderStr += new JsonConvertHelper<Recorder>().ToString(recorder);//        //meterStr += new JsonConvertHelper<Meter>().ToString(new SqliteHelper().GetMeter(recorder.MeterId));//        //Console.WriteLine($"保存时间:{recorder.SaveTime},电能表号:{MeterNum},模块号:{ModuleNum}");//    }//    _callBack("数据上传成功!");//}//else//    _callBack("数据为空,请核实后上传!");}/// <summary>/// 通过Socketk客户端进行数据上传//第三版--服务器内存不足,socket无法使用;/// </summary>//void Upload3()//{//    //读取本地数据库中的为上传信息,IsUpload==false,转换成Json字符串;//    //string meterStr=null,recorderStr = null;//    bool isSave=false;//    SocketClient client = null;//    ObservableCollection<Recorder> recorders = Helper.GetRecorders(false);//    ObservableCollection<History> histories = new ObservableCollection<History>();//    JsonConvertHelper<ObservableCollection<History>> jh = new JsonConvertHelper<ObservableCollection<History>>();//    string Msg =string.Empty;//    try//    {//        if (recorders.Count > 0)//        {//            //首先要判断是否有数据,才能进行下一步的链接;//            client = new SocketClient();//            foreach (var recorder in recorders)//            {//                _meter = Helper.GetMeter(recorder.MeterId);//                ModuleNum = _meter.ModuleNum;//                MeterNum = _meter.MeterNum;//                //_dalModule.ModuleAdd(ModuleNum, MeterNum, TqName, Account, recorder.SaveTime, Address);//                History history = new History()//                {//                    ModuleNum = this.ModuleNum,//                    MeterNum = this.MeterNum,//                    TqName = this.TqName,//                    Account = this.Account,//                    SaveTime = recorder.SaveTime,//                    Address = this.Address//                };// SaveTime = recorder.SaveTime,//                //----------------此处需要在本地保存一下,更改一下上传状态;-------------------//                recorder.IsUpload = true;//                Helper.Update(recorder);//更新一下上传状态;//                                        //recorderStr += new JsonConvertHelper<Recorder>().ToString(recorder);//                                        //meterStr += new JsonConvertHelper<Meter>().ToString(new SqliteHelper().GetMeter(recorder.MeterId));//                                        //Console.WriteLine($"保存时间:{recorder.SaveTime},电能表号:{MeterNum},模块号:{ModuleNum}");//                histories.Add(history);//                isSave = true;//            }//            ///将历史数据的对象集合进行序列化;然后将字符串传输到服务器;//            Msg = jh.ToString(histories);//            if (client.SendMsg(Msg))//                _callBack("数据上传成功!");//            else _callBack("数据上传失败!");//回调函数,显示上传结果;//            client.Client.Close();//        }//        else//            _callBack("数据为空,请核实后上传!");//    }//    catch(SocketException)//    {//        _callBack("上传服务器未开启,请开启后再上传数据!");//    }//}/// <summary>/// 第二版:通过WebService上传,服务器端已架设Webservice成功;/// </summary>void Upload2(){//读取本地数据库中的为上传信息,IsUpload==false,转换成Json字符串;//string meterStr=null,recorderStr = null;ObservableCollection<Recorder> recorders = Helper.GetRecorders(false);ObservableCollection<History> histories = new ObservableCollection<History>();JsonConvertHelper<ObservableCollection<History>> jh = new JsonConvertHelper<ObservableCollection<History>>();string Msg = string.Empty;try{if (recorders.Count > 0){//首先要判断是否有数据,才能进行下一步的链接;foreach (var recorder in recorders){_meter = Helper.GetMeter(recorder.MeterId);ModuleNum = _meter.ModuleNum;MeterNum = _meter.MeterNum;History history = new History(){ModuleNum = this.ModuleNum,MeterNum = this.MeterNum,TqName = this.TqName,Account = this.Account,SaveTime = recorder.SaveTime,Address = this.Address};// SaveTime = recorder.SaveTime,histories.Add(history);}///将历史数据的对象集合进行序列化;然后将字符串传输到服务器;Msg = jh.ToString(histories);AppToolsSoapClient msc = new AppToolsSoapClient(AppToolsSoapClient.EndpointConfiguration.AppToolsSoap12);var rtnValue =  msc.DataUpLoad(Msg);if(rtnValue==true){new Thread(() =>{foreach (var recorder in recorders){//----------------此处需要在本地保存一下,更改一下上传状态;-------------------recorder.IsUpload = true;Helper.Update(recorder);//更新一下上传状态;//recorderStr += new JsonConvertHelper<Recorder>().ToString(recorder);//meterStr += new JsonConvertHelper<Meter>().ToString(new SqliteHelper().GetMeter(recorder.MeterId));//Console.WriteLine($"保存时间:{recorder.SaveTime},电能表号:{MeterNum},模块号:{ModuleNum}");}}).Start();_callBack("数据上传成功!");}else _callBack("数据上传失败!");}else_callBack("数据为空,请核实后上传!");}catch (Exception ex){_callBack(ex.ToString ());}}
}

}

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using CommandService;
using System.Collections.ObjectModel;
using DataBaseService.SqliteHelper;
using StringService;
using AppTools_WS;
using System.Linq;
using System.Threading.Tasks;
using Models;
namespace ModuleInstall.ViewModels
{
public class SystemSettingPageViewModel:PropertyChangeService.PropertyChangedHelper
{
private AppToolsSoapClient _client;
private Company _company=new Company ();
private const string fileName = "Config.txt";
private MainCommand _writeSettingCmd;// readCmd;
private Action CallBack;
private SettingModel _settingModel=new SettingModel();
private SqliteHelper sqliteHelper;
private ObservableCollection _companyCollection = new ObservableCollection ();
private ObservableCollection _gongdsCollection = new ObservableCollection();
private ObservableCollection _taiquCollection = new ObservableCollection();
private ObservableCollection _groupCollection = new ObservableCollection();
public ObservableCollection CompanyCollection { set { _companyCollection = value; PropertyChange(nameof(CompanyCollection)); } get { return _companyCollection; } }
public ObservableCollection GongdsCollection { set { _gongdsCollection = value; PropertyChange(nameof(GongdsCollection)); } get { return GongdsCollection; } }
public ObservableCollection TaiQuCollection { set { _taiquCollection = value; PropertyChange(nameof(TaiQuCollection)); } get { return _taiquCollection; } }
public ObservableCollection GroupCollection { set { _groupCollection = value; PropertyChange(nameof(GroupCollection)); } get { return _groupCollection; } }
public Company Comy { get { return _company; } set { _company = value; } }
public ObservableCollection Companies=new ObservableCollection();
public MainCommand WriteSettingCmd { get { return _writeSettingCmd; } }
public SettingModel SetModel { set { _settingModel = value; } get { return _settingModel; } }
public static readonly string filePath=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), fileName);
public SystemSettingPageViewModel(Action callBack)
{
if (_client == null)
_client = new AppToolsSoapClient(AppToolsSoapClient.EndpointConfiguration.AppToolsSoap12);
GetCompanies();
GetGroupes();
if (!File.Exists(filePath))
{
File.Create(filePath);
}
_writeSettingCmd = new MainCommand(JsonWrite);
CallBack = callBack;
//readCmd = new MainCommand(Read);
}
///


/// 通过供电公司名称,获取下属单位供电所的所有内容;
///

///
///
public ObservableCollection GetGongdses(string companyName)
{
ObservableCollection gds = new ObservableCollection();
ArrayOfString strings = _client.GetGdses(companyName);
foreach (string str in strings)
{
gds.Add(str);
}
return gds;
}
public void GetGroupes()
{
try
{
ArrayOfString strings = _client.GetGroups();
foreach (string str in strings)
{
GroupCollection.Add(str);
}

            //GroupCollection=new  Dal_Group().GroupList();}catch (Exception ex){throw ex;}}/// <summary>/// 通过供电所名称,获取下属单位供电台区的所有内容;/// </summary>/// <param name="companyName"></param>/// <returns></returns>public ObservableCollection<string> GetTaiQues(string gdsName){try{ObservableCollection<string> taiqus = new ObservableCollection<string>();ArrayOfString strings = _client.GetTaiQues(gdsName);foreach (string str in strings){taiqus.Add(str);}return taiqus;}catch(Exception ex){ throw ex; }}/// <summary>/// 获取所有供电公司的信息;/// </summary>/// <param name="companyName"></param>/// <returns></returns>void GetCompanies(){try{ArrayOfString strings = _client.GetCompanies();foreach (string str in strings){CompanyCollection.Add(str);}}catch{throw;}}public ObservableCollection<string> GetUsers(string groupName){ObservableCollection<string> os= new ObservableCollection<string>();ArrayOfString Users = _client.GetUsers(groupName);foreach (string o in Users){os.Add(o.ToString());}return os;}/// <summary>/// 将系统设置的信息对象序列化为Json字符串;/// </summary>public void JsonWrite(){try{if(File.Exists(filePath)){File.Delete (filePath);using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.Write)){using (StreamWriter sw = new StreamWriter(fs)){//向配置文件写入配置信息;string jsonStr = new JsonConvertHelper<SettingModel>().ToString(SetModel);//JsonConvert.SerializeObject(SetModel);sw.Write(jsonStr);sw.Flush();sw.Close();fs.Close();}}}sqliteHelper = new SqliteHelper();sqliteHelper.InitData(SetModel.CompanyName, SetModel.GdsName, SetModel.TqName, SetModel.Account);CallBack("保存成功!");}catch(Exception ex){CallBack($"保存失败!{ex.ToString()}");}}
}

}

using System;
using System.Collections.Generic;
using System.Text;
using Models;
using StringService;
using System.Collections.ObjectModel;
using AppTools_WS;
using System.Security.Cryptography.X509Certificates;
using System.IO;
using CommandService;
using DataBaseService.SqliteHelper;
namespace ModuleInstall.ViewModels
{
public class DataSearchViewModel
{
private AppToolsSoapClient _client;
//private Dal_History _dalHistory =new Dal_History ();
private Action _action;
///


/// 未上传数量
///

public int UnUploadCount { set; get; }
///
/// 今日已上传数量
///

public int TodayUploadCount { set; get; }
///
/// 历史上传数量
///

public int UploadHistoryCount { set; get; }

    public SettingModel SetModel { set; get; }public ObservableCollection<History> UploadHistoryList {  get; set; }public DataSearchViewModel(Action<string> action){try{_action = action;if (_client == null)_client = new AppToolsSoapClient (AppToolsSoapClient.EndpointConfiguration.AppToolsSoap12);SetModel = JsonRead(SystemSettingPageViewModel.filePath);//读取配置文件;UnUploadCount = new SqliteHelper().GetUnUploadCount();//从本地获取未上传信息数量;UploadHistoryCount = _client.GetUploadedHistoryCount(SetModel.Account);//获取上传历史记录数量;TodayUploadCount = _client.GetTodayUploadedCount(SetModel.Account);//获取今天上传数量(指定操作人员);}catch {_action("应用使用前,请先进行系统设置!");}}/// <summary>/// Json数据读取;从字符串读取到Object(必须为Object)对象;/// </summary>/// <param name="filePath"></param>/// <returns></returns>public SettingModel JsonRead(string filePath){StreamReader sr = null;try{sr = new StreamReader(filePath);string jsonStr = sr.ReadToEnd();return  new JsonConvertHelper<SettingModel>().ToObject(jsonStr); //JsonConvert.DeserializeObject<SettingModel>(jsonStr);}catch (Exception ex){throw ex;}finally {sr.Close();}}}

}

开发人:QQ-1009714648

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832814.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FANUC发那科工业机器人减速器维修小细节

在现代工业生产中,FANUC发那科机器人已成为不可或缺的一部分。然而,随着时间的推移,发那科机械手减速器可能会出现故障,影响机器人的正常工作。 一、了解减速器的结构与工作原理 在开始FANUC发那科机器人维修之前,了解减速器的结构与工作原理至关重要。FANUC发那科机器人减…

太强了!14.7K star!Windows系统居然还有开源替代版了?!

在操作系统的世界里,Windows 系统一直占据着重要的地位。然而,你可能不知道的是,还有一个拥有 14.7K star 的开源替代版 ——ReactOS。 1、ReactOS 介绍 ReactOS 是一个自由开源的操作系统,其目标是实现与 Windows 系统在二进制级别上的兼容。这意味着,我们可以在这个系统…

HuggingFace 核心组件及应用实战

带着问题来学习什么是Hugging Face?它的目标是什么?Hugging Face 中包含哪些知名的预训练模型?如果我们要在 Hugging Face 中下载 BERT,那么只有一种版本,还是有多种版本可以选择?每一种版本的 BERT 中,只有一种格式还是有多种格式可以适应多种下游任务?Hugging Face 库…

AllPairs工具助力正交表测试用例设计

AllPairs工具助力正交表测试用例设计 正交表法是一种高效的测试方法,特别适用于软件测试中需要处理多个控件及其多种取值组合的情况。以下是对正交表法的详细解释: 一、正交表法概述 正交表法是一种利用正交表来设计测试用例的方法,旨在通过较少的测试次数达到较高的测试覆盖…

SAM4MLLM:结合多模态大型语言模型和SAM实现高精度引用表达分割 | ECCV24

来源:晓飞的算法工程笔记 公众号,转载请注明出处论文: SAM4MLLM: Enhance Multi-Modal Large Language Model for Referring Expression Segmentation论文地址:https://arxiv.org/abs/2409.10542 论文代码:https://github.com/AI-Application-and-Integration-Lab/SAM4MLLM…

信息时代的安全堡垒:500强企业数据安全传输案例解析

数据安全传输,这个是数据安全里一个比较细分的领域,但是包括的传输场景也是很多的,比如隔离网之间的跨网文件传输、企业内外部之间的文件安全外发、总分支之间的数据传输分发、信创环境下的高性能传输、机台等设备的数据采集传输、业务系统之间的自动化传输同步等等。 每家企…

Ubuntu 22.04 LTS 离线安装 Harbor v2.11 (附https认证,Trivy镜像扫描)

Harbor 介绍Harbor是一个开源的企业级Docker Registry服务,它提供了一个安全、可信赖的仓库来存储和管理Docker镜像。Harbor翻译为中文名称为"庇护;居住;"。可以理解为是Docker镜像的"居住环境"或者是镜像的"庇护所"。Harbor最初由VMware公司开…

reposync离线yum源

系统:open Euler 22.03-sp3-x86 reposync ;createrepo 1、配置好yum源 2、下载 下载指定repo到指定目录reposync --repoid EPOL -p /data/EPOL 3、制作镜像仓库cd EPOLcreaterepo .

叮咚!您有一份跨网域跨安全域文件传输方案待查收

跨网域跨安全域文件传输,在很多企业和机构里面,都会存在这样的场景的,比如企业内部会用网络隔离的方式,划分不同的安全域和网段,或者有些机构还有不同的分支机构,就会有不同地域的文件传输需求。 跨网域跨安全域传输的典型应用场景 跨网域跨安全域文件传输的典型应用场景…

rtthread源码completion.c no such file or dir

20241113 从gitee下载rtthread源码,bsp--->stm32--->stm32f407-atk-explorer直接编译报错,如下从百度网盘下载rtthread源码,bsp--->stm32--->stm32f407-atk-explorer编译正常,无错误如果,感到此时的自己很辛苦,那告诉自己:容易走的都是下坡路。坚持住,因为…

团队作业4——项目冲刺-3

团队作业4——项目冲刺-3信息项 内容课程名称 广工计院计科34班软工作业要求位置 作业要求作业目标 小飞棍团队对需求改进和系统设计进行讨论GitHub链接 GitHub一、团队简介队名:小飞棍队团队成员:姓名 学号罗振烘(组长) 3122004748庄崇立 3122004633李响 3121002802何昌洲…