数据库文档重构,细节修改

This commit is contained in:
暮光:城中城
2019-07-04 23:39:55 +08:00
parent 6c1f4e123a
commit 67c6ffc877
10 changed files with 309 additions and 246 deletions

View File

@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* 数据源控制器
@@ -40,6 +41,9 @@ public class DbDatasourceController {
QueryWrapper<DbDatasource> wrapper = new QueryWrapper<>();
wrapper.eq("yn", 1);
List<DbDatasource> datasourceList = dbDatasourceService.list(wrapper);
for (DbDatasource dbDatasource : datasourceList) {
dbDatasource.setSourcePassword("***");
}
return DocDbResponseJson.ok(datasourceList);
}
@@ -54,15 +58,17 @@ public class DbDatasourceController {
} else if (StringUtils.isBlank(dbDatasource.getSourcePassword())) {
return DocDbResponseJson.warn("密码必填");
}
if (Objects.equals("***", dbDatasource.getSourcePassword())) {
dbDatasource.setSourcePassword(null);
}
// 这三项不需要修改
dbDatasource.setCreateTime(null);
dbDatasource.setCreateUserId(null);
dbDatasource.setCreateUserName(null);
Long sourceId = Optional.ofNullable(dbDatasource.getId()).orElse(0L);
DbDatasource dbDatasourceSel = dbDatasource;
if (sourceId > 0) {
dbDatasourceService.updateById(dbDatasource);
} else {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
dbDatasource.setCreateTime(new Date());
dbDatasource.setCreateUserId(currentUser.getUserId());
dbDatasource.setYn(1);
dbDatasourceService.save(dbDatasource);
dbDatasourceSel = dbDatasourceService.getById(dbDatasource.getId());
}
List<DatabaseFactoryBean> newFactoryBeanList = new LinkedList<>();
List<DatabaseFactoryBean> databaseFactoryBeanList = databaseRegistrationBean.getDatabaseFactoryBeanList();
@@ -80,7 +86,7 @@ public class DbDatasourceController {
}
}
// 创建新的数据源
DatabaseFactoryBean databaseFactoryBean = DatasourceUtil.createDatabaseFactoryBean(dbDatasource);
DatabaseFactoryBean databaseFactoryBean = DatasourceUtil.createDatabaseFactoryBean(dbDatasourceSel);
if (databaseFactoryBean != null) {
newFactoryBeanList.add(databaseFactoryBean);
}
@@ -89,6 +95,16 @@ public class DbDatasourceController {
if (databaseFactoryBean == null) {
return DocDbResponseJson.warn("创建数据源失败,请检查配置是否正确");
}
if (sourceId > 0) {
dbDatasourceService.updateById(dbDatasource);
} else {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
dbDatasource.setCreateTime(new Date());
dbDatasource.setCreateUserId(currentUser.getUserId());
dbDatasource.setCreateUserName(currentUser.getUsername());
dbDatasource.setYn(1);
dbDatasourceService.save(dbDatasource);
}
return DocDbResponseJson.ok();
}
}

View File

