本篇没有考虑异步,多线程及SQL注入
WebDatabase 规范中说这份规范不再维护了,原因是同质化(几乎实现者都选择了Sqlite),
且不说这些,单看在HTML5中如何实现离线数据的CRUD,最基本的用法(入门级别)
1,打开数据库
2,创建表
3,新增数据
4,更新数据
5,读取数据
6,删除数据
事实上,关键点在于如何拿到一个可执行SQL语句的上下文,
像创建表,删除表,CRUD操作等仅区别于SQL语句的写法.OK,貌似"SqlHelper"啊,换个名字,dataBaseOperator就它了
executeReader,executeScalar两个方法与executeNonQuery严重同质,
下边的代码产生定义了我们的dataBaseOperator"类",第二行
3-5行则定义打开数据库连接方法,"类方法",效果类似C#中的静态方法,直接类名.方法调用
6-15行则定义executeNonQuery方法,意指查询数据库,与executeReader方法和executeScalar方法同质,均可返回记录集
整个 dataBaseOperator就完整了,很简单,唯一要指出的是,测试以下代码时请选择一个支持HTML5的浏览器!如Google Chrome
<ol class="dp-xml"> <li class="alt"><span><span>//TODO;SQL注入 </span></span></li> <li><span> function dataBaseOperator() {}; </span></li> <li class="alt"> <span> </span><span class="attribute">dataBaseOperator.openDatabase</span><span> = </span><span class="attribute-value">function</span><span> () { </span> </li> <li><span> return window.openDatabase("dataBaseUserStories", "1.0", "dataBase used for user stories", 2 * 1024 * 1024); </span></li> <li class="alt"><span> } </span></li> <li> <span> </span><span class="attribute">dataBaseOperator.executeNonQuery</span><span> = </span><span class="attribute-value">function</span><span> (sql, parameters, callback) { </span> </li> <li class="alt"> <span> var </span><span class="attribute">db</span><span> = </span><span class="attribute-value">this</span><span>.openDatabase(); </span> </li> <li><span> db.transaction(function (trans) { </span></li> <li class="alt"><span> trans.executeSql(sql, parameters, function (trans, result) { </span></li> <li><span> callback(result); </span></li> <li class="alt"><span> }, function (trans, error) { </span></li> <li><span> throw error.message; </span></li> <li class="alt"><span> }); </span></li> <li><span> }); </span></li> <li class="alt"><span> } </span></li> <li> <span> </span><span class="attribute-value">dataBaseOperator</span><span class="attribute">dataBaseOperator.executeReader</span><span> = dataBaseOperator.executeNonQuery; </span> </li> <li class="alt"> <span> </span><span class="attribute-value">dataBaseOperator</span><span class="attribute">dataBaseOperator.executeScalar</span><span> = dataBaseOperator.executeNonQuery; </span> </li> </ol>
有了"SqlHeper",再看业务处理层(Business Logic Layer)
业务处理类包括了创建表,删除表,新增记录,删除记录以及读取记录,这里没有写更新,实际上先删后增一样滴,即使要写也不复杂
<ol class="dp-xml"> <li class="alt"><span><span>function userStoryProvider() { </span></span></li> <li> <span> </span><span class="attribute">this.createUserStoryTable</span><span> = </span><span class="attribute-value">function</span><span> () { </span> </li> <li class="alt"><span> dataBaseOperator.executeNonQuery("CREATE TABLE tbUserStories(id integer primary key autoincrement,role,ability,benefit,name,importance,estimate,notes)"); </span></li> <li><span> }; </span></li> <li class="alt"> <span> </span><span class="attribute">this.dropUserStoryTable</span><span> = </span><span class="attribute-value">function</span><span> () { </span> </li> <li><span> dataBaseOperator.executeNonQuery("DROP TABLE tbUserStories"); </span></li> <li class="alt"><span> }; </span></li> <li> <span> </span><span class="attribute">this.addUserStory</span><span> = </span><span class="attribute-value">function</span><span> (role, ability, benefit, name, importance, estimate, notes) { </span> </li> <li class="alt"><span> dataBaseOperator.executeNonQuery("INSERT INTO tbUserStories(role,ability,benefit,name,importance,estimate,notes) SELECT ?,?,?,?,?,?,?", </span></li> <li><span> [role, ability, benefit, name, importance, estimate, notes], function (result) { </span></li> <li class="alt"><span> //alert("rowsAffected:" + result.rowsAffected); </span></li> <li><span> }); </span></li> <li class="alt"><span> }; </span></li> <li> <span> </span><span class="attribute">this.removeUserStory</span><span> = </span><span class="attribute-value">function</span><span> (id) { </span> </li> <li class="alt"> <span> dataBaseOperator.executeNonQuery("DELETE FROM tbUserStories WHERE </span><span class="attribute">id</span><span> = ?", [id], function (result) { </span> </li> <li><span> //alert("rowsAffected:" + result.rowsAffected); </span></li> <li class="alt"><span> }); </span></li> <li><span> }; </span></li> <li class="alt"> <span> </span><span class="attribute">this.loadUserStories</span><span> = </span><span class="attribute-value">function</span><span> (callback) { </span> </li> <li><span> dataBaseOperator.executeReader("SELECT * FROM tbUserStories", [], function (result) { </span></li> <li class="alt"><span> callback(result); </span></li> <li><span> }); </span></li> <li class="alt"><span> //result.insertId,result.rowsAffected,result.rows24 }; </span></li> <li><span> } </span></li> </ol>
createUserStoryTable,dropUserStoryTable,addUserStory,removeUserStory又是严重同质,不说了,仅SQL语句不同而已
但loadUserStories与上述四个方法均不同,是因为它把SQLResultSetRowList返回给了调用者,这里仍然是简单的"转发",页面在使用的时候需要首先创建provider实例(使用类似C#中的类实例上的方法调用)
<ol class="dp-xml"><li class="alt"><span><span>var </span><span class="attribute">_userStoryProvider</span><span> = </span><span class="attribute-value">new</span><span> userStoryProvider(); </span></span></li></ol>
之后就可以调用该实例的方法了,仅举个例子,具体代码省去
<ol class="dp-xml"> <li class="alt"><span><span>function loadUserStory() { </span></span></li> <li><span>try { </span></li> <li class="alt"><span>_userStoryProvider.loadUserStories(function (result) { </span></li> <li> <span> var </span><span class="attribute">_userStories</span><span> = </span><span class="attribute-value">new</span><span> Array(); </span> </li> <li class="alt"> <span>for (var </span><span class="attribute">i</span><span> = </span><span class="attribute-value">0</span><span>; i </span><span class="tag"><span> </span><span class="tag-name">result.rows.length</span><span>; i++) { </span></span> </li> <li> <span> var </span><span class="attribute">o</span><span> = </span><span class="attribute-value">result</span><span>.rows.item(i); </span> </li> <li class="alt"> <span> var </span><span class="attribute">_userStory</span><span> = </span><span class="attribute-value">new</span><span> userStory(o.id, o.name, o.role, o.ability, o.benefit, o.importance, o.estimate, o.notes); </span> </li> <li><span> _userStories.push(_userStory); </span></li> <li class="alt"><span> }//... </span></li> <li><span>} catch (error) { </span></li> <li class="alt"><span> alert("_userStoryProvider.loadUserStories:" + error); </span></li> <li><span>}} </span></li> </ol>
得到_userStories这个数组后,就没有下文了,是自动创建HTML还是绑定到EXT,发挥想象力吧...继续
userStory是一个自定义的"Model" "类"·
<ol class="dp-xml"> <li class="alt"><span><span>function userStory(id, name, role, ability, benefit, importance, estimate, notes) { </span></span></li> <li> <span> </span><span class="attribute">this.id</span><span> = id; </span> </li> <li class="alt"> <span> </span><span class="attribute">this.name</span><span> = name; </span> </li> <li> <span> </span><span class="attribute">this.role</span><span> = role; </span> </li> <li class="alt"> <span> </span><span class="attribute">this.ability</span><span> = ability; </span> </li> <li> <span> </span><span class="attribute">this.benefit</span><span> = benefit; </span> </li> <li class="alt"> <span> </span><span class="attribute">this.importance</span><span> = importance; </span> </li> <li> <span> </span><span class="attribute">this.estimate</span><span> = estimate; </span> </li> <li class="alt"> <span> </span><span class="attribute">this.notes</span><span> = notes; </span> </li> <li><span> }; </span></li> </ol>
最后贴出应用的代码,业务相关的代码,不看也罢,谁家与谁家的都不同
<ol class="dp-xml"> <li class="alt"><span><span>/* </span></span></li> <li><span> http://stackoverflow.com/questions/2010892/storing-objects-in-html5-localstorage </span></li> <li class="alt"><span> http://www.w3.org/TR/webdatabase/#sqlresultset </span></li> <li><span> http://html5doctor.com/introducing-web-sql-databases/ </span></li> <li class="alt"><span> http://stackoverflow.com/questions/844885/sqlite-insert-into-with-unique-names-getting-id </span></li> <li><span> */ </span></li> <li class="alt"> <span> var </span><span class="attribute">_userStoryProvider</span><span> = </span><span class="attribute-value">new</span><span> userStoryProvider(); </span> </li> <li><span> $(document).ready(function () { </span></li> <li class="alt"><span> loadUserStory(); </span></li> <li><span> </span></li> <li class="alt"><span> /* 添加用户故事 */ </span></li> <li><span> $("#btnAdd").click(function () { </span></li> <li class="alt"> <span> var </span><span class="attribute">item</span><span> = { role: $("#role").val(), ability: $("#ability").val(), benefit: $("#benefit").val(), name: $("#Name").val(), importance: $("#Importance").val(), estimate: $("#Estimate").val(), notes: $("#Notes").val() }; </span> </li> <li><span> try { </span></li> <li class="alt"><span> _userStoryProvider.addUserStory(item.role, item.ability, item.benefit, item.name, item.importance, item.estimate, item.notes); </span></li> <li><span> loadUserStory(); </span></li> <li class="alt"><span> } catch (error) { </span></li> <li><span> alert("_userStoryProvider.addUserStory:" + error); </span></li> <li class="alt"><span> } </span></li> <li><span> }); </span></li> <li class="alt"><span> </span></li> <li><span> /* 创建用户故事表 */ </span></li> <li class="alt"><span> $("#btnCreateTable").click(function () { try { </span></li> <li><span> _userStoryProvider.createUserStoryTable(); </span></li> <li class="alt"><span> } catch (error) { </span></li> <li><span> alert("_userStoryProvider.createUserStoryTable:" + error); </span></li> <li class="alt"><span> } </span></li> <li><span> }); </span></li> <li class="alt"><span> </span></li> <li><span> /* 删除用户故事表 */ </span></li> <li class="alt"><span> $("#btnDropTable").click(function () { </span></li> <li><span> try { </span></li> <li class="alt"><span> _userStoryProvider.dropUserStoryTable(); </span></li> <li><span> } catch (error) { </span></li> <li class="alt"><span> alert("_userStoryProvider.dropUserStoryTable:" + error); </span></li> <li><span> } </span></li> <li class="alt"><span> }); </span></li> <li><span> }); </span></li> <li class="alt"><span> </span></li> <li><span> /* 加载用户故事 */ </span></li> <li class="alt"><span> function loadUserStory() { </span></li> <li><span> try { </span></li> <li class="alt"><span> _userStoryProvider.loadUserStories(function (result) { </span></li> <li> <span> var </span><span class="attribute">_userStories</span><span> = </span><span class="attribute-value">new</span><span> Array(); </span> </li> <li class="alt"> <span> for (var </span><span class="attribute">i</span><span> = </span><span class="attribute-value">0</span><span>; i </span><span class="tag"><span> </span><span class="tag-name">result.rows.length</span><span>; i++) { </span></span> </li> <li> <span> var </span><span class="attribute">o</span><span> = </span><span class="attribute-value">result</span><span>.rows.item(i); </span> </li> <li class="alt"> <span> var </span><span class="attribute">_userStory</span><span> = </span><span class="attribute-value">new</span><span> userStory(o.id, o.name, o.role, o.ability, o.benefit, o.importance, o.estimate, o.notes); </span> </li> <li><span> _userStories.push(_userStory); </span></li> <li class="alt"><span> } </span></li> <li><span> </span></li> <li class="alt"><span> if (!_userStories) return; </span></li> <li> <span> var </span><span class="attribute">table</span><span> = </span><span class="attribute-value">document</span><span>.getElementById("user_story_table"); </span> </li> <li class="alt"><span> if (!table) return; </span></li> <li> <span> var </span><span class="attribute">_trs</span><span> = </span><span class="attribute-value">table</span><span>.getElementsByTagName("tr"); </span> </li> <li class="alt"> <span> var </span><span class="attribute">_len</span><span> = </span><span class="attribute-value">_trs</span><span>.length; </span> </li> <li> <span> for (var </span><span class="attribute">i</span><span> = </span><span class="attribute-value">0</span><span>; i </span><span class="tag"><span> </span><span class="tag-name">_len</span><span>; i++) { </span></span> </li> <li class="alt"><span> table.removeChild(_trs[i]); </span></li> <li><span> } </span></li> <li class="alt"><span> { </span></li> <li> <span> var </span><span class="attribute">tr</span><span> = </span><span class="attribute-value">document</span><span>.createElement("tr"); </span> </li> <li class="alt"><span> tr.setAttribute("class", "product_backlog_row header"); </span></li> <li><span> { </span></li> <li class="alt"><span> tr.appendChild(CreateTd("id", "id")); </span></li> <li><span> tr.appendChild(CreateTd("name", "name")); </span></li> <li class="alt"><span> tr.appendChild(CreateTd("importance", "importance")); </span></li> <li><span> tr.appendChild(CreateTd("estimate", "estimate")); </span></li> <li class="alt"><span> tr.appendChild(CreateTd("description", "role")); </span></li> <li><span> tr.appendChild(CreateTd("notes", "notes")); </span></li> <li class="alt"><span> tr.appendChild(CreateTd("delete", "delete")); </span></li> <li><span> }; </span></li> <li class="alt"><span> table.appendChild(tr); </span></li> <li><span> } </span></li> <li class="alt"> <span> for (var </span><span class="attribute">i</span><span> = </span><span class="attribute-value">0</span><span>; i </span><span class="tag"><span> </span><span class="tag-name">_userStories.length</span><span>; i++) { </span></span> </li> <li><span> CreateRow(table, _userStories[i]); </span></li> <li class="alt"><span> } </span></li> <li><span> }); </span></li> <li class="alt"><span> } catch (error) { </span></li> <li><span> alert("_userStoryProvider.loadUserStories:" + error); </span></li> <li class="alt"><span> } </span></li> <li><span> } </span></li> <li class="alt"><span> function CreateRow(table, userStory) { </span></li> <li><span> if (!table) return; </span></li> <li class="alt"><span> if (!userStory) return; </span></li> <li><span> { </span></li> <li class="alt"> <span> var </span><span class="attribute">tr</span><span> = </span><span class="attribute-value">document</span><span>.createElement("tr"); </span> </li> <li><span> tr.setAttribute("class", "product_backlog_row"); </span></li> <li class="alt"><span> { </span></li> <li><span> tr.appendChild(CreateTd("id", userStory.id)); </span></li> <li class="alt"><span> tr.appendChild(CreateTd("name", userStory.name)); </span></li> <li><span> tr.appendChild(CreateTd("importance", userStory.importance)); </span></li> <li class="alt"><span> tr.appendChild(CreateTd("estimate", userStory.estimate)); </span></li> <li><span> tr.appendChild(CreateTd("description", userStory.role)); </span></li> <li class="alt"><span> tr.appendChild(CreateTd("notes", userStory.notes)); </span></li> <li><span> tr.appendChild(CreateDeleteButton("delete_button", userStory.id)); </span></li> <li class="alt"><span> }; </span></li> <li><span> table.appendChild(tr); </span></li> <li class="alt"><span> } </span></li> <li><span> } </span></li> <li class="alt"><span> function CreateTd(name, value) { </span></li> <li> <span> var </span><span class="attribute">td</span><span> = </span><span class="attribute-value">document</span><span>.createElement("td"); </span> </li> <li class="alt"><span> td.setAttribute("class", "user_story " + name); </span></li> <li> <span> </span><span class="attribute">td.innerText</span><span> = </span><span class="attribute-value">value</span><span>; </span> </li> <li class="alt"><span> return td; </span></li> <li><span> }; </span></li> <li class="alt"><span> function CreateDeleteButton(name, id) { </span></li> <li> <span> var </span><span class="attribute">td</span><span> = </span><span class="attribute-value">document</span><span>.createElement("td"); </span> </li> <li class="alt"><span> td.setAttribute("class", "user_story " + name); </span></li> <li><span> /* 删除用户故事 */ </span></li> <li class="alt"> <span> </span><span class="attribute">td.innerHTML</span><span> = </span><span class="attribute-value">"<a><span>###\" </span><span class="attribute">title</span><span>=\"delete\" </span><span class="attribute">onclick</span><span>=\"javascript:_userStoryProvider.removeUserStory(\'" + id + "');removeRow(this);\"</span><span class="tag">></span><span class="tag">></span><span class="tag">></span><span>delete</span><span class="tag"></span><span class="tag-name">a</span><span class="tag">></span><span>"; </span></a></span> </li> <li><span> return td; </span></li> <li class="alt"><span> } </span></li> <li><span> function removeRow(obj) { </span></li> <li class="alt"><span> document.getElementById("user_story_table").deleteRow(obj.parentNode.parentNode.rowIndex); </span></li> <li><span> //obj.parentNode.parentNode.removeNode(true); </span></li> <li class="alt"><span> } </span></li> </ol>
看完代码复习下基本功课
1,WindowDatabase接口,注意openDatabase方法
<ol class="dp-xml"> <li class="alt"><span><span>[Supplemental, NoInterfaceObject] </span></span></li> <li><span>interface WindowDatabase { </span></li> <li class="alt"><span> Database openDatabase(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in optional DatabaseCallback creationCallback);}; </span></li> <li><span>Window implements WindowDatabase; </span></li> <li class="alt"><span>[Supplemental, NoInterfaceObject] </span></li> <li><span>interface WorkerUtilsDatabase { </span></li> <li class="alt"><span> Database openDatabase(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in optional DatabaseCallback creationCallback); DatabaseSync openDatabaseSync(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in optional DatabaseCallback creationCallback);}; </span></li> <li><span>WorkerUtils implements WorkerUtilsDatabase; </span></li> <li class="alt"> <span>[</span><span class="attribute">Callback</span><span>=</span><span class="attribute-value">FunctionOnly</span><span>, NoInterfaceObject] </span> </li> <li><span>interface DatabaseCallback { </span></li> <li class="alt"><span>void handleEvent(in Database database); </span></li> <li><span>}; </span></li> </ol>
2,SQLTransaction接口,关注executeSql方法
<ol class="dp-xml"> <li class="alt"><span><span>typedef sequence</span><span class="tag"><span class="tag-name">any</span><span class="tag">></span><span> ObjectArray; </span></span></span></li> <li><span>interface SQLTransaction { </span></li> <li class="alt"><span> void executeSql(in DOMString sqlStatement, in optional ObjectArray arguments, in optional SQLStatementCallback callback, in optional SQLStatementErrorCallback errorCallback);}; </span></li> <li> <span>[</span><span class="attribute">Callback</span><span>=</span><span class="attribute-value">FunctionOnly</span><span>, NoInterfaceObject] </span> </li> <li class="alt"><span>interface SQLStatementCallback { </span></li> <li><span> void handleEvent(in SQLTransaction transaction, in SQLResultSet resultSet);}; </span></li> <li class="alt"> <span>[</span><span class="attribute">Callback</span><span>=</span><span class="attribute-value">FunctionOnly</span><span>, NoInterfaceObject] </span> </li> <li><span>interface SQLStatementErrorCallback { </span></li> <li class="alt"><span> boolean handleEvent(in SQLTransaction transaction, in SQLError error); </span></li> <li><span>}; </span></li> </ol>
3,最后看下SQLResultSetRowList定义
<ol class="dp-xml"> <li class="alt"><span><span>interface SQLResultSetRowList { </span></span></li> <li><span> readonly attribute unsigned long length; </span></li> <li class="alt"><span>getter any item(in unsigned long index); </span></li> <li><span>}; </span></li> </ol>
和SQLResultSet定义
<ol class="dp-xml"> <li class="alt"><span><span>interface SQLResultSet { </span></span></li> <li><span> readonly attribute long insertId; </span></li> <li class="alt"><span> readonly attribute long rowsAffected; </span></li> <li><span> readonly attribute SQLResultSetRowList rows; </span></li> <li class="alt"><span> }; <br></span></li> </ol>

H5 개발에서 마스터 해야하는 도구 및 프레임 워크에는 vue.js, React 및 Webpack이 포함됩니다. 1.vue.js는 사용자 인터페이스를 구축하고 구성 요소 개발을 지원하는 데 적합합니다. 2. 복잡한 응용 프로그램에 적합한 가상 DOM을 통해 페이지 렌더링을 최적화합니다. 3. Webpack은 모듈 포장에 사용되며 리소스로드를 최적화합니다.

html5hassignificallytransformedwebdevelopmentbyintranticalticlementements, 향상 Multimediasupport 및 Improvingperformance.1) itmadewebsitessmoreaccessibleadseo 친환경적 인 요소, 및 .2) Html5intagnatee

H5는 시맨틱 요소 및 ARIA 속성을 통해 웹 페이지 접근성 및 SEO 효과를 향상시킵니다. 1. 컨텐츠 구조를 구성하고 SEO를 개선하기 위해 사용합니다. 2. Aria-Label과 같은 ARIA 속성은 접근성을 향상시키고 보조 기술 사용자는 웹 페이지를 원활하게 사용할 수 있습니다.

"H5"와 "HTML5"는 대부분의 경우 동일하지만 특정 시나리오에서는 다른 의미를 가질 수 있습니다. "HTML5"는 새로운 태그와 API를 포함하는 W3C 정의 표준입니다. "H5"는 일반적으로 HTML5의 약어이지만 모바일 개발에서는 HTML5를 기반으로 한 프레임 워크를 참조 할 수 있습니다. 이러한 차이를 이해하면 프로젝트 에서이 용어를 정확하게 사용하는 데 도움이됩니다.

H5 또는 HTML5는 HTML의 다섯 번째 버전입니다. 개발자에게 더 강력한 도구 세트를 제공하여 복잡한 웹 애플리케이션을보다 쉽게 만들 수 있습니다. H5의 핵심 기능에는 다음이 포함됩니다. 1) 웹 페이지에 그래픽 및 애니메이션을 그리는 요소; 2) 웹 페이지 구조를 SEO 최적화에 명확하고 도움이되는 시맨틱 태그 등; 3) GeolocationApi 지원 위치 기반 서비스와 같은 새로운 API; 4) 호환성 테스트 및 폴리 필 라이브러리를 통해 크로스 브라우저 호환성을 보장해야합니다.

H5 링크를 만드는 방법? 링크 대상 결정 : H5 페이지 또는 응용 프로그램의 URL을 가져옵니다. HTML 앵커 작성 : & lt; a & gt; 태그 앵커를 만들고 링크 대상 URL을 지정합니다. 링크 속성 설정 (선택 사항) : 필요에 따라 대상, 제목 및 on 클릭 속성을 설정하십시오. 웹 페이지에 추가 : 링크가 나타나려는 웹 페이지에 HTML 앵커 코드를 추가하십시오.

H5 호환성 문제에 대한 솔루션에는 다음이 포함됩니다. 웹 페이지가 화면 크기에 따라 레이아웃을 조정할 수있는 반응 형 디자인을 사용합니다. 릴리스 전에 호환성을 테스트하기 위해 브라우저 크로스 브라우저 테스트 도구를 사용하십시오. PolyFill을 사용하여 이전 브라우저의 새로운 API를 지원합니다. 웹 표준을 따르고 효과적인 코드 및 모범 사례를 사용하십시오. CSS 프리 프로세서를 사용하여 CSS 코드를 단순화하고 가독성을 향상시킵니다. 이미지를 최적화하고 웹 페이지 크기를 줄이며로드 속도를 높이십시오. HTTPS를 통해 웹 사이트의 보안을 보장하십시오.

H5 페이지는 링크를 수동으로 만들거나 짧은 링크 서비스를 사용하는 두 가지 방식으로 링크를 생성 할 수 있습니다. 수동으로 생성하면 H5 페이지의 URL을 복사하면됩니다. 짧은 링크 서비스를 통해 URL을 서비스에 붙여 넣은 다음 단축 된 URL을 가져와야합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

WebStorm Mac 버전
유용한 JavaScript 개발 도구

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

뜨거운 주제



