实现的功能:可以实现公钥的管理
功能1:可以有保存开启公钥
功能2: 可以单个删除、批量删除
功能3:可以添加公钥
#include "../lib/slas_common.h" #include "../lib/log_defines.h" #include "../lib/slas_paths.h" #include "../lib/slas_defines.h" #include "../lib/slas_structs.h" #include "../lib/slas.h" #include "../lib/utils.h" #include "../lib/cgi.h" #include "../lib/libpq-fe.h" #include "../libso/sessplan.h" #include "../libso/session.h" #include "../libso/logs.h" //#define PULIC_KTY "/storage/etc/ssh_public/" #define PULIC_KTY "/etc/ssh_public/" int CheckXm(char *); int CheckRecord(char *); int CheckB64(char *); void changejh(char *); typedef struct _ManagementList{ char key[1024]; char name[256]; struct _ManagementList *next; }ManagementList; /* //获取公钥列表 int ManListGet(char *user, ManagementList* head, int public_key){ FILE *fp = NULL, *fp_name = NULL; char temp_key[1024]; char temp_name[512]; char path_key[1024]; char path_key1[512]; char path_name[1024]; char cmd[512]; int count = 0; sprintf(path_key, "%s%s_authorized_keys", PULIC_KTY, user); sprintf(path_key1, "%s%s_authorized_keys.un", PULIC_KTY, user); sprintf(path_name, "%s%s_authorized_name", PULIC_KTY, user); if(public_key){//开启公钥 if (!access(path_key, F_OK)){ while(fgets(temp_key, 1024, fp)){ ManagementList *newnode = (ManagementList *)malloc(sizeof(ManagementList)); strcpy(newnode->key, path_key); sprintf(newnode->name, "公钥-%d\n", count); if (!(fp_name = fopen(path_name, "a+"))) //写入对应的公钥名称 { return -1; } fputs(newnode->name, fp_name); newnode->next = NULL; if(head->next == NULL){ head->next = newnode; node = head->next; }else { node->next = newnode; node = node->next; } count++; } } }else{ if (NULL != access(path_key, F_OK)){ return -1 } memset(cmd, 0, sizeof(cmd)); sprintf(cmd, "mv -f %s %s", path_key, path_key1);//读取没有开启的公钥文件 system(cmd); chmod(path_key1, 0600); while(fgets(temp_key, 1024, fp)){ ManagementList *newnode = (ManagementList *)malloc(sizeof(ManagementList)); strcpy(newnode->key, path_key); sprintf(newnode->name, "公钥-%d\n", count); if (NULL == (fp_name = fopen(path_name, "a+"))) return -5; //写入对应的公钥名称 fputs(newnode->name, fp_name); newnode->next = NULL; if(head->next == NULL){ head->next = newnode; node = head->next; }else { node->next = newnode; node = node->next; } count++; } } fclose(fp); return count; } */ int ManListAdd(char *user, char *description, char *keyname, int public_key) { FILE *fp = NULL, *fp1 = NULL; // char cmd[256]; char path[1024]; char path1[1024]; char path2[1024]; int sgin_key = 0, sgin_key1 = 0; memset(path, 0, sizeof(path)); memset(path1, 0, sizeof(path1)); memset(path2, 0, sizeof(path2)); sprintf(path, "%s%s_authorized_keys", PULIC_KTY, user); sprintf(path1, "%s%s_authorized_keys.un", PULIC_KTY, user); sprintf(path2, "%s%s_authorized_name", PULIC_KTY, user); if (access(path, F_OK)){ sgin_key = 1; } if (access(path1, F_OK)){ sgin_key1 = 1; } if(sgin_key == 1 && sgin_key1 == 1){ if(public_key==1){ if (NULL == (fp = fopen(path, "a+"))){ printf("open file failed %s:%s\n",path,strerror(errno)); return -1; } }else{ if (NULL == (fp = fopen(path1, "a+"))){ printf("open file failed %s:%s\n",path,strerror(errno)); return -1; } } } else if(!sgin_key){ if (NULL == (fp = fopen(path, "a+"))){ printf("open file failed %s:%s\n",path,strerror(errno)); return -1; } fprintf(fp, "%s\n", description); } else { if (NULL == (fp = fopen(path1, "a+"))){ printf("open file failed %s:%s\n",path,strerror(errno)); return -1; } fprintf(fp, "%s\n", description); } if (NULL == (fp1 = fopen(path2, "a+"))){ printf("open file failed %s:%s\n",path2,strerror(errno)); return -1; } fprintf(fp1, "%s\n", keyname); fclose(fp); fclose(fp1); // memset(cmd, 0, sizeof(cmd)); // sprintf(cmd, "mv -f %s.swap %s", path, path1); //system(cmd); chmod(path, 0600); chmod(path1, 0600); return 0; } int Pub_keyGet(char *user){ FILE *fp = NULL; char temp[10]; char path[1024]; sprintf(path, "%s%s_key", PULIC_KTY, user); if (access(path, F_OK)) return 0; if (NULL == (fp = fopen(path, "r"))) return -1; fgets(temp, 9, fp); if(!strncmp(temp, "false",5)){ return 0; }else{ return 1; } } int Pub_keySet(int public_key, char *user) { FILE *fp = NULL; char path[1024]; memset(path, 0, sizeof(path)); sprintf(path, "%s%s_key", PULIC_KTY, user); if (NULL == (fp = fopen(path, "w+"))){ printf("open file failed %s:%s\n",path,strerror(errno)); return -1; } if(public_key == 0) fprintf(fp, "false\n"); else fprintf(fp, "true\n"); fclose(fp); chmod(path, 0666); return 0; } /* int Delstr(int pubilc_key, char *user, char *delstr){ FILE *fp = NULL, *fp2 = NULL, *fp_name = NULL, *fp_name1 = NULL; char path[1024], path1[1024], path_name[1024], buf[1024], buftemp[1024], path_name1[1024]; int i = 0, sgin = 1, sgin_key = 0, sgin_key1 = 0; memset(path, 0, sizeof(path)); memset(path1, 0, sizeof(path1)); memset(path_name, 0, sizeof(path_name)); if (access(path, F_OK)){ sgin_key = 1; } if (access(path1, F_OK)){ sgin_key1 = 1; } if(pubilc_key){ sprintf(path, "%s%s_authorized_keys", PULIC_KTY, user); if (NULL == (fp = fopen(path, "r"))){ printf("open file failed %s:%s\n",path,strerror(errno)); return -1; } while(fgets(buf, 1024, fp)){ strcpy(buftemp,buf); if(strncmp(buf,delstr,strlen(buf)-1)) //起始key不符合 { fputs(buftemp, fp2); //写入新文件 i++; continue; }else{ sgin = i; } } sprintf(path, "%s%s_authorized_name", PULIC_KTY, user); if (NULL == (fp_name = fopen(path_name, "w+"))){ printf("open file failed %s:%s\n",path,strerror(errno)); return -1; } while(fgets(buf, 1024, fp_name)){ strcpy(buftemp,buf); if(sgin!= i) //起始key不符合 { fputs(buftemp, fp2); //写入新文件 continue; } } fclose(fp); fclose(fp_name); fclose(fp2); if(access(path1,F_OK) == 0) { rename(path1,path); } }else{ sprintf(path, "%s%s_authorized_keys", PULIC_KTY, user); if (NULL == (fp = fopen(path, "w+"))){ printf("open file failed %s:%s\n",path,strerror(errno)); return -2; } sprintf(path1, "%s%s_authorized_keys.un", PULIC_KTY, user); if (NULL == (fp2 = fopen(path1, "r"))){ printf("open file failed %s:%s\n",path,strerror(errno)); return -2; } while(fgets(buf, 1024, fp2)){ strcpy(buftemp,buf); if(strncmp(buf,delstr,strlen(buf)-1)) //起始key不符合 { fputs(buftemp, fp); //写入新文件 continue; }else{ sgin = i++; trace("sgin=%d\n\n", sgin); } i++; } sprintf(path_name1, "%s%s_authorized_name.un", PULIC_KTY, user); if (NULL == (fp_name1 = fopen(path_name1, "w+"))){ printf("open file failed %s:%s\n",path,strerror(errno)); return -2; } sprintf(path_name, "%s%s_authorized_name", PULIC_KTY, user); if (NULL == (fp_name = fopen(path_name, "r"))){ printf("open file failed %s:%s\n",path,strerror(errno)); return -3; } i=0; while(fgets(buf, 1024, fp_name)){ strcpy(buftemp,buf); if(sgin != i) //起始key不符合 { fputs(buftemp, fp_name1); //写入新文件 continue; } i++; } fclose(fp); fclose(fp2); fclose(fp_name); fclose(fp_name1); if(access(path1,F_OK) == 0) { rename(path,path1); } if(access(path1,F_OK) == 0) { rename(path_name1,path_name); } } return 0; } */ int Delstr(int pubilc_key, char *user, char *delstr){ FILE *fp_name = NULL, *new_fp_name = NULL, *fp_key = NULL, *new_fp_key =NULL; char path_key[1024], new_path_key[1024], path_name[1024], new_path_name[1024], buf[1024], *str1 = NULL, *tok1 = NULL; int i = 0, ii = 0, iii=0, strvalue[1024], sgin = 0; memset(path_key, 0, sizeof(path_key)); memset(new_path_key, 0, sizeof(new_path_key)); memset(path_name, 0, sizeof(path_name)); memset(new_path_name, 0, sizeof(new_path_name)); memset(strvalue, 0, sizeof(strvalue)); for(str1 = strtok_r(delstr, ",", &tok1); NULL != str1; str1 = strtok_r(NULL, ",", &tok1)){ strvalue[ii] = atoi(str1); ii++; } --ii; if(pubilc_key){ sprintf(path_key, "%s%s_authorized_keys", PULIC_KTY, user); if (NULL == (fp_key = fopen(path_key, "r"))){ printf("open file failed %s:%s\n",path_key,strerror(errno)); return -1; } sprintf(new_path_key, "%s%s_authorized_keys.new", PULIC_KTY, user); if (NULL == (new_fp_key = fopen(new_path_key, "w+"))){ printf("open file failed %s:%s\n",new_path_key,strerror(errno)); return -1; } i = 0; for(i=0; fgets(buf, 1024, fp_key); i++){ for(iii=0; iii<= ii; iii++){ if(strvalue[iii] == i){ sgin = 1; } } if( sgin != 1) //起始key不符合 { fputs(buf, new_fp_key); //写入新文件 continue; } sgin = 0; } sprintf(path_name, "%s%s_authorized_name", PULIC_KTY, user); if (NULL == (fp_name = fopen(path_name, "r"))){ printf("open file failed %s:%s\n",path_name,strerror(errno)); return -1; } sprintf(new_path_name, "%s%s_authorized_name.new", PULIC_KTY, user); if (NULL == (new_fp_name = fopen(new_path_name, "w+"))){ printf("open file failed %s:%s\n",new_path_name,strerror(errno)); return -1; } i = 0; for(i=0;fgets(buf, 1024, fp_name); i++){ for(iii=0; iii<= ii; iii++){ if(strvalue[iii] == i){ sgin= 1; } } if( sgin != 1) //起始key不符合 { fputs(buf, new_fp_name); //写入新文件 continue; } sgin = 0; } fclose(fp_key); fclose(new_fp_key); fclose(fp_name); fclose(new_fp_name); rename(new_path_key,path_key); rename(new_path_name,path_name); }else{ sprintf(new_path_key, "%s%s_authorized_keys.un.new", PULIC_KTY, user); if (NULL == (new_fp_key = fopen(new_path_key, "w+"))){ printf("open file failed %s:%s\n",new_path_key,strerror(errno)); return -2; } sprintf(path_key, "%s%s_authorized_keys.un", PULIC_KTY, user); if (NULL == (fp_key = fopen(path_key, "r"))){ printf("open file failed %s:%s\n",path_key,strerror(errno)); return -3; } for(i=0; fgets(buf, 1024, fp_key); i++){ for(iii=0; iii<= ii; iii++){ if(strvalue[iii] == i){ sgin = 1; } } if( sgin != 1) //起始key不符合 { fputs(buf, new_fp_key); //写入新文件 continue; } sgin = 0; } sprintf(new_path_name, "%s%s_authorized_name.un", PULIC_KTY, user); if (NULL == (new_fp_name = fopen(new_path_name, "w+"))){ printf("open file failed %s:%s\n",new_path_name,strerror(errno)); return -2; } sprintf(path_name, "%s%s_authorized_name", PULIC_KTY, user); if (NULL == (fp_name = fopen(path_name, "r"))){ printf("open file failed %s:%s\n", path_name,strerror(errno)); return -3; } for(i=0;fgets(buf, 1024, fp_name); i++){ for(iii=0; iii<= ii; iii++){ if(strvalue[iii] == i){ sgin= 1; } } if( sgin != 1) //起始key不符合 { fputs(buf, new_fp_name); //写入新文件 continue; } sgin = 0; } fclose(fp_key); fclose(new_fp_key); fclose(fp_name); fclose(new_fp_name); rename(new_path_key,path_key); rename(new_path_name,path_name); /* memset(cmd, 0, sizeof(cmd)); sprintf(cmd, "mv -f %s %s", new_path_key, path_key); system(cmd); chmod(path_key, 0600); memset(cmd, 0, sizeof(cmd)); sprintf(cmd, "mv -f %s %s", new_path_name, path_name); system(cmd); chmod(path_name, 0600);*/ } return 0; } void showhtml(u_int64 session, char *user){ int count = 0, i = 0, public_key = 0, sgin_key = 0, sgin_key1 = 0; ManagementList *head = NULL; ManagementList *node = NULL; head = (ManagementList *)malloc(sizeof(ManagementList)); head->next = NULL; memset(head,0,sizeof(ManagementList)); FILE *fp = NULL, *fp1 = NULL, *fp_name = NULL; char path_key[1024]; char path_key1[2048]; char path_name[1024]; char buf[2048]; char cmd[512]; sprintf(path_key, "%s%s_authorized_keys", PULIC_KTY, user); sprintf(path_key1, "%s%s_authorized_keys.un", PULIC_KTY, user); sprintf(path_name, "%s%s_authorized_name", PULIC_KTY, user); if (access(path_key, F_OK)){ sgin_key = 1; } if (access(path_key1, F_OK)){ sgin_key1 = 1; } public_key = Pub_keyGet(user); if(public_key == -1){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('公钥开启文件打开失败',function(){history.back();});</script></body></html>"); return; } if(public_key==1){//开启公钥1 if (sgin_key==1 && sgin_key1 == 1){ if(!(fp = fopen(path_key, "w+"))){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('公钥备注列表打开失败',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); return; } fclose(fp); }else{ if(!sgin_key1){ memset(cmd, 0, sizeof(cmd)); sprintf(cmd, "mv -f %s %s", path_key1, path_key);//读取没有开启的公钥文件 system(cmd); chmod(path_key, 0666); if(!(fp = fopen(path_key, "r"))){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('公钥备注列表打开失败',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); return; } if (!(fp_name = fopen(path_name, "r"))) //写入对应的公钥名称 { printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('获取公钥备注列表错误1',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); return; } while(fgets(path_key, 1024, fp) && fgets(buf, 1024, fp_name)){ ManagementList *newnode = (ManagementList *)malloc(sizeof(ManagementList)); strncpy(newnode->key, path_key, strlen(path_key)-1); strncpy(newnode->name, buf, strlen(buf)-1); newnode->next = NULL; if(head->next == NULL){ head->next = newnode; node = head->next; }else { node->next = newnode; node = node->next; } count++; } fclose(fp); fclose(fp_name); }else{ if (access(path_key, F_OK)){ if (!(fp = fopen(path_key, "w+"))) //写入对应的公钥名称 { printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('获取公钥备注列表错误1',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); return; } }else{ if(!(fp = fopen(path_key, "r"))){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('公钥备注列表打开失败',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); return; } } if (access(path_name, F_OK)){ if (!(fp_name = fopen(path_name, "w+"))) //写入对应的公钥名称 { printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('获取公钥备注列表错误1',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); return; } }else{ if (!(fp_name = fopen(path_name, "r"))) //写入对应的公钥名称 { printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('获取公钥备注列表错误1',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); return; } } while(fgets(path_key, 1024, fp) && fgets(buf, 1024, fp_name)){ ManagementList *newnode = (ManagementList *)malloc(sizeof(ManagementList)); strncpy(newnode->key, path_key, strlen(path_key)-1); strncpy(newnode->name, buf, strlen(buf)-1); newnode->next = NULL; if(head->next == NULL){ head->next = newnode; node = head->next; }else { node->next = newnode; node = node->next; } count++; } fclose(fp); fclose(fp_name); } } }else{//读取没有开启的公钥文件 if (sgin_key==1 && sgin_key1 == 1){ if(!(fp1 = fopen(path_key1, "w+"))){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('公钥备注列表打开失败',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); return; } fclose(fp1); }else{ if(!sgin_key){ memset(cmd, 0, sizeof(cmd)); sprintf(cmd, "mv -f %s %s", path_key, path_key1);//读取没有开启的公钥文件 system(cmd); chmod(path_key1, 0666); if(!(fp1 = fopen(path_key1, "r"))){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('公钥备注列表打开失败',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); return; } }else{ if(!(fp1 = fopen(path_key1, "r"))){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('公钥备注列表打开失败',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); return; } } if (access(path_name, F_OK)){ if (!(fp_name = fopen(path_name, "w+"))) //写入对应的公钥名称 { printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('获取公钥备注列表错误1',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); return; } }else{ if (!(fp_name = fopen(path_name, "r"))) //写入对应的公钥名称 { printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('获取公钥备注列表错误1',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); return; } } while(fgets(path_key, 1024, fp1) && fgets(buf, 1024, fp_name)){ ManagementList *newnode = (ManagementList *)malloc(sizeof(ManagementList)); strncpy(newnode->key, path_key, strlen(path_key)-1); strncpy(newnode->name, buf, strlen(buf)-1); newnode->next = NULL; if(head->next == NULL){ head->next = newnode; node = head->next; }else { node->next = newnode; node = node->next; } count++; } fclose(fp1); fclose(fp_name); } } node = head->next; printf("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"); printf("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"); printf("<head>\n"); printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\" />\n"); printf("<link href=\"/bh/style/middle_style.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"); printf("<script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script>\n"); printf("<script src=\"/bh/pjs/jquery.wresize.js\" type=\"text/javascript\"></script>\n"); printf("<script src=\"/bh/pjs/contentboxdivresiez.js\" type=\"text/javascript\"></script>\n"); printf("<script src=\"/bh/pjs/tab_style.js\" type=\"text/javascript\"></script>\n"); printf("<script src=\"/bh/pjs/table_litmenu_100.js\" type=\"text/javascript\"></script>\n"); printf("<script src=\"/bh/pjs/bindpage.js\" type=\"text/javascript\"></script>\n"); printf("<script src=\"/bh/pjs/common.js\" language=\"javascript\" type=\"text/javascript\"></script>\n"); printf("<script src=\"/bh/pjs/bh_user.js\" language=\"javascript\" type=\"text/javascript\"></script>"); printf("<script type=\"text/javascript\"> \n"); printf("$(function(){\n"); printf(" tabEvent(\"#tabledivbox\");\n"); printf(" litmenu(\"#tabledivbox\");\n"); printf(" wwinsize(0,180);//传入合适高度\n"); printf(" \n"); printf(" //阻止冒泡\n"); printf(" $(\"#content tbody tr td:first input:checkbox\").click(function(event){\n"); printf(" event.stopPropagation();\n"); printf(" });\n"); if(public_key == 1){ printf(" $(\"#public_key\").prop(\"checked\",true); \n"); }else printf(" $(\"#public_key\").prop(\"checked\",false); \n"); printf("})\n"); printf("</script>\n"); printf("</head>\n"); printf("<body>\n"); printf("<form action=\"\" method=\"post\" name=\"frm\">\n"); printf("<input type=\"hidden\" name=\"tasktype\" id=\"tasktype\" value=\"\">\n"); printf("<input type=\"hidden\" name=\"session\" id=\"session\" value=\"%llu\">\n",session); printf("<input type=\"hidden\" name=\"delstr\" id=\"delstr\" value=\"\">\n"); printf("<div class=\"head-box\" style=\"width:auto;border-left:1px solid #d8d8d8;border-right:1px solid #d8d8d8\">\n"); printf(" <h3 class=\"now\">ssh public key</h3>\n"); printf(" <div class=\"guolvbox divrightbox\">\n"); printf(" <span _style=\"margin-top:2px\"><label><input type=\"checkbox\" name=\"public_key\" id=\"public_key\" value=\"1\">是否开启公钥</label></span>\n"); printf(" </div>"); printf("</div>\n"); printf("<div id=\"tabledivbox\" >\n"); printf("<!--此div为小菜单--><div id=\"poslitmenubox\"><div id=\"poslitmenu\"></div></div>\n"); printf("<!--表头-->\n"); printf("<div style=\"border:1px solid #ccc;border-top:none;width:100%%;position:absolute;height:29px;z-index:0;margin-left:-1px;\">\n"); printf("</div>\n"); printf("<div class=\"faux-head\">\n"); printf("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"width:100%%;\" id=\"tab-head\">\n"); printf("<thead>\n"); printf("<tr>\n"); printf("<th style=\"width:50px;\"><input type=\"checkbox\" name=\"d_all\" id=\"d_all\" value=\"CheckAll\" onClick=\"checkall(this,%d,'d');\"/></th>\n", count); printf("<th style=\"width:320px\">公钥名称</th>\n"); printf("<th style=\"background-image:none\">公钥内容</th>\n"); printf("<th style=\"width:120px\" class=\"mangerlei\">管理</th>\n"); printf("</tr>\n"); printf("</thead>\n"); printf("</table>\n"); printf("</div>\n"); printf("<div style=\"height:29px;width:100%%;background:#f2f2f2;\"></div>\n"); printf("<!--此div包含作用为出滚动条-->\n"); printf("<div class=\"tableboabox\">\n"); printf("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"width:100%%;\" id=\"content\">\n"); printf("<!--此处为表格实际宽度,如果表格不需要出现小菜单则把表格宽度设为100%%-->\n"); printf("<tbody>\n"); if(count<0){ // printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('获取公钥备注列表错误%d',function(){top.location.href='/';});</script></body></html>",count); printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('获取公钥备注列表错误%d',function(){history.back();});</script></body></html>",count); return; } while (node){ printf(" <tr>\n"); printf(" <td style=\"width:50px\"><input type=\"checkbox\" name=\"d_%d\" id=\"d_%d\" onclick=\"checkqs(this,%d);\" value=\"%d\"/></td>\n",i,i,i,i); printf(" <td style=\"width:320px\">%s</td>\n", node->name); printf(" <td><span class=\"kill\" style=\"width:300px\">%s</span></td>\n", node->key); printf(" <td class=\"mangerlei\" style=\"width:120px\"><a href=\"#@\" onclick=\"key_del('%d');\">删除</a></td>\n", i); printf(" </tr>\n"); i++; node = node->next; } printf("</tbody>\n"); printf("</table>\n"); printf("</div>\n"); printf("</div>\n"); printf(" <div class=\"diag\" id=\"Dialog01\">\n"); printf(" <div class=\"diag1\">\n"); printf(" <div class=\"head-box-main diagh\">\n"); printf(" <h3 class=\"now diagh3\">公钥列表</h3>\n"); printf(" <a class=\"dialog-close\" onclick=\"closeDialog('#Dialog01')\" href=\"javascript:void(0)\"></a>\n"); printf(" </div>\n"); printf(" <!-- head-box-main end -->\n"); printf(" <div class=\"diag_main\">\n"); printf(" <div class=\"diag_main_c\">\n"); printf(" <ul id=\"TypeList\" class=\"TypeList\">\n"); printf(" <li>\n"); printf(" <span style=\"float:right;\"></span>公钥名称:<input name=\"keyname\" id=\"keyname\" type=\"text\" maxlength=\"32\" class=\"textbox\" value=\"\" style=\"margin-right:20px;\" > \n"); printf(" </li>\n"); printf(" <li>\n"); printf(" <span style=\"float:right;\"></span>公钥内容:\n"); printf(" </li>\n"); printf(" <li>\n"); printf(" <td><textarea name=\"description\" id=\"description\" cols=\"60\" rows=\"5\" onpropertychange=\"if(document.frm.description.value.length>1023) {value=value.substr(0,1023);alert('输入字符已达到最大值!');}\"></textarea></td> \n"); printf(" </li>\n"); printf(" </ul>\n"); printf(" <!-- TypeList end -->\n"); printf(" <div class=\"diag_btn\">\n"); printf(" <a class=\"btn_four_grly\" id=\"save\" onclick=\"Remark_Save();\" href=\"javascript:void(0);\">确定</a>\n"); printf(" <a class=\"btn_four_grly\" id=\"cancel\" onclick=\"Cancel();\" href=\"javascript:void(0);\">返回</a>\n"); printf(" </div>\n"); printf(" <!-- diag_btn -->\n"); printf(" </div>\n"); printf(" <!-- diag_main_c end -->\n"); printf(" </div>\n"); printf(" <!-- diag_main end -->\n"); printf(" <div class=\"diag_footer\"></div>\n"); printf(" \n"); printf(" </div>\n"); printf(" <!-- diag1 end -->\n"); printf(" </div>\n"); printf("<div class=\"fenyelistbox\">\n"); printf("<div class=\"ctrl-btn\" style=\"padding:0;margin-left:-10px;_margin-left:-5px\">"); printf("<a class=\"btn_four_blue\" href=\"#@\" onclick=\"getkeyplanTotalStr('%d');\">批量删除</a>", count); printf(" <a href=\"#@\" class=\"btn_four_grly\" id=\"add\" onclick=\"__getDialog('#Dialog01');\">添加</a></div>\n"); printf(" <a href=\"#@\" class=\"btn_four_grly\" id=\"baocun\" onclick=\"Save();\">保存</a></div>\n"); printf(" </div>\n"); printf("</form>\n"); printf("</body>\n"); printf("<script>\n"); printf("function gettype() {\n"); printf(" var reg_ip = /^((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)$/;\n"); printf(" var reg_ip = /^((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)$/;\n"); printf(" if(!reg_ip.test(document.frm.ip.value)) document.frm.type.value = 1;\n"); printf(" else document.frm.type.value = 0;\n"); printf("}\n"); //保存 printf("function Save(){\n "); printf(" document.frm.tasktype.value = 2;\n"); printf(" document.frm.submit(); \n"); printf("}\n"); printf("function __getDialog(obj){\n"); printf(" var ww = $(window).width(), wh = $(window).height();\n"); printf(" var ow = $(obj).width(), oh = $(obj).height();\n"); printf(" var p = document.documentElement.scrollTop || document.body.scrollTop;\n"); printf(" $(obj).css({\n"); printf(" \"top\":(wh - oh)/2+p > 0 ? (wh - oh)/2+p : 0,\n"); printf(" \"left\":(ww - ow)/2 > 0 ? (ww - ow)/2 :0\n"); printf(" }).fadeIn(\"fast\");\n"); printf(" $(window).wresize(function(){\n"); printf(" var ww = $(window).width(), wh = $(window).height();\n"); printf(" var ow = $(obj).width(), oh = $(obj).height();\n"); printf(" var p = document.documentElement.scrollTop || document.body.scrollTop;\n"); printf(" $(obj).css({\n"); printf(" \"top\":(wh - oh)/2+p > 0 ? (wh - oh)/2+p : 0,\n"); printf(" \"left\":(ww - ow)/2 > 0 ? (ww - ow)/2 :0\n"); printf(" });\n"); printf(" })\n"); printf("} \n"); printf("function Cancel(){\n"); printf(" closeDialog('#Dialog01');\n"); printf("}\n"); printf("function key_del(key){\n"); printf(" confirm(\"确定删除吗?\",function(){\n"); printf(" document.frm.delstr.value = key;\n"); // printf(" document.frm.action = 'key_management.cgi';\n"); printf(" document.frm.tasktype.value = 1;\n"); printf(" document.frm.submit();\n"); printf(" });\n"); printf("}\n"); printf("function getkeyplanTotalStr(count){\n"); printf(" var i;\n"); printf(" var objd;\n"); printf(" document.frm.delstr.value = '';\n"); printf(" for(i=0;i<count;i++){\n"); printf(" objd = document.getElementById(\"d_\"+i);\n"); printf(" if(objd.checked == true){\n"); printf(" document.frm.delstr.value += objd.value + \",\";\n"); printf(" }\n"); printf(" }\n"); printf(" document.frm.tasktype.value = 1;\n"); printf(" document.frm.submit();\n"); printf("}\n"); //备注保存检查 printf("function Remark_Save(){\n"); printf(" if($(\"#keyname\").val()==\"\"){\n"); printf(" alert('请填写公钥名称!');\n"); printf(" return false;\n"); printf(" }\n"); printf(" if($(\"#description\").val()==\"\"){\n"); printf(" alert('请填写操作内容!');\n"); printf(" return false;\n"); printf(" }\n"); printf("\n"); printf(" if($(\"#description\").val().length>1023) {\n"); printf(" //value=value.substr(0,255);\n"); printf(" alert('输入字符已达到最大值!');\n"); printf(" return false;\n"); printf(" }\n"); printf(" var Cts = $(\"#description\").val();\n"); printf(" if(Cts.indexOf(\"\\n\") >= 0 ) {\n"); printf(" alert('公钥名称('+$(\"#keyname\").val()+')输入字符有特殊符号换行符!');\n"); printf(" return false;\n"); printf(" }\n"); printf(" document.frm.tasktype.value = 3;\n"); printf(" document.frm.description.value=$(\"#description\").val();\n"); printf(" document.frm.keyname.value=$(\"#keyname\").val();\n"); printf(" document.frm.submit(); \n"); printf("}\n"); printf("function closeDialog(obj){\n"); printf("$(obj).hide();\n"); printf("}\n"); printf("</script>\n"); printf("</html>\n"); printf("<style type='text/css'> \n"); printf("#ConnectHTML select{margin:4px 0 0 0;}\n"); printf("span.kill{word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}\n"); printf(".fdialog{width:820px;height:280px;overflow:hidden;border-radius:5px;}\n"); printf(".fdialog .dialog-bg{width:2000px;height:2000px;background:#036;opacity:0.8;filter:alpha(opacity=80);}\n"); printf(".fdialog .dialog-cont{width:800px;height:auto;overflow:hidden;margin:10px;padding:0;}\n"); printf(".fdialog .dialog-title,.fdialog .dialog-content{width:100%%;}\n"); printf(".fdialog .dialog-content{height:auto;border:0;padding:0;}\n"); printf(".diag{position:absolute; top:50%%; left:50%%; width:585px; margin-left:-29px; margin-top:-145px;z-index:100; display:none;}\n"); printf(".diag1{background:url(/bh/images/dialog_bg01.gif) 0 0 no-repeat; padding-top:10px;float:left;}\n"); printf(".diagh{border-left: #d8d8d8 1px solid; width: auto; border-right: #d8d8d8 1px solid; margin:0 12px 0 11px; width:560px; float:left;}\n"); printf(".diag_main{background:url(/bh/images/dialog_bg01_h.gif) 0 0 repeat-y;overflow:hidden;float:left;width:585px; }\n"); printf(".diag_main_c{margin:0 12px 0 11px; height:200px;overflow:hidden; overflow-y:auto; float:left; width:560px;}\n"); printf(".TypeList{overflow-y:auto; padding: 5px 10px;}\n"); printf(".TypeList li{ line-height:26px;}\n"); printf(".diag_btn{width:100%%; text-align:center;}\n"); printf(".diag_footer{background:url(/bh/images/dialog_bg01.gif) 0 -179px no-repeat; height:10px; float:left; width:585px;}\n"); printf(".baobiaoremove{ margin-top:5px;}\n"); printf("#zhezhao{position:absolute;top:0;left:0;width:100%%;height:100%%;overflow:hidden;background:#FFF;z-index:98;filter:alpha(opacity=30);-moz-opacity:0.3; -khtml-opacity: 0.3; opacity:0.3; display:none;}\n"); printf("</style>\n"); node = head; while (node){ ManagementList *tmp; if(node->name) free(node->name); tmp = node; node = node->next; free(tmp); } } int main(){ int ret, tasktype = 0, public_key = 0, d_all = 0; u_int64 session; char *description = NULL, *keyname = NULL, *delstr = NULL; char sql[256] ,cuser[256]; memset(cuser,0,sizeof(char)*256); memset(sql,0,sizeof(char)*256); printf("Content-type:text/html\n\n"); if ((ret = CGIArgLoad("Ldssdds","session", &session, "tasktype", &tasktype, "description", &description, "keyname", &keyname, "d_all", &d_all, "public_key", &public_key, "delstr", &delstr))){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('服务器错误(%d)',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", ret, session); return 0; } if (CommandSessionCheck(session, cuser, NULL)){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('系统超时',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); goto _END_; } if (!cuser){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('get user error',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>", session); goto _END_; } if(tasktype == 3){//添加 if((ret = ManListAdd(cuser, description, keyname, public_key))!=0){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('添加失败(%d)',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>\n", ret, session); goto _END_; } } if(tasktype == 2){//保存 if((ret = Pub_keySet(public_key, cuser))!=0){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('保存失败(%d)',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>\n", ret, session); goto _END_; }else{ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('保存成功',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>\n", session); goto _END_; } } if(tasktype == 1){ if(NULL != delstr){ if((ret = Delstr(public_key, cuser, delstr))!=0){ printf("<html><head><link href=\"/bh/style/stystem.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><script src=\"/bh/pjs/jquery-1.4.2.min.js\" type=\"text/javascript\"></script><script>alert('删除失败(%d).',function(){location.href='key_management.cgi?session=%llu';});</script></body></html>\n", ret, session); goto _END_; } } } showhtml(session,cuser); _END_: CGIArgFree(); return 0; }
发表评论
-
jquery 有用代码片段
2016-04-23 19:29 5461、检测Internet Expl ... -
ios 自动播放
2015-11-27 16:42 0wx.ready(function () { ... -
js 判断本地文件
2015-08-18 11:31 668var fso, s=filespec; // fil ... -
js 判断浏览器语言 IE 谷歌 火狐....
2015-03-27 13:42 872方法1: window.navigat ... -
from 提交
2015-02-05 11:33 496<!DOCTYPE html PUBLIC ... -
checked
2015-02-03 10:20 653if($("#FTPFileRecordOp ... -
页面分页
2014-12-10 15:26 775<!DOCTYPE html> &l ... -
linux zip命令
2014-12-08 20:03 0linux zip命令 zip -r myfil ... -
html 点击跳转
2014-12-05 11:34 0printf(" &l ... -
confirm 弹出框上传成功后刷新一次页面
2014-10-16 11:48 748$.ajax({ url:"modm ... -
js 判断 null
2014-09-16 14:21 495var whj = null; if (!whj){ c ... -
父框架 中 有子框架弹出框 并该子框架式一个新的cgi
2014-08-27 10:56 843<div class="diag03& ... -
ie 谷歌浏览器 关于输入框不能复制黏贴
2014-08-26 17:57 755// 下面这段代码输入框禁止修改 但可以复制 & ... -
js正则表达式 运用
2014-08-26 09:50 681var codecheck = /^[a-zA-Z0- ... -
html的一些笔记
2014-08-06 13:55 0style="text-decoration:non ... -
js 之 jQuery 判断是否包含在数组中.inArray()jQuery .tmpl(), .template()
2014-07-25 15:24 2225[img][/img] <!DOCTYPE ... -
json 转换 字符串
2014-07-23 09:59 546将后台程序(如php、cgi)发送过来的json数据转化为ja ... -
处理ie浏览器8以上 9、10、11的双击的bug
2014-07-14 17:38 388实现功能:有一个勾选框 在IE8前是 ok的 代码如下: ... -
IE8 滚动条问题 解决
2014-05-21 15:11 012343214 -
页面下拉框选项追加
2014-05-21 14:55 420项目描述: ...
相关推荐
nodejs010-nodejs-cryptiles-0.2.2-1.el6.centos.alt.noarch.rpm
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
基于麻雀搜索算法优化的深度置信网络(SSA-DBN)参数调整与数据分类预测——以隐藏层节点、迭代次数和学习率为优化目标的MATLAB实现,基于麻雀搜索算法优化深度置信网络(SSA-DBN)的数据分类预测 优化参数为隐藏层节点、迭代次数和学习率 利用交叉验证抑制过拟合问题 matlab代码, ,SSA-DBN; 参数优化; 隐藏层节点; 迭代次数; 学习率; 交叉验证; 过拟合抑制; MATLAB代码,基于SSA-DBN优化的数据分类预测方法:参数优化与过拟合抑制
BeTheme第一次发布于2014年5月21日,自那时以来,已有数以百万计的人下载了BeTheme,其评分为4.8。这个主题是WooCommerce支持的,在此帮助下,您可以制作一个电子商务网站,还可以制作博客、新闻和其他类型的网站。BeTheme 21.5.6 wordpress主题模板特点:放大器支撑多用途主题500+预制件演示单击演示安装移动友好型主题联络表格7支持自转滑块。
基于S7-200智能控制与组态王4x3界面的书架式堆垛立体车库系统设计与应用,基于S7-200和组态王4x3书架式堆垛式立体库立体车库 ,S7-200; 组态王4x3; 书架式堆垛式立体库; 立体车库,基于S7-200与组态王4x3的立体车库系统
1、文件内容:pykde4-akonadi-4.10.5-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pykde4-akonadi-4.10.5-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
基于28379D的异步电机无速度传感器控制:MD500与MD500E滑模同步调制代码研究,各种代码md500代码,异步电机,基于28379D,带无速度传感器控制,参数辨识,同步调制等功能。 还有md500e代码,滑模无感代码,逆变整流代码 ,核心关键词:md500代码; 异步电机; 28379D; 无速度传感器控制; 参数辨识; 同步调制; md500e代码; 滑模无感控制; 逆变整流代码。,基于28379D的MD500电机异步控制系统与参数辨识软件
"可再生能源驱动的热电联供微网经济运行优化研究:基于具体文献的程序复现与MATLAB粒子群算法应用",含可再生能源的热电联供型微网经济运行优化 有具体文献 程序复现 MATLAB粒子群算法 ,核心关键词: 可再生能源; 热电联供型微网; 经济运行优化; 具体文献; 程序复现; MATLAB粒子群算法。,含可再能源热电联供型微网运行优化策略复现于特定文献中的MATLAB模型研究。
1、文件内容:pyserial-2.6-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pyserial-2.6-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
finishBitmap.jpg
"英博尔控制器调速软件全面升级,引领行业新风尚",英博尔控制器调速软件全新 ,英博尔; 控制器; 调速软件; 全新,英博尔控制器调速软件全新升级
电机定子模态频率计算方法及公式在Excel表格中的应用,电机定子模态频率计算公式,公式法,exl表格 ,电机定子模态频率计算公式; 公式法; EXL表格,电机定子模态频率计算方法及公式法在Excel表格中的应用
一、项目简介 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 二、技术实现 jdk版本:1.8 及以上 ide工具:IDEA或者eclipse 数据库: mysql5.5及以上 后端:spring+springboot+mybatis+maven+mysql 前端: vue , css,js , elementui 三、系统功能 1、系统角色主要包括:管理员、用户 2、系统功能 主要功能包括: 用户登录注册 首页 个人中心 修改密码 个人信息 用户管理 管理员管理 问卷管理 题目管理 题目统计 问卷调查管理 新闻资讯管理 轮播图管理 问卷调查 新闻资讯 个人中心 问卷调查记录 后台管理 详见 https://flypeppa.blog.csdn.net/article/details/143189415
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
1、文件内容:pulseaudio-esound-compat-10.0-6.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pulseaudio-esound-compat-10.0-6.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
一种基于Lifelogging视频的文本标签生成模型.pdf
MATLAB仿真:MIMO系统FLMS算法的优化与实现,一个mimo系统的flms算法的MATLAB仿真 ,Mimo系统; FLMS算法; MATLAB仿真,"MIMO系统FLMS算法MATLAB仿真"
"基于S7-200 PLC的组态王燃油锅炉控制系统:详解梯形图接线原理、IO分配及组态画面图解",基于S7-200 PLC和组态王燃油锅炉控制系统 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,S7-200 PLC; 组态王燃油锅炉控制; 梯形图接线图原理图; IO分配; 组态画面,基于S7-200 PLC的燃油锅炉控制系统原理图及IO分配解析
方便暖通工程师及板换用户了解艾普尔板式换热器选型计算,免费使用。