设为首页 收藏本站
查看: 857|回复: 0

[经验分享] installshield安装程序,包括Mysql初始化、安装jre、配置环境变量、简单注册码生成

[复制链接]

尚未签到

发表于 2016-10-24 03:03:21 | 显示全部楼层 |阅读模式
曾经使用installshield制作的安装程序,包括Mysql初始化、安装jre、配置环境变量、简单注册码生成。
////////////////////////////////////////////////////////////////////////////////
//                                                                           
//  File Name: Setup.rul                                                  
//                                                                           
//  Description: InstallShield script                                       
//                                                                           
//  Comments: This script was generated based on the selections you made in
//            the Project Wizard.  Refer to the help topic entitled "Modify     
//            the script that the Project Wizard generates" for information
//    on possible next steps.
//
/////////////////////////////////////////////an///////////////////////////////////
// Include header files
#include "ifx.h"
////////////////////// string defines ////////////////////////////
//////////////////// installation declarations ///////////////////
// ----- DLL function prototypes -----
// your DLL function prototypes
// ---- script function prototypes -----
// your script function prototypes
// your global variables
NUMBER volumeNum;
//Before using the GetVolumeInformation API you will need to prototype it
prototype KERNEL32.GetVolumeInformation(BYREF STRING, BYREF STRING, NUMBER, BYREF NUMBER, BYREF NUMBER, BYREF NUMBER, BYREF STRING, NUMBER);
//prototype for the custom InstallScript function
prototype GetVolumeSerial();
//function definition
function GetVolumeSerial()
STRING lpRootPathName;
STRING lpVolumeNameBuffer;
NUMBER nVolumeNameSize;
NUMBER lpVolumeSerialNumber;
NUMBER lpMaximumComponentLength;
NUMBER lpFileSystemFlags;
STRING lpFileSystemNameBuffer;
NUMBER nFileSystemNameSize;
BOOL APIReturn;
begin
lpRootPathName="d:\\";
nVolumeNameSize=60;
nFileSystemNameSize=60;
//APIReturn=GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize,   lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize);
APIReturn=GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize,   lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize);
if (APIReturn) then        
volumeNum = lpVolumeSerialNumber ;
if (volumeNum < 0) then
volumeNum = 0 - volumeNum;
endif;     
//NumToStr(volumeNum,lpVolumeSerialNumber);
//SprintfBox(INFORMATION, "", "Volume= %s\nVolume Serial= %d", lpRootPathName, lpVolumeSerialNumber);
if (volumeNum > 2139999999 - 135792468) then      
//volumeNum = 123456789;
volumeNum = volumeNum - volumeNum/100000000*100000000;
endif;     
else                    
volumeNum = 123456789;
//MessageBox("Failure.",0);
endif;
end ;
prototype getNumString();
function getNumString()
number numSpace;
number numMen;
string tmpString;
begin                                       
//tmpNum = GetWindowHandle(HWND_INSTALL);  //安装主窗口的句柄
//numSpace = GetDiskSpace("c:\\"); //指定驱动器上的空闲磁盘空间
numSpace = GetDiskSpaceEx("c:\\",KBYTES); //指定驱动器上的空闲磁盘空间        BYTES
//numMen = GetMemFree();  //运行在Microsoft Windows下的一个应用程序可用的内存大小   
numMen = GetDiskSpaceEx("d:\\",KBYTES);
if numSpace < 10000 then
numSpace = 11360000;
else
numSpace = (numSpace - numSpace/10000*10000)*10000;
endif;
if numMen < 10000 then
numMen = 7521;  
else
numMen = numMen - numMen/10000*10000;
endif;                                                  
volumeNum = 100000000 + numSpace + numMen;
//NumToStr(tmpString,volumeNum);     
// MessageBox(tmpString,0);                           
end;  

