博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
海康威视DS-K1F100-D8E发卡器Java版
阅读量:4156 次
发布时间:2019-05-25

本文共 24307 字,大约阅读时间需要 81 分钟。

防止以后要用,记录下

后端代码 

@Controller@RequestMapping(value = "cardMake")public class CardMakeController extends BaseController {    private String menuId ; // 菜单地址(权限用)    @Resource(name = "memberService")    private MemberManager memberService;    @Resource(name = "cardRecordService")    private CardRecordManager cardRecordService;    private String msg ="";    /**     * @param args the command line arguments     */    static HCUsbSDK hcusbsdk = HCUsbSDK.INSTANCE;    static fDEVInfoCallBack fdeviceCallBack = null;// 报警回调函数实现    static HCUsbSDK.USB_SDK_DEVICE_INFO StruDevceInfo = new HCUsbSDK.USB_SDK_DEVICE_INFO();    static boolean bDevCallBack = false;    public static class fDEVInfoCallBack implements HCUsbSDK.fEnumDeviceCallBack {        public void invoke(HCUsbSDK.USB_SDK_DEVICE_INFO pDevceInfo, Pointer pUser) {            if ((pDevceInfo.szDeviceName[0] == 'D') && (pDevceInfo.szDeviceName[1] == 'S')                    && (pDevceInfo.szDeviceName[2] == '-') && (pDevceInfo.szDeviceName[3] == 'K')) {                StruDevceInfo = pDevceInfo;                String strName = new String(pDevceInfo.szDeviceName);                System.out.println("枚举到的设备信息:" + strName);                bDevCallBack = true;            }        }    }    private static NativeLong login() {        int iError = 0;        boolean bInit = hcusbsdk.USB_SDK_Init();        if (bInit) {            hcusbsdk.USB_SDK_SetLogToFile(3, "C:/USBSDKLog", false);        }        if (fdeviceCallBack == null) {            fdeviceCallBack = new fDEVInfoCallBack();        }        boolean bEnum = hcusbsdk.USB_SDK_EnumDevice(fdeviceCallBack, null);        if (!bEnum) {            iError = hcusbsdk.USB_SDK_GetLastError();            System.out.println("枚举失败,错误码为" + iError);            return null;        }        HCUsbSDK.USB_SDK_USER_LOGIN_INFO struUserLoginInfo = new HCUsbSDK.USB_SDK_USER_LOGIN_INFO();        struUserLoginInfo.dwSize = struUserLoginInfo.size();        struUserLoginInfo.dwTimeout = 5000;        while (true) {            if (bDevCallBack) {                struUserLoginInfo.dwVID = StruDevceInfo.dwVID;                struUserLoginInfo.dwPID = StruDevceInfo.dwPID;                struUserLoginInfo.szUserName = "admin".getBytes();                struUserLoginInfo.szPassword = "12345".getBytes();                struUserLoginInfo.szSerialNumber = StruDevceInfo.szSerialNumber;                break;            }        }        struUserLoginInfo.write();        // System.out.println("dwSize:" +struUserLoginInfo.dwSize );        // System.out.println("dwVID:" +struUserLoginInfo.dwVID );        // System.out.println("dwPID:" +struUserLoginInfo.dwPID );        // System.out.println("szUserName:" + new String(struUserLoginInfo.szUserName).trim() );        // System.out.println("szPassword:" +new String(struUserLoginInfo.szPassword).trim() );        // System.out.println("szSerialNumber:" +new String(struUserLoginInfo.szSerialNumber).trim() );        HCUsbSDK.USB_SDK_DEVICE_REG_RES struRegRes = new HCUsbSDK.USB_SDK_DEVICE_REG_RES();        struRegRes.dwSize = struRegRes.size();        struRegRes.write();        NativeLong lUserID = hcusbsdk.USB_SDK_Login(struUserLoginInfo, struRegRes);// 登录设备        if (lUserID.intValue() == -1) {            iError = hcusbsdk.USB_SDK_GetLastError();            System.out.println("登陆失败,错误码为" + iError);            hcusbsdk.USB_SDK_Logout(lUserID);        } else {            System.out.println("登陆成功");        }        return lUserID;    }    private static String active(NativeLong lUserID) {        int iError = 0;        HCUsbSDK.USB_SDK_WAIT_SECOND struWaitSecond = new HCUsbSDK.USB_SDK_WAIT_SECOND();        struWaitSecond.dwSize = struWaitSecond.size();        struWaitSecond.byWait = 0;        struWaitSecond.write();        HCUsbSDK.USB_SDK_ACTIVATE_CARD_RES struActivate = new HCUsbSDK.USB_SDK_ACTIVATE_CARD_RES();        struActivate.dwSize = struActivate.size();        struActivate.byCardType = 1;        struActivate.write();        HCUsbSDK.USB_CONFIG_INPUT_INFO struInput = new HCUsbSDK.USB_CONFIG_INPUT_INFO();        struInput.lpInBuffer = struWaitSecond.getPointer();        struInput.dwInBufferSize = struWaitSecond.size();        struInput.write();        HCUsbSDK.USB_CONFIG_OUTPUT_INFO struOutput = new HCUsbSDK.USB_CONFIG_OUTPUT_INFO();        struOutput.lpOutBuffer = struActivate.getPointer();        struOutput.dwOutBufferSize = struActivate.size();        struOutput.write();        boolean bRet =                hcusbsdk.USB_SDK_GetDeviceConfig(lUserID, HCUsbSDK.USB_SDK_GET_ACTIVATE_CARD, struInput, struOutput);        if (!bRet) {            iError = hcusbsdk.USB_SDK_GetLastError();            System.out.println("激活失败,错误码为" + iError);            return "";        }        struOutput.read();        struActivate.read();        String strSerial = "";        for (int i = 0; i < struActivate.bySerialLen; i++) {            int iSerial = struActivate.bySerial[i] & 0xff;            strSerial = strSerial + new String(Integer.toHexString(iSerial)) + " ";        }        System.out.println("激活成功,卡号:" + strSerial);        return strSerial;    }    private static void valid(NativeLong lUserID) {        int iError = 0;        HCUsbSDK.USB_SDK_SET_M1_PWD_VERIFY struWaitSecond = new HCUsbSDK.USB_SDK_SET_M1_PWD_VERIFY();        struWaitSecond.dwSize = struWaitSecond.size();        struWaitSecond.bySectionNum = hexToByte("1");        struWaitSecond.byCardType = hexToByte("0");        struWaitSecond.byPassword = hexToByteArray("FFFFFFFFFFFF");        struWaitSecond.write();        HCUsbSDK.USB_CONFIG_INPUT_INFO struInput = new HCUsbSDK.USB_CONFIG_INPUT_INFO();        struInput.lpInBuffer = struWaitSecond.getPointer();        struInput.dwInBufferSize = struWaitSecond.size();        struInput.write();        HCUsbSDK.USB_CONFIG_OUTPUT_INFO struOutput = new HCUsbSDK.USB_CONFIG_OUTPUT_INFO();        struOutput.lpOutBuffer = struWaitSecond.getPointer();        struOutput.dwOutBufferSize = struWaitSecond.size();        struOutput.write();        boolean bRet =                hcusbsdk.USB_SDK_SetDeviceConfig(lUserID, HCUsbSDK.USB_SDK_SET_M1_PWD_VERIFY, struInput, struOutput);        if (!bRet) {            iError = hcusbsdk.USB_SDK_GetLastError();            System.out.println("验证失败,错误码为" + iError);            return;        }        System.out.println("验证成功");    }    private static void write(NativeLong lUserID, String cardNo) {        int iError = 0;        while (cardNo.length() < 32) {            cardNo = "0" + cardNo;        }        if (cardNo.length() > 32) {            cardNo = cardNo.substring(0, 16);        }        HCUsbSDK.USB_SDK_M1_BLOCK_WRITE_DATA struWaitSecond = new HCUsbSDK.USB_SDK_M1_BLOCK_WRITE_DATA();        struWaitSecond.dwSize = struWaitSecond.size();        struWaitSecond.wAddr = hexToByteArray("4");        struWaitSecond.byDataLen = 16;        struWaitSecond.byData = hexToByteArray(cardNo);        struWaitSecond.write();        HCUsbSDK.USB_CONFIG_INPUT_INFO struInput = new HCUsbSDK.USB_CONFIG_INPUT_INFO();        struInput.lpInBuffer = struWaitSecond.getPointer();        struInput.dwInBufferSize = struWaitSecond.size();        struInput.write();        HCUsbSDK.USB_CONFIG_OUTPUT_INFO struOutput = new HCUsbSDK.USB_CONFIG_OUTPUT_INFO();        struOutput.lpOutBuffer = struWaitSecond.getPointer();        struOutput.dwOutBufferSize = struWaitSecond.size();        struOutput.write();        boolean bRet =                hcusbsdk.USB_SDK_SetDeviceConfig(lUserID, HCUsbSDK.USB_SDK_SET_M1_WRITE_BLOCK, struInput, struOutput);        if (!bRet) {            iError = hcusbsdk.USB_SDK_GetLastError();            System.out.println("写卡失败,错误码为" + iError);            makeDevice(lUserID, "3", "3", "2", "3");  //写卡错误是快鸣2下,闪烁2下红灯            return;        }        makeDevice(lUserID, "2", "1", "3", "2");  //写卡成功是慢鸣1下,闪烁2下蓝灯        System.out.println("写卡成功,内容为" + cardNo);    }    private static String read(NativeLong lUserID) {        int iError = 0;        HCUsbSDK.USB_SDK_M1_BLOCK_ADDR struWaitSecond = new HCUsbSDK.USB_SDK_M1_BLOCK_ADDR();        struWaitSecond.dwSize = struWaitSecond.size();        struWaitSecond.wAddr = hexToByteArray("4");        struWaitSecond.write();        HCUsbSDK.USB_SDK_M1_BLOCK_DATA struOut = new HCUsbSDK.USB_SDK_M1_BLOCK_DATA();        struOut.dwSize = struOut.size();        struOut.write();        HCUsbSDK.USB_CONFIG_INPUT_INFO struInput = new HCUsbSDK.USB_CONFIG_INPUT_INFO();        struInput.lpInBuffer = struWaitSecond.getPointer();        struInput.dwInBufferSize = struWaitSecond.size();        struInput.write();        HCUsbSDK.USB_CONFIG_OUTPUT_INFO struOutput = new HCUsbSDK.USB_CONFIG_OUTPUT_INFO();        struOutput.lpOutBuffer = struOut.getPointer();        struOutput.dwOutBufferSize = struOut.size();        struOutput.write();        boolean bRet =                hcusbsdk.USB_SDK_SetDeviceConfig(lUserID, HCUsbSDK.USB_SDK_GET_M1_READ_BLOCK, struInput, struOutput);        if (!bRet) {            iError = hcusbsdk.USB_SDK_GetLastError();            System.out.println("读卡失败,错误码为" + iError);            makeDevice(lUserID, "3", "3", "2", "3");            return "";        }        struOutput.read();        struOut.read();        String strSerial = "";        /*for (int i = 0; i < struOut.byData.length; i++) {            int iSerial = struOut.byData[i] & 0xff;            System.out.println(struOut.byData[i]+"____"+iSerial+"___"+Integer.toHexString(iSerial));            strSerial = strSerial + new String(Integer.toHexString(iSerial)) + "";        }*/        strSerial = bytes2hexStr(struOut.byData);        System.out.println(strSerial);        makeDevice(lUserID, "2", "1", "3", "2");        System.out.println("读卡成功,内容为" + Long.parseLong(strSerial, 16));        return  String.valueOf(Long.parseLong(strSerial, 16));    }    /**     * Hex字符串转byte     *     * @param inHex 待转换的Hex字符串     * @return 转换后的byte     */    public static byte hexToByte(String inHex) {        return (byte)Integer.parseInt(inHex, 16);    }    public static Boolean makeDevice(NativeLong lUserID, String buBeepType, String buBeepCount, String byFlickerType, String byFlickerCount){        HCUsbSDK.USB_SDK_SET_BEEP_AND_FLICKER fukcjer = new HCUsbSDK.USB_SDK_SET_BEEP_AND_FLICKER();        fukcjer.dwSize = fukcjer.size();        fukcjer.byBeepType = hexToByte(buBeepType);        fukcjer.byBeepCount = hexToByte(buBeepCount);        fukcjer.byFlickerType = hexToByte(byFlickerType);        fukcjer.byFlickerCount =  hexToByte(byFlickerCount);        fukcjer.write();        HCUsbSDK.USB_CONFIG_INPUT_INFO pInputInfo = new HCUsbSDK.USB_CONFIG_INPUT_INFO();        pInputInfo.lpInBuffer = fukcjer.getPointer();        pInputInfo.dwInBufferSize = fukcjer.size();        pInputInfo.write();        HCUsbSDK.USB_CONFIG_OUTPUT_INFO pOutInfo = new HCUsbSDK.USB_CONFIG_OUTPUT_INFO();        pOutInfo.dwOutBufferSize = fukcjer.size();        pOutInfo.write();        Boolean bb =hcusbsdk.USB_SDK_SetDeviceConfig(lUserID, HCUsbSDK.USB_SDK_SET_BEEP_AND_FLICKER,pInputInfo,pOutInfo);        System.out.println(bb);        return bb;    }    /**     * hex字符串转byte数组     *     * @param inHex 待转换的Hex字符串     * @return 转换后的byte数组结果     */    public static byte[] hexToByteArray(String inHex) {        int hexlen = inHex.length();        byte[] result;        if (hexlen % 2 == 1) {            // 奇数            hexlen++;            result = new byte[(hexlen / 2)];            inHex = "0" + inHex;        } else {            // 偶数            result = new byte[(hexlen / 2)];        }        int j = 0;        for (int i = 0; i < hexlen; i += 2) {            result[j] = hexToByte(inHex.substring(i, i + 2));            j++;        }        return result;    }    private static final char[] HEX_CHARS = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};    public static void main(String[] args) throws UnsupportedEncodingException {       /* NativeLong lUserID = login();        active(lUserID);        valid(lUserID);        Long cardNo = Tools.getUniqueId();        System.out.println("写入卡号:" + cardNo);        write(lUserID, str2HexStr("1101-1"));        read(lUserID);        Boolean ss =hcusbsdk.USB_SDK_Logout(lUserID);        System.out.println("退出登录:"+ss);*/       String hexStr ="0000000000000000000000000001880c";        char[] chars = hexStr.toCharArray();        int len = chars.length/2;        byte[] bytes = new byte[len];        for (int i = 0; i < len; i++) {            int x = i*2;            bytes[i] = (byte)Integer.parseInt(String.valueOf(new char[]{chars[x], chars[x+1]}), 16);        }        System.out.println(bytes);        String str = bytes2hexStr(bytes);        System.out.println(str);       long a = Long.parseLong(str,16);        System.out.println(a);    }    /**     * @param: [content]     * @return: int     * @description: 十六进制转十进制     */    public static int covert(String content){        int number=0;        String [] HighLetter = {"A","B","C","D","E","F"};        Map
map = new HashMap<>(); for(int i = 0;i <= 9;i++){ map.put(i+"",i); } for(int j= 10;j
>> 4) & 0xf]; cbuf[x + 1] = HEX_CHARS[bytes[i] & 0xf]; } return new String(cbuf); } @RequestMapping(value = "/toEdit.do") public ModelAndView toEdit() { ModelAndView mv = this.getModelAndView(); PageData pd = this.getPageData(); try { pd = memberService.findById(pd.getString("id")); mv.setViewName("jjc/member/make"); mv.addObject("pd", pd); } catch (Exception e) { logger.error(e.toString(), e); } return mv; } @RequestMapping(value = "/toShow.do") public ModelAndView toShow() { ModelAndView mv = this.getModelAndView(); PageData pd = this.getPageData(); try { mv.setViewName("jjc/member/show"); mv.addObject("pd", pd); } catch (Exception e) { logger.error(e.toString(), e); } return mv; } @RequestMapping(value = "/toShowRecord.do") public ModelAndView toShowRecord() { ModelAndView mv = this.getModelAndView(); PageData pd = this.getPageData(); try { mv.setViewName("jjc/member/showRecord"); mv.addObject("pd", pd); } catch (Exception e) { logger.error(e.toString(), e); } return mv; } @RequestMapping(value = "/showmakeRecord.do") @ResponseBody public Object showmakeRecord() { Map
map = new HashMap
(); PageData pd = this.getPageData(); NativeLong lUserID = login(); try { String readKh = active(lUserID); map.put("kh", readKh); if(Tools.isEmpty(readKh)){ map.put("cardid", ""); }else{ valid(lUserID); String cardid = read(lUserID); if(Tools.isEmpty(cardid)||cardid.equals("0")){ map.put("cardid", "0"); hcusbsdk.USB_SDK_Logout(lUserID); return map; } System.out.println("读卡内容:"+cardid); String number = cardid.substring(0,4); pd.put("number",number); List
list = memberService.listAll(pd); map.put("lUserID", lUserID); map.put("info", list.get(0)); map.put("cardid", cardid); //查询该卡当天是否已存记录 PageData rpd = new PageData(); rpd.put("cardNumber", cardid); Date now = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); rpd.put("createTime", sdf.format(now)); List
rList = cardRecordService.listAll(rpd); //如该卡当天未刷,则新增记录 if(rList.size()==0){ PageData savePd = new PageData(); savePd.put("id", Tools.getUniqueId()); savePd.put("name", list.get(0).getString("name")); savePd.put("cardNumber", cardid); savePd.put("number", number); savePd.put("status", "0"); savePd.put("type", "0"); savePd.put("createTime", now); savePd.put("modifiedTime",now); savePd.put("isDeleted", 0); cardRecordService.save(savePd); } } hcusbsdk.USB_SDK_Logout(lUserID); } catch (Exception e) { hcusbsdk.USB_SDK_Logout(lUserID); logger.error(e.toString(), e); } return map; } @RequestMapping(value = "/getKh.do") @ResponseBody public Object getKh() { NativeLong lUserID = login(); String readKh = active(lUserID); valid(lUserID); Boolean ss =hcusbsdk.USB_SDK_Logout(lUserID); System.out.println("只获取卡号方法:"+readKh); System.out.println("退出登录:"+ss); return Ret.ok("获取成功").put("kh",readKh).put("lUserID",lUserID).build(); } @RequestMapping(value = "/logout.do") @ResponseBody public Object logout() { PageData pd = this.getPageData(); Boolean ss =hcusbsdk.USB_SDK_Logout(new NativeLong(Long.valueOf(pd.getString("lUserID")))); System.out.println("退出登录:"+ss); return Ret.ok("获取成功").data(true).build(); } @RequestMapping(value = "/make.do") @ResponseBody public Object make() { Map
map = new HashMap
(); PageData pd = this.getPageData(); NativeLong lUserID = login(); try { int cardnum = pd.getInteger("cardnum")+1; String number = pd.getString("number"); String readKh = active(lUserID); valid(lUserID); String cardNo = number+ String.valueOf(cardnum); System.out.println("写入卡号:" + cardNo+"----"+Long.toHexString(Long.valueOf(cardNo))); write(lUserID, Long.toHexString(Long.valueOf(cardNo))); map.put("kh", readKh); map.put("cardNo", cardNo); //退出登录 Boolean ss =hcusbsdk.USB_SDK_Logout(lUserID); pd.put("cardnum", cardnum); pd.put("status", "1"); memberService.edit(pd); System.out.println("退出登录:"+ss); return Ret.ok("获取成功").put("kh",readKh).put("cardnum", cardnum).build(); } catch (Exception e) { //退出登录 hcusbsdk.USB_SDK_Logout(lUserID); logger.error(e.toString(), e); } return ""; } @RequestMapping(value = "/showmake.do") @ResponseBody public Object showmake() { Map
map = new HashMap
(); PageData pd = this.getPageData(); NativeLong lUserID = login(); try { String readKh = active(lUserID); if(Tools.isEmpty(readKh)){ map.put("cardid", ""); }else{ valid(lUserID); String cardid = read(lUserID); System.out.println("读卡内容:"+cardid); if(Tools.notEmpty(cardid)&&!cardid.equals("0")){ pd.put("number", cardid.substring(0,4)); List
list = memberService.listAll(pd); map.put("info", list.get(0)); map.put("cardid", cardid); }else{ map.put("cardid", "0"); } } Boolean ss =hcusbsdk.USB_SDK_Logout(lUserID); } catch (Exception e) { hcusbsdk.USB_SDK_Logout(lUserID); logger.error(e.toString(), e); } return map; }

读卡前端代码

var datetime ;    var rtkh="" ;    var kh = "";    var i = 0;    function khf(){       $.ajax({            url: '<%=basePath%>cardMake/getKh.do',            type: "POST",            data:$('#form').serialize(),            dataType: "json",            async: true,            success: function(data){                rtkh = data.kh;                console.log(data.lUserID);                $('#lUserID').val(data.lUserID);                console.log("kh="+kh+"___rtkh="+rtkh);                if(kh != rtkh){                    $.ajax({                        url: '<%=basePath%>cardMake/showmakeRecord.do',                        type: "POST",                        data:$('#form').serialize(),                        dataType: "json",                        async: true,                        success: function(data){                            kh = data.kh;                            console.log(data);                            datetime = new Date().getTime();                            if(data.cardid==""){                                var str = "

读卡失败,请重试


"; $('#showinfo').html(str); }else if(data.cardid=="0"){ var str = "

读卡失败,该卡为空卡


"; $('#showinfo').html(str); }else { i++; var str = "

读卡成功 + " + i + "


"; str += "

姓名:" + data.info.name + "

"; str += "

工号:" + data.info.number + "

"; str += "

卡ID:" + data.cardid + "

"; $('#showinfo').html(str); } khf() } }) }else{ var t2 = new Date().getTime() - datetime; if(t2>10000){ $('#showinfo').html("

读卡完成

"); $('.button1').removeAttr('disabled'); return; } khf() } } }) } function ck(){ $('.button1').attr('disabled', 'disabled'); $('#showinfo').html("

请将卡放置在卡机上

"); datetime = new Date().getTime(); khf(); }

写卡前端代码 

var num ;    var totalnum ;    var datetime ;    var overnum ;    var kh ;    var rtkh ;    function khf(i){        console.log("i="+i+"——————num="+num);        if(i>num){            $('.btn-primary').removeAttr('disabled');            return;        }else{            $.ajax({                url: '<%=basePath%>cardMake/getKh.do',                type: "POST",                data:$('#form').serialize(),                dataType: "json",                async: true,                success: function(data){                    rtkh = data.kh;                    $('#lUserID').val(data.lUserID);                    console.log("rtkh="+rtkh+"______kh="+kh);                    if(rtkh==""){                        var now = new Date().getTime();                        Alert("请将卡放置在卡机上", 1000,false);                        var tt = now - datetime;                        if(tt>10000){                            $('#showinfo').html("

由于长时间未操作,制卡已停止,已制卡"+overnum+"张,还剩"+totalnum+"张,请重新选择制卡张数开始制卡

"); return; } khf(i); }else{ if(kh != rtkh){ $.ajax({ url: '<%=basePath%>cardMake/make.do', type: "POST", data: $('#form').serialize(), dataType: "json", async: true, success: function(data){ kh = data.kh; datetime = new Date().getTime(); totalnum--; overnum++; $('#cardnum').val(data.cardnum); $('#cardnumover').text(data.cardnum); // Alert("制卡成功!", 2000); if(overnum == num){ $('#showinfo').html("

制卡完成,本轮共制卡"+overnum+"张

"); }else{ $('#showinfo').html("

制卡成功,已制卡"+overnum+"张

"); } khf(i+1); } }) }else{ Alert("该卡已制卡成功,请换一张卡!", 1000,false); var tt = new Date().getTime() - datetime; if(tt>10000){ $('#showinfo').html("

由于长时间未操作,制卡已停止,已制卡"+overnum+"张,还剩"+totalnum+"张,请重新选择制卡张数开始制卡

"); $('.btn-primary').removeAttr('disabled'); return; } khf(i); } } } }) } } function save(){ $('.btn-primary').attr('disabled', 'disabled'); $('#showinfo').html("

请将卡放置在卡机上

"); if($('#form').valid()){ num = $('#num').val(); totalnum = $('#num').val(); datetime = new Date().getTime(); overnum = 0; kh = ""; rtkh = ""; khf(1); }else{ $('.btn-primary').removeAttr('disabled'); } }

 

转载地址:http://yqwxi.baihongyu.com/

你可能感兴趣的文章
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
linux虚拟机安装tar.gz版jdk步骤详解
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
异常 Java学习Day_15
查看>>
Mysql初始化的命令
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>