@@ -10,7 +10,9 @@ import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import java.io.IOException;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Properties;
public class DatasourceUtil {
@@ -83,7 +85,7 @@ public class DatasourceUtil {
databaseFactoryBean.setSqlSessionTemplate(sqlSessionTemplate);
databaseFactoryBean.setUrl(dbUrl);
return databaseFactoryBean;
} catch (Exception e) {
} catch (Throwable e) {
e.printStackTrace();
}
return null;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,u,a){for(var c,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(c in u)Object.prototype.hasOwnProperty.call(u,c)&&(e[c]=u[c]);for(n&&n(t,u,a);s.length;)s.shift()();if(a)for(l=0;l<a.length;l++)f=r(r.s=a[l]);return f};var t={},o={2:0};r.e=function(e){function n(){a.onerror=a.onload=null,clearTimeout(c);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=new Promise(function(r,n){o[e]=[r,n]});o[e][2]=t;var u=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,r.nc&&a.setAttribute("nonce",r.nc),a.src=r.p+""+e+".js?"+{0:"8ab79790306f3488666d",1:"53a38fa9138d53368f6f"}[e];var c=setTimeout(n,12e4);return a.onerror=a.onload=n,u.appendChild(a),t},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,n,t){r.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=doc-db-manifest.js.map?238d259f7c3272512ca7

View File

@@ -0,0 +1,218 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<!--无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢-->
<meta name="author" content="开发者列表暮光城中城项目地址https://gitee.com/zyplayer/zyplayer-doc" />
<title>数据库文档</title>
<link rel="shortcut icon" href="webjars/doc-db/img/api.ico"/>
<link rel="stylesheet" href="webjars/zui/css/zui.min.css" />
<link rel="stylesheet" href="webjars/zui/css/zui-theme.min.css">
<link rel="stylesheet" href="webjars/zui/lib/chosen/chosen.min.css" />
<link rel="stylesheet" href="webjars/doc-db/css/doc-db.css" />
</head>
<body>
<div class="container">
<div class="row choise-db">
<div class="col-md-3">
<select id="choiseHost" data-placeholder="选择一个连接" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-3">
<select id="choiseDatabase" data-placeholder="选择一个数据库" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-3">
<select id="choiseTable" data-placeholder="选择一张表" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-3">
<button class="btn btn-primary" type="button" id="fuzzySearchBtn">模糊查询</button>
<button class="btn btn-primary" type="button" id="exportBtn">导出</button>
<button class="btn" type="button" id="showEchartsBtn">显示表关系图</button>
</div>
</div>
<div class="table-info">
<div style="height: 35px;line-height: 35px;">
表名:<span class="table-name"></span>
<button class="btn pull-right" type="button" id="aboutBtn" style="margin-right: 30px;">关于</button>
</div>
<div class="desc">
<div id="tableDescShow">
<span class="table-desc"></span>
<i class="icon icon-edit" title="编辑表注释"></i>
</div>
<textarea id="tableDescInput" rows="2" class="form-control"></textarea>
</div>
</div>
<div class="table-columns">
<table class="table table-bordered table-striped table-hover" id="tableCloumnsTable">
<thead>
<tr><th>字段名</th><th>自增</th><th>类型</th><th>长度</th><th>NULL</th><th>主键</th><th>注释</th></tr>
</thead>
<tbody></tbody>
</table>
</div>
<div id="tableRelationBox" class="hide" style="width: 100%;height:100px;">
<div class="alert alert-warning alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<p>
Tips本关系图不是通过外键生成所以需要在字段注释最后按规则添加外键关系才能生成图表支持的格式有<br/>
1、T:表XXX(字段注释)T:user_info<br/>
2、T:表.关联IDXXX(字段注释)T:user_info.id<br/>
3、T:库.表.关联IDXXX(字段注释)T:order_db.user_info.id<br/>
实验功能,有更好的建议或展示方式欢迎<a target="_blank" href="https://gitee.com/zyplayer/zyplayer-doc">提交建议</a>
</p>
</div>
<div id="tableRelationCharts" style="width: 100%;height:100%;margin-bottom: 50px;"></div>
</div>
<!-- 模糊查询 -->
<div class="modal fade" id="fuzzySearchModal">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span><span class="sr-only">关闭</span>
</button>
<h4 class="modal-title">通过字段名或释义模糊查询</h4>
</div>
<div class="modal-body">
<div class="row choise-db">
<div class="col-md-3">
<select id="choiseFuzzyHost" data-placeholder="选择一个连接" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-3">
<select id="choiseFuzzyDatabase" data-placeholder="选择一个数据库" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-4">
<input id="searchText" type="text" class="form-control" placeholder="搜索内容,字段名或注释">
</div>
<div class="col-md-2">
<button id="doSearch" class="btn btn-primary" type="button">查询 <i class="icon icon-spin icon-spinner-snake hidden"></i></button>
</div>
</div>
<div class="modal-table-box">
<table class="table table-bordered table-striped table-hover" id="fuzzySearchTable">
<thead>
<tr><th>表名</th><th>字段名</th><th>注释</th></tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- 导出弹出框 -->
<div class="modal fade" id="exportModal">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span><span class="sr-only">关闭</span>
</button>
<h4 class="modal-title">导出数据库文档</h4>
</div>
<div class="modal-body">
<div class="row choise-db">
<div class="col-md-3">
<select id="choiseExportHost" data-placeholder="选择一个连接" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-3">
<select id="choiseExportDatabase" data-placeholder="选择一个数据库" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-6">
<button id="doExport" class="btn btn-primary" type="button">确认导出 <i class="icon icon-spin icon-spinner-snake hidden"></i></button>
<button id="checkAllTable" class="btn" type="button">全选</button>
<button id="notCheckAllTable" class="btn" type="button">全不选</button>
</div>
</div>
<div class="alert alert-danger">
请到 <a target="_blank" href="https://gitee.com/zyplayer/zyplayer-doc-db">源码处下载</a>《对外文档模板.zip》解压
然后将“确认导出”后的文件放至/js目录下文件名必须为database.js<br/>
然后双击打开目录下的doc-db.html 即可看到导出的文档
</div>
<div class="modal-table-box">
<ul id="exportUl"></ul>
</div>
</div>
</div>
</div>
</div>
<!-- 关于弹出框 -->
<div class="modal fade" id="aboutModal">
<div class="modal-dialog modal-lg" style="width: 600px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span><span class="sr-only">关闭</span>
</button>
<h4 class="modal-title">关于zyplayer-doc-db</h4>
</div>
<div class="modal-body">
<form class="form-horizontal" style="line-height: 30px;">
<div class="form-group">
<label class="col-sm-2 no-padding">项目地址:</label>
<div class="col-md-6 col-sm-10">
<a target="_blank" href="https://gitee.com/zyplayer/zyplayer-doc">zyplayer-doc</a>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 no-padding">开发人员:</label>
<div class="col-md-6 col-sm-10">
<a target="_blank" href="http://zyplayer.com">暮光:城中城</a>
</div>
</div>
<div class="form-group upgrade-info">
<label class="col-sm-2 no-padding">当前版本:</label>
<div class="col-md-10 col-sm-10" id="upgradeNowVersion"></div>
</div>
<div class="form-group upgrade-info">
<label class="col-sm-2 no-padding">最新版本:</label>
<div class="col-md-10 col-sm-10" id="upgradeLastVersion"></div>
</div>
<div class="form-group upgrade-info">
<label class="col-sm-2 no-padding">升级地址:</label>
<div class="col-md-10 col-sm-10" id="upgradeUrl"></div>
</div>
<div class="form-group upgrade-info">
<label class="col-sm-2 no-padding">升级内容:</label>
<div class="col-md-10 col-sm-10" id="upgradeContent"></div>
</div>
<div class="form-group">
<div class="col-sm-2 no-padding"></div>
<div class="col-md-10 col-sm-10">
欢迎加群讨论QQ群号466363173欢迎提交需求欢迎使用和加入开发
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="webjars/doc-db/js/jquery-3.1.0.min.js"></script>
<script type="text/javascript" src="webjars/zui/js/zui.min.js"></script>
<script type="text/javascript" src="webjars/zui/lib/chosen/chosen.min.js"></script>
<script type="text/javascript" src="webjars/doc-db/js/echarts.min.js"></script>
<script type="text/javascript" src="webjars/doc-db/js/option-table-relation.js"></script>
<script type="text/javascript" src="webjars/doc-db/js/formatjson.js"></script>
<script type="text/javascript" src="webjars/doc-db/js/toast.js"></script>
<script type="text/javascript" src="webjars/doc-db/js/common.js"></script>
<script type="text/javascript" src="webjars/doc-db/js/doc-db.js"></script>
</html>

File diff suppressed because one or more lines are too long

View File

@@ -1,218 +1,14 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<!--无论发布在哪、如何修改源码,请勿删除本行原作者信息,感谢-->
<meta name="author" content="开发者列表暮光城中城项目地址https://gitee.com/zyplayer/zyplayer-doc" />
<title>数据库文档</title>
<link rel="shortcut icon" href="webjars/doc-db/img/api.ico"/>
<link rel="stylesheet" href="webjars/zui/css/zui.min.css" />
<link rel="stylesheet" href="webjars/zui/css/zui-theme.min.css">
<link rel="stylesheet" href="webjars/zui/lib/chosen/chosen.min.css" />
<link rel="stylesheet" href="webjars/doc-db/css/doc-db.css" />
<meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>数据库文档管理</title>
</head>
<body>
<div class="container">
<div class="row choise-db">
<div class="col-md-3">
<select id="choiseHost" data-placeholder="选择一个连接" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-3">
<select id="choiseDatabase" data-placeholder="选择一个数据库" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-3">
<select id="choiseTable" data-placeholder="选择一张表" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-3">
<button class="btn btn-primary" type="button" id="fuzzySearchBtn">模糊查询</button>
<button class="btn btn-primary" type="button" id="exportBtn">导出</button>
<button class="btn" type="button" id="showEchartsBtn">显示表关系图</button>
</div>
</div>
<div class="table-info">
<div style="height: 35px;line-height: 35px;">
表名:<span class="table-name"></span>
<button class="btn pull-right" type="button" id="aboutBtn" style="margin-right: 30px;">关于</button>
</div>
<div class="desc">
<div id="tableDescShow">
<span class="table-desc"></span>
<i class="icon icon-edit" title="编辑表注释"></i>
</div>
<textarea id="tableDescInput" rows="2" class="form-control"></textarea>
</div>
</div>
<div class="table-columns">
<table class="table table-bordered table-striped table-hover" id="tableCloumnsTable">
<thead>
<tr><th>字段名</th><th>自增</th><th>类型</th><th>长度</th><th>NULL</th><th>主键</th><th>注释</th></tr>
</thead>
<tbody></tbody>
</table>
</div>
<div id="tableRelationBox" class="hide" style="width: 100%;height:100px;">
<div class="alert alert-warning alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<p>
Tips本关系图不是通过外键生成所以需要在字段注释最后按规则添加外键关系才能生成图表支持的格式有<br/>
1、T:表XXX(字段注释)T:user_info<br/>
2、T:表.关联IDXXX(字段注释)T:user_info.id<br/>
3、T:库.表.关联IDXXX(字段注释)T:order_db.user_info.id<br/>
实验功能,有更好的建议或展示方式欢迎<a target="_blank" href="https://gitee.com/zyplayer/zyplayer-doc">提交建议</a>
</p>
</div>
<div id="tableRelationCharts" style="width: 100%;height:100%;margin-bottom: 50px;"></div>
</div>
<!-- 模糊查询 -->
<div class="modal fade" id="fuzzySearchModal">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span><span class="sr-only">关闭</span>
</button>
<h4 class="modal-title">通过字段名或释义模糊查询</h4>
</div>
<div class="modal-body">
<div class="row choise-db">
<div class="col-md-3">
<select id="choiseFuzzyHost" data-placeholder="选择一个连接" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-3">
<select id="choiseFuzzyDatabase" data-placeholder="选择一个数据库" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-4">
<input id="searchText" type="text" class="form-control" placeholder="搜索内容,字段名或注释">
</div>
<div class="col-md-2">
<button id="doSearch" class="btn btn-primary" type="button">查询 <i class="icon icon-spin icon-spinner-snake hidden"></i></button>
</div>
</div>
<div class="modal-table-box">
<table class="table table-bordered table-striped table-hover" id="fuzzySearchTable">
<thead>
<tr><th>表名</th><th>字段名</th><th>注释</th></tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- 导出弹出框 -->
<div class="modal fade" id="exportModal">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span><span class="sr-only">关闭</span>
</button>
<h4 class="modal-title">导出数据库文档</h4>
</div>
<div class="modal-body">
<div class="row choise-db">
<div class="col-md-3">
<select id="choiseExportHost" data-placeholder="选择一个连接" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-3">
<select id="choiseExportDatabase" data-placeholder="选择一个数据库" class="chosen-select form-control" tabindex="2">
<option value=""></option>
</select>
</div>
<div class="col-md-6">
<button id="doExport" class="btn btn-primary" type="button">确认导出 <i class="icon icon-spin icon-spinner-snake hidden"></i></button>
<button id="checkAllTable" class="btn" type="button">全选</button>
<button id="notCheckAllTable" class="btn" type="button">全不选</button>
</div>
</div>
<div class="alert alert-danger">
请到 <a target="_blank" href="https://gitee.com/zyplayer/zyplayer-doc-db">源码处下载</a>《对外文档模板.zip》解压
然后将“确认导出”后的文件放至/js目录下文件名必须为database.js<br/>
然后双击打开目录下的doc-db.html 即可看到导出的文档
</div>
<div class="modal-table-box">
<ul id="exportUl"></ul>
</div>
</div>
</div>
</div>
</div>
<!-- 关于弹出框 -->
<div class="modal fade" id="aboutModal">
<div class="modal-dialog modal-lg" style="width: 600px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span><span class="sr-only">关闭</span>
</button>
<h4 class="modal-title">关于zyplayer-doc-db</h4>
</div>
<div class="modal-body">
<form class="form-horizontal" style="line-height: 30px;">
<div class="form-group">
<label class="col-sm-2 no-padding">项目地址:</label>
<div class="col-md-6 col-sm-10">
<a target="_blank" href="https://gitee.com/zyplayer/zyplayer-doc">zyplayer-doc</a>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 no-padding">开发人员:</label>
<div class="col-md-6 col-sm-10">
<a target="_blank" href="http://zyplayer.com">暮光:城中城</a>
</div>
</div>
<div class="form-group upgrade-info">
<label class="col-sm-2 no-padding">当前版本:</label>
<div class="col-md-10 col-sm-10" id="upgradeNowVersion"></div>
</div>
<div class="form-group upgrade-info">
<label class="col-sm-2 no-padding">最新版本:</label>
<div class="col-md-10 col-sm-10" id="upgradeLastVersion"></div>
</div>
<div class="form-group upgrade-info">
<label class="col-sm-2 no-padding">升级地址:</label>
<div class="col-md-10 col-sm-10" id="upgradeUrl"></div>
</div>
<div class="form-group upgrade-info">
<label class="col-sm-2 no-padding">升级内容:</label>
<div class="col-md-10 col-sm-10" id="upgradeContent"></div>
</div>
<div class="form-group">
<div class="col-sm-2 no-padding"></div>
<div class="col-md-10 col-sm-10">
欢迎加群讨论QQ群号466363173欢迎提交需求欢迎使用和加入开发
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="webjars/doc-db/js/jquery-3.1.0.min.js"></script>
<script type="text/javascript" src="webjars/zui/js/zui.min.js"></script>
<script type="text/javascript" src="webjars/zui/lib/chosen/chosen.min.js"></script>
<script type="text/javascript" src="webjars/doc-db/js/echarts.min.js"></script>
<script type="text/javascript" src="webjars/doc-db/js/option-table-relation.js"></script>
<script type="text/javascript" src="webjars/doc-db/js/formatjson.js"></script>
<script type="text/javascript" src="webjars/doc-db/js/toast.js"></script>
<script type="text/javascript" src="webjars/doc-db/js/common.js"></script>
<script type="text/javascript" src="webjars/doc-db/js/doc-db.js"></script>
<body>
<div id="app"></div>
<script type="text/javascript" src="doc-db-manifest.js?238d259f7c3272512ca7"></script><script type="text/javascript" src="doc-db-vendor.js?8ab79790306f3488666d"></script><script type="text/javascript" src="doc-db-index.js?53a38fa9138d53368f6f"></script></body>
</html>