//////////////////////////////////////////////////////////////////////////////
//                                                                          
//  FUNCTION:   OnFirstUIBefore                                          
//                                                                          
//  EVENT:      FirstUIBefore event is sent when installation is run for the first
//              time on given machine. In the handler installation usually displays
//              UI allowing end user to specify installation parameters. After this
//              function returns, ComponentTransferData is called to perform file
//              transfer.
//                                                                          
///////////////////////////////////////////////////////////////////////////////
function OnFirstUIBefore()
number  nResult,nSetupType;
string  szTitle, szMsg;
string  szLicenseFile, szQuestion;
string  szName, szCompany, szSerial;
string  szFile;
string  szTargetPath;
string  szDir;
string  szfolder;
string  szComponents, szTargetdir;
number  nLevel;
LIST    listStartCopy;
LIST    list;
number  nvSize;   
string szField1, svEdit1,szField2, svEdit2;
string localNum;  
number tmpNum;     
string tmpCheckString;
string checkString;
begin
// TO DO: if you want to enable background, window title, and caption bar title                                                                    
// SetTitle( @TITLE_MAIN, 24, WHITE );                                       
// SetTitle( @TITLE_CAPTIONBAR, 0, BACKGROUNDCAPTION );                    
// Enable( FULLWINDOWMODE );        
// Enable( BACKGROUND );        
// SetColor(BACKGROUND,RGB (0, 128, 128));      
GetVolumeSerial();                    
//getNumString();
tmpNum =  volumeNum;            
tmpNum = tmpNum - tmpNum / 100 * 100;  
NumToStr(tmpCheckString,tmpNum);   
if (tmpCheckString == "0") then
tmpCheckString = "0X";
endif;
checkString = "B" + tmpCheckString + "_";     
tmpNum =  volumeNum / 100;            
tmpNum = tmpNum - tmpNum / 100 * 100;  
NumToStr(tmpCheckString,tmpNum);   
if (tmpCheckString == "0") then
tmpCheckString = "0X";
endif;
checkString = checkString + "K" + tmpCheckString + "_";
tmpNum =  volumeNum / 10000;            
tmpNum = tmpNum - tmpNum / 100 * 100;  
NumToStr(tmpCheckString,tmpNum);  
if (tmpCheckString == "0") then
tmpCheckString = "0X";
endif;
checkString = checkString + "X" + tmpCheckString + "_";
tmpNum =  volumeNum / 1000000;            
tmpNum = tmpNum - tmpNum / 100 * 100;  
NumToStr(tmpCheckString,tmpNum);
if (tmpCheckString == "0") then
tmpCheckString = "0X";
endif;
checkString = checkString + "T" + tmpCheckString;
//MessageBox(checkString,INFORMATION);
//变换volumeNum的值
//B3242_K423_X342_T3423   
volumeNum = volumeNum + 135792468;           
NumToStr(localNum,volumeNum);                                                   
//MessageBox(localNum,INFORMATION);
//copy images                                                                                                                                 
nResult = XCopyFile(SRCDIR ^ "xxx\\icons\\media\\*.gif", "c:\\xxx\\icons\\media\\",EXCLUDE_SUBDIR);                                                                                                
nResult = XCopyFile(SRCDIR ^ "xxx\\icons\\teacher\\*.jpg", "c:\\xxx\\icons\\teacher\\",EXCLUDE_SUBDIR);   
CreateDir("c:\\xxx\\resc\\");                     
if (nResult != 0) then      
MessageBox ("图片拷贝出错!", SEVERE);
endif;


