@ -1,2 +1,3 @@ |
|||||
/log/ |
/log/ |
||||
/target/ |
/target/ |
||||
|
.idea/ |
||||
@ -0,0 +1,2 @@ |
|||||
|
|
||||
|
面板网站 https://zuramai.github.io/mazer/demo/account-profile.html |
||||
@ -0,0 +1,225 @@ |
|||||
|
package com.bt.common.realname; |
||||
|
|
||||
|
import java.time.LocalDateTime; |
||||
|
|
||||
|
import cn.hutool.core.date.DatePattern; |
||||
|
import cn.hutool.core.date.DateUtil; |
||||
|
import cn.hutool.core.text.StrFormatter; |
||||
|
import cn.hutool.core.util.RandomUtil; |
||||
|
import cn.hutool.core.util.StrUtil; |
||||
|
import com.alipay.api.AlipayApiException; |
||||
|
import com.alipay.api.AlipayClient; |
||||
|
import com.alipay.api.AlipayConfig; |
||||
|
import com.alipay.api.DefaultAlipayClient; |
||||
|
import com.alipay.api.domain.DatadigitalFincloudGeneralsaasFaceCertifyInitializeModel; |
||||
|
import com.alipay.api.domain.DatadigitalFincloudGeneralsaasFaceCertifyQueryModel; |
||||
|
import com.alipay.api.domain.OpenCertifyIdentifyInfo; |
||||
|
import com.alipay.api.domain.OpenCertifyMerchantConfigs; |
||||
|
import com.alipay.api.request.DatadigitalFincloudGeneralsaasFaceCertifyInitializeRequest; |
||||
|
import com.alipay.api.request.DatadigitalFincloudGeneralsaasFaceCertifyQueryRequest; |
||||
|
import com.alipay.api.request.DatadigitalFincloudGeneralsaasFaceCertifyVerifyRequest; |
||||
|
import com.alipay.api.response.DatadigitalFincloudGeneralsaasFaceCertifyInitializeResponse; |
||||
|
import com.alipay.api.response.DatadigitalFincloudGeneralsaasFaceCertifyQueryResponse; |
||||
|
import com.alipay.api.response.DatadigitalFincloudGeneralsaasFaceCertifyVerifyResponse; |
||||
|
import com.bt.common.model.Account; |
||||
|
import com.bt.common.model.RealnameVerification; |
||||
|
import com.jfinal.kit.PropKit; |
||||
|
import com.jfinal.kit.Ret; |
||||
|
|
||||
|
/** |
||||
|
* 实名认证业务 |
||||
|
*/ |
||||
|
public class RealnameService { |
||||
|
private RealnameVerification dao = new RealnameVerification().dao(); |
||||
|
|
||||
|
public RealnameVerification getByAccountId(Integer accountId, String columns) { |
||||
|
return dao.findFirst("select " + columns +" from realname_verification where yn=1 and accountId=? limit 1", accountId); |
||||
|
} |
||||
|
public Ret doRealName(RealnameVerification realnameVerification){ |
||||
|
realnameVerification.setRealname(realnameVerification.getRealname().trim()); |
||||
|
RealnameVerification oldRealName = getByAccountId(realnameVerification.getAccountId(), "id, realname, idCard, status, submitDate, certifyId, certifyUrl," |
||||
|
+ "certifyUrlExpireAt"); |
||||
|
if (oldRealName != null) { |
||||
|
if (oldRealName.getStatus() == RealnameVerification.STATUS_WAIT) { |
||||
|
System.out.println(StrUtil.equals(realnameVerification.getRealname(), oldRealName.getRealname())); |
||||
|
if (StrUtil.equals(realnameVerification.getRealname(), oldRealName.getRealname())&&StrUtil.equals(realnameVerification.getIdCard(), |
||||
|
oldRealName.getIdCard())&&oldRealName.getCertifyUrlExpireAt()>System.currentTimeMillis()){ |
||||
|
return Ret.ok("certifyUrl", oldRealName.getCertifyUrl()).set("certifyId", oldRealName.getCertifyId()); |
||||
|
} else { |
||||
|
Ret ret = alipayFaceVerify(realnameVerification.getRealname(), realnameVerification.getIdCard()); |
||||
|
if (ret.isOk()){ |
||||
|
RealnameVerification upRealName = new RealnameVerification(); |
||||
|
upRealName.setId(oldRealName.getId()); |
||||
|
String certifyId = ret.getStr("certifyId"); |
||||
|
String certifyUrl = ret.getStr("certifyUrl"); |
||||
|
long et = 3600*1000; // 使用 long et 3600秒(1小时) x 20
|
||||
|
long expireAt = System.currentTimeMillis() + (et * 20); |
||||
|
System.out.println(expireAt); |
||||
|
upRealName.setSubmitDate(LocalDateTime.now()); |
||||
|
upRealName.setCertifyId(certifyId); |
||||
|
upRealName.setCertifyUrl(certifyUrl); |
||||
|
upRealName.setCertifyUrlExpireAt(expireAt); |
||||
|
upRealName.update(); |
||||
|
return Ret.ok("certifyUrl", certifyUrl).set("certifyId", certifyId); |
||||
|
}else { |
||||
|
return Ret.fail("实名认证异常,请重试或联系管理员"); |
||||
|
} |
||||
|
} |
||||
|
} else { |
||||
|
return Ret.ok("msg", "已认证过无须再次认证"); |
||||
|
} |
||||
|
} else { |
||||
|
//调用支付宝实名获取链接
|
||||
|
Ret ret = alipayFaceVerify(realnameVerification.getRealname(), realnameVerification.getIdCard()); |
||||
|
System.out.println(ret); |
||||
|
if (ret.isOk()){ |
||||
|
String certifyId = ret.getStr("certifyId"); |
||||
|
String certifyUrl = ret.getStr("certifyUrl"); |
||||
|
long et = 3600*1000; // 使用 long et 3600秒(1小时) x 20
|
||||
|
long expireAt = System.currentTimeMillis() + (et * 20); |
||||
|
realnameVerification.setStatus(RealnameVerification.STATUS_WAIT); |
||||
|
realnameVerification.setSubmitDate(LocalDateTime.now()); |
||||
|
realnameVerification.setCertifyId(certifyId); |
||||
|
realnameVerification.setCertifyUrl(certifyUrl); |
||||
|
realnameVerification.setCertifyUrlExpireAt(expireAt); |
||||
|
realnameVerification.setCreateTime(LocalDateTime.now()); |
||||
|
realnameVerification.save(); |
||||
|
return Ret.ok("certifyUrl", certifyUrl).set("certifyId", certifyId); |
||||
|
} else { |
||||
|
return Ret.fail("实名认证异常,请重试或联系管理员"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public Ret queryRealName(Integer accountId){ |
||||
|
RealnameVerification realName = getByAccountId(accountId, "id, realname,idCard,status,submitDate, certifyId, certifyUrl"); |
||||
|
if (realName==null){ |
||||
|
return Ret.fail("实名认证查询异常,请联系管理员"); |
||||
|
} |
||||
|
if(StrUtil.isBlank(realName.getCertifyId())){ |
||||
|
return Ret.fail("实名认证查询异常,请联系管理员"); |
||||
|
} |
||||
|
Ret ret = alipayFaceQuery(realName.getCertifyId()); |
||||
|
if (ret.isOk()){ |
||||
|
String passed = ret.getStr("passed"); |
||||
|
if ("T".equals(passed)){ |
||||
|
RealnameVerification upRealName = new RealnameVerification(); |
||||
|
upRealName.setId(realName.getId()); |
||||
|
upRealName.setStatus(RealnameVerification.STATUS_SUCCESS); |
||||
|
Account account = new Account(); |
||||
|
account.setRealnameVerified(Account.REAL_NAME_YES); |
||||
|
account.setId(accountId); |
||||
|
account.update(); |
||||
|
upRealName.update(); |
||||
|
return Ret.ok(); |
||||
|
}else { |
||||
|
return Ret.fail("未完成实名认证或认证不通过,请重新扫码认证"); |
||||
|
} |
||||
|
}else { |
||||
|
return Ret.fail("实名认证查询异常,请重试或联系管理员"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
private Ret alipayFaceVerify(String realName, String idCard) { |
||||
|
try{ |
||||
|
String randomStr = RandomUtil.randomString(6); |
||||
|
String outerOrderNo = StrFormatter.format("BT{}{}", DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_MS_PATTERN), randomStr); |
||||
|
System.out.println("outerOrderNo"+ outerOrderNo); |
||||
|
DatadigitalFincloudGeneralsaasFaceCertifyInitializeResponse response = getDatadigitalFincloudGeneralsaasFaceCertifyInitializeResponse( |
||||
|
realName, idCard, outerOrderNo); |
||||
|
if (response.isSuccess()) { |
||||
|
String certifyId = response.getCertifyId(); |
||||
|
DatadigitalFincloudGeneralsaasFaceCertifyVerifyResponse verifyResponse = |
||||
|
getDatadigitalFincloudGeneralsaasFaceCertifyVerifyResponse(certifyId); |
||||
|
if (verifyResponse.isSuccess()){ |
||||
|
return Ret.ok("certifyUrl", verifyResponse.getCertifyUrl()).set("certifyId", certifyId); |
||||
|
}else { |
||||
|
return Ret.fail(); |
||||
|
} |
||||
|
} else { |
||||
|
return Ret.fail(); |
||||
|
} |
||||
|
}catch (AlipayApiException e){ |
||||
|
return Ret.fail(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private Ret alipayFaceQuery(String certifyId) { |
||||
|
try{ |
||||
|
DatadigitalFincloudGeneralsaasFaceCertifyQueryResponse response = getDatadigitalFincloudGeneralsaasFaceCertifyQueryResponse(certifyId); |
||||
|
if (response.isSuccess()) { |
||||
|
String passed = response.getPassed(); |
||||
|
return Ret.ok("passed", passed); |
||||
|
} else { |
||||
|
return Ret.fail("实名认证查询异常,请重试或联系管理员"); |
||||
|
} |
||||
|
} catch (AlipayApiException e){ |
||||
|
return Ret.fail(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private DatadigitalFincloudGeneralsaasFaceCertifyInitializeResponse getDatadigitalFincloudGeneralsaasFaceCertifyInitializeResponse (String realName, |
||||
|
String idCard, String outerOrderNo) throws AlipayApiException { |
||||
|
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); |
||||
|
// 构造请求参数以调用接口
|
||||
|
DatadigitalFincloudGeneralsaasFaceCertifyInitializeRequest request = new DatadigitalFincloudGeneralsaasFaceCertifyInitializeRequest(); |
||||
|
DatadigitalFincloudGeneralsaasFaceCertifyInitializeModel model = new DatadigitalFincloudGeneralsaasFaceCertifyInitializeModel(); |
||||
|
// 设置H5人脸核身场景码
|
||||
|
model.setBizCode("FUTURE_TECH_BIZ_FACE_SDK"); |
||||
|
// 设置认证信息
|
||||
|
OpenCertifyIdentifyInfo identityParam = new OpenCertifyIdentifyInfo(); |
||||
|
identityParam.setCertType("IDENTITY_CARD"); |
||||
|
identityParam.setCertName(realName); |
||||
|
identityParam.setCertNo(idCard); |
||||
|
identityParam.setIdentityType("CERT_INFO"); |
||||
|
model.setIdentityParam(identityParam); |
||||
|
// 设置商户请求的唯一标识 "BT20240411224901000001231"
|
||||
|
model.setOuterOrderNo(outerOrderNo); |
||||
|
// 设置商户配置信息
|
||||
|
OpenCertifyMerchantConfigs merchantConfig = new OpenCertifyMerchantConfigs(); |
||||
|
merchantConfig.setFaceReserveStrategy("reserve"); |
||||
|
merchantConfig.setReturnUrl(""); |
||||
|
model.setMerchantConfig(merchantConfig); |
||||
|
request.setBizModel(model); |
||||
|
return alipayClient.execute(request); |
||||
|
} |
||||
|
|
||||
|
private DatadigitalFincloudGeneralsaasFaceCertifyVerifyResponse getDatadigitalFincloudGeneralsaasFaceCertifyVerifyResponse(String certifyId) |
||||
|
throws AlipayApiException { |
||||
|
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); |
||||
|
DatadigitalFincloudGeneralsaasFaceCertifyVerifyRequest request = new DatadigitalFincloudGeneralsaasFaceCertifyVerifyRequest(); |
||||
|
request.setBizContent("{\"certify_id\":\"" + certifyId + "\"}"); |
||||
|
return alipayClient.execute(request); |
||||
|
} |
||||
|
|
||||
|
private DatadigitalFincloudGeneralsaasFaceCertifyQueryResponse getDatadigitalFincloudGeneralsaasFaceCertifyQueryResponse(String certifyId) |
||||
|
throws AlipayApiException { |
||||
|
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); |
||||
|
DatadigitalFincloudGeneralsaasFaceCertifyQueryRequest request = new DatadigitalFincloudGeneralsaasFaceCertifyQueryRequest(); |
||||
|
DatadigitalFincloudGeneralsaasFaceCertifyQueryModel model = new DatadigitalFincloudGeneralsaasFaceCertifyQueryModel(); |
||||
|
// 设置本次申请操作的唯一标识
|
||||
|
model.setCertifyId(certifyId); |
||||
|
request.setBizModel(model); |
||||
|
return alipayClient.execute(request); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
private AlipayConfig getAlipayConfig() { |
||||
|
String appId = PropKit.get("alipayAppId"); |
||||
|
String privateKey = PropKit.get("alipayPrivateKey"); |
||||
|
String alipayPublicKey = PropKit.get("alipayPublicKey"); |
||||
|
AlipayConfig alipayConfig = new AlipayConfig(); |
||||
|
alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do"); |
||||
|
alipayConfig.setAppId(appId); |
||||
|
alipayConfig.setPrivateKey(privateKey); |
||||
|
alipayConfig.setFormat("json"); |
||||
|
alipayConfig.setAlipayPublicKey(alipayPublicKey); |
||||
|
alipayConfig.setCharset("UTF-8"); |
||||
|
alipayConfig.setSignType("RSA2"); |
||||
|
return alipayConfig; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,51 @@ |
|||||
|
package com.bt.product; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
import com.bt.common.model.Product; |
||||
|
import com.bt.common.model.Project; |
||||
|
import com.bt.common.safe.JsoupFilter; |
||||
|
import com.jfinal.kit.Kv; |
||||
|
import com.jfinal.plugin.activerecord.Page; |
||||
|
import com.jfinal.plugin.ehcache.CacheKit; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* ProductService |
||||
|
*/ |
||||
|
public class ProductService { |
||||
|
private Product dao = new Product().dao(); |
||||
|
|
||||
|
public Page<Product> paginate(int pageNumber) { |
||||
|
Page<Product> productPage = dao.template("product.paginate").paginate(pageNumber, 16); |
||||
|
// 列表页显示 content 的摘要信息需要过滤为纯文本,去除所有标记
|
||||
|
//JsoupFilter.filterArticleList(productPage.getList(), 50, 120);
|
||||
|
return productPage; |
||||
|
} |
||||
|
|
||||
|
public Product findById(int projectId) { |
||||
|
return dao.template("project.findById", projectId, Project.REPORT_BLOCK_NUM).findFirst(); |
||||
|
} |
||||
|
|
||||
|
public Product findById(int projectId, String columns) { |
||||
|
Kv para = Kv.by("columns", columns).set("id", projectId).set("report", Project.REPORT_BLOCK_NUM); |
||||
|
return dao.template("project.findByIdWithColumns", para).findFirst(); |
||||
|
} |
||||
|
|
||||
|
public List<Product> getHotProject() { |
||||
|
return dao.template("project.getHotProject", Project.REPORT_BLOCK_NUM).findByCache("hotProject", "hotProject"); |
||||
|
} |
||||
|
|
||||
|
public void clearHotProjectCache() { |
||||
|
CacheKit.remove("hotProject", "hotProject"); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 暂时用于个人空间的创建、更新 share、feedback 模块,用于显示关联项目的下拉列表,将来改成按热度排序 |
||||
|
* 项目数量多了以后考虑用输入框配合 autocomplete 提示输入来实现 |
||||
|
*/ |
||||
|
public List<Product> getAllProject(String columns) { |
||||
|
Kv para = Kv.by("columns", columns).set("report", Project.REPORT_BLOCK_NUM); |
||||
|
return dao.template("project.getAllProject", para).find(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,30 @@ |
|||||
|
#sql("paginate") |
||||
|
select p.id, |
||||
|
substring(p.name, 1, 100) as name, |
||||
|
p.cpuName, p.memoryCapacity, p.graphicsCardModel, p.dataDiskCapacity, p.downloadSpeed, |
||||
|
substring(p.content, 1, 180) as content, p.createAt as createAt |
||||
|
from product p |
||||
|
#end |
||||
|
|
||||
|
#sql("findById") |
||||
|
select p.* , a.avatar, a.nickName |
||||
|
from product p inner join account a on p.accountId = a.id |
||||
|
where p.id = #para(0) and p.report < #para(1) limit 1 |
||||
|
#end |
||||
|
|
||||
|
#sql("findByIdWithColumns") |
||||
|
select #(columns) from product where id = #para(id) and report < #para(report) limit 1 |
||||
|
#end |
||||
|
|
||||
|
#sql("getHotproduct") |
||||
|
select id, title from product where report < #para(0) order by createAt asc limit 10 |
||||
|
#end |
||||
|
|
||||
|
#sql("getAllproduct") |
||||
|
select #(columns) from product where report < #para(report) order by createAt asc |
||||
|
#end |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,183 @@ |
|||||
|
#@adminLayout() |
||||
|
|
||||
|
#define main() |
||||
|
### isAdd 表示创建,isEdit 表示修改 |
||||
|
#set(isAdd = product == null ? true : false, isEdit = !isAdd) |
||||
|
|
||||
|
<div class="jfa-header-box" id="jfa-header-box"> |
||||
|
<div class="jfa-crumbs" id="jfa-crumbs"> |
||||
|
产品管理 / #(isAdd ? "创建" : "修改") |
||||
|
</div> |
||||
|
<div class="jfa-search-box"></div> |
||||
|
#include("/_view/_admin/common/_header_right.html") |
||||
|
</div> |
||||
|
|
||||
|
### 内容区域 |
||||
|
<div class="jfa-content-box" id="jfa-content-box"> |
||||
|
<div class="jfa-content" id="jfa-content"> |
||||
|
<form class="clearfix margin-top-25" id="myArticleForm" action="/admin/product/#(isAdd ? 'save' : 'update')" method="post"> |
||||
|
|
||||
|
#if (isEdit) |
||||
|
<input type="hidden" name="product.id" value="#(product.id)" /> |
||||
|
#end |
||||
|
|
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>产品名称</label> |
||||
|
<input type="text" class="form-control" name="product.name" value="#(product.name??)" placeholder="产品唯一标识" /> |
||||
|
</div> |
||||
|
|
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>CPU数</label> |
||||
|
<input type="text" class="form-control" name="product.cpuCount" value="#(product.cpuCount??)" placeholder="CPU数" /> |
||||
|
</div> |
||||
|
|
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>CPU名称</label> |
||||
|
<input type="text" class="form-control" name="product.cpuName" value="#(product.cpuName??)" placeholder="CPU名称" /> |
||||
|
</div> |
||||
|
|
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>CPU主频</label> |
||||
|
<input type="text" class="form-control" name="product.cpuFrequency" value="#(product.cpuFrequency??)" placeholder="CPU主频" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>单U核心数</label> |
||||
|
<input type="text" class="form-control" name="product.singleCoreCount" value="#(product.singleCoreCount??)" placeholder="单U核心数" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>双U核心数</label> |
||||
|
<input type="text" class="form-control" name="product.dualCoreCount" value="#(product.dualCoreCount??)" placeholder="双U核心数" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>单U核心数</label> |
||||
|
<input type="text" class="form-control" name="product.singleCoreCount" value="#(product.singleCoreCount??)" placeholder="单U核心数" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>总线程数</label> |
||||
|
<input type="text" class="form-control" name="product.totalThreadCount" value="#(product.totalThreadCount??)" placeholder="总线程数" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>内存容量</label> |
||||
|
<input type="text" class="form-control" name="product.memoryCapacity" value="#(product.memoryCapacity??)" placeholder="内存容量" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>内存速度</label> |
||||
|
<input type="text" class="form-control" name="product.memorySpeed" value="#(product.memorySpeed??)" placeholder="内存速度" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>物理盘</label> |
||||
|
<input type="text" class="form-control" name="product.physicalDisk" value="#(product.physicalDisk??)" placeholder="物理盘" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>系统盘颗粒</label> |
||||
|
<input type="text" class="form-control" name="product.systemDiskParticle" value="#(product.systemDiskParticle??)" placeholder="系统盘颗粒" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>数据盘容量</label> |
||||
|
<input type="text" class="form-control" name="product.dataDiskCapacity" value="#(product.dataDiskCapacity??)" placeholder="数据盘容量" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>数据盘读取速度</label> |
||||
|
<input type="text" class="form-control" name="product.dataDiskReadSpeed" value="#(product.dataDiskReadSpeed??)" placeholder="数据盘读取速度" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>数据盘写入速度</label> |
||||
|
<input type="text" class="form-control" name="product.dataDiskWriteSpeed" value="#(product.dataDiskWriteSpeed??)" placeholder="数据盘写入速度" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>显卡型号</label> |
||||
|
<input type="text" class="form-control" name="product.graphicsCardModel" value="#(product.graphicsCardModel??)" placeholder="显卡型号" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>显存容量</label> |
||||
|
<input type="text" class="form-control" name="product.graphicsMemoryCapacity" value="#(product.graphicsMemoryCapacity??)" placeholder="显存容量" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>下载速度</label> |
||||
|
<input type="text" class="form-control" name="product.downloadSpeed" value="#(product.downloadSpeed??)" placeholder="下载速度" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>上传速度</label> |
||||
|
<input type="text" class="form-control" name="product.uploadSpeed" value="#(product.uploadSpeed??)" placeholder="上传速度" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>内网带宽</label> |
||||
|
<input type="text" class="form-control" name="product.internalNetworkBandwidth" value="#(product.internalNetworkBandwidth??)" placeholder="内网带宽" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>日租费用</label> |
||||
|
<input type="text" class="form-control" name="product.dailyRentalFee" value="#(product.dailyRentalFee??)" placeholder="日租费用" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>月租费用</label> |
||||
|
<input type="text" class="form-control" name="product.monthlyRentalFee" value="#(product.monthlyRentalFee??)" placeholder="月租费用" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>单价/核心</label> |
||||
|
<input type="text" class="form-control" name="product.pricePerCore" value="#(product.pricePerCore??)" placeholder="单价/核心" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>单UTDP</label> |
||||
|
<input type="text" class="form-control" name="product.singleUtdp" value="#(product.singleUtdp??)" placeholder="单UTDP" /> |
||||
|
</div> |
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>总TDP</label> |
||||
|
<input type="text" class="form-control" name="product.totalTdp" value="#(product.totalTdp??)" placeholder="总TDP" /> |
||||
|
</div> |
||||
|
|
||||
|
<div class="form-group margin-bottom-20"> |
||||
|
<label>附加内容</label> |
||||
|
<div> |
||||
|
<script id="container" name="product.content" style="line-height: 20px;" type="text/plain">#(project.content??)</script> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="pull-right margin-bottom-20" > |
||||
|
<input class="btn btn-primary" type="submit" value="提交" /> |
||||
|
</div> |
||||
|
</form> |
||||
|
|
||||
|
</div><!-- END OF jfa-content --> |
||||
|
</div><!-- END OF jfa-content-box --> |
||||
|
|
||||
|
<style type="text/css"> |
||||
|
.jfa-content label { |
||||
|
line-height: 1; |
||||
|
vertical-align: baseline; |
||||
|
color: #23527c; |
||||
|
font-size: 20px; |
||||
|
font-weight: normal; |
||||
|
margin-bottom: 8px;; |
||||
|
} |
||||
|
</style> |
||||
|
|
||||
|
<script type="text/javascript"> |
||||
|
$(document).ready(function() { |
||||
|
initUeditor(); |
||||
|
|
||||
|
// 上传时在 url 中用问号挂参的方式添加额外的参数 uploadType,用于分类管理图片 |
||||
|
env.ueditor.ready(function() { |
||||
|
env.ueditor.execCommand('serverparam', { |
||||
|
'uploadType': 'product' |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
$("#myArticleForm").ajaxForm({ |
||||
|
dataType: "json" |
||||
|
, beforeSubmit: function(formData, jqForm, options) { |
||||
|
env.ueditor.sync(); // 同步一下 ueditor 中的数据到表单域 |
||||
|
} |
||||
|
, success: function(ret) { |
||||
|
if (ret.state == "ok") { |
||||
|
location.href = "/admin/product?p=#(p ?? 1)"; |
||||
|
} else { |
||||
|
showFailMsg(ret.msg); |
||||
|
} |
||||
|
} |
||||
|
, error: function(ret) {alert(ret.statusText);} |
||||
|
, complete: function(ret) {} // 无论是 success 还是 error,最终都会被回调 |
||||
|
}); |
||||
|
}); |
||||
|
</script> |
||||
|
|
||||
|
#end |
||||
@ -0,0 +1,136 @@ |
|||||
|
#@adminLayout() |
||||
|
|
||||
|
#define main() |
||||
|
<div class="jfa-header-box" id="jfa-header-box"> |
||||
|
<div class="jfa-crumbs" id="jfa-crumbs"> |
||||
|
产品管理 |
||||
|
</div> |
||||
|
<div class="jfa-search-box"> |
||||
|
<form action="/admin/project/search"> |
||||
|
### <input class="jfa-search" type="text" name="keyword" placeholder="搜索" > |
||||
|
</form> |
||||
|
</div> |
||||
|
#include("/_view/_admin/common/_header_right.html") |
||||
|
</div> |
||||
|
|
||||
|
### 内容区域 |
||||
|
<div class="jfa-content-box" id="jfa-content-box"> |
||||
|
<div class="jfa-content" id="jfa-content"> |
||||
|
|
||||
|
<div class="jfa-toolbar"> |
||||
|
<a class="btn btn-primary btn-sm" href="/admin/product/add"> |
||||
|
<i class="fa fa-plus"></i> |
||||
|
创建产品 |
||||
|
</a> |
||||
|
</div> |
||||
|
|
||||
|
<div class="jfa-table-box margin-top-30"> |
||||
|
<table class="table table-bordered table-hover margin-bottom-10"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th>id</th> |
||||
|
<th>名称</th> |
||||
|
<th>CPU数</th> |
||||
|
<th>CPU名称</th> |
||||
|
<th>单U核心数</th> |
||||
|
<th>双U核心数</th> |
||||
|
<th>总线程数</th> |
||||
|
<th>内存容量</th> |
||||
|
<th>内存速度</th> |
||||
|
<th>物理盘</th> |
||||
|
<th>系统盘颗粒</th> |
||||
|
<th>数据盘容量</th> |
||||
|
<th>数据盘读取速度</th> |
||||
|
<th>数据盘写入速度</th> |
||||
|
<th>显卡型号</th> |
||||
|
<th>显存容量</th> |
||||
|
<th>下载速度</th> |
||||
|
<th>上传速度</th> |
||||
|
<th>上传速度</th> |
||||
|
<th>内网带宽</th> |
||||
|
<th>日租费用</th> |
||||
|
<th>月租费用</th> |
||||
|
<th>单价/核心</th> |
||||
|
<th>单UTDP</th> |
||||
|
<th>总TDP</th> |
||||
|
<th>创建时间</th> |
||||
|
<th>操作</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
#for(x : productPage.getList()) |
||||
|
<tr> |
||||
|
<th scope="row">#(x.id)</th> |
||||
|
<td>#(x.name)</td> |
||||
|
<td>#(x.cpuCount)</td> |
||||
|
<td>#(x.cpuName)</td> |
||||
|
<td>#(x.cpuFrequency)</td> |
||||
|
<td>#(x.singleCoreCount)</td> |
||||
|
<td>#(x.dualCoreCount)</td> |
||||
|
<td>#(x.totalThreadCount)</td> |
||||
|
<td>#(x.memoryCapacity)</td> |
||||
|
<td>#(x.memorySpeed)</td> |
||||
|
<td>#(x.physicalDisk)</td> |
||||
|
<td>#(x.systemDiskParticle)</td> |
||||
|
<td>#(x.dataDiskCapacity)</td> |
||||
|
<td>#(x.dataDiskReadSpeed)</td> |
||||
|
<td>#(x.dataDiskWriteSpeed)</td> |
||||
|
<td>#(x.graphicsCardModel)</td> |
||||
|
<td>#(x.graphicsMemoryCapacity)</td> |
||||
|
<td>#(x.downloadSpeed)</td> |
||||
|
<td>#(x.uploadSpeed)</td> |
||||
|
<td>#(x.internalNetworkBandwidth)</td> |
||||
|
<td>#(x.dailyRentalFee)</td> |
||||
|
<td>#(x.monthlyRentalFee)</td> |
||||
|
<td>#(x.pricePerCore)</td> |
||||
|
<td>#(x.singleUtdp)</td> |
||||
|
<td>#(x.totalTdp)</td> |
||||
|
<td>#date(x.createAt)</td> |
||||
|
<td class="jfa-operation-button"> |
||||
|
|
||||
|
#permission("/admin/product/edit") |
||||
|
<a href="/admin/product/edit?id=#(x.id)&p=#(productPage.pageNumber)"> |
||||
|
<i class="fa fa-pencil" title="修改"></i> |
||||
|
</a> |
||||
|
#end |
||||
|
|
||||
|
#permission("/admin/product/delete") |
||||
|
<a data-delete |
||||
|
data-title="#escape(x.title)" |
||||
|
data-action="/admin/product/delete?id=#(x.id)"> |
||||
|
<i class="fa fa-trash" title="删除"></i> |
||||
|
</a> |
||||
|
#end |
||||
|
</td> |
||||
|
</tr> |
||||
|
#end |
||||
|
</tbody> |
||||
|
</table> |
||||
|
|
||||
|
<div> |
||||
|
#@adminPaginate(productPage.pageNumber, productPage.totalPage, "/admin/product?p=") |
||||
|
</div> |
||||
|
</div> |
||||
|
</div><!-- END OF jfa-content --> |
||||
|
</div><!-- END OF jfa-content-box --> |
||||
|
|
||||
|
<style type="text/css"> |
||||
|
</style> |
||||
|
<script type="text/javascript"> |
||||
|
$(document).ready(function() { |
||||
|
initMagicInput(prepareAction); |
||||
|
}); |
||||
|
|
||||
|
function prepareAction($this, state) { |
||||
|
return { |
||||
|
url: state ? "/admin/project/lock" : "/admin/project/unlock", |
||||
|
data : { |
||||
|
id: $this.attr("data-id") |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
#end |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,244 @@ |
|||||
|
#define officialLayout() |
||||
|
<!DOCTYPE html> |
||||
|
<html lang="zh-CN"> |
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<meta http-equiv="x-ua-compatible" content="ie=edge" /> |
||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> |
||||
|
<meta name="referrer" content="always"> |
||||
|
<meta name="keywords" content="#(seoKeywords ?? '贝塔网络')"> |
||||
|
<meta name="description" content="#(seoDescr ?? '贝塔网络官方网站')"> |
||||
|
<title>#(seoTitle ?? "贝塔网络官方网站")</title> |
||||
|
<link rel="shortcut icon" type="image/x-icon" href="/assets/img/favicon.ico"> |
||||
|
<!-- ========================= CSS here ========================= --> |
||||
|
<link rel="stylesheet" href="/assets/official/css/bootstrap.min.css" /> |
||||
|
<link rel="stylesheet" href="/assets/official/css/LineIcons.2.0.css" /> |
||||
|
<link rel="stylesheet" href="/assets/official/css/animate.css" /> |
||||
|
<link rel="stylesheet" href="/assets/official/css/tiny-slider.css" /> |
||||
|
<link rel="stylesheet" href="/assets/official/css/glightbox.min.css" /> |
||||
|
<link rel="stylesheet" href="/assets/official/css/main.css" /> |
||||
|
|
||||
|
#@css?() |
||||
|
</head> |
||||
|
|
||||
|
<!--如果不需要悬浮的header 就去掉body上的class--> |
||||
|
<body> |
||||
|
<!-- Preloader --> |
||||
|
<div class="preloader"> |
||||
|
<div class="preloader-inner"> |
||||
|
<div class="preloader-icon"> |
||||
|
<span></span> |
||||
|
<span></span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- /End Preloader --> |
||||
|
|
||||
|
<!-- Start header部分 --> |
||||
|
<header class="header navbar-area"> |
||||
|
<div class="container"> |
||||
|
<div class="row align-items-center"> |
||||
|
<div class="col-lg-12"> |
||||
|
<div class="nav-inner"> |
||||
|
<!-- Start Navbar --> |
||||
|
<nav class="navbar navbar-expand-lg"> |
||||
|
<a class="navbar-brand" href="#(SSL)/"> |
||||
|
<img src="/assets/official/images/logo/white-logo.png" alt="Logo"> |
||||
|
</a> |
||||
|
<button class="navbar-toggler mobile-menu-btn" type="button" data-bs-toggle="collapse" |
||||
|
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" |
||||
|
aria-expanded="false" aria-label="Toggle navigation"> |
||||
|
<span class="toggler-icon"></span> |
||||
|
<span class="toggler-icon"></span> |
||||
|
<span class="toggler-icon"></span> |
||||
|
</button> |
||||
|
<div class="collapse navbar-collapse sub-menu-bar" id="navbarSupportedContent"> |
||||
|
<ul id="nav" class="navbar-nav ms-auto"> |
||||
|
<li class="nav-item"> |
||||
|
<a href="#(SSL)/" class="active">首页</a> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<a href="#(SSL)/product" >产品</a> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<a href="#overview" class="page-scroll" |
||||
|
aria-label="Toggle navigation">Overview</a> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<a href="#pricing" class="page-scroll" |
||||
|
aria-label="Toggle navigation">Pricing</a> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<a href="#team" class="page-scroll" aria-label="Toggle navigation">Team</a> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<a class="page-scroll dd-menu collapsed" href="#blog" data-bs-toggle="collapse" |
||||
|
data-bs-target="#submenu-1-4" aria-controls="navbarSupportedContent" |
||||
|
aria-expanded="false" aria-label="Toggle navigation">Blog</a> |
||||
|
<ul class="sub-menu collapse" id="submenu-1-4"> |
||||
|
<li class="nav-item"><a href="blog-grid-sidebar.html">Blog Grid Sidebar</a></li> |
||||
|
<li class="nav-item"><a href="blog-single.html">Blog Single</a></li> |
||||
|
<li class="nav-item"><a href="blog-single-sidebar.html">Blog Single |
||||
|
Sibebar</a></li> |
||||
|
</ul> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<a href="contact.html" aria-label="Toggle navigation">Contact</a> |
||||
|
</li> |
||||
|
</ul> |
||||
|
</div> <!-- navbar collapse --> |
||||
|
#if(loginAccount) |
||||
|
<!--登录后用下面这个--> |
||||
|
<div class="button add-list-button"> |
||||
|
<a href="#(SSL)/my" class="btn">控制台</a> |
||||
|
</div> |
||||
|
#else |
||||
|
<!--没登录用这个--> |
||||
|
<div class="button add-list-button"> |
||||
|
<a href="#(SSL)/reg" class="btn">注册</a> |
||||
|
<a href="#(SSL)/login" class="btn">登录</a> |
||||
|
</div> |
||||
|
#end |
||||
|
|
||||
|
</nav> |
||||
|
<!-- End Navbar --> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> <!-- row --> |
||||
|
</div> <!-- container --> |
||||
|
</header> |
||||
|
<!-- End header部分 --> |
||||
|
|
||||
|
<!--主体内容--> |
||||
|
#@main() |
||||
|
|
||||
|
<!-- Start Footer Area --> |
||||
|
<footer class="footer"> |
||||
|
<!-- Start Footer Top --> |
||||
|
<div class="footer-top"> |
||||
|
<div class="container"> |
||||
|
<div class="row"> |
||||
|
<div class="col-lg-4 col-md-4 col-12"> |
||||
|
<!-- Single Widget --> |
||||
|
<div class="single-footer f-about"> |
||||
|
<div class="logo"> |
||||
|
<a href="#(SSL)/"> |
||||
|
<img src="/assets/official/images/logo/white-logo.png" alt="#"> |
||||
|
</a> |
||||
|
</div> |
||||
|
<p>Making the world a better place through constructing elegant hierarchies.</p> |
||||
|
<ul class="social"> |
||||
|
<li><a href="javascript:void(0)"><i class="lni lni-facebook-filled"></i></a></li> |
||||
|
<li><a href="javascript:void(0)"><i class="lni lni-twitter-original"></i></a></li> |
||||
|
<li><a href="javascript:void(0)"><i class="lni lni-instagram"></i></a></li> |
||||
|
<li><a href="javascript:void(0)"><i class="lni lni-linkedin-original"></i></a></li> |
||||
|
<li><a href="javascript:void(0)"><i class="lni lni-youtube"></i></a></li> |
||||
|
<li><a href="javascript:void(0)"><i class="lni lni-pinterest"></i></a></li> |
||||
|
</ul> |
||||
|
<p class="copyright-text"><a target="_blank" href="http://www.mobanwang.com/" title="网页模板">网页模板</a> |
||||
|
</p> |
||||
|
</div> |
||||
|
<!-- End Single Widget --> |
||||
|
</div> |
||||
|
<div class="col-lg-8 col-md-8 col-12"> |
||||
|
<div class="row"> |
||||
|
<div class="col-lg-3 col-md-6 col-12"> |
||||
|
<!-- Single Widget --> |
||||
|
<div class="single-footer f-link"> |
||||
|
<h3>Solutions</h3> |
||||
|
<ul> |
||||
|
<li><a href="javascript:void(0)">Marketing</a></li> |
||||
|
<li><a href="javascript:void(0)">Analytics</a></li> |
||||
|
<li><a href="javascript:void(0)">Commerce</a></li> |
||||
|
<li><a href="javascript:void(0)">Insights</a></li> |
||||
|
<li><a href="javascript:void(0)">Promotion</a></li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
<!-- End Single Widget --> |
||||
|
</div> |
||||
|
<div class="col-lg-3 col-md-6 col-12"> |
||||
|
<!-- Single Widget --> |
||||
|
<div class="single-footer f-link"> |
||||
|
<h3>Support</h3> |
||||
|
<ul> |
||||
|
<li><a href="javascript:void(0)">Pricing</a></li> |
||||
|
<li><a href="javascript:void(0)">Documentation</a></li> |
||||
|
<li><a href="javascript:void(0)">Guides</a></li> |
||||
|
<li><a href="javascript:void(0)">API Status</a></li> |
||||
|
<li><a href="javascript:void(0)">Live Support</a></li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
<!-- End Single Widget --> |
||||
|
</div> |
||||
|
<div class="col-lg-3 col-md-6 col-12"> |
||||
|
<!-- Single Widget --> |
||||
|
<div class="single-footer f-link"> |
||||
|
<h3>Company</h3> |
||||
|
<ul> |
||||
|
<li><a href="javascript:void(0)">About Us</a></li> |
||||
|
<li><a href="javascript:void(0)">Our Blog</a></li> |
||||
|
<li><a href="javascript:void(0)">Jobs</a></li> |
||||
|
<li><a href="javascript:void(0)">Press</a></li> |
||||
|
<li><a href="javascript:void(0)">Contact Us</a></li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
<!-- End Single Widget --> |
||||
|
</div> |
||||
|
<div class="col-lg-3 col-md-6 col-12"> |
||||
|
<!-- Single Widget --> |
||||
|
<div class="single-footer f-link"> |
||||
|
<h3>Legal</h3> |
||||
|
<ul> |
||||
|
<li><a href="javascript:void(0)">Terms & Conditions</a></li> |
||||
|
<li><a href="javascript:void(0)">Privacy Policy</a></li> |
||||
|
<li><a href="javascript:void(0)">Catering Services</a></li> |
||||
|
<li><a href="javascript:void(0)">Customer Relations</a></li> |
||||
|
<li><a href="javascript:void(0)">Innovation</a></li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
<!-- End Single Widget --> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!--/ End Footer Top --> |
||||
|
<!-- Start Footer Newsletter --> |
||||
|
<div class="footer-newsletter"> |
||||
|
<div class="container"> |
||||
|
<div class="inner-content"> |
||||
|
<div class="row align-items-center"> |
||||
|
<div class="col-lg-6 col-md-5 col-12"> |
||||
|
<div class="title"> |
||||
|
<h3>Subscribe to our newsletter</h3> |
||||
|
<p>The latest news, articles, and resources, sent to your inbox weekly.</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-6 col-md-7 col-12"> |
||||
|
<div class="form"> |
||||
|
<form action="#" method="get" target="_blank" class="newsletter-form"> |
||||
|
<input name="EMAIL" placeholder="Your email address" type="email"> |
||||
|
<div class="button"> |
||||
|
<button class="btn">Subscribe<span class="dir-part"></span></button> |
||||
|
</div> |
||||
|
</form> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- End Footer Newsletter --> |
||||
|
</footer> |
||||
|
<!--/ End Footer Area --> |
||||
|
|
||||
|
<!-- ========================= 回到顶部 ========================= --> |
||||
|
<a href="#" class="scroll-top"> |
||||
|
<i class="lni lni-chevron-up"></i> |
||||
|
</a> |
||||
|
|
||||
|
#@js?() |
||||
|
</body> |
||||
|
</html> |
||||
|
#end |
||||
@ -1,120 +1,113 @@ |
|||||
#set(seoTitle="JFinal 极速开发官方社区") |
#set(seoTitle="贝塔网络官方网站") |
||||
#@layout() |
#@officialLayout() |
||||
#define main() |
#define main() |
||||
<div class="col jf-page-main jf-pdl0"> |
<!-- Start Hero Area --> |
||||
|
<section id="home" class="hero-area"> |
||||
### 首页轮播广告 |
<div class="container"> |
||||
#include("_carousel.html") |
<div class="row align-items-center"> |
||||
### 分享 |
<div class="col-lg-5 col-md-12 col-12"> |
||||
<div class="jf-panel jf-article-list"> |
<div class="hero-content"> |
||||
<div class="jf-panel-header"> |
<h1 class="wow fadeInLeft" data-wow-delay=".4s">Powerful solutions for your startup.</h1> |
||||
<a class="jf-more" href="/share">更多»</a> |
<p class="wow fadeInLeft" data-wow-delay=".6s">We are a digital agency that helps brands to |
||||
<h1>分享</h1> |
achieve their business outcomes. We see technology as a tool to create amazing things.</p> |
||||
</div> |
<div class="button wow fadeInLeft" data-wow-delay=".8s"> |
||||
<div class="jf-panel-body"> |
<a href="contact.html" class="btn">Get Started</a> |
||||
<div class="jf-common-list"> |
|
||||
|
|
||||
#for(x : shareList) |
|
||||
<div class="jf-common-item"> |
|
||||
<div class="row"> |
|
||||
<a href="/user/#(x.accountId)" class="jf-common-logo"> |
|
||||
<img src="/upload/avatar/#(x.avatar)" /> |
|
||||
</a> |
|
||||
<div class="col"> |
|
||||
<div class="jf-common-name"><a href="/share/#(x.id)">#(x.title)</a></div> |
|
||||
<p class="jf-common-other text-gray"> |
|
||||
<span class="pull-left">#date(x.createAt)</span> |
|
||||
### <span><i class="fa fa-eye"></i> #(x.clickCount)</span> |
|
||||
<span style="text-align: right;"><i class="fa fa-thumbs-o-up"></i> #(x.likeCount)</span> |
|
||||
</p> |
|
||||
</div> |
|
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
#end |
|
||||
|
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
### 反馈 |
|
||||
<div class="jf-panel jf-article-list"> |
|
||||
<div class="jf-panel-header"> |
|
||||
<a class="jf-more" href="/feedback">更多»</a> |
|
||||
<h1>反馈</h1> |
|
||||
</div> |
|
||||
<div class="jf-panel-body"> |
|
||||
<div class="jf-common-list"> |
|
||||
|
|
||||
#for(x : feedbackList) |
|
||||
<div class="jf-common-item"> |
|
||||
<div class="row"> |
|
||||
<a href="/user/#(x.accountId)" class="jf-common-logo"> |
|
||||
<img src="/upload/avatar/#(x.avatar)" /> |
|
||||
</a> |
|
||||
<div class="col"> |
|
||||
<div class="jf-common-name"><a href="/feedback/#(x.id)">#(x.title)</a></div> |
|
||||
<p class="jf-common-other text-gray"> |
|
||||
<span class="pull-left">#date(x.createAt)</span> |
|
||||
### <span><i class="fa fa-eye"></i> #(x.clickCount)</span> |
|
||||
<span style="text-align: right;"><i class="fa fa-thumbs-o-up"></i> #(x.likeCount)</span> |
|
||||
</p> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
#end |
|
||||
|
|
||||
</div> |
</div> |
||||
</div> |
<div class="col-lg-7 col-md-12 col-12"> |
||||
</div> |
<div class="hero-image wow fadeInRight" data-wow-delay=".4s"> |
||||
|
<img src="https://quick.bootmb.com/assets/img/svg/illustrations/illustration-3.svg" alt="#"> |
||||
### 项目 |
|
||||
<div class="jf-panel jf-article-list"> |
|
||||
<div class="jf-panel-header"> |
|
||||
<a class="jf-more" href="/project">更多»</a> |
|
||||
<h1>项目</h1> |
|
||||
</div> |
|
||||
<div class="jf-panel-body"> |
|
||||
<!--项目列表 start--> |
|
||||
<div class="jf-project-list"> |
|
||||
|
|
||||
#setLocal(i=0, j=0) |
|
||||
#for(x : projectList) |
|
||||
#if(for.first || ++i % 4 == 0) |
|
||||
<div class="row"> |
|
||||
#end |
|
||||
<div class="col-3"> |
|
||||
<div class="jf-project-item jf-transition "> |
|
||||
<a href="/project/#(x.id)" class="jf-project-logo"> |
|
||||
<img src="/upload/avatar/#(x.avatar)" /> |
|
||||
</a> |
|
||||
<h1 class="jf-project-name"> |
|
||||
<a href="/project/#(x.id)">#(x.title)</a> |
|
||||
</h1> |
|
||||
|
|
||||
#-- |
|
||||
<p class="jf-project-info"> |
|
||||
###<span><i class="fa fa-eye"></i> 305</span> |
|
||||
<span><i class="fa fa-star-o"></i> 25</span> |
|
||||
<span><i class="fa fa-thumbs-o-up"></i> 99</span> |
|
||||
</p> |
|
||||
--# |
|
||||
|
|
||||
</div> |
|
||||
</div> |
|
||||
#if(for.last || ++j % 4 == 0) |
|
||||
</div> |
</div> |
||||
#end |
|
||||
#end |
|
||||
|
|
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
|
</section> |
||||
|
<!-- End Hero Area --> |
||||
|
#end |
||||
|
|
||||
|
|
||||
|
#define js() |
||||
|
<!-- ========================= JS here ========================= --> |
||||
</div> |
<script src="/assets/official/js/bootstrap.min.js"></script> |
||||
|
<script src="/assets/official/js/wow.min.js"></script> |
||||
<!-- 包含侧边栏文件 --> |
<script src="/assets/official/js/tiny-slider.js"></script> |
||||
#include("_sidebar.html") |
<script src="/assets/official/js/glightbox.min.js"></script> |
||||
|
<script src="/assets/official/js/count-up.min.js"></script> |
||||
|
<script src="/assets/official/js/main.js"></script> |
||||
|
<script type="text/javascript"> |
||||
|
//======== tiny slider |
||||
|
tns({ |
||||
|
container: '.client-logo-carousel', |
||||
|
autoplay: true, |
||||
|
autoplayButtonOutput: false, |
||||
|
mouseDrag: true, |
||||
|
gutter: 15, |
||||
|
nav: false, |
||||
|
controls: false, |
||||
|
responsive: { |
||||
|
0: { |
||||
|
items: 1, |
||||
|
}, |
||||
|
540: { |
||||
|
items: 2, |
||||
|
}, |
||||
|
768: { |
||||
|
items: 3, |
||||
|
}, |
||||
|
992: { |
||||
|
items: 4, |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
//========= testimonial |
||||
|
tns({ |
||||
|
container: '.testimonial-slider', |
||||
|
items: 3, |
||||
|
slideBy: 'page', |
||||
|
autoplay: false, |
||||
|
mouseDrag: true, |
||||
|
gutter: 0, |
||||
|
nav: true, |
||||
|
controls: false, |
||||
|
controlsText: ['<i class="lni lni-arrow-left"></i>', '<i class="lni lni-arrow-right"></i>'], |
||||
|
responsive: { |
||||
|
0: { |
||||
|
items: 1, |
||||
|
}, |
||||
|
540: { |
||||
|
items: 1, |
||||
|
}, |
||||
|
768: { |
||||
|
items: 1, |
||||
|
}, |
||||
|
992: { |
||||
|
items: 1, |
||||
|
}, |
||||
|
1170: { |
||||
|
items: 1, |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
//========= glightbox |
||||
|
GLightbox({ |
||||
|
'href': '#', |
||||
|
'type': 'video', |
||||
|
'source': 'youtube', //vimeo, youtube or local |
||||
|
'width': 900, |
||||
|
'autoplayVideos': true, |
||||
|
}); |
||||
|
|
||||
|
//====== counter up |
||||
|
var cu = new counterUp({ |
||||
|
start: 0, |
||||
|
duration: 2000, |
||||
|
intvalues: true, |
||||
|
interval: 100, |
||||
|
append: " ", |
||||
|
}); |
||||
|
cu.start(); |
||||
|
</script> |
||||
#end |
#end |
||||
@ -1,159 +1,31 @@ |
|||||
<!--侧边栏--> |
<div class="sidebar-menu"> |
||||
<div class="bsa-sidebar"> |
<ul class="menu"> |
||||
<!-- 侧边栏头部部分(展示品牌logo) --> |
<li class="sidebar-item #(sidebar == 'my' ? 'active' : '')" > |
||||
<div class="bsa-sidebar-header"> |
<a href="/my" class='sidebar-link'> |
||||
<img src="/assets/img/bt-logo-32x32.png" class="bsa-logo-icon" alt="logo-icon"> |
<i class="bi bi-grid-fill"></i> |
||||
<div class="bsa-logo-text ms-2 bsa-ellipsis-2">贝塔网络BT控制台</div> |
<span>首页</span> |
||||
</div> |
</a> |
||||
<!-- 侧边栏的身体部分 --> |
</li> |
||||
<div class="bsa-sidebar-body" data-overlayscrollbars-initialize> |
<li class="sidebar-item #(sidebar == 'order' ? 'active' : '')" > |
||||
<!-- 侧边栏的菜单 --> |
<a href="/my/order" class='sidebar-link'> |
||||
<ul class="bsa-menu" data-bsa-toggle="sidebar" data-accordion="true" data-click-close="true"> |
<i class="bi bi-grid-fill"></i> |
||||
<li> |
<span>我的订单</span> |
||||
<a href="/my/welcome"> |
</a> |
||||
<i class="bi bi-house"></i>首页 |
</li> |
||||
</a> |
<li class="sidebar-item has-sub #(sidebar == 'setting' ? 'active' : '')"> |
||||
</li> |
<a href="#" class='sidebar-link'> |
||||
<li> |
<i class="bi bi-person-circle"></i> |
||||
<a href="pages/order.html"> |
<span>账户设置</span> |
||||
<i class="bi bi-credit-card"></i>充值中心 |
</a> |
||||
</a> |
<ul class="submenu #(sidebar == 'setting' ? 'active' : '')"> |
||||
</li> |
<li class="submenu-item #(sidebar == 'realName' ? 'active' : '')"> |
||||
<li> |
<a href="/my/setting/realName" class="submenu-link">实名认证</a> |
||||
<a href="/product" target="_blank"> |
</li> |
||||
<i class="bi bi-bag-fill"></i>自助下单 |
<li class="submenu-item "> |
||||
</a> |
<a href="account-security.html" class="submenu-link">Security</a> |
||||
</li> |
</li> |
||||
<li> |
</ul> |
||||
<a href="/my/order"> |
</li> |
||||
<i class="bi bi-border-width"></i>订单列表 |
|
||||
</a> |
</ul> |
||||
</li> |
|
||||
<li> |
|
||||
<a href="pages/order.html"> |
|
||||
<i class="bi bi-pc-horizontal"></i>设备管理 |
|
||||
</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="javascript:" class="has-children"> |
|
||||
<i class="bi bi-gear"></i>个人设置 |
|
||||
</a> |
|
||||
<ul> |
|
||||
<li><a href="/my/setting/realName">实名认知</a></li> |
|
||||
<li><a href="pages/sys_website.html">网站设置</a></li> |
|
||||
<li><a href="pages/sys_email.html">邮箱设置</a></li> |
|
||||
</ul> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="javascript:" class="has-children"> |
|
||||
<i class="bi bi-person-lock"></i>权限管理 |
|
||||
</a> |
|
||||
<ul> |
|
||||
<li> |
|
||||
<a href="pages/user.html">用户列表</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="pages/user2">用户列表(多部门版)</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="pages/role.html">角色列表</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="pages/node.html">节点列表</a> |
|
||||
</li> |
|
||||
</ul> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="javascript:" class="has-children"> |
|
||||
<i class="bi bi-filetype-html"></i>示例页面 |
|
||||
</a> |
|
||||
<ul> |
|
||||
<li> |
|
||||
<a href="pages/blank.html">新页面</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<!-- target="_self":添加该属性可以让该页面不从tab页面里打开 --> |
|
||||
<a href="pages/lockscreen.html" target="_self">锁屏页</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="pages/gallery.html">图库列表</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="pages/errors.html">错误页面</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="pages/login.html" target="_self">登录页面</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="pages/timeline.html">时间轴</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="pages/layout1.html">布局示例1</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="pages/layout2.html">布局示例2</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="pages/layout3.html">布局示例3</a> |
|
||||
</li> |
|
||||
</ul> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="javascript:" class="has-children"> |
|
||||
<i class="bi bi-filetype-js"></i>插件 |
|
||||
</a> |
|
||||
<ul> |
|
||||
<li><a href="pages/plugin-day.js.html">day.js(时间格式)</a></li> |
|
||||
<li><a href="pages/plugin-clipboard.html">复制粘贴插件</a></li> |
|
||||
<li><a href="pages/plugin-shepherd.html">更新引导插件</a></li> |
|
||||
<li><a href="pages/plugin-fullcalendar.html">日历</a></li> |
|
||||
<li><a href="pages/plugin-video-js.html">视频播放器</a></li> |
|
||||
<li><a href="pages/plugin-pickr.html">颜色选择器</a></li> |
|
||||
<li><a href="pages/plugin-raty-js.html">评分插件</a></li> |
|
||||
<li><a href="pages/plugin-bootstrap-input-spinner.html">输入框微调插件</a></li> |
|
||||
<li><a href="pages/plugin-bs-stepper.html">步骤条插件</a></li> |
|
||||
<li><a href="pages/plugin-sweetalert2.html">sweetalert2</a></li> |
|
||||
<li><a href="pages/plugin-formvalidation.html">表单验证</a></li> |
|
||||
<li><a href="pages/plugin-tempus-dominus.html">日期时间</a></li> |
|
||||
<li><a href="pages/plugin-croppie.html">头像裁剪</a></li> |
|
||||
<li> |
|
||||
<a href="javascript:" class="has-children">树形组件</a> |
|
||||
<ul> |
|
||||
<li><a href="pages/plugin-ztree.html">ztree</a></li> |
|
||||
</ul> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="javascript:" class="has-children">图表</a> |
|
||||
<ul> |
|
||||
<li><a href="pages/plugin-chart.html">chart.js</a></li> |
|
||||
<li><a href="pages/plugin-echarts.html">echart.js</a></li> |
|
||||
</ul> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="javascript:" class="has-children">数据表格</a> |
|
||||
<ul> |
|
||||
<li><a href="pages/plugin-bootstrap-table.html">bootstrap-table</a></li> |
|
||||
<li><a href="pages/plugin-datatables.html">datatables</a></li> |
|
||||
</ul> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="javascript:" class="has-children">编辑器</a> |
|
||||
<ul> |
|
||||
<li><a href="pages/plugin-wangeditor.html">wangeditor</a></li> |
|
||||
</ul> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a href="javascript:" class="has-children">文件上传</a> |
|
||||
<ul> |
|
||||
<li><a href="pages/plugin-bootstrap-fileinput.html">bootstrap-fileinput</a></li> |
|
||||
<li><a href="pages/plugin-dropzone.html">dropzone</a></li> |
|
||||
</ul> |
|
||||
</li> |
|
||||
<li><a href="pages/plugin-select2.html">select2</a></li> |
|
||||
<li><a href="pages/plugin-bootstrap-select.html">bootstrap-select</a></li> |
|
||||
<li><a href="pages/plugin-fonticonpicker.html">图标选择器</a></li> |
|
||||
</ul> |
|
||||
</li> |
|
||||
</ul> |
|
||||
</div> |
|
||||
</div> |
</div> |
||||
@ -1,179 +1,330 @@ |
|||||
<!DOCTYPE html> |
#set(seoTitle="贝塔网络欢迎页") |
||||
<html lang="zh-CN"> |
#@b5Layout() |
||||
<head> |
#define menu() |
||||
<meta charset="utf-8"> |
#include("_left_menu.html" , sidebar="my", submenu="") |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> |
#end |
||||
<meta name="keywords" content="#(seoKeywords ?? 'bt科技,贝塔科技,贝塔网络')"> |
#define main() |
||||
<meta name="description" content="#(seoDescr ?? '贝塔网络官方网站')"> |
<div id="main"> |
||||
<title>贝塔网络用户面板</title> |
<header class="mb-3"> |
||||
<meta name="author" content="bt.plus"> |
<a href="#" class="burger-btn d-block d-xl-none"> |
||||
<link rel="stylesheet" href="/assets/lib/bootstrap-icons/font/bootstrap-icons.min.css"> |
<i class="bi bi-justify fs-3"></i> |
||||
<link rel="stylesheet" href="/assets/lib/bootstrap/dist/css/bootstrap.min.css"> |
</a> |
||||
<link rel="stylesheet" href="/assets/lib/overlayscrollbars/styles/overlayscrollbars.min.css"> |
</header> |
||||
<link rel="stylesheet" href="/assets/b5/css/bootstrap-admin.min.css"> |
<div class="page-heading"> |
||||
<link rel="shortcut icon" type="image/x-icon" href="/assets/img/favicon.ico"> |
<h3>贝塔网络用户面板</h3> |
||||
</head> |
</div> |
||||
<body data-theme="light"> |
<div class="page-content"> |
||||
<!--头部导航--> |
<section class="row"> |
||||
<ul class="bsa-header"> |
<div class="col-12 col-lg-9"> |
||||
<!-- 侧边栏触发按钮(移动端时显示) --> |
<div class="row"> |
||||
<li class="bsa-sidebar-toggler" data-bsa-toggle="pushmenu"> |
<div class="col-6 col-lg-3 col-md-6"> |
||||
<div class="bsa-header-item"> |
<div class="card"> |
||||
<i class="bi bi-list"></i> |
<div class="card-body px-4 py-4-5"> |
||||
</div> |
<div class="row"> |
||||
</li> |
<div class="col-md-4 col-lg-12 col-xl-12 col-xxl-5 d-flex justify-content-start "> |
||||
<!-- 占位(可以让后面的li居右) --> |
<div class="stats-icon purple mb-2"> |
||||
<li class="flex-grow-1"></li> |
<i class="iconly-boldShow"></i> |
||||
<!-- 通知(如果有新消息则添加类名.bsa-has-msg) --> |
</div> |
||||
<li> |
</div> |
||||
<div class="bsa-header-item" data-qt-tab='{"title":"消息中心","url":"pages/message.html"}' |
<div class="col-md-8 col-lg-12 col-xl-12 col-xxl-7"> |
||||
data-qt-target=".qtab"> |
<h6 class="text-muted font-semibold">Profile Views</h6> |
||||
<i class="bi bi-bell bsa-has-msg"></i> |
<h6 class="font-extrabold mb-0">112.000</h6> |
||||
</div> |
</div> |
||||
</li> |
</div> |
||||
<!-- 全屏 --> |
</div> |
||||
<li class="bsa-fullscreen-toggler"> |
</div> |
||||
<div class="bsa-header-item"> |
</div> |
||||
<i class="bi bi-arrows-fullscreen"></i> |
<div class="col-6 col-lg-3 col-md-6"> |
||||
</div> |
<div class="card"> |
||||
</li> |
<div class="card-body px-4 py-4-5"> |
||||
<!-- 主题配色 --> |
<div class="row"> |
||||
<li class="dropdown"> |
<div class="col-md-4 col-lg-12 col-xl-12 col-xxl-5 d-flex justify-content-start "> |
||||
<div class="bsa-header-item" data-bs-toggle="dropdown" data-bs-auto-close="outside"> |
<div class="stats-icon blue mb-2"> |
||||
<i class="bi bi-palette"></i> |
<i class="iconly-boldProfile"></i> |
||||
</div> |
</div> |
||||
<div class="dropdown-menu dropdown-menu-end p-0"> |
</div> |
||||
<div class="card shadow-sm"> |
<div class="col-md-8 col-lg-12 col-xl-12 col-xxl-7"> |
||||
<div class="card-header d-flex justify-content-between bg-body"> |
<h6 class="text-muted font-semibold">Followers</h6> |
||||
<span class="bsa-fs-15">主题配色</span> |
<h6 class="font-extrabold mb-0">183.000</h6> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-6 col-lg-3 col-md-6"> |
||||
|
<div class="card"> |
||||
|
<div class="card-body px-4 py-4-5"> |
||||
|
<div class="row"> |
||||
|
<div class="col-md-4 col-lg-12 col-xl-12 col-xxl-5 d-flex justify-content-start "> |
||||
|
<div class="stats-icon green mb-2"> |
||||
|
<i class="iconly-boldAdd-User"></i> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-8 col-lg-12 col-xl-12 col-xxl-7"> |
||||
|
<h6 class="text-muted font-semibold">Following</h6> |
||||
|
<h6 class="font-extrabold mb-0">80.000</h6> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-6 col-lg-3 col-md-6"> |
||||
|
<div class="card"> |
||||
|
<div class="card-body px-4 py-4-5"> |
||||
|
<div class="row"> |
||||
|
<div class="col-md-4 col-lg-12 col-xl-12 col-xxl-5 d-flex justify-content-start "> |
||||
|
<div class="stats-icon red mb-2"> |
||||
|
<i class="iconly-boldBookmark"></i> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-8 col-lg-12 col-xl-12 col-xxl-7"> |
||||
|
<h6 class="text-muted font-semibold">Saved Post</h6> |
||||
|
<h6 class="font-extrabold mb-0">112</h6> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
</div> |
</div> |
||||
<div class="card-body"> |
<div class="row"> |
||||
<!-- 配色包裹 --> |
<div class="col-12"> |
||||
<div class="bsa-theme-switcher-wrapper"> |
<div class="card"> |
||||
<input class="form-check-input" type="checkbox" value="light"> |
<div class="card-header"> |
||||
<input class="form-check-input" type="checkbox" value="dark"> |
<h4>Profile Visit</h4> |
||||
<input class="form-check-input" type="checkbox" value="indigo"> |
</div> |
||||
<input class="form-check-input" type="checkbox" value="green"> |
<div class="card-body"> |
||||
<input class="form-check-input" type="checkbox" value="blue"> |
<div id="chart-profile-visit"></div> |
||||
<input class="form-check-input" type="checkbox" value="yellow"> |
</div> |
||||
<input class="form-check-input" type="checkbox" value="pink"> |
</div> |
||||
<input class="form-check-input" type="checkbox" value="red"> |
</div> |
||||
<input class="form-check-input" type="checkbox" value="orange"> |
</div> |
||||
<input class="form-check-input" type="checkbox" value="cyan"> |
<div class="row"> |
||||
<input class="form-check-input" type="checkbox" value="teal"> |
<div class="col-12 col-xl-4"> |
||||
|
<div class="card"> |
||||
|
<div class="card-header"> |
||||
|
<h4>Profile Visit</h4> |
||||
|
</div> |
||||
|
<div class="card-body"> |
||||
|
<div class="row"> |
||||
|
<div class="col-7"> |
||||
|
<div class="d-flex align-items-center"> |
||||
|
<svg class="bi text-primary" width="32" height="32" fill="blue" |
||||
|
style="width:10px"> |
||||
|
<use |
||||
|
xlink:href="assets/static/images/bootstrap-icons.svg#circle-fill" /> |
||||
|
</svg> |
||||
|
<h5 class="mb-0 ms-3">Europe</h5> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-5"> |
||||
|
<h5 class="mb-0 text-end">862</h5> |
||||
|
</div> |
||||
|
<div class="col-12"> |
||||
|
<div id="chart-europe"></div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="row"> |
||||
|
<div class="col-7"> |
||||
|
<div class="d-flex align-items-center"> |
||||
|
<svg class="bi text-success" width="32" height="32" fill="blue" |
||||
|
style="width:10px"> |
||||
|
<use |
||||
|
xlink:href="assets/static/images/bootstrap-icons.svg#circle-fill" /> |
||||
|
</svg> |
||||
|
<h5 class="mb-0 ms-3">America</h5> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-5"> |
||||
|
<h5 class="mb-0 text-end">375</h5> |
||||
|
</div> |
||||
|
<div class="col-12"> |
||||
|
<div id="chart-america"></div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="row"> |
||||
|
<div class="col-7"> |
||||
|
<div class="d-flex align-items-center"> |
||||
|
<svg class="bi text-success" width="32" height="32" fill="blue" |
||||
|
style="width:10px"> |
||||
|
<use |
||||
|
xlink:href="assets/static/images/bootstrap-icons.svg#circle-fill" /> |
||||
|
</svg> |
||||
|
<h5 class="mb-0 ms-3">India</h5> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-5"> |
||||
|
<h5 class="mb-0 text-end">625</h5> |
||||
|
</div> |
||||
|
<div class="col-12"> |
||||
|
<div id="chart-india"></div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="row"> |
||||
|
<div class="col-7"> |
||||
|
<div class="d-flex align-items-center"> |
||||
|
<svg class="bi text-danger" width="32" height="32" fill="blue" |
||||
|
style="width:10px"> |
||||
|
<use |
||||
|
xlink:href="assets/static/images/bootstrap-icons.svg#circle-fill" /> |
||||
|
</svg> |
||||
|
<h5 class="mb-0 ms-3">Indonesia</h5> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-5"> |
||||
|
<h5 class="mb-0 text-end">1025</h5> |
||||
|
</div> |
||||
|
<div class="col-12"> |
||||
|
<div id="chart-indonesia"></div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-12 col-xl-8"> |
||||
|
<div class="card"> |
||||
|
<div class="card-header"> |
||||
|
<h4>Latest Comments</h4> |
||||
|
</div> |
||||
|
<div class="card-body"> |
||||
|
<div class="table-responsive"> |
||||
|
<table class="table table-hover table-lg"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th>Name</th> |
||||
|
<th>Comment</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
<tr> |
||||
|
<td class="col-3"> |
||||
|
<div class="d-flex align-items-center"> |
||||
|
<div class="avatar avatar-md"> |
||||
|
<img src="./assets/compiled/jpg/5.jpg"> |
||||
|
</div> |
||||
|
<p class="font-bold ms-3 mb-0">Si Cantik</p> |
||||
|
</div> |
||||
|
</td> |
||||
|
<td class="col-auto"> |
||||
|
<p class=" mb-0">Congratulations on your graduation!</p> |
||||
|
</td> |
||||
|
</tr> |
||||
|
<tr> |
||||
|
<td class="col-3"> |
||||
|
<div class="d-flex align-items-center"> |
||||
|
<div class="avatar avatar-md"> |
||||
|
<img src="./assets/compiled/jpg/2.jpg"> |
||||
|
</div> |
||||
|
<p class="font-bold ms-3 mb-0">Si Ganteng</p> |
||||
|
</div> |
||||
|
</td> |
||||
|
<td class="col-auto"> |
||||
|
<p class=" mb-0">Wow amazing design! Can you make another tutorial for |
||||
|
this design?</p> |
||||
|
</td> |
||||
|
</tr> |
||||
|
<tr> |
||||
|
<td class="col-3"> |
||||
|
<div class="d-flex align-items-center"> |
||||
|
<div class="avatar avatar-md"> |
||||
|
<img src="./assets/compiled/jpg/8.jpg"> |
||||
|
</div> |
||||
|
<p class="font-bold ms-3 mb-0">Singh Eknoor</p> |
||||
|
</div> |
||||
|
</td> |
||||
|
<td class="col-auto"> |
||||
|
<p class=" mb-0">What a stunning design! You are so talented and creative!</p> |
||||
|
</td> |
||||
|
</tr> |
||||
|
<tr> |
||||
|
<td class="col-3"> |
||||
|
<div class="d-flex align-items-center"> |
||||
|
<div class="avatar avatar-md"> |
||||
|
<img src="./assets/compiled/jpg/3.jpg"> |
||||
|
</div> |
||||
|
<p class="font-bold ms-3 mb-0">Rani Jhadav</p> |
||||
|
</div> |
||||
|
</td> |
||||
|
<td class="col-auto"> |
||||
|
<p class=" mb-0">I love your design! It’s so beautiful and unique! How did you learn to do this?</p> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
</div> |
<div class="col-12 col-lg-3"> |
||||
</li> |
<div class="card"> |
||||
<!-- 管理员信息 --> |
<div class="card-body py-4 px-4"> |
||||
<li class="dropdown"> |
<div class="d-flex align-items-center"> |
||||
<div class="bsa-header-item" data-bs-toggle="dropdown"> |
<div class="avatar avatar-xl"> |
||||
<div class="bsa-user-area"> |
<img src="./assets/compiled/jpg/1.jpg" alt="Face 1"> |
||||
<img src="/upload/avatar/#(loginAccount.avatar)" class="bsa-user-avatar" alt="用户头像"> |
</div> |
||||
<div class="bsa-user-details"> |
<div class="ms-3 name"> |
||||
<div class="bsa-ellipsis-1 bsa-fs-15">欲饮琵琶码上催</div> |
<h5 class="font-bold">John Duck</h5> |
||||
<!-- 管理员角色RBAC权限设计时可用(不需要可删除,上面的用户名可自动垂直居中) --> |
<h6 class="text-muted mb-0">@johnducky</h6> |
||||
<div class="bsa-ellipsis-1 bsa-fs-13 text-muted">超级管理员</div> |
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="card"> |
||||
|
<div class="card-header"> |
||||
|
<h4>Recent Messages</h4> |
||||
|
</div> |
||||
|
<div class="card-content pb-4"> |
||||
|
<div class="recent-message d-flex px-4 py-3"> |
||||
|
<div class="avatar avatar-lg"> |
||||
|
<img src="./assets/compiled/jpg/4.jpg"> |
||||
|
</div> |
||||
|
<div class="name ms-4"> |
||||
|
<h5 class="mb-1">Hank Schrader</h5> |
||||
|
<h6 class="text-muted mb-0">@johnducky</h6> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="recent-message d-flex px-4 py-3"> |
||||
|
<div class="avatar avatar-lg"> |
||||
|
<img src="./assets/compiled/jpg/5.jpg"> |
||||
|
</div> |
||||
|
<div class="name ms-4"> |
||||
|
<h5 class="mb-1">Dean Winchester</h5> |
||||
|
<h6 class="text-muted mb-0">@imdean</h6> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="recent-message d-flex px-4 py-3"> |
||||
|
<div class="avatar avatar-lg"> |
||||
|
<img src="./assets/compiled/jpg/1.jpg"> |
||||
|
</div> |
||||
|
<div class="name ms-4"> |
||||
|
<h5 class="mb-1">John Dodol</h5> |
||||
|
<h6 class="text-muted mb-0">@dodoljohn</h6> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="px-4"> |
||||
|
<button class='btn btn-block btn-xl btn-outline-primary font-bold mt-3'>Start Conversation</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="card"> |
||||
|
<div class="card-header"> |
||||
|
<h4>Visitors Profile</h4> |
||||
|
</div> |
||||
|
<div class="card-body"> |
||||
|
<div id="chart-visitors-profile"></div> |
||||
|
</div> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
</div> |
</section> |
||||
<ul class="dropdown-menu dropdown-menu-end"> |
|
||||
<li> |
|
||||
<a class="dropdown-item" href="javascript:" |
|
||||
data-qt-tab='{"title":"个人资料","url":"#(SSL)/pages/profile.html"}' |
|
||||
data-qt-target=".qtab"> |
|
||||
<i class="bi bi-person me-2"></i>个人资料 |
|
||||
</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<a class="dropdown-item bsa-clear-cache" href="javascript:" |
|
||||
data-qt-tab='{"title":"修改密码","url":"#(SSL)/pages/password.html"}' |
|
||||
data-qt-target=".qtab"> |
|
||||
<i class="bi bi-key me-2"></i>修改密码 |
|
||||
</a> |
|
||||
</li> |
|
||||
<li> |
|
||||
<div class="dropdown-divider"></div> |
|
||||
</li> |
|
||||
<li class="bsa-logout"><a class="dropdown-item" href="javascript:"><i |
|
||||
class="bi bi-box-arrow-right me-2"></i>退出登录</a> |
|
||||
</li> |
|
||||
</ul> |
|
||||
</li> |
|
||||
</ul> |
|
||||
<!--header部分结束--> |
|
||||
#include("_left_menu.html") |
|
||||
|
|
||||
<!--内容区域(用于tab选项卡插件)--> |
|
||||
<div class="bsa-content"> |
|
||||
<div class="qtab" data-qt-tabs='[{"title":"首页","url":"/my/welcome","close":false}]'></div> |
|
||||
</div> |
|
||||
|
|
||||
<!--版权信息--> |
|
||||
<div class="bsa-footer"> |
|
||||
<p class="mb-0">Copyright © 2023. All right reserved.</p> |
|
||||
</div> |
|
||||
|
|
||||
<!--加载层--> |
|
||||
<div class="bsa-preloader"> |
|
||||
<div class="spinner-border text-secondary" role="status"> |
|
||||
<span class="visually-hidden">Loading...</span> |
|
||||
</div> |
</div> |
||||
|
#include("_footer.html") |
||||
</div> |
</div> |
||||
<script src="/assets/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> |
#end |
||||
<script src="/assets/lib/jquery/dist/jquery.min.js"></script> |
|
||||
<script src="/assets/lib/overlayscrollbars/browser/overlayscrollbars.browser.es6.min.js"></script> |
|
||||
<script src="/assets/lib/bootstrap-quicktab/dist/js/bootstrap-quicktab.min.js"></script> |
|
||||
<script src="/assets/b5/js/bootstrap-admin.min.js"></script> |
|
||||
<script src="/assets/b5/js/app.js"></script> |
|
||||
<script> |
|
||||
$(function () { |
|
||||
|
|
||||
//头部搜索框处理(不需要可以删除,不明白的可以看bootstrap-admin官方文档) |
|
||||
$(document).on('search.bsa.navbar-search', function (e, inputValue, data) { |
|
||||
//先得到请求地址,组合后大概是这样pages/search.html?keyword=dsadsa&type=article&user=admin2 |
|
||||
let url = data.action + '?keyword=' + inputValue + '&' + $.param(data.params); |
|
||||
|
|
||||
//然后通过tab打开一个搜索结果的窗口 |
|
||||
Quicktab.get('.qtab').addTab({ |
|
||||
title: '<i class="bi bi-search"></i><span class="text-danger ms-2">' + inputValue + '</span>', |
|
||||
url: url, |
|
||||
close: true, |
|
||||
}) |
|
||||
}) |
|
||||
|
|
||||
//退出登录 |
|
||||
$(document).on('click', '.bsa-logout', function (e) { |
|
||||
e.preventDefault(); |
|
||||
|
|
||||
$.modal({ |
|
||||
body: '确定要退出吗?', |
|
||||
cancelBtn: true, |
|
||||
ok: function () { |
|
||||
|
|
||||
|
|
||||
//请求退出路由 |
|
||||
$.ajax({ |
|
||||
method: 'post', |
|
||||
url: '/logout', |
|
||||
}).then(response => { |
|
||||
|
|
||||
if (response.code === 200) {//跳转到后台首页 |
#define js() |
||||
|
<!-- Need: Apexcharts --> |
||||
|
<script src="/assets/b5/extensions/apexcharts/apexcharts.min.js"></script> |
||||
|
<script src="/assets/b5/static/js/pages/dashboard.js"></script> |
||||
|
#end |
||||
|
|
||||
$.toasts({ |
|
||||
type: 'success', |
|
||||
content: '退出成功', |
|
||||
onHidden: function () { |
|
||||
top.location.replace('/pages/login.html'); |
|
||||
} |
|
||||
}) |
|
||||
} |
|
||||
}); |
|
||||
} |
|
||||
}) |
|
||||
}); |
|
||||
}); |
|
||||
</script> |
|
||||
</body> |
|
||||
</html> |
|
||||
@ -1,86 +1,157 @@ |
|||||
#set(seoTitle="贝塔网络用户实名认证") |
#set(seoTitle="贝塔网络用户实名认证") |
||||
#@b5Layout() |
#@b5Layout() |
||||
|
#define menu() |
||||
|
#include("../dashboard/_left_menu.html", sidebar="setting", submenu="realName") |
||||
|
#end |
||||
|
|
||||
#define main() |
#define main() |
||||
<div class="container-fluid"> |
<div id="main"> |
||||
<div class="card border-0 shadow-sm"> |
<header class="mb-3"> |
||||
<div class="card-header bg-body"> |
<a href="#" class="burger-btn d-block d-xl-none"> |
||||
实名认证 |
<i class="bi bi-justify fs-3"></i> |
||||
|
</a> |
||||
|
</header> |
||||
|
<div class="page-heading"> |
||||
|
<div class="page-title"> |
||||
|
<div class="row"> |
||||
|
<div class="col-12 col-md-6 order-md-1 order-last"> |
||||
|
<h3>实名认证</h3> |
||||
|
</div> |
||||
|
<div class="col-12 col-md-6 order-md-2 order-first"> |
||||
|
<nav aria-label="breadcrumb" class="breadcrumb-header float-start float-lg-end"> |
||||
|
<ol class="breadcrumb"> |
||||
|
<li class="breadcrumb-item"><a href="/my">首页</a></li> |
||||
|
<li class="breadcrumb-item active" aria-current="page">实名认证</li> |
||||
|
</ol> |
||||
|
</nav> |
||||
|
</div> |
||||
|
</div> |
||||
</div> |
</div> |
||||
<div class="card-body"> |
<section class="section"> |
||||
<div class="row"> |
<div class="row"> |
||||
<div class="col-md-5"> |
<div class="col-12 col-lg-12"> |
||||
<form id="form"> |
<div class="card"> |
||||
<div class="row mb-3"> |
<div class="card-body"> |
||||
<label for="oldPassword" class="col-sm-3 col-form-label text-sm-end">姓名</label> |
<form id="form"> |
||||
<div class="col-sm-9"> |
<div class="form-group"> |
||||
<input type="password" autocomplete class="form-control" id="oldPassword" |
<label for="realname" class="form-label">姓名</label> |
||||
name="oldPassword"> |
<input type="text" name="realName.realname" id="realname" class="form-control" placeholder="请如实填写您的姓名" value=""> |
||||
</div> |
</div> |
||||
</div> |
<div class="form-group"> |
||||
<div class="row mb-3"> |
<label for="idCard" class="form-label">身份证号</label> |
||||
<label for="password" class="col-sm-3 col-form-label text-sm-end">身份证号</label> |
<input type="text" name="realName.idCard" id="idCard" class="form-control" placeholder="请如实填写您的身份证号码" value=""> |
||||
<div class="col-sm-9"> |
</div> |
||||
<input type="password" autocomplete class="form-control" id="password" name="password"> |
#if(realName?.status == 1) |
||||
</div> |
<div class="form-group"> |
||||
|
<button type="button" class="btn btn-primary" disabled>已进行实名认证</button> |
||||
|
</div> |
||||
|
#else |
||||
|
<div class="form-group"> |
||||
|
<button type="button" id="submit" class="btn btn-primary">提交实名</button> |
||||
|
</div> |
||||
|
#end |
||||
|
</form> |
||||
</div> |
</div> |
||||
<div class="row mb-3"> |
</div> |
||||
<div class="col-sm-9 offset-sm-3"> |
</div> |
||||
<button type="submit" class="btn btn-primary">认证</button> |
</div> |
||||
</div> |
</section> |
||||
|
</div> |
||||
|
|
||||
|
<div class="modal fade text-left" id="inlineForm" tabindex="-1" role="dialog" |
||||
|
aria-labelledby="myModalLabel33" aria-hidden="true"> |
||||
|
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable" |
||||
|
role="document"> |
||||
|
<div class="modal-content"> |
||||
|
<div class="modal-header"> |
||||
|
<h4 class="modal-title" id="myModalLabel33">打开支付宝扫码认证</h4> |
||||
|
<button type="button" class="close" data-bs-dismiss="modal" |
||||
|
aria-label="Close"> |
||||
|
<i data-feather="x"></i> |
||||
|
</button> |
||||
|
</div> |
||||
|
<div class="modal-body"> |
||||
|
<div class="d-flex justify-content-center align-items-center flex-column"> |
||||
|
<div class="avatar avatar-2xl"> |
||||
|
<div id="qrcode"></div> |
||||
</div> |
</div> |
||||
</form> |
<p class="text-small">手机扫码认证完成后请手动点击查询认证结果</p> |
||||
|
<button id="queryRealName" type="button" class="btn btn-primary ms-1" |
||||
|
data-bs-dismiss="modal"> |
||||
|
<i class="bx bx-check d-block d-sm-none"></i> |
||||
|
<span class="d-none d-sm-block">认证完成查询认证结果</span> |
||||
|
</button> |
||||
|
</div> |
||||
|
|
||||
</div> |
</div> |
||||
|
|
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
|
|
||||
|
#include("../dashboard/_footer.html") |
||||
</div> |
</div> |
||||
#end |
#end |
||||
|
|
||||
#define js() |
#define js() |
||||
|
<script src="/assets/easy-qrcode/easy.qrcode.min.js" type="text/javascript" charset="utf-8"></script> |
||||
<script src="/assets/lib/formvalidation/js/formValidation.js"></script> |
<script type="text/javascript"> |
||||
<script src="/assets/lib/formvalidation/js/framework/bootstrap.js"></script> |
function generateRandomString(length) { |
||||
<script src="/assets/lib/formvalidation/js/language/zh_CN.js"></script> |
var result = ''; |
||||
<script> |
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; |
||||
//前端表单验证 |
var charactersLength = characters.length; |
||||
$('#form').formValidation({ |
for (var i = 0; i < length; i++) { |
||||
fields: { |
result += characters.charAt(Math.floor(Math.random() * charactersLength)); |
||||
oldPassword: { |
|
||||
validators: { |
|
||||
notEmpty: true, |
|
||||
} |
|
||||
}, |
|
||||
password: { |
|
||||
validators: { |
|
||||
notEmpty: true, |
|
||||
} |
|
||||
}, |
|
||||
rePassword: { |
|
||||
validators: { |
|
||||
notEmpty: true, |
|
||||
} |
|
||||
} |
} |
||||
|
return result; |
||||
} |
} |
||||
}).on('success.form.fv', function (e) { |
var qrcode; |
||||
//阻止表单提交 |
$(function () { |
||||
e.preventDefault(); |
const myModal = new bootstrap.Modal('#inlineForm', {}) |
||||
//得到表单对象 |
$('#submit').click(function(){ |
||||
let $form = $(e.target); |
//获取数据 |
||||
let data = $form.serialize(); |
let data = $("#form").serialize(); |
||||
|
//发起ajax请求 |
||||
alert('表单验证通过,即将发起ajax'); |
$.ajax({ |
||||
//得到序列化数据 |
method: 'post', |
||||
$.ajax({ |
url: '/my/setting/doRealName', |
||||
url: "/login.php", |
//表单数据 |
||||
method: 'POST', |
data: data, |
||||
data |
}).then(ret => { |
||||
}).then(function (res) { |
console.log(ret) |
||||
if (res.code === 200) { |
if(ret.state == "ok") { |
||||
//登录成功 |
if(qrcode){ |
||||
} else { |
qrcode.clear(); |
||||
//登录失败 |
} |
||||
} |
qrcode = new QRCode(document.getElementById("qrcode"), { |
||||
}); |
text: ret.certifyUrl, |
||||
}); |
width: 360, |
||||
|
height: 360, |
||||
|
colorDark : "#000000", |
||||
|
colorLight : "#ffffff", |
||||
|
correctLevel : QRCode.CorrectLevel.H, |
||||
|
quietZone: 20, |
||||
|
quietZoneColor: "rgba(0,0,0,0)", |
||||
|
}); |
||||
|
myModal.show() |
||||
|
} else { |
||||
|
alert(ret.msg) |
||||
|
} |
||||
|
}); |
||||
|
}) |
||||
|
$("#queryRealName").click(function(){ |
||||
|
$.ajax({ |
||||
|
method: 'post', |
||||
|
url: '/my/setting/queryRealName' |
||||
|
}).then(ret => { |
||||
|
console.log(ret) |
||||
|
if(ret.state == "ok") { |
||||
|
alert("认证成功") |
||||
|
}else{ |
||||
|
alert(ret.msg) |
||||
|
} |
||||
|
}); |
||||
|
}); |
||||
|
}) |
||||
</script> |
</script> |
||||
#end |
#end |
||||
@ -1,55 +1,138 @@ |
|||||
#@layout() |
#set(seoTitle="贝塔网络官方产品") |
||||
|
#@officialLayout() |
||||
#define main() |
#define main() |
||||
<!--左侧主体内容部分--> |
<!-- Start Breadcrumbs --> |
||||
<div class="col jf-page-main jf-pdl0"> |
<div class="breadcrumbs"> |
||||
<div class="jf-panel jf-article-list"> |
<div class="container"> |
||||
<div class="jf-panel-header"> |
<div class="row"> |
||||
<h1>产品</h1> |
<div class="col-lg-8 offset-lg-2 col-md-12 col-12"> |
||||
|
<div class="breadcrumbs-content"> |
||||
|
<h1 class="page-title">产品中心</h1> |
||||
|
</div> |
||||
|
<ul class="breadcrumb-nav"> |
||||
|
<li><a href="#(SSL)/">首页</a></li> |
||||
|
<li>产品中心</li> |
||||
|
</ul> |
||||
|
</div> |
||||
</div> |
</div> |
||||
<div class="jf-panel-body"> |
</div> |
||||
<!--项目列表 start--> |
</div> |
||||
<div class="jf-project-list"> |
<!-- End Breadcrumbs --> |
||||
|
|
||||
#setLocal(i=0, j=0) |
|
||||
#for(x : projectPage.list) |
|
||||
#if(for.first || ++i % 4 == 0) |
|
||||
<div class="row"> |
|
||||
#end |
|
||||
<div class="col-3"> |
|
||||
<div class="jf-project-item jf-transition "> |
|
||||
<a href="/project/#(x.id)" class="jf-project-logo"> |
|
||||
<img src="/upload/avatar/#(x.avatar)" /> |
|
||||
</a> |
|
||||
<h1 class="jf-project-name"> |
|
||||
<a href="/project/#(x.id)">#(x.title)</a> |
|
||||
</h1> |
|
||||
|
|
||||
#-- |
|
||||
<p class="jf-project-info"> |
|
||||
###<span><i class="fa fa-eye"></i> 305</span> |
|
||||
<span><i class="fa fa-star-o"></i> 25</span> |
|
||||
<span><i class="fa fa-thumbs-o-up"></i> 99</span> |
|
||||
</p> |
|
||||
--# |
|
||||
|
|
||||
|
<!-- Start Blog Singel Area --> |
||||
|
<section class="pricing-table section blog-section "> |
||||
|
<div class="container"> |
||||
|
<div class="row"> |
||||
|
<div class="col-lg-9 col-md-12 col-12"> |
||||
|
<ul class="nav nav-pills"> |
||||
|
<li class="nav-item"> |
||||
|
<button type="button" class="nav-link btn active" aria-current="page" href="#">全部</button> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<button type="button" class="nav-link btn btn-link" href="#">套餐一</button> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<button type="button" class="nav-link btn btn-link" href="#">套餐二</button> |
||||
|
</li> |
||||
|
</ul> |
||||
|
<div class="row mt-3"> |
||||
|
#for(x : productPage.list) |
||||
|
<div class="col-lg-4 col-md-6 col-12 mb-3"> |
||||
|
<div class="card border-0 rounded-0 shadow"> |
||||
|
<div class="card-body mt-3 mb-3"> |
||||
|
<div class="row"> |
||||
|
<div class="col-10"> |
||||
|
<h4 class="card-title">#(x.name)</h4> |
||||
|
<ul class="list-group list-group-flush"> |
||||
|
<li class="list-group-item">CPU: #(x.cpuName)</li> |
||||
|
<li class="list-group-item">内存:#(x.memoryCapacity)</li> |
||||
|
<li class="list-group-item">显卡:#(x.graphicsCardModel)</li> |
||||
|
<li class="list-group-item">硬盘:#(x.dataDiskCapacity)</li> |
||||
|
<li class="list-group-item">网络:#(x.downloadSpeed)</li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
<div class="col-2"> |
||||
|
<i class="bi bi-bookmark-plus fs-2"></i> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="row align-items-center text-center g-0"> |
||||
|
<div class="col-5"> |
||||
|
<h5>$129</h5> |
||||
|
</div> |
||||
|
<div class="col-7"> |
||||
|
<a href="/order/#(x.id)" class="btn btn-dark w-100 p-2 rounded-0 text-warning">立即购买</a> |
||||
|
</div> |
||||
|
</div> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
#if(for.last || ++j % 4 == 0) |
#end |
||||
</div> |
</div> |
||||
#end |
|
||||
#end |
|
||||
|
|
||||
</div> |
</div> |
||||
<!--项目列表 end--> |
<aside class="col-lg-3 col-md-12 col-12"> |
||||
|
<div class="sidebar blog-grid-page"> |
||||
|
<!-- Start Single Widget --> |
||||
|
<div class="widget popular-feeds"> |
||||
|
<h5 class="widget-title">今日特价</h5> |
||||
|
<div class="popular-feed-loop"> |
||||
|
<div class="single-popular-feed"> |
||||
|
<div class="feed-desc"> |
||||
|
<a href="javascript:void(0)" class="cetagory">Creative</a> |
||||
|
<h6 class="post-title"><a href="blog-single-sidebar.html">Bringing Great Design |
||||
|
Ideas To Completion</a></h6> |
||||
|
<span class="time"><i class="lni lni-calendar"></i> 05th Nov 2023</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="single-popular-feed"> |
||||
|
<div class="feed-desc"> |
||||
|
<a href="javascript:void(0)" class="cetagory">Jobs</a> |
||||
|
<h6 class="post-title"><a href="blog-single-sidebar.html">Live Life Smart And |
||||
|
Focus On The Positive</a></h6> |
||||
|
<span class="time"><i class="lni lni-calendar"></i> 24th March 2023</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="single-popular-feed"> |
||||
|
<div class="feed-desc"> |
||||
|
<a href="javascript:void(0)" class="cetagory">Marketing</a> |
||||
|
<h6 class="post-title"><a href="blog-single-sidebar.html">We’re currently |
||||
|
acceping new projects.</a></h6> |
||||
|
<span class="time"><i class="lni lni-calendar"></i> 30th Jan 2023</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- End Single Widget --> |
||||
|
|
||||
<!--分页组件--> |
<!-- Start Single Widget --> |
||||
#@paginate(projectPage.pageNumber, projectPage.totalPage, "/project?p=") |
<div class="widget help-call"> |
||||
|
<h5 class="widget-title">联系方式</h5> |
||||
|
<div class="inner"> |
||||
|
<h3> |
||||
|
<span>+(123) 456-78-90</span> |
||||
|
</h3> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- End Single Widget --> |
||||
|
</div> |
||||
|
</aside> |
||||
</div> |
</div> |
||||
|
|
||||
</div> |
</div> |
||||
</div> |
</section> |
||||
|
<!-- End Blog Singel Area --> |
||||
<!-- 包含侧边栏文件 --> |
|
||||
#include("_sidebar.html") |
|
||||
#end |
#end |
||||
|
|
||||
|
#define js() |
||||
|
|
||||
|
<!-- ========================= JS here ========================= --> |
||||
|
<script src="/assets/official/js/bootstrap.min.js"></script> |
||||
|
<script src="/assets/official/js/wow.min.js"></script> |
||||
|
<script src="/assets/official/js/tiny-slider.js"></script> |
||||
|
<script src="/assets/official/js/glightbox.min.js"></script> |
||||
|
<script src="/assets/official/js/main.js"></script> |
||||
|
|
||||
|
<script type="text/javascript"> |
||||
|
$(document).ready(function() { |
||||
|
|
||||
|
}); |
||||
|
</script> |
||||
|
#end |
||||
|
|||||
@ -1,119 +1,113 @@ |
|||||
#set(seoTitle="JFinal 注册账号") |
#set(seoTitle="贝塔网络注册") |
||||
#@layout() |
#@frontLayout() |
||||
#define main() |
#define main() |
||||
<div class="col" style="margin-bottom: 20px;"> |
<div class="min-vh-100 p-2 bg-body-tertiary d-flex flex-column align-items-center justify-content-center"> |
||||
|
<h2>贝塔网络注册</h2> |
||||
<!-- 注册 panel --> |
<p class="text-secondary">一台长在云上的“超级电脑”</p> |
||||
<div id="regPanel" class="jf-panel"> |
<form id="form" class="form" style="width: 380px;max-width: 100%"> |
||||
<div class="jf-panel-header"> |
<div class="mb-3"> |
||||
<h1 class="jf-login-title text-center">注册</h1> |
<div class="input-group"> |
||||
|
<span class="input-group-text bg-white "><i class="bi bi-person"></i></span> |
||||
|
<input type="text" class="form-control" placeholder="请输入昵称" name="nickName" id="nickName" aria-label="nickName"> |
||||
|
</div> |
||||
</div> |
</div> |
||||
|
<div class="mb-3"> |
||||
<div class="jf-panel-body mt15" style="width: 500px;margin:30px auto;"> |
<div class="input-group"> |
||||
<!-- 内容区域 start--> |
<span class="input-group-text bg-white "><i class="bi bi-person"></i></span> |
||||
<form id="reg_form" action="/reg/save" method="post"> |
<input type="text" class="form-control" placeholder="请输入邮箱地址" name="userName" id="userName" aria-label="userName"> |
||||
<div class="form-group row mb-4"> |
|
||||
<label for="nickName" class="col-sm-2 col-form-label col-form-label-lg">昵称</label> |
|
||||
<div class="col-sm-10"> |
|
||||
<input type="text" autocomplete="off" class="form-control form-control-lg" id="nickName" name="nickName" placeholder="请输入昵称"> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="form-group row mb-4"> |
|
||||
<label for="userName" class="col-sm-2 col-form-label col-form-label-lg">邮箱</label> |
|
||||
<div class="col-sm-10"> |
|
||||
<input type="email" autocomplete="off" class="form-control form-control-lg" id="userName" name="userName" placeholder="请输入邮箱地址"> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<div class="form-group row mb-4"> |
|
||||
<label for="password" class="col-sm-2 col-form-label col-form-label-lg">密码</label> |
|
||||
<div class="col-sm-10"> |
|
||||
<input type="password" autocomplete="off" class="form-control form-control-lg" id="password" name="password" placeholder="请输入密码"> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="form-group row mb-4"> |
|
||||
<label class="col-sm-2 col-form-label-lg"> |
|
||||
<img title="点击刷新" onclick="updateRegCaptcha()" id="captchaImg" class="jf-login-captcha" src="/reg/captcha"/> |
|
||||
</label> |
|
||||
<div class="col-sm-10"> |
|
||||
<input type="text" autocomplete="off" class="form-control form-control-lg" id="captchaInput" name="captcha" placeholder="请输入验证码"> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<div class="form-group row"> |
|
||||
<div class="col-12 text-right"> |
|
||||
<button type="submit" class="btn btn-primary btn-lg" style="padding-left:20px;padding-right:20px;">注册账号</button> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
</form> |
|
||||
<div class="jf-login-links"> |
|
||||
已有账号<a href="/login">直接登录</a> |
|
||||
<a class="ml-2" href="/reg/notActivated">还没激活?</a> |
|
||||
</div> |
</div> |
||||
<!-- 内容区域 end--> |
|
||||
</div> |
</div> |
||||
</div> |
|
||||
|
|
||||
<!-- 注册成功 panel --> |
<div class="mb-3"> |
||||
<div id="regOkPanel" class="jf-panel" style="min-height: 400px; display: none;"> |
<div class="input-group bsa-show_hide_password"> |
||||
<div class="jf-panel-header" style="margin-top:50px;"> |
<span class="input-group-text bg-white"><i class="bi bi-person-lock"></i></span> |
||||
<h1 class="jf-login-title text-center">注册成功</h1> |
<input type="password" class="form-control" placeholder="请输入密码" name="password" autocomplete="off" id="password" aria-label="password"> |
||||
|
<span class="input-group-text bg-white bsa-cursor-pointer"><i class="bi bi-eye-slash"></i></span> |
||||
|
</div> |
||||
</div> |
</div> |
||||
|
|
||||
<div class="jf-panel-body mt15" style="min-width: 500px;margin:30px auto;"> |
<div class="mb-3"> |
||||
<!-- 内容区域 start--> |
<div class="input-group"> |
||||
<div id="reg_ok_msg" style="text-align: center; font-size: 22px; margin-top: 40px;"> |
<span class="input-group-text bg-white"><i class="bi bi-shield-lock"></i></span> |
||||
请去往注册邮箱 |
<input type="text" class="form-control" id="captchaInput" name="captcha" aria-label="captcha" placeholder="请输入验证码" style="min-width: 80px"> |
||||
<span style="color:red;" id="regEmail">nickName</span> |
<img title="点击刷新" onclick="updateRegCaptcha()" id="captchaImg" alt="验证码" class="bsa-cursor-pointer" style="height: 38px;width: 120px" |
||||
查收激活邮件激活账号 |
src="/reg/captcha"/> |
||||
</div> |
</div> |
||||
<!-- 内容区域 end--> |
|
||||
</div> |
</div> |
||||
</div> |
|
||||
|
|
||||
|
|
||||
|
<div class="d-grid gap-2"> |
||||
|
<button class="btn btn-outline-success" type="submit"><i class="bi bi-box-arrow-in-right"></i> 注册账号</button> |
||||
|
</div> |
||||
|
|
||||
|
<div class="mb-3 d-flex align-items-center justify-content-between flex-wrap gap-3 mt-3"> |
||||
|
已有账号<a href="#(SSL)/login" class="link-success text-decoration-none">直接登录</a> |
||||
|
<a class="link-success text-decoration-none" href="/reg/notActivated">还没激活?</a> |
||||
|
</div> |
||||
|
</form> |
||||
</div> |
</div> |
||||
#end |
#end |
||||
|
|
||||
#define js() |
#define js() |
||||
<script type="text/javascript" src="/assets/jquery_form/jquery.form.js"></script> |
<script> |
||||
<script type="text/javascript" src="/assets/layer/layer/layer.js"></script> |
$(function () { |
||||
|
//前端表单验证 |
||||
<script type="text/javascript"> |
$('#form').formValidation({ |
||||
$(document).ready(function() { |
fields: { |
||||
$("#reg_form").ajaxForm({ |
userName: { |
||||
dataType: "json" |
validators: { |
||||
, beforeSubmit: function(formData, jqForm, options) { |
notEmpty: true, |
||||
// 表单提交之前回调 |
} |
||||
|
}, |
||||
|
password: { |
||||
|
validators: { |
||||
|
notEmpty: true, |
||||
|
} |
||||
|
}, |
||||
|
captcha: { |
||||
|
validators: { |
||||
|
notEmpty: true, |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}).on('success.form.fv', function (e) { |
||||
|
//阻止表单提交 |
||||
|
e.preventDefault(); |
||||
|
//得到表单对象 |
||||
|
let $form = $(e.target); |
||||
|
//获取数据 |
||||
|
let data = $form.serialize(); |
||||
|
//发起ajax请求 |
||||
|
$.ajax({ |
||||
|
method: 'post', |
||||
|
url: '/reg/save', |
||||
|
//表单数据 |
||||
|
data: data, |
||||
|
}).then(response => { |
||||
|
if(ret.state == "ok") { |
||||
|
$("#regEmail").text(ret.regEmail); |
||||
|
} else { |
||||
|
layer.msg(ret.msg, { |
||||
|
shift: 6 |
||||
|
, shade: 0.3 |
||||
|
, time: 0 |
||||
|
, offset: "165px" |
||||
|
, closeBtn: 1 |
||||
|
, shadeClose: false |
||||
|
} , function() { |
||||
|
updateRegCaptcha(); |
||||
|
} |
||||
|
); |
||||
} |
} |
||||
, success: function(ret) { |
}); |
||||
if(ret.state == "ok") { |
}); |
||||
$("#regPanel").hide(); |
}) |
||||
$("#regOkPanel").show(); |
/** |
||||
$("#regEmail").text(ret.regEmail); |
* 刷新验证码 |
||||
} else { |
*/ |
||||
layer.msg(ret.msg, { |
function updateRegCaptcha() { |
||||
shift: 6 |
$("#captchaImg").attr("src", "/reg/captcha?v=" + Math.random()); |
||||
, shade: 0.3 |
$("#captchaInput").val(""); |
||||
, time: 0 |
} |
||||
, offset: "165px" |
</script> |
||||
, closeBtn: 1 |
|
||||
, shadeClose: false |
|
||||
} , function() { |
|
||||
updateRegCaptcha(); |
|
||||
} |
|
||||
); |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
, error: function(ret) { } // ret.status != 200 时回调 |
|
||||
, complete: function(ret) { } // 无论是 success 还是 error,最终都会被回调 |
|
||||
}); |
|
||||
}); |
|
||||
|
|
||||
function updateRegCaptcha() { |
|
||||
$("#captchaImg").attr("src", "/reg/captcha?v=" + Math.random()); |
|
||||
$("#captchaInput").val(""); |
|
||||
} |
|
||||
</script> |
|
||||
#end |
#end |
||||
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 525 B |
|
Before Width: | Height: | Size: 1.1 KiB |