nSetupType = TYPICAL;
TARGETDIR = PROGRAMFILES ^@COMPANY_NAME ^@PRODUCT_NAME;
szDir = TARGETDIR;
SHELL_OBJECT_FOLDER = @FOLDER_NAME;
szName    = "";
szCompany = "";
szSerial = "";
Dlg_Start:
// beginning of dialogs label
Dlg_SdWelcome:
szTitle = "xxxx系统";
szMsg   = "  确定是否继续安装?继续请按【下一步(next)】";
nResult = SdWelcome( szTitle, szMsg );
if (nResult = BACK) goto Dlg_Start;
//Dlg_SdLicense:
//    szLicenseFile = SUPPORTDIR ^ "license.txt";
//    szTitle    = "xxxx系统";
//    szMsg      = "许可协议";
//    szQuestion = "您是否接受该协议?接受请按【是(Yes)】。继续安装必须接受该协议。";
//    nResult    = SdLicense( szTitle, szMsg, szQuestion, szLicenseFile );
//    if (nResult = BACK) goto Dlg_SdWelcome;
Dlg_SdShowInfoList:     
//szFile = SUPPORTDIR ^ "infolist.txt";
//list = ListCreate( STRINGLIST );
//ListReadFromFile( list, szFile );
szTitle = "系统本地编号";
szMsg    = "将下面的本地编号发送给权限授予机构,在接收到相应的注册码后,您将进行继续注册!";     
szField1 = "编号";
svEdit1 = localNum;
//nResult  = SdShowInfoList( szTitle, szMsg, list );
//ListDestroy( list );   
nResult = SdShowDlgEdit1(szTitle, szMsg,szField1, svEdit1);      
//if (nResult = BACK) goto Dlg_SdLicense;
if (nResult = BACK) goto Dlg_SdWelcome;
Dlg_SdRegisterUserEx:
szMsg   = "请输入:用户名、公司名和注册号";
szTitle = "xxxx系统";      
nResult = SdRegisterUserEx( szTitle, szMsg, szName, szCompany, szSerial );
if (nResult = BACK) goto Dlg_SdShowInfoList;
if (szSerial != checkString)  then     
MessageBox( "注册码输入错误!", SEVERE);
goto Dlg_SdRegisterUserEx;   
endif;
Dlg_SdShowDlgEdit2:
szTitle = "数据库信息";
szMsg    = "请输入数据库用户名和数据库密码:";      
szField1 = "用户名";
szField2 = "密码";
svEdit1 = "root";
svEdit2 = "password";     
nResult = SdShowDlgEdit2(szTitle, szMsg,szField1,szField2, svEdit1,svEdit2);
if (nResult = BACK) goto Dlg_SdRegisterUserEx;
//SdShowMsg ("下面进行数据库初始化操作,请勿手动关闭弹出窗口!", TRUE);
//Delay(2);
//启动mysql                                 
LaunchAppAndWait("net","start mysql",WAIT);
//LaunchAppAndWait("net","stop mysql",WAIT);
//LaunchAppAndWait("C:\\Program Files\\MySQL\\MySQL Server 4.1\\bin\\mysql.exe"," -uroot -ppassword<" + SRCDIR ^ "test.sql",NOWAIT);
// LaunchAppAndWait("C:\\Program Files\\MySQL\\MySQL Server 4.1\\bin\\mysql.exe"," -h localhost  -u root   -p password<" + SRCDIR ^ "test.sql",WAIT) ;
//LaunchApp(WINDIR ^ "Notepad.exe",SRCDIR ^ "init.sql");
//LaunchAppAndWait(SRCDIR ^ "sql.bat"," root password ",WAIT);
///LaunchAppAndWait("C:\\Program Files\\MySQL\\MySQL Server 4.1\\bin\\mysql.exe ","mysql  -uroot -ppassword<" + SRCDIR ^ "test.sql",NOWAIT);
nResult = XCopyFile(SRCDIR + "\\sql.bat","c:\\xxx\\",EXCLUDE_SUBDIR);   
nResult = XCopyFile(SRCDIR + "\\init.sql","c:\\xxx\\",EXCLUDE_SUBDIR);   
//if (LaunchAppAndWait(SRCDIR + "\\sql.bat", " root password",WAIT) < 0) then
//MessageBox ("数据库创建失败!请确您的系统中已安装MySQL 4.1.19.\n如仍无法解决,请联系系统供应商!",SEVERE);
//endif;         
//NumToStr(tmpCheckString,LaunchAppAndWait("c:\\xxx\\sql.bat", " root password",WAIT));                                                            
//MessageBox(tmpCheckString,SEVERE);   
if (LaunchAppAndWait("c:\\xxx\\sql.bat", " " + svEdit1 + " " + svEdit2 + " ",WAIT) < 0) then
MessageBox ("数据库创建失败!请确您的系统中已安装MySQL 4.1.19.\n如仍无法解决,请联系系统供应商!",SEVERE);
endif;  
//DeleteDir("c:\\xxx\\",ALLCONTENTS); //删除这个临时目录         
DeleteFile("c:\\xxx\\sql.bat");
DeleteFile("c:\\xxx\\init.sql");

Dlg_SdAskDestPath:
szTitle = "xxxx系统";
szMsg   = "请选择安装目录";
nResult = SdAskDestPath( szTitle, szMsg, szDir, 0 );
TARGETDIR = szDir;                                
//if (nResult = BACK) goto Dlg_SdRegisterUserEx;
if (nResult = BACK) goto Dlg_SdShowDlgEdit2;
Dlg_SetupType:  
szTitle    = "xxxx系统";
szMsg      =  "请选择安装类型";
nResult = SetupType ( szTitle , szMsg , "" , nSetupType , 0 );
if (nResult = BACK) then
goto Dlg_SdAskDestPath;
else
nSetupType = nResult;
if (nSetupType != CUSTOM) then
szTargetPath = TARGETDIR;
nvSize = 0;
ComponentCompareSizeRequired(MEDIA,szTargetPath,nvSize);
if (nvSize != 0) then     
MessageBox( szSdStr_NotEnoughSpace, WARNING );
goto Dlg_SetupType;
endif;
endif;  
endif;
Dlg_SdComponentTree:
if ((nResult = BACK) && (nSetupType != CUSTOM)) goto Dlg_SetupType;
szTitle    = "xxxx系统";
szMsg      = "";
szTargetdir = TARGETDIR;
szComponents = "";
nLevel = 2;
if (nSetupType = CUSTOM) then
nResult = SdComponentTree(szTitle, szMsg, szTargetdir, szComponents, nLevel);
if (nResult = BACK) goto Dlg_SetupType;
endif;
Dlg_ObjDialogs:
nResult = ShowObjWizardPages(nResult);
if (nResult = BACK) goto Dlg_SdComponentTree;
Dlg_SdSelectFolder:
szfolder = SHELL_OBJECT_FOLDER;
szTitle    = "xxxx系统";
szMsg      = "";
nResult    = SdSelectFolder( szTitle, szMsg, szfolder );
SHELL_OBJECT_FOLDER = szfolder;
if (nResult = BACK) goto Dlg_ObjDialogs;
Dlg_SdStartCopy:
szTitle = "xxxx系统";
szMsg   = "安装信息收集完毕,并且获得安装权限,下一步将进行文件拷贝。";
listStartCopy = ListCreate( STRINGLIST );
//The following is an example of how to add a string(szName) to a list(listStartCopy).
//eg. ListAddString(listStartCopy,szName,AFTER);
nResult = SdStartCopy( szTitle, szMsg, listStartCopy );
ListDestroy(listStartCopy);
if (nResult = BACK) goto Dlg_SdSelectFolder;
// setup default status
SetStatusWindow(0, "");
Enable(STATUSEX);
StatusUpdate(ON, 100);
return 0;
end;
///////////////////////////////////////////////////////////////////////////////
//
//  FUNCTION:   OnMoving
//
//  EVENT:      Moving event is sent when file transfer is started as a result of
//              ComponentTransferData call, before any file transfer operations
//              are performed.
//
///////////////////////////////////////////////////////////////////////////////
function OnMoving()
string szAppPath;
begin
// Set LOGO Compliance Application Path
// TO DO : if your application .exe is in a subfolder of TARGETDIR then add subfolder
szAppPath = TARGETDIR;
RegDBSetItem(REGDB_APPPATH, szAppPath);
RegDBSetItem(REGDB_APPPATH_DEFAULT, szAppPath ^ @PRODUCT_KEY);
end;
// --- include script file section ---
function OnEnd()                                    
// //string  java_home, catalina_home, szKey, szEnv;
// string  szKey, szEnv, svClassPath;      
// string icon_dir, xml_dir,output_dir;
// number nRegSize;
// pointer pEnv;
begin              
//      
//   //catalina_home=TARGETDIR + "\\tomcat5.0.30";
//   //java_home=TARGETDIR + "\\j2sdk1.4.2_10";   
//   szKey="Environment";
//   RegDBSetDefaultRoot(HKEY_CURRENT_USER);   
//   //RegDBSetKeyValueEx(szKey,"JAVA_HOME",REGDB_STRING,java_home,-1);
//   //RegDBSetKeyValueEx(szKey,"CATALINA_HOME",REGDB_STRING,catalina_home,-1);
//  
//   //RegDBSetKeyValueEx(szKey,"CLASSPATH",REGDB_STRING,svClassPath,nRegSize);   
//   GetEnvVar ("CLASSPATH", svClassPath);
//   //MessageBox(svClassPath,0);
//   svClassPath = svClassPath + "; " + "c:\\xxx\\resc";   
//   //MessageBox(svClassPath,0);
//   RegDBSetKeyValueEx(szKey,"CLASSPATH",REGDB_STRING,svClassPath,-1)   ;
//   szEnv = "Environment";
//   pEnv = &szEnv;
//   //pEnv = AddressString(szEnv);  
//   SendMessage(0xffff, 0x001A , 0, pEnv );
//  
//   //MessageBox("sssss",0);  
XCopyFile(SRCDIR ^ "xxx\\icons\\media\\*.gif",TARGETDIR,EXCLUDE_SUBDIR);
XCopyFile(SRCDIR ^ "xxx\\icons\\teacher\\*.jpg",TARGETDIR,EXCLUDE_SUBDIR);  
CreateDir(TARGETDIR ^ "resc\\");   
end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////下面是一些设定tomcat或者jdk的环境变量的代码/////////////非本系统/////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function OnEnd()   
string  java_home, catalina_home, szKey, szEnv;      
string icon_dir, xml_dir,output_dir;
POINTER pEnv;
begin              
catalina_home=TARGETDIR + "\\tomcat5.0.30";
java_home=TARGETDIR + "\\j2sdk1.4.2_10";   
szKey="Environment";
RegDBSetDefaultRoot(HKEY_CURRENT_USER);   
RegDBSetKeyValueEx(szKey,"JAVA_HOME",REGDB_STRING,java_home,-1);
RegDBSetKeyValueEx(szKey,"CATALINA_HOME",REGDB_STRING,catalina_home,-1);
szEnv = "Environment";
pEnv = &szEnv;
SendMessage (0xffff, 0x001A , 0, pEnv );

  
  
  对应的 vb
注册码解码的核心程序(KeyGen.frm)如下:
  
  

VERSION 5.00
Begin VB.Form keyGen
Appearance      =   0  'Flat
BackColor       =   &H80000001&
BorderStyle     =   5  'Sizable ToolWindow
Caption         =   "**系统注册码生成器"
ClientHeight    =   1290
ClientLeft      =   60
ClientTop       =   330
ClientWidth     =   4545
DrawMode        =   1  'Blackness
FillStyle       =   0  'Solid
LinkTopic       =   "Form1"
MaxButton       =   0   'False
MinButton       =   0   'False
OLEDropMode     =   1  'Manual
ScaleHeight     =   1290
ScaleMode       =   0  'User
ScaleWidth      =   4545
ShowInTaskbar   =   0   'False
StartUpPosition =   1  '所有者中心
Begin VB.CommandButton genButton
Appearance      =   0  'Flat
BackColor       =   &H80000001&
Caption         =   "生成"
Height          =   300
Left            =   3480
MaskColor       =   &H80000001&
Style           =   1  'Graphical
TabIndex        =   4
Top             =   240
UseMaskColor    =   -1  'True
Width           =   615
End
Begin VB.TextBox snText
Appearance      =   0  'Flat
BackColor       =   &H80000001&
Height          =   300
Left            =   960
Locked          =   -1  'True
TabIndex        =   3
Top             =   720
Width           =   3135
End
Begin VB.TextBox machineText
Appearance      =   0  'Flat
BackColor       =   &H80000001&
Height          =   300
Left            =   960
TabIndex        =   2
Top             =   240
Width           =   2295
End
Begin VB.Label snLabel
Alignment       =   2  'Center
Appearance      =   0  'Flat
BackColor       =   &H80000001&
BackStyle       =   0  'Transparent
Caption         =   "注册码"
ForeColor       =   &H80000008&
Height          =   255
Left            =   240
TabIndex        =   1
Top             =   840
Width           =   735
End
Begin VB.Label machineLabel
Alignment       =   2  'Center
Appearance      =   0  'Flat
BackColor       =   &H80000001&
BackStyle       =   0  'Transparent
Caption         =   "机器码"
ForeColor       =   &H80000008&
Height          =   255
Left            =   240
TabIndex        =   0
Top             =   360
Width           =   735
WordWrap        =   -1  'True
End
End
Attribute VB_Name = "keyGen"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False

Private Sub genButton_Click()
Dim distNum As Double
Dim intTmp As Double
Dim mid As Long
Dim strSN As String
If (VBA.Trim(machineText) <> "") Then
If (IsNumeric(VBA.Trim(machineText)) And VBA.Trim(machineText) > 135792468 And VBA.Trim(machineText) < 2139999999) Then
distNum = machineText
Else
distNum = 123456789 + 135792468
End If
distNum = distNum - 135792468
strSN = "B"
intTmp = distNum
mid = intTmp - Fix(intTmp / 100) * 100
If mid = 0 Then
strSN = strSN + "0X"
Else
strSN = strSN + VBA.Trim(Str(mid))
End If
strSN = strSN + "_"
strSN = strSN + "K"
intTmp = Fix(intTmp / 100)
mid = intTmp - Fix(intTmp / 100) * 100
If mid = 0 Then
strSN = strSN + "0X"
Else
strSN = strSN + VBA.Trim(Str(mid))
End If
strSN = strSN + "_"
strSN = strSN + "X"
intTmp = Fix(intTmp / 100)
mid = intTmp - Fix(intTmp / 100) * 100
If mid = 0 Then
strSN = strSN + "0X"
Else
strSN = strSN + VBA.Trim(Str(mid))
End If
strSN = strSN + "_"
strSN = strSN + "T"
intTmp = Fix(intTmp / 100)
mid = intTmp - Fix(intTmp / 100) * 100
If mid = 0 Then
strSN = strSN + "0X"
Else
strSN = strSN + VBA.Trim(Str(mid))
End If
snText = strSN
End If
End Sub


  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-290283-1-1.html 上篇帖子: 摘要   本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同, 下篇帖子: 采用C3P0连接池解决spring+hibernate+mysql 访问空闲8小时后自动断开连接的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表