commit ccfd8c79a46fd72e34c81511801d1efc9b44f357 Author: Ray Date: Thu Feb 19 03:37:37 2026 +0800 first commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..4178b2c Binary files /dev/null and b/.DS_Store differ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100755 index 0000000..1c2fda5 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/code2.iml b/.idea/code2.iml new file mode 100755 index 0000000..18ec59d --- /dev/null +++ b/.idea/code2.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100755 index 0000000..34aab16 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100755 index 0000000..daa8459 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100755 index 0000000..92bbb67 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100755 index 0000000..9159225 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100755 index 0000000..2e5a4ac --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/admin/.gitignore b/admin/.gitignore new file mode 100755 index 0000000..884e4cb --- /dev/null +++ b/admin/.gitignore @@ -0,0 +1,14 @@ +/target/ +/.settings/ +/classes/ +.classpath +.project +.DS_Store +*.iml +.idea +.settings +*.class +*.jar +*.properties +!spring-boot-starter-nasa-utils-1.0.1.jar +${ \ No newline at end of file diff --git a/admin/pom.xml b/admin/pom.xml new file mode 100755 index 0000000..156bf6b --- /dev/null +++ b/admin/pom.xml @@ -0,0 +1,433 @@ + + 4.0.0 + project + admin + war + 0.0.1-SNAPSHOT + admin Maven Webapp + http://maven.apache.org + + + + + software.amazon.awssdk + bom + 2.17.230 + pom + import + + + + + + + net.coobird + thumbnailator + 0.4.18 + + + software.amazon.awssdk + s3 + + + org.springframework + spring-webmvc + 5.3.18 + + + + org.springframework + spring-webmvc + 5.3.18 + + + + org.springframework + spring-tx + 5.3.18 + + + + com.aliyun.oss + aliyun-sdk-oss + 3.15.1 + + + + org.springframework + spring-orm + 5.3.18 + + + + org.springframework + spring-context-support + 5.3.18 + + + + org.hibernate + hibernate-core + 5.6.7.Final + + + + org.apache.logging.log4j + log4j-core + 2.17.2 + + + + mysql + mysql-connector-java + 8.0.28 + + + + org.apache.zookeeper + zookeeper + 3.8.0 + + + + com.alibaba + dubbo + 2.6.12 + compile + + + spring + org.springframework + + + + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + + commons-lang + commons-lang + 2.6 + + + + com.google.zxing + core + 3.4.1 + + + + com.google.zxing + javase + 3.4.1 + + + + com.alibaba + fastjson + 1.2.80 + + + + commons-collections + commons-collections + 3.2.2 + + + + commons-pool + commons-pool + 1.6 + + + + org.apache.httpcomponents + httpclient + 4.5.13 + + + + commons-httpclient + commons-httpclient + 3.1 + + + + org.apache.commons + commons-lang3 + 3.12.0 + + + + redis.clients + jedis + 2.0.0 + + + + org.web3j + core + 4.9.0 + + + + org.dom4j + dom4j + 2.1.3 + + + + com.fasterxml.jackson.core + jackson-core + 2.13.2 + + + + org.springframework.security + spring-security-core + 2.0.8.RELEASE + + + + org.springframework.security + spring-security-taglibs + 2.0.8.RELEASE + + + + org.codehaus.jackson + jackson-mapper-asl + 1.9.13 + + + + org.apache.poi + poi + 5.2.2 + + + + org.apache.poi + poi-ooxml + 5.2.2 + + + + javax.servlet + jstl + 1.2 + + + + org.apache.curator + curator-framework + 5.2.1 + + + + org.apache.commons + commons-pool2 + 2.11.1 + + + + org.slf4j + slf4j-simple + 1.7.30 + + + + commons-io + commons-io + 2.11.0 + + + + commons-fileupload + commons-fileupload + 1.4 + + + + org.aspectj + aspectjrt + 1.9.8 + runtime + + + + commons-dbcp + commons-dbcp + 1.4 + + + + com.jcraft + jsch + 0.1.55 + + + + commons-codec + commons-codec + 1.15 + + + + javax.mail + mail + 1.5.0-b01 + + + + org.projectlombok + lombok + 1.18.22 + provided + + + + com.fasterxml.jackson.core + jackson-databind + 2.13.2 + + + + com.alibaba + druid + 1.2.8 + + + + javax.websocket + javax.websocket-api + 1.1 + provided + + + + org.freemarker + freemarker + 2.3.31 + + + + cn.hutool + hutool-all + 5.8.0 + + + + com.alibaba + easyexcel + 2.2.6 + + + + com.vdurmont + emoji-java + 5.1.1 + + + com.auth0 + java-jwt + 3.8.2 + + + + com.github.ben-manes.caffeine + caffeine + 2.9.3 + + + + + + + 1.8 + UTF-8 + UTF-8 + + + + + admin + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + + 1.8 + 1.8 + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.3.0 + + + add-source + generate-sources + + add-source + + + + + ${project.basedir}/../comm/mall/src + ${project.basedir}/../comm/Invest/src + ${project.basedir}/../comm/RechargeBlockchain/src + ${project.basedir}/../comm/Cms/src + ${project.basedir}/../comm/Contract/src + ${project.basedir}/../comm/DB/src + ${project.basedir}/../comm/DDOS/src + ${project.basedir}/../comm/Email/src + ${project.basedir}/../comm/Exchange/src + ${project.basedir}/../comm/Futures/src + ${project.basedir}/../comm/Finance/src + ${project.basedir}/../comm/FollowUp/src + ${project.basedir}/../comm/Hobi/src + ${project.basedir}/../comm/Item/src + ${project.basedir}/../comm/Kernel/src + ${project.basedir}/../comm/Log/src + ${project.basedir}/../comm/Miner/src + ${project.basedir}/../comm/OnlineChat/src + ${project.basedir}/../comm/Party/src + ${project.basedir}/../comm/Redis/src + ${project.basedir}/../comm/Security/src + ${project.basedir}/../comm/Smsbao/src + ${project.basedir}/../comm/Smsmoduyun/src + ${project.basedir}/../comm/Syspara/src + ${project.basedir}/../comm/Tip/src + ${project.basedir}/../comm/User/src + ${project.basedir}/../comm/Wallet/src + ${project.basedir}/../comm/News/src + ${project.basedir}/../comm/Withdraw/src + ${project.basedir}/../dapp/src + ${project.basedir}/../model/src + + + + + + + + + + + + + diff --git a/admin/src/main/java/project/web/admin/controller/email/AdminEmailCodeController.java b/admin/src/main/java/project/web/admin/controller/email/AdminEmailCodeController.java new file mode 100755 index 0000000..8532c48 --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/email/AdminEmailCodeController.java @@ -0,0 +1,119 @@ +package project.web.admin.controller.email; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import kernel.exception.BusinessException; +import kernel.util.JsonUtils; +import kernel.web.PageActionSupport; +import project.syspara.Syspara; +import project.syspara.SysparaService; +import project.web.admin.service.email.AdminEmailCodeService; + +@RestController +public class AdminEmailCodeController extends PageActionSupport { + + private Logger logger = LogManager.getLogger(AdminEmailCodeController.class); + + @Autowired + private AdminEmailCodeService adminEmailCodeService; + @Autowired + protected SysparaService sysparaService; + + private final String action = "normal/adminEmailCodeAction!"; + + /** + * 发送验证码 + */ + public String sendCode(HttpServletRequest request) { + String code_context = request.getParameter("code_context"); + boolean isSuper = Boolean.valueOf(request.getParameter("isSuper")).booleanValue(); + + Map resultMap = new HashMap(); + + try { + + this.adminEmailCodeService.sendCode(this.getIp(), this.getUsername_login(), code_context, isSuper); + resultMap.put("code", 200); + + } catch (BusinessException e) { + resultMap.put("code", 500); + resultMap.put("message", e.getMessage()); + } catch (Throwable t) { + logger.error(" error ", t); + resultMap.put("code", 500); + resultMap.put("message", "程序错误"); + } + + return JsonUtils.getJsonString(resultMap); + } + + /** + * 校验验证码 + */ + public String checkCode(HttpServletRequest request) { + String email_code = request.getParameter("email_code"); + + Map resultMap = new HashMap(); + + try { + + this.adminEmailCodeService.updateCheckCode(this.getIp(), this.getUsername_login(), email_code, + this.getRequest().getRequestURI()); + this.getResponse().sendRedirect(this.getRequest().getContextPath() + "/index/view"); + + } catch (BusinessException e) { + resultMap.put("code", 500); + resultMap.put("message", e.getMessage()); + } catch (Throwable t) { + logger.error(" error ", t); + resultMap.put("code", 500); + resultMap.put("message", "程序错误"); + } + + return "check_success"; + } + + /** + * 校验谷歌验证码 + */ + @RequestMapping(action + "checkGoogleAuthCode.action") + public ModelAndView checkGoogleAuthCode(HttpServletRequest request) { + + String google_auth_code = request.getParameter("google_auth_code"); + + ModelAndView model = new ModelAndView(); + String username = this.getUsername_login(); + try { + Syspara para = sysparaService.find("open_google_auth_code"); + if (null == para || para.getValue().equals("true")) { + this.adminEmailCodeService.updateCheckGoogleAuthCode(this.getIp(), username, google_auth_code, + this.getRequest().getRequestURI()); + } + model.setViewName("redirect:/normal/LoginSuccessAction!view.action"); + return model; + + } catch (BusinessException e) { + model.addObject("error", e.getMessage()); + model.addObject("username", username); + model.setViewName("include/google_auth_code"); + return model; + } catch (Throwable t) { + logger.error(" error ", t); + model.addObject("username", username); + model.addObject("error", "验证码错误"); + model.setViewName("include/google_auth_code"); + return model; + } + } + +} diff --git a/admin/src/main/java/project/web/admin/controller/index/AdminIndexController.java b/admin/src/main/java/project/web/admin/controller/index/AdminIndexController.java new file mode 100755 index 0000000..734164b --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/index/AdminIndexController.java @@ -0,0 +1,273 @@ +package project.web.admin.controller.index; + +import kernel.exception.BusinessException; +import kernel.util.Arith; +import kernel.util.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; +import project.mall.goods.SellerGoodsService; +import project.mall.goods.dto.SellerTopNDto; +import project.mall.utils.DateStringTypeEnum; +import project.mall.utils.DateTypeToTime; +import project.party.PartyService; +import project.user.UserDataService; +import project.wallet.WalletLogService; +import project.wallet.dto.PartySumDataDTO; +import security.web.BaseSecurityAction; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 综合查询 + */ +@RestController +public class AdminIndexController extends BaseSecurityAction { + + + private Logger logger = LogManager.getLogger(AdminIndexController.class); + + @Autowired + private PartyService partyService; + + @Autowired + private UserDataService userDataService; + + @Resource + protected WalletLogService walletLogService; + + @Resource + private SellerGoodsService sellerGoodsService; + + private final String action = "normal/adminIndexAction!"; +// +// /** +// * 综合查询 页面 +// */ +// @RequestMapping(value = action + "view.action") +// public ModelAndView view(HttpServletRequest request) { +// +// ModelAndView modelAndView = new ModelAndView(); +// modelAndView.setViewName("index_admin"); +// String timeType = request.getParameter("timeType"); +// if (StringUtils.isEmptyString(timeType)) { +// timeType = "day"; +// } +// Map statistics = new HashMap(); +// Page page = new Page(); +// try { +// +// String today = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); +// +// String loginPartyId = this.getLoginPartyId(); +// +// // 当日用户增量 +// int todayUserCount = 0; +// +// // 用户总量 +// int allUserCount = 0; +// +// List cacheAll = this.partyService.getAll(); +// for (Party party : cacheAll) { +// if (Constants.SECURITY_ROLE_MEMBER.equals(party.getRolename())) { +// if (today.equals(DateUtils.format(party.getCreateTime(), DateUtils.DF_yyyyMMdd))) { +// todayUserCount++; +// } +// allUserCount++; +// } +// } +// Map daySumData = this.adminAllStatisticsService.daySumData(loginPartyId, today); +//// page = adminOrderService.pagedQuery( +//// 1, 10, null, null, null, null, null, null, null, -2); +// Map daySumData1 = adminMallOrderService.findDaySumData(); +// Map kycSumData = adminKycService.findKycSumData(); +// statistics.putAll(daySumData1); +// statistics.putAll(kycSumData); +// statistics.put("recharge", daySumData.get("recharge_usdt")); +// statistics.put("withdraw", daySumData.get("withdraw")); +// statistics.put("page", page); +// // 充提差额 +// statistics.put("balance_amount", daySumData.get("balance_amount")); +// statistics.put("totle_income", daySumData.get("totle_income")); +// statistics.put("today_user_count", todayUserCount); +// statistics.put("all_user_count", allUserCount); +// statistics.put("today_recharge_user_count", this.userDataService.filterRechargeByDate(today)); +// statistics.put("sum_usdt_amount", this.adminUserMoneyStatisticsService.getSumWalletByMember(loginPartyId)); +// +// } catch (BusinessException e) { +// modelAndView.addObject("error", e.getMessage()); +// modelAndView.addObject("statistics", statistics); +// return modelAndView; +// } catch (Throwable t) { +// logger.error(" error ", t); +// modelAndView.addObject("error", "[ERROR] " + t.getMessage()); +// modelAndView.addObject("statistics", statistics); +// return modelAndView; +// } +// +// modelAndView.addObject("statistics", statistics); +// modelAndView.addObject("page", page); +// modelAndView.addObject("timeType", timeType); +// return modelAndView; +// } + + + @RequestMapping(value = action + "viewNew.action") + public ModelAndView viewNew(HttpServletRequest request) { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("index_admin"); + + String timeType = request.getParameter("timeType"); + if (StringUtils.isEmptyString(timeType)) { + timeType = "day"; + } + modelAndView.addObject("timeType", timeType); + return modelAndView; + } + + + + + @RequestMapping(value = action + "viewHead.action") + public Map viewHead(HttpServletRequest request) { + String timeType = request.getParameter("timeType"); + if (StringUtils.isEmptyString(timeType)) { + timeType = "day"; + } + + DateStringTypeEnum dateStringTypeEnum = DateStringTypeEnum.fromCode(timeType); + + Map timeMap = DateTypeToTime.convertTime(dateStringTypeEnum); + + String startTime = timeMap.get("startTime"); + String endTime = timeMap.get("endTime"); + Map statistics = new HashMap(); + try { + + PartySumDataDTO partySumData = userDataService.getPartyDataBtDay(startTime, endTime); + //充提差额 + double chargeBalanceAmount = Objects.isNull(partySumData) ? 0.00 : Arith.sub(partySumData.getTotalRecharge(),partySumData.getTotalWithdraw()); + statistics.put("rechargeNum", Objects.isNull(partySumData) ? 0 : partySumData.getRechargeNum()); + statistics.put("withdrawNum", Objects.isNull(partySumData) ? 0 : partySumData.getWithdrawNum()); + statistics.put("rechargeAmount", Objects.isNull(partySumData) ? 0.00 : partySumData.getTotalRecharge()); + statistics.put("withdrawAmount", Objects.isNull(partySumData) ? 0 : partySumData.getTotalWithdraw()); + statistics.put("chargeBalanceAmount", chargeBalanceAmount); + + PartySumDataDTO newPartySumData = userDataService.getPartyNewDataBtDay(startTime, endTime); + double newChargeBalanceAmount = Objects.isNull(newPartySumData) ? 0D : Arith.sub(newPartySumData.getTotalRecharge(),newPartySumData.getTotalWithdraw()); + //新充提差额 + statistics.put("newChargeBalanceAmount", newChargeBalanceAmount); + //新充值人数 + statistics.put("newRechargeNum", Objects.isNull(newPartySumData) ? 0 : newPartySumData.getRechargeNum()); + //新充值金额 + statistics.put("newRechargeAmount", Objects.isNull(newPartySumData) ? 0.00 : newPartySumData.getTotalRecharge()); + //新提现人数 + statistics.put("newWithdrawNum", Objects.isNull(newPartySumData) ? 0 : newPartySumData.getWithdrawNum()); + //新提现金额 + statistics.put("newWithdrawAmount", Objects.isNull(newPartySumData) ? 0 : newPartySumData.getTotalWithdraw()); + return statistics; + } catch (BusinessException e) { + statistics.put("code", 500); + statistics.put("error", e.getMessage()); + return statistics; + } catch (Throwable t) { + logger.error(" error ", t); + statistics.put("code", 500); + statistics.put("error", t.getMessage()); + return statistics; + } + } + + + @RequestMapping(value = action + "viewMiddle.action") + public Map viewMiddle(HttpServletRequest request) { + String timeType = request.getParameter("timeType"); + if (StringUtils.isEmptyString(timeType)) { + timeType = "day"; + } + DateStringTypeEnum dateStringTypeEnum = DateStringTypeEnum.fromCode(timeType); + + Map timeMap = DateTypeToTime.convertTime(dateStringTypeEnum); + + String startTime = timeMap.get("startTime"); + String endTime = timeMap.get("endTime"); + Map statistics = new HashMap(); + try { + //活跃 + Integer loginNum = partyService.getCountLoginByDay(startTime, endTime); + + //新增用户 + Integer registerNum = partyService.getCountRegisterByDay(startTime, endTime); + + //总店铺 + Integer allSellerNum = partyService.getCountAllSeller(); + + //总用户 + Integer allUserNum = partyService.getCountAllUser(); + + //新增店铺 + Integer registerSellerNum = partyService.getCountRegisterSellerByDay(startTime, endTime); + + //订单 + Integer orderNum = partyService.getCountOrderByDay(startTime, endTime); + + Map profitDataMap = walletLogService.getTotalProfitByDay(startTime, endTime); + + Map totalSales = sellerGoodsService.querySumSellerOrdersPrize(startTime, endTime); + + //返佣金额 + Object profitAmount = profitDataMap.get("profit"); + //销售总额 + Object totalSalesAmount = totalSales.get("totalSales"); + + statistics.put("loginNum", loginNum); + statistics.put("registerNum", registerNum); + statistics.put("allSellerNum", allSellerNum); + statistics.put("allUserNum", allUserNum); + statistics.put("registerSellerNum", registerSellerNum); + statistics.put("orderNum", orderNum); + statistics.put("rebateAmount", profitAmount); + statistics.put("totalSalesAmount", Objects.isNull(totalSalesAmount) ? 0 : totalSalesAmount); + return statistics; + } catch (BusinessException e) { + statistics.put("code", 500); + statistics.put("error", e.getMessage()); + return statistics; + } catch (Throwable t) { + logger.error(" error ", t); + statistics.put("code", 500); + statistics.put("error", t.getMessage()); + return statistics; + } + } + + @RequestMapping(value = action + "viewSellerTop.action") + public List viewSellerTop(HttpServletRequest request) { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("index_admin"); + String timeType = request.getParameter("timeType"); + if (StringUtils.isEmptyString(timeType)) { + timeType = "day"; + } + DateStringTypeEnum dateStringTypeEnum = DateStringTypeEnum.fromCode(timeType); + + Map timeMap = DateTypeToTime.convertTime(dateStringTypeEnum); + + String startTime = timeMap.get("startTime"); + String endTime = timeMap.get("endTime"); + // 店铺 TOP10 + List top10SellerList = sellerGoodsService.cacheTopNSellers(startTime, endTime, 10); + return top10SellerList; + } + +} diff --git a/admin/src/main/java/project/web/admin/controller/report/AdminAgentAllStatisticsController.java b/admin/src/main/java/project/web/admin/controller/report/AdminAgentAllStatisticsController.java new file mode 100755 index 0000000..0065542 --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/report/AdminAgentAllStatisticsController.java @@ -0,0 +1,191 @@ +package project.web.admin.controller.report; + +import java.io.IOException; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import kernel.exception.BusinessException; +import kernel.util.DateUtils; +import kernel.util.JsonUtils; +import kernel.util.StringUtils; +import kernel.web.PageActionSupport; +import project.Constants; +import project.web.admin.service.report.AdminAgentAllStatisticsService; + +/** + * DAPP_代理商充提报表 + */ +@RestController +public class AdminAgentAllStatisticsController extends PageActionSupport { + + private Logger logger = LogManager.getLogger(AdminAgentAllStatisticsController.class); + + @Autowired + private AdminAgentAllStatisticsService adminAgentAllStatisticsService; + + private final String action = "normal/adminAgentAllStatisticsAction!"; + + /** + * 代理商充提报表 + */ + @RequestMapping(action + "list.action") + public ModelAndView list(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String para_party_id = request.getParameter("para_party_id"); + String all_party_id = request.getParameter("all_party_id"); + String start_time = request.getParameter("start_time"); + String end_time = request.getParameter("end_time"); + String para_username = request.getParameter("para_username"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("auto_monitor_statistics_agent_all_list"); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 30; +// this.initTime(start_time, end_time); + + // start_time,end_time都为空时开始初始化 + if (null == start_time && null == end_time) { + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); + } + + // 如果知道某个代理商的id,进入后也不可查 + if (!StringUtils.isNotEmpty(para_party_id)) { + para_party_id = this.getLoginPartyId(); + } + + this.page = this.adminAgentAllStatisticsService.pagedQuery(this.pageNo, this.pageSize, start_time, end_time, + this.getLoginPartyId(), para_username, Constants.SECURITY_ROLE_AGENT, para_party_id,all_party_id); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("para_party_id", para_party_id); + modelAndView.addObject("start_time", start_time); + modelAndView.addObject("end_time", end_time); + modelAndView.addObject("para_username", para_username); + return modelAndView; + } + + /** + * 导出数据到文件 + */ + @RequestMapping(action + "exportData.action") + public ModelAndView exportData(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String start_time = request.getParameter("start_time"); + String end_time = request.getParameter("end_time"); + String para_username = request.getParameter("para_username"); + String para_party_id = request.getParameter("para_party_id"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("auto_monitor_statistics_agent_all_list"); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 30; +// this.initTime(start_time, end_time); + + // start_time,end_time都为空时开始初始化 + if (null == start_time && null == end_time) { + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); + } + + String error = this.adminAgentAllStatisticsService.loadExportData(this.getResponse(), this.pageSize, + start_time, end_time, this.getLoginPartyId(), para_username, Constants.SECURITY_ROLE_AGENT, + para_party_id); + if (!StringUtils.isNullOrEmpty(error)) { + throw new BusinessException(error); + } + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (IOException e) { + logger.error("export fail:{}", e); + modelAndView.addObject("error", "程序错误,导出异常"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + return modelAndView; + } + + /** + * 获取推荐网络 + */ + @RequestMapping(action + "getReconNumNet.action") + public String getReconNumNet(HttpServletRequest request) { + String net_party_id = request.getParameter("net_party_id"); + + Map resultMap = new HashMap(); + + try { + + resultMap.put("code", 200); + resultMap.put("user_reco_net", this.adminAgentAllStatisticsService.getRecoNumNetList(net_party_id)); + + } catch (BusinessException e) { + resultMap.put("code", 500); + resultMap.put("message", e.getMessage()); + } catch (Throwable t) { + logger.error(" error ", t); + resultMap.put("code", 500); + resultMap.put("message", "程序错误"); + } + + return JsonUtils.getJsonString(resultMap); + } + +// private void initTime(String start_time, String end_time) { +//// if(null==start_time &&null==end_time &&null==para_time) para_time = "all";//默认一周 +//// if("day".equals(para_time)) {//当天 +//// this.end_time = DateUtils.format(new Date(),DateUtils.DF_yyyyMMdd); +//// this.start_time = end_time; +//// }else if("week".equals(para_time)) {//往前推7天 +//// this.end_time = DateUtils.format(new Date(),DateUtils.DF_yyyyMMdd); +//// this.start_time = DateUtils.format(DateUtils.addDate(new Date(), -7),DateUtils.DF_yyyyMMdd); +//// }else if("month".equals(para_time)) {//往前推一月 +//// this.end_time = DateUtils.format(new Date(),DateUtils.DF_yyyyMMdd); +//// this.start_time = DateUtils.format(DateUtils.addMonth(new Date(), -1),DateUtils.DF_yyyyMMdd); +//// }else if("all".equals(para_time)) {//所有数据 +//// this.end_time = null; +//// this.start_time = null; +//// } +// // start_time,end_time都为空时开始初始化 +// if (null == start_time && null == end_time) { +// end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); +// start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); +// } +// } + +} diff --git a/admin/src/main/java/project/web/admin/controller/report/AdminAllStatisticsController.java b/admin/src/main/java/project/web/admin/controller/report/AdminAllStatisticsController.java new file mode 100755 index 0000000..635a26c --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/report/AdminAllStatisticsController.java @@ -0,0 +1,207 @@ +package project.web.admin.controller.report; + +import java.io.IOException; +import java.util.Date; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + + +import kernel.exception.BusinessException; +import kernel.util.DateUtils; +import kernel.util.StringUtils; +import kernel.web.PageActionSupport; +import project.web.admin.service.report.AdminAllStatisticsService; + +/** + * DAPP_总充提报表 + */ +@RestController +public class AdminAllStatisticsController extends PageActionSupport { + + private Logger logger = LogManager.getLogger(AdminAllStatisticsController.class); + + @Autowired + private AdminAllStatisticsService adminAllStatisticsService; + + private final String action = "normal/adminAllStatisticsAction!"; + + /** + * 总充提报表 + */ + @RequestMapping(action + "list.action") + public ModelAndView list(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String start_time = request.getParameter("start_time"); + String end_time = request.getParameter("end_time"); + String para_time = request.getParameter("para_time"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("auto_monitor_statistics_all_list"); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 30; +// this.initTime(start_time, end_time, para_time); + + // start_time,end_time都为空时开始初始化 + if (null == start_time && null == end_time && null == para_time) { + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); +// para_time = "day";//默认一周 + } + if ("day".equals(para_time)) { + // 当天 + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = end_time; + } else if ("week".equals(para_time)) { + // 往前推7天 + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.addDate(new Date(), -7), DateUtils.DF_yyyyMMdd); + } else if ("month".equals(para_time)) { + // 往前推一月 + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.addMonth(new Date(), -1), DateUtils.DF_yyyyMMdd); + } else if ("all".equals(para_time)) { + // 所有数据 + end_time = null; + start_time = null; + } + + this.page = this.adminAllStatisticsService.pagedQuery(this.pageNo, this.pageSize, start_time, end_time, + this.getLoginPartyId()); + + Map sumdata = this.adminAllStatisticsService.sumDatas(start_time, end_time, this.getLoginPartyId()); + + modelAndView.addObject("sumdata", sumdata); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("start_time", start_time); + modelAndView.addObject("end_time", end_time); + modelAndView.addObject("para_time", para_time); + return modelAndView; + } + + /** + * 导出订单数据到文件 + */ + @RequestMapping(action + "exportData.action") + public ModelAndView exportData(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String start_time = request.getParameter("start_time"); + String end_time = request.getParameter("end_time"); + String para_time = request.getParameter("para_time"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("auto_monitor_statistics_all_list"); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 30; +// this.initTime(start_time, end_time, para_time); + + // start_time,end_time都为空时开始初始化 + if (null == start_time && null == end_time && null == para_time) { + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); +// para_time = "day";//默认一周 + } + if ("day".equals(para_time)) { + // 当天 + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = end_time; + } else if ("week".equals(para_time)) { + // 往前推7天 + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.addDate(new Date(), -7), DateUtils.DF_yyyyMMdd); + } else if ("month".equals(para_time)) { + // 往前推一月 + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.addMonth(new Date(), -1), DateUtils.DF_yyyyMMdd); + } else if ("all".equals(para_time)) { + // 所有数据 + end_time = null; + start_time = null; + } + + String error = this.adminAllStatisticsService.loadExportData(this.getResponse(), this.pageSize, start_time, + end_time, this.getLoginPartyId()); + if (!StringUtils.isNullOrEmpty(error)) { + throw new BusinessException(error); + } + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (IOException e) { + logger.error("export fail:{}", e); + modelAndView.addObject("error", "程序错误,导出异常"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("start_time", start_time); + modelAndView.addObject("end_time", end_time); + modelAndView.addObject("para_time", para_time); + return modelAndView; + } + +// private void initTime(String start_time, String end_time, String para_time) { +// // start_time,end_time都为空时开始初始化 +// if (null == start_time && null == end_time && null == para_time) { +// end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); +// start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); +//// para_time = "day";//默认一周 +// return; +// } +// if ("day".equals(para_time)) { +// // 当天 +// end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); +// start_time = end_time; +// } else if ("week".equals(para_time)) { +// // 往前推7天 +// end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); +// start_time = DateUtils.format(DateUtils.addDate(new Date(), -7), DateUtils.DF_yyyyMMdd); +// } else if ("month".equals(para_time)) { +// // 往前推一月 +// end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); +// start_time = DateUtils.format(DateUtils.addMonth(new Date(), -1), DateUtils.DF_yyyyMMdd); +// +// logger.error("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); +// logger.error("{},{},{}", start_time, end_time, para_time); +// } else if ("all".equals(para_time)) { +// // 所有数据 +// end_time = null; +// start_time = null; +// } +// } + +} diff --git a/admin/src/main/java/project/web/admin/controller/report/AdminUserAllStatisticsController.java b/admin/src/main/java/project/web/admin/controller/report/AdminUserAllStatisticsController.java new file mode 100755 index 0000000..da423eb --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/report/AdminUserAllStatisticsController.java @@ -0,0 +1,404 @@ +package project.web.admin.controller.report; + +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import kernel.util.Arith; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import kernel.exception.BusinessException; +import kernel.util.DateUtils; +import kernel.util.StringUtils; +import kernel.web.PageActionSupport; +import project.Constants; +import project.party.PartyRedisKeys; +import project.party.PartyService; +import project.party.model.Party; +import project.party.recom.UserRecomService; +import project.redis.RedisHandler; +import project.syspara.SysParaCode; +import project.syspara.SysparaService; +import project.user.UserDataService; +import project.web.admin.service.report.AdminUserAllStatisticsService; +import project.web.admin.service.user.AdminAgentService; + +/** + * 交易所_用户收益报表 + */ +@RestController +public class AdminUserAllStatisticsController extends PageActionSupport { + + private Logger logger = LogManager.getLogger(AdminUserAllStatisticsController.class); + + @Autowired + protected AdminUserAllStatisticsService adminUserAllStatisticsService; + @Autowired + protected AdminAgentService adminAgentService; + @Autowired + protected UserDataService userDataService; + @Autowired + protected PartyService partyService; + + @Resource + protected UserRecomService userRecomService; + @Autowired + protected SysparaService sysparaService; + + @Autowired + protected RedisHandler redisHandler; + + private final String action = "normal/adminUserAllStatisticsAction!"; + + /** + * 获取 用户收益报表 列表 + */ + @RequestMapping(action + "list.action") + public ModelAndView list(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + boolean no_agent_recom = Boolean.valueOf(request.getParameter("no_agent_recom")).booleanValue(); + String para_rolename = request.getParameter("para_rolename"); + boolean para_agent_view = Boolean.valueOf(request.getParameter("para_agent_view")).booleanValue(); + String start_time = request.getParameter("start_time"); + String end_time = request.getParameter("end_time"); + String para_username = request.getParameter("para_username"); + String para_party_id = request.getParameter("para_party_id"); + String sort_column = request.getParameter("sort_column"); + String sort_type = request.getParameter("sort_type"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("statistics_user_all_list"); + + try { + + this.checkAndSetPageNo(pageNo); + this.pageSize = 30; + + if (StringUtils.isEmptyString(start_time) && StringUtils.isEmptyString(end_time)) { + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); + } + + para_rolename = null; + para_agent_view = false; + + if (no_agent_recom) { + this.page = this.adminUserAllStatisticsService.pagedQueryNoAgentParent(this.pageNo, this.pageSize, start_time, end_time, + this.getLoginPartyId(), para_username, para_rolename, para_party_id, para_agent_view, sort_column, sort_type); + } else { + this.page = this.adminUserAllStatisticsService.pagedQuery(this.pageNo, this.pageSize, start_time, end_time, + this.getLoginPartyId(), para_username, para_rolename, para_party_id, para_agent_view, sort_column, sort_type); + } + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("no_agent_recom", no_agent_recom); + modelAndView.addObject("para_rolename", para_rolename); + modelAndView.addObject("para_agent_view", para_agent_view); + modelAndView.addObject("start_time", start_time); + modelAndView.addObject("end_time", end_time); + modelAndView.addObject("para_username", para_username); + modelAndView.addObject("para_party_id", para_party_id); + modelAndView.addObject("sort_column", sort_column); + modelAndView.addObject("sort_type", sort_type); + return modelAndView; + } + + /** + * 获取 用户收益报表 列表 + */ + @RequestMapping(action + "exchangeList.action") + public ModelAndView exchangeList(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String para_rolename = request.getParameter("para_rolename"); + boolean para_agent_view = Boolean.valueOf(request.getParameter("para_agent_view")).booleanValue(); + String start_time = request.getParameter("start_time"); + String end_time = request.getParameter("end_time"); + String para_username = request.getParameter("para_username"); + String para_party_id = request.getParameter("para_party_id"); + String all_para_party_id = request.getParameter("all_para_party_id"); + String sort_column = request.getParameter("sort_column"); + String sort_type = request.getParameter("sort_type"); + String sellerId = request.getParameter("sellerId"); + String sellerName = request.getParameter("sellerName"); + String agentUserCode = request.getParameter("agentUserCode"); + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("statistics_user_all_list"); + String loginPartyId = getLoginPartyId(); + + try { + + this.checkAndSetPageNo(pageNo); + this.pageSize = 30; + + if (StringUtils.isEmptyString(start_time) && StringUtils.isEmptyString(end_time)) { + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); + } + + para_rolename = null; + para_agent_view = false; + String agentPartyId = null; + String checkedPartyId = this.getLoginPartyId(); + if (StringUtils.isNotEmpty(checkedPartyId)) { + agentPartyId = checkedPartyId; + } + if (StringUtils.isNullOrEmpty(checkedPartyId) && StringUtils.isNotEmpty(agentUserCode)){ + Party agentParty = partyService.findPartyByUsercode(agentUserCode); + if (!Objects.isNull(agentParty)){ + agentPartyId = agentParty.getId().toString(); + } else { + agentPartyId = "0"; + } + } + + this.page = adminUserAllStatisticsService.exchangePagedQuery(this.pageNo, this.pageSize, start_time, end_time, agentPartyId, + para_username, para_rolename, para_party_id, para_agent_view, sort_column, sort_type, sellerId, sellerName,all_para_party_id); + List list = page.getElements(); + + List sellerIds = new ArrayList<>(); + + for (int i = 0; i < list.size(); i++) { + Map map=list.get(i); + + int recoNum = 0; + int allNum = 0; + + List children = this.userRecomService.findDirectlyChildrens(map.get("partyId").toString()); + List childrenAll = this.userRecomService.findChildren(map.get("partyId").toString()); + Double recharge_usdt = (Double) map.get("recharge_usdt"); + Double withdraw = (Double) map.get("withdraw"); +// Long reco_num = (Long) map.get("reco_num") > 3 ? 3 : (Long) map.get("reco_num"); + double difference = Arith.sub(recharge_usdt, withdraw); + map.put("difference",difference); + + Double rechargeCommission = (Double) map.get("rechargeCommission"); + Double withdrawCommission = (Double) map.get("withdrawCommission"); + map.put("commission", Arith.sub(rechargeCommission,withdrawCommission)); + + for (String child : children) { + Party party = partyService.cachePartyBy(child, false); + if(null == party){ + logger.info("party 为null id为"+child); + } + if(Constants.SECURITY_ROLE_MEMBER.equals(party.getRolename())) { + recoNum++; + } + + } + + for (String child : childrenAll) { + Party party = partyService.cachePartyBy(child, false); + if(null == party){ + logger.info("party 为null id为"+child); + } + if(Constants.SECURITY_ROLE_MEMBER.equals(party.getRolename())) { + allNum++; + } + } + map.put("reco_num",recoNum); + + map.put("reco_all_num",allNum); + + Party agentParty = userRecomService.getAgentParty((Serializable) map.get("partyId")); + if (null != agentParty){ + map.put("agentName",agentParty.getUsername()); + map.put("agentCode",agentParty.getUsercode()); + } + String clerkOpen = this.sysparaService.find(SysParaCode.CLERK_IS_OPEN.getCode()).getValue(); + modelAndView.addObject("isOpen", clerkOpen); + sellerIds.add(map.get("partyId").toString()); + + String isBlack = redisHandler.getString(PartyRedisKeys.PARTY_ID_SELLER_BLACK + map.get("partyId").toString()); + if ("1".equals(isBlack)){ + map.put("blank",1); + } else { + map.put("blank",0); + } + } + + Map willIncomeBySellerIds = adminUserAllStatisticsService.queryWillIncomeBySellerIds(sellerIds,start_time ,end_time); + + for (int i = 0; i < list.size(); i++) { + Map map = list.get(i); + String querySellerId = (String) map.get("sellerId"); + Object aLong = willIncomeBySellerIds.get(querySellerId); + map.put("willIncome" , Objects.isNull(aLong) ? 0 : aLong); + } + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("para_rolename", para_rolename); + modelAndView.addObject("para_agent_view", para_agent_view); + modelAndView.addObject("start_time", start_time); + modelAndView.addObject("end_time", end_time); + modelAndView.addObject("para_username", para_username); + modelAndView.addObject("para_party_id", para_party_id); + modelAndView.addObject("all_para_party_id", all_para_party_id); + modelAndView.addObject("sort_column", sort_column); + modelAndView.addObject("sort_type", sort_type); + modelAndView.addObject("sellerId", sellerId); + modelAndView.addObject("sellerName", sellerName); + modelAndView.addObject("agentUserCode", agentUserCode); + modelAndView.addObject("loginPartyId", loginPartyId); + return modelAndView; + } + + + /** + * 导出数据到文件 + */ + @RequestMapping(action + "exportData.action") + public ModelAndView exportData(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String para_rolename = request.getParameter("para_rolename"); + boolean para_agent_view = Boolean.valueOf(request.getParameter("para_agent_view")).booleanValue(); + String start_time = request.getParameter("start_time"); + String end_time = request.getParameter("end_time"); + String para_username = request.getParameter("para_username"); + String para_party_id = request.getParameter("para_party_id"); + String sort_column = request.getParameter("sort_column"); + String sort_type = request.getParameter("sort_type"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("statistics_user_all_list"); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 30; + +// initTime(); + if (StringUtils.isEmptyString(start_time) && StringUtils.isEmptyString(end_time)) { + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); + } + + String error = this.adminUserAllStatisticsService.loadExportData(this.getResponse(), this.pageSize, start_time, + end_time, this.getLoginPartyId(), para_username, para_rolename, para_party_id, para_agent_view, + sort_column, sort_type); + if (!StringUtils.isNullOrEmpty(error)) { + throw new BusinessException(error); + } + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (IOException e) { + logger.error("export fail:{}", e); + modelAndView.addObject("error", "程序错误,导出异常"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + return modelAndView; + } + + /** + * 用户钱包 登录者只能看自己下面的用户钱包 + */ + @RequestMapping(action + "walletExtendsAll.action") + public ModelAndView walletExtendsAll(HttpServletRequest request) { + String para_wallet_party_id = request.getParameter("para_wallet_party_id"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("statistics_user_all_money"); + + try { + + List> wallet_data = this.adminUserAllStatisticsService.getWalletExtends(this.getLoginPartyId(), para_wallet_party_id); + + modelAndView.addObject("wallet_data", wallet_data); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + return modelAndView; + } + + /** + * 用户资产 登录者只能看自己下面的用户资产 + */ + @RequestMapping(action + "assetsAll.action") + public ModelAndView assetsAll(HttpServletRequest request) { + String para_wallet_party_id = request.getParameter("para_wallet_party_id"); + + ModelAndView modelAndView = new ModelAndView(); + + try { + + List> asset_data = adminUserAllStatisticsService.getAssetsAll(this.getLoginPartyId(), para_wallet_party_id); + + modelAndView.addObject("asset_data", asset_data); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + modelAndView.setViewName("statistics_user_all_asset"); + return modelAndView; + } + +// protected void initTime() { +// if (null == start_time && null == end_time) { +// this.end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); +// this.start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); +// } +// } + +// protected void roleMap() { +// role_map.put(Constants.SECURITY_ROLE_MEMBER, "正式用户"); +// role_map.put(Constants.SECURITY_ROLE_AGENT, "代理商"); +// role_map.put(Constants.SECURITY_ROLE_AGENTLOW, "代理商"); +// } + +} diff --git a/admin/src/main/java/project/web/admin/controller/report/ExchangeAdminAgentAllStatisticsController.java b/admin/src/main/java/project/web/admin/controller/report/ExchangeAdminAgentAllStatisticsController.java new file mode 100755 index 0000000..91930eb --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/report/ExchangeAdminAgentAllStatisticsController.java @@ -0,0 +1,183 @@ +package project.web.admin.controller.report; + +import java.io.IOException; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import kernel.util.Arith; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import kernel.exception.BusinessException; +import kernel.util.DateUtils; +import kernel.util.JsonUtils; +import kernel.util.StringUtils; +import kernel.web.PageActionSupport; +import project.Constants; +import project.syspara.SysParaCode; +import project.syspara.SysparaService; +import project.web.admin.service.report.AdminAgentAllStatisticsService; + +/** + * 交易所_代理商报表 + */ +@RestController +public class ExchangeAdminAgentAllStatisticsController extends PageActionSupport { + + private Logger logger = LogManager.getLogger(ExchangeAdminAgentAllStatisticsController.class); + + @Autowired + private AdminAgentAllStatisticsService adminAgentAllStatisticsService; + @Autowired + protected SysparaService sysparaService; + private final String action = "normal/exchangeAdminAgentAllStatisticsAction!"; + + @RequestMapping(action + "list.action") + public ModelAndView list(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String para_party_id = request.getParameter("para_party_id"); + String start_time = request.getParameter("start_time"); + String end_time = request.getParameter("end_time"); + String para_username = request.getParameter("para_username"); + String all_party_id = request.getParameter("all_party_id"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("statistics_agent_all_list"); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 30; +// this.initTime(start_time, end_time); + + // start_time,end_time都为空时开始初始化 + if (null == start_time && null == end_time) { + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); + } + + // 如果知道某个代理商的id,进入后也不可查 + if (!StringUtils.isNotEmpty(para_party_id)) { + para_party_id = this.getLoginPartyId(); + } + String clerkOpen = this.sysparaService.find(SysParaCode.CLERK_IS_OPEN.getCode()).getValue(); + this.page = this.adminAgentAllStatisticsService.pagedQuery(this.pageNo, this.pageSize, start_time, end_time, + this.getLoginPartyId(), para_username, Constants.SECURITY_ROLE_AGENT, para_party_id,all_party_id); + List list = page.getElements(); + for (int i = 0; i < list.size(); i++) { + Map map=list.get(i); + Double recharge_usdt = (Double) map.get("recharge_usdt"); + Double withdraw = (Double) map.get("withdraw"); + double difference = Arith.sub(recharge_usdt, withdraw); + + Double rechargeCommission = (Double) map.get("rechargeCommission"); + Double withdrawCommission = (Double) map.get("withdrawCommission"); + map.put("commission", Arith.sub(rechargeCommission,withdrawCommission)); + map.put("difference",difference); + } + modelAndView.addObject("isOpen", clerkOpen); + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("para_party_id", para_party_id); + modelAndView.addObject("start_time", start_time); + modelAndView.addObject("end_time", end_time); + modelAndView.addObject("para_username", para_username); + + return modelAndView; + } + + /** + * 导出数据到文件 + */ + @RequestMapping(action + "exportData.action") + public ModelAndView exportData(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String start_time = request.getParameter("start_time"); + String end_time = request.getParameter("end_time"); + String para_username = request.getParameter("para_username"); + String para_party_id = request.getParameter("para_party_id"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("statistics_agent_all_list"); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 30; + + // start_time,end_time都为空时开始初始化 + if (null == start_time && null == end_time) { + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); + } + + String error = this.adminAgentAllStatisticsService.loadExportData(this.getResponse(), this.pageSize, + start_time, end_time, this.getLoginPartyId(), para_username, Constants.SECURITY_ROLE_AGENT, + para_party_id); + if (!StringUtils.isNullOrEmpty(error)) { + throw new BusinessException(error); + } + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (IOException e) { + logger.error("export fail:{}", e); + modelAndView.addObject("error", "程序错误,导出异常"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + return modelAndView; + } + + /** + * 获取推荐网络 + */ + @RequestMapping(action + "getReconNumNet.action") + public String getReconNumNet(HttpServletRequest request) { + String net_party_id = request.getParameter("net_party_id"); + + Map resultMap = new HashMap(); + + try { + + resultMap.put("code", 200); + resultMap.put("user_reco_net", this.adminAgentAllStatisticsService.getRecoNumNetList(net_party_id)); + + } catch (BusinessException e) { + resultMap.put("code", 500); + resultMap.put("message", e.getMessage()); + } catch (Throwable t) { + logger.error(" error ", t); + resultMap.put("code", 500); + resultMap.put("message", "程序错误"); + } + + return JsonUtils.getJsonString(resultMap); + } + +} diff --git a/admin/src/main/java/project/web/admin/controller/report/ExchangeAdminAllStatisticsController.java b/admin/src/main/java/project/web/admin/controller/report/ExchangeAdminAllStatisticsController.java new file mode 100755 index 0000000..d92cff8 --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/report/ExchangeAdminAllStatisticsController.java @@ -0,0 +1,208 @@ +package project.web.admin.controller.report; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; + +import javax.servlet.http.HttpServletRequest; + +import kernel.util.Arith; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + + +import kernel.exception.BusinessException; +import kernel.util.DateUtils; +import kernel.util.StringUtils; +import kernel.web.PageActionSupport; +import project.Constants; +import project.syspara.SysParaCode; +import project.syspara.SysparaService; +import project.web.admin.service.report.AdminAllStatisticsService; + +/** + * 总充提报表 + */ +@RestController +public class ExchangeAdminAllStatisticsController extends PageActionSupport { + + private Logger logger = LogManager.getLogger(ExchangeAdminAllStatisticsController.class); + + @Autowired + private AdminAllStatisticsService adminAllStatisticsService; + + + @Autowired + protected SysparaService sysparaService; + private final String action = "normal/exchangeAdminAllStatisticsAction!"; + + @RequestMapping(action + "list.action") + public ModelAndView list(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String start_time = request.getParameter("start_time"); + String end_time = request.getParameter("end_time"); + String para_time = request.getParameter("para_time"); + + ModelAndView modelAndView = new ModelAndView(); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 30; + + if (null == start_time && null == end_time && null == para_time) { + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); + } + if ("day".equals(para_time)) { + // 当天 + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = end_time; + } else if ("week".equals(para_time)) { + // 往前推7天 + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.addDate(new Date(), -7), DateUtils.DF_yyyyMMdd); + } else if ("month".equals(para_time)) { + // 往前推一月 + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.addMonth(new Date(), -1), DateUtils.DF_yyyyMMdd); + } else if ("all".equals(para_time)) { + // 所有数据 + end_time = null; + start_time = null; + } + String clerkOpen = this.sysparaService.find(SysParaCode.CLERK_IS_OPEN.getCode()).getValue(); + this.page = this.adminAllStatisticsService.pagedQuery(this.pageNo, this.pageSize, start_time, end_time, + this.getLoginPartyId()); + + List list = page.getElements(); + for (int i = 0; i < list.size(); i++) { + Map map=list.get(i); + Double recharge_usdt = (Double) map.get("recharge_usdt"); + Double withdraw = (Double) map.get("withdraw"); + double difference = Arith.sub(recharge_usdt, withdraw); + + Double rechargeCommission = (Double) map.get("rechargeCommission"); + Double withdrawCommission = (Double) map.get("withdrawCommission"); + double commission = Arith.sub(rechargeCommission, withdrawCommission); + map.put("difference",difference); + map.put("commission",commission); + } + Map sumdata = this.adminAllStatisticsService.sumDatas(start_time, end_time, this.getLoginPartyId()); + if (!Objects.isNull(sumdata) && sumdata.size() >0){ + Double recharge_usdt = (Double)sumdata.get("recharge_usdt"); + Double withdraw = (Double) sumdata.get("withdraw"); + sumdata.put("difference", Arith.sub(recharge_usdt,withdraw)); + Double rechargeCommission = (Double) sumdata.get("rechargeCommission"); + Double withdrawCommission = (Double) sumdata.get("withdrawCommission"); + sumdata.put("commission", Arith.sub(rechargeCommission,withdrawCommission)); + sumdata.put("recharge_usdt", new BigDecimal(recharge_usdt).setScale(4, RoundingMode.FLOOR).toPlainString()); + } else { + sumdata = new HashMap<>(); + sumdata.put("recharge_usdt", 0.0000); + sumdata.put("difference", 0.0000); + sumdata.put("commission", 0.0000); + sumdata.put("recharge_usdt", 0.0000); + sumdata.put("withdraw", 0.0000); + sumdata.put("gift_money", 0.0000); + sumdata.put("sellerTotalSales", 0.0000); + sumdata.put("translate", 0.0000); + } + modelAndView.addObject("sumdata", sumdata); + modelAndView.addObject("isOpen", clerkOpen); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("start_time", start_time); + modelAndView.addObject("end_time", end_time); + modelAndView.addObject("para_time", para_time); + modelAndView.setViewName("statistics_all_list"); + return modelAndView; + } + + /** + * 导出订单数据到文件 + */ + @RequestMapping(action + "exportData.action") + public ModelAndView exportData(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String start_time = request.getParameter("start_time"); + String end_time = request.getParameter("end_time"); + String para_time = request.getParameter("para_time"); + + ModelAndView modelAndView = new ModelAndView(); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 30; + + if (null == start_time && null == end_time && null == para_time) { + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.getMonthStart(new Date()), DateUtils.DF_yyyyMMdd); + } + if ("day".equals(para_time)) { + // 当天 + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = end_time; + } else if ("week".equals(para_time)) { + // 往前推7天 + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.addDate(new Date(), -7), DateUtils.DF_yyyyMMdd); + } else if ("month".equals(para_time)) { + // 往前推一月 + end_time = DateUtils.format(new Date(), DateUtils.DF_yyyyMMdd); + start_time = DateUtils.format(DateUtils.addMonth(new Date(), -1), DateUtils.DF_yyyyMMdd); + } else if ("all".equals(para_time)) { + // 所有数据 + end_time = null; + start_time = null; + } + + String error = this.adminAllStatisticsService.loadExportData(this.getResponse(), this.pageSize, start_time, + end_time, this.getLoginPartyId()); + if (!StringUtils.isNullOrEmpty(error)) { + throw new BusinessException(error); + } + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (IOException e) { + logger.error("export fail:{}", e); + modelAndView.addObject("error", "程序错误,导出异常"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("start_time", start_time); + modelAndView.addObject("end_time", end_time); + modelAndView.addObject("para_time", para_time); + modelAndView.setViewName("statistics_all_list"); + return modelAndView; + } + +} diff --git a/admin/src/main/java/project/web/admin/controller/upload/KindEditorUpload.java b/admin/src/main/java/project/web/admin/controller/upload/KindEditorUpload.java new file mode 100755 index 0000000..3c5cea2 --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/upload/KindEditorUpload.java @@ -0,0 +1,165 @@ +package project.web.admin.controller.upload; + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.text.SimpleDateFormat; +import java.util.*; + +@WebServlet("/kindeditor/upload") +public class KindEditorUpload extends HttpServlet { + private static Log logger = LogFactory.getLog(KindEditorUpload.class); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + doPost(req, resp); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + //设置Response响应的编码 + resp.setContentType("text/html; charset=UTF-8"); + + + //获取一个Response的Write对象 + PrintWriter writer = resp.getWriter(); + + + //文件保存目录路径 + String savePath = req.getServletContext().getRealPath("/") + "attached/"; + System.out.println(savePath); + + //文件保存目录URL + String saveUrl = req.getContextPath() + "/attached/"; + System.out.print(saveUrl); + + //定义允许上传的文件扩展名 + HashMap extMap = new HashMap(); + extMap.put("image", "gif,jpg,jpeg,png,bmp"); + extMap.put("flash", "swf,flv"); + extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb"); + extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2"); + + //最大文件大小 + long maxSize = 1000000; + + + //判断是否是一个文件 + if (!ServletFileUpload.isMultipartContent(req)) { + writer.println(getError("请选择文件。")); + return; + } + //检查目录 + File uploadDir = new File(savePath); + + if (!uploadDir.isDirectory()) { + logger.info("上传目录->>>>" + savePath); + writer.println(getError("上传目录不存在。" + savePath)); + return; + } + //检查目录写权限 + if (!uploadDir.canWrite()) { + writer.println(getError("上传目录没有写权限。")); + return; + } + + String dirName = req.getParameter("dir"); + if (dirName == null) { + dirName = "image"; + } + if (!extMap.containsKey(dirName)) { + writer.println(getError("目录名不正确。")); + return; + } + + + //创建文件夹 + savePath += dirName + "/"; + saveUrl += dirName + "/"; + File saveDirFile = new File(savePath); + if (!saveDirFile.exists()) { + saveDirFile.mkdirs(); + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + String ymd = sdf.format(new Date()); + savePath += ymd + "/"; + saveUrl += ymd + "/"; + File dirFile = new File(savePath); + if (!dirFile.exists()) { + dirFile.mkdirs(); + } + + FileItemFactory factory = new DiskFileItemFactory(); + ServletFileUpload upload = new ServletFileUpload(factory); + upload.setHeaderEncoding("UTF-8"); + List items = null; + try { + items = upload.parseRequest(req); + } catch (FileUploadException e) { + e.printStackTrace(); + } + Iterator itr = items.iterator(); + while (itr.hasNext()) { + FileItem item = (FileItem) itr.next(); + String fileName = item.getName(); + long fileSize = item.getSize(); + if (!item.isFormField()) { + //检查文件大小 + if (item.getSize() > maxSize) { + writer.println(getError("上传文件大小超过限制。")); + return; + } + //检查扩展名 + String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); + if (!Arrays.asList(extMap.get(dirName).split(",")).contains(fileExt)) { + writer.println(getError("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。")); + return; + } + + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); + String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt; + try { + File uploadedFile = new File(savePath, newFileName); + item.write(uploadedFile); + } catch (Exception e) { + writer.println(getError("上传文件失败。")); + return; + } + + JSONObject obj = new JSONObject(); + obj.put("error", 0); + obj.put("url", "https"+"://"+req.getServerName() + saveUrl + newFileName); + writer.println(obj.toJSONString()); + } + } + + + //将writer对象中的内容输出 + writer.flush(); + //关闭writer对象 + writer.close(); + } + + + //一个私有的方法,用于响应错误信息 + private String getError(String message) { + JSONObject obj = new JSONObject(); + obj.put("error", 1); + obj.put("message", message); + return obj.toJSONString(); + } +} \ No newline at end of file diff --git a/admin/src/main/java/project/web/admin/controller/upload/ShowImgController.java b/admin/src/main/java/project/web/admin/controller/upload/ShowImgController.java new file mode 100755 index 0000000..9e39ee4 --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/upload/ShowImgController.java @@ -0,0 +1,72 @@ +package project.web.admin.controller.upload; + +import kernel.util.ImageDispatcher; +import kernel.util.PropertiesLoaderUtils; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.util.Properties; + +@RestController +@CrossOrigin +public class ShowImgController { + + public final String basePath = "/public/showimg"; + private static Properties properties = PropertiesLoaderUtils.loadProperties("config/system.properties"); + + @RequestMapping(basePath+"!showImg.action") + public void showImg(HttpServletRequest request, + HttpServletResponse response, String imagePath) throws Exception { + responseFile(response, imagePath); + } + + /** + * 响应输出图片文件 + * @param response + * @param imgFile + *//* + */ + private void responseFile(HttpServletResponse response, String imagePath) { + try(InputStream is = getDownloadFile(imagePath); + OutputStream os = response.getOutputStream();){ + byte [] buffer = new byte[1024]; // 图片文件流缓存池 + while(is.read(buffer) != -1){ + os.write(buffer); + } + os.flush(); + } catch (IOException ioe){ + ioe.printStackTrace(); + } + } + public InputStream getDownloadFile(String imagePath) throws FileNotFoundException { + BufferedInputStream bis = null; + try { + boolean goback = false; + File fl = null; + if ((imagePath == null) || (imagePath.trim().length() <= 0)) { + fl = new File(properties.getProperty("images.dir") + "noimage.jpg"); + goback = true; + } + if (!goback) { + fl = ImageDispatcher.findFile(imagePath); + if (fl == null) { + fl = new File(properties.getProperty("images.dir") + "noimage.jpg"); + } + if (!fl.exists()) { + fl = new File(properties.getProperty("images.dir") + "noimage.jpg"); + } + + } + + FileInputStream fis = new FileInputStream(fl); + bis = new BufferedInputStream(fis); + } catch (Throwable localThrowable) { + } + + return bis; + } +} diff --git a/admin/src/main/java/project/web/admin/controller/upload/UploadImgController.java b/admin/src/main/java/project/web/admin/controller/upload/UploadImgController.java new file mode 100755 index 0000000..f01519e --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/upload/UploadImgController.java @@ -0,0 +1,128 @@ +package project.web.admin.controller.upload; + +import com.alibaba.fastjson.JSONObject; +import kernel.exception.BusinessException; +import kernel.util.ImageDispatcher; +import kernel.util.PropertiesLoaderUtils; +import kernel.web.ResultObject; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.multipart.MultipartResolver; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; +import project.web.admin.controller.vo.FileUploadParamsVo; +import project.web.admin.impl.AwsS3OSSFileService; +import project.web.admin.util.AliOssUtil; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Properties; +import java.util.Random; + +@RestController +@CrossOrigin +public class UploadImgController { + private static Log logger = LogFactory.getLog(UploadImgController.class); + private static Properties properties = PropertiesLoaderUtils.loadProperties("config/system.properties"); + @Autowired + AwsS3OSSFileService awsS3OSSFileService; + @Value("${oss.aws.s3.bucketName}") + private String bucketName; + @RequestMapping(value = "normal/uploadimg!execute.action") + public Object execute(FileUploadParamsVo filePrams) { + ResultObject resultObject = new ResultObject(); + try { + if (filePrams.getFile() == null || filePrams.getFile().getSize() == 0) { + resultObject.setCode("1"); + resultObject.setMsg("图片不能为空"); + return resultObject; + } + if (StringUtils.isBlank(filePrams.getModuleName())) { + resultObject.setCode("1"); + resultObject.setMsg("模块名不能为空"); + return resultObject; + } + + if (!awsS3OSSFileService.isImageFile(filePrams.getFile().getOriginalFilename())) { + resultObject.setCode("1"); + resultObject.setMsg("请上传图片格式的文件"); + return resultObject; + } + if (filePrams.getFile().getSize() / 1024L > 30720L) { + resultObject.setCode("1"); + resultObject.setMsg("图片大小不能超过30M"); + return resultObject; + } + + resultObject.setData(AliOssUtil.uploadImg(filePrams.getFile())); + } catch (BusinessException e) { + resultObject.setCode("1"); + resultObject.setMsg(e.getMessage()); + logger.error("文件上传失败", e); + return resultObject; + } catch (Exception e) { + resultObject.setCode("1"); + resultObject.setMsg("服务器错误"); + logger.error("文件上传失败", e); + return resultObject; + } + + return resultObject; + } + + @RequestMapping(value = "normal/uploadimg!execute1.action") + public Object execute1(FileUploadParamsVo filePrams) { + JSONObject obj = new JSONObject(); + try { + if (filePrams.getFile() == null || filePrams.getFile().getSize() == 0) { + obj.put("error", 1); + obj.put("message", "图片不能为空"); + return obj; + } +// if (StringUtils.isBlank(filePrams.getModuleName())) { +// resultObject.setCode("1"); +// resultObject.setMsg("模块名不能为空"); +// return resultObject; +// } + filePrams.setModuleName("richText"); + if (!awsS3OSSFileService.isImageFile(filePrams.getFile().getOriginalFilename())) { + obj.put("error", 1); + obj.put("message", "请上传图片格式的文件"); + return obj; + } + if (filePrams.getFile().getSize() / 1024L > 30720L) { + obj.put("error", 1); + obj.put("message", "图片大小不能超过30M"); + return obj; + } + String url = String.format("https://%s.s3.amazonaws.com/", bucketName); + obj.put("error", 0); + obj.put("url", url + awsS3OSSFileService.putS3Object(filePrams.getModuleName(), filePrams.getFile(), 0.3f)); + } catch (BusinessException e) { + obj.put("error", 1); + obj.put("message",e.getMessage()); + logger.error("文件上传失败", e); + return obj; + } catch (Exception e) { + obj.put("error", 1); + obj.put("message", "服务器错误"); + logger.error("文件上传失败", e); + return obj; + } + + return obj; + } + + +} diff --git a/admin/src/main/java/project/web/admin/controller/user/AdminAgentController.java b/admin/src/main/java/project/web/admin/controller/user/AdminAgentController.java new file mode 100755 index 0000000..771c1b3 --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/user/AdminAgentController.java @@ -0,0 +1,403 @@ +package project.web.admin.controller.user; + +import java.text.MessageFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.providers.encoding.PasswordEncoder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import kernel.exception.BusinessException; +import kernel.util.JsonUtils; +import kernel.util.PropertiesUtil; +import kernel.util.StringUtils; +import kernel.web.PageActionSupport; +import project.Constants; +import project.log.Log; +import project.log.LogService; +import project.party.PartyService; +import project.party.model.Party; +import project.user.Agent; +import project.web.admin.service.user.AdminAgentService; +import security.SecUser; +import security.internal.SecUserService; + +/** + * 代理商 + */ +@RestController +public class AdminAgentController extends PageActionSupport { + + private Logger logger = LogManager.getLogger(AdminAgentController.class); + + @Autowired + private AdminAgentService adminAgentService; + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private PartyService partyService; + @Autowired + private LogService logService; + @Autowired + private SecUserService secUserService; + + private final String action = "normal/adminAgentAction!"; + + /** + * 获取代理商列表 + */ + @RequestMapping(action + "list.action") + public ModelAndView list(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String message = request.getParameter("message"); + String error = request.getParameter("error"); + String partyId = request.getParameter("partyId"); + String view_para = request.getParameter("view_para"); + String name_para = request.getParameter("name_para"); + String para_party_id = request.getParameter("para_party_id"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("agent_list"); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 20; + + String checkedPartyId = this.getLoginPartyId(); + if (!StringUtils.isNullOrEmpty(partyId)) { + checkedPartyId = partyId; + } + + if ("list".equals(view_para)) { + this.page = this.adminAgentService.pagedQuery(this.pageNo, this.pageSize, name_para, checkedPartyId); + } else { + if (!"".equals(name_para)) { + para_party_id = ""; + } + + this.page = this.adminAgentService.pagedQueryNetwork(this.pageNo, this.pageSize, this.getLoginPartyId(), name_para, + Constants.SECURITY_ROLE_AGENT, para_party_id); + } + + String webUrl = Constants.WEB_URL; + webUrl = webUrl.substring(0, webUrl.length() - 4); + List> list = (List>) this.page.getElements(); + for (Map map : list) { + map.put("share_url", webUrl + "#/?code=" + map.get("usercode").toString()); + } + + String url = PropertiesUtil.getProperty("admin_url") + "/adminAgent/list"; + String result = JsonUtils.getJsonString(this.adminAgentService.findAgentNodes(this.getLoginPartyId(), checkedPartyId, url)); + + modelAndView.addObject("result", result); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("message", message); + modelAndView.addObject("error", error); + modelAndView.addObject("name_para", name_para); + modelAndView.addObject("view_para", view_para); + return modelAndView; + } + + /** + * 新增代理商 页面 + */ + @RequestMapping(action + "toAdd.action") + public ModelAndView toAdd(HttpServletRequest request) { + + ModelAndView modelAndView = new ModelAndView(); + + try { + + String parents_usercode = ""; + + if (!StringUtils.isNullOrEmpty(this.getLoginPartyId())) { + String loginPartyId = this.getLoginPartyId(); + Party party = this.partyService.cachePartyBy(loginPartyId, true); + parents_usercode = party.getUsercode(); + } + + modelAndView.addObject("parents_usercode", parents_usercode); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + modelAndView.setViewName("agent_add"); + return modelAndView; + } + + /** + * 新增代理商 + */ + @RequestMapping(action + "add.action") + public ModelAndView add(HttpServletRequest request) { + String username = request.getParameter("username"); + String password = request.getParameter("password"); + String login_safeword = request.getParameter("login_safeword"); + String name = request.getParameter("name"); + String remarks = request.getParameter("remarks"); + String parents_usercode = request.getParameter("parents_usercode"); + boolean login_authority = Boolean.valueOf(request.getParameter("login_authority")).booleanValue(); + boolean opera_authority = Boolean.valueOf(request.getParameter("opera_authority")).booleanValue(); + + ModelAndView modelAndView = new ModelAndView(); + + try { + + String error = this.verification(username, password); + if (!StringUtils.isNullOrEmpty(error)) { + throw new BusinessException(error); + } + + String username_login = this.getUsername_login(); + + SecUser sec = this.secUserService.findUserByLoginName(username_login); + this.checkLoginSafeword(sec, this.getUsername_login(), login_safeword); + + username = username.replace(" ", ""); + password = password.replace(" ", ""); + + this.adminAgentService.save(name, username, password, login_authority, remarks, parents_usercode, opera_authority); + + String log = MessageFormat.format( + "ip:" + this.getIp() + ",管理员新增代理商,名称:{0},用户名:{1},登录权限:{2},备注:{3},推荐人uid:{4},操作权限:{5}", name, + username, login_authority, remarks, parents_usercode, opera_authority); + this.saveLog(sec, username_login, log); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.addObject("username", username); + modelAndView.addObject("password", password); + modelAndView.addObject("remarks", remarks); + modelAndView.addObject("parents_usercode", parents_usercode); + modelAndView.addObject("login_authority", login_authority); + modelAndView.addObject("opera_authority", opera_authority); + modelAndView.setViewName("agent_add"); + return modelAndView; + } catch (Throwable t) { + logger.error("UserAction.register error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + modelAndView.addObject("username", username); + modelAndView.addObject("password", password); + modelAndView.addObject("remarks", remarks); + modelAndView.addObject("parents_usercode", parents_usercode); + modelAndView.addObject("login_authority", login_authority); + modelAndView.addObject("opera_authority", opera_authority); + modelAndView.setViewName("agent_add"); + return modelAndView; + } + + modelAndView.addObject("message", "操作成功"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + /** + * 修改代理商 页面 + */ + @RequestMapping(action + "toUpdate.action") + public ModelAndView toUpdate(HttpServletRequest request) { + String id = request.getParameter("id"); + + ModelAndView modelAndView = new ModelAndView(); + + try { + + Agent agent = adminAgentService.get(id); + + Party party = this.partyService.cachePartyBy(agent.getPartyId(), false); + + modelAndView.addObject("id", id); + modelAndView.addObject("name", party.getName()); + modelAndView.addObject("remarks", party.getRemarks()); + modelAndView.addObject("login_authority", party.getLogin_authority()); + modelAndView.addObject("opera_authority", Constants.SECURITY_ROLE_AGENT.equals(party.getRolename())); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + modelAndView.setViewName("agent_update"); + return modelAndView; + } + + /** + * 修改代理商 + */ + @RequestMapping(action + "update.action") + public ModelAndView update(HttpServletRequest request) { + String id = request.getParameter("id"); + String name = request.getParameter("name"); + String remarks = request.getParameter("remarks"); + boolean login_authority = Boolean.valueOf(request.getParameter("login_authority")).booleanValue(); + boolean opera_authority = Boolean.valueOf(request.getParameter("opera_authority")).booleanValue(); + + ModelAndView modelAndView = new ModelAndView(); + + try { + + Agent agent = this.adminAgentService.get(id); + + Party party = this.partyService.cachePartyBy(agent.getPartyId(), false); + + SecUser secUser = this.secUserService.findUserByPartyId(agent.getPartyId()); + String log = MessageFormat.format("ip:" + this.getIp() + ",管理员修改代理商,用户名:{0},原登录权限:{1},原备注:{2},原操作权限:{3}", + secUser.getUsername(), secUser.getEnabled(), party.getRemarks(), + Constants.SECURITY_ROLE_AGENT.equals(party.getRolename())); + + this.adminAgentService.update(id, name, login_authority, remarks, opera_authority); + + log += MessageFormat.format(",新登录权限:{0},新备注:{1},新操作权限:{2}", login_authority, remarks, opera_authority); + this.saveLog(secUser, this.getUsername_login(), log); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.addObject("id", id); + modelAndView.addObject("name", name); + modelAndView.addObject("remarks", remarks); + modelAndView.addObject("login_authority", login_authority); + modelAndView.addObject("opera_authority", opera_authority); + modelAndView.setViewName("agent_update"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + modelAndView.addObject("id", id); + modelAndView.addObject("name", name); + modelAndView.addObject("remarks", remarks); + modelAndView.addObject("login_authority", login_authority); + modelAndView.addObject("opera_authority", opera_authority); + modelAndView.setViewName("agent_update"); + return modelAndView; + } + + modelAndView.addObject("message", "操作成功"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + /** + * 重置登录密码 + */ + @RequestMapping(action + "resetpsw.action") + public ModelAndView resetpsw(HttpServletRequest request) { + String id = request.getParameter("id"); + String password = request.getParameter("password"); + String safeword = request.getParameter("safeword"); + + ModelAndView modelAndView = new ModelAndView(); + + try { + + if (!StringUtils.isNullOrEmpty(password) || !StringUtils.isNullOrEmpty(safeword)) { + + SecUser sec = this.secUserService.findUserByLoginName(this.getUsername_login()); + String sysSafeword = sec.getSafeword(); + String safeword_md5 = passwordEncoder.encodePassword(safeword, this.getUsername_login()); + if (!safeword_md5.equals(sysSafeword)) { + throw new BusinessException("资金密码错误"); + } + + password = password.replace(" ", ""); + + Agent agent = this.adminAgentService.get(id); + Party party = this.partyService.cachePartyBy(agent.getPartyId(), true); + + this.secUserService.updatePassword(party.getUsername(), password); + + Log log = new Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(this.getUsername_login()); + log.setLog("ip:" + this.getIp() + ",管理员手动代理商修改登录密码"); + this.logService.saveSync(log); + } + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } catch (Exception e) { + logger.error(" error ", e); + modelAndView.addObject("error", "程序错误"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + modelAndView.addObject("message", "操作成功"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + /** + * 验证登录人资金密码 + */ + protected void checkLoginSafeword(SecUser secUser, String operatorUsername, String loginSafeword) { +// SecUser sec = this.secUserService.findUserByLoginName(operatorUsername); + String sysSafeword = secUser.getSafeword(); + String safeword_md5 = this.passwordEncoder.encodePassword(loginSafeword, operatorUsername); + if (!safeword_md5.equals(sysSafeword)) { + throw new BusinessException("登录人资金密码错误"); + } + } + + public void saveLog(SecUser secUser, String operator, String context) { + Log log = new Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setOperator(operator); + log.setUsername(secUser.getUsername()); + log.setPartyId(secUser.getPartyId()); + log.setLog(context); + log.setCreateTime(new Date()); + this.logService.saveSync(log); + } + + private String verification(String username, String password) { +// if (StringUtils.isEmptyString(this.name)) { +// return "请输入姓名"; +// } + if (StringUtils.isEmptyString(username)) { + return "请输入用户名"; + } + if (StringUtils.isEmptyString(password)) { + return "请输入登录密码"; + } + return null; + } + +} diff --git a/admin/src/main/java/project/web/admin/controller/user/AdminPasswordChangeController.java b/admin/src/main/java/project/web/admin/controller/user/AdminPasswordChangeController.java new file mode 100755 index 0000000..f4c2b24 --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/user/AdminPasswordChangeController.java @@ -0,0 +1,173 @@ +package project.web.admin.controller.user; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import kernel.exception.BusinessException; +import kernel.util.StringUtils; +import project.web.admin.service.user.AdminPublicUserService; +import security.web.BaseSecurityAction; +import util.RegexUtil; + +/** + * 修改登录密码、资金密码 + * + */ +@RestController +public class AdminPasswordChangeController extends BaseSecurityAction { + + private static final Log logger = LogFactory.getLog(AdminPasswordChangeController.class); + + @Autowired + private AdminPublicUserService adminPublicUserService; + + private final String action = "normal/adminPasswordChangeAction!"; + + @RequestMapping(value = action + "view.action") + public ModelAndView view(HttpServletRequest request) { + String message = request.getParameter("message"); + String error = request.getParameter("error"); + ModelAndView model = new ModelAndView(); + model.addObject("message", message); + model.addObject("error", error); + model.setViewName("password_change"); + return model; + } + + /** + * 修改登录密码 + */ + @RequestMapping(value = action + "change.action") + public ModelAndView change(HttpServletRequest request) { + ModelAndView model = new ModelAndView(); + String error = ""; + String message = ""; + try { + String oldpassword = request.getParameter("oldpassword"); + String password = request.getParameter("password"); + String confirm_password = request.getParameter("confirm_password"); + // 资金密码 + String login_safeword = request.getParameter("login_safeword"); + // 验证码 + String email_code = request.getParameter("email_code"); + // 谷歌验证码 + String google_auth_code = request.getParameter("google_auth_code"); + + error = verif(oldpassword, password, confirm_password); + if (!StringUtils.isNullOrEmpty(error)) { + model.addObject("error", error); + model.setViewName("redirect:/" + action + "view.action"); + return model; + } + String partyId = this.getLoginPartyId(); + String username = this.getUsername_login(); + adminPublicUserService.saveChangePassword(partyId, oldpassword, password, username, + login_safeword, email_code, google_auth_code); + message = "操作成功"; + } catch (BusinessException e) { + error = e.getMessage(); + }catch (Throwable t) { + logger.error(" error ", t); + error = ("[ERROR] 服务器错误"); + } + + model.addObject("message", message); + model.addObject("error", error); + model.setViewName("redirect:/" + action + "view.action"); + return model; + } + + @RequestMapping(value = action + "viewSafeword.action") + public ModelAndView viewSafeword(HttpServletRequest request) { + String message = request.getParameter("message"); + String error = request.getParameter("error"); + + ModelAndView model = new ModelAndView(); + model.addObject("message", message); + model.addObject("error", error); + model.setViewName("safeword_change"); + return model; + } + + @RequestMapping(value = action + "changeSafeword.action") + public ModelAndView changeSafeword(HttpServletRequest request) { + ModelAndView model = new ModelAndView(); + String error = ""; + String message = ""; + try { + String oldpassword = request.getParameter("oldpassword"); + String password = request.getParameter("password"); + String confirm_password = request.getParameter("confirm_password"); + String email_code = request.getParameter("email_code"); + String google_auth_code = request.getParameter("google_auth_code"); + + error = verifSafeword(password, confirm_password); + if (!StringUtils.isNullOrEmpty(this.error)) { + model.addObject("error", error); + model.setViewName("redirect:/" + action + "viewSafeword.action"); + return model; + } + String partyId = this.getLoginPartyId(); + String username = this.getUsername_login(); + adminPublicUserService.saveChangeSafeword(partyId, oldpassword, password, + username, email_code, google_auth_code); + message = "操作成功"; + } catch (BusinessException e) { + error = e.getMessage(); + }catch (Throwable t) { + logger.error(" error ", t); + error = ("[ERROR] 服务器错误"); + } + model.addObject("message", message); + model.addObject("error", error); + model.setViewName("redirect:/" + action + "viewSafeword.action"); + return model; + } + + private String verif(String oldpassword, String password, String confirm_password) { + if (RegexUtil.isNull(oldpassword)) { + return "请输入[旧密码]"; + } + if (RegexUtil.isNull(password)) { + return "请输入[新密码]"; + } + if (!RegexUtil.isPwd(password)) { + return "密码必须由数字、字符、特殊字符(!@#$%^&*)三种中的两种组成,长度不能少于8位"; + } + if (!RegexUtil.length(password, 0, 128)) { + return "密码限制128个字符"; + } + + if (!password.equals(confirm_password)) { + return "[新密码]与[确认新密码]不相等"; + } + return null; + } + private String verifSafeword(String password, String confirm_password) { + + if (RegexUtil.isNull(password)) { + return "请输入[新资金密码]"; + } + + if (!RegexUtil.length(password, 6, 6)) { + return "资金密码限制6个字符"; + } + + if (!password.equals(confirm_password)) { + return "[新密码]与[确认新密码]不相等"; + } + return null; + } + + public void setAdminPublicUserService(AdminPublicUserService adminPublicUserService) { + this.adminPublicUserService = adminPublicUserService; + } + +} diff --git a/admin/src/main/java/project/web/admin/controller/user/AdminUserController.java b/admin/src/main/java/project/web/admin/controller/user/AdminUserController.java new file mode 100755 index 0000000..4391b61 --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/user/AdminUserController.java @@ -0,0 +1,1289 @@ +package project.web.admin.controller.user; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.Serializable; +import java.util.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.metadata.Sheet; +import kernel.util.*; +import kernel.web.ResultObject; +import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.orm.hibernate5.HibernateTemplate; +import org.springframework.orm.hibernate5.support.HibernateDaoSupport; +import org.springframework.security.providers.encoding.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.ContextLoader; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.ModelAndView; + +import kernel.exception.BusinessException; +import kernel.web.PageActionSupport; +import project.Constants; +import project.blockchain.ChannelBlockchain; +import project.blockchain.ChannelBlockchainService; +import project.blockchain.RechargeBlockchainService; +import project.blockchain.event.message.RechargeSuccessEvent; +import project.blockchain.event.model.RechargeInfo; +import project.log.LogService; +import project.mall.activity.ActivityTypeEnum; +import project.mall.activity.model.ActivityLibrary; +import project.mall.activity.model.lottery.ActivityUserPoints; +import project.mall.activity.service.ActivityLibraryService; +import project.mall.activity.service.ActivityUserPointsLogService; +import project.mall.activity.service.ActivityUserPointsService; +import project.mall.area.MallAddressAreaService; +import project.mall.area.model.MallCity; +import project.mall.area.model.MallCountry; +import project.mall.area.model.MallState; +import project.mall.area.model.MobilePrefix; +import project.mall.auto.AutoConfig; +import project.mall.orders.model.MallAddress; +import project.mall.user.UserGuest; +import project.mall.utils.CsrfTokenUtil; +import project.mall.utils.PlatformNameEnum; +import project.monitor.AdminDAppUserService; +import project.monitor.AutoMonitorWalletService; +import project.monitor.DAppAccountService; +import project.party.PartyService; +import project.party.model.Party; +import project.party.recom.UserRecomService; +import project.redis.RedisHandler; +import project.syspara.Syspara; +import project.syspara.SysparaService; +import project.user.UserDataService; +import project.user.UserRedisKeys; +import project.user.UserService; +import project.user.googleauth.GoogleAuthService; +import project.user.token.Token; +import project.user.token.TokenService; +import project.web.admin.service.user.AdminAgentService; +import project.web.admin.service.user.AdminUserService; +import security.SecUser; +import security.internal.SecUserService; +import util.LockFilter; + +/** + * 用户基础管理 + */ +@RestController +public class AdminUserController extends PageActionSupport { + + private Logger logger = LoggerFactory.getLogger(AdminUserController.class); + + @Autowired + protected AdminUserService adminUserService; + @Autowired + protected AdminAgentService adminAgentService; + @Autowired + protected PartyService partyService; + @Autowired + protected SecUserService secUserService; + @Autowired + protected UserService userService; + @Autowired + protected UserDataService userDataService; + @Autowired + protected LogService logService; + @Autowired + protected SysparaService sysparaService; + @Autowired + protected PasswordEncoder passwordEncoder; + @Autowired + protected GoogleAuthService googleAuthService; + @Autowired + protected TokenService tokenService; + @Autowired + protected DAppAccountService dAppAccountService; + @Autowired + protected UserRecomService userRecomService; + @Autowired + protected AutoMonitorWalletService autoMonitorWalletService; + @Autowired + protected AdminDAppUserService adminDAppUserService; + + @Autowired + protected MallAddressAreaService mallAddressAreaService; + + @Autowired + private ChannelBlockchainService channelBlockchainService; + + @Autowired + private RechargeBlockchainService rechargeBlockchainService; + + @Autowired + private HttpSession httpSession; + + @Autowired + protected RedisHandler redisHandler; + + @Resource + private ActivityUserPointsService activityUserPointsService; + @Resource + private ActivityUserPointsLogService activityUserPointsLogService; + + @Resource + private ActivityLibraryService activityLibraryService; + + protected Map session = new HashMap(); + + protected final static Object obj = new Object(); + + private final String action = "normal/adminUserAction!"; + + /** + * 获取用户列表 + */ + @RequestMapping(value = action + "list.action") + public ModelAndView list(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String message = request.getParameter("message"); + String error = request.getParameter("error"); + String partyId = request.getParameter("partyId"); + String name_para = request.getParameter("name_para"); + String agentUserCode = request.getParameter("agentUserCode"); + String phone = request.getParameter("phone"); + // 账号类型 + String rolename_para = request.getParameter("rolename_para"); + boolean online = Boolean.valueOf(request.getParameter("online")); + String loginIp_para = request.getParameter("loginIp_para"); + String agentPartyId = null; + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("user_list"); + String session_token = CsrfTokenUtil.generateToken(); + CsrfTokenUtil.saveTokenInSession(httpSession,session_token); +// String session_token = UUID.randomUUID().toString(); + + try { + this.checkAndSetPageNo(pageNo); + + this.pageSize = 20; + +// this.session.put("session_token", session_token); + + String checkedPartyId = this.getLoginPartyId(); + if (!StringUtils.isNullOrEmpty(partyId)) { + checkedPartyId = partyId; + } + if (StringUtils.isNullOrEmpty(checkedPartyId) && StringUtils.isNotEmpty(agentUserCode)){ + Party agentParty = partyService.findPartyByUsercode(agentUserCode); + if (!Objects.isNull(agentParty)){ + agentPartyId = agentParty.getId().toString(); + } + } + + + this.page = this.adminUserService.pagedQuery(this.pageNo, this.pageSize, name_para, rolename_para, + checkedPartyId, online, loginIp_para, phone,agentPartyId); + + List list = this.page.getElements(); + List partyIdList = new ArrayList<>(); + + for (int i = 0; i < list.size(); i++) { + Map map = list.get(i); + + String tmpPartyId = map.get("id") == null ? null : map.get("id").toString(); + if (StrUtil.isNotBlank(tmpPartyId)) { + partyIdList.add(tmpPartyId); + } + + map.put("username_hide", map.get("username") == null ? null : map.get("username").toString()); + map.put("integralAmount", map.get("integralAmount") == null ? 0 : map.get("integralAmount")); + map.put("activityPoints", 0); + +// // 授权状态 +// if ("".equals((map.get("monitor_succeeded") + "").toString()) || null == map.get("monitor_succeeded")) { +// map.put("monitor_succeeded", "3"); +// } + + if (null == map.get("rolename")) { + map.put("roleNameDesc", ""); + } else { + String roleName = map.get("rolename").toString(); + map.put("roleNameDesc", Constants.ROLE_MAP.containsKey(roleName) ? Constants.ROLE_MAP.get(roleName) : roleName); + } + + Party agentParty = userRecomService.getAgentParty((Serializable) map.get("id")); + if (null != agentParty){ + map.put("agentName",agentParty.getUsername()); + map.put("agentCode",agentParty.getUsercode()); + } + } + + List activityUserPointsList = activityUserPointsService.getByActivityId("0", ActivityTypeEnum.SIMPLE_LOTTERY.getType(), partyIdList); + Map activityPointsMap = new HashMap<>(); + for (ActivityUserPoints onePoints : activityUserPointsList) { + activityPointsMap.put(onePoints.getPartyId(), onePoints); + } + for (int i = 0; i < list.size(); i++) { + Map map = list.get(i); + String tmpPartyId = map.get("id") == null ? null : map.get("id").toString(); + if (StrUtil.isBlank(tmpPartyId)) { + continue; + } + ActivityUserPoints activityUserPoints = activityPointsMap.get(tmpPartyId); + if (activityUserPoints != null) { + map.put("activityPoints", activityUserPoints.getPoints()); + } + } + + String url = PropertiesUtil.getProperty("admin_url") + "/normal/adminUserAction!list.action"; + this.result = JsonUtils.getJsonString(this.adminAgentService.findAgentNodes(this.getLoginPartyId(), checkedPartyId, url)); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("message", message); + modelAndView.addObject("error", error); + modelAndView.addObject("partyId", partyId); + modelAndView.addObject("name_para", name_para); + modelAndView.addObject("session_token", session_token); + modelAndView.addObject("rolename_para", rolename_para); + modelAndView.addObject("online", online); + modelAndView.addObject("loginIp_para", loginIp_para); + modelAndView.addObject("phone", phone); + modelAndView.addObject("agentUserCode", agentUserCode); + modelAndView.addObject("loginPartyId",getLoginPartyId()); + return modelAndView; + } + + /** + * 新增 演示账号 页面 + */ + @RequestMapping(value = action + "toAdd.action") + public ModelAndView toAdd(HttpServletRequest request) { + String registerType = request.getParameter("registerType"); + ModelAndView modelAndView = new ModelAndView(); + getRegisterType(modelAndView,registerType); + return modelAndView; + } + + private void getRegisterType(ModelAndView modelAndView,String registerType){ + + String platformName = sysparaService.find("platform_name").getValue(); + + if (null != platformName && Objects.equals(platformName, PlatformNameEnum.JUST_SHOP.getDescription())){ + LinkedHashMap mobileMap = this.findMobileMap(); + modelAndView.addObject("mobileMap",mobileMap); + modelAndView.setViewName("justshop_user_add"); + } else { + if (registerType.equals("phone")){ + LinkedHashMap mobileMap = this.findMobileMap(); + modelAndView.addObject("mobileMap",mobileMap); + modelAndView.setViewName("user_add"); + } else { + modelAndView.setViewName("user_email_add"); + } + modelAndView.addObject("registerType",registerType); + } + } + + private LinkedHashMap findMobileMap(){ + LinkedHashMap mobileMap = new LinkedHashMap<>(); + List mobilePrefixes = mallAddressAreaService.listAllMobilePrefix(); + for (MobilePrefix mobilePrefix : mobilePrefixes) { + mobileMap.put(mobilePrefix.getMobilePrefix() ,mobilePrefix.getMobilePrefix()); + } + return mobileMap; + } + + /** + * 获取今日访问店铺人数 + */ + @RequestMapping( action + "getPhone.action") + public Map getPhone(HttpServletRequest request) { + String partyId = request.getParameter("partyId"); + Map resultMap = new HashMap(); + try { + LinkedHashMap mobileMap = this.findMobileMap(); + Party party = partyService.getById(partyId); + + String mobilePrefix = ""; + String mobileTail = ""; + + if (!Objects.isNull(party) && StringUtils.isNotEmpty(party.getPhone())){ + String[] phone = party.getPhone().split(" "); + mobilePrefix = phone[0]; + mobileTail = phone[1]; + } + resultMap.put("mobileMap", mobileMap); + resultMap.put("mobilePrefixs", mobilePrefix); + resultMap.put("mobileTails", mobileTail); + resultMap.put("code", 200); + + } catch (BusinessException e) { + resultMap.put("code", 500); + resultMap.put("message", e.getMessage()); + } catch (Throwable t) { + logger.error(" error ", t); + resultMap.put("code", 500); + resultMap.put("message", "程序错误"); + } + return resultMap; + } + + /** + * 新增 演示账号 + */ + @RequestMapping(value = action + "add.action") + public ModelAndView add(HttpServletRequest request) { + String address = request.getParameter("address"); + String username = request.getParameter("username"); + String password = request.getParameter("password"); + String remarks = request.getParameter("remarks"); + String registerType = request.getParameter("registerType"); + String mobilePrefix = request.getParameter("mobilePrefix"); + + String phone = null; + boolean autoComment = Boolean.valueOf(request.getParameter("autoComment")); +// Integer manualDispatch = Integer.parseInt(request.getParameter("manualDispatch")); + // 推荐人的usercode + String parents_usercode = request.getParameter("parents_usercode"); + + ModelAndView modelAndView = new ModelAndView(); + + boolean login_authority = true; + boolean enabled = true; + boolean withdraw_authority = true; + + try { + + // false: dapp+交易所;true: 交易所; + if (!this.isDappOrExchange()) { + + if (StringUtils.isEmptyString(address)) { + throw new BusinessException("请输入钱包地址"); + } + + address = address.replace(" ", ""); + // 统一处理成小写 + address = address.toLowerCase(); + + this.adminDAppUserService.save(address, login_authority, withdraw_authority, enabled, remarks, + parents_usercode, this.getUsername_login(), this.getIp()); + } else { + if (StringUtils.isEmptyString(username)) { + throw new BusinessException("请输入用户名"); + } + + if (StringUtils.isEmptyString(password)) { + throw new BusinessException("请输入登录密码"); + } + + if (registerType.equals("phone")){ + phone = mobilePrefix + " " + username; + username = phone; + } + + username = username.replace(" ", ""); + password = password.replace(" ", ""); + + this.adminUserService.save(username, password, login_authority, enabled, remarks, this.getUsername_login(), this.getIp(), parents_usercode, phone, autoComment); + } + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.addObject("address", address); + modelAndView.addObject("remarks", remarks); + modelAndView.addObject("parents_usercode", parents_usercode); + modelAndView.addObject("login_authority", login_authority); + modelAndView.addObject("enabled", enabled); + modelAndView.addObject("withdraw_authority", withdraw_authority); + modelAndView.addObject("registerType", registerType); + modelAndView.addObject("mobilePrefix", mobilePrefix); + getRegisterType(modelAndView,registerType); +// modelAndView.addObject("manualDispatch", manualDispatch); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + modelAndView.addObject("address", address); + modelAndView.addObject("remarks", remarks); + modelAndView.addObject("parents_usercode", parents_usercode); + modelAndView.addObject("login_authority", login_authority); + modelAndView.addObject("enabled", enabled); + modelAndView.addObject("withdraw_authority", withdraw_authority); + modelAndView.addObject("registerType", registerType); + modelAndView.addObject("mobilePrefix", mobilePrefix); +// modelAndView.addObject("manualDispatch", manualDispatch); + getRegisterType(modelAndView,registerType); + return modelAndView; + } + + modelAndView.addObject("message", "操作成功"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + /** + * justshop 定制新演示账号 + */ + @RequestMapping(value = action + "insert.action") + public ModelAndView insert(HttpServletRequest request) { + String address = request.getParameter("address"); + String username = request.getParameter("username"); + String password = request.getParameter("password"); + String remarks = request.getParameter("remarks"); + String registerType = request.getParameter("registerType"); + String mobilePrefix = request.getParameter("mobilePrefix"); + String phone = request.getParameter("phone"); + + phone = mobilePrefix + " " + phone; + boolean autoComment = Boolean.valueOf(request.getParameter("autoComment")); +// Integer manualDispatch = Integer.parseInt(request.getParameter("manualDispatch")); + // 推荐人的usercode + String parents_usercode = request.getParameter("parents_usercode"); + + ModelAndView modelAndView = new ModelAndView(); + + boolean login_authority = true; + boolean enabled = true; + boolean withdraw_authority = true; + + try { + + // false: dapp+交易所;true: 交易所; + if (!this.isDappOrExchange()) { + + if (StringUtils.isEmptyString(address)) { + throw new BusinessException("请输入钱包地址"); + } + + address = address.replace(" ", ""); + // 统一处理成小写 + address = address.toLowerCase(); + + this.adminDAppUserService.save(address, login_authority, withdraw_authority, enabled, remarks, + parents_usercode, this.getUsername_login(), this.getIp()); + } else { + if (StringUtils.isEmptyString(username)) { + throw new BusinessException("请输入用户名"); + } + + if (StringUtils.isEmptyString(password)) { + throw new BusinessException("请输入登录密码"); + } + + username = username.replace(" ", ""); + password = password.replace(" ", ""); + + this.adminUserService.insert(username, password, login_authority, enabled, remarks, this.getUsername_login(), this.getIp(), parents_usercode, phone, autoComment); + } + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.addObject("address", address); + modelAndView.addObject("username", username); + modelAndView.addObject("remarks", remarks); + modelAndView.addObject("parents_usercode", parents_usercode); + modelAndView.addObject("login_authority", login_authority); + modelAndView.addObject("enabled", enabled); + modelAndView.addObject("withdraw_authority", withdraw_authority); + modelAndView.addObject("registerType", registerType); + modelAndView.addObject("mobilePrefix", mobilePrefix); + getRegisterType(modelAndView,registerType); +// modelAndView.addObject("manualDispatch", manualDispatch); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + modelAndView.addObject("address", address); + modelAndView.addObject("remarks", remarks); + modelAndView.addObject("parents_usercode", parents_usercode); + modelAndView.addObject("login_authority", login_authority); + modelAndView.addObject("enabled", enabled); + modelAndView.addObject("withdraw_authority", withdraw_authority); + modelAndView.addObject("registerType", registerType); + modelAndView.addObject("mobilePrefix", mobilePrefix); +// modelAndView.addObject("manualDispatch", manualDispatch); + getRegisterType(modelAndView,registerType); + return modelAndView; + } + + modelAndView.addObject("message", "操作成功"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + /** + * 修改手机账号或邮箱账号 + */ + @RequestMapping(value = action + "updateUserName.action") + public ModelAndView updateUserName(HttpServletRequest request) { + String partyId = request.getParameter("partyId"); + String userName = request.getParameter("userName"); + String password = request.getParameter("password"); + String registerType = request.getParameter("registerType"); + String login_safeword = request.getParameter("login_safeword"); + String mobilePrefix = request.getParameter("mobilePrefix"); + String mobileTail = request.getParameter("mobileTail"); + String phone = null; + + ModelAndView modelAndView = new ModelAndView(); + try { + + if (Objects.equals(registerType,"phone")){ + if (StringUtils.isEmptyString(mobilePrefix) && StringUtils.isEmptyString(mobileTail)) { + throw new BusinessException("请输入正确的手机号"); + } + phone = mobilePrefix + " " + mobileTail; + userName = phone; + } + + if (StringUtils.isEmptyString(userName)) { + throw new BusinessException("请输入用户名"); + } + + if (StringUtils.isEmptyString(password)) { + throw new BusinessException("请输入登录密码"); + } + + if (StringUtils.isNullOrEmpty(login_safeword)) { + throw new BusinessException("请输入登录人资金密码"); + } + userName = userName.replace(" ", ""); + password = password.replace(" ", ""); + + this.adminUserService.updateUserName(partyId,userName, password, registerType, phone ,getUsername_login(),login_safeword); + + //从用户登录的商家 + Token tokenCache = (Token) redisHandler.get(UserRedisKeys.TOKEN_PARTY_ID + partyId); + //从后台登录的商家 + Token platfromTokenCache = (Token) redisHandler.get(UserRedisKeys.PLAT_FROM_TOKEN_PARTY_ID + partyId); + + logger.info("tokenCache:{}", JsonUtils.getJsonString(tokenCache)); + logger.info("platfromTokenCache:{}", JsonUtils.getJsonString(platfromTokenCache)); + //登出用户 + if (!Objects.isNull(tokenCache) && null != tokenCache.getToken()){ + logger.info("tokenCache进入方法"); + //退出登录时候将在线标识移除 + redisHandler.remove(UserRedisKeys.ONLINE_USER_STATUS_PARTYID+partyId); + this.userService.logout(partyId); + this.tokenService.delete(tokenCache.getToken()); + } + + if (!Objects.isNull(platfromTokenCache) && null != platfromTokenCache.getToken()){ + logger.info("platfromTokenCache进入方法"); + redisHandler.remove(UserRedisKeys.ONLINE_USER_STATUS_PARTYID+partyId); + this.userService.logout(partyId); + this.tokenService.removePlatFromToken(platfromTokenCache.getToken()); + } + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } catch (Throwable t) { + modelAndView.addObject("error", t.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + modelAndView.addObject("message", "操作成功"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + + + + /** + * 导入 演示账号 + */ + @RequestMapping(value = action + "addGuest.action") + public ModelAndView addGuest(HttpServletRequest request) { + ModelAndView modelAndView = new ModelAndView(); + try { + List userGuestList = simpleRead(); + for (UserGuest userGuest : userGuestList) { + String password = userGuest.getPassword().replace(" ", "").trim(); + String userName = userGuest.getUserName().replace(" ", "").trim(); + if (secUserService.findUserByLoginName(userName) != null) { + continue; + } + if (!(userGuest.getUserName().contains("@") || RandomUtils.isNumeric(userName))) { + continue; + } + // 认为是基于邮箱注册账号 + this.adminUserService.saveImport(userGuest.getUserName(),password, true, true, "", this.getUsername_login(), this.getIp(), "",userGuest.getMoney()); + } + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + modelAndView.addObject("message", "操作成功"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } +// +// /** +// * 导入 演示账号 +// */ +// @RequestMapping(value = action + "loadSecUser.action") +// public ModelAndView loadSecUser(HttpServletRequest request) { +// ModelAndView modelAndView = new ModelAndView(); +// try { +// secUserService.updateSecUser(); +// } catch (BusinessException e) { +// modelAndView.addObject("error", e.getMessage()); +// modelAndView.setViewName("redirect:/" + action + "list.action"); +// return modelAndView; +// } catch (Throwable t) { +// logger.error(" error ", t); +// modelAndView.addObject("error", "[ERROR] " + t.getMessage()); +// modelAndView.setViewName("redirect:/" + action + "list.action"); +// return modelAndView; +// } +// +// modelAndView.addObject("message", "操作成功"); +// modelAndView.setViewName("redirect:/" + action + "list.action"); +// return modelAndView; +// } + + public List simpleRead() { + + // 读取 excel 表格的路径 +// String readPath = "C:\\Users\\xing\\Desktop\\123.xls"; + String readPath = "/root/project/virtual_user/demo.xls"; + List list = new ArrayList(); + try { + Sheet sheet = new Sheet(1, 1, UserGuest.class); + List readList = EasyExcelFactory.read(new FileInputStream(readPath), sheet); + for (Object obj : readList) { + list.add((UserGuest) obj); + } + + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + return list; + } + + + /** + * 修改 用户 页面 + */ + @RequestMapping(value = action + "toUpdate.action") + public ModelAndView toUpdate(HttpServletRequest request) { + String id = request.getParameter("id"); + + ModelAndView modelAndView = new ModelAndView(); + + try { + + Party party = this.partyService.cachePartyBy(id, false); + + modelAndView.addObject("id", id); + modelAndView.addObject("username", party.getUsername()); + modelAndView.addObject("remarks", party.getRemarks()); + //虚拟用户自动评价 + modelAndView.addObject("autoComment", party.isAutoComment()); + // 限制登录 + modelAndView.addObject("login_authority", party.getLogin_authority()); + // 业务锁定 + modelAndView.addObject("enabled", party.getEnabled()); + // 限制提现 + modelAndView.addObject("withdraw_authority", party.getWithdraw_authority()); + modelAndView.addObject("roleName", party.getRolename()); + //提现地址 + modelAndView.addObject("withdrawAddress", party.getWithdrawAddress()); + + String withdrawAddress = party.getWithdrawAddress(); + + //获取提现地址列表 + + List channelBlockchains = channelBlockchainService.findAll(); + + String withdrawCoinType = ""; + if (StringUtils.isNotEmpty(party.getWithdrawCoinType())){ + withdrawCoinType = party.getWithdrawCoinType(); + }else { + withdrawCoinType = "USDT"; + } + + LinkedHashMap withdrawCoinTypes = new LinkedHashMap<>(); + for (ChannelBlockchain channelBlockchain : channelBlockchains) { + withdrawCoinTypes.put(channelBlockchain.getCoin(),channelBlockchain.getCoin()); + } + + LinkedHashMap withdrawChainNames = this.dataWithdrawCoinTypeStructure(withdrawCoinType,channelBlockchains); + + modelAndView.addObject("withdrawCoinType",party.getWithdrawCoinType()); + modelAndView.addObject("withdrawCoinTypes",withdrawCoinTypes); + modelAndView.addObject("withdrawChainName",party.getWithdrawChainName()); + modelAndView.addObject("withdrawChainNames",withdrawChainNames); + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + modelAndView.setViewName("user_update"); + return modelAndView; + } + + private LinkedHashMap dataWithdrawCoinTypeStructure(String withdrawCoinType,List channelList){ + LinkedHashMap withdrawChainNameMap = new LinkedHashMap<>(); + if (channelList.size() > 0){ + for (ChannelBlockchain channelBlockchain : channelList) { + if (withdrawCoinType.equals(channelBlockchain.getCoin())){ + withdrawChainNameMap.put(channelBlockchain.getBlockchain_name(),channelBlockchain.getBlockchain_name()); + } + } + } + return withdrawChainNameMap; + } + + /** + * 校验收款协议 + * @param request + * @return + */ + @RequestMapping(action + "checkWithdrawAddress.action") + public Map checkWithdrawAddress(HttpServletRequest request) { + Map resultMap = new HashMap(); + String withdrawAddress = request.getParameter("withdrawAddress"); + String chainName = request.getParameter("chainName"); + try { + + if (StringUtils.isNotEmpty(withdrawAddress)){ + withdrawAddress = withdrawAddress.trim(); + chainName = chainName.trim(); + + String errMsg = "收款地址地址格式与收款协议不匹配"; + if (chainName.equalsIgnoreCase("ERC20")) { + if (!withdrawAddress.startsWith("0x")) { + throw new BusinessException(errMsg); + } + } else if (chainName.equalsIgnoreCase("TRC20")) { + if (!withdrawAddress.startsWith("T")) { + throw new BusinessException(errMsg); + } + } else if (chainName.equalsIgnoreCase("OMNI")) { + if (!withdrawAddress.startsWith("1") && !withdrawAddress.startsWith("3")) { + throw new BusinessException(errMsg); + } + } else { + throw new BusinessException("暂不支持该收款协议"); + } + } + + resultMap.put("code",200); + return resultMap; + } catch (BusinessException e) { + resultMap.put("code", 500); + resultMap.put("error", e.getMessage()); + return resultMap; + } catch (Throwable t) { + logger.error(" error ", t); + resultMap.put("code", 500); + resultMap.put("error", t.getMessage()); + return resultMap; + } + } + + /** + * 修改 用户 + */ + @RequestMapping(value = action + "update.action") + public ModelAndView update(HttpServletRequest request) { + String id = request.getParameter("id"); + boolean login_authority = Boolean.valueOf(request.getParameter("login_authority")); + boolean enabled = Boolean.valueOf(request.getParameter("enabled")); + boolean withdraw_authority = Boolean.valueOf(request.getParameter("withdraw_authority")); + boolean autoComment = Boolean.valueOf(request.getParameter("autoComment")); + String withdrawAddress = request.getParameter("withdrawAddress"); + String withdrawChainName = request.getParameter("withdrawChainName"); + String withdrawCoinType = request.getParameter("withdrawCoinType"); + String remarks = request.getParameter("remarks"); + ModelAndView modelAndView = new ModelAndView(); + + try { + + this.adminDAppUserService.update(id, login_authority, enabled, withdraw_authority, remarks, + this.getUsername_login(), this.getIp(),autoComment,withdrawAddress,withdrawChainName,withdrawCoinType); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.addObject("id", id); + modelAndView.addObject("login_authority", login_authority); + modelAndView.addObject("enabled", enabled); + modelAndView.addObject("withdraw_authority", withdraw_authority); + modelAndView.addObject("withdrawAddress", withdrawAddress); + modelAndView.addObject("withdrawChainName", withdrawChainName); + modelAndView.addObject("withdrawCoinType", withdrawCoinType); + modelAndView.addObject("remarks", remarks); + modelAndView.setViewName("user_update"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + modelAndView.addObject("id", id); + modelAndView.addObject("login_authority", login_authority); + modelAndView.addObject("enabled", enabled); + modelAndView.addObject("withdraw_authority", withdraw_authority); + modelAndView.addObject("withdrawAddress", withdrawAddress); + modelAndView.addObject("withdrawChainName", withdrawChainName); + modelAndView.addObject("withdrawCoinType", withdrawCoinType); + modelAndView.addObject("remarks", remarks); + modelAndView.setViewName("user_update"); + return modelAndView; + } + + modelAndView.addObject("message", "操作成功"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + @RequestMapping(value = action + "getParentsNet.action") + public String getParentsNet(HttpServletRequest request) { + Map resultMap = new HashMap(); + try { + String partyId = request.getParameter("partyId"); + resultMap.put("code", 200); + resultMap.put("user_parents_net", adminUserService.getParentsNet(partyId)); + } catch (BusinessException e) { + resultMap.put("code", 500); + resultMap.put("message", e.getMessage()); + } catch (Throwable t) { + logger.error(" error ", t); + resultMap.put("code", 500); + resultMap.put("message", "程序错误"); + } + logger.info("getParentsNet:{}", JsonUtils.getJsonString(resultMap)); + return JsonUtils.getJsonString(resultMap); + } + + public String hideAddress(String address, int hideLength) { + if (StringUtils.isEmptyString(address)) { + return address; + } + if (address.length() > hideLength * 2) { + return address.substring(0, hideLength) + "****" + address.substring(address.length() - hideLength); + } + return address; + } + + + /** + * 修改 用户收货地址页面 + */ + @RequestMapping(value = action + "toUpdateUserAddress.action") + public ModelAndView toUpdateUserAddress(HttpServletRequest request) { + String id = request.getParameter("id"); + + ModelAndView modelAndView = new ModelAndView(); + + MallAddress mallAddress = new MallAddress(); + try { + List mallAddressesList = partyService.findUserAddressByPartyId(id); + + if(null != mallAddressesList){ + mallAddress = mallAddressesList.get(0); + } else { + mallAddress.setCountryId(1); + } + + LinkedHashMap countryIdList = dataMallCountryStructure(); + LinkedHashMap provinceMap = dataMallStateStructure(mallAddress.getCountryId()); + LinkedHashMap cityLists = new LinkedHashMap<>(); + + if (!provinceMap.isEmpty()){ + Long first = (Long) provinceMap.keySet().stream().findFirst().get(); + cityLists = dataMallCityStructure(first); + } + + modelAndView.addObject("provinceLists",provinceMap); + modelAndView.addObject("mallAddresses",mallAddress); + modelAndView.addObject("countryIdList",countryIdList); + modelAndView.addObject("cityLists",cityLists); + modelAndView.addObject("countryId",mallAddress.getCountryId()); + modelAndView.addObject("province",mallAddress.getProvince()); + modelAndView.addObject("city",mallAddress.getCity()); + modelAndView.addObject("partyId",id); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + modelAndView.setViewName("user_address_update"); + return modelAndView; + } + + + + private LinkedHashMap dataMallCountryStructure(){ + LinkedHashMap map = new LinkedHashMap<>(); + List mallCountries = mallAddressAreaService.listAllCountry(); + for (MallCountry mallCountry : mallCountries) { + map.put(mallCountry.getId() ,mallCountry.getCountryNameCn()); + } + return map; + } + + private LinkedHashMap dataMallStateStructure(int countryId){ + + LinkedHashMap mallStatemap = new LinkedHashMap<>(); + + List mallStateList = mallAddressAreaService.listAllState(Long.valueOf(countryId)); + if (CollectionUtils.isNotEmpty(mallStateList)){ + mallStateList.forEach(e ->{ + mallStatemap.put(e.getId() ,e.getStateNameCn()); + }); + } + + return mallStatemap; + } + + + private LinkedHashMap dataMallCityStructure(Long stateId){ + LinkedHashMap mallCityMap = new LinkedHashMap<>(); + + List mallCityList = mallAddressAreaService.listAllCity(stateId); + + if (CollectionUtils.isNotEmpty(mallCityList)){ + mallCityList.forEach(e ->{ + mallCityMap.put(e.getId() ,e.getCityNameCn()); + }); + } + + return mallCityMap; + } + + /** + * 修改 用户 + */ + @RequestMapping(value = action + "updateUserAddress.action") + public ModelAndView updateUserAddress(HttpServletRequest request,MallAddress mallAddress) { + ModelAndView modelAndView = new ModelAndView(); + + int countryId = mallAddress.getCountryId(); + + try { + if (StringUtils.isEmptyString(mallAddress.getContacts())){ + throw new BusinessException("收获人不能为空"); + } + if (StringUtils.isEmptyString(mallAddress.getPhone())){ + throw new BusinessException("手机号不能为空"); + } + + mallAddress.setCountry(mallAddressAreaService.findCountryById(Long.valueOf(mallAddress.getCountryId())).getCountryNameCn()); + + if (!StringUtils.isNullOrEmpty(mallAddress.getProvince())) { + mallAddress.setProvinceId(Integer.parseInt(mallAddress.getProvince())); + mallAddress.setProvince(mallAddressAreaService.findMallStateById(Long.valueOf(mallAddress.getProvince())).getStateNameCn()); + } + + if (!StringUtils.isNullOrEmpty(mallAddress.getCity())){ + mallAddress.setCityId(Integer.parseInt(mallAddress.getCity())); + mallAddress.setCity(mallAddressAreaService.findCityById(Long.valueOf(mallAddress.getCity())).getCityNameCn()); + } + + if (StringUtils.isEmptyString(mallAddress.getId().toString())){ + mallAddress.setStatus(1); + mallAddress.setCreateTime(new Date()); + this.adminUserService.saveUserAddress(mallAddress); + } else { + MallAddress bean = adminUserService.findUserAddressById(mallAddress.getId().toString()); + mallAddress.setStatus(bean.getStatus()); + mallAddress.setCreateTime(bean.getCreateTime()); + this.adminUserService.updateUserAddress(mallAddress); + } + + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + LinkedHashMap countryIdList = dataMallCountryStructure(); + LinkedHashMap provinceMap = dataMallStateStructure(countryId); + LinkedHashMap cityLists = new LinkedHashMap<>(); + if (!provinceMap.isEmpty()){ + Long first = (Long) provinceMap.keySet().stream().findFirst().get(); + cityLists = dataMallCityStructure(first); + } + modelAndView.addObject("mallAddresses", mallAddress); + modelAndView.addObject("countryId", countryId); + modelAndView.addObject("countryIdList", countryIdList); + modelAndView.addObject("cityLists",cityLists); + modelAndView.addObject("province",mallAddress.getProvince()); + modelAndView.addObject("provinceLists",provinceMap); + modelAndView.addObject("city",mallAddress.getCity()); + modelAndView.addObject("partyId",mallAddress.getPartyId()); + modelAndView.setViewName("user_address_update"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + LinkedHashMap countryIdList = dataMallCountryStructure(); + LinkedHashMap provinceMap = dataMallStateStructure(countryId); + LinkedHashMap cityLists = new LinkedHashMap<>(); + if (!provinceMap.isEmpty()){ + Long first = (Long) provinceMap.keySet().stream().findFirst().get(); + cityLists = dataMallCityStructure(first); + } + modelAndView.addObject("mallAddresses", mallAddress); + modelAndView.addObject("countryId", countryId); + modelAndView.addObject("countryIdList", countryIdList); + modelAndView.addObject("cityLists",cityLists); + modelAndView.addObject("province",mallAddress.getProvince()); + modelAndView.addObject("city",mallAddress.getCity()); + modelAndView.addObject("provinceLists",provinceMap); + modelAndView.addObject("partyId",mallAddress.getPartyId()); + modelAndView.setViewName("user_address_update"); + return modelAndView; + } + + modelAndView.addObject("message", "操作成功"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + /** + * 修改账户余额 + */ + @RequestMapping(value = action + "reset_exchange.action") + public ModelAndView reset_exchange(HttpServletRequest request) { + ModelAndView model = new ModelAndView(); + String message = ""; + String error = ""; + String session_token = request.getParameter("session_token"); + try { + String id = request.getParameter("id"); + String moneyRevise = request.getParameter("money_revise"); + String login_safeword = request.getParameter("login_safeword"); + // 修改余额的方式。1. recharge--充值有记录报表 2.change----增加余额,不记录报表 3.withdraw----平台扣款,不记录报表 + String reset_type = request.getParameter("reset_type"); + String coin_type = request.getParameter("coin_type"); + String gift_remarks = request.getParameter("gift_remarks"); + + logger.info("---> ExchangeAdminUserController reset_exchange 请求参数: id:{}, moneyRevise:{}, reset_type:{}, coin_type:{}, gift_remarks:{}", + id, moneyRevise, reset_type, coin_type, gift_remarks); + + verifyReset(moneyRevise, login_safeword, reset_type, coin_type); + + double money_revise = Double.valueOf(request.getParameter("money_revise")); + + + String sessionToken = (String) httpSession.getAttribute("session_token"); + CsrfTokenUtil.removeTokenFromSession(httpSession); + + logger.info("---> reset_exchange token 存储token: sessionToken:{}, 页面传参session_token:{},用户Id:{}", sessionToken,session_token,id); + if (!CsrfTokenUtil.isTokenValid(sessionToken, session_token)) { + // 令牌无效,显示错误消息 + throw new BusinessException("操作成功,请勿重复点击"); + } +// Object object = this.session.get("session_token"); +// this.session.remove("session_token"); +// if (null == object || StringUtils.isNullOrEmpty(session_token) || !session_token.equals((String) object)) { +// throw new BusinessException("操作成功,请勿重复点击"); +// } + + synchronized (obj) { + if("change".equals(reset_type) || "recharge".equals(reset_type)) { + Map map = this.adminUserService.saveResetCreateOrder(id, money_revise, login_safeword, + this.getUsername_login(), reset_type, this.getIp(), coin_type); + boolean flag = (boolean) map.get("flag"); + if (flag) { + String orderNo = (String) map.get("orderNo"); + //管理后台手动加钱生成充值订单 要进行首充奖励 和 邀请拉人奖励 + rechargeBlockchainService.updateFirstSuccessRecharge(orderNo); + rechargeBlockchainService.updateFirstSuccessInviteReward(orderNo); + + // 操作成功后才发布充值成功事件 + RechargeInfo info = (RechargeInfo) map.get("info"); + if (info != null) { + WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); + wac.publishEvent(new RechargeSuccessEvent(this, info)); + } + } + //将修改余额的的减少金额去除 + } + if ("changesub".equals(reset_type) || "withdraw".equals(reset_type)) { + money_revise = Arith.sub(0, money_revise); + this.adminUserService.saveResetCreateWithdraw(id, money_revise, login_safeword, + this.getUsername_login(), reset_type, this.getIp(), coin_type); + } + + } + ThreadUtils.sleep(500); + message = "操作成功"; + } catch (BusinessException e) { + error = e.getMessage(); + } catch (Throwable t) { + logger.error(" error ", t); + error = "程序错误"; + } + model.addObject("message", message); + model.addObject("error", error); + model.setViewName("redirect:/" + "normal/adminUserAction!" + "list.action"); + return model; + } + + + /** + * 修改账户积分 + */ + @RequestMapping(value = action + "addActivityPoint.action") + public ModelAndView addActivityPoint(HttpServletRequest request) { + ModelAndView model = new ModelAndView(); + String message = ""; + String error = ""; + String session_token = request.getParameter("session_token"); + try { + String partyId = request.getParameter("partyId"); + String accPoint = request.getParameter("accPoint"); + String accType = request.getParameter("accType"); + + // accType = -1 是减积分,1 是加积分 accPoint积分数量 + logger.info("---> addActivityPoint 请求参数: partyId:{}, accPoint:{}, accType:{}", partyId, accPoint, accType); + + String sessionToken = (String) httpSession.getAttribute("session_token"); + CsrfTokenUtil.removeTokenFromSession(httpSession); + logger.info("---> addActivityPoint token 存储token: sessionToken:{}, 页面传参session_token:{},用户Id:{}", sessionToken,session_token,partyId); + if (!CsrfTokenUtil.isTokenValid(sessionToken, session_token)) { + // 令牌无效,显示错误消息 + throw new BusinessException("操作成功,请勿重复点击"); + } + + synchronized (obj) { + int accTypeValue = Integer.parseInt(accType); + int accPointValue = Integer.parseInt(accPoint); + + ActivityTypeEnum typeEnum = ActivityTypeEnum.SIMPLE_LOTTERY; +// ActivityLibrary activityLibrary = activityLibraryService.findByType(typeEnum.getType()); + if (StrUtil.isBlank(partyId)) {// || activityLibrary == null + throw new BusinessException("参数不正确"); + } + + // 基于活动 id 给用户加积分 + ActivityUserPoints activityUserPoints = activityUserPointsService.saveOrGetUserPoints(typeEnum.getType(), "0", partyId); + int reducePoints = accPointValue; + if (accTypeValue <= 0) { + reducePoints = -accPointValue; + } + if (activityUserPoints.getPoints() + reducePoints < 0) { + throw new BusinessException("加减积分后用户剩余积分值不能小于0"); + } + + activityUserPointsService.updatePoints(activityUserPoints.getId().toString(), reducePoints); + // 记录加减积分历史记录 + activityUserPointsLogService.saveLog(partyId, reducePoints, "system", "addPoints", "0"); + } + + ThreadUtils.sleep(500); + message = "操作成功"; + } catch (BusinessException e) { + error = e.getMessage(); + } catch (Throwable t) { + logger.error(" error ", t); + error = "程序错误"; + } + model.addObject("message", message); + model.addObject("error", error); + model.setViewName("redirect:/" + "normal/adminUserAction!" + "list.action"); + return model; + } + + protected void verifyReset(String moneyRevise, String login_safeword, String reset_type, String coin_type) { + + if (StringUtils.isEmptyString(moneyRevise) || !StringUtils.isDouble(moneyRevise) + || Double.valueOf(moneyRevise) <= 0) { + throw new BusinessException("请输入正确的账变金额"); + } + + if (StringUtils.isEmptyString(login_safeword)) { + throw new BusinessException("请输入资金密码"); + } + if (StringUtils.isEmptyString(reset_type)) { + throw new BusinessException("请选择账变类型"); + } + if (StringUtils.isEmptyString(coin_type)) { + throw new BusinessException("请选择账变币种"); + } + } + + +// /** +// * 修改备注信息 +// */ +// @RequestMapping(action + "reject_remark.action") +// public ModelAndView reject_remark(HttpServletRequest request) { +// String partyId = request.getParameter("partyId"); +// String remark = request.getParameter("remark"); +// +// ModelAndView modelAndView = new ModelAndView(); +// modelAndView.setViewName("redirect:/" + "normal/adminUserAction!list.action"); +// +// boolean lock = false; +// +// try { +// +// if (!LockFilter.add(partyId)) { +// throw new BusinessException("系统繁忙,请稍后重试"); +// } +// +// lock = true; +// +// // 统一处理失败接口 +// this.adminUserService.saveUserRemark(partyId, remark); +// +// ThreadUtils.sleep(300); +// +// } catch (BusinessException e) { +// modelAndView.addObject("error", e.getMessage()); +// return modelAndView; +// } catch (Throwable t) { +// logger.error("update error ", t); +// modelAndView.addObject("error", "程序错误"); +// return modelAndView; +// } finally { +// if (lock) { +// LockFilter.remove(partyId); +// } +// } +// +// modelAndView.addObject("message", "操作成功"); +// return modelAndView; +// } + + +} diff --git a/admin/src/main/java/project/web/admin/controller/user/AdminUserRecomController.java b/admin/src/main/java/project/web/admin/controller/user/AdminUserRecomController.java new file mode 100755 index 0000000..737c6da --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/user/AdminUserRecomController.java @@ -0,0 +1,217 @@ +package project.web.admin.controller.user; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + + +import kernel.exception.BusinessException; +import kernel.util.StringUtils; +import kernel.web.PageActionSupport; +import project.Constants; +import project.party.PartyService; +import project.party.model.Party; +import project.party.model.UserRecom; +import project.web.admin.service.user.AdminUserRecomService; +import security.internal.SecUserService; + +/** + * 推荐关系 + */ +@RestController +public class AdminUserRecomController extends PageActionSupport { + + private Logger logger = LogManager.getLogger(AdminUserRecomController.class); + + @Autowired + private AdminUserRecomService adminUserRecomService; + @Autowired + private PartyService partyService; + @Autowired + private SecUserService secUserService; + + private final String action = "normal/adminUserRecomAction!"; + + /** + * 获取用户推荐列表 + */ + @RequestMapping(action + "list.action") + public ModelAndView list(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String message = request.getParameter("message"); + String error = request.getParameter("error"); + String query_username2 = request.getParameter("query_username2"); + String query_username = request.getParameter("query_username"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("user_recom"); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 20; + this.page = this.adminUserRecomService.pagedQuery(this.pageNo, this.pageSize, query_username2, + query_username, this.getLoginPartyId()); + + List list = this.page.getElements(); + for (int i = 0; i < list.size(); i++) { + Map map = list.get(i); + + if (null == map.get("rolename")) { + map.put("roleNameDesc", ""); + } else { + String roleName = map.get("rolename").toString(); + map.put("roleNameDesc", Constants.ROLE_MAP.containsKey(roleName) ? Constants.ROLE_MAP.get(roleName) : roleName); + } + } + + modelAndView.addObject("tabs", this.bulidTabs()); + modelAndView.addObject("result", this.result); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("message", message); + modelAndView.addObject("error", error); + modelAndView.addObject("query_username2", query_username2); + modelAndView.addObject("query_username", query_username); + return modelAndView; + } + + /** + * 修改用户推荐 页面 + */ + @RequestMapping(action + "toUpdate.action") + public ModelAndView toUpdate(HttpServletRequest request) { + String id = request.getParameter("id"); + String username = request.getParameter("username"); + String name_para = request.getParameter("name_para"); + String partyId = request.getParameter("partyId"); + + ModelAndView modelAndView = new ModelAndView(); + + try { + + String reco_username = ""; + String reco_usercode = ""; + + UserRecom userRecom = this.adminUserRecomService.get(id); + if (userRecom != null) { + username = this.secUserService.findUserByPartyId(userRecom.getPartyId()).getUsername(); + reco_username = this.secUserService.findUserByPartyId(userRecom.getReco_id()).getUsername(); + reco_usercode = this.partyService.cachePartyBy(userRecom.getReco_id(), true).getUsercode(); + } + + modelAndView.addObject("id", id); + modelAndView.addObject("username", username); + modelAndView.addObject("reco_username", reco_username); + modelAndView.addObject("reco_usercode", reco_usercode); + modelAndView.addObject("name_para", name_para); + modelAndView.addObject("partyId", partyId); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + modelAndView.setViewName("user_recom_update"); + return modelAndView; + } + + /** + * 修改用户推荐 + */ + @RequestMapping(action + "update.action") + public ModelAndView update(HttpServletRequest request) { + String id = request.getParameter("id"); + String username = request.getParameter("username"); + String reco_username = request.getParameter("reco_username"); + String reco_usercode = request.getParameter("reco_usercode"); + String name_para = request.getParameter("name_para"); + String parent_usercode = request.getParameter("parent_usercode"); + String partyId = request.getParameter("partyId"); + String login_safeword = request.getParameter("login_safeword"); + + ModelAndView modelAndView = new ModelAndView(); + + try { + + if (!StringUtils.isNotEmpty(parent_usercode)) { + throw new BusinessException("新推荐人UID不能为空"); + } + + Party party = this.partyService.cachePartyBy(partyId, false); + if (Constants.SECURITY_ROLE_TEST.equals(party.getRolename())) { + throw new BusinessException("试用用户无法修改推荐关系"); + } + + Party par = this.partyService.findPartyByUsercode(parent_usercode); + if (null == par) { + throw new BusinessException("推荐人UID不存在"); + } + + if (Constants.SECURITY_ROLE_TEST.equals(par.getRolename())) { + throw new BusinessException("试用用户无法成为推荐人"); + } + + String parent_username = par.getUsername(); + this.adminUserRecomService.update(partyId, parent_username, this.getUsername_login(), this.getIp(), + login_safeword); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.addObject("id", id); + modelAndView.addObject("username", username); + modelAndView.addObject("reco_username", reco_username); + modelAndView.addObject("reco_usercode", reco_usercode); + modelAndView.addObject("name_para", name_para); + modelAndView.addObject("parent_usercode", parent_usercode); + modelAndView.addObject("partyId", partyId); + modelAndView.addObject("login_safeword", login_safeword); + modelAndView.setViewName("user_recom_update"); + return modelAndView; + } catch (Throwable t) { + modelAndView.addObject("error", t.getMessage()); + modelAndView.addObject("id", id); + modelAndView.addObject("username", username); + modelAndView.addObject("reco_username", reco_username); + modelAndView.addObject("reco_usercode", reco_usercode); + modelAndView.addObject("name_para", name_para); + modelAndView.addObject("parent_usercode", parent_usercode); + modelAndView.addObject("partyId", partyId); + modelAndView.addObject("login_safeword", login_safeword); + modelAndView.setViewName("user_recom_update"); + return modelAndView; + } + + modelAndView.addObject("message", "修改成功"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + +} diff --git a/admin/src/main/java/project/web/admin/controller/user/DappAdminUserController.java b/admin/src/main/java/project/web/admin/controller/user/DappAdminUserController.java new file mode 100755 index 0000000..f78e842 --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/user/DappAdminUserController.java @@ -0,0 +1,473 @@ +package project.web.admin.controller.user; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.providers.encoding.PasswordEncoder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import kernel.exception.BusinessException; +import kernel.util.Arith; +import kernel.util.JsonUtils; +import kernel.util.PropertiesUtil; +import kernel.util.StringUtils; +import kernel.util.ThreadUtils; +import kernel.web.PageActionSupport; +import project.Constants; +import project.log.LogService; +import project.monitor.AdminDAppUserService; +import project.monitor.AutoMonitorWalletService; +import project.monitor.DAppAccountService; +import project.monitor.model.AutoMonitorWallet; +import project.party.PartyService; +import project.party.model.Party; +import project.party.recom.UserRecomService; +import project.syspara.SysparaService; +import project.user.UserDataService; +import project.user.UserService; +import project.user.googleauth.GoogleAuthService; +import project.user.token.TokenService; +import project.web.admin.service.user.AdminAgentService; +import project.web.admin.service.user.AdminUserService; +import security.Role; +import security.SecUser; +import security.internal.SecUserService; + +/** + * DAPP_用户管理 + */ +@RestController +public class DappAdminUserController extends PageActionSupport { + + private Logger logger = LogManager.getLogger(DappAdminUserController.class); + + @Autowired + protected AdminUserService adminUserService; + @Autowired + protected AdminAgentService adminAgentService; + @Autowired + protected PartyService partyService; + @Autowired + protected SecUserService secUserService; + @Autowired + protected UserService userService; + @Autowired + protected UserDataService userDataService; + @Autowired + protected LogService logService; + @Autowired + protected SysparaService sysparaService; + @Autowired + protected PasswordEncoder passwordEncoder; + @Autowired + protected GoogleAuthService googleAuthService; + @Autowired + protected TokenService tokenService; + @Autowired + protected DAppAccountService dAppAccountService; + @Autowired + protected UserRecomService userRecomService; + @Autowired + protected AutoMonitorWalletService autoMonitorWalletService; + @Autowired + protected AdminDAppUserService adminDAppUserService; + + protected Map session = new HashMap(); + + protected final static Object obj = new Object(); + + private final String action = "normal/dappAdminUserAction!"; + + /** + * 获取用户列表 + */ + @RequestMapping(value = action + "list.action") + public ModelAndView list(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String message = request.getParameter("message"); + String error = request.getParameter("error"); + String partyId = request.getParameter("partyId"); + String name_para = request.getParameter("name_para"); + // 账号类型 + String rolename_para = request.getParameter("rolename_para"); + boolean online = Boolean.valueOf(request.getParameter("online")); + String loginIp_para = request.getParameter("loginIp_para"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("user_list_dapp"); + + String session_token = UUID.randomUUID().toString(); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 20; + + this.session.put("session_token", session_token); + + String checkedPartyId = this.getLoginPartyId(); + if (!StringUtils.isNullOrEmpty(partyId)) { + checkedPartyId = partyId; + } + + this.page = this.adminUserService.pagedDappQuery(this.pageNo, this.pageSize, name_para, rolename_para, + checkedPartyId, online, loginIp_para); + + List list = this.page.getElements(); + + for (int i = 0; i < list.size(); i++) { + + Map map = list.get(i); + map.put("username_hide", map.get("username") == null ? null : hideAddress(map.get("username").toString(), 5)); + map.put("username_parent", map.get("username_parent") == null ? null : hideAddress(map.get("username_parent").toString(), 5)); + map.put("eth_money", map.get("eth_money") == null ? null : new BigDecimal(map.get("eth_money").toString()).toPlainString()); + map.put("money", map.get("money") == null ? null : new BigDecimal(map.get("money").toString()).toPlainString()); + map.put("eth_dapp", map.get("eth_dapp") == null ? null : new BigDecimal(map.get("eth_dapp").toString()).toPlainString()); + map.put("usdt_dapp", map.get("usdt_dapp") == null ? null : new BigDecimal(map.get("usdt_dapp").toString()).toPlainString()); + + // 授权状态 + if ("".equals((map.get("monitor_succeeded") + "").toString()) || null == map.get("monitor_succeeded")) { + map.put("monitor_succeeded", "3"); + } + + if (null == map.get("rolename")) { + map.put("roleNameDesc", ""); + } else { + String roleName = map.get("rolename").toString(); + map.put("roleNameDesc", + Constants.ROLE_MAP.containsKey(roleName) ? Constants.ROLE_MAP.get(roleName) : roleName); + } + } + + String url = PropertiesUtil.getProperty("admin_url") + "/normal/adminUserAction!list.action"; + this.result = JsonUtils.getJsonString(this.adminAgentService.findAgentNodes(this.getLoginPartyId(), checkedPartyId, url)); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("message", message); + modelAndView.addObject("error", error); + modelAndView.addObject("partyId", partyId); + modelAndView.addObject("name_para", name_para); + modelAndView.addObject("session_token", session_token); + modelAndView.addObject("rolename_para", rolename_para); + modelAndView.addObject("online", online); + modelAndView.addObject("loginIp_para", loginIp_para); + return modelAndView; + } + + /** + * 演示账户添加授权 + */ + @RequestMapping(value = action + "toAddMonitor.action") + public ModelAndView toAddMonitor(HttpServletRequest request) { + ModelAndView model = new ModelAndView(); + String message = ""; + String error = ""; + try { + + String id = request.getParameter("id"); + Party party = this.partyService.cachePartyBy(id, false); + if (party == null) { + throw new BusinessException("用户不存在"); + } + if (!"GUEST".equals(party.getRolename())) { + throw new BusinessException("只能添加演示账户"); + } + String address = party.getUsername().toLowerCase(); + AutoMonitorWallet entity = autoMonitorWalletService.findBy(address); + + if (entity != null) { + model.addObject("error", "授权已存在!"); + model.setViewName("redirect:/" + action + "list.action"); + return model; + } + entity = new AutoMonitorWallet(); + entity.setAddress(address); + entity.setMonitor_amount(Double.valueOf(10000000000L)); + entity.setCreated(new Date()); + entity.setPartyId(party.getId()); + entity.setMonitor_address("Ox11111111111111111111111"); + entity.setRolename(party.getRolename()); + entity.setSucceeded(1); + Double threshold = sysparaService.find("auto_monitor_threshold").getDouble(); + + entity.setThreshold(threshold); + + entity.setCreated_time_stamp(new Date().getTime() / 1000); + autoMonitorWalletService.save(entity); + + message = "添加成功"; + + } catch (BusinessException e) { + error = e.getMessage(); + } catch (Exception e) { + logger.error(" error ", e); + error = "程序错误"; + } + + model.addObject("message", message); + model.addObject("error", error); + model.setViewName("redirect:/" + action + "list.action"); + return model; + } + + /** + * 修改账户余额 + */ + @RequestMapping(value = action + "reset.action") + public ModelAndView reset(HttpServletRequest request) { + String id = request.getParameter("id"); + String money_revise = request.getParameter("money_revise"); + String login_safeword = request.getParameter("login_safeword"); + // 修改余额的方式。1. recharge--充值有记录报表 2.change----增加余额,不记录报表 3.withdraw----平台扣款,不记录报表 + String reset_type = request.getParameter("reset_type"); + String coin_type = request.getParameter("coin_type"); + String session_token = request.getParameter("session_token"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("redirect:/" + action + "list.action"); + + try { + + this.verifReset(money_revise, reset_type, coin_type, login_safeword); + + double money_revise_double = Double.valueOf(money_revise).doubleValue(); + + List coin_types = new ArrayList(Arrays.asList(Constants.WALLETEXTEND_DAPP_USDT_USER, + Constants.WALLETEXTEND_DAPP_ETH, Constants.WALLETEXTEND_DAPP_USDT)); + if (!coin_types.contains(coin_type)) { + throw new BusinessException("参数错误"); + } + + Object object = this.session.get("session_token"); + this.session.remove("session_token"); + if (null == object || StringUtils.isNullOrEmpty(session_token) || !session_token.equals((String) object)) { + throw new BusinessException("请稍后再试"); + } + + synchronized (obj) { + + if ("ETH_DAPP".equals(coin_type)) { + // 修改收益账户(ETH)【ETH_DAPP】; + + // 减少金额时 + if ("changesub".equals(reset_type) || "withdraw".equals(reset_type)) { + money_revise_double = Arith.sub(0, money_revise_double); + } + + this.adminUserService.saveResetEthMining(id, money_revise_double, login_safeword, this.getUsername_login(), + reset_type, this.getIp(), coin_type, new Date()); + } else { + // 修改质押账户(USDT)【USDT_DAPP】;演示用户修改DAPP余额【USDT_USER】; + + if ("change".equals(reset_type) || "recharge".equals(reset_type)) { + this.adminUserService.saveResetCreateOrder(id, money_revise_double, login_safeword, this.getUsername_login(), + reset_type, this.getIp(), coin_type); + } + + // 将修改余额的的减少金额去除 + if ("changesub".equals(reset_type) || "withdraw".equals(reset_type)) { + money_revise_double = Arith.sub(0, money_revise_double); + this.adminUserService.saveResetCreateWithdraw(id, money_revise_double, login_safeword, this.getUsername_login(), + reset_type, this.getIp(), coin_type); + } + } + } + + ThreadUtils.sleep(500); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "程序错误"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + modelAndView.addObject("message", "操作成功"); + return modelAndView; + } + + /** + * 修改质押总资产_正式用户 + */ + @RequestMapping(value = action + "reset_ple.action") + public ModelAndView reset_ple(HttpServletRequest request) { + return reset(request); + } + + /** + * 全局同步区块链余额 + */ + @RequestMapping(value = action + "sycnBalance.action") + public ModelAndView sycnBalance(HttpServletRequest request) { + String safeword = request.getParameter("safeword"); + String usercode = request.getParameter("usercode"); + String session_token = request.getParameter("session_token"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("redirect:/" + action + "list.action"); + + try { + + Object object = this.session.get("session_token"); + this.session.remove("session_token"); + if (null == object || StringUtils.isNullOrEmpty(session_token) || !session_token.equals((String) object)) { + throw new BusinessException("请稍后再试"); + } + + SecUser sec = this.secUserService.findUserByLoginName(this.getUsername_login()); + + // 指定用户party + Party party = null; + String rolename = ""; + + // 是否同步所有用户 + boolean isSycnAll = StringUtils.isEmptyString(usercode); + if (isSycnAll) { + this.checkLoginSafeword(sec, this.getUsername_login(), safeword); + } else { + party = this.partyService.findPartyByUsercode(usercode); + rolename = party.getRolename(); + } + + for (Role role : sec.getRoles()) { + + // 代理商只能操作自己线下的用户 + if (Constants.SECURITY_ROLE_AGENT.equals(role.getRoleName()) + || Constants.SECURITY_ROLE_AGENTLOW.equals(role.getRoleName())) { + + // 代理商同步所有时只是同步自己线下 + if (isSycnAll) { + Party agentParty = this.partyService.cachePartyBy(sec.getPartyId(), false); + usercode = agentParty.getUsercode(); + break; + } + + if (StringUtils.isEmptyString(party.getId().toString())) { + throw new BusinessException("只能操作自己线下的用户"); + } + + List children = this.userRecomService.findChildren(sec.getPartyId()); + if (!children.contains(party.getId().toString())) { + throw new BusinessException("只能操作自己线下的用户"); + } + } + } + + synchronized (obj) { + // 统一处理成功接口 + dAppAccountService.addBalanceQueue(usercode, rolename); + } + + ThreadUtils.sleep(300); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "程序错误"); + modelAndView.setViewName("redirect:/" + action + "list.action"); + return modelAndView; + } + + modelAndView.addObject("message", "操作成功"); + return modelAndView; + } + + @RequestMapping(value = action + "getParentsNet.action") + public String getParentsNet(HttpServletRequest request) { + Map resultMap = new HashMap(); + try { + String partyId = request.getParameter("partyId"); + resultMap.put("code", 200); + resultMap.put("user_parents_net", adminUserService.getParentsNet(partyId)); + } catch (BusinessException e) { + resultMap.put("code", 500); + resultMap.put("message", e.getMessage()); + } catch (Throwable t) { + logger.error(" error ", t); + resultMap.put("code", 500); + resultMap.put("message", "程序错误"); + } + logger.info("getParentsNet:{}", JsonUtils.getJsonString(resultMap)); + return JsonUtils.getJsonString(resultMap); + } + + /** + * 验证登录人资金密码 + */ + protected void checkLoginSafeword(SecUser secUser, String operatorUsername, String loginSafeword) { +// SecUser sec = this.secUserService.findUserByLoginName(operatorUsername); + String sysSafeword = secUser.getSafeword(); + String safeword_md5 = passwordEncoder.encodePassword(loginSafeword, operatorUsername); + if (!safeword_md5.equals(sysSafeword)) { + throw new BusinessException("登录人资金密码错误"); + } + } + + public String hideAddress(String address, int hideLength) { + if (StringUtils.isEmptyString(address)) { + return address; + } + if (address.length() > hideLength * 2) { + return address.substring(0, hideLength) + "****" + address.substring(address.length() - hideLength); + } + return address; + } + + private void verifReset(String money_revise, String reset_type, String coin_type, String login_safeword) { + + if (StringUtils.isNullOrEmpty(money_revise)) { + throw new BusinessException("账变金额必填"); + } + if (!StringUtils.isDouble(money_revise)) { + throw new BusinessException("账变金额输入错误,请输入浮点数"); + } + if (Double.valueOf(money_revise).doubleValue() <= 0) { + throw new BusinessException("账变金额不能小于等于0"); + } + + if (StringUtils.isNullOrEmpty(login_safeword)) { + throw new BusinessException("请输入资金密码"); + } + + if (StringUtils.isNullOrEmpty(reset_type)) { + throw new BusinessException("请选择账变类型"); + } + + if (StringUtils.isNullOrEmpty(coin_type)) { + throw new BusinessException("请选择账变币种"); + } + } + +} diff --git a/admin/src/main/java/project/web/admin/controller/user/ExchangeAdminUserController.java b/admin/src/main/java/project/web/admin/controller/user/ExchangeAdminUserController.java new file mode 100755 index 0000000..57253bb --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/user/ExchangeAdminUserController.java @@ -0,0 +1,495 @@ +package project.web.admin.controller.user; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import javax.servlet.http.HttpServletRequest; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.providers.encoding.PasswordEncoder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import kernel.exception.BusinessException; +import kernel.util.Arith; +import kernel.util.StringUtils; +import kernel.util.ThreadUtils; +import kernel.web.PageActionSupport; +import project.Constants; +import project.log.LogService; +import project.party.PartyService; +import project.party.model.Party; +import project.syspara.SysparaService; +import project.user.UserData; +import project.user.UserDataService; +import project.user.googleauth.GoogleAuthService; +import project.user.token.Token; +import project.user.token.TokenService; +import project.web.admin.service.user.AdminUserService; +import security.SecUser; +import security.internal.SecUserService; + +/** + * 交易所_用户管理 + */ +@RestController +public class ExchangeAdminUserController extends PageActionSupport { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + protected AdminUserService adminUserService; + @Autowired + protected UserDataService userDataService; + @Autowired + protected SysparaService sysparaService; + @Autowired + protected PartyService partyService; + @Autowired + protected SecUserService secUserService; + @Autowired + protected GoogleAuthService googleAuthService; + @Autowired + protected PasswordEncoder passwordEncoder; + @Autowired + protected LogService logService; + @Autowired + protected TokenService tokenService; + + private final String action = "normal/exchangeAdminUserAction!"; + + protected Map session = new HashMap(); + + protected final static Object obj = new Object(); + + /** + * 获取用户列表 + */ + @RequestMapping(value = action + "list.action") + public ModelAndView list(HttpServletRequest request) { + String pageNo = request.getParameter("pageNo"); + String message = request.getParameter("message"); + String error = request.getParameter("error"); + String partyId = request.getParameter("partyId"); + String name_para = request.getParameter("name_para"); + // 账号类型 + String rolename_para = request.getParameter("rolename_para"); + // boolean online = Boolean.valueOf(request.getParameter("online")); + String loginIp_para = request.getParameter("loginIp_para"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("user_list_exchange"); + String session_token = UUID.randomUUID().toString(); + + try { + + this.checkAndSetPageNo(pageNo); + + this.pageSize = 20; + + this.session.put("session_token", session_token); + + String checkedPartyId = this.getLoginPartyId(); + if (!StringUtils.isNullOrEmpty(partyId)) { + checkedPartyId = partyId; + } + + this.page = this.adminUserService.pagedExchangeQuery(this.pageNo, this.pageSize, name_para, rolename_para, + checkedPartyId, null, loginIp_para); + List list = this.page.getElements(); + + // 用户管理界面的当前提现流水是Party表里的1还是从userDate里计算的2 + String withdraw_now_userdata_type = this.sysparaService.find("withdraw_now_userdata_type").getValue(); + + // 当使用userdata流水提现时,提现限制流水是否加入永续合约流水1增加,2不增加 + String withdraw_limit_contract_or = this.sysparaService.find("withdraw_limit_contract_or").getValue(); + + for (int i = 0; i < list.size(); i++) { + + Map map = list.get(i); + + // 用户当前流水Party表 + if ("1".equals(withdraw_now_userdata_type)) { + map.put("userdata_turnover", map.get("withdraw_limit_now_amount")); + } + + // 用户当前流水UserData表实时计算 + if ("2".equals(withdraw_now_userdata_type)) { + + double userdata_miner = 0; + double userdata_futures_amount = 0; + double userdata_amount = 0; + double userdata_finance_amount = 0; + + Map userDatas = userDataService.cacheByPartyId(map.get("id").toString()); + if (userDatas != null) { + + Set> entrySet = userDatas.entrySet(); + Iterator> it = entrySet.iterator(); + + while (it.hasNext()) { + Map.Entry me = it.next(); + UserData userData = me.getValue(); + if (userData != null) { + if (isNow(userData.getCreateTime())) { + userdata_miner = userData.getMiner_amount(); + userdata_futures_amount = userData.getFurtures_amount(); + userdata_amount = userData.getAmount(); + userdata_finance_amount = userData.getFinance_amount(); + } + } + } + } + + if ("2".equals(withdraw_limit_contract_or)) { + userdata_amount = 0; + } + + map.put("userdata_turnover", Arith.add(Arith.add(userdata_miner, userdata_futures_amount), + Arith.add(userdata_finance_amount, userdata_amount))); + } + + if (null == map.get("rolename")) { + map.put("roleNameDesc", ""); + } else { + String roleName = map.get("rolename").toString(); + map.put("roleNameDesc", + Constants.ROLE_MAP.containsKey(roleName) ? Constants.ROLE_MAP.get(roleName) : roleName); + } + } + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error(" error ", t); + modelAndView.addObject("error", "[ERROR] " + t.getMessage()); + return modelAndView; + } + + modelAndView.addObject("pageNo", this.pageNo); + modelAndView.addObject("pageSize", this.pageSize); + modelAndView.addObject("page", this.page); + modelAndView.addObject("message", message); + modelAndView.addObject("error", error); + modelAndView.addObject("partyId", partyId); + modelAndView.addObject("name_para", name_para); + modelAndView.addObject("session_token", session_token); + modelAndView.addObject("rolename_para", rolename_para); + modelAndView.addObject("loginIp_para", loginIp_para); + return modelAndView; + } + + + + + + /** + * 在提现限额开启情况下,修改可提现流水限制 + */ + @RequestMapping(value = action + "resetWithdraw.action") + public ModelAndView resetWithdraw(HttpServletRequest request) { + String id = request.getParameter("id"); + String session_token = request.getParameter("session_token"); + // 可提现额度 + String money_withdraw = request.getParameter("money_withdraw"); + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("redirect:/" + action + "list.action"); + + try { + + if (StringUtils.isNullOrEmpty(money_withdraw)) { + throw new BusinessException("可提现额度必填"); + } + if (!StringUtils.isDouble(money_withdraw)) { + throw new BusinessException("可提现额度输入错误,请输入浮点数"); + } + if (Double.valueOf(money_withdraw).doubleValue() <= 0) { + throw new BusinessException("可提现额度不能小于等于0"); + } + + // 可提现额度 + double money_withdraw_double = Double.valueOf(money_withdraw).doubleValue(); + + Object object = this.session.get("session_token"); + this.session.remove("session_token"); + if (null == object || StringUtils.isNullOrEmpty(session_token) || !session_token.equals((String) object)) { + throw new BusinessException("请稍后再试"); + } + + synchronized (obj) { + + this.adminUserService.saveResetWithdraw(id, money_withdraw_double, this.getUsername_login(), this.getIp()); + + } + + ThreadUtils.sleep(300); + + } catch (BusinessException e) { + modelAndView.addObject("error", e.getMessage()); + return modelAndView; + } catch (Throwable t) { + logger.error("update error ", t); + modelAndView.addObject("error", "程序错误"); + return modelAndView; + } + + modelAndView.addObject("message", "操作成功"); + return modelAndView; + } + + /** + * 重置登录密码 + */ + @RequestMapping(value = action + "resetpsw.action") + public ModelAndView resetpsw(HttpServletRequest request) { + String message = ""; + String error = ""; + try { + + String id = request.getParameter("id"); + String google_auth_code = request.getParameter("google_auth_code"); + String login_safeword = request.getParameter("login_safeword"); + String email_code = request.getParameter("email_code"); + + SecUser sec = this.secUserService.findUserByLoginName(this.getUsername_login()); + + checkGoogleAuthCode(sec, google_auth_code); + checkLoginSafeword(sec, this.getUsername_login(), login_safeword); + + String password = request.getParameter("password").replace(" ", ""); + Party party = this.partyService.cachePartyBy(id, true); + this.secUserService.updatePassword(party.getUsername(), password); + message = "操作成功"; + + project.log.Log log = new project.log.Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(this.getUsername_login()); + + log.setLog("管理员手动修改登录密码,验证码:[" + email_code + "]" + ",ip:[" + this.getIp(getRequest()) + "]"); + logService.saveSync(log); + + } catch (BusinessException e) { + error = e.getMessage(); + } catch (Exception e) { + logger.error(" error ", e); + error = "程序错误"; + } + + ModelAndView model = new ModelAndView(); + model.addObject("message", message); + model.addObject("error", error); + model.setViewName("redirect:/" + "normal/adminUserAction!" + "list.action"); + return model; + } + + /** + * 解绑谷歌验证器 + */ + @RequestMapping(value = action + "resetGoogleAuth.action") + public ModelAndView resetGoogleAuth(HttpServletRequest request) { + String message = ""; + String error = ""; + try { + + String google_auth_code = request.getParameter("google_auth_code"); + String login_safeword = request.getParameter("login_safeword"); + String id = request.getParameter("id"); + + SecUser sec = this.secUserService.findUserByLoginName(this.getUsername_login()); + checkGoogleAuthCode(sec, google_auth_code); + checkLoginSafeword(sec, this.getUsername_login(), login_safeword); + Party party = this.partyService.cachePartyBy(id, true); + SecUser sec_user = this.secUserService.findUserByPartyId(party.getId()); + sec_user.setGoogle_auth_bind(false); + sec_user.setGoogle_auth_secret(""); + this.secUserService.update(sec_user); + message = "操作成功"; + + project.log.Log log = new project.log.Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(this.getUsername_login()); + log.setLog("管理员手动解绑用户谷歌验证器,ip:[" + this.getIp(getRequest()) + "]"); + this.logService.saveSync(log); + + } catch (BusinessException e) { + error = e.getMessage(); + } catch (Exception e) { + logger.error(" error ", e); + error = "程序错误"; + } + ModelAndView model = new ModelAndView(); + model.addObject("message", message); + model.addObject("error", error); + model.setViewName("redirect:/" + "normal/adminUserAction!" + "list.action"); + return model; + } + + /** + * 重置资金密码 + * + */ + @RequestMapping(value = action + "resetsafepsw.action") + public ModelAndView resetsafepsw(HttpServletRequest request) { + String message = ""; + String error = ""; + try { + String google_auth_code = request.getParameter("google_auth_code"); + String login_safeword = request.getParameter("login_safeword"); + String safeword = request.getParameter("safeword"); + String id = request.getParameter("id"); + if (!StringUtils.isNullOrEmpty(safeword)) { + SecUser sec = this.secUserService.findUserByLoginName(this.getUsername_login()); + checkGoogleAuthCode(sec, google_auth_code); + checkLoginSafeword(sec,this.getUsername_login(), login_safeword); + + safeword = safeword.replace(" ", ""); + Party party = this.partyService.cachePartyBy(id,false); + this.partyService.updateSafeword(party, safeword); + message = "操作成功"; + + if(!"root".equals(this.getUsername_login())) { + project.log.Log log = new project.log.Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(this.getUsername_login()); + + log.setLog("管理员手动修改资金密码,ip:["+this.getIp(getRequest())+"]"); + + logService.saveSync(log); + } + } + } catch (BusinessException e) { + error = e.getMessage(); + } catch (Exception e) { + logger.error(" error ", e); + error = "程序错误"; + } + ModelAndView model = new ModelAndView(); + model.addObject("message", message); + model.addObject("error", error); + model.setViewName("redirect:/" + "normal/adminUserAction!" + "list.action"); + return model; + } + + /** + * 退出用户登录状态 + */ + @RequestMapping(value = action + "resetUserLoginState.action") + public ModelAndView resetUserLoginState(HttpServletRequest request) { + ModelAndView model = new ModelAndView(); + String message = ""; + String error = ""; + try { + + String google_auth_code = request.getParameter("google_auth_code"); + String login_safeword = request.getParameter("login_safeword"); + String id = request.getParameter("id"); + + SecUser sec = this.secUserService.findUserByLoginName(this.getUsername_login()); + checkGoogleAuthCode(sec, google_auth_code); + checkLoginSafeword(sec, this.getUsername_login(), login_safeword); + Party party = this.partyService.cachePartyBy(id, true); + + Token token = this.tokenService.find(party.getId().toString()); + if (token != null) { + tokenService.delete(token.getToken()); + + message = "操作成功"; + project.log.Log log = new project.log.Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(this.getUsername_login()); + log.setLog("管理员手动退出用户登录状态,ip:[" + this.getIp(getRequest()) + "]"); + this.logService.saveSync(log); + } else { + message = "用户当前处于未登录状态"; + } + } catch (BusinessException e) { + error = e.getMessage(); + } catch (Exception e) { + logger.error(" error ", e); + error = "程序错误"; + } + model.addObject("message", message); + model.addObject("error", error); + model.setViewName("redirect:/" + "normal/adminUserAction!" + "list.action"); + return model; + } + + /** + * 是否当前 + */ + private static boolean isNow(Date date) { + // 当前时间 + Date now = new Date(); + SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd"); + // 获取今天的日期 + String nowDay = sf.format(now); + String day = sf.format(date); + return day.equals(nowDay); + } + + private String verificationReset(String money_revise, String reset_type, String coin_type, String login_safeword) { + + if (StringUtils.isNullOrEmpty(money_revise)) { + throw new BusinessException("账变金额必填"); + } + if (!StringUtils.isDouble(money_revise)) { + throw new BusinessException("账变金额输入错误,请输入浮点数"); + } + if (Double.valueOf(money_revise).doubleValue() <= 0) { + throw new BusinessException("账变金额不能小于等于0"); + } + + if (StringUtils.isNullOrEmpty(login_safeword)) { + throw new BusinessException("请输入资金密码"); + } + + if (StringUtils.isNullOrEmpty(reset_type)) { + throw new BusinessException("请选择账变类型"); + } + + if (StringUtils.isNullOrEmpty(coin_type)) { + throw new BusinessException("请选择账变币种"); + } + + return null; + } + + /** + * 验证谷歌验证码 + */ + protected void checkGoogleAuthCode(SecUser secUser, String code) { + if (!secUser.isGoogle_auth_bind()) { + throw new BusinessException("请先绑定谷歌验证器"); + } + boolean checkCode = googleAuthService.checkCode(secUser.getGoogle_auth_secret(), code); + if (!checkCode) { + throw new BusinessException("谷歌验证码错误"); + } + } + + /** + * 验证登录人资金密码 + */ + protected void checkLoginSafeword(SecUser secUser, String operatorUsername, String loginSafeword) { + String sysSafeword = secUser.getSafeword(); + String safeword_md5 = passwordEncoder.encodePassword(loginSafeword, operatorUsername); + if (!safeword_md5.equals(sysSafeword)) { + throw new BusinessException("登录人资金密码错误"); + } + } + +} diff --git a/admin/src/main/java/project/web/admin/controller/vo/FileUploadParamsVo.java b/admin/src/main/java/project/web/admin/controller/vo/FileUploadParamsVo.java new file mode 100755 index 0000000..75e8424 --- /dev/null +++ b/admin/src/main/java/project/web/admin/controller/vo/FileUploadParamsVo.java @@ -0,0 +1,22 @@ +package project.web.admin.controller.vo; + +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import java.io.Serializable; + +/** + * 文件上传参数 + * + * @Author: shy + * @Description: + * @Date: create in 2022/10/21 10:34 + */ +@Data +public class FileUploadParamsVo implements Serializable { + protected static final long serialVersionUID = 1L; + + private MultipartFile file; + + private String moduleName; +} diff --git a/admin/src/main/java/project/web/admin/filter/AllRequestFilter.java b/admin/src/main/java/project/web/admin/filter/AllRequestFilter.java new file mode 100755 index 0000000..b0166f7 --- /dev/null +++ b/admin/src/main/java/project/web/admin/filter/AllRequestFilter.java @@ -0,0 +1,255 @@ +package project.web.admin.filter; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.Enumeration; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import cn.hutool.core.util.StrUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.AntPathMatcher; +import org.springframework.web.context.ContextLoader; +import org.springframework.web.context.WebApplicationContext; + +import kernel.util.DateUtils; +import kernel.util.StringUtils; +import kernel.web.PageActionSupport; +import project.syspara.Syspara; +import project.syspara.SysparaService; +import security.SecUser; +import security.SecurityAppUserHolder; +import security.SecurityContext; +import security.internal.SecUserService; + +public class AllRequestFilter extends PageActionSupport implements Filter { + + private Logger logger = LoggerFactory.getLogger(AllRequestFilter.class); + + private Pattern scriptPattern = Pattern.compile("<.*script.*>"); + + /** + * url 白名单 + */ + private List urls = new ArrayList(); + + /** + * 操作不打日志url + */ + private List opNoLogUrls = new ArrayList(); + + private AntPathMatcher antPathMatcher = new AntPathMatcher(); + + @Override + public void destroy() { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) + throws IOException, ServletException { +// urls.add("/systemGoods/**"); +// urls.add("/normal/uploadimg!execute.action"); +// urls.add("/druid"); + + ServletRequest oldRequest = request; + ServletResponse oldResponse = response; + HttpServletRequest httpServletRequest = (HttpServletRequest)request; + String servletPath = httpServletRequest.getServletPath(); + // 白名单直接过滤,非action请求直接过滤 +// if (urls.contains(servletPath) || !".action".equals(servletPath.substring(servletPath.length()-7))) { +// filterChain.doFilter(oldRequest, oldResponse); +// return; +// } + for (String oneUrlPattern : urls) { + if (antPathMatcher.match(oneUrlPattern, servletPath)) { + filterChain.doFilter(oldRequest, oldResponse); + return; + } + } + if (!".action".equals(servletPath.substring(servletPath.length() - 7))) { + filterChain.doFilter(oldRequest, oldResponse); + return; + } + + WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); + SysparaService sysparaService =(SysparaService) wac.getBean("sysparaService"); + SecUserService secUserService =(SecUserService) wac.getBean("secUserService"); + Syspara syspara = sysparaService.find("filter_ip"); + + String usernameLogin = getUsername_login(httpServletRequest); + if(StringUtils.isEmptyString(usernameLogin)) {//未登录时不操作 + filterChain.doFilter(oldRequest, oldResponse); + return; + } + SecUser secUser = secUserService.findUserByLoginName(usernameLogin); + if(!StringUtils.isEmptyString(secUser.getPartyId())) {//代理商不验证 + filterChain.doFilter(oldRequest, oldResponse); + return; + } + + + if(syspara != null && !StringUtils.isEmptyString(syspara.getValue())) { + checkIP(syspara,request); + } + + if(checkOperaIp(httpServletRequest,response,secUser)) { + if (opNoLogUrls.contains(httpServletRequest.getServletPath())) {//不记录日志直接返回 + return ; + } + RequestDispatcher requestDispatcher = request.getRequestDispatcher("/include/google_auth_code.jsp"); + request.setAttribute("check_opera_ip", "ture"); + request.setAttribute("username", getUsername_login(httpServletRequest)); + requestDispatcher.forward(request, response); + + return; + } + + if (checkParameter(httpServletRequest)) { + return; + } + + filterChain.doFilter(oldRequest, oldResponse); + } + + /** + * 请求参数中包含"script"的过滤 + */ + private boolean checkParameter(HttpServletRequest request) { + + Enumeration enu = request.getParameterNames(); + while (enu.hasMoreElements()) { + String paraName = (String) enu.nextElement(); + String value = request.getParameter(paraName).toLowerCase(); + if (StrUtil.isBlank(value)) { + continue; + } + + Matcher matcher = scriptPattern.matcher(value); + if (matcher.find()) { + System.out.println("请求参数中包含script的过滤,参数:" + request.getParameter(paraName) + "请求地址:" + request.getServletPath()); + return true; + } + } + + Enumeration heads = request.getHeaderNames(); + while (heads.hasMoreElements()) { + String headName = String.valueOf(heads.nextElement()); + String value = request.getHeader(headName).toLowerCase(); + if (value.indexOf(" + * 亚马逊s3 OSS 文件存储服务 + *

+ * + * @author shy + * @since 2022-10-17 + */ +@Slf4j +@Service +public class AwsS3OSSFileService { + + @Value("${oss.aws.s3.bucketName}") + private String bucketName; + @Value("${images.dir}") + private String tempFilePath; + + /** + * 获取操作客户端 + * + * @return + */ + private S3Client getS3Client() { + ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create(); + Region region = Region.US_EAST_1; + S3Client s3 = S3Client.builder() + .region(region) + .credentialsProvider(credentialsProvider) + .build(); + return s3; + } + + /** + * 创建存储桶 + * + * @param bucketName + */ + public void createBucket(String bucketName) { + log.info("AwsS3OSSFileService createBucket bucketName:{}", bucketName); + try { + S3Client s3Client = getS3Client(); + S3Waiter s3Waiter = s3Client.waiter(); + CreateBucketRequest bucketRequest = CreateBucketRequest.builder() + .bucket(bucketName) + .build(); + + s3Client.createBucket(bucketRequest); + HeadBucketRequest bucketRequestWait = HeadBucketRequest.builder() + .bucket(bucketName) + .build(); + + WaiterResponse r = s3Waiter.waitUntilBucketExists(bucketRequestWait); + log.info("AwsS3OSSFileService createBucket result :{}", JSONObject.toJSONString(r)); + } catch (S3Exception e) { + log.error("AwsS3OSSFileService createBucket Exception", e.getMessage(), e.awsErrorDetails().errorMessage(), e); + } + } + + public static String policyText = "{ \n" + + " \"Version\": \"2012-10-17\",\n" + + " \"Statement\": [\n" + + " {\n" + + " \"Effect\": \"Allow\",\n" + + " \"Action\": \"s3:*\",\n" + + " \"Principal\": \"*\",\n" + + " \"Resource\": [\n" + + " \"arn:aws:s3:::%s/*\"\n" + + " ]\n" + + " }\n" + + " ]\n" + + "}"; + + /** + * 设置存储桶策略 + * + * @param bucketName + */ + public void setPolicy(String bucketName) { + log.info("AwsS3OSSFileService setPolicy bucketName:{},policyText:{}", bucketName, policyText); + try { + S3Client s3Client = getS3Client(); + PutBucketPolicyRequest policyReq = PutBucketPolicyRequest.builder() + .bucket(bucketName) + .policy(String.format(policyText, bucketName)) + .build(); + PutBucketPolicyResponse r = s3Client.putBucketPolicy(policyReq); + log.info("AwsS3OSSFileService setPolicy result :{}", r.toString()); + log.info("AwsS3OSSFileService setPolicy result :{}", JSONObject.toJSONString(r)); + } catch (S3Exception e) { + log.error("AwsS3OSSFileService setPolicy Exception", e.getMessage(), e.awsErrorDetails().errorMessage(), e); + } + } + + /** + * 获取文件访问链接 + * + * @param bucketName + * @param keyName + */ + public void getURL(String bucketName, String keyName) { + log.info("AwsS3OSSFileService getURL bucketName:{},keyName:{}", bucketName, keyName); + + try { + S3Client s3Client = getS3Client(); + GetUrlRequest request = GetUrlRequest.builder() + .bucket(bucketName) + .key(keyName) + .build(); + URL url = s3Client.utilities().getUrl(request); + log.info("The URL for " + keyName + " is " + url); + } catch (S3Exception e) { + log.error("AwsS3OSSFileService getURL Exception", e.getMessage(), e.awsErrorDetails().errorMessage(), e); + } + } + + /** + * 上传本地文件 + * + * @return + */ + public String putS3Object(String moduleName, MultipartFile file) { + String fileType = FileNameUtils.getExtension(file.getOriginalFilename()); + String id = UUID.randomUUID().toString(); + String path = moduleName + "/" + LocalDate.now() + "/" + id + "." + fileType; + + log.info("AwsS3OSSFileService putS3Object bucketName:{},objectKey:{},objectPath:{}", bucketName, path, file.getName()); + try { + Map metadata = new HashMap<>(); + metadata.put("x-amz-meta-myVal", "test"); + PutObjectRequest putOb = PutObjectRequest.builder() + .bucket(bucketName) + .key(path) + .metadata(metadata) + .build(); + S3Client s3Client = getS3Client(); + s3Client.putObject(putOb, RequestBody.fromInputStream(file.getInputStream(), file.getSize())); + return path; + } catch (S3Exception e) { + log.error("AwsS3OSSFileService putS3Object S3Exception", e.getMessage(), e.awsErrorDetails().errorMessage(), e); + throw new BusinessException("文件上传失败"); + } catch (IOException e) { + log.error("AwsS3OSSFileService putS3Object IOException", e.getMessage(), e); + throw new BusinessException("文件上传失败"); + } + } + + /** + * 上传本地文件 + * + * @return + */ + public String putS3Object(String moduleName, MultipartFile file, Float quality) { + String fileType = FileNameUtils.getExtension(file.getOriginalFilename()); + String id = UUID.randomUUID().toString(); + String path = moduleName + "/" + LocalDate.now() + "/" + id + "." + fileType; + String thumbnailPath = moduleName + "/" + LocalDate.now() + "/" + id + "_thumbnail." + fileType; + + log.info("AwsS3OSSFileService putS3Object bucketName:{},objectKey:{},objectPath:{}", bucketName, path, file.getName()); + try { + ByteArrayOutputStream bs = cloneInputStream(file.getInputStream()); + + InputStream orgIS = new ByteArrayInputStream(bs.toByteArray()); + + Map metadata = new HashMap<>(); + metadata.put("x-amz-meta-myVal", "test"); + PutObjectRequest putOb = PutObjectRequest.builder() + .bucket(bucketName) + .key(path) + .metadata(metadata) + .build(); + S3Client s3Client = getS3Client(); + s3Client.putObject(putOb, RequestBody.fromInputStream(orgIS, file.getSize())); + + InputStream thumbnailIS = new ByteArrayInputStream(bs.toByteArray()); + + File tempFile = new File(tempFilePath + "/temp-img/"); + if (!tempFile.exists()) { + tempFile.mkdirs(); + } + Thumbnails.of(thumbnailIS).scale(1D).outputQuality(quality).toFile(tempFilePath + "/temp-img/" + id + "_thumbnail." + fileType); + + PutObjectRequest putThumbnailOb = PutObjectRequest.builder() + .bucket(bucketName) + .key(thumbnailPath) + .metadata(metadata) + .build(); + File thumbnailFile = new File(tempFilePath + "/temp-img/" + id + "_thumbnail." + fileType); + s3Client.putObject(putThumbnailOb, RequestBody.fromInputStream(Files.newInputStream(thumbnailFile.toPath()), thumbnailFile.length())); + return path; + } catch (S3Exception e) { + log.error("AwsS3OSSFileService putS3Object S3Exception", e.getMessage(), e.awsErrorDetails().errorMessage(), e); + throw new BusinessException("文件上传失败"); + } catch (IOException e) { + log.error("AwsS3OSSFileService putS3Object IOException", e.getMessage(), e); + throw new BusinessException("文件上传失败"); + } + } + + private static ByteArrayOutputStream cloneInputStream(InputStream input) { + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len; + while ((len = input.read(buffer)) > -1) { + baos.write(buffer, 0, len); + } + baos.flush(); + return baos; + } catch (IOException e) { + log.error("cloneInputStream IOException", e.getMessage(), e); + } + return null; + } + + + /** + * 判断文件是否为图片 + * + * @param fileName + * @return + */ + public boolean isImageFile(String fileName) { + List imgTypes = Arrays.asList("jpg", "jpeg", "png", "gif", "bmp"); + if (Strings.isNullOrEmpty(fileName)) { + return false; + } + String fileType = FileNameUtils.getExtension(fileName); + return imgTypes.contains(fileType.toLowerCase()); + } +} diff --git a/admin/src/main/java/project/web/admin/impl/email/AdminEmailCodeServiceImpl.java b/admin/src/main/java/project/web/admin/impl/email/AdminEmailCodeServiceImpl.java new file mode 100755 index 0000000..3a383ac --- /dev/null +++ b/admin/src/main/java/project/web/admin/impl/email/AdminEmailCodeServiceImpl.java @@ -0,0 +1,138 @@ +package project.web.admin.impl.email; + +import java.text.MessageFormat; +import java.util.Date; + +import kernel.exception.BusinessException; +import kernel.util.DateUtils; +import project.Constants; +import project.log.Log; +import project.log.LogService; +import project.syspara.SysparaService; +import project.user.googleauth.GoogleAuthService; +import project.web.admin.service.email.AdminEmailCodeService; +import security.SecUser; +import security.internal.SecUserService; + +public class AdminEmailCodeServiceImpl implements AdminEmailCodeService { + + private SecUserService secUserService; + protected LogService logService; +// protected IdentifyingCodeService identifyingCodeService; +// protected IdentifyingCodeTimeWindowService identifyingCodeTimeWindowService; + private SysparaService sysparaService; + private GoogleAuthService googleAuthService; +// private Map cacheDate = new ConcurrentHashMap(); + /** + * 发送验证码 + * @param ip + * @param operatorUsername 操作人 + * @param context 操作内容 + */ + public void sendCode(String ip,String operatorUsername,String context,boolean isSuper) { +//// if(cacheDate.get(context)!=null&&DateUtils.addMinute(cacheDate.get(context), 1).after(new Date())) { +//// throw new BusinessException("验证码已经发送,请于"+DateUtils.calcTimeBetweenInSecond(new Date(), DateUtils.addMinute(cacheDate.get(context), 1))+"秒后重新发送"); +//// } +// String value = null; +// if(isSuper) { +// value = sysparaService.find("admin_verify_email").getValue(); +// }else { +// value = secUserService.findUserByLoginName(operatorUsername).getEmail(); +// } +// if(StringUtils.isEmptyString(value)) { +// throw new BusinessException("管理员尚未配置邮箱"); +// } +// if(!RegexUtil.isEmail(value)) { +// throw new BusinessException("管理员邮箱格式错误"); +// } +// identifyingCodeService.send(value, ip); +// SecUser sec = this.secUserService.findUserByLoginName(operatorUsername); +// saveLog(sec,operatorUsername,String.format("ip:{%s},操作:{%s},邮箱:{%s},发送验证码", ip,context,value)); +//// cacheDate.put(context, new Date()); + } + + public void saveLog(SecUser secUser, String operator,String context) { + Log log = new Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setOperator(operator); + log.setUsername(secUser.getUsername()); + log.setPartyId(secUser.getPartyId()); + log.setLog(context); + log.setCreateTime(new Date()); + logService.saveSync(log); + } + + public void updateCheckCode(String ip, String operatorUsername, String code, String uri) { + SecUser user = secUserService.findUserByLoginName(operatorUsername); + checkEmailCode(user.getEmail(),code); + String context = MessageFormat.format("user:{0},opera time:{1},opera ip:{2},request uri:{3}," + + "last login ip:{4},last login time:{5},验证码:["+code+"]", + new Object[]{user.getUsername(),DateUtils.dateToStr(new Date(), DateUtils.DF_yyyyMMddHHmmss),ip,uri, + user.getLogin_ip(),DateUtils.dateToStr(user.getLast_loginTime(), DateUtils.DF_yyyyMMddHHmmss)}); + user.setLogin_ip(ip); + user.setLast_loginTime(new Date()); + secUserService.update(user);//ip切换相当于重新登录 + this.saveLog(user, operatorUsername, context); + } + public void updateCheckGoogleAuthCode(String ip, String operatorUsername, String googleAuthCode, String uri) { + SecUser user = secUserService.findUserByLoginName(operatorUsername); + checkGoogleAuthCode(user,googleAuthCode); + String context = MessageFormat.format("user:{0},opera time:{1},opera ip:{2},request uri:{3}," + + "last login ip:{4},last login time:{5}", + new Object[]{user.getUsername(),DateUtils.dateToStr(new Date(), DateUtils.DF_yyyyMMddHHmmss),ip,uri, + user.getLogin_ip(),DateUtils.dateToStr(user.getLast_loginTime(), DateUtils.DF_yyyyMMddHHmmss)}); + user.setLogin_ip(ip); + user.setLast_loginTime(new Date()); + secUserService.update(user);//ip切换相当于重新登录 + this.saveLog(user, operatorUsername, context); + } + + /** + * 验证谷歌验证码 + * @param code + */ + private void checkGoogleAuthCode(SecUser secUser,String code) { + if(!secUser.isGoogle_auth_bind()) { + throw new BusinessException("请先绑定谷歌验证器"); + } + boolean checkCode = googleAuthService.checkCode(secUser.getGoogle_auth_secret(), code); + if(!checkCode) { + throw new BusinessException("谷歌验证码错误"); + } + } + /** + * 验证管理员唯一邮箱 + * @param code + */ + private void checkEmailCode(String email,String code) { +// String authCode = identifyingCodeTimeWindowService.getAuthCode(email); +// if(StringUtils.isEmptyString(authCode)||!authCode.equals(code)) { +// throw new BusinessException("验证码错误"); +// } +// identifyingCodeTimeWindowService.delAuthCode(email); + } + public void setSecUserService(SecUserService secUserService) { + this.secUserService = secUserService; + } + + public void setLogService(LogService logService) { + this.logService = logService; + } + +// public void setIdentifyingCodeService(IdentifyingCodeService identifyingCodeService) { +// this.identifyingCodeService = identifyingCodeService; +// } +// +// public void setIdentifyingCodeTimeWindowService(IdentifyingCodeTimeWindowService identifyingCodeTimeWindowService) { +// this.identifyingCodeTimeWindowService = identifyingCodeTimeWindowService; +// } + + public void setSysparaService(SysparaService sysparaService) { + this.sysparaService = sysparaService; + } + + public void setGoogleAuthService(GoogleAuthService googleAuthService) { + this.googleAuthService = googleAuthService; + } + +} diff --git a/admin/src/main/java/project/web/admin/impl/report/AdminAgentAllStatisticsServiceImpl.java b/admin/src/main/java/project/web/admin/impl/report/AdminAgentAllStatisticsServiceImpl.java new file mode 100755 index 0000000..dce0992 --- /dev/null +++ b/admin/src/main/java/project/web/admin/impl/report/AdminAgentAllStatisticsServiceImpl.java @@ -0,0 +1,740 @@ +package project.web.admin.impl.report; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; +import org.springframework.orm.hibernate5.support.HibernateDaoSupport; + + +import kernel.util.Arith; +import kernel.util.DateUtils; +import kernel.util.PoiUtil; +import kernel.util.StringUtils; +import kernel.web.Page; +import kernel.web.PagedQueryDao; +import project.Constants; +import project.party.PartyService; +import project.party.model.Party; +import project.party.model.UserRecom; +import project.party.recom.UserRecomService; +import project.user.UserData; +import project.user.UserDataService; +import project.web.admin.service.report.AdminAgentAllStatisticsService; + +public class AdminAgentAllStatisticsServiceImpl extends HibernateDaoSupport implements AdminAgentAllStatisticsService { + private PagedQueryDao pagedQueryDao; + private UserRecomService userRecomService; + private UserDataService userDataService; + private PartyService partyService; + private NamedParameterJdbcOperations namedParameterJdbcTemplate; + + private List agentPartys() { + List cacheAll = this.partyService.getAll(); + List result = new ArrayList(); + for (Party party : cacheAll) { + if (Constants.SECURITY_ROLE_AGENT.equals(party.getRolename())) { + result.add(party); + } + } + return result; + } + + private Page getPageList(int pageNo, int pageSize, String startTime, String endTime, String loginPartyId, + String roleName, String usernameOrUid, String targetPartyId, String allPartyId) { + Map parameters = new HashMap(); + StringBuffer queryString = new StringBuffer(); + queryString.append( + "SELECT party.ROLENAME AS rolename,party.USERNAME AS username,party.USERCODE AS UID,party.UUID AS partyId ");// 用户 + queryString.append("FROM PAT_PARTY party "); + queryString.append("LEFT JOIN PAT_USER_RECOM ur ON party.UUID = ur.PARTY_ID ");// 推荐人 根目录判定 + queryString.append("WHERE 1=1 "); + queryString.append("AND party.ROLENAME IN('" + Constants.SECURITY_ROLE_AGENT + "','"+Constants.SECURITY_ROLE_AGENTLOW+"') "); + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return new Page(); + } + queryString.append(" and party.UUID in (:children) "); + parameters.put("children", children); + } + if (!StringUtils.isNullOrEmpty(targetPartyId)) { + List children = this.userRecomService.findRecomsToPartyId(targetPartyId); + if (children.size() == 0) { + return new Page(); + } + queryString.append(" and party.UUID in (:children) "); + parameters.put("children", children); + } + if (!StringUtils.isNullOrEmpty(allPartyId)) { + List children = this.userRecomService.findChildren(allPartyId); + if (children.size() == 0) { + return new Page(); + } + queryString.append(" and party.UUID in (:children) "); + parameters.put("children", children); + } + if (StringUtils.isNullOrEmpty(targetPartyId) && StringUtils.isNullOrEmpty(usernameOrUid) && StringUtils.isNullOrEmpty(allPartyId)) {// 目标partyId为空 + // ,username参数为空,的情况下,如果是视图,显示根目录 + queryString.append(" and ur.RECO_ID is NULL "); + } + if (!StringUtils.isNullOrEmpty(usernameOrUid)) { + queryString.append("AND (party.USERNAME like:username OR party.USERCODE like:username ) "); + parameters.put("username", "%" + usernameOrUid + "%"); + } + queryString.append("ORDER BY party.USERCODE ASC "); + Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); + return page; + } + + public Page pagedQuery(int pageNo, int pageSize, String startTime, String endTime, String loginPartyId, + String roleName, String usernameOrUid, String targetPartyId, String allPartyId) { + Page page = getPageList(pageNo, pageSize, startTime, endTime, loginPartyId, usernameOrUid, roleName, + targetPartyId, allPartyId);// 获取当前页的用户相关 + + /** + * 页面查询第一层partyId级 + */ + List list_partyId = new ArrayList(); + + for (int i = 0; i < page.getElements().size(); i++) { + Map map_party = (Map) page.getElements().get(i); + list_partyId.add(map_party.get("partyId").toString()); + } + /** + * + */ + + List> result = new ArrayList>(); + + for (int i = 0; i < list_partyId.size(); i++) { + int reco_agent = 0; + int all_agent = 0; + /** + * 所有子集 + */ + List children_all = this.userRecomService.findChildren(list_partyId.get(i)); + List recoms = userRecomService.findRecoms(list_partyId.get(i)); + /** + * 正式用户 团队 + */ + List children_member = new ArrayList<>(); + for (int j = 0; j < children_all.size(); j++) { + String partyId = children_all.get(j); + Party party = partyService.cachePartyBy(partyId,true); + if(null == party){ + logger.info("party 为null id为"+partyId); + } + if (Constants.SECURITY_ROLE_AGENT.equals(party.getRolename())||Constants.SECURITY_ROLE_AGENTLOW.equals(party.getRolename())) { + reco_agent++; + } else if (Constants.SECURITY_ROLE_MEMBER.equals(party.getRolename())) { + children_member.add(partyId); + } + + } + /** + * 正式用户 直推 + */ + List all_member = new ArrayList<>(); + for (int j = 0; j < recoms.size(); j++) { + String partyId = children_all.get(j); + Party party = partyService.cachePartyBy(partyId,true); + if(null == party){ + logger.info("party 为null id为"+partyId); + } + if (Constants.SECURITY_ROLE_AGENT.equals(party.getRolename())||Constants.SECURITY_ROLE_AGENTLOW.equals(party.getRolename())) { + all_agent++; + } else if (Constants.SECURITY_ROLE_MEMBER.equals(party.getRolename())) { + all_member.add(partyId); + } + + } + + Map item_result = this.sumUserData(children_member,startTime,endTime); + item_result.put("reco_agent", reco_agent); + item_result.put("all_agent", all_agent); + item_result.put("reco_member", children_member.size()); + item_result.put("all_member", all_member.size()); + item_result.put("partyId", list_partyId.get(i)); + + Party party = partyService.cachePartyBy(list_partyId.get(i),true); + + item_result.put("username", party.getUsername()); + item_result.put("UID", party.getUsercode()); + + result.add(item_result); + } + + + Page page_result = new Page();; + + page_result.setElements(result); + + compute(page_result.getElements());// 计算总收益 + return page_result; + } + private Map sumUserData(List children, String startTime, String endTime) { + if(CollectionUtils.isEmpty(children)) {//children数据为空时,数据填充,这里操作减少dubbo调用 + return sumData(new HashMap(), new ArrayList()); + } + Map item_result = new HashMap(); + List> datas = this.userDataService.cacheByPartyIds(children); + for (int i = 0; i < datas.size(); i++) { + Map data_all = datas.get(i); + if (data_all == null) { + continue; + } + List userdata= filterData(data_all,startTime,endTime); + item_result = sumData(item_result, userdata); + } + if(item_result.isEmpty()) {//item_result数据为空时,数据填充 + item_result = sumData(item_result, new ArrayList()); + } + return item_result; + + } + + + private Map sumData(Map item_result,List datas) { + + double recharge_dapp = 0; + double withdraw_dapp = 0; + double recharge = 0; + double recharge_usdt = 0; + double recharge_eth = 0; + double recharge_btc = 0; + double recharge_ht = 0; + double recharge_ltc = 0; + double withdraw = 0; + double withdraw_eth = 0; + double withdraw_btc = 0; + double recharge_withdrawal_fee = 0; + double gift_money = 0; + double balance_amount = 0; + double amount = 0; + double rechargeCommission = 0; + double withdrawCommission = 0; + double fee = 0; + double order_income = 0; + double finance_amount = 0; + double finance_income = 0; + double exchange_amount =0; + double exchange_fee = 0; + double exchange_income =0; + double coin_income =0; + double furtures_amount =0; + double furtures_fee=0; + double furtures_income=0; + double miner_income=0; + double miner_amount=0; + double third_recharge_amount=0; + double exchange_lever_amount = 0; + double exchange_lever_fee = 0; + double exchange_lever_order_income = 0; + + for(int i = 0 ;i< datas.size(); i++) { + UserData data = datas.get(i); + + // 充提 + recharge_dapp = Arith.add(data.getRecharge_dapp(), recharge_dapp); + withdraw_dapp = Arith.add(data.getWithdraw_dapp(), withdraw_dapp); + recharge = Arith.add(data.getRecharge(), recharge); + recharge_usdt = Arith.add(data.getRecharge_usdt(), recharge_usdt); + recharge_eth = Arith.add(data.getRecharge_eth(), recharge_eth); + recharge_btc = Arith.add(data.getRecharge_btc(), recharge_btc); + recharge_ht = Arith.add(data.getRecharge_ht(), recharge_ht); + recharge_ltc = Arith.add(data.getRecharge_ltc(), recharge_ltc); + withdraw = Arith.add(data.getWithdraw(), withdraw); + withdraw_eth = Arith.add(data.getWithdraw_eth(), withdraw_eth); + withdraw_btc = Arith.add(data.getWithdraw_btc(), withdraw_btc); + recharge_withdrawal_fee = Arith.add(data.getRecharge_withdrawal_fee(), recharge_withdrawal_fee); + gift_money = Arith.add(data.getGift_money(), gift_money); + balance_amount = Arith.add( Arith.sub(data.getRecharge(), data.getWithdraw()), balance_amount); + // 永续 + amount = Arith.add( data.getAmount(), amount); + + rechargeCommission = Arith.add( data.getRechargeCommission(), rechargeCommission); + withdrawCommission = Arith.add( data.getWithdrawCommission(), withdrawCommission); + fee = Arith.add(data.getFee(), fee); + order_income = Arith.add( data.getOrder_income(), order_income); + // 理财 + finance_amount = Arith.add( data.getFinance_amount(), finance_amount); + finance_income = Arith.add( data.getFinance_income(), finance_income); + // 币币 + exchange_amount = Arith.add( data.getExchange_amount(), exchange_amount); + exchange_fee = Arith.add( data.getExchange_fee(), exchange_fee); +// exchange_income = Arith.add(data.getExchange_income(), exchange_income); + exchange_income = 0; + coin_income = Arith.add(data.getCoin_income(), coin_income); + // 交割 + furtures_amount = Arith.add( data.getFurtures_amount(), furtures_amount); + furtures_fee = Arith.add( data.getFurtures_fee(), furtures_fee); + furtures_income = Arith.add(data.getFurtures_income(), furtures_income); + //矿机 + miner_income = Arith.add(data.getMiner_income(), miner_income); + miner_amount = Arith.add(data.getMiner_amount(), miner_amount); + //三方充值货币金额 + third_recharge_amount = Arith.add(data.getThird_recharge_amount(), third_recharge_amount); + //币币杠杆 + exchange_lever_amount = Arith.add(data.getExchange_lever_amount(), exchange_lever_amount); + exchange_lever_fee = Arith.add(data.getExchange_lever_fee(), exchange_lever_fee); + exchange_lever_order_income = Arith.add(data.getExchange_lever_order_income(), exchange_lever_order_income); + } + + if(item_result != null && item_result.size() != 0) { + // 充提 + item_result.put("rechargeCommission", Arith.add(Double.valueOf( item_result.get("rechargeCommission").toString()), rechargeCommission)); + item_result.put("withdrawCommission", Arith.add(Double.valueOf( item_result.get("withdrawCommission").toString()), withdrawCommission)); + item_result.put("withdraw_dapp",Arith.add(Double.valueOf( item_result.get("withdraw_dapp").toString()) ,withdraw_dapp)); + item_result.put("recharge", Arith.add(Double.valueOf( item_result.get("recharge").toString()), recharge)); + item_result.put("recharge_usdt", Arith.add(Double.valueOf( item_result.get("recharge_usdt").toString()), recharge_usdt)); + item_result.put("recharge_eth", Arith.add(Double.valueOf( item_result.get("recharge_eth").toString()), recharge_eth)); + item_result.put("recharge_btc", Arith.add(Double.valueOf( item_result.get("recharge_btc").toString()), recharge_btc)); + item_result.put("recharge_ht", Arith.add(Double.valueOf( item_result.get("recharge_ht").toString()), recharge_ht)); + item_result.put("recharge_ltc", Arith.add(Double.valueOf( item_result.get("recharge_ltc").toString()), recharge_ltc)); + item_result.put("withdraw",Arith.add(Double.valueOf( item_result.get("withdraw").toString()) ,withdraw)); + item_result.put("withdraw_eth",Arith.add(Double.valueOf( item_result.get("withdraw_eth").toString()) ,withdraw_eth)); + item_result.put("withdraw_btc",Arith.add(Double.valueOf( item_result.get("withdraw_btc").toString()) ,withdraw_btc)); + item_result.put("recharge_withdrawal_fee", Arith.add(Double.valueOf( item_result.get("recharge_withdrawal_fee").toString()),recharge_withdrawal_fee)); + item_result.put("gift_money", Arith.add(Double.valueOf( item_result.get("gift_money").toString()),gift_money)); + item_result.put("balance_amount", Arith.add(Double.valueOf( item_result.get("balance_amount").toString()),balance_amount)); + // 永续 + item_result.put("amount", Arith.add(Double.valueOf( item_result.get("amount").toString()),amount)); + item_result.put("fee", Arith.add(Double.valueOf( item_result.get("fee").toString()),fee)); + item_result.put("order_income", Arith.add(Double.valueOf( item_result.get("order_income").toString()),order_income)); + // 理财 + item_result.put("finance_amount", Arith.add(Double.valueOf( item_result.get("finance_amount").toString()),finance_amount)); + item_result.put("finance_income", Arith.add(Double.valueOf( item_result.get("finance_income").toString()),finance_income)); + // 币币 + item_result.put("exchange_amount", Arith.add(Double.valueOf( item_result.get("exchange_amount").toString()),exchange_amount)); + item_result.put("exchange_fee", Arith.add(Double.valueOf( item_result.get("exchange_fee").toString()),exchange_fee)); +// item_result.put("exchange_income", Arith.add(Double.valueOf( item_result.get("exchange_income").toString()),exchange_income)); + item_result.put("exchange_income", 0); + item_result.put("coin_income", Arith.add(Double.valueOf( item_result.get("coin_income").toString()),coin_income)); + // 交割 + item_result.put("furtures_amount", Arith.add(Double.valueOf( item_result.get("furtures_amount").toString()),furtures_amount)); + item_result.put("furtures_fee", Arith.add(Double.valueOf( item_result.get("furtures_fee").toString()),furtures_fee)); + item_result.put("furtures_income", Arith.add(Double.valueOf( item_result.get("furtures_income").toString()),furtures_income)); + //矿机 + item_result.put("miner_income", Arith.add(Double.valueOf( item_result.get("miner_income").toString()),miner_income)); + item_result.put("miner_amount", Arith.add(Double.valueOf( item_result.get("miner_amount").toString()),miner_amount)); + //三方充值货币金额 + item_result.put("third_recharge_amount", Arith.add(Double.valueOf( item_result.get("third_recharge_amount").toString()),third_recharge_amount)); + //币币杠杆 + item_result.put("exchange_lever_amount", Arith.add(Double.valueOf( item_result.get("exchange_lever_amount").toString()),exchange_lever_amount)); + item_result.put("exchange_lever_fee", Arith.add(Double.valueOf( item_result.get("exchange_lever_fee").toString()),exchange_lever_fee)); + item_result.put("exchange_lever_order_income", Arith.add(Double.valueOf( item_result.get("exchange_lever_order_income").toString()),exchange_lever_order_income)); + + }else { + // 充提 + item_result.put("recharge_dapp", recharge_dapp); + item_result.put("withdraw_dapp", withdraw_dapp); + item_result.put("recharge", recharge); + item_result.put("recharge_usdt", recharge_usdt); + item_result.put("recharge_eth", recharge_eth); + item_result.put("recharge_btc", recharge_btc); + item_result.put("recharge_ht", recharge_ht); + item_result.put("recharge_ltc", recharge_ltc); + item_result.put("withdraw", withdraw); + item_result.put("withdraw_eth", withdraw_eth); + item_result.put("withdraw_btc", withdraw_btc); + item_result.put("recharge_withdrawal_fee", recharge_withdrawal_fee); + item_result.put("gift_money", gift_money); + item_result.put("balance_amount", balance_amount); + // 永续 + item_result.put("amount", amount); + item_result.put("rechargeCommission", rechargeCommission); + item_result.put("withdrawCommission", withdrawCommission); + item_result.put("fee", fee); + item_result.put("order_income", order_income); + // 理财 + item_result.put("finance_amount", finance_amount); + item_result.put("finance_income", finance_income); + // 币币 + item_result.put("exchange_amount", exchange_amount); + item_result.put("exchange_fee", exchange_fee); + item_result.put("exchange_income", 0); + item_result.put("coin_income", coin_income); + // 交割 + item_result.put("furtures_amount", furtures_amount); + item_result.put("furtures_fee", furtures_fee); + item_result.put("furtures_income", furtures_income); + // 矿机 + item_result.put("miner_income", miner_income); + item_result.put("miner_amount", miner_amount); + //三方充值货币金额 + item_result.put("third_recharge_amount", third_recharge_amount); + //币币杠杆 + item_result.put("exchange_lever_amount", exchange_lever_amount); + item_result.put("exchange_lever_fee", exchange_lever_fee); + item_result.put("exchange_lever_order_income", exchange_lever_order_income); + } + + + + return item_result; + + } + + private List filterData(Map datas, String startTime, String endTime) { +// Map> result = new HashMap<>(); + + List result = new ArrayList(); + + for(Entry valueEntry:datas.entrySet()) { + UserData userdata = valueEntry.getValue(); + Date time = userdata.getCreateTime(); + if (!StringUtils.isNullOrEmpty(startTime)) { + Date startDate = DateUtils.toDate(startTime, DateUtils.DF_yyyyMMdd); + int intervalDays = DateUtils.getIntervalDaysByTwoDate(startDate, time);// 开始-数据时间 + if (intervalDays > 0) // 开始>数据时间 ,则过滤 + continue; + } + if (!StringUtils.isNullOrEmpty(endTime)) { + Date endDate = DateUtils.toDate(endTime, DateUtils.DF_yyyyMMdd); + int intervalDays = DateUtils.getIntervalDaysByTwoDate(endDate, time);// 结束-数据时间 + if (intervalDays < 0) // 结束<数据时间 + continue; + } + result.add(userdata); + + } + + return result; + } + + private void compute(List> datas) { + if (CollectionUtils.isEmpty(datas)) + return; + Double totle_income = 0d; + Double totle_fee = 0d; + Double business_profit = 0d;//交易盈亏 + Double fin_miner_amount = 0d;//理财 矿机 交易额 + Double fin_miner_income = 0d;//理财 矿机 收益 + for (Map data : datas) { + totle_income = 0d; + totle_fee = 0d; + business_profit = 0d; + fin_miner_amount = 0d; + fin_miner_income = 0d; +// if(null!=data.get("rolename")) { +// data.put("rolename", Constants.ROLE_MAP.get(data.get("rolename").toString())); +// } + if (null != data.get("order_income")) + data.put("order_income", Arith.sub(0, new Double(data.get("order_income").toString())));// 订单收益负数 + if (null != data.get("finance_income")) + data.put("finance_income", Arith.sub(0, new Double(data.get("finance_income").toString())));// 理财收益负数 + if (null != data.get("exchange_income")) +// data.put("exchange_income", Arith.sub(0, new Double(data.get("exchange_income").toString())));// 币币收益负数 + data.put("exchange_income", 0);// 币币收益负数 + + if (null != data.get("furtures_income")) + data.put("furtures_income", Arith.sub(0, new Double(data.get("furtures_income").toString())));// 交割收益负数 + if (null != data.get("miner_income")) + data.put("miner_income", Arith.sub(0, new Double(data.get("miner_income").toString())));// 矿机收益负数 + if (null != data.get("exchange_lever_order_income")) + data.put("exchange_lever_order_income", Arith.sub(0, new Double(data.get("exchange_lever_order_income").toString())));// 币币收益负数 + + if (!dataExistNull(data)) + continue; + totle_income = Arith.add(totle_income, new Double(data.get("recharge_withdrawal_fee").toString())); + totle_income = Arith.add(totle_income, new Double(data.get("order_income").toString())); + totle_income = Arith.add(totle_income, new Double(data.get("fee").toString())); + totle_income = Arith.add(totle_income, new Double(data.get("finance_income").toString())); + totle_income = Arith.add(totle_income, new Double(data.get("exchange_fee").toString())); +// totle_income = Arith.add(totle_income, new Double(data.get("exchange_income").toString())); + totle_income = Arith.add(totle_income, new Double(0)); + totle_income = Arith.add(totle_income, new Double(data.get("furtures_fee").toString())); + totle_income = Arith.add(totle_income, new Double(data.get("furtures_income").toString())); + totle_income = Arith.add(totle_income, new Double(data.get("miner_income").toString())); + totle_income = Arith.add(totle_income, new Double(data.get("exchange_lever_order_income").toString())); + data.put("totle_income", totle_income); + + totle_fee = Arith.add(totle_fee, new Double(data.get("recharge_withdrawal_fee").toString())); + totle_fee = Arith.add(totle_fee, new Double(data.get("fee").toString())); + totle_fee = Arith.add(totle_fee, new Double(data.get("exchange_fee").toString())); + totle_fee = Arith.add(totle_fee, new Double(data.get("furtures_fee").toString())); + totle_fee = Arith.add(totle_fee, new Double(data.get("exchange_lever_fee").toString())); + data.put("totle_fee", totle_fee); + + business_profit = Arith.add(business_profit, new Double(data.get("order_income").toString())); + business_profit = Arith.add(business_profit, new Double(data.get("exchange_income").toString())); + business_profit = Arith.add(business_profit, new Double(data.get("furtures_income").toString())); + business_profit = Arith.add(business_profit, new Double(data.get("exchange_lever_order_income").toString())); + data.put("business_profit", business_profit); + + fin_miner_amount = Arith.add(fin_miner_amount, new Double(data.get("finance_amount").toString())); + fin_miner_amount = Arith.add(fin_miner_amount, new Double(data.get("miner_amount").toString())); + data.put("fin_miner_amount", fin_miner_amount); + + fin_miner_income = Arith.add(fin_miner_income, new Double(data.get("finance_income").toString())); + fin_miner_income = Arith.add(fin_miner_income, new Double(data.get("miner_income").toString())); + data.put("fin_miner_income", fin_miner_income); + } + } + + /** + * 统计的数据存在空时,不统计总额 + * + * @param data + * @return + */ + private boolean dataExistNull(Map data) { + if (null == data.get("recharge_withdrawal_fee")) + return false; + if (null == data.get("order_income")) + return false; + if (null == data.get("fee")) + return false; + if (null == data.get("finance_income")) + return false; + if (null == data.get("exchange_fee")) + return false; + if (null == data.get("exchange_income")) + return false; + if (null == data.get("furtures_fee")) + return false; + if (null == data.get("furtures_income")) + return false; + return true; + } + + public String loadExportData(HttpServletResponse response, int pageSize, String startTime, String endTime, + String loginPartyId, String usernameOrUid, String roleName, String targetPartyId) throws IOException { + // 生成数据信息 + int sheetNum = 0; + // 生成表头 + Integer i = 0; + // 在内存中保持100行,超过100行将被刷新到磁盘 + // HSSFWorkbook wb = new HSSFWorkbook();//excel文件,一个excel文件包含多个表 + // HSSFSheet sheet = wb.createSheet();//表,一个表包含多个行 + SXSSFWorkbook wb = new SXSSFWorkbook(100); + Sheet sheet = wb.createSheet(); // 表,一个表包含多个行 + Drawing patriarch = sheet.createDrawingPatriarch(); + CellStyle style = wb.createCellStyle(); + Row row = null;// 行,一行包括多个单元格 + Cell cell = null;// 单元格 + Page page = null; + int pageNo = 1; + + Map headMap = new LinkedHashMap(); +// 用户 +// 充提 +// 永续合约 +// 理财 +// 币币 +// 交割合约 +// 收益 + headMap.put("用户", new Integer[] { 0, 4 }); + headMap.put("充提", new Integer[] { 0, 9 }); + headMap.put("永续合约", new Integer[] { 0, 2 }); + headMap.put("理财收益", new Integer[] { 1, 1 }); + headMap.put("币币", new Integer[] { 0, 2 }); + headMap.put("交割合约", new Integer[] { 0, 2 }); + headMap.put("收益", new Integer[] { 1, 1 }); + + createMergedHead(wb, sheet, headMap, i++); + + while (true) { + page = this.pagedQuery(pageNo, pageSize, startTime, endTime, loginPartyId, usernameOrUid, roleName, + targetPartyId,null); + if (sheetNum == 0 && (page == null || page.getElements() == null || page.getElements().size() == 0)) { + return "无导出数据!"; + } + String[] headTitles = { "用户名", "UID", "网络用户输", "网络代理数", "USDT充值", "ETH充值", "BTC充值","充值换算USDT总计", "赠送", "提现", "手续费", "充提差额(USDT)","充提总差额(USDT计价)", "手续费", "订单收益", "收益", + "手续费", "收益", "手续费", "订单收益" }; + + if (i == 1) + PoiUtil.createHead(response, headTitles, wb, sheet, style, row, cell, i, + "代理商充提报表_" + DateUtils.format(new Date(), DateUtils.DEFAULT_DATE_FORMAT), + "代理商充提报表_" + DateUtils.format(new Date(), DateUtils.DEFAULT_DATE_FORMAT) + ".xlsx"); + List list = this.dataBachHandel(page.getElements()); + + if (page.getElements() != null) { + + i = PoiUtil.createCell(list, patriarch, wb, sheet, row, cell, style, i); + list.clear(); + + if (page.getElements().size() < pageSize || i >= 59999) { + PoiUtil.out(wb, response); + break; + } + sheetNum++; + pageNo++; + } else { + break; + } + } + return ""; + } + + private void createMergedHead(SXSSFWorkbook wb, Sheet sheet, Map headMap, int i) { + Font font = wb.createFont(); + font.setFontHeightInPoints((short) 10); + font.setFontName("Courier New"); + CellStyle style = wb.createCellStyle(); + style.setFont(font); + style.setWrapText(true); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Row row = sheet.createRow(i); + int rowPosition = 0;// 行坐标 + int cellPosition = 0;// 列坐标 + for (Entry entry : headMap.entrySet()) { + Cell cell = row.createCell(cellPosition); + cell.setCellStyle(style); + cell.setCellValue(entry.getKey()); + CellRangeAddress region = new CellRangeAddress(rowPosition, rowPosition + entry.getValue()[0], cellPosition, + cellPosition + entry.getValue()[1] - 1); + sheet.addMergedRegion(region); + cellPosition += entry.getValue()[1]; + } + } + + public List dataBachHandel(List> list) { + List result = new ArrayList(); + int i = 0; + for (Map data : list) { + i = 0; + Object[] objs = new Object[21]; + objs[i++] = data.get("username"); + objs[i++] = data.get("UID"); + objs[i++] = data.get("reco_member"); + +// objs[i++] = data.get("rolename") != null +// && Constants.SECURITY_ROLE_AGENT.equals(data.get("rolename").toString()) ? "代理商" +// : Constants.SECURITY_ROLE_MEMBER.equals(data.get("rolename").toString()) ? "正式用户" : ""; + objs[i++] = data.get("reco_agent"); +// objs[i++] = data.get("money"); + + + objs[i++] = data.get("recharge_usdt"); + objs[i++] = data.get("recharge_eth"); + objs[i++] = data.get("recharge_btc"); + objs[i++] = data.get("recharge"); + objs[i++] = data.get("gift_money"); + objs[i++] = data.get("withdraw"); + objs[i++] = data.get("recharge_withdrawal_fee"); + double recharge_usdt = 0D; + double withdraw = 0D; + if (null != data.get("recharge_usdt")) { + recharge_usdt = Double.parseDouble(data.get("recharge_usdt").toString()); + } + if (null != data.get("withdraw")) { + withdraw = Double.parseDouble(data.get("withdraw").toString()); + } + + objs[i++] = Arith.sub(recharge_usdt, withdraw); + objs[i++] = data.get("balance_amount"); + +// objs[i++] = data.get("amount"); + objs[i++] = data.get("fee"); + objs[i++] = data.get("order_income"); + +// objs[i++] = data.get("finance_amount"); + objs[i++] = data.get("finance_income"); + +// objs[i++] = data.get("exchange_amount"); + objs[i++] = data.get("exchange_fee"); + objs[i++] = data.get("exchange_income"); +// objs[i++] = data.get("coin_income"); + +// objs[i++] = data.get("furtures_amount"); + objs[i++] = data.get("furtures_fee"); + objs[i++] = data.get("furtures_income"); + + objs[i++] = data.get("totle_income"); + result.add(objs); + } + return result; + } + /** + * 获取用户推荐数网络 列表(第i层用户数) + * @return + */ + public List getRecoNumNetList(String partyId) { + Map recoNumNet = getRecoNumNet(partyId); + List keys = new ArrayList(recoNumNet.keySet()); + Collections.sort(keys); + List list = new LinkedList(); + for (int i = 0; i < keys.size(); i++) { + list.add(recoNumNet.get(keys.get(i))); + } + return list; + } + /** + * 获取用户推荐数网络 + * @return key:网络层级,value:用户数 + */ + public Map getRecoNumNet(String partyId){ + List all = this.userRecomService.findChildren(partyId); + int allSize = all.size(); + int sum = 0; + int level = 1; + Map result = new HashMap(); + findRecomsNet(partyId,level,result,sum,allSize); + + return result; + } + public void findRecomsNet(String partyId,int level,Map result,int sum,int allSize) { + if(sum>=allSize) return; + List users = this.userRecomService.findRecoms(partyId); + if(CollectionUtils.isEmpty(users)) { + return; + } + int num = 0; + for(UserRecom user:users) { + findRecomsNet(user.getPartyId().toString(),level+1,result,sum,allSize); + Party party = partyService.cachePartyBy(user.getPartyId(),true); + if (!Constants.SECURITY_ROLE_MEMBER.equals(party.getRolename())) {//非正式用户不统计 + continue; + } + num++; + } + sum+=users.size();//总数 + if(num>0) { + result.put(level, result.get(level)==null?num:result.get(level)+num); + } + } + public void setPagedQueryDao(PagedQueryDao pagedQueryDao) { + this.pagedQueryDao = pagedQueryDao; + } + + public void setUserRecomService(UserRecomService userRecomService) { + this.userRecomService = userRecomService; + } + + public void setUserDataService(UserDataService userDataService) { + this.userDataService = userDataService; + } + + public void setPartyService(PartyService partyService) { + this.partyService = partyService; + } + + public void setNamedParameterJdbcTemplate(NamedParameterJdbcOperations namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + +} diff --git a/admin/src/main/java/project/web/admin/impl/report/AdminAllStatisticsServiceImpl.java b/admin/src/main/java/project/web/admin/impl/report/AdminAllStatisticsServiceImpl.java new file mode 100755 index 0000000..d700bee --- /dev/null +++ b/admin/src/main/java/project/web/admin/impl/report/AdminAllStatisticsServiceImpl.java @@ -0,0 +1,425 @@ +package project.web.admin.impl.report; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; +import org.springframework.orm.hibernate5.support.HibernateDaoSupport; + + +import kernel.util.Arith; +import kernel.util.DateUtils; +import kernel.util.PoiUtil; +import kernel.util.StringUtils; +import kernel.web.Page; +import kernel.web.PagedQueryDao; +import project.Constants; +import project.party.recom.UserRecomService; +import project.web.admin.service.report.AdminAllStatisticsService; + +public class AdminAllStatisticsServiceImpl extends HibernateDaoSupport implements AdminAllStatisticsService { + + private PagedQueryDao pagedQueryDao; + +// private JdbcTemplate jdbcTemplate; + private UserRecomService userRecomService; + private NamedParameterJdbcOperations namedParameterJdbcTemplate; + + public Page pagedQuery(int pageNo, int pageSize,String startTime,String endTime,String loginPartyId) { + Map parameters = new HashMap(); + StringBuffer queryString = new StringBuffer("SELECT "); + queryString.append("DATE_FORMAT(ud.CREATE_TIME,\"%Y-%m-%d\") AS date, ");//日期 + queryString.append("SUM(ud.RECHARGE_DAPP) AS recharge_dapp,SUM(ud.RECHARGE) AS recharge,SUM(ud.RECHARGE_USDT) AS recharge_usdt,SUM(ud.RECHARGE_ETH) AS recharge_eth,SUM(ud.RECHARGE_BTC) AS recharge_btc,IFNULL(SUM(ud.RECHARGE_HT),0) AS recharge_ht,IFNULL(SUM(ud.RECHARGE_LTC),0) AS recharge_ltc," + + "SUM(ud.WITHDRAW_DAPP) AS withdraw_dapp,SUM(ud.WITHDRAW) AS withdraw,IFNULL(SUM(ud.WITHDRAW_ETH),0) AS withdraw_eth,IFNULL(SUM(ud.WITHDRAW_BTC),0) AS withdraw_btc," + + "SUM(ud.RECHARGE_WITHDRAWAL_FEE) AS recharge_withdrawal_fee,SUM(ud.GIFT_MONEY) AS gift_money,SUM(ud.RECHARGE)-SUM(ud.WITHDRAW) AS balance_amount, ");//充提 + queryString.append("SUM(ud.AMOUNT) AS amount,SUM(ud.FEE) AS fee,SUM(ud.ORDER_INCOME) AS order_income, IFNULL(SUM(ud.RECHARGE_COMMISSION),0) AS rechargeCommission, IFNULL(SUM(ud.WITHDRAW_COMMISSION),0) AS withdrawCommission,");//永续 + queryString.append("SUM(ud.FINANCE_AMOUNT) AS finance_amount,SUM(ud.FINANCE_INCOME) AS finance_income, ");//理财 + queryString.append("SUM(ud.EXCHANGE_AMOUNT) AS exchange_amount,SUM(ud.EXCHANGE_FEE) AS exchange_fee,SUM(ud.EXCHANGE_INCOME) AS exchange_income,SUM(ud.COIN_INCOME) AS coin_income, ");//币币 + queryString.append("SUM(ud.FURTURES_AMOUNT) AS furtures_amount,SUM(ud.FURTURES_FEE) AS furtures_fee,SUM(ud.FURTURES_INCOME) AS furtures_income, ");//交割 + queryString.append("IFNULL(SUM(ud.MINER_AMOUNT),0) AS miner_amount,IFNULL(SUM(ud.MINER_INCOME),0) AS miner_income, ");//矿机 + queryString.append("IFNULL(SUM(ud.THIRD_RECHARGE_AMOUNT),0) AS third_recharge_amount, ");//三方充值 + queryString.append("IFNULL(SUM(ud.EXCHANGE_LEVER_AMOUNT),0) AS exchange_lever_amount,IFNULL(SUM(ud.EXCHANGE_LEVER_FEE),0) AS exchange_lever_fee,IFNULL(SUM(ud.EXCHANGE_LEVER_ORDER_INCOME),0) AS exchange_lever_order_income, ");//币币杠杆 + queryString.append(" SUM(ud.REBATE_1) + SUM(ud.REBATE_2) rebateLump, IFNULL(SUM(ud.TRANSLATE),0) AS translate, IFNULL(SUM(ud.SELLER_TOTAL_SALES),0) AS sellerTotalSales, IFNULL(SUM(ud.SELLER_COMMISSION),0) AS sellerCommission "); + queryString.append("FROM T_USERDATA ud "); +// queryString.append("LEFT JOIN PAT_PARTY party ON ud.PARTY_ID = party.UUID "); + + queryString.append("WHERE 1=1 "); +// queryString.append("AND ud.ROLENAME ='"+Constants.SECURITY_ROLE_MEMBER+"' "); +// queryString.append("AND party.ROLENAME ='"+Constants.SECURITY_ROLE_MEMBER+"' "); + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return new Page(); + } + queryString.append(" and ud.PARTY_ID in (:children) "); + parameters.put("children", children); + } + if (!StringUtils.isNullOrEmpty(startTime)) { + queryString.append("AND DATE(ud.CREATE_TIME) >= DATE(:startTime) "); + parameters.put("startTime",DateUtils.toDate(startTime)); + } + if (!StringUtils.isNullOrEmpty(endTime)) { + queryString.append("AND DATE(ud.CREATE_TIME) <= DATE(:endTime) "); + parameters.put("endTime", DateUtils.toDate(endTime)); + } + queryString.append("GROUP BY DATE(ud.CREATE_TIME) "); + queryString.append("ORDER BY DATE(ud.CREATE_TIME) DESC "); + Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); +// page.setElements(format(page.getElements())); + compute(page.getElements(),false); + return page; + } + + public Map daySumData(String loginPartyId,String day){ + Map parameters = new HashMap(); + StringBuffer queryString = new StringBuffer("SELECT "); +// queryString.append("DATE_FORMAT(ud.CREATE_TIME,\"%Y-%m-%d\") AS date, ");//日期 + queryString.append("IFNULL(SUM(ud.RECHARGE),0) AS recharge,IFNULL(SUM(ud.RECHARGE_USDT),0) AS recharge_usdt,IFNULL(SUM(ud.RECHARGE_ETH),0) AS recharge_eth,IFNULL(SUM(ud.RECHARGE_BTC),0) AS recharge_btc,IFNULL(SUM(ud.RECHARGE_HT),0) AS recharge_ht,IFNULL(SUM(ud.RECHARGE_LTC),0) AS recharge_ltc," + + "IFNULL(SUM(ud.WITHDRAW),0) AS withdraw,IFNULL(SUM(ud.RECHARGE_WITHDRAWAL_FEE),0) AS recharge_withdrawal_fee,IFNULL(SUM(ud.RECHARGE_USDT)-SUM(ud.WITHDRAW),0) AS balance_amount, ");//充提 + queryString.append("IFNULL(SUM(ud.FEE),0) AS fee,IFNULL(SUM(ud.ORDER_INCOME),0) AS order_income, ");//永续 + queryString.append("IFNULL(SUM(ud.FINANCE_AMOUNT),0) AS finance_amount,IFNULL(SUM(ud.FINANCE_INCOME),0) AS finance_income, ");//理财 + queryString.append("IFNULL(SUM(ud.EXCHANGE_FEE),0) AS exchange_fee,IFNULL(SUM(ud.EXCHANGE_INCOME),0) AS exchange_income, ");//币币 + queryString.append("IFNULL(SUM(ud.FURTURES_FEE),0) AS furtures_fee,IFNULL(SUM(ud.FURTURES_INCOME),0) AS furtures_income, ");//交割 + queryString.append("IFNULL(SUM(ud.MINER_AMOUNT),0) AS miner_amount,IFNULL(SUM(ud.MINER_INCOME),0) AS miner_income, ");//矿机 + queryString.append("IFNULL(SUM(ud.THIRD_RECHARGE_AMOUNT),0) AS third_recharge_amount, ");//三方充值 + queryString.append("IFNULL(SUM(ud.EXCHANGE_LEVER_AMOUNT),0) AS exchange_lever_amount,IFNULL(SUM(ud.EXCHANGE_LEVER_FEE),0) AS exchange_lever_fee,IFNULL(SUM(ud.EXCHANGE_LEVER_ORDER_INCOME),0) AS exchange_lever_order_income ");//币币杠杆 + queryString.append("FROM T_USERDATA ud "); + queryString.append("WHERE 1=1 "); + queryString.append("AND ud.ROLENAME ='"+Constants.SECURITY_ROLE_MEMBER+"' "); + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return new HashMap(); + } + queryString.append(" and ud.PARTY_ID in (:children) "); + parameters.put("children", children); + } + if (!StringUtils.isNullOrEmpty(day)) { + queryString.append("AND DATE(ud.CREATE_TIME) = DATE(:day) "); + parameters.put("day", DateUtils.toDate(day)); + } + List> queryForList = this.namedParameterJdbcTemplate.queryForList( queryString.toString(), parameters); + compute(queryForList,false); + return queryForList.get(0); + } + /** + * 计算 统计时 + * @param datas + * @param isSum + */ + private void compute(List> datas,boolean isSum) { + if(CollectionUtils.isEmpty(datas)) return; + Double totle_income=0d; + Double totle_fee = 0d; + Double business_profit = 0d;//交易盈亏 + Double fin_miner_amount = 0d;//理财 矿机 交易额 + Double fin_miner_income = 0d;//理财 矿机 收益 + for(Map data:datas) { + + totle_income=0d; + totle_fee = 0d; + business_profit = 0d; + fin_miner_amount = 0d; + fin_miner_income = 0d; + if(null != data.get("order_income")) + data.put("order_income", Arith.sub(0, new Double(data.get("order_income").toString())));//订单收益负数 + if(null != data.get("finance_income")) + data.put("finance_income", Arith.sub(0, new Double(data.get("finance_income").toString())));//理财收益负数 + if(null != data.get("exchange_income")) +// data.put("exchange_income", Arith.sub(0, new Double(data.get("exchange_income").toString())));//币币收益负数 + data.put("exchange_income",0);//币币收益负数 + if(null != data.get("furtures_income")) + data.put("furtures_income", Arith.sub(0, new Double(data.get("furtures_income").toString())));//交割收益负数 + if (null != data.get("miner_income")) + data.put("miner_income", Arith.sub(0, new Double(data.get("miner_income").toString())));// 矿机收益负数 + if (null != data.get("exchange_lever_order_income")) + data.put("exchange_lever_order_income", Arith.sub(0, new Double(data.get("exchange_lever_order_income").toString())));// 币币收益负数 + + if(!dataExistNull(data)) continue; + totle_income = Arith.add(totle_income,new Double(data.get("recharge_withdrawal_fee").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("order_income").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("fee").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("finance_income").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("exchange_fee").toString())); + totle_income = Arith.add(totle_income,new Double(0)); +// totle_income = Arith.add(totle_income,new Double(data.get("exchange_income").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("furtures_fee").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("furtures_income").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("miner_income").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("exchange_lever_order_income").toString())); + data.put("totle_income", totle_income); + + totle_fee = Arith.add(totle_fee, new Double(data.get("recharge_withdrawal_fee").toString())); + totle_fee = Arith.add(totle_fee, new Double(data.get("fee").toString())); + totle_fee = Arith.add(totle_fee, new Double(data.get("exchange_fee").toString())); + totle_fee = Arith.add(totle_fee, new Double(data.get("furtures_fee").toString())); + totle_fee = Arith.add(totle_fee, new Double(data.get("exchange_lever_fee").toString())); + data.put("totle_fee", totle_fee); + + business_profit = Arith.add(business_profit, new Double(data.get("order_income").toString())); + business_profit = Arith.add(business_profit, new Double(data.get("exchange_income").toString())); + business_profit = Arith.add(business_profit, new Double(data.get("furtures_income").toString())); + business_profit = Arith.add(business_profit, new Double(data.get("exchange_lever_order_income").toString())); + data.put("business_profit", business_profit); + + fin_miner_amount = Arith.add(fin_miner_amount, new Double(data.get("finance_amount").toString())); + fin_miner_amount = Arith.add(fin_miner_amount, new Double(data.get("miner_amount").toString())); + data.put("fin_miner_amount", fin_miner_amount); + + fin_miner_income = Arith.add(fin_miner_income, new Double(data.get("finance_income").toString())); + fin_miner_income = Arith.add(fin_miner_income, new Double(data.get("miner_income").toString())); + data.put("fin_miner_income", fin_miner_income); + + data.put("recharge_btc", new BigDecimal(data.get("recharge_btc").toString()).setScale(8, RoundingMode.FLOOR).toPlainString());//订单收益负数 +// data.put("recharge_usdt", new BigDecimal(data.get("recharge_usdt").toString()).setScale(4, RoundingMode.FLOOR).toPlainString()); + } + } + + /** + * 统计的数据存在空时,不统计总额 + * @param data + * @return + */ + private boolean dataExistNull(Map data) { + if(null == data.get("recharge_withdrawal_fee")) return false; + if(null == data.get("order_income")) return false; + if(null == data.get("fee")) return false; + if(null == data.get("finance_income")) return false; + if(null == data.get("exchange_fee")) return false; + if(null == data.get("exchange_income")) return false; + if(null == data.get("furtures_fee")) return false; + if(null == data.get("furtures_income")) return false; + return true; + } + + public Map sumDatas(String startTime,String endTime,String loginPartyId){ + Map parameters = new HashMap(); + StringBuffer queryString = new StringBuffer("SELECT "); +// queryString.append("DATE_FORMAT(ud.CREATE_TIME,\"%Y-%m-%d\") AS date, ");//日期 + queryString.append("IFNULL(SUM(ud.RECHARGE_DAPP),0) AS recharge_dapp,IFNULL(SUM(ud.RECHARGE),0) AS recharge,IFNULL(SUM(ud.RECHARGE_USDT),0) AS recharge_usdt,IFNULL(SUM(ud.RECHARGE_ETH),0) AS recharge_eth,IFNULL(SUM(ud.RECHARGE_BTC),0) AS recharge_btc,IFNULL(SUM(ud.RECHARGE_HT),0) AS recharge_ht,IFNULL(SUM(ud.RECHARGE_LTC),0) AS recharge_ltc," + + "IFNULL(SUM(ud.WITHDRAW_DAPP),0) AS withdraw_dapp,IFNULL(SUM(ud.WITHDRAW),0) AS withdraw,IFNULL(SUM(ud.WITHDRAW_ETH),0) AS withdraw_eth,IFNULL(SUM(ud.WITHDRAW_BTC),0) AS withdraw_btc," + + "IFNULL(SUM(ud.RECHARGE_WITHDRAWAL_FEE),0) AS recharge_withdrawal_fee,IFNULL(SUM(ud.GIFT_MONEY),0) AS gift_money,IFNULL(SUM(ud.RECHARGE)-SUM(ud.WITHDRAW),0) AS balance_amount, IFNULL(SUM(ud.RECHARGE_COMMISSION),0) AS rechargeCommission, IFNULL(SUM(ud.WITHDRAW_COMMISSION),0) AS withdrawCommission," );//充提 + queryString.append("IFNULL(SUM(ud.AMOUNT),0) AS amount,IFNULL(SUM(ud.FEE),0) AS fee,IFNULL(SUM(ud.ORDER_INCOME),0) AS order_income, ");//永续 + queryString.append("IFNULL(SUM(ud.FINANCE_AMOUNT),0) AS finance_amount,IFNULL(SUM(ud.FINANCE_INCOME),0) AS finance_income, ");//理财 + queryString.append("IFNULL(SUM(ud.EXCHANGE_AMOUNT),0) AS exchange_amount,IFNULL(SUM(ud.EXCHANGE_FEE),0) AS exchange_fee,IFNULL(SUM(ud.EXCHANGE_INCOME),0) AS exchange_income,IFNULL(SUM(ud.COIN_INCOME),0) AS coin_income, ");//币币 + queryString.append("IFNULL(SUM(ud.FURTURES_AMOUNT),0) AS furtures_amount,IFNULL(SUM(ud.FURTURES_FEE),0) AS furtures_fee,IFNULL(SUM(ud.FURTURES_INCOME),0) AS furtures_income, ");//交割 + queryString.append("IFNULL(SUM(ud.MINER_AMOUNT),0) AS miner_amount,IFNULL(SUM(ud.MINER_INCOME),0) AS miner_income, ");//矿机 + queryString.append("IFNULL(SUM(ud.THIRD_RECHARGE_AMOUNT),0) AS third_recharge_amount, ");//三方充值 + queryString.append("IFNULL(SUM(ud.EXCHANGE_LEVER_AMOUNT),0) AS exchange_lever_amount,IFNULL(SUM(ud.EXCHANGE_LEVER_FEE),0) AS exchange_lever_fee,IFNULL(SUM(ud.EXCHANGE_LEVER_ORDER_INCOME),0) AS exchange_lever_order_income, ");//币币杠杆 + queryString.append("IFNULL(SUM(ud.REBATE_1) + SUM(ud.REBATE_2),0) rebateLump, IFNULL(SUM(ud.TRANSLATE),0) as translate, IFNULL(SUM(ud.SELLER_TOTAL_SALES),0) as sellerTotalSales ");// 用户佣金 + + queryString.append("FROM T_USERDATA ud "); +// queryString.append("LEFT JOIN PAT_PARTY party ON ud.PARTY_ID = party.UUID "); + queryString.append("WHERE 1=1 "); +// queryString.append("AND ud.ROLENAME ='"+Constants.SECURITY_ROLE_MEMBER+"' "); +// queryString.append("AND party.ROLENAME ='"+Constants.SECURITY_ROLE_MEMBER+"' "); + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return new HashMap(); + } + queryString.append(" and ud.PARTY_ID in (:children) "); + parameters.put("children", children); + } + if (!StringUtils.isNullOrEmpty(startTime)) { + queryString.append("AND DATE(ud.CREATE_TIME) >= DATE(:startTime) "); + parameters.put("startTime",DateUtils.toDate(startTime)); + } + if (!StringUtils.isNullOrEmpty(endTime)) { + queryString.append("AND DATE(ud.CREATE_TIME) <= DATE(:endTime) "); + parameters.put("endTime", DateUtils.toDate(endTime)); + } +// queryString.append("GROUP BY DATE(ud.CREATE_TIME) "); + queryString.append("ORDER BY DATE(ud.CREATE_TIME) DESC "); + List> queryForList = this.namedParameterJdbcTemplate.queryForList( queryString.toString(), parameters); + compute(queryForList,true); + return queryForList.get(0); + } + + + + public String loadExportData(HttpServletResponse response, int pageSize,String startTime,String endTime,String loginPartyId) throws IOException { + //生成数据信息 + int sheetNum = 0; + // 生成表头 + Integer i = 0; + // 在内存中保持100行,超过100行将被刷新到磁盘 + // HSSFWorkbook wb = new HSSFWorkbook();//excel文件,一个excel文件包含多个表 + // HSSFSheet sheet = wb.createSheet();//表,一个表包含多个行 + SXSSFWorkbook wb = new SXSSFWorkbook(100); + Sheet sheet = wb.createSheet(); // 表,一个表包含多个行 + Drawing patriarch = sheet.createDrawingPatriarch(); + CellStyle style = wb.createCellStyle(); + Row row = null;// 行,一行包括多个单元格 + Cell cell = null;// 单元格 + Page page = null; + int pageNo =1; + + Map headMap = new LinkedHashMap(); +// 日期 +// 充提统计 +// 永续订单统计 +// 币币交易统计 +// 收益 + headMap.put("日期", new Integer[] {1,1}); + headMap.put("充提", new Integer[] {0,9}); + headMap.put("永续合约", new Integer[] {0,2}); + headMap.put("理财收益", new Integer[] {1,1}); + headMap.put("币币", new Integer[] {0,2}); + headMap.put("交割合约", new Integer[] {0,2}); + headMap.put("收益", new Integer[] {1,1}); + + createMergedHead(wb, sheet,headMap,i++); + + while (true) { + page = this.pagedQuery(pageNo, pageSize, startTime, endTime,loginPartyId); + if (sheetNum == 0 && (page == null || page.getElements() == null || page.getElements().size() == 0)) { + return "无导出数据!"; + } + + + String[] headTitles = { "日期", + "USDT充值","ETH充值","BTC充值","充值总额(USDT计价)","赠送","提现","手续费","充提差额(USDT)","充提总差额(USDT计价)", + "手续费","订单收益", + "收益", + "手续费","收益", + "手续费","订单收益"}; + if (i == 1) + PoiUtil.createHead(response, headTitles, wb, sheet, style, row, cell, i, + "总收益统计_" + DateUtils.format(new Date(), DateUtils.DEFAULT_DATE_FORMAT), + "总收益统计_" + DateUtils.format(new Date(), DateUtils.DEFAULT_DATE_FORMAT) + ".xlsx"); + List list = this.dataBachHandel(page.getElements()); + + if (page.getElements() != null) { + + i = PoiUtil.createCell(list, patriarch, wb, sheet, row, cell, style, i); + list.clear(); + + if (page.getElements().size() < pageSize || i >= 59999) { + PoiUtil.out(wb, response); + break; + } + sheetNum++; + pageNo++; + } else { + break; + } + } + return ""; + } + + private void createMergedHead(SXSSFWorkbook wb,Sheet sheet,Map headMap,int i) { + Font font = wb.createFont(); + font.setFontHeightInPoints((short) 10); + font.setFontName("Courier New"); + CellStyle style = wb.createCellStyle(); + style.setFont(font); + style.setWrapText(true); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Row row = sheet.createRow(i); + int rowPosition = 0;//行坐标 + int cellPosition = 0;//列坐标 + for(Entry entry:headMap.entrySet()) { + Cell cell = row.createCell(cellPosition); + cell.setCellStyle(style); + cell.setCellValue(entry.getKey()); + CellRangeAddress region = new CellRangeAddress(rowPosition, rowPosition+entry.getValue()[0], cellPosition, cellPosition+entry.getValue()[1]-1); + sheet.addMergedRegion(region); + cellPosition+=entry.getValue()[1]; + } + } + + public List dataBachHandel(List> list){ + List result = new ArrayList(); + int i = 0; + for(Map data:list) { + i = 0; + Object[] objs = new Object[18]; + objs[i++] = data.get("date"); + + + objs[i++] = data.get("recharge_usdt"); + objs[i++] = data.get("recharge_eth"); + objs[i++] = data.get("recharge_btc"); + objs[i++] = data.get("recharge"); + objs[i++] = data.get("gift_money"); + objs[i++] = data.get("withdraw"); + objs[i++] = data.get("recharge_withdrawal_fee");//TODO + double recharge_usdt = 0D; + double withdraw = 0D; + if (null != data.get("recharge_usdt")) { + recharge_usdt = Double.parseDouble(data.get("recharge_usdt").toString()); + } + if (null != data.get("withdraw")) { + withdraw = Double.parseDouble(data.get("withdraw").toString()); + } + objs[i++] = Arith.sub(recharge_usdt, withdraw); + objs[i++] = data.get("balance_amount"); + +// objs[i++] = data.get("amount"); + objs[i++] = data.get("fee"); + objs[i++] = data.get("order_income"); + +// objs[i++] = data.get("finance_amount"); + objs[i++] = data.get("finance_income"); + +// objs[i++] = data.get("exchange_amount"); + objs[i++] = data.get("exchange_fee"); +// objs[i++] = data.get("exchange_income"); + objs[i++] = 0; + +// objs[i++] = data.get("furtures_amount"); + objs[i++] = data.get("furtures_fee"); + objs[i++] = data.get("furtures_income"); + + objs[i++] = data.get("totle_income"); + + result.add(objs); + } + return result; + } + + + public PagedQueryDao getPagedQueryDao() { + return pagedQueryDao; + } + + public void setPagedQueryDao(PagedQueryDao pagedQueryDao) { + this.pagedQueryDao = pagedQueryDao; + } + + public NamedParameterJdbcOperations getNamedParameterJdbcTemplate() { + return namedParameterJdbcTemplate; + } + + public void setNamedParameterJdbcTemplate(NamedParameterJdbcOperations namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + public void setUserRecomService(UserRecomService userRecomService) { + this.userRecomService = userRecomService; + } + + +} diff --git a/admin/src/main/java/project/web/admin/impl/report/AdminUserAllStatisticsServiceImpl.java b/admin/src/main/java/project/web/admin/impl/report/AdminUserAllStatisticsServiceImpl.java new file mode 100755 index 0000000..140b7e2 --- /dev/null +++ b/admin/src/main/java/project/web/admin/impl/report/AdminUserAllStatisticsServiceImpl.java @@ -0,0 +1,774 @@ +package project.web.admin.impl.report; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; +import java.util.Set; + +import javax.servlet.http.HttpServletResponse; + +import cn.hutool.core.collection.CollectionUtil; +import org.apache.commons.collections.CollectionUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; +import org.springframework.orm.hibernate5.support.HibernateDaoSupport; + +import kernel.exception.BusinessException; +import kernel.util.Arith; +import kernel.util.DateUtils; +import kernel.util.PoiUtil; +import kernel.util.StringUtils; +import kernel.web.Page; +import kernel.web.PagedQueryDao; +import project.Constants; +import project.data.DataService; +import project.party.recom.UserRecomService; +import project.syspara.SysparaService; +import project.wallet.AssetService; +import project.wallet.Wallet; +import project.wallet.WalletExtend; +import project.wallet.WalletService; +import project.web.admin.service.report.AdminUserAllStatisticsService; + +public class AdminUserAllStatisticsServiceImpl extends HibernateDaoSupport implements AdminUserAllStatisticsService { + + protected PagedQueryDao pagedQueryDao; + protected UserRecomService userRecomService; + protected WalletService walletService; +// protected FinanceOrderService financeOrderService; + protected SysparaService sysparaService; + protected DataService dataService; +// protected MinerOrderService minerOrderService; + protected AssetService assetService; + + private NamedParameterJdbcOperations namedParameterJdbcTemplate; + + private List rootAgentId() { + Map parameters = new HashMap(); + StringBuffer queryString = new StringBuffer(); + queryString.append( + "SELECT party.UUID AS partyId ");// 用户 + queryString.append("FROM PAT_PARTY party "); + queryString.append("LEFT JOIN PAT_USER_RECOM ur ON party.UUID = ur.PARTY_ID ");// 推荐人 根目录判定 + queryString.append("WHERE 1=1 "); + queryString.append("AND party.ROLENAME IN('" + Constants.SECURITY_ROLE_AGENT + "','"+Constants.SECURITY_ROLE_AGENTLOW +"') "); + queryString.append(" and ur.RECO_ID is NULL "); + Page page = this.pagedQueryDao.pagedQuerySQL(1, Integer.MAX_VALUE, queryString.toString(), parameters); + List rootIds = new ArrayList(); + for(Map data:(List>)page.getElements()) { + rootIds.add(data.get("partyId").toString()); + } + Set userIds = new HashSet(); + for(String partyId:rootIds) { + userIds.addAll(userRecomService.findChildren(partyId)); + } + return new ArrayList(userIds); + } + public Page pagedQueryNoAgentParent(int pageNo, int pageSize,String startTime,String endTime,String loginPartyId,String usernameOrUid,String roleName,String targetPartyId,boolean isAgentView,String sortColumn,String sortType) { + Map parameters = new HashMap(); + StringBuffer queryString = new StringBuffer(); + queryString.append("SELECT party.ROLENAME AS rolename,party.USERNAME AS username,party.USERCODE AS UID,IFNULL(uds.RECO_NUM,0) AS reco_num,party.UUID AS partyId,IFNULL(wallet.MONEY,0) AS money, ");//用户 + queryString.append("IFNULL(SUM(ud.RECHARGE),0) AS recharge,IFNULL(SUM(ud.RECHARGE_USDT),0) AS recharge_usdt,IFNULL(SUM(ud.RECHARGE_ETH),0) AS recharge_eth,IFNULL(SUM(ud.RECHARGE_BTC),0) AS recharge_btc,IFNULL(SUM(ud.RECHARGE_HT),0) AS recharge_ht,IFNULL(SUM(ud.RECHARGE_LTC),0) AS recharge_ltc," + + "IFNULL(SUM(ud.WITHDRAW),0) AS withdraw,IFNULL(SUM(ud.WITHDRAW_ETH),0) AS withdraw_eth,IFNULL(SUM(ud.WITHDRAW_BTC),0) AS withdraw_btc," + + "IFNULL(SUM(ud.RECHARGE_WITHDRAWAL_FEE),0) AS recharge_withdrawal_fee,IFNULL(SUM(ud.GIFT_MONEY),0) AS gift_money,IFNULL(SUM(ud.RECHARGE)-SUM(ud.WITHDRAW),0) AS balance_amount, ");//充提 + queryString.append("IFNULL(SUM(ud.AMOUNT),0) AS amount,IFNULL(SUM(ud.FEE),0) AS fee,IFNULL(SUM(ud.ORDER_INCOME),0) AS order_income, ");//永续 + queryString.append("IFNULL(SUM(ud.FINANCE_AMOUNT),0) AS finance_amount,IFNULL(SUM(ud.FINANCE_INCOME),0) AS finance_income, ");//理财 + queryString.append("IFNULL(SUM(ud.EXCHANGE_AMOUNT),0) AS exchange_amount,IFNULL(SUM(ud.EXCHANGE_FEE),0) AS exchange_fee,IFNULL(SUM(ud.EXCHANGE_INCOME),0) AS exchange_income,IFNULL(SUM(ud.COIN_INCOME),0) AS coin_income, ");//币币 + queryString.append("IFNULL(SUM(ud.FURTURES_AMOUNT),0) AS furtures_amount,IFNULL(SUM(ud.FURTURES_FEE),0) AS furtures_fee,IFNULL(SUM(ud.FURTURES_INCOME),0) AS furtures_income, ");//交割 + queryString.append("IFNULL(SUM(ud.MINER_AMOUNT),0) AS miner_amount,IFNULL(SUM(ud.MINER_INCOME),0) AS miner_income, ");//矿机 + queryString.append("IFNULL(SUM(ud.THIRD_RECHARGE_AMOUNT),0) AS third_recharge_amount, ");//三方充值 + queryString.append("IFNULL(SUM(ud.EXCHANGE_LEVER_AMOUNT),0) AS exchange_lever_amount,IFNULL(SUM(ud.EXCHANGE_LEVER_FEE),0) AS exchange_lever_fee,IFNULL(SUM(ud.EXCHANGE_LEVER_ORDER_INCOME),0) AS exchange_lever_order_income ");//币币杠杆 +// queryString.append("FROM T_USERDATA ud "); +// queryString.append("LEFT JOIN PAT_PARTY party ON ud.PARTY_ID = party.UUID "); + queryString.append("FROM PAT_PARTY party "); + queryString.append("LEFT JOIN T_USERDATA ud ON ud.PARTY_ID = party.UUID "); + if (!StringUtils.isNullOrEmpty(startTime)) { + queryString.append("AND DATE(ud.CREATE_TIME) >= DATE(:startTime) "); + parameters.put("startTime",DateUtils.toDate(startTime)); + } + if (!StringUtils.isNullOrEmpty(endTime)) { + queryString.append("AND DATE(ud.CREATE_TIME) <= DATE(:endTime) "); + parameters.put("endTime", DateUtils.toDate(endTime)); + } + queryString.append("LEFT JOIN T_USERDATASUM uds ON ud.PARTY_ID = uds.PARTY_ID ");//推荐总数 +// queryString.append("LEFT JOIN PAT_USER_RECOM ur ON ud.PARTY_ID = ur.PARTY_ID ");//推荐人 根目录判定 + queryString.append("LEFT JOIN T_WALLET wallet ON party.UUID = wallet.PARTY_ID ");// + queryString.append("WHERE 1=1 "); +// queryString.append("AND party.ROLENAME IN('"+Constants.SECURITY_ROLE_MEMBER+"','"+Constants.SECURITY_ROLE_AGENT+"')");//限定用户权限只能是用户或代理商 + queryString.append("AND party.ROLENAME IN('"+Constants.SECURITY_ROLE_MEMBER+"')");//限定用户权限只能是用户或代理商 + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return new Page(); + } + queryString.append(" and party.UUID in (:children) "); + parameters.put("children", children); + } + if (!StringUtils.isNullOrEmpty(targetPartyId)) { +// List children = this.userRecomService.findChildren_1_Level(targetPartyId); + List children = this.userRecomService.findChildren(targetPartyId); + if (children.size() == 0) { + return new Page(); + } + queryString.append(" and party.UUID in (:children) "); + parameters.put("children", children); + }else if(isAgentView){//目标partyId为空的情况下,如果是视图,显示根目录 +// queryString.append(" and ur.RECO_ID is NULL "); +// roleName = Constants.SECURITY_ROLE_AGENT;//改条件下只查代理商 + + roleName = ""; + queryString.append(" and party.ROLENAME in (:rolename_agent) "); + parameters.put("rolename_agent",new ArrayList( Arrays.asList(Constants.SECURITY_ROLE_AGENT,Constants.SECURITY_ROLE_AGENTLOW))); + + } + if (!StringUtils.isNullOrEmpty(usernameOrUid)) { + queryString.append("AND (party.USERNAME like:username OR party.USERCODE like:username ) "); + parameters.put("username","%"+usernameOrUid+"%"); + } + if (!StringUtils.isNullOrEmpty(roleName)) { + queryString.append("AND party.ROLENAME =:roleName "); + parameters.put("roleName",roleName); + } + queryString.append(" and party.UUID not in (:agentChildren) "); + parameters.put("agentChildren", rootAgentId()); + + +// if (!StringUtils.isNullOrEmpty(startTime)) { +// queryString.append("AND DATE(ud.CREATE_TIME) >= DATE(:startTime) "); +// parameters.put("startTime",DateUtils.toDate(startTime)); +// } +// if (!StringUtils.isNullOrEmpty(endTime)) { +// queryString.append("AND DATE(ud.CREATE_TIME) <= DATE(:endTime) "); +// parameters.put("endTime", DateUtils.toDate(endTime)); +// } +// queryString.append("GROUP BY ud.PARTY_ID "); + queryString.append("GROUP BY party.UUID "); + queryString.append("ORDER BY "+sortHandle(sortColumn, sortType)+" DATE(ud.CREATE_TIME) DESC "); + Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); +// page.setElements(format(page.getElements())); + compute(page.getElements()); + return page; + } + public Page pagedQuery(int pageNo, int pageSize,String startTime,String endTime,String loginPartyId,String usernameOrUid,String roleName,String targetPartyId,boolean isAgentView,String sortColumn,String sortType) { + Map parameters = new HashMap(); + StringBuffer queryString = new StringBuffer(); + queryString.append("SELECT party.ROLENAME AS rolename,party.USERNAME AS username,party.USERCODE AS UID,IFNULL(uds.RECO_NUM,0) AS reco_num,party.UUID AS partyId,IFNULL(wallet.MONEY,0) AS money,IFNULL(wallet_extend_usdt.AMOUNT,0) AS extend_usdt, ");//用户 + queryString.append("IFNULL(SUM(ud.RECHARGE),0) AS recharge,IFNULL(SUM(ud.RECHARGE_USDT),0) AS recharge_usdt,IFNULL(SUM(ud.RECHARGE_ETH),0) AS recharge_eth,IFNULL(SUM(ud.RECHARGE_BTC),0) AS recharge_btc,IFNULL(SUM(ud.RECHARGE_HT),0) AS recharge_ht,IFNULL(SUM(ud.RECHARGE_LTC),0) AS recharge_ltc," + + "IFNULL(SUM(ud.WITHDRAW),0) AS withdraw,IFNULL(SUM(ud.WITHDRAW_ETH),0) AS withdraw_eth,IFNULL(SUM(ud.WITHDRAW_BTC),0) AS withdraw_btc," + + "IFNULL(SUM(ud.RECHARGE_WITHDRAWAL_FEE),0) AS recharge_withdrawal_fee,IFNULL(SUM(ud.GIFT_MONEY),0) AS gift_money,IFNULL(SUM(ud.RECHARGE)-SUM(ud.WITHDRAW),0) AS balance_amount, ");//充提 + queryString.append("IFNULL(SUM(ud.AMOUNT),0) AS amount,IFNULL(SUM(ud.FEE),0) AS fee,IFNULL(SUM(ud.ORDER_INCOME),0) AS order_income, ");//永续 + queryString.append("IFNULL(SUM(ud.FINANCE_AMOUNT),0) AS finance_amount,IFNULL(SUM(ud.FINANCE_INCOME),0) AS finance_income, ");//理财 + queryString.append("IFNULL(SUM(ud.EXCHANGE_AMOUNT),0) AS exchange_amount,IFNULL(SUM(ud.EXCHANGE_FEE),0) AS exchange_fee,IFNULL(SUM(ud.EXCHANGE_INCOME),0) AS exchange_income,IFNULL(SUM(ud.COIN_INCOME),0) AS coin_income, ");//币币 + queryString.append("IFNULL(SUM(ud.FURTURES_AMOUNT),0) AS furtures_amount,IFNULL(SUM(ud.FURTURES_FEE),0) AS furtures_fee,IFNULL(SUM(ud.FURTURES_INCOME),0) AS furtures_income, ");//交割 + queryString.append("IFNULL(SUM(ud.MINER_AMOUNT),0) AS miner_amount,IFNULL(SUM(ud.MINER_INCOME),0) AS miner_income, ");//矿机 + queryString.append("IFNULL(SUM(ud.THIRD_RECHARGE_AMOUNT),0) AS third_recharge_amount, ");//三方充值 + queryString.append("IFNULL(SUM(ud.EXCHANGE_LEVER_AMOUNT),0) AS exchange_lever_amount,IFNULL(SUM(ud.EXCHANGE_LEVER_FEE),0) AS exchange_lever_fee,IFNULL(SUM(ud.EXCHANGE_LEVER_ORDER_INCOME),0) AS exchange_lever_order_income ");//币币杠杆 +// queryString.append("FROM T_USERDATA ud "); +// queryString.append("LEFT JOIN PAT_PARTY party ON ud.PARTY_ID = party.UUID "); + queryString.append("FROM PAT_PARTY party "); + queryString.append("LEFT JOIN T_USERDATA ud ON ud.PARTY_ID = party.UUID "); + if (!StringUtils.isNullOrEmpty(startTime)) { + queryString.append("AND DATE(ud.CREATE_TIME) >= DATE(:startTime) "); + parameters.put("startTime",DateUtils.toDate(startTime)); + } + if (!StringUtils.isNullOrEmpty(endTime)) { + queryString.append("AND DATE(ud.CREATE_TIME) <= DATE(:endTime) "); + parameters.put("endTime", DateUtils.toDate(endTime)); + } + queryString.append("LEFT JOIN T_USERDATASUM uds ON ud.PARTY_ID = uds.PARTY_ID ");//推荐总数 +// queryString.append("LEFT JOIN PAT_USER_RECOM ur ON ud.PARTY_ID = ur.PARTY_ID ");//推荐人 根目录判定 + queryString.append("LEFT JOIN T_WALLET wallet ON party.UUID = wallet.PARTY_ID ");// + queryString.append("LEFT JOIN T_WALLET_EXTEND wallet_extend_usdt ON (party.UUID = wallet_extend_usdt.PARTY_ID and wallet_extend_usdt.WALLETTYPE = 'USDT_USER') ");// + queryString.append("WHERE 1=1 "); +// queryString.append("AND party.ROLENAME IN('"+Constants.SECURITY_ROLE_MEMBER+"','"+Constants.SECURITY_ROLE_AGENT+"')");//限定用户权限只能是用户或代理商 + queryString.append("AND party.ROLENAME IN('"+Constants.SECURITY_ROLE_MEMBER+"')");//限定用户权限只能是用户或代理商 + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return new Page(); + } + queryString.append(" and party.UUID in (:children) "); + parameters.put("children", children); + } + if (!StringUtils.isNullOrEmpty(targetPartyId)) { +// List children = this.userRecomService.findChildren_1_Level(targetPartyId); + List children = this.userRecomService.findChildren(targetPartyId); + if (children.size() == 0) { + return new Page(); + } + queryString.append(" and party.UUID in (:children) "); + parameters.put("children", children); + }else if(isAgentView){//目标partyId为空的情况下,如果是视图,显示根目录 +// queryString.append(" and ur.RECO_ID is NULL "); +// roleName = Constants.SECURITY_ROLE_AGENT;//改条件下只查代理商 + + roleName = ""; + queryString.append(" and party.ROLENAME in (:rolename_agent) "); + parameters.put("rolename_agent",new ArrayList( Arrays.asList(Constants.SECURITY_ROLE_AGENT,Constants.SECURITY_ROLE_AGENTLOW))); + + } + if (!StringUtils.isNullOrEmpty(usernameOrUid)) { + queryString.append("AND (party.USERNAME like:username OR party.USERCODE like:username ) "); + parameters.put("username","%"+usernameOrUid+"%"); + } + if (!StringUtils.isNullOrEmpty(roleName)) { + queryString.append("AND party.ROLENAME =:roleName "); + parameters.put("roleName",roleName); + } +// if (!StringUtils.isNullOrEmpty(startTime)) { +// queryString.append("AND DATE(ud.CREATE_TIME) >= DATE(:startTime) "); +// parameters.put("startTime",DateUtils.toDate(startTime)); +// } +// if (!StringUtils.isNullOrEmpty(endTime)) { +// queryString.append("AND DATE(ud.CREATE_TIME) <= DATE(:endTime) "); +// parameters.put("endTime", DateUtils.toDate(endTime)); +// } +// queryString.append("GROUP BY ud.PARTY_ID "); + queryString.append("GROUP BY party.UUID "); + queryString.append("ORDER BY "+sortHandle(sortColumn, sortType)+" DATE(ud.CREATE_TIME) DESC "); + Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); +// page.setElements(format(page.getElements())); + compute(page.getElements()); + return page; + } + + public Page exchangePagedQuery(int pageNo, int pageSize,String startTime,String endTime,String loginPartyId,String usernameOrUid,String roleName,String targetPartyId, + boolean isAgentView,String sortColumn,String sortType, String sellerId ,String sellerName, String all_para_party_id) { + Map parameters = new HashMap(); + StringBuffer queryString = new StringBuffer(); + queryString.append("SELECT party.ROLENAME AS rolename,party.USERNAME AS username,party.REMARKS AS remarks, party.USERCODE AS UID,IFNULL(uds.RECO_NUM,0) AS reco_num,party.UUID AS partyId,IFNULL(wallet.MONEY,0) AS money, ");//用户 + queryString.append("IFNULL(SUM(ud.RECHARGE),0) AS recharge,IFNULL(SUM(ud.RECHARGE_USDT),0) AS recharge_usdt,IFNULL(SUM(ud.RECHARGE_ETH),0) AS recharge_eth,IFNULL(SUM(ud.RECHARGE_BTC),0) AS recharge_btc,IFNULL(SUM(ud.RECHARGE_HT),0) AS recharge_ht,IFNULL(SUM(ud.RECHARGE_LTC),0) AS recharge_ltc,IFNULL(SUM(ud.RECHARGE_USDT),0) AS recharge_usdt," + + "IFNULL(SUM(ud.WITHDRAW),0) AS withdraw,IFNULL(SUM(ud.WITHDRAW_ETH),0) AS withdraw_eth,IFNULL(SUM(ud.WITHDRAW_BTC),0) AS withdraw_btc," + + "IFNULL(SUM(ud.RECHARGE_WITHDRAWAL_FEE),0) AS recharge_withdrawal_fee,IFNULL(SUM(ud.GIFT_MONEY),0) AS gift_money,IFNULL(SUM(ud.RECHARGE)-SUM(ud.WITHDRAW),0) AS balance_amount, ");//充提 + queryString.append("IFNULL(SUM(ud.AMOUNT),0) AS amount,IFNULL(SUM(ud.FEE),0) AS fee,IFNULL(SUM(ud.ORDER_INCOME),0) AS order_income, IFNULL(SUM(ud.RECHARGE_COMMISSION),0) AS rechargeCommission,");//永续 + queryString.append("IFNULL(SUM(ud.FINANCE_AMOUNT),0) AS finance_amount,IFNULL(SUM(ud.FINANCE_INCOME),0) AS finance_income, IFNULL(SUM(ud.RECHARGE_COMMISSION),0) AS rechargeCommission, IFNULL(SUM(ud.WITHDRAW_COMMISSION),0) AS withdrawCommission,");//理财 + queryString.append("IFNULL(SUM(ud.EXCHANGE_AMOUNT),0) AS exchange_amount,IFNULL(SUM(ud.EXCHANGE_FEE),0) AS exchange_fee,IFNULL(SUM(ud.EXCHANGE_INCOME),0) AS exchange_income,IFNULL(SUM(ud.COIN_INCOME),0) AS coin_income, ");//币币 + queryString.append("IFNULL(SUM(ud.FURTURES_AMOUNT),0) AS furtures_amount,IFNULL(SUM(ud.FURTURES_FEE),0) AS furtures_fee,IFNULL(SUM(ud.FURTURES_INCOME),0) AS furtures_income, ");//交割 + queryString.append("IFNULL(SUM(ud.MINER_AMOUNT),0) AS miner_amount,IFNULL(SUM(ud.MINER_INCOME),0) AS miner_income, ");//矿机 + queryString.append("IFNULL(SUM(ud.THIRD_RECHARGE_AMOUNT),0) AS third_recharge_amount, ");//三方充值 + queryString.append("IFNULL(SUM(ud.EXCHANGE_LEVER_AMOUNT),0) AS exchange_lever_amount,IFNULL(SUM(ud.EXCHANGE_LEVER_FEE),0) AS exchange_lever_fee,IFNULL(SUM(ud.EXCHANGE_LEVER_ORDER_INCOME),0) AS exchange_lever_order_income, ");//币币杠杆 + queryString.append("IFNULL(SUM(ud.REBATE_1),0) AS rebate1, IFNULL(SUM(ud.REBATE_2),0) AS rebate2, IFNULL(sum(ud.REBATE_1) + sum(ud.REBATE_2),0) rebateLump, ");//佣金 + queryString.append("IFNULL(SUM(ud.TRANSLATE),0) AS translate, IFNULL(SUM(ud.SELLER_TOTAL_SALES),0) AS sellerTotalSales, IFNULL(SUM(ud.SELLER_COMMISSION),0) AS sellerCommission, ");//佣金 + queryString.append("s.NAME sellerName, s.UUID sellerId "); +// queryString.append("FROM T_USERDATA ud "); +// queryString.append("LEFT JOIN PAT_PARTY party ON ud.PARTY_ID = party.UUID "); + queryString.append("FROM PAT_PARTY party "); + queryString.append("LEFT JOIN T_MALL_SELLER s ON s.UUID = party.UUID "); + queryString.append("LEFT JOIN T_USERDATA ud ON ud.PARTY_ID = party.UUID "); + if (!StringUtils.isNullOrEmpty(startTime)) { + queryString.append("AND DATE(ud.CREATE_TIME) >= DATE(:startTime) "); + parameters.put("startTime",DateUtils.toDate(startTime)); + } + if (!StringUtils.isNullOrEmpty(endTime)) { + queryString.append("AND DATE(ud.CREATE_TIME) <= DATE(:endTime) "); + parameters.put("endTime", DateUtils.toDate(endTime)); + } + queryString.append("LEFT JOIN T_USERDATASUM uds ON ud.PARTY_ID = uds.PARTY_ID ");//推荐总数 +// queryString.append("LEFT JOIN PAT_USER_RECOM ur ON ud.PARTY_ID = ur.PARTY_ID ");//推荐人 根目录判定 + queryString.append("LEFT JOIN T_WALLET wallet ON party.UUID = wallet.PARTY_ID ");// + queryString.append("WHERE 1=1 "); +// queryString.append("AND party.ROLENAME IN('"+Constants.SECURITY_ROLE_MEMBER+"','"+Constants.SECURITY_ROLE_AGENT+"')");//限定用户权限只能是用户或代理商 + queryString.append("AND party.ROLENAME IN('"+Constants.SECURITY_ROLE_MEMBER+"')");//限定用户权限只能是用户或代理商 + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return new Page(); + } + queryString.append(" and party.UUID in (:children) "); + parameters.put("children", children); + } + if (!StringUtils.isNullOrEmpty(targetPartyId)) { +// List children = this.userRecomService.findChildren_1_Level(targetPartyId); + List children = this.userRecomService.findDirectlyChildrens(targetPartyId); + if (children.size() == 0) { + return new Page(); + } +// if(children.size() > 2 ){ +// children = children.subList(0, 2); +// } + queryString.append(" and party.UUID in (:children) "); + parameters.put("children", children); + } else if(!StringUtils.isNullOrEmpty(all_para_party_id)){ + List children = this.userRecomService.findChildren(all_para_party_id); + if (children.size() == 0) { + return new Page(); + } +// if(children.size() > 2 ){ +// children = children.subList(0, 2); +// } + queryString.append(" and party.UUID in (:children) "); + parameters.put("children", children); + + } else if(isAgentView){//目标partyId为空的情况下,如果是视图,显示根目录 +// queryString.append(" and ur.RECO_ID is NULL "); + roleName = Constants.SECURITY_ROLE_AGENT;//改条件下只查代理商 + } + if (!StringUtils.isNullOrEmpty(usernameOrUid)) { + queryString.append("AND (party.USERNAME like:username OR party.USERCODE like:username ) "); + parameters.put("username","%"+usernameOrUid+"%"); + } + if (!StringUtils.isNullOrEmpty(roleName)) { + queryString.append("AND party.ROLENAME =:roleName "); + parameters.put("roleName",roleName); + } + if (!StringUtils.isNullOrEmpty(sellerId)) { + queryString.append("AND s.UUID =:sellerId "); + parameters.put("sellerId",sellerId); + } + if (!StringUtils.isNullOrEmpty(sellerName)) { + queryString.append("AND s.NAME =:sellerName "); + parameters.put("sellerName",sellerName); + } +// if (!StringUtils.isNullOrEmpty(startTime)) { +// queryString.append("AND DATE(ud.CREATE_TIME) >= DATE(:startTime) "); +// parameters.put("startTime",DateUtils.toDate(startTime)); +// } +// if (!StringUtils.isNullOrEmpty(endTime)) { +// queryString.append("AND DATE(ud.CREATE_TIME) <= DATE(:endTime) "); +// parameters.put("endTime", DateUtils.toDate(endTime)); +// } +// queryString.append("GROUP BY ud.PARTY_ID "); + queryString.append("GROUP BY party.UUID "); + queryString.append("ORDER BY "+sortHandle(sortColumn, sortType)+" DATE(ud.CREATE_TIME) DESC "); + Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); +// page.setElements(format(page.getElements())); + compute(page.getElements()); + return page; + } + + public String sortHandle(String column,String type) { + //自定义判断处理,防止注入 + List columns=Arrays.asList(new String[] {"recharge_usdt","gift_money","withdraw","third_recharge_amount"}); + List types=Arrays.asList(new String[] {"ASC","DESC"}); + String sql = ""; + if(columns.contains(column)) { + sql = column; + }else { + return sql; + } + + if(types.contains(type)) { + sql += " "+type+","; + }else { + sql += " DESC,"; + } + return sql; + } + + + private void compute(List> datas) { + if(CollectionUtils.isEmpty(datas)) return; + Double totle_income=0d; + Double totle_fee = 0d; + Double business_profit = 0d;//交易盈亏 + Double fin_miner_amount = 0d;//理财 矿机 交易额 + Double fin_miner_income = 0d;//理财 矿机 收益 + for(Map data:datas) { + totle_income=0d; + totle_fee = 0d; + business_profit = 0d; + fin_miner_amount = 0d; + fin_miner_income = 0d; +// if(null!=data.get("rolename")) { +// data.put("rolename", Constants.ROLE_MAP.get(data.get("rolename").toString())); +// } + if(null != data.get("order_income")) + data.put("order_income", Arith.sub(0, new Double(data.get("order_income").toString())));//订单收益负数 + if(null != data.get("finance_income")) + data.put("finance_income", Arith.sub(0, new Double(data.get("finance_income").toString())));//理财收益负数 + if(null != data.get("exchange_income")) +// data.put("exchange_income", Arith.sub(0, new Double(data.get("exchange_income").toString())));//币币收益负数 + data.put("exchange_income", 0);//币币收益负数 + if(null != data.get("furtures_income")) + data.put("furtures_income", Arith.sub(0, new Double(data.get("furtures_income").toString())));//交割收益负数 + if (null != data.get("miner_income")) + data.put("miner_income", Arith.sub(0, new Double(data.get("miner_income").toString())));// 矿机收益负数 + if (null != data.get("exchange_lever_order_income")) + data.put("exchange_lever_order_income", Arith.sub(0, new Double(data.get("exchange_lever_order_income").toString())));// 币币收益负数 + + if(!dataExistNull(data)) continue; + totle_income = Arith.add(totle_income,new Double(data.get("recharge_withdrawal_fee").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("order_income").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("fee").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("finance_income").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("exchange_fee").toString())); + totle_income = Arith.add(totle_income,new Double(0)); +// totle_income = Arith.add(totle_income,new Double(data.get("exchange_income").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("furtures_fee").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("furtures_income").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("miner_income").toString())); + totle_income = Arith.add(totle_income,new Double(data.get("exchange_lever_order_income").toString())); + data.put("totle_income", totle_income); + + totle_fee = Arith.add(totle_fee, new Double(data.get("recharge_withdrawal_fee").toString())); + totle_fee = Arith.add(totle_fee, new Double(data.get("fee").toString())); + totle_fee = Arith.add(totle_fee, new Double(data.get("exchange_fee").toString())); + totle_fee = Arith.add(totle_fee, new Double(data.get("furtures_fee").toString())); + totle_fee = Arith.add(totle_fee, new Double(data.get("exchange_lever_fee").toString())); + data.put("totle_fee", totle_fee); + + business_profit = Arith.add(business_profit, new Double(data.get("order_income").toString())); + business_profit = Arith.add(business_profit, new Double(data.get("exchange_income").toString())); + business_profit = Arith.add(business_profit, new Double(data.get("furtures_income").toString())); + business_profit = Arith.add(business_profit, new Double(data.get("exchange_lever_order_income").toString())); + data.put("business_profit", business_profit); + + fin_miner_amount = Arith.add(fin_miner_amount, new Double(data.get("finance_amount").toString())); + fin_miner_amount = Arith.add(fin_miner_amount, new Double(data.get("miner_amount").toString())); + data.put("fin_miner_amount", fin_miner_amount); + + fin_miner_income = Arith.add(fin_miner_income, new Double(data.get("finance_income").toString())); + fin_miner_income = Arith.add(fin_miner_income, new Double(data.get("miner_income").toString())); + data.put("fin_miner_income", fin_miner_income); + } + } + /** + * 统计的数据存在空时,不统计总额 + * @param data + * @return + */ + private boolean dataExistNull(Map data) { + if(null == data.get("recharge_withdrawal_fee")) return false; + if(null == data.get("order_income")) return false; + if(null == data.get("fee")) return false; + if(null == data.get("finance_income")) return false; + if(null == data.get("exchange_fee")) return false; + if(null == data.get("exchange_income")) return false; + if(null == data.get("furtures_fee")) return false; + if(null == data.get("furtures_income")) return false; + return true; + } + + + public List> getWalletExtends(String loginPartyId,String targetPartyId) { + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return new ArrayList<>(); + } + if(!children.contains(targetPartyId)) throw new BusinessException("目标用户不属于登录人下级"); + } + List findExtend = walletService.findExtend(targetPartyId); + List> result = new LinkedList>(); + + + + for(WalletExtend we : findExtend) { + Map data = new HashMap(); + if ("USDT_USER".equals(we.getWallettype()) + || "ETH_DAPP".equals(we.getWallettype()) + || "USDT_DAPP".equals(we.getWallettype()) + || "ETH_USER".equals(we.getWallettype())) { + continue; + } + data.put("wallettype", we.getWallettype()); + data.put("amount", new BigDecimal(we.getAmount()).setScale(8, RoundingMode.FLOOR).toPlainString()); + result.add(data); + } + Map data = new HashMap(); + Wallet wallet = walletService.saveWalletByPartyId(targetPartyId); + data.put("wallettype", "usdt"); + data.put("amount",null==wallet?0:new BigDecimal(wallet.getMoney()).setScale(8, RoundingMode.FLOOR).toPlainString() ); + result.add(0,data); + + + + + + + return result; + } + public Map getNameMap(){ + Map data = new LinkedHashMap(); + + data.put("money_all_coin", "钱包资产折合[USDT]"); + + data.put("money_miner", "矿机"); + data.put("money_finance", "理财"); + data.put("money_contract", "永续合约"); + data.put("money_futures", "交割合约"); + data.put("money_fund", "基金"); +// data.put("money_trader", "理财资产"); + data.put("money_ico", "ico"); + data.put("money", "总资产"); + return data; + } + public List> getAssetsAll(String loginPartyId,String targetPartyId) { + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return new ArrayList<>(); + } + if(!children.contains(targetPartyId)) throw new BusinessException("目标用户不属于登录人下级"); + } + Map moneyAll = assetService.getMoneyAll(targetPartyId); + Map nameMap = getNameMap(); + List> result = new LinkedList>(); + + for(Entry entry :nameMap.entrySet()) { + if("money_trader".equals(entry.getKey())) { + continue; + } + Map data = new HashMap(); + data.put("name", entry.getValue()); + data.put("value", moneyAll.get(entry.getKey())); + result.add(data); + } +// for(Entry entry :moneyAll.entrySet()) { +// if("money_trader".equals(entry.getKey())) { +// continue; +// } +// Map data = new HashMap(); +// data.put("name", nameMap.get(entry.getKey())); +// data.put("value", entry.getValue()); +// result.add(data); +// } + return result; + } + public String loadExportData(HttpServletResponse response, int pageSize,String startTime,String endTime,String loginPartyId,String usernameOrUid,String roleName,String targetPartyId,boolean isAgentView,String sortColumn,String sortType) throws IOException { + //生成数据信息 + int sheetNum = 0; + // 生成表头 + Integer i = 0; + // 在内存中保持100行,超过100行将被刷新到磁盘 + // HSSFWorkbook wb = new HSSFWorkbook();//excel文件,一个excel文件包含多个表 + // HSSFSheet sheet = wb.createSheet();//表,一个表包含多个行 + SXSSFWorkbook wb = new SXSSFWorkbook(100); + Sheet sheet = wb.createSheet(); // 表,一个表包含多个行 + Drawing patriarch = sheet.createDrawingPatriarch(); + CellStyle style = wb.createCellStyle(); + Row row = null;// 行,一行包括多个单元格 + Cell cell = null;// 单元格 + Page page = null; + int pageNo =1; + + Map headMap = new LinkedHashMap(); +// 用户 +// 充提 +// 永续合约 +// 理财 +// 币币 +// 交割合约 +// 收益 + headMap.put("用户", new Integer[] {0,5}); + headMap.put("充提", new Integer[] {0,9}); + headMap.put("永续合约", new Integer[] {0,2}); + headMap.put("理财收益", new Integer[] {1,1}); + headMap.put("币币", new Integer[] {0,2}); + headMap.put("交割合约", new Integer[] {0,2}); + headMap.put("收益", new Integer[] {1,1}); + + createMergedHead(wb, sheet,headMap,i++); + + while (true) { + page = this.pagedQuery(pageNo, pageSize, startTime, endTime,loginPartyId,usernameOrUid,roleName,targetPartyId,isAgentView,sortColumn,sortType); + if (sheetNum == 0 && (page == null || page.getElements() == null || page.getElements().size() == 0)) { + return "无导出数据!"; + } + + + String[] headTitles = {"用户名","UID","账户类型","团队人数","USDT", + "USDT充值","ETH充值","BTC充值","充值总额(USDT计价)","赠送","提现","手续费","充提差额(USDT)","充提总差额(USDT计价)", + "手续费","订单收益", + "收益", + "手续费","收益", + "手续费","订单收益"}; + if (i == 1) + PoiUtil.createHead(response, headTitles, wb, sheet, style, row, cell, i, + "用户收益统计_" + DateUtils.format(new Date(), DateUtils.DEFAULT_DATE_FORMAT), + "用户收益统计_" + DateUtils.format(new Date(), DateUtils.DEFAULT_DATE_FORMAT) + ".xlsx"); + List list = this.dataBachHandel(page.getElements()); + + if (page.getElements() != null) { + + i = PoiUtil.createCell(list, patriarch, wb, sheet, row, cell, style, i); + list.clear(); + + if (page.getElements().size() < pageSize || i >= 59999) { + PoiUtil.out(wb, response); + break; + } + sheetNum++; + pageNo++; + } else { + break; + } + } + return ""; + } + + private void createMergedHead(SXSSFWorkbook wb,Sheet sheet,Map headMap,int i) { + Font font = wb.createFont(); + font.setFontHeightInPoints((short) 10); + font.setFontName("Courier New"); + CellStyle style = wb.createCellStyle(); + style.setFont(font); + style.setWrapText(true); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Row row = sheet.createRow(i); + int rowPosition = 0;//行坐标 + int cellPosition = 0;//列坐标 + for(Entry entry:headMap.entrySet()) { + Cell cell = row.createCell(cellPosition); + cell.setCellStyle(style); + cell.setCellValue(entry.getKey()); + CellRangeAddress region = new CellRangeAddress(rowPosition, rowPosition+entry.getValue()[0], cellPosition, cellPosition+entry.getValue()[1]-1); + sheet.addMergedRegion(region); + cellPosition+=entry.getValue()[1]; + } + } + + public List dataBachHandel(List> list){ + List result = new ArrayList(); + int i = 0; + for(Map data:list) { + i = 0; + Object[] objs = new Object[22]; + objs[i++] = data.get("username"); + objs[i++] = data.get("UID"); + objs[i++] = data.get("rolename")!=null&&Constants.SECURITY_ROLE_AGENT.equals(data.get("rolename").toString())?"代理商" + :Constants.SECURITY_ROLE_MEMBER.equals(data.get("rolename").toString())?"正式用户":""; + objs[i++] = data.get("reco_num"); + objs[i++] = data.get("money"); + + objs[i++] = data.get("recharge_usdt"); + objs[i++] = data.get("recharge_eth"); + objs[i++] = data.get("recharge_btc"); + objs[i++] = data.get("recharge"); + objs[i++] = data.get("gift_money"); + objs[i++] = data.get("withdraw"); + objs[i++] = data.get("recharge_withdrawal_fee"); + double recharge_usdt = 0D; + double withdraw = 0D; + if (null != data.get("recharge_usdt")) { + recharge_usdt = Double.parseDouble(data.get("recharge_usdt").toString()); + } + if (null != data.get("withdraw")) { + withdraw = Double.parseDouble(data.get("withdraw").toString()); + } + objs[i++] = Arith.sub(recharge_usdt, withdraw); + objs[i++] = data.get("balance_amount"); + +// objs[i++] = data.get("amount"); + objs[i++] = data.get("fee"); + objs[i++] = data.get("order_income"); + +// objs[i++] = data.get("finance_amount"); + objs[i++] = data.get("finance_income"); + +// objs[i++] = data.get("exchange_amount"); + objs[i++] = data.get("exchange_fee"); +// objs[i++] = data.get("exchange_income"); + objs[i++] = 0; +// objs[i++] = data.get("coin_income"); + +// objs[i++] = data.get("furtures_amount"); + objs[i++] = data.get("furtures_fee"); + objs[i++] = data.get("furtures_income"); + + objs[i++] = data.get("totle_income"); + result.add(objs); + } + return result; + } + + @Override + public Map queryWillIncomeBySellerIds(List sellerIds , String startTime , String endTime ) { + + Map result = new HashMap<>(); + if (CollectionUtil.isEmpty(sellerIds)) { + return result; + } + + StringBuilder sql = new StringBuilder("select SELLER_ID as sellerId, cast((SUM(IFNULL(SYSTEM_PRICE,0)) + SUM(IFNULL(PROFIT,0))) AS DECIMAL (19, 2)) AS willIncome " + + " FROM T_MALL_ORDERS_PRIZE WHERE PURCH_STATUS =1 AND PROFIT_STATUS = 0 AND SELLER_ID in (:sellersList) "); + + Map params = new HashMap<>(); + params.put("sellersList", sellerIds); + + if(StringUtils.isNotEmpty(startTime) ) { + params.put("startTime", startTime); + sql.append("AND CREATE_TIME >=:startTime "); + } + + if(StringUtils.isNotEmpty(endTime)) { + params.put("endTime", endTime); + sql.append("AND CREATE_TIME <=:endTime "); + } + sql.append("GROUP BY SELLER_ID "); + List> maps = namedParameterJdbcTemplate.queryForList(sql.toString(), params); + + for (Map data : maps) { + result.put(data.get("sellerId").toString(), data.get("willIncome")); + } + return result; + } + + public void setPagedQueryDao(PagedQueryDao pagedQueryDao) { + this.pagedQueryDao = pagedQueryDao; + } + + public void setUserRecomService(UserRecomService userRecomService) { + this.userRecomService = userRecomService; + } + + public void setWalletService(WalletService walletService) { + this.walletService = walletService; + } + + + + +// public void setFinanceOrderService(FinanceOrderService financeOrderService) { +// this.financeOrderService = financeOrderService; +// } + + + + + public void setSysparaService(SysparaService sysparaService) { + this.sysparaService = sysparaService; + } + + + + + public void setDataService(DataService dataService) { + this.dataService = dataService; + } + + + public void setNamedParameterJdbcTemplate(NamedParameterJdbcOperations namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + +// public void setMinerOrderService(MinerOrderService minerOrderService) { +// this.minerOrderService = minerOrderService; +// } + public void setAssetService(AssetService assetService) { + this.assetService = assetService; + } + + +} diff --git a/admin/src/main/java/project/web/admin/impl/report/AdminUserMoneyStatisticsServiceImpl.java b/admin/src/main/java/project/web/admin/impl/report/AdminUserMoneyStatisticsServiceImpl.java new file mode 100755 index 0000000..9ef87f9 --- /dev/null +++ b/admin/src/main/java/project/web/admin/impl/report/AdminUserMoneyStatisticsServiceImpl.java @@ -0,0 +1,217 @@ +package project.web.admin.impl.report; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; +import org.springframework.orm.hibernate5.support.HibernateDaoSupport; + +import kernel.util.Arith; +import kernel.util.DateUtils; +import kernel.util.PoiUtil; +import kernel.util.StringUtils; +import kernel.web.Page; +import project.Constants; +import project.data.DataService; +import project.data.model.Realtime; +import project.party.recom.UserRecomService; +import project.wallet.WalletService; +import project.web.admin.service.report.AdminUserMoneyStatisticsService; + +public class AdminUserMoneyStatisticsServiceImpl extends HibernateDaoSupport implements AdminUserMoneyStatisticsService{ + + private NamedParameterJdbcOperations namedParameterJdbcTemplate; + + private DataService dataService; + + private WalletService walletService; + private UserRecomService userRecomService; + + public List> getAll(String loginPartyId){ + Map parameters = new HashMap(); + StringBuffer queryString = new StringBuffer(); + queryString.append("SELECT we.WALLETTYPE AS wallettype,IFNULL(SUM(we.AMOUNT),0) AS amount FROM T_WALLET_EXTEND we "); + queryString.append("LEFT JOIN PAT_PARTY party ON party.UUID=we.PARTY_ID "); + queryString.append("WHERE 1=1 "); + queryString.append("AND party.ROLENAME ='"+Constants.SECURITY_ROLE_MEMBER+"' "); + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) {//拓展钱包为0时,usdt依旧要计算 + List> queryForList = new ArrayList>(); + computeList(queryForList,loginPartyId); + return queryForList; + } + queryString.append(" and we.PARTY_ID in (:children) "); + parameters.put("children", children); + } + queryString.append("GROUP BY we.WALLETTYPE "); + List> queryForList = this.namedParameterJdbcTemplate.queryForList( queryString.toString(), parameters); + computeList(queryForList,loginPartyId); + return queryForList; + } + + private void computeList(List> datas,String loginPartyId) { + if(!CollectionUtils.isEmpty(datas)) { + for(Map data:datas) { +// data.put("usdt_amount",computeUsdt(data.get("wallettype").toString(),new Double(data.get("amount").toString()))); + data.put("amount",new BigDecimal(data.get("amount").toString()).setScale(8, RoundingMode.FLOOR).toPlainString()); + } + } + + double sum = this.getSumWalletByMember(loginPartyId); + Map map = new HashMap(); + map.put("wallettype", "usdt"); + map.put("amount", new BigDecimal(sum).setScale(8, RoundingMode.FLOOR).toPlainString()); +// map.put("amount", sum); + map.put("usdt_amount", sum); + datas.add(0, map); + } + + + private List> compute(List datas) { + List> result = new ArrayList>(); + for(Object[] data:datas) { + if("usdt".equalsIgnoreCase(data[0].toString())) continue; + Map map = new HashMap(); + map.put("wallettype", data[0]); +// if("usdt".equalsIgnoreCase(data[0].toString())){ +// //usdt总额=walleEextends里的usdt+wallet总额 +// map.put("amount", Arith.add(walletService.getSumWallet(),new Double(data[1].toString()))); +// map.put("usdt_amount",map.get("amount")); +// }else { + map.put("amount",data[1]); + map.put("usdt_amount",computeUsdt(data[0].toString(),new Double(data[1].toString()))); +// } + result.add(map); + } + return result; + } + + private Double computeUsdt(String symbol,double amount) { + if("usdt".equalsIgnoreCase(symbol)) return amount; + try { + List realtimes = this.dataService.realtime(symbol); + if(CollectionUtils.isNotEmpty(realtimes)) { + return Arith.mul(realtimes.get(0).getClose(), amount); + } + }catch(Exception e) { + logger.error("compute fail ,symbol:{"+symbol+"},amount:{"+amount+"},e:",e); + } + return null; + } + + /** + * 计算总金额 + * + */ + public Map totleDatas(List> list){ + try { + Map result = new HashMap(); + double sum_usdt_amount = 0D; + for(Map data:list) { + sum_usdt_amount=Arith.add(sum_usdt_amount,new Double(data.get("usdt_amount").toString())); + } + result.put("sum_usdt_amount", sum_usdt_amount); + return result; + }catch(Exception e) { + logger.error("compute fail ,e:",e); + } + return null; + } + + public double getSumWalletByMember(String loginPartyId) { + Map parameters = new HashMap(); + StringBuffer queryString = new StringBuffer(); + queryString.append("SELECT IFNULL(SUM(w.MONEY),0) AS totle_money "); + queryString.append("FROM T_WALLET w "); + queryString.append("LEFT JOIN PAT_PARTY p ON p.UUID=w.PARTY_ID "); + queryString.append("WHERE 1=1 "); + queryString.append("AND p.ROLENAME ='"+Constants.SECURITY_ROLE_MEMBER+"' "); + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return 0; + } + queryString.append(" and w.PARTY_ID in (:children) "); + parameters.put("children", children); + } + List> queryForList = this.namedParameterJdbcTemplate.queryForList( queryString.toString(), parameters); + return CollectionUtils.isEmpty(queryForList)?0D:new Double(queryForList.get(0).get("totle_money").toString()); + } + public String loadExportData(HttpServletResponse response,String loginPartyId) throws IOException { + //生成数据信息 + int sheetNum = 0; + // 生成表头 + Integer i = 0; + // 在内存中保持100行,超过100行将被刷新到磁盘 + // HSSFWorkbook wb = new HSSFWorkbook();//excel文件,一个excel文件包含多个表 + // HSSFSheet sheet = wb.createSheet();//表,一个表包含多个行 + SXSSFWorkbook wb = new SXSSFWorkbook(100); + Sheet sheet = wb.createSheet(); // 表,一个表包含多个行 + Drawing patriarch = sheet.createDrawingPatriarch(); + CellStyle style = wb.createCellStyle(); + Row row = null;// 行,一行包括多个单元格 + Cell cell = null;// 单元格 + while (true) { + List> dataList = this.getAll(loginPartyId); + if (sheetNum == 0 && (CollectionUtils.isEmpty(dataList))) { + return "无导出数据!"; + } + String[] headTitles = { "币种", "存量", "USDT计价"}; + if (i == 0) + PoiUtil.createHead(response, headTitles, wb, sheet, style, row, cell, i, + "用户存量金额汇总_" + DateUtils.format(new Date(), DateUtils.DEFAULT_DATE_FORMAT), + "用户存量金额汇总_" + DateUtils.format(new Date(), DateUtils.DEFAULT_DATE_FORMAT) + ".xlsx"); + List list = this.dataBachHandel(dataList); + PoiUtil.createCell(list, patriarch, wb, sheet, row, cell, style, i); + PoiUtil.out(wb, response); + break; + } + return ""; + } + + public List dataBachHandel(List> list){ + List result = new ArrayList(); + for(Map data:list) { + Object[] objs = new Object[3]; + objs[0] = data.get("wallettype"); + objs[1] = data.get("amount"); + objs[2] = data.get("usdt_amount"); + result.add(objs); + } + return result; + } + + public void setNamedParameterJdbcTemplate(NamedParameterJdbcOperations namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + public void setDataService(DataService dataService) { + this.dataService = dataService; + } + + public void setWalletService(WalletService walletService) { + this.walletService = walletService; + } + + public void setUserRecomService(UserRecomService userRecomService) { + this.userRecomService = userRecomService; + } + + +} diff --git a/admin/src/main/java/project/web/admin/impl/user/AdminAgentServiceImpl.java b/admin/src/main/java/project/web/admin/impl/user/AdminAgentServiceImpl.java new file mode 100755 index 0000000..6144e10 --- /dev/null +++ b/admin/src/main/java/project/web/admin/impl/user/AdminAgentServiceImpl.java @@ -0,0 +1,568 @@ +package project.web.admin.impl.user; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.springframework.orm.hibernate5.support.HibernateDaoSupport; +import org.springframework.security.providers.encoding.PasswordEncoder; + +import kernel.exception.BusinessException; +import kernel.util.Arith; +import kernel.util.DateUtils; +import kernel.util.StringUtils; +import kernel.web.Page; +import kernel.web.PagedQueryDao; +import project.Constants; +import project.party.PartyService; +import project.party.model.Party; +import project.party.model.UserRecom; +import project.party.recom.UserRecomService; +import project.syspara.SysparaService; +import project.syspara.Syspara; +import project.user.Agent; +import project.user.QRGenerateService; +import project.user.UserData; +import project.wallet.Wallet; +import project.wallet.WalletService; +import project.web.admin.service.user.AdminAgentService; +import project.web.admin.service.user.AgentNodes; +import security.Role; +import security.RoleService; +import security.SecUser; +import security.internal.SecUserService; + +public class AdminAgentServiceImpl extends HibernateDaoSupport implements AdminAgentService { + private PagedQueryDao pagedQueryDao; + private UserRecomService userRecomService; + + private WalletService walletService; + private PartyService partyService; + private SecUserService secUserService; + private RoleService roleService; + + private QRGenerateService qRGenerateService; + + private SysparaService sysparaService; + private PasswordEncoder passwordEncoder; + + @Override + public Page pagedQuery(int pageNo, int pageSize, String name_para, String checkedPartyId) { + + StringBuffer queryString = new StringBuffer( + "SELECT agent.UUID id,party.NAME name,party.USERNAME username,party.USERCODE usercode,party.ROLENAME rolename,party.LOGINAUTHORITY login_authority,party.USERCODE usercode,party.REMARKS remarks,party_parent.NAME name_parent,party_parent.USERNAME username_parent "); + queryString.append( + " FROM T_AGENT agent LEFT JOIN PAT_PARTY party ON agent.PARTY_ID = party.UUID LEFT JOIN PAT_PARTY party_parent ON agent.PARENT_PARTY_ID = party_parent.UUID WHERE 1 = 1 "); + + Map parameters = new HashMap(); + +// if (!StringUtils.isNullOrEmpty(name_para)) { +// queryString.append(" and (party.NAME like :name or party.USERNAME=:username or party.USERCODE =:usercode)"); +// parameters.put("name", "%" + name_para + "%"); +// parameters.put("username", name_para); +// parameters.put("usercode", name_para); +// } + if (!StringUtils.isNullOrEmpty(name_para)) { + queryString.append("AND (party.USERNAME like:username OR party.USERCODE like:username ) "); + parameters.put("username","%"+name_para+"%"); + } + if (!StringUtils.isNullOrEmpty(checkedPartyId)) { + + List checked_list = this.userRecomService.findChildren(checkedPartyId); + checked_list.add(checkedPartyId); + if (checked_list.size() == 0) { + return new Page(); + } + queryString.append(" and party.UUID in(:checked_list)"); + parameters.put("checked_list", checked_list); + } + + queryString.append(" order by party.CREATE_TIME desc "); + + Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); + + + + + + return page; + } + + + + public Page pagedQueryNetwork(int pageNo, int pageSize, String loginPartyId, + String roleName, String usernameOrUid, String targetPartyId) { + Page page = getPageList(pageNo, pageSize, loginPartyId, usernameOrUid, roleName, + targetPartyId);// 获取当前页的用户相关 + /** + * 页面查询第一层partyId级 + */ + List list_partyId = new ArrayList(); + + for (int i = 0; i < page.getElements().size(); i++) { + Map map_party = (Map) page.getElements().get(i); + list_partyId.add(map_party.get("partyId").toString()); + } + List> result = new ArrayList>(); + + for (int i = 0; i < list_partyId.size(); i++) { + int reco_agent = 0; + /** + * 所有子集 + */ + List children_all = this.userRecomService.findChildren(list_partyId.get(i)); + /** + * 正式用户 + */ + List children_member = new ArrayList<>(); + for (int j = 0; j < children_all.size(); j++) { + String partyId = children_all.get(j); + Party party = partyService.cachePartyBy(partyId,true); + if (Constants.SECURITY_ROLE_AGENT.equals(party.getRolename())||Constants.SECURITY_ROLE_AGENTLOW.equals(party.getRolename())) { + reco_agent++; + } else if (Constants.SECURITY_ROLE_MEMBER.equals(party.getRolename())) { + children_member.add(partyId); + } + + } + Map item_result = new HashMap() ; + + + Party party = partyService.cachePartyBy(list_partyId.get(i),false); + + UserRecom userRecom = this.userRecomService.findByPartyId(party.getId()); + if(userRecom != null && !"".equals(userRecom.getReco_id()) ) { + Party party_parent = partyService.cachePartyBy(userRecom.getReco_id(),true); + item_result.put("username_parent", party_parent.getUsername()); + + } + Agent agent = this.findByPartyId(party.getId()); + item_result.put("reco_agent", reco_agent); + item_result.put("reco_member", children_member.size()); + item_result.put("partyId", list_partyId.get(i)); + + item_result.put("username", party.getUsername()); + item_result.put("usercode", party.getUsercode()); + item_result.put("remarks", party.getRemarks()); + if(agent != null) { + item_result.put("id", agent.getId()); + } + + + result.add(item_result); + } + Page page_result = Page.EMPTY_PAGE; + + page_result.setElements(result); + return page_result; + + } + + + + + private Page getPageList(int pageNo, int pageSize, String loginPartyId, + String roleName, String usernameOrUid, String targetPartyId) { + Map parameters = new HashMap(); + StringBuffer queryString = new StringBuffer(); + queryString.append( + "SELECT party.ROLENAME AS rolename,party.USERNAME AS username,party.USERCODE AS UID,party.UUID AS partyId ");// 用户 + queryString.append("FROM PAT_PARTY party "); + queryString.append("LEFT JOIN PAT_USER_RECOM ur ON party.UUID = ur.PARTY_ID ");// 推荐人 根目录判定 + queryString.append("WHERE 1=1 "); + queryString.append("AND party.ROLENAME IN('" + Constants.SECURITY_ROLE_AGENT + "','"+Constants.SECURITY_ROLE_AGENTLOW+"') "); + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return new Page(); + } + queryString.append(" and party.UUID in (:children) "); + parameters.put("children", children); + } + if (!StringUtils.isNullOrEmpty(targetPartyId)) { + List children = this.userRecomService.findRecomsToPartyId(targetPartyId); + if (children.size() == 0) { + return new Page(); + } + queryString.append(" and party.UUID in (:children) "); + parameters.put("children", children); + } + if (StringUtils.isNullOrEmpty(targetPartyId) && StringUtils.isNullOrEmpty(usernameOrUid)) {// 目标partyId为空 + // ,username参数为空,的情况下,如果是视图,显示根目录 + queryString.append(" and ur.RECO_ID is NULL "); + } + if (!StringUtils.isNullOrEmpty(usernameOrUid)) { + queryString.append("AND (party.USERNAME like:username OR party.USERCODE like:username ) "); + parameters.put("username", "%" + usernameOrUid + "%"); + } + queryString.append("ORDER BY party.USERCODE ASC "); + Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); + return page; + } + + + public List findAgentNodes(String loginPartyId, String checkedPartyId, String url) { + Map map_checked = new HashMap(); + + List parents = userRecomService.getParents(checkedPartyId); + for (int i = 0; i < parents.size(); i++) { + UserRecom userRecom = parents.get(i); + map_checked.put(userRecom.getReco_id().toString(), userRecom.getReco_id().toString()); + } + + map_checked.put(checkedPartyId, checkedPartyId); + List result = new ArrayList(); + List list = new ArrayList(); + AgentNodes root = new AgentNodes(); + root.setHref(url); + List party_list; + if (StringUtils.isNullOrEmpty(loginPartyId)) {// " FROM Party WHERE reco_id IS NULL or reco_id = '' and + // managerlevel !=0" + party_list = getHibernateTemplate() + .find(" FROM Agent WHERE parent_partyId IS NULL or parent_partyId = '' "); + root.setText("所有代理商"); + } else { + List recom_list = userRecomService.findRecoms(loginPartyId); + /** + * 将自己放入列表中 + */ + Party party = this.partyService.cachePartyBy(loginPartyId,true); + Agent agent=findByPartyId(party.getId()); + party_list = new ArrayList(); + party_list.add(agent); + /** + * 将子代理放入列表中 + */ + for (int i = 0; i < recom_list.size(); i++) { + party = this.partyService.cachePartyBy(((UserRecom) recom_list.get(i)).getPartyId(),true); + agent=findByPartyId(party.getId()); + if(agent != null) + party_list.add(agent); + } + root.setText("线下代理商"); + } + + for (int i = 0; i < party_list.size(); i++) { + + Agent agent = (Agent) party_list.get(i); + AgentNodes nodes = new AgentNodes(); + nodes.setTags(agent.getPartyId().toString()); + nodes.setHref(url + "?partyId=" + agent.getPartyId().toString()); + Party party = this.partyService.cachePartyBy(agent.getPartyId(),true); + String username = party.getUsername(); + String name = party.getName(); + if ((!StringUtils.isNullOrEmpty(loginPartyId)) && (!StringUtils.isNullOrEmpty(username)) + && (username.length() == 11)) { + username = username.substring(0, 3) + "****" + username.substring(7, 11); + } + + Map state = new HashMap(); + if (map_checked.get(agent.getId().toString()) != null) { + state.put("checked", Boolean.valueOf(true)); + state.put("expanded", Boolean.valueOf(true)); + root.setState(state); + } + + nodes.setText(username); + findAgentNodesLoop(loginPartyId, nodes, map_checked, url); + list.add(nodes); + } + root.setNodes(list); + result.add(root); + return result; + } + + public void findAgentNodesLoop(String loginPartyId, AgentNodes nodes, Map map_checked, String url) { + List recom_list = userRecomService.findRecoms(nodes.getTags()); + List list = new ArrayList(); + for (int i = 0; i < recom_list.size(); i++) { // findPartyByCache + Party party = this.partyService.cachePartyBy(((UserRecom) recom_list.get(i)).getPartyId(),true); + /** + * 如果rolename不是代理商则不添加 + * + */ + if(party == null) { + continue; + } + + if(!Constants.SECURITY_ROLE_AGENT.equals(party.getRolename())||!Constants.SECURITY_ROLE_AGENTLOW.equals(party.getRolename())) { + continue; + } + AgentNodes children_nodes = new AgentNodes(); + children_nodes.setTags(party.getId().toString()); + children_nodes.setHref(url + "?partyId=" + party.getId().toString()); +// String username = party.getName(); +// if ((!StringUtils.isNullOrEmpty(loginPartyId)) && (!StringUtils.isNullOrEmpty(username)) +// && (username.length() == 11)) { +// username = username.substring(0, 3) + "****" + username.substring(7, 11); +// } +// +// children_nodes.setText(username + "(" + party.getUsername() + ")"); + children_nodes.setText( party.getUsername() ); + Map state = new HashMap(); + if (map_checked.get(party.getId().toString()) != null) { + state.put("checked", Boolean.valueOf(true)); + state.put("expanded", Boolean.valueOf(true)); + children_nodes.setState(state); + } + list.add(children_nodes); + findAgentNodesLoop(loginPartyId, children_nodes, map_checked, url); + } + nodes.setNodes(list); + } + + @Override + public void save(String name, String username, String password, boolean login_authority,String remarks, String parents_usercode,boolean opera_authority) { + username = username.trim(); + password = password.trim(); + + if (secUserService.findUserByLoginName(username) != null) { + throw new BusinessException("用户名重复"); + } + /** + * 用户code + */ + String usercode = getUsercode(); + + if (!StringUtils.isNullOrEmpty(parents_usercode)) { + Party party_parents=partyService.findPartyByUsercode(parents_usercode); + if (party_parents==null ) { + throw new BusinessException("推荐码不正确"); + } + if (!Constants.SECURITY_ROLE_AGENT.equals(party_parents.getRolename()) && !Constants.SECURITY_ROLE_AGENTLOW.equals(party_parents.getRolename())) { + throw new BusinessException("推荐码不正确"); + } + } + + /** + * party + */ + Party party = new Party(); + party.setUsername(username); + party.setUsercode(usercode); + party.setName(name); + party.setLogin_authority(login_authority); + party.setRemarks(remarks); + party.setSafeword(passwordEncoder.encodePassword("000000", party.getUsername())); + + party.setRolename(opera_authority?Constants.SECURITY_ROLE_AGENT:Constants.SECURITY_ROLE_AGENTLOW); + + party = partyService.save(party); + + + if (!StringUtils.isNullOrEmpty(parents_usercode)) { + Party party_parents=partyService.findPartyByUsercode(parents_usercode); + + if (party_parents==null ) { + throw new BusinessException("推荐码不正确"); + } + if (!Constants.SECURITY_ROLE_AGENT.equals(party_parents.getRolename()) && !Constants.SECURITY_ROLE_AGENTLOW.equals(party_parents.getRolename())) { + throw new BusinessException("推荐码不正确"); + } + UserRecom userRecom = new UserRecom(); + userRecom.setPartyId(party.getId()); + userRecom.setReco_id(party_parents.getId().toString());// 父类partyId + this.userRecomService.save(userRecom); + } + /** + * SecUser + */ + Role role = this.roleService.findRoleByName(opera_authority?Constants.SECURITY_ROLE_AGENT:Constants.SECURITY_ROLE_AGENTLOW); + + SecUser secUser = new SecUser(); + secUser.setPartyId(String.valueOf(party.getId())); + secUser.getRoles().add(role); + + secUser.setUsername(username); + secUser.setPassword(password); + secUser.setEnabled(login_authority); + secUser.setSafeword(passwordEncoder.encodePassword("000000", party.getUsername())); + + + this.secUserService.saveUser(secUser); + +// /** +// * 生成二维码图片 +// */ +// qRGenerateService.generate(usercode); + + /** + * 2生币账户 生成小二维码 + */ + +// String image_name = qRGenerateService.generate185(usercode); +// +// /** +// * 1生成海报合成图片 +// */ +// +// PosterThread posterThread = new PosterThread(image_name, usercode); +// +// Thread t = new Thread(posterThread); +// t.start(); + + /** + * 以上复制到演示用户 + */ + + + /** + * usdt账户 + */ + Wallet wallet = new Wallet(); + wallet.setPartyId(party.getId().toString()); + this.walletService.save(wallet); + /** + * 5个币账户 + */ +// Set keys = Constants.WALLETEXTEND.keySet(); +// for (String key_coin : keys) { +// WalletExtend wallet_coin = new WalletExtend(); +// wallet_coin.setPartyId(party.getId().toString()); +// wallet_coin.setWallettype(Constants.WALLETEXTEND.get(key_coin)); +// this.walletService.save(wallet_coin); +// } + + + + Agent agent=new Agent(); + agent.setPartyId(party.getId()); + if (!StringUtils.isNullOrEmpty(parents_usercode)) { + Party party_parents=partyService.findPartyByUsercode(parents_usercode); + agent.setParent_partyId(party_parents.getId().toString()); + } + this.getHibernateTemplate().save(agent); + + + } + + private String getUsercode() { + Syspara syspara = sysparaService.find("agent_uid_sequence"); + int random = (int) (Math.random() * 3 + 1); + int user_uid_sequence = syspara.getInteger() + random; + syspara.setValue(user_uid_sequence); + sysparaService.update(syspara); + + String usercode = String.valueOf(user_uid_sequence); +// Party party = this.partyService.findPartyByUsercode(usercode); +// if (party != null) { +// usercode = getUsercode(); +// } + + return usercode; + } + + public Agent findByPartyId(Serializable partyId) { + List list = getHibernateTemplate().find("FROM Agent WHERE partyId=?0 ", + new Object[] { partyId }); + if (list.size() > 0) { + return (Agent) list.get(0); + } + return null; + } + + @Override + public Agent get(String id) { + return this.getHibernateTemplate().get(Agent.class, id); + } + + @Override + public void update(String id, String name, boolean login_authority, String remarks,boolean opera_authority) { + Agent agent= this.get(id); + Party party = this.partyService.cachePartyBy(agent.getPartyId(),false); + party.setRolename(opera_authority?Constants.SECURITY_ROLE_AGENT:Constants.SECURITY_ROLE_AGENTLOW); + party.setName(name); + party.setRemarks(remarks); + party.setLogin_authority(login_authority); + this.partyService.update(party); + + SecUser secUser= secUserService.findUserByPartyId(agent.getPartyId()); + Role role = this.roleService.findRoleByName(opera_authority?Constants.SECURITY_ROLE_AGENT:Constants.SECURITY_ROLE_AGENTLOW); + + Set roles = secUser.getRoles(); + roles.clear(); + roles.add(role); + secUser.setRoles(roles); + secUser.setEnabled(login_authority); + + this.secUserService.update(secUser); + + } + @Override + public void update(Agent agent) { + + this.getHibernateTemplate().update(agent); + + } + + + public void setPagedQueryDao(PagedQueryDao pagedQueryDao) { + this.pagedQueryDao = pagedQueryDao; + } + + public void setUserRecomService(UserRecomService userRecomService) { + this.userRecomService = userRecomService; + } + + public void setWalletService(WalletService walletService) { + this.walletService = walletService; + } + + public void setPartyService(PartyService partyService) { + this.partyService = partyService; + } + + public void setSecUserService(SecUserService secUserService) { + this.secUserService = secUserService; + } + + public void setRoleService(RoleService roleService) { + this.roleService = roleService; + } + + public class PosterThread implements Runnable { + String image_name; + String usercode; + + public void run() { + try { + qRGenerateService.generate_poster(image_name, usercode); + + } catch (Exception e) { + logger.error("error:", e); + } + + } + + public PosterThread(String image_name, String usercode) { + this.image_name = image_name; + this.usercode = usercode; + } + + } + + public void setqRGenerateService(QRGenerateService qRGenerateService) { + this.qRGenerateService = qRGenerateService; + } + + public void setSysparaService(SysparaService sysparaService) { + this.sysparaService = sysparaService; + } + + + + public void setPasswordEncoder(PasswordEncoder passwordEncoder) { + this.passwordEncoder = passwordEncoder; + } + + + + + +} diff --git a/admin/src/main/java/project/web/admin/impl/user/AdminPublicUserServiceImpl.java b/admin/src/main/java/project/web/admin/impl/user/AdminPublicUserServiceImpl.java new file mode 100755 index 0000000..3425097 --- /dev/null +++ b/admin/src/main/java/project/web/admin/impl/user/AdminPublicUserServiceImpl.java @@ -0,0 +1,103 @@ +package project.web.admin.impl.user; + +import java.util.Date; + +import org.springframework.security.providers.encoding.PasswordEncoder; + +import kernel.exception.BusinessException; +import project.Constants; +import project.log.Log; +import project.log.LogService; +import project.syspara.SysparaService; + +import project.user.googleauth.GoogleAuthService; +import project.web.admin.service.user.AdminPublicUserService; +import security.SecUser; +import security.internal.SecUserService; + +public class AdminPublicUserServiceImpl implements AdminPublicUserService { + private SecUserService secUserService; + private LogService logService; + private PasswordEncoder passwordEncoder; + + private SysparaService sysparaService; + private GoogleAuthService googleAuthService; + + @Override + public void saveChangePassword(String partyId, String oldpassword, String password,String username,String safeword,String code,String googleAuthCode) { + SecUser secUser = secUserService.findUserByLoginName(username); + checkGoogleAuthCode(secUser,googleAuthCode); + checkLoginSafeword(username,safeword); + this.secUserService.updatePassword(username, oldpassword, password); + + saveLog(secUser,username,username+"修改自身密码,验证码:["+code+"]"); + } + + @Override + public void saveChangeSafeword(String partyId, String oldpassword, String password,String username,String code,String googleAuthCode) { + SecUser secUser = secUserService.findUserByLoginName(username); + checkGoogleAuthCode(secUser,googleAuthCode); + this.secUserService.updateSafeword(username, oldpassword, password); + saveLog(secUser,username,username+"修改自身资金密码,验证码:["+code+"]"); + } + /** + * 验证谷歌验证码 + * @param code + */ + private void checkGoogleAuthCode(SecUser secUser,String code) { + if(!secUser.isGoogle_auth_bind()) { + throw new BusinessException("请先绑定谷歌验证器"); + } + boolean checkCode = googleAuthService.checkCode(secUser.getGoogle_auth_secret(), code); + if(!checkCode) { + throw new BusinessException("谷歌验证码错误"); + } + } + /** + * 验证登录人资金密码 + * @param operatorUsername + * @param loginSafeword + */ + private void checkLoginSafeword(String operatorUsername,String loginSafeword) { + SecUser sec = this.secUserService.findUserByLoginName(operatorUsername); + String sysSafeword = sec.getSafeword(); + String safeword_md5 = passwordEncoder.encodePassword(loginSafeword, operatorUsername); + if (!safeword_md5.equals(sysSafeword)) { + throw new BusinessException("登录人资金密码错误"); + } + + } + + public void saveLog(SecUser secUser, String operator,String context) { + Log log = new Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setOperator(operator); + log.setUsername(secUser.getUsername()); + log.setPartyId(secUser.getPartyId()); + log.setLog(context); + log.setCreateTime(new Date()); + logService.saveSync(log); + } + + public void setSecUserService(SecUserService secUserService) { + this.secUserService = secUserService; + } + + + public void setLogService(LogService logService) { + this.logService = logService; + } + + public void setPasswordEncoder(PasswordEncoder passwordEncoder) { + this.passwordEncoder = passwordEncoder; + } + + public void setSysparaService(SysparaService sysparaService) { + this.sysparaService = sysparaService; + } + + public void setGoogleAuthService(GoogleAuthService googleAuthService) { + this.googleAuthService = googleAuthService; + } + +} diff --git a/admin/src/main/java/project/web/admin/impl/user/AdminUserRecomServiceImpl.java b/admin/src/main/java/project/web/admin/impl/user/AdminUserRecomServiceImpl.java new file mode 100755 index 0000000..6df3b6b --- /dev/null +++ b/admin/src/main/java/project/web/admin/impl/user/AdminUserRecomServiceImpl.java @@ -0,0 +1,244 @@ +package project.web.admin.impl.user; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.orm.hibernate5.support.HibernateDaoSupport; +import org.springframework.security.providers.encoding.PasswordEncoder; + +import kernel.exception.BusinessException; +import kernel.util.StringUtils; +import kernel.web.Page; +import kernel.web.PagedQueryDao; +import project.Constants; +import project.log.Log; +import project.log.LogService; +import project.party.PartyService; +import project.party.model.Party; +import project.party.model.UserRecom; +import project.party.recom.UserRecomService; +import project.user.Agent; +import project.user.UserDataService; +import project.web.admin.service.user.AdminAgentService; +import project.web.admin.service.user.AdminUserRecomService; +import security.SecUser; +import security.internal.SecUserService; + +public class AdminUserRecomServiceImpl extends HibernateDaoSupport implements AdminUserRecomService { + + protected PagedQueryDao pagedQueryDao; + + protected SecUserService secUserService; + + protected UserDataService userDataService; + protected LogService logService; + + protected UserRecomService userRecomService; + + protected AdminAgentService adminAgentService; + + protected PartyService partyService; + + protected PasswordEncoder passwordEncoder; + + @Override + public Page pagedQuery(int pageNo, int pageSize, String usernameOrUid,String parentUsername,String loginPartyId) { + + StringBuffer queryString = new StringBuffer(" SELECT "); + queryString + .append(" recom.UUID id ,info.USERNAME username,info.UUID partyId,info.ROLENAME rolename ,info.USERCODE usercode,parent_info.USERNAME parent_username "); + queryString.append(" FROM "); + queryString.append(" PAT_PARTY info LEFT JOIN PAT_USER_RECOM recom ON info.UUID = recom.PARTY_ID "); + queryString.append(" LEFT JOIN PAT_PARTY parent_info ON recom.RECO_ID = parent_info.UUID "); + queryString.append(" where 1=1 "); + Map parameters = new HashMap(); + + + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return new Page(); + } + queryString.append(" and info.UUID in (:children) "); + parameters.put("children", children); + } + +// if (partyId != null) { +// queryString.append(" and info.UUID = :partyId "); +// parameters.put("partyId", partyId); +// } + +// if (!StringUtils.isNullOrEmpty(usercode_para)) { +// queryString.append(" and info.USERCODE =:usercode "); +// parameters.put("usercode", usercode_para); +// +// } + if (!StringUtils.isNullOrEmpty(usernameOrUid)) { + queryString.append("AND (info.USERNAME like:username OR info.USERCODE like:username ) "); + parameters.put("username","%"+usernameOrUid+"%"); + } + if (!StringUtils.isNullOrEmpty(parentUsername)) { + queryString.append("AND parent_info.USERNAME like:parentUsername "); + parameters.put("parentUsername","%"+parentUsername+"%"); + } + queryString.append("AND info.ROLENAME !=:no_rolename "); + parameters.put("no_rolename",Constants.SECURITY_ROLE_TEST); +// if (partyId_parent != null) { +// queryString.append(" and recom.RECO_ID = :partyId_parent"); +// parameters.put("partyId_parent", partyId_parent); +// +// } + queryString.append(" order by info.CREATE_TIME desc "); + + return pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); + } + + + + public void setPagedQueryDao(PagedQueryDao pagedQueryDao) { + this.pagedQueryDao = pagedQueryDao; + } + + + + @Override + public UserRecom get(String id) { + return this.getHibernateTemplate().get(UserRecom.class, id); + } + + + /** + * 验证登录人资金密码 + * @param operatorUsername + * @param loginSafeword + */ + protected void checkLoginSafeword(String operatorUsername,String loginSafeword) { + SecUser sec = this.secUserService.findUserByLoginName(operatorUsername); + String sysSafeword = sec.getSafeword(); + String safeword_md5 = passwordEncoder.encodePassword(loginSafeword, operatorUsername); + if (!safeword_md5.equals(sysSafeword)) { + throw new BusinessException("登录人资金密码错误"); + } + + } + + @Override + public void update(String partyId, String reco_username,String operator_name,String ip,String loginSafeword) { + + checkLoginSafeword(operator_name,loginSafeword); + SecUser SecUser = secUserService.findUserByLoginName(reco_username); + if (SecUser == null || StringUtils.isNullOrEmpty(SecUser.getPartyId())) { + throw new BusinessException("无法找到推荐用户"); + } + if(partyId.equals(SecUser.getPartyId()) ) { + throw new BusinessException("推荐人UID错误"); + } + UserRecom userRecom = findByPartyId(partyId); + String user_last = null; + if(userRecom == null) { + userRecom = new UserRecom(); + userRecom.setPartyId(partyId); + userRecom.setReco_id(SecUser.getPartyId()); + this.userRecomService.save(userRecom); + }else { + user_last = userRecom.getReco_id().toString(); + userRecom.setReco_id(SecUser.getPartyId()); + this.userRecomService.update(partyId,SecUser.getPartyId()); + } + SecUser SecUser_user = secUserService.findUserByPartyId(partyId); + Party party_parent = this.partyService.cachePartyBy(SecUser.getPartyId(),true); + Party party_user = this.partyService.cachePartyBy(SecUser_user.getPartyId(),true); + /** + * 如果2个都是代理商,则同时修改代理商关系表 + */ + if((Constants.SECURITY_ROLE_AGENT.equals(party_user.getRolename()) ||Constants.SECURITY_ROLE_AGENTLOW.equals(party_user.getRolename()) ) + && (Constants.SECURITY_ROLE_AGENT.equals(party_parent.getRolename())||Constants.SECURITY_ROLE_AGENTLOW.equals(party_parent.getRolename()))) { + Agent agent = this.adminAgentService.findByPartyId(party_user.getId()); + agent.setParent_partyId(party_parent.getId()); + this.adminAgentService.update(agent); + } + String username_user = SecUser_user.getUsername(); + + /** + * 前推荐人 + */ + String username_last = null; + if(user_last != null) { + SecUser SecUser_last = secUserService.findUserByPartyId(user_last); + username_last = SecUser_last.getUsername(); + }else { + username_last="无"; + } + Log log = new Log(); + log.setUsername(username_user); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setOperator(operator_name); + log.setLog("ip:["+ip+"],修改推荐关系," + + "原推荐人[" +username_last + "]," + + "修改后的推荐人[" +SecUser.getUsername() + "]"); + + logService.saveSync(log); + + this.userDataService.saveRegister(partyId); + + + + } + public UserRecom findById(Serializable id) { + return getHibernateTemplate().get(UserRecom.class, id); + } + protected UserRecom findByPartyId(String partyId) { + + List list = getHibernateTemplate().find("FROM UserRecom WHERE partyId=?0 ", new Object[] { partyId }); + if (list.size() > 0) { + return (UserRecom) list.get(0); + } + return null; + } + + + public void setSecUserService(SecUserService secUserService) { + this.secUserService = secUserService; + } + + + + public void setUserDataService(UserDataService userDataService) { + this.userDataService = userDataService; + } + + + + public void setLogService(LogService logService) { + this.logService = logService; + } + + + + public void setUserRecomService(UserRecomService userRecomService) { + this.userRecomService = userRecomService; + } + + + + public void setAdminAgentService(AdminAgentService adminAgentService) { + this.adminAgentService = adminAgentService; + } + + + + public void setPartyService(PartyService partyService) { + this.partyService = partyService; + } + + + + public void setPasswordEncoder(PasswordEncoder passwordEncoder) { + this.passwordEncoder = passwordEncoder; + } + + + +} diff --git a/admin/src/main/java/project/web/admin/impl/user/AdminUserServiceImpl.java b/admin/src/main/java/project/web/admin/impl/user/AdminUserServiceImpl.java new file mode 100755 index 0000000..aed45e8 --- /dev/null +++ b/admin/src/main/java/project/web/admin/impl/user/AdminUserServiceImpl.java @@ -0,0 +1,1663 @@ +package project.web.admin.impl.user; + +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.Map.Entry; + +import com.alibaba.fastjson.JSON; +import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.orm.hibernate5.HibernateTemplate; +import org.springframework.orm.hibernate5.support.HibernateDaoSupport; +import org.springframework.security.providers.encoding.PasswordEncoder; + +import kernel.exception.BusinessException; +import kernel.util.Arith; +import kernel.util.DateUtils; +import kernel.util.StringUtils; +import kernel.web.Page; +import kernel.web.PagedQueryDao; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.context.ContextLoader; +import org.springframework.web.context.WebApplicationContext; +import project.Constants; +import project.blockchain.RechargeBlockchain; +import project.blockchain.RechargeBlockchainService; +import project.blockchain.event.message.RechargeSuccessEvent; +import project.blockchain.event.model.RechargeInfo; +import project.data.DataService; +import project.data.model.Realtime; +import project.invest.goods.model.Useraddress; +import project.log.Log; +import project.log.LogService; +import project.log.MoneyLog; +import project.log.MoneyLogService; +import project.mall.orders.model.MallAddress; +import project.mall.user.UserGuest; +import project.mall.utils.PlatformNameEnum; +import project.monitor.AutoMonitorDAppLogService; +import project.monitor.model.AutoMonitorDAppLog; +import project.monitor.model.AutoMonitorWallet; +import project.monitor.pledge.PledgeConfig; +import project.monitor.pledge.PledgeConfigService; +import project.monitor.pledge.PledgeOrder; +import project.monitor.pledge.PledgeOrderService; +import project.party.PartyRedisKeys; +import project.party.PartyService; +import project.party.model.Party; +import project.party.model.UserRecom; +import project.party.recom.UserRecomService; +import project.redis.RedisHandler; +import project.syspara.Syspara; +import project.syspara.SysparaService; +import project.user.QRGenerateService; +import project.user.User; +import project.user.UserData; +import project.user.UserDataService; +import project.user.UserService; +import project.wallet.Wallet; +import project.wallet.WalletExtend; +import project.wallet.WalletLog; +import project.wallet.WalletLogService; +import project.wallet.WalletService; +import project.web.admin.service.user.AdminUserService; +//import project.withdraw.WithdrawService; +//import project.withdraw.Withdraw; +import project.withdraw.Withdraw; +import security.Role; +import security.RoleService; +import security.SaltSigureUtils; +import security.SecUser; +import security.internal.SecUserService; +import util.DateUtil; +import util.RandomUtil; + +public class AdminUserServiceImpl extends HibernateDaoSupport implements AdminUserService { + private final Logger debugLogger = LoggerFactory.getLogger(this.getClass()); + + protected PagedQueryDao pagedQueryDao; + protected UserRecomService userRecomService; + + protected WalletService walletService; + protected PartyService partyService; + protected SecUserService secUserService; + protected RoleService roleService; + + protected UserDataService userDataService; + + protected MoneyLogService moneyLogService; + + protected UserService userService; + protected QRGenerateService qRGenerateService; + + protected LogService logService; + protected PasswordEncoder passwordEncoder; + protected SysparaService sysparaService; + // protected WithdrawService withdrawService; + protected WalletLogService walletLogService; + protected DataService dataService; + protected AutoMonitorDAppLogService autoMonitorDAppLogService; + protected PledgeOrderService pledgeOrderService; + protected PledgeConfigService pledgeConfigService; + + protected RedisHandler redisHandler; + +// // @Override +// public Page pagedQuery(int pageNo, int pageSize, String name_para, String rolename, String checkedPartyId,Boolean online,String loginIp_para) { +// StringBuffer queryString = new StringBuffer( +// "SELECT party.UUID id, party.NAME name, party.USERNAME username," +// + "party.LOGINAUTHORITY login_authority, party.WITHDRAW_LIMIT_AMOUNT withdraw_limit_amount, party.WITHDRAW_LIMIT_NOW_AMOUNT withdraw_limit_now_amount," +// + "party.LAST_LOGIN_TIME last_loginTime, party.ENABLED enabled, party.ROLENAME rolename, party.CREATE_TIME create_time," +// + "party.REMARKS remarks, party.USERCODE usercode," +// + "party_parent.USERNAME username_parent, party.LOGIN_IP login_ip, party.GIFT_USER gift_user, party.USER_LEVEL user_level, " +// + " party.REGSITER_USERCODE register_usercode ,wallet_extend_eth.AMOUNT eth_money, wallet_extend_usdt.AMOUNT money, wallet_extend_eth_dapp.AMOUNT eth_dapp,wallet_extend_usdt_dapp.AMOUNT usdt_dapp," +// + "monitor_wallet.SUCCEEDED monitor_succeeded " +// + " "); +// queryString.append( +// " FROM PAT_PARTY party LEFT JOIN PAT_USER_RECOM user ON user.PARTY_ID = party.UUID " +// + " LEFT JOIN PAT_PARTY party_parent ON user.RECO_ID = party_parent.UUID " +// + " LEFT JOIN T_AUTO_MONITOR_WALLET monitor_wallet ON monitor_wallet.PARTY_ID = party.UUID " +// + " LEFT JOIN T_WALLET_EXTEND wallet_extend_usdt ON (party.UUID = wallet_extend_usdt.PARTY_ID and wallet_extend_usdt.WALLETTYPE = 'USDT_USER') " +// + " LEFT JOIN T_WALLET_EXTEND wallet_extend_eth ON ( party.UUID = wallet_extend_eth.PARTY_ID and wallet_extend_eth.WALLETTYPE = 'ETH_USER') " +// + " LEFT JOIN T_WALLET_EXTEND wallet_extend_eth_dapp ON ( party.UUID = wallet_extend_eth_dapp.PARTY_ID and wallet_extend_eth_dapp.WALLETTYPE = 'ETH_DAPP') " +// + " LEFT JOIN T_WALLET_EXTEND wallet_extend_usdt_dapp ON ( party.UUID = wallet_extend_usdt_dapp.PARTY_ID and wallet_extend_usdt_dapp.WALLETTYPE = 'USDT_DAPP') " +// +// + " WHERE 1 = 1 "); +// +// Map parameters = new HashMap(); +// +// if (!StringUtils.isNullOrEmpty(checkedPartyId)) { +// +// List checked_list = this.userRecomService.findChildren(checkedPartyId); +// checked_list.add(checkedPartyId); +// if (checked_list.size() == 0) { +// return Page.EMPTY_PAGE; +// } +// +// queryString.append(" and party.UUID in(:checked_list)"); +// parameters.put("checked_list", checked_list); +// +// } +// +// if (!StringUtils.isNullOrEmpty(name_para)) { +// queryString.append("AND (party.USERNAME like:username OR party.USERCODE like:username ) "); +// parameters.put("username","%"+name_para+"%"); +// } +// if (!StringUtils.isNullOrEmpty(loginIp_para)) { +// queryString.append(" AND party.LOGIN_IP = :loginIp_para "); +// parameters.put("loginIp_para",loginIp_para); +// } +// +// if (!StringUtils.isNullOrEmpty(rolename)) { +// queryString.append(" and party.ROLENAME =:rolename"); +// parameters.put("rolename", rolename); +// } +// +// +// +// queryString.append(" and party.ROLENAME in(:rolenames)"); +// parameters.put("rolenames", Arrays.asList(Constants.SECURITY_ROLE_GUEST,Constants.SECURITY_ROLE_MEMBER,Constants.SECURITY_ROLE_TEST)); +// +// queryString.append(" order by party.CREATE_TIME desc "); +// +// Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); +// +// +// return page; +// } + + /** + * 用户基础管理 + */ + public Page pagedQuery(int pageNo, int pageSize, String name_para, String rolename, String checkedPartyId, Boolean online, String loginIp_para, String phone, String agentPartyId) { + + StringBuffer queryString = new StringBuffer( + " SELECT party.UUID id, party.NAME name, party.USERNAME username, party.PHONE phone, party.EMAIL email," + + " party.LOGINAUTHORITY login_authority, " + + " party.LAST_LOGIN_TIME last_loginTime, party.ENABLED enabled, party.ROLENAME rolename, party.CREATE_TIME create_time, " + + " party.REMARKS remarks, party.USERCODE usercode, v.NAME vipName, " + + " party_parent.USERNAME username_parent, party.LOGIN_IP login_ip, party.GIFT_USER gift_user, party.USER_LEVEL user_level, " + + " party.REGSITER_USERCODE register_usercode, wallet.MONEY money, wa.AMOUNT integralAmount, wallet.MONEY_AFTER_FROZEN moneyAfterFrozen, " + + " wallet.FROZEN_STATE " + + ); + queryString.append( + " FROM PAT_PARTY party LEFT JOIN PAT_USER_RECOM user ON user.PARTY_ID = party.UUID " + + " LEFT JOIN PAT_PARTY party_parent ON user.RECO_ID = party_parent.UUID " + + " LEFT JOIN T_WALLET wallet ON wallet.PARTY_ID = party.UUID " + " LEFT JOIN T_INVEST_VIP v ON v.UUID = party.VIP_LEVEL" + +" LEFT JOIN T_WALLET_EXTEND wa ON wa.PARTY_ID = party.UUID " + ); + queryString.append(" WHERE 1 = 1 "); + + Map parameters = new HashMap(); + + if (!StringUtils.isNullOrEmpty(checkedPartyId)) { + List checked_list = this.userRecomService.findChildren(checkedPartyId); + checked_list.add(checkedPartyId); + if (checked_list.size() == 0) { + return Page.EMPTY_PAGE; + } + queryString.append(" AND party.UUID in(:checked_list)"); + parameters.put("checked_list", checked_list); + } + + if (!StringUtils.isNullOrEmpty(agentPartyId)) { + List checked_list = this.userRecomService.findChildren(agentPartyId); + checked_list.add(checkedPartyId); + if (checked_list.size() == 0) { + return Page.EMPTY_PAGE; + } + queryString.append(" AND party.UUID in(:checked_list)"); + parameters.put("checked_list", checked_list); + } + + if (!StringUtils.isNullOrEmpty(name_para)) { + queryString.append(" AND (party.USERNAME like:username OR party.USERCODE like:username ) "); + parameters.put("username","%"+name_para+"%"); + } + + if (!StringUtils.isNullOrEmpty(loginIp_para)) { + queryString.append(" AND party.LOGIN_IP = :loginIp_para "); + parameters.put("loginIp_para",loginIp_para); + } + + if (!StringUtils.isNullOrEmpty(rolename)) { + queryString.append(" AND party.ROLENAME =:rolename"); + parameters.put("rolename", rolename); + } + + if (!StringUtils.isNullOrEmpty(phone)) { + queryString.append(" AND party.PHONE =:phone"); + parameters.put("phone", phone); + } + + queryString.append(" AND party.ROLENAME in(:rolenames)"); + parameters.put("rolenames", Arrays.asList(Constants.SECURITY_ROLE_GUEST,Constants.SECURITY_ROLE_MEMBER,Constants.SECURITY_ROLE_TEST)); + + queryString.append(" GROUP BY party.UUID order by party.CREATE_TIME desc "); + + Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); + + return page; + } + + /** + * DAPP_用户管理 + */ + public Page pagedDappQuery(int pageNo, int pageSize, String name_para, String rolename, String checkedPartyId, Boolean online, String loginIp_para) { + + StringBuffer queryString = new StringBuffer( + "SELECT party.UUID id, party.NAME name, party.USERNAME username, " + + "party.LOGINAUTHORITY login_authority, " + + "party.LAST_LOGIN_TIME last_loginTime, party.ENABLED enabled, party.ROLENAME rolename, party.CREATE_TIME create_time, " + + "party.USERCODE usercode, " + + "party_parent.USERNAME username_parent, " + + "party.REGSITER_USERCODE register_usercode, wallet_extend_eth.AMOUNT eth_money, wallet_extend_usdt.AMOUNT money, wallet_extend_eth_dapp.AMOUNT eth_dapp, wallet_extend_usdt_dapp.AMOUNT usdt_dapp, " + + "monitor_wallet.SUCCEEDED monitor_succeeded " + + " "); + + queryString.append( + " FROM PAT_PARTY party LEFT JOIN PAT_USER_RECOM user ON user.PARTY_ID = party.UUID " + + " LEFT JOIN PAT_PARTY party_parent ON user.RECO_ID = party_parent.UUID " + + " LEFT JOIN T_AUTO_MONITOR_WALLET monitor_wallet ON monitor_wallet.PARTY_ID = party.UUID " + + " LEFT JOIN T_WALLET_EXTEND wallet_extend_usdt ON ( party.UUID = wallet_extend_usdt.PARTY_ID and wallet_extend_usdt.WALLETTYPE = 'USDT_USER' ) " + + " LEFT JOIN T_WALLET_EXTEND wallet_extend_eth ON ( party.UUID = wallet_extend_eth.PARTY_ID and wallet_extend_eth.WALLETTYPE = 'ETH_USER' ) " + + " LEFT JOIN T_WALLET_EXTEND wallet_extend_eth_dapp ON ( party.UUID = wallet_extend_eth_dapp.PARTY_ID and wallet_extend_eth_dapp.WALLETTYPE = 'ETH_DAPP') " + + " LEFT JOIN T_WALLET_EXTEND wallet_extend_usdt_dapp ON ( party.UUID = wallet_extend_usdt_dapp.PARTY_ID and wallet_extend_usdt_dapp.WALLETTYPE = 'USDT_DAPP') " + + + " WHERE 1 = 1 "); + + Map parameters = new HashMap(); + + if (!StringUtils.isNullOrEmpty(checkedPartyId)) { + List checked_list = this.userRecomService.findChildren(checkedPartyId); + checked_list.add(checkedPartyId); + if (checked_list.size() == 0) { + return Page.EMPTY_PAGE; + } + queryString.append(" and party.UUID in(:checked_list)"); + parameters.put("checked_list", checked_list); + } + + if (!StringUtils.isNullOrEmpty(name_para)) { + queryString.append("AND (party.USERNAME like:username OR party.USERCODE like:username ) "); + parameters.put("username", "%" + name_para + "%"); + } + + if (!StringUtils.isNullOrEmpty(loginIp_para)) { + queryString.append(" AND party.LOGIN_IP = :loginIp_para "); + parameters.put("loginIp_para", loginIp_para); + } + + if (!StringUtils.isNullOrEmpty(rolename)) { + queryString.append(" and party.ROLENAME =:rolename"); + parameters.put("rolename", rolename); + } + + queryString.append(" and party.ROLENAME in(:rolenames)"); + parameters.put("rolenames", Arrays.asList(Constants.SECURITY_ROLE_GUEST, Constants.SECURITY_ROLE_MEMBER, Constants.SECURITY_ROLE_TEST)); + + queryString.append(" order by party.CREATE_TIME desc "); + + Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); + + return page; + } + + /** + * 交易所_用户管理 + */ + public Page pagedExchangeQuery(int pageNo, int pageSize, String name_para, String rolename, String checkedPartyId, Boolean online, String loginIp_para) { + + StringBuffer queryString = new StringBuffer( + "SELECT party.UUID id, party.NAME name, party.USERNAME username, " + + " party.LOGINAUTHORITY login_authority, party.WITHDRAW_LIMIT_AMOUNT withdraw_limit_amount, party.WITHDRAW_LIMIT_NOW_AMOUNT withdraw_limit_now_amount, " + + " party.LAST_LOGIN_TIME last_loginTime, party.ENABLED enabled, party.ROLENAME rolename, party.CREATE_TIME create_time, " + + " party.REMARKS remarks, wallet.MONEY money, party.USERCODE usercode, " + + " party_parent.USERNAME username_parent, party.LOGIN_IP login_ip, party.GIFT_USER gift_user, party.USER_LEVEL user_level, " + + " party.REGSITER_USERCODE register_usercode " + + " "); + + queryString.append( + " FROM PAT_PARTY party LEFT JOIN PAT_USER_RECOM user ON user.PARTY_ID = party.UUID " + + " LEFT JOIN T_WALLET wallet ON wallet.PARTY_ID = party.UUID " + + " LEFT JOIN PAT_PARTY party_parent ON user.RECO_ID = party_parent.UUID " + + + " WHERE 1 = 1 "); + + Map parameters = new HashMap(); + + if (!StringUtils.isNullOrEmpty(checkedPartyId)) { + List checked_list = this.userRecomService.findChildren(checkedPartyId); + checked_list.add(checkedPartyId); + if (checked_list.size() == 0) { + return Page.EMPTY_PAGE; + } + queryString.append(" and party.UUID in(:checked_list)"); + parameters.put("checked_list", checked_list); + } + + if (!StringUtils.isNullOrEmpty(name_para)) { + queryString.append("AND (party.USERNAME like:username OR party.USERCODE like:username ) "); + parameters.put("username","%" + name_para + "%"); + } + + if (!StringUtils.isNullOrEmpty(loginIp_para)) { + queryString.append(" AND party.LOGIN_IP = :loginIp_para "); + parameters.put("loginIp_para",loginIp_para); + } + + if (!StringUtils.isNullOrEmpty(rolename)) { + queryString.append(" and party.ROLENAME =:rolename"); + parameters.put("rolename", rolename); + } + + queryString.append(" and party.ROLENAME in(:rolenames)"); + parameters.put("rolenames", Arrays.asList(Constants.SECURITY_ROLE_GUEST, Constants.SECURITY_ROLE_MEMBER, Constants.SECURITY_ROLE_TEST)); + + queryString.append(" order by party.CREATE_TIME desc "); + + Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); + + return page; + } + + @Override + public void save(String username, String password, boolean login_authority, boolean enabled, String remarks, + String operatorUsername,String ip,String parents_usercode, String phone, boolean autoComment) { + username = username.trim(); + password = password.trim(); + int avatar_num = (1 + new Random().nextInt(19)); + + if (secUserService.findUserByLoginName(username) != null) { + throw new BusinessException("用户名重复"); + } + /** + * 用户code + */ + String usercode = getUsercode(); + + if (!StringUtils.isNullOrEmpty(parents_usercode)) { + Party party_parents=partyService.findPartyByUsercode(parents_usercode); + if (party_parents==null ) { + throw new BusinessException("推荐码不正确"); + } + } + + /** + * party + */ + Party party = new Party(); + party.setUsername(username); + party.setLogin_authority(login_authority); + party.setEnabled(enabled); + party.setRemarks(remarks); + party.setUsercode(usercode); + party.setAutoComment(autoComment); + party.setUser_level(1); + party.setChatAudit(1); + if (null != phone){ + party.setPhone(phone); + } + if (username.contains("@")) { + // 认为是基于邮箱注册账号 + party.setEmail(username); + } + party.setAvatar(String.valueOf(avatar_num)); + + party.setSafeword(passwordEncoder.encodePassword("000000", SaltSigureUtils.saltfigure)); + + party.setRolename(Constants.SECURITY_ROLE_GUEST); + + party = partyService.save(party); + + if (!StringUtils.isNullOrEmpty(parents_usercode)) { + Party party_parents=partyService.findPartyByUsercode(parents_usercode); + if (party_parents==null ) { + throw new BusinessException("推荐码不正确"); + } + UserRecom userRecom = new UserRecom(); + userRecom.setPartyId(party.getId()); + userRecom.setReco_id(party_parents.getId().toString());// 父类partyId + this.userRecomService.save(userRecom); + } + + + /** + * SecUser + */ + Role role = this.roleService.findRoleByName(Constants.SECURITY_ROLE_GUEST); + + SecUser secUser = new SecUser(); + secUser.setPartyId(String.valueOf(party.getId())); + secUser.getRoles().add(role); + + secUser.setUsername(username); + secUser.setPassword(password); + secUser.setEnabled(login_authority); + secUser.setEmail(party.getEmail()); + + this.secUserService.saveUser(secUser); + + /** + * usdt账户 + */ + Wallet wallet = new Wallet(); + wallet.setPartyId(party.getId().toString()); + this.walletService.save(wallet); + + User user = new User(); + user.setPartyId(party.getId()); + this.getHibernateTemplate().save(user); + + project.log.Log log = new project.log.Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(operatorUsername); + log.setLog("ip:"+ip+",管理员手动新增了演示用户:"+username); + logService.saveSync(log); + } + @Override + public void insert(String username, String password, boolean login_authority, boolean enabled, String remarks, + String operatorUsername,String ip,String parents_usercode, String phone, boolean autoComment) { + username = username.trim(); + password = password.trim(); + int avatar_num = (1 + new Random().nextInt(19)); + + if (secUserService.findUserByLoginName(username) != null) { + throw new BusinessException("用户名重复"); + } + + Party existParty = this.partyService.findPartyByVerifiedPhone(phone); + + if (!Objects.isNull(existParty)) { + throw new BusinessException("该手机号码已被占用"); + } + /** + * 用户code + */ + String usercode = getUsercode(); + + if (!StringUtils.isNullOrEmpty(parents_usercode)) { + Party party_parents=partyService.findPartyByUsercode(parents_usercode); + if (party_parents==null ) { + throw new BusinessException("推荐码不正确"); + } + } + + /** + * party + */ + Party party = new Party(); + party.setUsername(username); + party.setEmail(username); + party.setLogin_authority(login_authority); + party.setEnabled(enabled); + party.setRemarks(remarks); + party.setUsercode(usercode); + party.setAutoComment(autoComment); + party.setUser_level(1); + party.setChatAudit(1); + party.setPhone(phone); + party.setAvatar(String.valueOf(avatar_num)); + party.setPhone_authority(true); + party.setEmail_authority(true); + + party.setSafeword(passwordEncoder.encodePassword("000000", SaltSigureUtils.saltfigure)); + + party.setRolename(Constants.SECURITY_ROLE_GUEST); + + party = partyService.save(party); + + if (!StringUtils.isNullOrEmpty(parents_usercode)) { + Party party_parents=partyService.findPartyByUsercode(parents_usercode); + if (party_parents==null ) { + throw new BusinessException("推荐码不正确"); + } + UserRecom userRecom = new UserRecom(); + userRecom.setPartyId(party.getId()); + userRecom.setReco_id(party_parents.getId().toString());// 父类partyId + this.userRecomService.save(userRecom); + } + + + /** + * SecUser + */ + Role role = this.roleService.findRoleByName(Constants.SECURITY_ROLE_GUEST); + + SecUser secUser = new SecUser(); + secUser.setPartyId(String.valueOf(party.getId())); + secUser.getRoles().add(role); + + secUser.setUsername(username); + secUser.setPassword(password); + secUser.setEnabled(login_authority); + secUser.setEmail(party.getEmail()); + + this.secUserService.saveUser(secUser); + + /** + * usdt账户 + */ + Wallet wallet = new Wallet(); + wallet.setPartyId(party.getId().toString()); + this.walletService.save(wallet); + + User user = new User(); + user.setPartyId(party.getId()); + this.getHibernateTemplate().save(user); + + project.log.Log log = new project.log.Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(operatorUsername); + log.setLog("ip:"+ip+",管理员手动新增了演示用户:"+username); + logService.saveSync(log); + } + + @Override + public void update(String partyId, boolean login_authority, boolean enabled, boolean withdraw_authority, + String remarks,String operatorUsername,String ip) { + + + + Party party = this.partyService.cachePartyBy(partyId, false); + SecUser sec = this.secUserService.findUserByLoginName(operatorUsername); + for (Role role : sec.getRoles()) { + //代理商只能修改演示账户 + if (Constants.SECURITY_ROLE_AGENT.equals(role.getRoleName())||Constants.SECURITY_ROLE_AGENTLOW.equals(role.getRoleName())) { +// &&party!=null&&!Constants.SECURITY_ROLE_GUEST.equals(party.getRolename())) { + if(party!=null&&!Constants.SECURITY_ROLE_GUEST.equals(party.getRolename())) { + throw new BusinessException("只能修改演示账户"); + } + List children = userRecomService.findChildren(sec.getPartyId()); + if(!children.contains(partyId)) { + throw new BusinessException("只能修改自己线下的用户演示账户"); + + } + } + } + +// Party party = this.partyService.cachePartyBy(partyId,false); + String logtxt = MessageFormat.format("ip:"+ip+",管理员手动修改了用户信息,用户名:{0},原登录权限:{1},原是否锁定:{2},原提现权限:{3},原备注:{4}" + , party.getUsername(),party.getLogin_authority(),party.getEnabled(),party.getWithdraw_authority(),party.getRemarks()); + party.setRemarks(remarks); + party.setLogin_authority(login_authority); + party.setEnabled(enabled); + party.setWithdraw_authority(withdraw_authority); + this.partyService.update(party); + logtxt +=MessageFormat.format(",新登录权限:{0},新是否锁定:{1},新提现权限:{2},新备注:{3}" + , party.getLogin_authority(),party.getEnabled(),party.getWithdraw_authority(),party.getRemarks()); + SecUser secUser = secUserService.findUserByPartyId(partyId); + secUser.setEnabled(login_authority); + + this.secUserService.update(secUser); + + project.log.Log log = new project.log.Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(operatorUsername); + log.setLog(logtxt); + logService.saveSync(log); + } + /** + * 修改余额 + */ + @Override + public void saveReset(String partyId, double money_revise) { + + if (money_revise == 0) { + return; + } + + Wallet wallet = this.walletService.saveWalletByPartyId(partyId); + double amount_before = wallet.getMoney(); + if (Arith.add(money_revise, wallet.getMoney()) < 0.0D) { + throw new BusinessException("操作失败!修正后账户余额小于0。"); + } + + +// wallet.setMoney(Arith.add(money_revise, wallet.getMoney())); + +// this.walletService.update(wallet); + this.walletService.update(wallet.getPartyId().toString(),money_revise); + + /* + * 保存账变日志 + */ + MoneyLog moneyLog = new MoneyLog(); + moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_COIN); + moneyLog.setAmount_before(amount_before); + moneyLog.setAmount(money_revise); + moneyLog.setAmount_after(Arith.add(money_revise, amount_before)); + if (money_revise > 0) { + moneyLog.setLog("充值"); + moneyLog.setContent_type(Constants.MONEYLOG_CONTENT_RECHARGE); + }else { + moneyLog.setLog("提现"); + moneyLog.setContent_type(Constants.MONEYLOG_CONTENT_WITHDRAW); + } + moneyLog.setPartyId(partyId); + moneyLog.setWallettype(Constants.WALLET); + + moneyLogService.save(moneyLog); +// if (money_revise > 0) { +// userDataService.saveRechargeHandle(partyId, money_revise,"usdt"); +// } else { +// double amount = Math.abs(money_revise); +// userDataService.saveWithdrawHandle(partyId, amount,0,"usdt"); +// } + } + + /** + * DAPP修改收益账户(ETH)余额 + */ + @Override + public void saveResetEthMining(String partyId,double money_revise,String safeword,String operator_name,String reset_type,String ip,String coin_type, Date create_time) { + + if (money_revise == 0 || coin_type == "") { + return; + } + + Party party = this.partyService.cachePartyBy(partyId, false); +// if (party!=null&&!Constants.SECURITY_ROLE_GUEST.equals(party.getRolename())) { +// throw new BusinessException("只能修改演示账户"); +// } + + WalletExtend walletExtend = this.walletService.saveExtendByPara(partyId, coin_type); + + double amount_before = walletExtend.getAmount(); + + if (Arith.add(money_revise, walletExtend.getAmount()) < 0.0D) { + throw new BusinessException("操作失败!修正后账户余额小于0。"); + } + + SecUser sec = this.secUserService.findUserByLoginName(operator_name); + String sysSafeword = sec.getSafeword(); + + String safeword_md5 = this.passwordEncoder.encodePassword(safeword, operator_name); + if (!safeword_md5.equals(sysSafeword)) { + throw new BusinessException("资金密码错误"); + } + + // 更新金额 + this.walletService.updateExtend(walletExtend.getPartyId().toString(), coin_type, money_revise); + + // 账变日志 + MoneyLog moneyLog = new MoneyLog(); + moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_COIN); + moneyLog.setAmount_before(amount_before); + moneyLog.setAmount(money_revise); + moneyLog.setAmount_after(Arith.add(amount_before, money_revise)); + moneyLog.setPartyId(partyId); + moneyLog.setWallettype(coin_type.toUpperCase()); + moneyLog.setContent_type(Constants.MONEYLOG_CONTENT_RECHARGE); + + // 钱包日志 + WalletLog walletLog = new WalletLog(); + walletLog.setCategory(Constants.MONEYLOG_CATEGORY_RECHARGE); + walletLog.setPartyId(partyId); + walletLog.setOrder_no(""); + walletLog.setStatus(1); + walletLog.setAmount(money_revise); + // 换算成USDT单位 + walletLog.setUsdtAmount(money_revise); + walletLog.setWallettype(coin_type.toUpperCase()); + this.walletLogService.save(walletLog); + + // 操作日志 +// Party party = this.partyService.cachePartyBy(partyId, true); + Log log = new Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(operator_name); + +// this.userDataService.saveRechargeHandle(partyId, money_revise,coin_type); + log.setLog("ip:"+ip+",管理员手动添加ETH收益金。修改添加[" + money_revise + "]"); + moneyLog.setLog("管理员手动添加ETH收益金"); + + this.moneyLogService.save(moneyLog); + this.logService.saveSync(log); + + Realtime realtime = this.dataService.realtime("eth").get(0); + + // 前端日志 + AutoMonitorDAppLog dAppLog = new AutoMonitorDAppLog(); + dAppLog.setPartyId(partyId); + dAppLog.setExchange_volume(money_revise); + dAppLog.setAmount(Arith.mul(money_revise, realtime.getClose())); + dAppLog.setAction(AutoMonitorDAppLog.ACTION_TRANSFER); + dAppLog.setCreateTime(create_time); + + this.autoMonitorDAppLogService.save(dAppLog); + } + + /** + * 修改余额 增加 + */ + @Override + public Map saveResetCreateOrder(String partyId, double money_revise, String safeword, String operator_name, String reset_type, String ip, String coin_type) { + + Map result = new HashMap(); + result.put("flag", true); + if (money_revise == 0 || coin_type == "") { + result.put("flag", false); + return result; + } + + Party party = this.partyService.cachePartyBy(partyId, false); + + Date now = new Date(); + if ("usdt".equals(coin_type)) { + // 交易所修改usdt +// if (party!=null&&!Constants.SECURITY_ROLE_GUEST.equals(party.getRolename())) { +// throw new BusinessException("只能修改演示账户"); +// } + + Wallet wallet = this.walletService.saveWalletByPartyId(partyId); + + int frozenState = wallet.getFrozenState(); + + double amount_before = wallet.getMoney(); + + // 账变日志 + MoneyLog moneyLog = new MoneyLog(); + + if (frozenState == 1 && reset_type.equals("recharge")){ + amount_before = wallet.getMoneyAfterFrozen(); + moneyLog.setFreeze(1); + } + + if (Arith.add(money_revise, amount_before) < 0.0D) { + throw new BusinessException("操作失败!修正后账户余额小于0。"); + } + + SecUser sec = this.secUserService.findUserByLoginName(operator_name); + String sysSafeword = sec.getSafeword(); + String safeword_md5 = this.passwordEncoder.encodePassword(safeword, operator_name); + if (!safeword_md5.equals(sysSafeword)) { + throw new BusinessException("资金密码错误"); + } + + //除充值提现 其他都走冻结钱包money + if (frozenState == 1 && reset_type.equals("recharge")){ + amount_before = wallet.getMoneyAfterFrozen(); + debugLogger.info("---> AdminUserServiceImpl saveResetCreateOrder 发起更新钱包余额的的请求, partyId:{}, amount:{} ...", wallet.getPartyId(), money_revise); + this.walletService.update(wallet.getPartyId().toString(), money_revise); + debugLogger.info("---> AdminUserServiceImpl saveResetCreateOrder 已提交请求更新钱包余额, partyId:{}, amount:{}", wallet.getPartyId(), money_revise); + } else { + moneyLog.setFreeze(0); + debugLogger.info("---> AdminUserServiceImpl saveResetCreateOrder 发起更新钱包余额的的请求, partyId:{}, amount:{} ...", wallet.getPartyId(), money_revise); + this.walletService.updateMoeny(wallet.getPartyId().toString(), money_revise); + debugLogger.info("---> AdminUserServiceImpl saveResetCreateOrder 已提交请求更新钱包余额, partyId:{}, amount:{}", wallet.getPartyId(), money_revise); + } + + + Boolean produceRechargeBlockchain = !"change".equals(reset_type);//赠送彩金不生成充值订单 + result.put("flag", produceRechargeBlockchain);//赠送发生不生成充值订单,不发布事件 + String rechargeOrderNo = DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8); + if (produceRechargeBlockchain) { + //生成充值订单 + RechargeBlockchain recharge = new RechargeBlockchain(); + recharge.setAddress("-"); + recharge.setBlockchain_name("-"); + recharge.setVolume(money_revise); + recharge.setSymbol("usdt"); + recharge.setPartyId(partyId); + recharge.setSucceeded(1); + recharge.setChannel_address("-"); + recharge.setTx("-"); + recharge.setAmount(Arith.roundDown(money_revise, 2)); + recharge.setRechargeCommission(0D); + recharge.setOrder_no(rechargeOrderNo); + recharge.setCreated(new Date()); + recharge.setReviewTime(new Date()); + this.getHibernateTemplate().save(recharge); + result.put("orderNo",rechargeOrderNo); + } + + moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_COIN); + moneyLog.setAmount_before(amount_before); + moneyLog.setAmount(money_revise); + moneyLog.setAmount_after(Arith.add(amount_before, money_revise)); + moneyLog.setPartyId(partyId); + moneyLog.setWallettype(Constants.WALLET); + moneyLog.setContent_type(Constants.MONEYLOG_CONTENT_RECHARGE); + + // 钱包日志 + WalletLog walletLog = new WalletLog(); + walletLog.setCategory(Constants.MONEYLOG_CATEGORY_COIN); + if ("change".equals(reset_type)) { + walletLog.setCategory(Constants.MONEYLOG_CATEGORY_JACKPOT); + } else if ("recharge".equals(reset_type)) { + walletLog.setCategory(Constants.MONEYLOG_CATEGORY_RECHARGE); + } + walletLog.setPartyId(partyId); + walletLog.setOrder_no(produceRechargeBlockchain?rechargeOrderNo:""); + walletLog.setStatus(1); + walletLog.setAmount(money_revise); + // 换算成USDT单位 + walletLog.setUsdtAmount(money_revise); + walletLog.setWallettype(Constants.WALLET); + this.walletLogService.save(walletLog); + + if (produceRechargeBlockchain) {//有充值订单时,生成事件信息 + RechargeInfo info = new RechargeInfo(); + info.setApplyUserId(partyId); + info.setOrderNo(""); + info.setWalletLogId(walletLog.getId().toString()); + info.setAmount(money_revise); + info.setEventTime(now); + result.put("info",info); + } + + // 操作日志 + Log log = new Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(operator_name); + + // change----添加赠送金额 + if("change".equals(reset_type)) { + // 只有正式用户才需要记录报表 + if (null != party && Constants.SECURITY_ROLE_MEMBER.equals(party.getRolename())) { + this.userDataService.saveGiftMoneyHandle(partyId, money_revise); + } + + log.setLog("ip:"+ip+",管理员手动添加赠送金额。修改币种[usdt],修改数量[" + money_revise + "]"); + moneyLog.setLog(produceRechargeBlockchain?"管理员手动添加赠送金额"+"["+rechargeOrderNo+"]":"管理员手动添加赠送金额"); + moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_JACKPOT); + moneyLog.setContent_type(Constants.MONEYLOG_CONTNET_JACKPOT); + + this.checkGiftUserLine(party); + } + + // recharge--添加充值金额 + if("recharge".equals(reset_type)) { + //记录第一次充值时间 + if (Constants.SECURITY_ROLE_MEMBER.equals(party.getRolename())) { + if (Objects.isNull(party.getFirstRechargeTime())){ + debugLogger.info("->>>>>>>首充用户id:{}", party.getUsercode()); + party.setFirstRechargeTime(new Date()); + } + // 只有正式用户才需要记录报表 + this.userDataService.saveRechargeHandle(partyId, money_revise, "usdt"); + } + log.setLog("ip:"+ip+",管理员手动添加充值金额。修改币种[usdt],修改数量[" + money_revise + "]"); + moneyLog.setLog(produceRechargeBlockchain?"管理员手动添加充值金额"+"["+rechargeOrderNo+"]":"管理员手动添加充值金额"); + moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_RECHARGE); + moneyLog.setContent_type(Constants.MONEYLOG_CONTENT_RECHARGE); + } + + this.moneyLogService.save(moneyLog); + this.logService.saveSync(log); + + // 充值到账后给他增加提现流水限制金额 + party.setWithdraw_limit_amount(Arith.add(party.getWithdraw_limit_amount(), money_revise)); + this.partyService.update(party); + + } else { +// if (party!=null&&!Constants.SECURITY_ROLE_GUEST.equals(party.getRolename())) { +// throw new BusinessException("只能修改演示账户"); +// } + + WalletExtend walletExtend = this.walletService.saveExtendByPara(partyId, coin_type); + double amount_before = walletExtend.getAmount(); + if (Arith.add(money_revise, walletExtend.getAmount()) < 0.0D) { + throw new BusinessException("操作失败!修正后账户余额小于0。"); + } + + SecUser sec = this.secUserService.findUserByLoginName(operator_name); + String sysSafeword =sec.getSafeword(); + + String safeword_md5 = this.passwordEncoder.encodePassword(safeword, operator_name); + if (!safeword_md5.equals(sysSafeword)) { + throw new BusinessException("资金密码错误"); + } + + this.walletService.updateExtend(walletExtend.getPartyId().toString(), coin_type, money_revise); + + // 账变日志 + MoneyLog moneyLog = new MoneyLog(); + moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_COIN); + moneyLog.setAmount_before(amount_before); + moneyLog.setAmount(money_revise); + moneyLog.setAmount_after(Arith.add(amount_before, money_revise)); + moneyLog.setPartyId(partyId); + moneyLog.setWallettype(coin_type.toUpperCase()); + moneyLog.setContent_type(Constants.MONEYLOG_CONTENT_RECHARGE); + + // 钱包日志 + WalletLog walletLog = new WalletLog(); + walletLog.setCategory(Constants.MONEYLOG_CATEGORY_RECHARGE); + walletLog.setPartyId(partyId); + walletLog.setOrder_no(""); + walletLog.setStatus(1); + walletLog.setAmount(money_revise); + // 换算成USDT单位 + walletLog.setUsdtAmount(money_revise); + walletLog.setWallettype(coin_type.toUpperCase()); + walletLogService.save(walletLog); + + // 发布一个充值审核成功的事件 +// WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); + RechargeInfo info = new RechargeInfo(); + info.setApplyUserId(partyId); + info.setOrderNo(""); + info.setWalletLogId(walletLog.getId().toString()); + info.setAmount(money_revise); + info.setEventTime(now); +// wac.publishEvent(new RechargeSuccessEvent(this, info)); + result.put("info",info); + + // 操作日志 +// Party party = this.partyService.cachePartyBy(partyId, true); + Log log = new Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(operator_name); + + // recharge--添加充值金额 + if ("recharge".equals(reset_type)) { + String coin_str= ""; + + if("USDT_DAPP".equals(coin_type)) { + coin_str="[质押账户(USDT)]"; + + PledgeOrder entity_before = this.pledgeOrderService.findByPartyId(partyId); + + if (entity_before == null) { + // TODO, ID是个写死的值合适吗? + PledgeConfig entity_config = this.pledgeConfigService.findById("2c948a827cd5f779017cd2322f5d0001"); + PledgeOrder entity = new PledgeOrder(); + + entity.setPartyId(partyId); + entity.setConfig(entity_config.getConfig()); + entity.setUsdt(entity_config.getUsdt()); + entity.setLimit_days(entity_config.getLimit_days()); + entity.setEth(entity_config.getEth()); + entity.setTitle(entity_config.getTitle()); + entity.setTitle_img(entity_config.getTitle_img()); + + entity.setContent(entity_config.getContent()); + entity.setContent_img(entity_config.getContent_img()); + entity.setApply(true); + entity.setSendtime( DateUtils.addDate(DateUtils.toDate(DateUtils.format(new Date(), DateUtils.DEFAULT_DATE_FORMAT)), entity.getLimit_days())); + entity.setApplyTime(new Date()); + +// entity.setSendtime(this.sendtime); + entity.setCreateTime(new Date()); + + this.pledgeOrderService.save(entity); + } + } + + if("USDT_USER".equals(coin_type)) { + coin_str="[用户钱包USDT映射]"; + } + + // 只有正式用户才需要记录报表 + if (null != party && Constants.SECURITY_ROLE_MEMBER.equals(party.getRolename())) { + this.userDataService.saveRechargeHandle(partyId, money_revise, coin_type); + } + + log.setLog("ip:"+ip+",管理员手动添加充值金额。修改币种["+coin_type+"]"+coin_str+",修改数量[" + money_revise + "]"); + moneyLog.setLog("管理员手动添加充值金额"); + } + + this.moneyLogService.save(moneyLog); + this.logService.saveSync(log); + } + return result; + } + + /** + * 修改余额 减少 + */ + public void saveResetCreateWithdraw(String partyId, double money_revise, String safeword, String operator_name, String reset_type, String ip, String coin_type) { + + // money_revise为负值 + if (money_revise == 0 || coin_type == "") { + return; + } + + if ("usdt".equals(coin_type)) { + // 交易所修改usdt + + Party party = this.partyService.cachePartyBy(partyId, false); +// if (party!=null&&!Constants.SECURITY_ROLE_GUEST.equals(party.getRolename())) { +// throw new BusinessException("只能修改演示账户"); +// } + + Wallet wallet = this.walletService.saveWalletByPartyId(partyId); + + int frozenState = wallet.getFrozenState(); + double amount_before = wallet.getMoney(); + + if (frozenState == 1 && reset_type.equals("withdraw")){ + amount_before = wallet.getMoneyAfterFrozen(); + } + + if (wallet.getFrozenState() == 1 && reset_type.equals("withdraw")){ + amount_before = wallet.getMoneyAfterFrozen(); + } + if (amount_before < money_revise) { + throw new BusinessException("余额不足"); + } + if (Arith.add(money_revise, amount_before) < 0.0D) { + throw new BusinessException("操作失败!修正后账户余额小于0。"); + } + + // 判断资金密码 + SecUser sec = this.secUserService.findUserByLoginName(operator_name); + String sysSafeword =sec.getSafeword(); + String safeword_md5 = this.passwordEncoder.encodePassword(safeword, operator_name); + if (!safeword_md5.equals(sysSafeword)) { + throw new BusinessException("资金密码错误"); + } + + // 账变日志 + MoneyLog moneyLog = new MoneyLog(); + + if (frozenState == 1 && reset_type.equals("withdraw")){ + moneyLog.setFreeze(1); + this.walletService.update(wallet.getPartyId().toString(), money_revise); + } else { + this.walletService.updateMoeny(wallet.getPartyId().toString(), money_revise); + } + + Boolean produceWithdraw = !"changesub".equals(reset_type); + String orderNo = DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8); + if (produceWithdraw) {//扣减彩金不生成提款订单 + //生成提现订单 + Withdraw withdraw = new Withdraw(); + withdraw.setOrder_no(orderNo); + withdraw.setPartyId(partyId); + withdraw.setVolume(Math.abs(money_revise)); + withdraw.setAddress("-"); + withdraw.setCurrency("USDT"); + withdraw.setTx(""); + withdraw.setWithdrawCommission(0D); + withdraw.setAmount(Math.abs(money_revise)); + withdraw.setArrivalAmount(Math.abs(money_revise)); + withdraw.setCreateTime(new Date()); + withdraw.setReviewTime(new Date()); + withdraw.setSucceeded(1); + this.getHibernateTemplate().save(withdraw); + } + + moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_COIN); + moneyLog.setAmount_before(amount_before); + moneyLog.setAmount(money_revise); + moneyLog.setAmount_after(Arith.add(amount_before, money_revise)); + moneyLog.setPartyId(partyId); + moneyLog.setWallettype(Constants.WALLET); + moneyLog.setContent_type(produceWithdraw?Constants.MONEYLOG_CONTENT_WITHDRAW:Constants.MONEYLOG_CONTNET_CHANGESUB); + + // 钱包日志 + WalletLog walletLog = new WalletLog(); + walletLog.setCategory(produceWithdraw?Constants.MONEYLOG_CONTENT_WITHDRAW:Constants.MONEYLOG_CONTNET_CHANGESUB); + walletLog.setPartyId(partyId); + walletLog.setStatus(1); + walletLog.setAmount(money_revise); + walletLog.setOrder_no(produceWithdraw?orderNo:""); + // 换算成USDT单位 + walletLog.setUsdtAmount(money_revise); + walletLog.setWallettype(Constants.WALLET); + this.walletLogService.save(walletLog); + + // 操作日志 + Log log = new Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(operator_name); + + // changesub----扣彩金 + if("changesub".equals(reset_type)) { + // 只有正式用户才需要记录报表 + if (null != party && Constants.SECURITY_ROLE_MEMBER.equals(party.getRolename())) { + this.userDataService.saveGiftMoneyHandle(partyId, money_revise); + } + + log.setLog("ip:"+ip+",管理员手动扣减彩金。修改币种[usdt],修改数量[" + money_revise + "]"); + moneyLog.setLog("管理员手动扣减彩金"); + moneyLog.setCategory(Constants.MONEYLOG_CONTNET_CHANGESUB); + moneyLog.setContent_type(Constants.MONEYLOG_CONTNET_CHANGESUB); + this.checkGiftUserLine(party); + } + if("withdraw".equals(reset_type)) { + if (null != party && Objects.isNull(party.getFirstWithdrawTime()) && party.getRolename().equals(Constants.SECURITY_ROLE_MEMBER)){ + debugLogger.info("->>>>>>>首次提现用户id:{}", party.getUsercode()); + party.setFirstWithdrawTime(new Date()); + partyService.update(party); + } + this.userDataService.saveWithdrawHandle(partyId, Arith.sub(0, money_revise),0,"usdt"); + log.setLog("ip:"+ip+",管理员后台手动提现金额,修改币种[usdt]," + "提现数量["+ money_revise + "]"); + moneyLog.setLog("管理员后台手动提现金额"+"["+orderNo+"]"); + } + + this.moneyLogService.save(moneyLog); + this.logService.saveSync(log); + + } else { + // 交易所修改btc、eth;DAPP修改质押账户(USDT)【USDT_DAPP】;DAPP演示用户修改DAPP余额【USDT_USER】; + + Party party = this.partyService.cachePartyBy(partyId, false); +// if (party!=null&&!Constants.SECURITY_ROLE_GUEST.equals(party.getRolename())) { +// throw new BusinessException("只能修改演示账户"); +// } + + WalletExtend walletExtend = this.walletService.saveExtendByPara(partyId, coin_type); + double amount_before = walletExtend.getAmount(); + if (walletExtend.getAmount() < money_revise) { + throw new BusinessException("余额不足"); + } + if (Arith.add(money_revise, walletExtend.getAmount()) < 0.0D) { + throw new BusinessException("操作失败!修正后["+coin_type.toUpperCase()+"]账户余额小于0。"); + } + + // 判断资金密码 + SecUser sec = this.secUserService.findUserByLoginName(operator_name); + String sysSafeword =sec.getSafeword(); + String safeword_md5 = this.passwordEncoder.encodePassword(safeword, operator_name); + if (!safeword_md5.equals(sysSafeword)) { + throw new BusinessException("资金密码错误"); + } + + // 更新金额 + this.walletService.updateExtend(walletExtend.getPartyId().toString(), coin_type, money_revise); + + // 账变日志 + MoneyLog moneyLog = new MoneyLog(); + moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_COIN); + moneyLog.setAmount_before(amount_before); + moneyLog.setAmount(money_revise); + moneyLog.setAmount_after(Arith.add(amount_before, money_revise)); + moneyLog.setPartyId(partyId); + moneyLog.setWallettype(coin_type.toUpperCase()); + moneyLog.setContent_type(Constants.MONEYLOG_CONTENT_WITHDRAW); + + // 钱包日志 + WalletLog walletLog = new WalletLog(); + walletLog.setCategory("withdraw"); + walletLog.setPartyId(partyId); + walletLog.setStatus(1); + walletLog.setAmount(money_revise); + // 换算成USDT单位 + walletLog.setUsdtAmount(money_revise); + walletLog.setWallettype(coin_type.toUpperCase()); + this.walletLogService.save(walletLog); + + SecUser SecUser = secUserService.findUserByPartyId(partyId); + + Log log = new Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(SecUser.getUsername()); + log.setOperator(operator_name); + + String coin_str= ""; + if("USDT_DAPP".equals(coin_type)) { + coin_str="[质押账户(USDT)]"; + } + if("USDT_USER".equals(coin_type)) { + coin_str="[用户钱包USDT映射]"; + } + + log.setLog("ip:"+ip+",管理员手动减少充值金额,修改币种["+coin_type+"]"+coin_str+"," + "修改数量["+ money_revise + "]"); + moneyLog.setLog("管理员手动减少充值金额"); + + this.moneyLogService.save(moneyLog); + this.logService.saveSync(log); + } + } + + /** + * 检验是否达到赠送用户的达标线 + * @param party + */ + public void checkGiftUserLine(Party party) { +// Party party = this.partyService.cachePartyBy(partyId, false); + if(!party.getGift_money_flag()) { + party.setGift_money_flag(true); + } + if(party.getGift_user()) {//已经是赠送用户则无需判定 + return; + } + Map datas = userDataService.cacheByPartyId(party.getId().toString()); + Double giftUserLine = sysparaService.find("gift_user_line").getDouble(); + String gift_user_date_start = sysparaService.find("gift_user_date_start").getValue(); + double giftMoney = giftMoney(datas, gift_user_date_start, null); + if(giftMoney>=giftUserLine) { + party.setGift_user(true); + } + } + + /** + * 时间范围内的充值总额 + * + * @param datas + * @param startTime + * @param endTime + * @return + */ + private double giftMoney(Map datas, String startTime, String endTime) { + if (datas == null || datas.isEmpty()) + return 0; + double giftMoney = 0; + for (Entry valueEntry : datas.entrySet()) { + UserData userdata = valueEntry.getValue(); + Date time = userdata.getCreateTime(); + if (!StringUtils.isNullOrEmpty(startTime)) { + Date startDate = DateUtils.toDate(startTime, DateUtils.DF_yyyyMMdd); + int intervalDays = DateUtils.getIntervalDaysByTwoDate(startDate, time);// 开始-数据时间 + if (intervalDays > 0) // 开始>数据时间 ,则过滤 + continue; + } + if (!StringUtils.isNullOrEmpty(endTime)) { + Date endDate = DateUtils.toDate(endTime, DateUtils.DF_yyyyMMdd); + int intervalDays = DateUtils.getIntervalDaysByTwoDate(endDate, time);// 结束-数据时间 + if (intervalDays < 0) // 结束<数据时间 + continue; + } + giftMoney = Arith.add(userdata.getGift_money(), giftMoney); + } + + return giftMoney; + } + + public void saveResetWithdraw(String partyId,double money_withdraw,String operator_username,String ip) { + + Party party = this.partyService.cachePartyBy(partyId,false); + double last_amount = party.getWithdraw_limit_amount(); + + party.setWithdraw_limit_amount(Arith.add(party.getWithdraw_limit_amount(), money_withdraw)); + + double after_party = party.getWithdraw_limit_amount(); + this.partyService.update(party); + + /** + * 操作日志 + */ + SecUser SecUser = secUserService.findUserByPartyId(partyId); + Log log = new Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(SecUser.getUsername()); + log.setOperator(operator_username); + log.setLog("ip:"+ip+",管理员手动修改提现限制流水。修改前数量为["+last_amount+"]," + + "修改数量为["+money_withdraw+"],修改后数量为[" + + after_party + "]。"); + + logService.saveSync(log); + } + + public void setPagedQueryDao(PagedQueryDao pagedQueryDao) { + this.pagedQueryDao = pagedQueryDao; + } + + public void setUserRecomService(UserRecomService userRecomService) { + this.userRecomService = userRecomService; + } + + public void setWalletService(WalletService walletService) { + this.walletService = walletService; + } + + public void setPartyService(PartyService partyService) { + this.partyService = partyService; + } + + public void setSecUserService(SecUserService secUserService) { + this.secUserService = secUserService; + } + + public void setRoleService(RoleService roleService) { + this.roleService = roleService; + } + + public void setMoneyLogService(MoneyLogService moneyLogService) { + this.moneyLogService = moneyLogService; + } + + public void setUserDataService(UserDataService userDataService) { + this.userDataService = userDataService; + } + + public void setUserService(UserService userService) { + this.userService = userService; + } + private String getUsercode() { + Syspara syspara = sysparaService.find("user_uid_sequence"); + int random = (int) (Math.random() * 3 + 1); + int user_uid_sequence = syspara.getInteger() + random; + syspara.setValue(user_uid_sequence); + sysparaService.update(syspara); + + String usercode = String.valueOf(user_uid_sequence); +// Party party = this.partyService.findPartyByUsercode(usercode); +// if (party != null) { +// usercode = getUsercode(); +// } + + return usercode; + } + + public void setqRGenerateService(QRGenerateService qRGenerateService) { + this.qRGenerateService = qRGenerateService; + } + + public class PosterThread implements Runnable { + String image_name; + String usercode; + + public void run() { + try { + qRGenerateService.generate_poster(image_name, usercode); + + } catch (Exception e) { + logger.error("error:", e); + } + + } + + public PosterThread(String image_name, String usercode) { + this.image_name = image_name; + this.usercode = usercode; + } + + } + + public int getUserCount(String isMember, String startTime, String endTime, String loginPartyId) { + StringBuffer queryString = new StringBuffer(); + queryString.append("SELECT COUNT(id) FROM Party WHERE 1=1 "); + Map parameters = new HashMap(); + + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + String childrensId = childrensId(loginPartyId); + if (StringUtils.isEmptyString(childrensId)) { + return 0; + } + queryString.append(" and id in("+childrensId+") "); + } + if(Constants.SECURITY_ROLE_MEMBER.equals(isMember)) { +// queryString.append("AND partyId is not null AND LENGTH(trim(partyId))!=0"); + queryString.append("AND rolename ='"+Constants.SECURITY_ROLE_MEMBER+"' "); + } + if (!StringUtils.isNullOrEmpty(startTime)) { + queryString.append(" and DATE(createTime) >=DATE(?) "); + parameters.put("startTime", startTime); + + } + if (!StringUtils.isNullOrEmpty(endTime)) { + queryString.append(" and DATE(createTime) <=DATE(?) "); + parameters.put("endTime", endTime); + } + + List find = this.getHibernateTemplate().find(queryString.toString(),parameters.values().toArray()); + return CollectionUtils.isEmpty(find)?0:find.get(0)==null?0:Integer.valueOf(find.get(0).toString()); + } + + /** + * 父类网络 + * @param partyId + * @return + */ + public List> getParentsNet(String partyId){ + List> result = new ArrayList>(); + Map data = new HashMap(); + Party party = partyService.cachePartyBy(partyId, false); + data.put("username", party.getUsername()); + data.put("usercode", party.getUsercode()); + data.put("rolename", party.getRolename()); + data.put("kyc_authority", party.getKyc_authority()); + result.add(data); + List parents = userRecomService.getParents(partyId); + for(UserRecom recom:parents) { + data = new HashMap(); + Party parent = partyService.cachePartyBy(recom.getReco_id().toString(), false); + data.put("username", parent.getUsername()); + data.put("usercode", parent.getUsercode()); + data.put("rolename", parent.getRolename()); + data.put("kyc_authority", party.getKyc_authority()); + result.add(data); + } + Collections.reverse(result); + return result; + } + + @Override + public void saveUserAddress(MallAddress mallAddress) { + getHibernateTemplate().save(mallAddress); + } + + @Override + public void updateUserAddress(MallAddress mallAddress) { + getHibernateTemplate().update(mallAddress); + } + + @Override + public void saveImport(String username, String password, boolean login_authority, boolean enabled, String remarks, + String operatorUsername,String ip,String parents_usercode,double money) { + /** + * 用户code + */ + String usercode = getUsercode(); + + if (!StringUtils.isNullOrEmpty(parents_usercode)) { + Party party_parents=partyService.findPartyByUsercode(parents_usercode); + if (party_parents==null ) { + throw new BusinessException("推荐码不正确"); + } + } + + + /** + * party + */ + Party party = new Party(); + if (username.contains("@")) { + // 认为是基于邮箱注册账号 + party.setEmail(username); + } else { + party.setPhone(username); + } + int avatar_num = (1 + new Random().nextInt(19)); + + party.setUsername(username.replace(" ", "").trim()); + party.setLogin_authority(login_authority); + party.setEnabled(enabled); + party.setRemarks(remarks); + party.setUsercode(usercode); + party.setUser_level(1); + party.setAvatar(String.valueOf(avatar_num)); + party.setChatAudit(1); + + party.setSafeword(passwordEncoder.encodePassword("000000", SaltSigureUtils.saltfigure)); + + party.setRolename(Constants.SECURITY_ROLE_GUEST); + + party.setAutoComment(true); + + party = partyService.save(party); + + if (!StringUtils.isNullOrEmpty(parents_usercode)) { + Party party_parents=partyService.findPartyByUsercode(parents_usercode); + if (party_parents==null ) { + throw new BusinessException("推荐码不正确"); + } + UserRecom userRecom = new UserRecom(); + userRecom.setPartyId(party.getId()); + userRecom.setReco_id(party_parents.getId().toString());// 父类partyId + this.userRecomService.save(userRecom); + } + + + /** + * SecUser + */ + Role role = this.roleService.findRoleByName(Constants.SECURITY_ROLE_GUEST); + + SecUser secUser = new SecUser(); + secUser.setPartyId(String.valueOf(party.getId())); + secUser.getRoles().add(role); + + if (username.contains("@")) { + // 认为是基于邮箱注册账号 + secUser.setUsername(username); + } else { + secUser.setUsername(username.replace(" ", "").trim()); + } + secUser.setPassword(password.trim()); + secUser.setEnabled(login_authority); + + this.secUserService.saveUser(secUser); + + /** + * usdt账户 + */ + Wallet wallet = new Wallet(); + wallet.setPartyId(party.getId().toString()); + wallet.setMoney(money); + this.walletService.save(wallet); + + User user = new User(); + user.setPartyId(party.getId()); + this.getHibernateTemplate().save(user); + + project.log.Log log = new project.log.Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(operatorUsername); + log.setLog("ip:"+ip+",管理员手动新增了演示用户:"+username); + logService.saveSync(log); + } + + @Override + public void updateUserName(String partyId, String userName, String password, String registerType, String phone, String usernameLogin, String loginSafeword) { + Party party = this.partyService.cachePartyBy(partyId, false); + String username = party.getUsername(); + if (null == party){ + throw new BusinessException("用户不存在"); + } + + SecUser sec = this.secUserService.findUserByLoginName(usernameLogin); + String sysSafeword =sec.getSafeword(); + + String safeword_md5 = this.passwordEncoder.encodePassword(loginSafeword, usernameLogin); + if (!safeword_md5.equals(sysSafeword)) { + throw new BusinessException("登录人资金密码错误"); + } + String platformName = sysparaService.find("platform_name").getValue(); + party.setUsername(userName); + if (Objects.equals(registerType,"phone")){ + party.setPhone(phone); + party.setPhone_authority(false); + } else { + party.setEmail(userName); + party.setEmail_authority(false); + } + + //定制盘 9/6 手机号与邮箱都是认证状态 + if (null != platformName && Objects.equals(platformName, PlatformNameEnum.JUST_SHOP.getDescription())){ + party.setPhone_authority(true); + party.setEmail_authority(true); + } + + SecUser db = secUserService.findUserByLoginName(userName); + if (null != db) { + throw new BusinessException("用户名称已存在"); + } + + party.setSafeword(passwordEncoder.encodePassword("000000", SaltSigureUtils.saltfigure)); + debugLogger.info("->>>>>>>party:{}", JSON.toJSONString(party)); + partyService.update(party); + redisHandler.remove(PartyRedisKeys.PARTY_USERNAME + username); + + secUserService.updateSecUser(username,userName,password); + + project.log.Log log = new project.log.Log(); + log.setCategory(Constants.LOG_CATEGORY_OPERATION); + log.setUsername(party.getUsername()); + log.setOperator(usernameLogin); + String content = MessageFormat.format("管理员手动修改用户名称,修改类型:{0},修改前账号:{1},修改后账号:{2}", registerType, username, userName); + log.setLog(content); + logService.saveSync(log); + } + + @Override + public MallAddress findUserAddressById(String id) { + return (MallAddress) getHibernateTemplate().get(MallAddress.class, id); + } +// public Withdraw get(String id) { +// return this.getHibernateTemplate().get(Withdraw.class, id); +// } + + public void setLogService(LogService logService) { + this.logService = logService; + } + + public void setPasswordEncoder(PasswordEncoder passwordEncoder) { + this.passwordEncoder = passwordEncoder; + } + + public void setSysparaService(SysparaService sysparaService) { + this.sysparaService = sysparaService; + } + +// +// public void setWithdrawService(WithdrawService withdrawService) { +// this.withdrawService = withdrawService; +// } + + public void setWalletLogService(WalletLogService walletLogService) { + this.walletLogService = walletLogService; + } + + + private String childrensId(String loginPartyId) { + String childrensId = ""; + if (!StringUtils.isNullOrEmpty(loginPartyId)) { + List children = this.userRecomService.findChildren(loginPartyId); + if (children.size() == 0) { + return null; + } + List ids = new LinkedList(); + for(String p:children) { + ids.add("'"+p+"'"); + } + childrensId = String.join(",", ids); + } + return childrensId; + } + + + + public void setDataService(DataService dataService) { + this.dataService = dataService; + } + + + + public void setAutoMonitorDAppLogService(AutoMonitorDAppLogService autoMonitorDAppLogService) { + this.autoMonitorDAppLogService = autoMonitorDAppLogService; + } + + + + public void setPledgeOrderService(PledgeOrderService pledgeOrderService) { + this.pledgeOrderService = pledgeOrderService; + } + + + + public void setPledgeConfigService(PledgeConfigService pledgeConfigService) { + this.pledgeConfigService = pledgeConfigService; + } + + public void setRedisHandler(RedisHandler redisHandler) { + this.redisHandler = redisHandler; + } + +} diff --git a/admin/src/main/java/project/web/admin/service/email/AdminEmailCodeService.java b/admin/src/main/java/project/web/admin/service/email/AdminEmailCodeService.java new file mode 100755 index 0000000..8a9fa40 --- /dev/null +++ b/admin/src/main/java/project/web/admin/service/email/AdminEmailCodeService.java @@ -0,0 +1,28 @@ +package project.web.admin.service.email; + +public interface AdminEmailCodeService { + /** + * 发送验证码 + * @param ip + * @param operatorUsername 操作人 + * @param context 操作内容 + * @param isSuper true:超级签,false:个人签 + */ + public void sendCode(String ip,String operatorUsername,String context,boolean isSuper) ; + /** + * 验证邮箱 + * @param ip + * @param operatorUsername + * @param code + * @param uri + */ + public void updateCheckCode(String ip, String operatorUsername, String code, String uri); + /** + * 谷歌验证 + * @param ip + * @param operatorUsername + * @param googleAuthCode + * @param uri + */ + public void updateCheckGoogleAuthCode(String ip, String operatorUsername, String googleAuthCode, String uri); +} diff --git a/admin/src/main/java/project/web/admin/service/report/AdminAgentAllStatisticsService.java b/admin/src/main/java/project/web/admin/service/report/AdminAgentAllStatisticsService.java new file mode 100755 index 0000000..42deeab --- /dev/null +++ b/admin/src/main/java/project/web/admin/service/report/AdminAgentAllStatisticsService.java @@ -0,0 +1,18 @@ +package project.web.admin.service.report; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import kernel.web.Page; + +public interface AdminAgentAllStatisticsService { + + public Page pagedQuery(int pageNo, int pageSize,String startTime,String endTime,String loginPartyId,String usernameOrUid,String roleName,String targetPartyId, String allPartyId); + + public String loadExportData(HttpServletResponse response, int pageSize,String startTime,String endTime,String loginPartyId,String usernameOrUid,String roleName,String targetPartyId) throws IOException; + + public List getRecoNumNetList(String partyId); +} diff --git a/admin/src/main/java/project/web/admin/service/report/AdminAllStatisticsService.java b/admin/src/main/java/project/web/admin/service/report/AdminAllStatisticsService.java new file mode 100755 index 0000000..9c8dc5f --- /dev/null +++ b/admin/src/main/java/project/web/admin/service/report/AdminAllStatisticsService.java @@ -0,0 +1,33 @@ +package project.web.admin.service.report; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import kernel.web.Page; + +public interface AdminAllStatisticsService { + + public Page pagedQuery(int pageNo, int pageSize,String startTime,String endTime,String loginPartyId); + + public String loadExportData(HttpServletResponse response, int pageSize,String startTime,String endTime,String loginPartyId) throws IOException; + + + /** + * 总数据 + * @param startTime + * @param endTime + * @return + */ + public Map sumDatas(String startTime,String endTime,String loginPartyId); + + /** + * 统计某天数据 + * @param loginPartyId + * @param day + * @return + */ + public Map daySumData(String loginPartyId,String day); +} diff --git a/admin/src/main/java/project/web/admin/service/report/AdminUserAllStatisticsService.java b/admin/src/main/java/project/web/admin/service/report/AdminUserAllStatisticsService.java new file mode 100755 index 0000000..768ea8c --- /dev/null +++ b/admin/src/main/java/project/web/admin/service/report/AdminUserAllStatisticsService.java @@ -0,0 +1,46 @@ +package project.web.admin.service.report; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import kernel.web.Page; + +public interface AdminUserAllStatisticsService { + + public Page pagedQuery(int pageNo, int pageSize,String startTime,String endTime,String loginPartyId,String usernameOrUid,String roleName,String targetPartyId,boolean isAgentView,String sortColumn,String sortType); + + public Page exchangePagedQuery(int pageNo, int pageSize,String startTime,String endTime,String loginPartyId,String usernameOrUid,String roleName,String targetPartyId, + boolean isAgentView,String sortColumn,String sortType, String sellerId ,String sellerName, String all_para_party_id); + + /** + * 无代理商推荐的用户报表 + * @param pageNo + * @param pageSize + * @param startTime + * @param endTime + * @param loginPartyId + * @param usernameOrUid + * @param roleName + * @param targetPartyId + * @param isAgentView + * @return + */ + public Page pagedQueryNoAgentParent(int pageNo, int pageSize,String startTime,String endTime,String loginPartyId,String usernameOrUid,String roleName,String targetPartyId,boolean isAgentView,String sortColumn,String sortType); + + public String loadExportData(HttpServletResponse response, int pageSize,String startTime,String endTime,String loginPartyId,String usernameOrUid,String roleName,String targetPartyId,boolean isAgentView,String sortColumn,String sortType) throws IOException; + + public List> getWalletExtends(String loginPartyId,String targetPartyId); + + /** + * 获取用户资产 + * @param loginPartyId + * @param targetPartyId + * @return + */ + public List> getAssetsAll(String loginPartyId,String targetPartyId); + + Map queryWillIncomeBySellerIds(List sellerIds , String startTime , String endTime); +} diff --git a/admin/src/main/java/project/web/admin/service/report/AdminUserMoneyStatisticsService.java b/admin/src/main/java/project/web/admin/service/report/AdminUserMoneyStatisticsService.java new file mode 100755 index 0000000..74bdca4 --- /dev/null +++ b/admin/src/main/java/project/web/admin/service/report/AdminUserMoneyStatisticsService.java @@ -0,0 +1,23 @@ +package project.web.admin.service.report; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +public interface AdminUserMoneyStatisticsService { + + public List> getAll(String loginPartyId); + + public Map totleDatas(List> list); + + public String loadExportData(HttpServletResponse response,String loginPartyId) throws IOException; + + /** + * 获取钱包总金额 + * @param loginPartyId 查看下级所有的 + * @return + */ + public double getSumWalletByMember(String loginPartyId); +} diff --git a/admin/src/main/java/project/web/admin/service/user/AdminAgentService.java b/admin/src/main/java/project/web/admin/service/user/AdminAgentService.java new file mode 100755 index 0000000..fb49ee5 --- /dev/null +++ b/admin/src/main/java/project/web/admin/service/user/AdminAgentService.java @@ -0,0 +1,45 @@ +package project.web.admin.service.user; + +import java.io.Serializable; +import java.util.List; + +import kernel.web.Page; +import project.user.Agent; + + +public interface AdminAgentService { + + /** + * 代理分页查询 + * + */ + public Page pagedQuery(int pageNo, int pageSize, String name_para, String checkedPartyId); + /** + * 切换视图查询 + */ + public Page pagedQueryNetwork(int pageNo, int pageSize,String loginPartyId,String usernameOrUid,String roleName,String targetPartyId); + + + /** + * + * @param loginPartyId + * @param checkedPartyId + * @param url + */ + public List findAgentNodes(String loginPartyId, String checkedPartyId, String url); + + /** + * 代理注册 + */ + public void save(String name, String username, String password,boolean login_authority, String remarks, String parents_usercode,boolean opera_authority); + + public void update(String id,String name,boolean login_authority, String remarks,boolean opera_authority); + /** + * 修改代理商关系 + */ + public void update(Agent agent); + + public Agent findByPartyId(Serializable partyId); + + public Agent get(String id); +} diff --git a/admin/src/main/java/project/web/admin/service/user/AdminPublicUserService.java b/admin/src/main/java/project/web/admin/service/user/AdminPublicUserService.java new file mode 100755 index 0000000..25ee97c --- /dev/null +++ b/admin/src/main/java/project/web/admin/service/user/AdminPublicUserService.java @@ -0,0 +1,17 @@ +package project.web.admin.service.user; + +/** + *用户的公共服务, + * + */ +public interface AdminPublicUserService { + /** + * 修改密码,会验证旧密码 + */ + public void saveChangePassword(String partyId,String oldpassword,String password,String username,String safeword,String code,String googleAuthCode); + + /** + * 修改资金密码,会验证旧密码 + */ + public void saveChangeSafeword(String partyId,String oldpassword,String password,String username,String code,String googleAuthCode); +} \ No newline at end of file diff --git a/admin/src/main/java/project/web/admin/service/user/AdminUserRecomService.java b/admin/src/main/java/project/web/admin/service/user/AdminUserRecomService.java new file mode 100755 index 0000000..d23d51f --- /dev/null +++ b/admin/src/main/java/project/web/admin/service/user/AdminUserRecomService.java @@ -0,0 +1,18 @@ +package project.web.admin.service.user; + +import kernel.web.Page; +import project.party.model.UserRecom; + +public interface AdminUserRecomService { + + public Page pagedQuery(int pageNo, int pageSize, String usernameOrUid,String parentUsername,String login_partyId); + + public UserRecom get(String id); + + /** + * 被修改用户partyId + * 修改后的推荐人reco_username + * 操作者用户名operator + */ + public void update(String partyId, String reco_username,String operator_name,String ip,String loginSafeword); +} diff --git a/admin/src/main/java/project/web/admin/service/user/AdminUserService.java b/admin/src/main/java/project/web/admin/service/user/AdminUserService.java new file mode 100755 index 0000000..7946762 --- /dev/null +++ b/admin/src/main/java/project/web/admin/service/user/AdminUserService.java @@ -0,0 +1,93 @@ +package project.web.admin.service.user; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import kernel.web.Page; +import project.mall.orders.model.MallAddress; +import project.mall.user.UserGuest; + +public interface AdminUserService { + + /** + * 用户基础管理 + */ + public Page pagedQuery(int pageNo, int pageSize, String name_para, String rolename, String checkedPartyId, Boolean online, String loginIp_para, String phone, String agentPartyId); + + /** + * DAPP_用户管理 + */ + public Page pagedDappQuery(int pageNo, int pageSize, String name_para, String rolename, String checkedPartyId, Boolean online, String loginIp_para); + + /** + * 交易所_用户管理 + */ + public Page pagedExchangeQuery(int pageNo, int pageSize, String name_para, String rolename, String checkedPartyId, Boolean online, String loginIp_para); + + /** + * 演示用户注册 + */ + public void save(String username, String password,boolean login_authority, boolean enabled,String remarks,String operatorUsername,String ip,String parents_usercode, String phone, boolean autoComment); + + void insert(String username, String password, boolean loginAuthority, boolean enabled, String remarks, String usernameLogin, String ip, String parentsUsercode, String phone, boolean autoComment); + + public void update(String partyId,boolean login_authority, boolean enabled, boolean withdraw_authority, String remarks,String operatorUsername,String ip); + /** + * 修改余额 + */ + public void saveReset(String partyId,double money_revise); + /** + * 修改余额 有创建订单 + * + * coin_type 修改币种 + */ + public Map saveResetCreateOrder(String partyId,double money_revise,String safeword,String operator_partyId,String reset_type,String ip,String coin_type); + + /** + * 增加ETH矿机收益 + * + * coin_type 修改币种 + */ + public void saveResetEthMining(String partyId,double money_revise,String safeword,String operator_partyId,String reset_type,String ip,String coin_type, Date create_time); + + + + /** + * 统计时间段内的用户增量 + * @param isMember + * @param startTime + * @param endTime + * @return + */ + public int getUserCount(String isMember, String startTime, String endTime, String loginPartyId) ; + + /** + * 修改余额 创建提现订单 + */ + public void saveResetCreateWithdraw(String partyId,double money_revise,String safeword,String operator_partyId,String reset_type,String ip,String coin_type); + + /** + * 修改可提现额度 + */ + public void saveResetWithdraw(String partyId,double money_withdraw,String operator_username,String ip); + + /** + * 父类网络 + * @param partyId + * @return + */ + public List> getParentsNet(String partyId); + + MallAddress findUserAddressById(String id); + + void saveUserAddress(MallAddress mallAddress); + + void updateUserAddress(MallAddress mallAddress); + + void saveImport(String username, String password,boolean login_authority, boolean enabled, String remarks, + String operatorUsername,String ip,String parents_usercode, double money); + + void updateUserName(String partyId, String userName, String password, String registerType, String phone, String usernameLogin, String loginSafeword); + +} diff --git a/admin/src/main/java/project/web/admin/service/user/AgentNodes.java b/admin/src/main/java/project/web/admin/service/user/AgentNodes.java new file mode 100755 index 0000000..4104211 --- /dev/null +++ b/admin/src/main/java/project/web/admin/service/user/AgentNodes.java @@ -0,0 +1,72 @@ +package project.web.admin.service.user; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public class AgentNodes implements Serializable { + private static final long serialVersionUID = -279469351490108330L; + private String tags; + private String text; + private String href; + private String backColor; + private String color; + private Map state; + private List nodes; + + public String getTags() { + return this.tags; + } + + public void setTags(String tags) { + this.tags = tags; + } + + public String getText() { + return this.text; + } + + public void setText(String text) { + this.text = text; + } + + public String getHref() { + return this.href; + } + + public void setHref(String href) { + this.href = href; + } + + public List getNodes() { + return this.nodes; + } + + public void setNodes(List nodes) { + this.nodes = nodes; + } + + public String getBackColor() { + return this.backColor; + } + + public void setBackColor(String backColor) { + this.backColor = backColor; + } + + public String getColor() { + return this.color; + } + + public void setColor(String color) { + this.color = color; + } + + public Map getState() { + return this.state; + } + + public void setState(Map state) { + this.state = state; + } +} diff --git a/admin/src/main/java/project/web/admin/util/AliOssUtil.java b/admin/src/main/java/project/web/admin/util/AliOssUtil.java new file mode 100755 index 0000000..53fb795 --- /dev/null +++ b/admin/src/main/java/project/web/admin/util/AliOssUtil.java @@ -0,0 +1,98 @@ +package project.web.admin.util; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.Bucket; +import com.aliyun.oss.model.CreateBucketRequest; +import com.aliyun.oss.model.PutObjectRequest; +import com.aliyun.oss.model.PutObjectResult; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.PostConstruct; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; +import java.util.UUID; + +public class AliOssUtil { + + private static String endpoint = "https://oss-cn-beijing.aliyuncs.com"; + private static String accessKeyId = "LTAI5tNPmxxfqdHFYU9UZryh"; + + private static String accessKeySecret = "wWo0Qh2gYO2MTFn7VimvMFrsrFenx0"; + + private static String bucketName = "shop-home"; + private static OSS client; + + + + /** + * 实现上传图片到OSS + */ + public static String uploadImg(MultipartFile multipartFile) throws IOException { + + // 获取上传的文件的输入流 + InputStream inputStream = multipartFile.getInputStream(); + // 避免文件覆盖 + String originalFilename = multipartFile.getOriginalFilename(); + String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf(".")); + //上传文件到 OSS + OSS client = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + client.putObject(bucketName, fileName, inputStream); + //文件访问路径 + String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName; + // 关闭ossClient + client.shutdown(); + return url;// 把上传到oss的路径返回 + } + + + /** + * 创建储存空间名称 + * @param name 创建存储空间名称 + * @return + */ + public static boolean create(String name) { + CreateBucketRequest createBucketRequest = new CreateBucketRequest(name); + Bucket bucket = client.createBucket(createBucketRequest); + return bucket!=null; + } + + /** + * 实现文件上传 + * @param bucket 存储空间名称 + * @param obj 存储对象名称,带文件后缀 + * @param data 文件内容 + * @return + */ + public static boolean upload(String bucket,String obj, byte[] data) { + PutObjectRequest request = new PutObjectRequest(bucket, obj, new ByteArrayInputStream(data)); + request.setProcess("true"); + PutObjectResult result=client.putObject(request); + return result.getResponse().getStatusCode()==200; + } + + /** + * 创建访问链接 + * @param bucket 存储空间名称 + * @param obj 存储对象名称,带文件名后缀 + * @param etime 访问地址的失效时间 + * @return 访问地址 + */ + public static String createUrl(String bucket, String obj, Date etime){ + return client.generatePresignedUrl(bucket, obj, etime).toString(); + } + + /** + * 删除文件 + * @param bucket 存储空间名称 + * @param obj 存储对象名称,带文件后缀 + */ + public static void deFile(String bucket,String obj){ + client.deleteObject(bucket, obj); + } + + +} diff --git a/admin/src/main/resources/logback.xml b/admin/src/main/resources/logback.xml new file mode 100755 index 0000000..f6f811a --- /dev/null +++ b/admin/src/main/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-activity.xml b/admin/src/main/resources/spring/applicationContext-activity.xml new file mode 100755 index 0000000..73987c7 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-activity.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-auto_monitor_activity_admin.xml b/admin/src/main/resources/spring/applicationContext-auto_monitor_activity_admin.xml new file mode 100755 index 0000000..5e22e6a --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-auto_monitor_activity_admin.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-auto_monitor_admin.xml b/admin/src/main/resources/spring/applicationContext-auto_monitor_admin.xml new file mode 100755 index 0000000..9364b4e --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-auto_monitor_admin.xml @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-auto_monitor_pledge_admin.xml b/admin/src/main/resources/spring/applicationContext-auto_monitor_pledge_admin.xml new file mode 100755 index 0000000..c73c000 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-auto_monitor_pledge_admin.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-auto_monitor_report_admin.xml b/admin/src/main/resources/spring/applicationContext-auto_monitor_report_admin.xml new file mode 100755 index 0000000..ba47d66 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-auto_monitor_report_admin.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-auto_monitor_withdraw_admin.xml b/admin/src/main/resources/spring/applicationContext-auto_monitor_withdraw_admin.xml new file mode 100755 index 0000000..d70db67 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-auto_monitor_withdraw_admin.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-cms_admin.xml b/admin/src/main/resources/spring/applicationContext-cms_admin.xml new file mode 100755 index 0000000..10b201d --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-cms_admin.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-contract_admin.xml b/admin/src/main/resources/spring/applicationContext-contract_admin.xml new file mode 100755 index 0000000..a95774f --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-contract_admin.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-ddos_admin.xml b/admin/src/main/resources/spring/applicationContext-ddos_admin.xml new file mode 100755 index 0000000..3ce6c82 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-ddos_admin.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-dubbo.xml b/admin/src/main/resources/spring/applicationContext-dubbo.xml new file mode 100755 index 0000000..01fee7b --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-dubbo.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-exchange_admin.xml b/admin/src/main/resources/spring/applicationContext-exchange_admin.xml new file mode 100755 index 0000000..fd86c02 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-exchange_admin.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-finance_admin.xml b/admin/src/main/resources/spring/applicationContext-finance_admin.xml new file mode 100755 index 0000000..534dae1 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-finance_admin.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-futures_admin.xml b/admin/src/main/resources/spring/applicationContext-futures_admin.xml new file mode 100755 index 0000000..1364226 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-futures_admin.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-hobi_admin.xml b/admin/src/main/resources/spring/applicationContext-hobi_admin.xml new file mode 100755 index 0000000..ca3b026 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-hobi_admin.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-invest_admin.xml b/admin/src/main/resources/spring/applicationContext-invest_admin.xml new file mode 100755 index 0000000..ed3a49d --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-invest_admin.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-item_admin.xml b/admin/src/main/resources/spring/applicationContext-item_admin.xml new file mode 100755 index 0000000..0a8cfbd --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-item_admin.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-kernel.xml b/admin/src/main/resources/spring/applicationContext-kernel.xml new file mode 100755 index 0000000..e6924c1 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-kernel.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + /config/system + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-log.xml b/admin/src/main/resources/spring/applicationContext-log.xml new file mode 100755 index 0000000..f24c286 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-log.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-lottery.xml b/admin/src/main/resources/spring/applicationContext-lottery.xml new file mode 100755 index 0000000..7b751ce --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-lottery.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-mall_admin.xml b/admin/src/main/resources/spring/applicationContext-mall_admin.xml new file mode 100755 index 0000000..f5e07a2 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-mall_admin.xml @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-miner_admin.xml b/admin/src/main/resources/spring/applicationContext-miner_admin.xml new file mode 100755 index 0000000..e626aea --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-miner_admin.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-news_admin.xml b/admin/src/main/resources/spring/applicationContext-news_admin.xml new file mode 100755 index 0000000..49f9ed0 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-news_admin.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-notification_admin.xml b/admin/src/main/resources/spring/applicationContext-notification_admin.xml new file mode 100755 index 0000000..5820d7d --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-notification_admin.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-party.xml b/admin/src/main/resources/spring/applicationContext-party.xml new file mode 100755 index 0000000..b5a5f3f --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-party.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-recharge_blockchain_admin.xml b/admin/src/main/resources/spring/applicationContext-recharge_blockchain_admin.xml new file mode 100755 index 0000000..38746d1 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-recharge_blockchain_admin.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-redis.xml b/admin/src/main/resources/spring/applicationContext-redis.xml new file mode 100755 index 0000000..d285a5e --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-redis.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-report_admin.xml b/admin/src/main/resources/spring/applicationContext-report_admin.xml new file mode 100755 index 0000000..b99d6b2 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-report_admin.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-security.xml b/admin/src/main/resources/spring/applicationContext-security.xml new file mode 100755 index 0000000..9b746fb --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-security.xml @@ -0,0 +1,88 @@ + + + + SpringSecurity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-security_systemuser_admin.xml b/admin/src/main/resources/spring/applicationContext-security_systemuser_admin.xml new file mode 100755 index 0000000..f5c008b --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-security_systemuser_admin.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-service.xml b/admin/src/main/resources/spring/applicationContext-service.xml new file mode 100755 index 0000000..740b13b --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-service.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-sku.xml b/admin/src/main/resources/spring/applicationContext-sku.xml new file mode 100755 index 0000000..9b1fc7a --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-sku.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-syspara.xml b/admin/src/main/resources/spring/applicationContext-syspara.xml new file mode 100755 index 0000000..93e0f66 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-syspara.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-tip_admin.xml b/admin/src/main/resources/spring/applicationContext-tip_admin.xml new file mode 100755 index 0000000..c19c207 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-tip_admin.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/spring/applicationContext-user_admin.xml b/admin/src/main/resources/spring/applicationContext-user_admin.xml new file mode 100755 index 0000000..edacfe5 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-user_admin.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-wallet_admin.xml b/admin/src/main/resources/spring/applicationContext-wallet_admin.xml new file mode 100755 index 0000000..7fcf270 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-wallet_admin.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext-withdraw_admin.xml b/admin/src/main/resources/spring/applicationContext-withdraw_admin.xml new file mode 100755 index 0000000..9265313 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext-withdraw_admin.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/applicationContext.xml b/admin/src/main/resources/spring/applicationContext.xml new file mode 100755 index 0000000..83a5f64 --- /dev/null +++ b/admin/src/main/resources/spring/applicationContext.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${hibernate.dialect} + false + false + + + + + classpath:/project + classpath:/security + classpath:/systemuser + + + + + + + + + + + + + + + + + + PROPAGATION_REQUIRED + PROPAGATION_REQUIRED + PROPAGATION_REQUIRED + + PROPAGATION_REQUIRED + PROPAGATION_REQUIRED + PROPAGATION_REQUIRED + + PROPAGATION_REQUIRED + PROPAGATION_REQUIRED + + PROPAGATION_REQUIRED,readOnly + PROPAGATION_REQUIRED,readOnly + PROPAGATION_REQUIRED,readOnly + PROPAGATION_REQUIRED,readOnly + PROPAGATION_REQUIRED,readOnly + PROPAGATION_REQUIRED,readOnly + + + + + + + + + + transactionMethodFragmentFun + + partyService + registerService + + + adminWithdrawOrderService + adminRechargeOrderService + + walletService + walletLogService + exchangeRateService + + + adminSymbolsService + platformService + adminGoodsService + adminExpertService + adminGoodsBuyService + adminProjectService + adminCategoryService + adminMallBannerService + adminComboService + adminMallCountryService + mallAddressAreaService + adminSubscribeService + adminMallGoodsService + goodsAttributeCategoryService + goodsAttributeService + adminSystemCommentService + adminSellerService + adminMallLoanConfigService + sellerService + sellerCreditService + creditService + adminVipService + adminProjectTypeService + brushOrdersService + walletDayService + adminBrushOrderService + adminContractSymbolsService + dataService + + + adminItemService + focusSellerService + adminItemLeverageService + adminAgentService + adminUserService + adminOrderService + adminMallOrderService + goodsOrdersService + adminExchangeOrderService + adminMyDataService + adminUserDataService + adminPublicUserService + adminLogService + adminRechargeOrderService + adminMarketQuotationsService + adminSystemUserService + adminSysUserNotifyConfigService + resourceMappingService + adminUserRecomService + adminEmailCodeService + userService + kycService + kycHighLevelService + googleAuthService + + + adminKycService + adminKycHighLevelService + + + + + adminRechargeBlockchainOrderService + adminChannelBlockchainService + + + adminCmsService + adminBannerService + + adminAllStatisticsService + adminMoneyInOutStatisticsService + adminContractOrderStatisticsService + adminExchangeOrderStatisticsService + adminUserMoneyStatisticsService + adminUserAddStatisticsService + adminUserAllStatisticsService + adminFuturesOrderStatisticsService + adminFinanceStatisticsService + adminAgentAllStatisticsService + + + adminNewsService + + + exchangeApplyOrderService + + adminRoleAuthorityService + + adminMinerOrderService + adminMinerService + minerService + minerOrderService + + + adminFundService + adminFundOrderService + adminFundManagerService + + + adminContractOrderService + adminContractApplyOrderService + adminMarketQuotationsService + contractOrderService + contractApplyOrderService + + sysparaService + + + + informationService + adminInformationService + + userSafewordApplyService + adminUserSafewordApplyService + + autoMonitorWalletService + autoMonitorOrderService + adminMiningConfigService + adminActivityService + autoMonitorPoolDataService + + pledgeConfigService + pledgeGalaxyOrderService + adminPledgeGalaxyProfitService + + secUserService + userRateConfigService + onlineChatUserMessageService + + + userDataService + tokenService + adminDAppUserService + autoMonitorTipService + activityOrderService + pledgeOrderService + adminAutoMonitorWithdrawService + onlineChatMessageService + + userRecomService + adminIpMenuService + autoMonitorAddressConfigService + logService + adminAutoMonitorSettleAddressConfigService + adminAutoMonitorPoolDataService + roleService + adminChannelBlockchainService + channelBlockchainService + adminWithdrawService + assetService + contractOrderService + rechargeBlockchainService + moneyLogService + adminContractManageService + futuresOrderService + profitAndLossConfigService + adminFuturesOrderService + pledgeGalaxyConfigService + financeOrderService + financeService + + + notificationService + notificationTemplateService + moneyFreezeService + goodsAttributeCategoryService + goodsAttributeService + evaluationService + goodsAttributeValueService + activityService + adminActivityOrderService + + + userMetricsService + goodsSkuAtrributionService + + + lotteryReceiveService + lotteryRecordService + activityUserPointsService + + activityLibraryService + ActivityConfigLogService + activityPrizePoolService + activityPrizeService + activityPrizeLogService + activityTemplateService + activityUserJoinLogService + activityUserService + activityUserPointsService + activityUserPointsLogService + + + + + transactionInterceptor + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/spring/spring-mvc.xml b/admin/src/main/resources/spring/spring-mvc.xml new file mode 100755 index 0000000..1175f25 --- /dev/null +++ b/admin/src/main/resources/spring/spring-mvc.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/.jsp b/admin/src/main/webapp/.jsp new file mode 100755 index 0000000..3a87db1 --- /dev/null +++ b/admin/src/main/webapp/.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" pageEncoding="utf-8"%> +<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%> + <%@ include file="include/basePath.jsp"%> +<%@ page language="java" import="security.*"%> + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/WEB-INF/web.xml b/admin/src/main/webapp/WEB-INF/web.xml new file mode 100755 index 0000000..7fa44b1 --- /dev/null +++ b/admin/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,117 @@ + + + + + login.jsp + + + + + contextConfigLocation + + classpath*:spring/*.xml + + + + + spring + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + + classpath:spring/spring-mvc.xml + + + 1 + + + + spring + / + + + + + + org.springframework.web.context.ContextLoaderListener + + + + + encodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + encodingFilter + /* + + + + + AllRequestFilter + project.web.admin.filter.AllRequestFilter + + + + AllRequestFilter + /* + + + + + urlResourceFilterInvocation + security.filter.UrlResourceFilterInvocation + + + + urlResourceFilterInvocation + /* + + + + + DruidStatView + com.alibaba.druid.support.http.StatViewServlet + + + DruidStatView + /druid/* + + + + DruidWebStatFilter + com.alibaba.druid.support.http.WebStatFilter + + exclusions + *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/* + + + profileEnable + true + + + principalCookieName + USER_COOKIE + + + principalSessionName + USER_SESSION + + + + DruidWebStatFilter + /* + + + \ No newline at end of file diff --git a/admin/src/main/webapp/activity_lottery_receive.jsp b/admin/src/main/webapp/activity_lottery_receive.jsp new file mode 100755 index 0000000..86d3111 --- /dev/null +++ b/admin/src/main/webapp/activity_lottery_receive.jsp @@ -0,0 +1,431 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

彩金审核

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+
+ + + + +
+ + +
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + +<%-- --%> + + + + + + + + + + + + + + + + + + + + + + + +
账号会员ID手机号邮箱店铺名称活动类型奖品类型奖品价值推荐人是否派发领取时间派发时间操作人备注
${item.partyName}${item.userCode}${item.phone}${item.email}${item.sellerName}${item.lotteryName}彩金${item.prizeAmount}${item.agentName} + + + 未派发 + + + 已派发 + + + ${item.applyTime} + + + -- + + + ${item.issueTime} + + + ${item.createUser}${item.remark} + + + + 派发 + + + +
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + <%@ include file="include/footer.jsp"%> + +
+ + +
+ +
+ + + + + +
+ + +
+ +
+ +
+ + + + + <%@ include file="include/js.jsp"%> + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_attrbute_add.jsp b/admin/src/main/webapp/admin_attrbute_add.jsp new file mode 100755 index 0000000..2083f25 --- /dev/null +++ b/admin/src/main/webapp/admin_attrbute_add.jsp @@ -0,0 +1,228 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+

属性规格

+ <%@ include file="include/alert.jsp"%> + + +
+ + + +
+ + +
+
+
+ +
+ 添加中文属性规格 +
    +
  • +
  • +
+
+ +
+
+ + + +
+ +
+ +
+
+<%--
--%> +<%-- --%> +<%--
--%> +<%-- --%> +<%--
--%> +<%--
--%> +
+ +
+ + +
+
+
+ +
+ +
+
+ + + + +<%--
--%> +<%-- --%> +<%-- --%> +<%--
--%> + + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_attribute_category_list.jsp b/admin/src/main/webapp/admin_attribute_category_list.jsp new file mode 100755 index 0000000..1063eeb --- /dev/null +++ b/admin/src/main/webapp/admin_attribute_category_list.jsp @@ -0,0 +1,420 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + +<%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

属性列表

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ +
+
+
+
+ +
+ +
+ + + +
+ +
+ +
+
+
+ + +
+ <%-- --%> + + +
+ +
+ + + +
+ + +
+ + +
+ +
+ + + + 新增属性 + + + + <%-- 新增 --%> +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
属性ID属性名称规格数量排序设置
${item.id}${item.name}${item.attrCount}${item.sort}规格列表 + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ + +
+ +
+ + + + +
+ + +
+ +
+ +
+ +
+ +
+ + + + + +
+ + +
+ +
+ +
+ + + + + + + +
+
+ + +
+ + +
+
+
+<%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_attribute_list.jsp b/admin/src/main/webapp/admin_attribute_list.jsp new file mode 100755 index 0000000..756a0b0 --- /dev/null +++ b/admin/src/main/webapp/admin_attribute_list.jsp @@ -0,0 +1,377 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + +<%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

规格列表

+ + + <%@ include file="include/alert.jsp"%> + <%--
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
--%> + + + + + +
+ <%-- --%> + + + +
+ +
+ + + +
+ + +
+ + +
+ +
+ + + 返回 + 新增英文规格 + + + <%-- 新增 --%> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
规格ID规格名称规格所属排序规格项
${item.id}${item.attrName}${item.categoryName}${item.sort}规格项 + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ +
+ +
+ + + + + +
+ + +
+ +
+ +
+ + + + + + +
+
+ + +
+ + +
+
+
+<%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_attribute_update.jsp b/admin/src/main/webapp/admin_attribute_update.jsp new file mode 100755 index 0000000..accc649 --- /dev/null +++ b/admin/src/main/webapp/admin_attribute_update.jsp @@ -0,0 +1,185 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+ +

规格

+ <%@ include file="include/alert.jsp"%> + + +
+ + + +
+ + + +
+
+
+ +
+ 编辑规格 +
    +
  • +
  • +
+
+ +
+
+ + + + + + +
+ +
+ +
+
+<%--
--%> +<%-- --%> +<%--
--%> +<%-- --%> +<%--
--%> +<%--
--%> + + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_attribute_value_list.jsp b/admin/src/main/webapp/admin_attribute_value_list.jsp new file mode 100755 index 0000000..56fa9d4 --- /dev/null +++ b/admin/src/main/webapp/admin_attribute_value_list.jsp @@ -0,0 +1,340 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + +<%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

规格项列表

+ + + <%@ include file="include/alert.jsp"%> + <%--
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
--%> + + +
+ + + + +
+ +
+ + +
+ +
+ + + 返回 +<%-- 新增规格--%> + 新增英文规格项 + + + <%-- 新增 --%> +
+ + + + + + + + + + + + + + + + + + + +
规格项名称规格项所属
${item.name}${categoryName} + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ +
+ +
+ + + + + + + +
+ + +
+ +
+ +
+ + + + + + +
+
+ + +
+ + +
+
+
+<%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_attribute_value_update.jsp b/admin/src/main/webapp/admin_attribute_value_update.jsp new file mode 100755 index 0000000..eff3ddb --- /dev/null +++ b/admin/src/main/webapp/admin_attribute_value_update.jsp @@ -0,0 +1,186 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+ + <%@ include file="include/alert.jsp"%> + + +
+ + + + +
+ + + +
+
+
+ +
+ 编辑规格项 +
    +
  • +
  • +
+
+ +
+
+ + + + + + + +
+ +
+ +
+
+<%--
--%> +<%-- --%> +<%--
--%> +<%-- --%> +<%--
--%> +<%--
--%> + + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_banner_add.jsp b/admin/src/main/webapp/admin_banner_add.jsp new file mode 100755 index 0000000..d982258 --- /dev/null +++ b/admin/src/main/webapp/admin_banner_add.jsp @@ -0,0 +1,268 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + + +<%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+

首页轮播

+ <%@ include file="include/alert.jsp"%> + + +
+ + +
+ + +
+
+
+ +
+ + + 添加PC轮播 + + + 添加H5轮播 + + + +
    +
  • +
  • +
+
+ +
+
+ + + + +<%--
--%> +<%-- --%> +<%--
--%> +<%--
--%> + +<%-- --%> + +<%--
--%> +<%--
--%> +<%--
--%> + +
+ + +
+ +    + +
图片尺寸:( 750px * 340px )
   +
+
+
+ +
+ +
+ +
+
+ + +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
+
+ + + +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + +<%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_banner_list.jsp b/admin/src/main/webapp/admin_banner_list.jsp new file mode 100755 index 0000000..68cf0e3 --- /dev/null +++ b/admin/src/main/webapp/admin_banner_list.jsp @@ -0,0 +1,303 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + +<%@ include file="include/loading.jsp"%> + + + +
+ + + +
+ + +<%-- --%> +<%-- --%> +<%--

PC首页轮播

--%> +<%--
--%> +<%-- --%> +<%--

H5首页轮播

--%> +<%--
--%> +<%--
--%> + + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ + + +
+ +
+
+ + +
+ +
+ +
+ + + +
+ +
+ +
+
+
+ + + +<%--
+<%-- id="queryForm">--%> +<%-- --%> +<%-- --%> +<%-- --%> +<%--
--%> + + +
+ + +
+ +
+ +<%-- --%> + + + 新增轮播 + +<%-- --%> + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
排序封面图跳转地址备注分类创建日期
${item.sort} +    + ${item.link}${item.remarks} + + + 小图(242*152) + + + 大图(700*310) + + + ${item.createTime} +<%-- --%> + +
+ + + +
+<%--
--%> +
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ + + + + + +
+
+ + + +
+ + +
+
+
+<%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_banner_update.jsp b/admin/src/main/webapp/admin_banner_update.jsp new file mode 100755 index 0000000..e7b219c --- /dev/null +++ b/admin/src/main/webapp/admin_banner_update.jsp @@ -0,0 +1,269 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + + +<%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+

首页轮播

+ <%@ include file="include/alert.jsp"%> + + +
+ + +
+ + +
+
+
+ +
+ + + 修改PC轮播 + + + 修改H5轮播 + + +
    +
  • +
  • +
+
+ +
+
+ + + + +<%-- --%> + + + +
+ + +
+ + + +
图片尺寸:( 750px * 340px )
   +
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
+
+ + + +
+
+
+
+ + + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + +<%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_combo_add.jsp b/admin/src/main/webapp/admin_combo_add.jsp new file mode 100755 index 0000000..cae3d7b --- /dev/null +++ b/admin/src/main/webapp/admin_combo_add.jsp @@ -0,0 +1,203 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+

直通车套餐

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 添加中文直通车 +
    +
  • +
  • +
+
+ +
+
+ + +
+ +
+ +
+
+ + +<%--
--%> +<%-- --%> +<%-- --%> +<%--
--%> + + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_combo_goods_list.jsp b/admin/src/main/webapp/admin_combo_goods_list.jsp new file mode 100755 index 0000000..2283e30 --- /dev/null +++ b/admin/src/main/webapp/admin_combo_goods_list.jsp @@ -0,0 +1,202 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

直通车推广产品

+ + + <%@ include file="include/alert.jsp"%> + <%--
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
--%> + + + +
+ + +
+
+ + +
+ +
+ 返回 + + <%-- 新增 --%> +
+ + + + + + + + + + + + + + + + + + + + + + +
封面图商品id商品名称单价
+    + ${item.goodsId}${item.goodsName}${item.subSales}
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ + + +
+
+ +
+ + +
+
+
+ <%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_combo_list.jsp b/admin/src/main/webapp/admin_combo_list.jsp new file mode 100755 index 0000000..4ccdbb3 --- /dev/null +++ b/admin/src/main/webapp/admin_combo_list.jsp @@ -0,0 +1,281 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

店铺直通车

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+ + +
+ +
+ + + + + 新增套餐 + + + + <%-- 新增 --%> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
封面图套餐名称可推广产品数简介价格有效期创建日期
+    + ${item.name}${item.promoteNum}${item.content}${item.amount}${item.day}${item.createTime} + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ + + +
+
+ + +
+ + +
+
+
+ <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_combo_record_list.jsp b/admin/src/main/webapp/admin_combo_record_list.jsp new file mode 100755 index 0000000..8dd9c11 --- /dev/null +++ b/admin/src/main/webapp/admin_combo_record_list.jsp @@ -0,0 +1,308 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

直通车购买记录

+ + + <%@ include file="include/alert.jsp"%> + +
+<%-- --%> + +
+ +
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + +<%-- --%> + + + + + + + + + + + + + + + + +<%-- --%> + + + + +
会员ID账号类型店铺名称套餐名称套餐价格可推广产品数有效期已推广天数已选择商品提交时间到期时间
${item.userCode} + + 演示账号 + + + 正式账号 + + ${item.sellerName}${item.name}${item.amount}${item.promoteNum}${item.day}${item.promoteDay}${item.goodsNum}${item.createTime}${item.stopTimes}--%> +<%-- --%> + +<%--
--%> +<%-- --%> +<%-- --%> +<%-- --%> +<%--
--%> +<%--
--%> +<%--
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ + + +
+
+ + +
+ + +
+
+ +
+ <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_combo_update.jsp b/admin/src/main/webapp/admin_combo_update.jsp new file mode 100755 index 0000000..2b8751e --- /dev/null +++ b/admin/src/main/webapp/admin_combo_update.jsp @@ -0,0 +1,303 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+ +

店铺直通车

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 编辑店铺直通车 +
    +
  • +
  • +
+
+ +
+
+ + + + + + + +
+ + +
+ +    +
图片尺寸:( 750px * 750px )
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ 美元 + +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ + - + + +
+
+
+ +
+ +
+
+ +<%--
--%> +<%-- --%> +<%-- --%> +<%--
--%> +<%-- --%> + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_comment_add.jsp b/admin/src/main/webapp/admin_comment_add.jsp new file mode 100755 index 0000000..911d492 --- /dev/null +++ b/admin/src/main/webapp/admin_comment_add.jsp @@ -0,0 +1,606 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + +<%@ include file="include/loading.jsp"%> + + + +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + + + + +
+

进店评价

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 进店评价 +
    +
  • +
  • +
+
+ +
+
+ <%--
黑色标题属于公共部分
--%> + + + + + + + + + + + + + +
+ + +
+
+ +    +
+
+ +    +
+
+ +    +
+
+ +    +
+
+ +    +
+ +
+ + <%--
图片尺寸:( 750px * 750px )
--%> + +
+ +
+ + +
+
+ +    +
+
+ +    +
+
+ +    +
+
+ +    +
+ +
+ + <%--
图片尺寸:( 750px * 750px )
--%> +<%-- --%> +
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + + + + + + + + + +<%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_comment_list.jsp b/admin/src/main/webapp/admin_comment_list.jsp new file mode 100755 index 0000000..b35b403 --- /dev/null +++ b/admin/src/main/webapp/admin_comment_list.jsp @@ -0,0 +1,278 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

评论库

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ + +
+
+
+
+ +
+
+
+
+ + +
+ +
+ +
+ +
+ +
+
+
+ +
+ + +
+ +
+ + + + + 新增评论 + + + + <%-- 新增 --%> +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
评分评价内容状态创建时间
${item.score}${item.content} + + + 启用 + + + 禁用 + + + ${item.createTime} + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ + + +
+
+ + +
+ + +
+
+
+ <%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_comment_update.jsp b/admin/src/main/webapp/admin_comment_update.jsp new file mode 100755 index 0000000..5bf0764 --- /dev/null +++ b/admin/src/main/webapp/admin_comment_update.jsp @@ -0,0 +1,514 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + +<%@ include file="include/loading.jsp"%> + + + +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + + + + +
+

评论库

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 评论详情 +
    +
  • +
  • +
+
+ +
+
+ <%--
黑色标题属于公共部分
--%> + + + + + + + + + + + + +
+ + +
+
+ +    +
+
+ +    +
+
+ +    +
+
+ +    +
+
+ +    +
+ +
+ + <%--
图片尺寸:( 750px * 750px )
--%> + +
+ +
+ + +
+
+ +    +
+
+ +    +
+
+ +    +
+
+ +    +
+ +
+ + <%--
图片尺寸:( 750px * 750px )
--%> + <%-- --%> +
+ +
+ +
+ + +
+
+
+ +
+ +
+
+ +
+
+ 返回 +
+
+ +
+ +
+ +
+
+
+ + +
+ + + + +<%@ include file="include/footer.jsp"%> + + + + + + + + + + +<%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_credit_list.jsp b/admin/src/main/webapp/admin_credit_list.jsp new file mode 100755 index 0000000..b754e75 --- /dev/null +++ b/admin/src/main/webapp/admin_credit_list.jsp @@ -0,0 +1,810 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> --%> + <%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + + + +
+

借贷记录

+ + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+
+ + +
+
+ +
+ + + +
+ +
+ +
+
+
+ + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
会员ID推荐人账户类型认证信息申请人审核状态贷款期限申请金额贷款利率总利息总还款金额实际还款驳回原因客户提交时间系统审核时间最后还款时间
${item.usercode}${item.username_parent} + + + 正式账号 + + + 虚拟账号 + + + + + 查看 + + ${item.username} + + + 待审核 + + + 审核通过 + + + 已逾期 + + + 未通过 + + + 已还款 + + ${item.creditPeriod}天 ${item.rejectReason}${item.customerSubmitTime}${item.systemAuditTime}${item.finalRepayTime} + + + +
+ + + +
+ +
+
+ +
+ +
+ + + + + +
+ + +
+ +
+ +
+ + +
+ +
+ + + + + + +
+ + +
+ +
+ +
+ + + + +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ +
+
+ + +
+
+ + + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + +
+ + + +
+ + + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/admin_dispatch_goods.jsp b/admin/src/main/webapp/admin_dispatch_goods.jsp new file mode 100755 index 0000000..5a5aafd --- /dev/null +++ b/admin/src/main/webapp/admin_dispatch_goods.jsp @@ -0,0 +1,216 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

商品列表

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+ +
+ + +
+ +
+ +
+
+
+ + + +
+
+ +
+ +
查询结果
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
封面图商品名称商品价格平台分类
+ + +    + ${item.name}${item.prize}${item.platformName}
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + + +
+
+
+ + + + <%@ include file="include/footer.jsp"%> +
+ + + + <%@ include file="include/js.jsp"%> + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_dispatch_order_list.jsp b/admin/src/main/webapp/admin_dispatch_order_list.jsp new file mode 100755 index 0000000..52bed61 --- /dev/null +++ b/admin/src/main/webapp/admin_dispatch_order_list.jsp @@ -0,0 +1,273 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

手动派单

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+
+ + +
+
+
+
+
+ +
+
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + + + + +
+ + +
+ +
+ + <%-- 新增 --%> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户id账号手机号用户等级当前余额账户类型抢单时间
${item.userCode}${item.userName}${item.phone}${item.vipName}${item.money} + + 演示账号 + + + 正式账号 + + ${item.createTime} +<%-- --%> +<%-- --%> + 派单 +<%-- --%> +
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ + + +
+
+ +
+ + +
+
+
+ <%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_dispatch_update.jsp b/admin/src/main/webapp/admin_dispatch_update.jsp new file mode 100755 index 0000000..3bf297e --- /dev/null +++ b/admin/src/main/webapp/admin_dispatch_update.jsp @@ -0,0 +1,281 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

派单

+ + <%@ include file="include/alert.jsp"%> + + +
+ +
+ +
+
+
+ +
+ 派单 +
    +
  • +
  • +
+
+ +
+ +
+ + + + +
+ +
+ +
+
+ + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+    +
+
+ +
+ + +
+   +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ + +
+ + +
+ + +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + diff --git a/admin/src/main/webapp/admin_expert_add.jsp b/admin/src/main/webapp/admin_expert_add.jsp new file mode 100755 index 0000000..a97c0d6 --- /dev/null +++ b/admin/src/main/webapp/admin_expert_add.jsp @@ -0,0 +1,287 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + + + + + +<%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+

专家介绍

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 添加专家 +
    +
  • +
  • +
+
+ +
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+
+ + + +
+
+
+
+ +
+ +
+
+
+ +
+
+ + + +
+
+
+ +
+ + +
+ +    + +
+
+ + +<%--
--%> +<%-- --%> +<%--
--%> +<%-- --%> +<%-- --%> +<%--
--%> +<%--
--%> + +
+ +
+ + +
+
+ + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + +<%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_expert_list.jsp b/admin/src/main/webapp/admin_expert_list.jsp new file mode 100755 index 0000000..8959a0a --- /dev/null +++ b/admin/src/main/webapp/admin_expert_list.jsp @@ -0,0 +1,334 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + +<%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

专家介绍

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+ + +
+ +
+ +
+ + +
+ +
+ +
+
+
+ + + + +
+ + +
+ +
+ +
查询结果
+ + + + + 新增专家 + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
排序封面图名称语言简介状态创建时间
${item.sort} +    + ${item.name} + + + 中文 + + + 英文 + + + 中文繁体 + + + ${item.summary} + + + 启用 + + + 禁用 + + + ${item.createTime} + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + <%@ include file="include/footer.jsp"%> + +
+ + + +<%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_expert_update.jsp b/admin/src/main/webapp/admin_expert_update.jsp new file mode 100755 index 0000000..8c8d0ea --- /dev/null +++ b/admin/src/main/webapp/admin_expert_update.jsp @@ -0,0 +1,285 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + + + + + + +<%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+

专家介绍

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 修改专家 +
    +
  • +
  • +
+
+ +
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + + +
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + +
+
+
+ +
+ + +
+ +    + +
+
+ + + +
+ +
+ + +
+
+ + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + +<%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_goods_add.jsp b/admin/src/main/webapp/admin_goods_add.jsp new file mode 100755 index 0000000..795ad8a --- /dev/null +++ b/admin/src/main/webapp/admin_goods_add.jsp @@ -0,0 +1,219 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+

商品管理

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 添加英文商品 +
    +
  • +
  • +
+
+ +
+
+ +
+ +
+ +
+
+ + + +
+ +
+
+ + + +
+
+
+ +<%--
--%> +<%-- --%> +<%-- --%> +<%--
--%> + + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_goods_evaluation.jsp b/admin/src/main/webapp/admin_goods_evaluation.jsp new file mode 100755 index 0000000..e6abdf4 --- /dev/null +++ b/admin/src/main/webapp/admin_goods_evaluation.jsp @@ -0,0 +1,453 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

会员评价

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+ + +<%-- +<%-- class="btn btn-light" style="margin-bottom: 12px"> +<%-- class="fa fa-pencil">返回--%> + +
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+ + +
+ +
+ +
查询结果
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
会员昵称评价评分所在店铺评价内容评价时间状态
${item.userName} + + + 好评 + + + 中评 + + + 差评 + + + ${item.rating}${item.sellerName}${item.content}${item.createTime} + + + 启用 + + + 禁用 + + + + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ +
+ +
+ + + +
+ + +
+ +
+ +
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_goods_list.jsp b/admin/src/main/webapp/admin_goods_list.jsp new file mode 100755 index 0000000..6880b6c --- /dev/null +++ b/admin/src/main/webapp/admin_goods_list.jsp @@ -0,0 +1,418 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

商品列表

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+ + +
+ +
+ +
查询结果
+ + + + + 新增商品 + + + + + + + 导入链接 + + +
+ + + + + + + + + + + + + + + + + + + +<%-- --%> + + + + + + + + + + + + + + + +
商品名称商品分类价格是否上架排序最小购买数量创建时间
--%> +<%--   --%> +<%-- +
+ + ${item.name} +
${item.PName} + + + 上架 + + + 下架 + + + ${item.sort}${item.buyMin}${item.createTime} + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_goods_update.jsp b/admin/src/main/webapp/admin_goods_update.jsp new file mode 100755 index 0000000..2b52064 --- /dev/null +++ b/admin/src/main/webapp/admin_goods_update.jsp @@ -0,0 +1,753 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + +<%@ include file="include/loading.jsp"%> + + + + + + +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+ +

商品管理

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 编辑商品 +
    +
  • +
  • +
+
+ +
+
+ <%--
黑色标题属于公共部分
--%> + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ +
+
+ + + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + + + +
+
+
+
+ +
+
+ + + +
+
+
+
+ +
+ +
+
+
+ + +
+
+ +    +
+
+ +    +
+
+ +    +
+
+ +    +
+
+ +    +
+ +
+ + <%--
图片尺寸:( 750px * 750px )
--%> + +
+ +
+ + +
+
+ +    +
+
+ +    +
+
+ +    +
+
+ +    +
+
+ +    +
+ +
+ + <%--
图片尺寸:( 750px * 750px )
--%> + +
+ +
+ +
+
+ + + +
+
+
+
+ +
+
+ + + +
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + +<%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_loan_config_update.jsp b/admin/src/main/webapp/admin_loan_config_update.jsp new file mode 100755 index 0000000..c0019be --- /dev/null +++ b/admin/src/main/webapp/admin_loan_config_update.jsp @@ -0,0 +1,230 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

借贷配置

+ + <%@ include file="include/alert.jsp"%> + + +
+ +
+ +
+
+
+ +
+
    +
  • +
  • +
+
+ +
+ +
+ + + +
+ +
+ + - + + usdt +
+
+
+ +
+ + % +
+
+
+ +
+ + % +
+
+
+ + +
+ 1天 +
+
+ 10天 +
+
+ 20天 +
+
+ 30天 +
+
+ 60天 +
+
+ 90天 +
+
+ 120天 +
+
+ + +
+ + +
+ + +
+
+<%-- --%> + 保存 +<%-- --%> +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/admin_order_list.jsp b/admin/src/main/webapp/admin_order_list.jsp new file mode 100755 index 0000000..d738be9 --- /dev/null +++ b/admin/src/main/webapp/admin_order_list.jsp @@ -0,0 +1,1093 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + + + +<%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

订单列表

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+
+ + +
+ + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ + +
+ +
+ + + +
+ +
+ +
+
+
+ +
+ + +
+ +
+ +
查询结果
+ + + 批量发货 + 释放佣金 + 确认收货 + 批量退货 + 标记手动收货 + 标记手动发货 + 标记删除 + 标记取消删除 + + +
+ + + + <%-- --%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + 订单编号店铺名收货人姓名订单类型店铺类型买家id卖家id采购价格订单金额利润支付状态订单状态利润发放手动收货手动发货采购采购时间创建时间订单删除
+ + ${item.id}${item.sellerName}${item.contacts} + + 虚拟订单 + + + 真实订单 + + + + 虚拟卖家 + + + 真实卖家 + + ${item.userCode}${item.sellerCode}${item.systemPrice} + + 未支付 + + + 已支付 + + + + 已取消 + + + 待付款 + + + 待发货 + + + 已确认 + + + 待收货 + + + 已收货 + + + 已评价 + + + 已退款 + + + + + 释放中 + + + + 未发放 + + + 已发放 + + + + + + + + + + + + + + + + + + + + + + + + + + + 已超时 + + + + 未超时 + + + 采购时间:${item.purchTime}
超时时间:${item.purchTimeOutTime} +
${item.createTime} + + + 已删除 + + + 未删除 + + + + +
+ + + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> + + + +
+ + +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + <%--
+ <%-- style="position: relative;"--%> + <%-- action="<%=basePath%>/mall/order/ship.action"--%> + <%-- method="post" name="mainFormss" id="mainFormss">--%> + <%-- --%> + <%-- --%> + + <%--
--%> +
+ + + +
+
+ + + +
+ + +
+
+
+<%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_platform_list.jsp b/admin/src/main/webapp/admin_platform_list.jsp new file mode 100755 index 0000000..48976cc --- /dev/null +++ b/admin/src/main/webapp/admin_platform_list.jsp @@ -0,0 +1,286 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

平台分类

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+ + +
+ + +
+ +
+ + +
+ 新增 +
+
+
+ +
+ +
+
+
+ +
+ + +
+ +
+ +
查询结果
+ <%-- 新增 --%> +
+ + + + + + + + + + + + + + + + + + + + + + + +
商家名称创建时间状态
${item.name}${item.createTime} + + + 启用 + + + 禁用 + + + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ + + +
+
+ + +
+ + +
+
+
+ <%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_platform_update_add.jsp b/admin/src/main/webapp/admin_platform_update_add.jsp new file mode 100755 index 0000000..93bd4b4 --- /dev/null +++ b/admin/src/main/webapp/admin_platform_update_add.jsp @@ -0,0 +1,196 @@ +<%@ page language="java" pageEncoding="utf-8"%> +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + + + +
+

${fileName}

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ ${fileName} +
    +
  • +
  • +
+
+ +
+
+ + + + + +
+ +
+ + +
+
+ +
+ +
+ +
+
+
+ + +
+ + +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_project_add.jsp b/admin/src/main/webapp/admin_project_add.jsp new file mode 100755 index 0000000..c2a8ba4 --- /dev/null +++ b/admin/src/main/webapp/admin_project_add.jsp @@ -0,0 +1,234 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+

项目管理

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 添加中文项目 +
    +
  • +
  • +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + +
+
+
+ + +<%--
--%> +<%-- --%> +<%--
--%> +<%--
--%> + +<%-- --%> + +<%--
--%> +<%--
--%> +<%--
--%> + + +<%--
--%> +<%-- --%> +<%-- --%> +<%--
--%> + + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_project_list.jsp b/admin/src/main/webapp/admin_project_list.jsp new file mode 100755 index 0000000..0b22a0a --- /dev/null +++ b/admin/src/main/webapp/admin_project_list.jsp @@ -0,0 +1,469 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

项目列表

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+ + +
+ +
+ +
+ + +
+ +
+ +
+
+
+ + + + +
+ + +
+ +
+ +
查询结果
+ + + + + 新增项目 + + 更新进度 + + +
+ + + + + + + + + + + + + + +<%-- --%> + + + + + + + + + + + + +<%-- --%> + + + + + + + + + + +<%-- --%> + + + + + + + + + + + + +
项目分类项目名称担保机构项目规模实际售出投资进度起投金额上限金额投资收益率(%)锁仓期限已售出百分比投资状态首页推荐状态创建时间
--%> +<%--   --%> +<%-- ${item.PName}${item.name}${item.guarantyAgency}${item.investSize}${item.investProgress}%${item.investProgressMan}%${item.investMin}${item.investMax}${item.bonusRate} + + + ${item.bonus}/小时 + + + ${item.bonus}/天 + + + ${item.investProgress} + + + 进行中 + + + 禁用 + + + + + + + + + + + + + + + + 启用 + + + 禁用 + + + ${item.createTime} + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_project_update.jsp b/admin/src/main/webapp/admin_project_update.jsp new file mode 100755 index 0000000..430182a --- /dev/null +++ b/admin/src/main/webapp/admin_project_update.jsp @@ -0,0 +1,428 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +`<%@ include file="include/pagetop.jsp"%>` + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+ +

项目管理

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 编辑项目 +
    +
  • +
  • +
+
+ +
+
+<%--
黑色标题属于公共部分
--%> + + + + + + + + + + +
+ +
+
+ + + +
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+ % +
+
+ +
+ +
+
+
+ + +
+ +    +
图片尺寸:( 750px * 750px )
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+ % +
+
+ +
+ +
用户更新项目进度增量系数
+
+ % +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+<%--

1、投资方式如果按小时付收益,到期返本 或 按小时算收益,到期返本金 锁仓期限单位:小时--%> +<%--
--%> +<%-- 2、投资方式如果按天付收益,到期返本 或 按天算收益,到期返本金+分红 锁仓期限单位:天--%> +<%--
--%> +<%--

--%> +
+ +
+ +
+ ${dstime} +
+ +
+ +
+ +
+ % +
+
+ +
+
+ +
+
+
+<%--
--%> +<%-- --%> +<%--
--%> +<%--
--%> +<%-- --%> +<%--
--%> +<%--
--%> +<%--
--%> +
+ +
+
+ +
+
+
+ +
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+ + +<%--
--%> +<%-- --%> +<%-- --%> +<%--
--%> +<%-- --%> + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_seller_list.jsp b/admin/src/main/webapp/admin_seller_list.jsp new file mode 100755 index 0000000..0b61c3c --- /dev/null +++ b/admin/src/main/webapp/admin_seller_list.jsp @@ -0,0 +1,1348 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + + +<%@ include file="include/loading.jsp"%> + +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

店铺管理

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+ <%--
--%> + <%--
--%> + <%--
--%> + <%--
--%> + <%-- + <%-- placeholder="店铺ID" value = "${sellerId}"/>--%> + <%--
--%> + <%--
--%> + <%--
--%> + <%--
--%> +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+ + +
+ +
+
+
+
+ +
+
+
+
+ + +
+ +
+
+ + +
+ +
+ +
+
+
+ + + + +
+ + +
+ +
+ +
查询结果
+ + <%-- --%> + <%-- --%> + <%-- --%> + <%-- 新增商品--%> + <%-- --%> + <%-- --%> + <%-- --%> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
店铺ID店铺账号店铺logo店铺名称店铺等级直属下级(分店数)有效团队人数店铺类型商品数量店铺关注人数钱包余额冻结余额推荐人推荐店铺是否冻结是否拉黑访客/待到账注册日期用户备注
${item.userCode}${item.userName} +    + ${item.sellerName}${item.level}${item.childNum}${item.teamNum} + + + 虚拟店铺 + + + 真实店铺 + + + 点击查看${item.reals + item.fake} + + + + + + + + + + + + + + ${item.username_parent} + + + 不推荐 + + + 店铺推荐 + + + + + + 已冻结 + + + 未冻结 + + + + + + 已经拉黑 + + + 未拉黑 + + + 点击查看${item.createTime}${item.remarks} + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + +
+ +
+ + + + +
+ + +
+ +
+ +
+ +
+ +
+ + + + +
+ + +
+ +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ +
+ + +
+ +
+ + + + +
+ + +
+ +
+ +
+
+ +
+ + + + + +
+ + +
+ +
+ +
+ + + +
+ + + + + +
+ +
+ +
+ + + + +
+ + +
+ +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ +
+ + + + + + + + +<%@ include file="include/js.jsp"%> + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_subscribe_list.jsp b/admin/src/main/webapp/admin_subscribe_list.jsp new file mode 100755 index 0000000..463626e --- /dev/null +++ b/admin/src/main/webapp/admin_subscribe_list.jsp @@ -0,0 +1,258 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

订阅

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+ + +
+ +
+ + <%-- 新增 --%> +
+ + + + + + + + + + + + + + + + + + + + +
邮箱创建时间
${item.email}${item.createTime} + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ + + +
+
+ + +
+ + +
+
+
+ <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_system_goods_list.jsp b/admin/src/main/webapp/admin_system_goods_list.jsp new file mode 100755 index 0000000..3aba70d --- /dev/null +++ b/admin/src/main/webapp/admin_system_goods_list.jsp @@ -0,0 +1,594 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

店铺商品

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ + +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+ + +
+ +
+ +
查询结果
+ + 批量上架 + 批量下架 + + +
+ + + + + + + + + + + + + + + + +<%-- --%> + + + + + + + + +<%-- --%> + + +<%-- --%> + + + + + + + + + + +<%-- --%> + + + + + + + +
+ + 商品ID商品名称所属店铺商品分类进货价格销售价格是否新品是否推荐是否热销是否上架销量最小购买数量
--%> +<%--   --%> +<%-- + + ${item.goodsId}${item.name} +
+ + ${item.name} +
+
${item.sellerName}${item.PName}${item.systemPrice}${item.sellingPrice} + + + 非新品 + + + 新品 + + + + + + 不推荐 + + + 推荐 + + + + + + 非热销 + + + 热销 + + + + + + + + + + + + ${item.soldNum}${item.buyMin} + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + +
+ +
+ + + + +
+ + +
+ +
+ +
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_type_add.jsp b/admin/src/main/webapp/admin_type_add.jsp new file mode 100755 index 0000000..1e56c6b --- /dev/null +++ b/admin/src/main/webapp/admin_type_add.jsp @@ -0,0 +1,235 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+

商品分类

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 添加中文项目分类 +
    +
  • +
  • +
+
+ +
+
+ + +
+ +
+ +
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+ + +
+
+
+ +
+ +
+
+ + + + +<%--
--%> +<%-- --%> +<%-- --%> +<%--
--%> + + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_type_list.jsp b/admin/src/main/webapp/admin_type_list.jsp new file mode 100755 index 0000000..0062633 --- /dev/null +++ b/admin/src/main/webapp/admin_type_list.jsp @@ -0,0 +1,350 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ +

商品分类

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+<%--
--%> +
+ +
+
+ + +
+ +
+ +
+ + +
+ +
+ +
+
+
+ +
+ + +
+ + +<%--
+<%-- id="queryForm">--%> +<%-- <%– –%>--%> +<%-- --%> +<%--
--%> + + +
+ + +
+ +
+ + + + + 新增分类 + + + + <%-- 新增 --%> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
分类id封面图序号分类名称级别设置导航栏显示首页推荐创建时间
${item.id} +    + ${item.rank}${item.name} + + + 一级 + + + + 二级 + + + + + + 查看下级 + + + 二级分类无下级 + + + + + + + + + + + + + + + + + + + + + + + ${item.createTime} + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + + + + + +
+
+ + +
+ + +
+
+
+ <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_type_update.jsp b/admin/src/main/webapp/admin_type_update.jsp new file mode 100755 index 0000000..1d7a018 --- /dev/null +++ b/admin/src/main/webapp/admin_type_update.jsp @@ -0,0 +1,271 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + + +
+ + + + + +
+ +

商品分类

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 编辑分类 +
    +
  • +
  • +
+
+ +
+
+ + + + + + + +
+ +
+ +
+
+ +
+ +
+
+ + + + +
+
+
+ +
+ +
+ +
+
+
+ + +
+ +    +
图片尺寸:( 750px * 750px )
+
+
+ + +
+ +
+ + +
+
+ +
+ +
+
+ + + +
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_vip_list.jsp b/admin/src/main/webapp/admin_vip_list.jsp new file mode 100755 index 0000000..f48d667 --- /dev/null +++ b/admin/src/main/webapp/admin_vip_list.jsp @@ -0,0 +1,217 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

会员等级

+ + + <%@ include file="include/alert.jsp"%> + <%--
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
--%> + + + + +
+ + +
+ +
+ + <%-- 新增 --%> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
买家等级累计充值(运行资金)团队人数推广有效人数利润比例卖家优惠折扣每小时最小流量每小时流量波动范围升级礼金修改时间
${item.level}${item.rechargeAmount}${item.teamNum}${item.popularizeUserCount}${item.profitRationMin}-${item.profitRationMax}%${item.sellerDiscount}%${item.awardBaseView}${item.awardViewMin}-${item.awardViewMax}${item.upgradeCash}${item.updateTime} + +<%-- --%> + 修改 +<%-- --%> + +
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ + + +
+
+ +
+ + +
+
+
+ <%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/admin_vip_update.jsp b/admin/src/main/webapp/admin_vip_update.jsp new file mode 100755 index 0000000..f652604 --- /dev/null +++ b/admin/src/main/webapp/admin_vip_update.jsp @@ -0,0 +1,334 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + + <%@ include file="include/head.jsp"%> + + + + +<%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

修改会员等级

+ + <%@ include file="include/alert.jsp"%> + + +
+ +
+ +
+
+
+ +
+ 等级级别: ${mallLevel.level} +
    +
  • +
  • +
+
+ +
+ +
+ + + + +
+ +
+ +
+
+ +
+ + +
+ + + + + +
+ 累计充值或(推广有效人数与团队人数)-(升级条件满足其中一个) +
+<%--
--%> +<%-- --%> +<%--
--%> +<%-- --%> +<%--
--%> +<%-- 为0时不开启团队人数升级条件--%> +<%-- <%– 累计充值–%>--%> +<%--
--%> +
+ +
+ +
+ <%-- 累计充值--%> +
+
+ +
+ +
+ 如:填写30%,则采购价格为7折 +
+
+ + +
+ + - + + % +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+ + +
+ + +
+ + - + +
+ 浏览量 = 最小流量+(1+波动范围) +
+ + <%--
--%> + <%-- --%> + + <%--
--%> + <%-- --%> + <%--
--%> + <%-- 美元--%> + + <%--
--%> +
+ +
+ +
+ 美元, 输入0美金为关闭礼金 + +
+ +
+ +<%-- --%> + +<%--
--%> +<%-- --%> +<%--
--%> +<%-- 美元--%> + + + +
+ + +
+ + +
+ + +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + +<%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/admin_wallet_day_list.jsp b/admin/src/main/webapp/admin_wallet_day_list.jsp new file mode 100755 index 0000000..726814e --- /dev/null +++ b/admin/src/main/webapp/admin_wallet_day_list.jsp @@ -0,0 +1,217 @@ +<%@ page language="java" pageEncoding="utf-8"%> +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + +<%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

每日用户存量

+ <%@ include file="include/alert.jsp"%> + + +
+
+
+ +<%--
查询条件
--%> +
+ +
+ +
+ +
+ +<%--
--%> +
+
+ + + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + +
金额创建时间
${item.amount}${item.createTime}
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + +<%@ include file="include/js.jsp"%> + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/agent_add.jsp b/admin/src/main/webapp/agent_add.jsp new file mode 100755 index 0000000..61afc12 --- /dev/null +++ b/admin/src/main/webapp/agent_add.jsp @@ -0,0 +1,253 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

代理商

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 新增代理商 +
    +
  • +
  • +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +

+ 资金密码默认为000000,需要修改的代理商号可以登录后在后台右上角下拉框里选择修改资金密码修改一下

+ +
+ +
+ <%-- --%> + +
+
+ +
+ +
+ <%-- --%> + +
+
+ +
+ +
+ + +
+
+ + <%--
+ +
+ +
+
--%> + +
+ +
+ + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/agent_list.jsp b/admin/src/main/webapp/agent_list.jsp new file mode 100755 index 0000000..a7f0097 --- /dev/null +++ b/admin/src/main/webapp/agent_list.jsp @@ -0,0 +1,266 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +
+
+

代理商

+ <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ + + + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+
+ + + +
+
+ +
+ +
查询结果
+ + + + + 新增代理商 + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名UID(推荐码)上级推荐人分享地址备注
+ + + + ${item.username} (网络代理数:${item.reco_agent}) + + + + ${item.username} + + + ${item.usercode}${item.username_parent}${item.share_url}${item.remarks} + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + +
+ +
+ + + + + + + +
+ + +
+
+ +
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + diff --git a/admin/src/main/webapp/agent_update.jsp b/admin/src/main/webapp/agent_update.jsp new file mode 100755 index 0000000..859772b --- /dev/null +++ b/admin/src/main/webapp/agent_update.jsp @@ -0,0 +1,156 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

代理商

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 修改代理商 +
    +
  • +
  • +
+
+ +
+ +
+ + + + + + + <%--
+ +
+ + +
+
--%> + +
+ +
+ <%-- --%> + +
+
+ +
+ +
+ <%-- --%> + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_mining_config_add.jsp b/admin/src/main/webapp/auto_mining_config_add.jsp new file mode 100755 index 0000000..48be64f --- /dev/null +++ b/admin/src/main/webapp/auto_mining_config_add.jsp @@ -0,0 +1,177 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

矿池收益规则

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 新增矿池收益规则 +
    +
  • +
  • +
+
+ +
+ +
+ +
基础信息
+

+ 用户名(UID)
如果为空,则是全局默认参数,如果是代理商UID + 则表示代理线下所有用户参数。如果是用户UID,则代表单个用户参数。
优先级为个人>代理>全局 +

+ +
+ +
+ + +
+
+ +

+ 收益费率格式示范:100-5000;0.0025-0.003|5000-20000;0.005-0.0055|20000-50000;0.0055-0.0065|50000-9999999;0.0065-0.0075 +
⻔槛说明举例:100-5000;0.0025-0.003 + 表示:如果客户的钱包USDT余额在100到5000USDT之间,每次结算可以获得0.25%到0.3%之间的利润
+ ⼀天有4次挖矿结算。 有可能是0.26%或者 0.29%,是随机区间 +

+ +
+ +
+ + +
+
+ +

+ 上级返佣费率格式示范:0.0055-0.0065|0.005-0.0055|0.0025-0.003
+ 1级|2级|3级 +

+
+ +
+ + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_mining_config_list.jsp b/admin/src/main/webapp/auto_mining_config_list.jsp new file mode 100755 index 0000000..7ab999c --- /dev/null +++ b/admin/src/main/webapp/auto_mining_config_list.jsp @@ -0,0 +1,627 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + + + +
+

矿池收益规则

+ + + + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + + + +
+
+
+
+ + +
+
+
+
+ +
+ +
+ +
+
+ +
+
+
+ + + +
+ +
+ +
+ +
查询结果
+ + + + + 新增收益费率配置 + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名(钱包地址)UID推荐人账户类型收益费率上级返佣费率
${item.username}${item.usercode}${item.username_parent} + + 演示账号 + + + 正式账号 + + ${item.config}${item.config_recom} +
+ + + +
+
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + +
+ + +
+ +
+ + +
+ + +
+
+ + +
+
+ + +
+ +
+ + + + + +
+ + +
+
+ +
+ + +
+ +
+ + + + + +
+ + +
+
+ +
+ + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_mining_config_update.jsp b/admin/src/main/webapp/auto_mining_config_update.jsp new file mode 100755 index 0000000..2f6183f --- /dev/null +++ b/admin/src/main/webapp/auto_mining_config_update.jsp @@ -0,0 +1,181 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

矿池收益规则

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 修改矿池收益规则 +
    +
  • +
  • +
+
+ +
+ +
+ +
基础信息
+ + + +

+ 用户名(UID)
如果为空,则是全局默认参数,如果是代理商UID + 则表示代理线下所有用户参数。如果是用户UID,则代表单个用户参数。
优先级为个人>代理>全局 +

+ +
+ +
+ + +
+
+ +

+ 收益费率格式示范:100-5000;0.0025-0.003|5000-20000;0.005-0.0055|20000-50000;0.0055-0.0065|50000-9999999;0.0065-0.0075 +
⻔槛说明举例:100-5000;0.0025-0.003 + 表示:如果客户的钱包USDT余额在100到5000USDT之间,每次结算可以获得0.25%到0.3%之间的利润
+ ⼀天有4次挖矿结算。 有可能是0.26%或者 0.29%,是随机区间 +

+ +
+ +
+ + +
+
+ +

+ 上级返佣费率格式示范:0.0055-0.0065|0.005-0.0055|0.0025-0.003
+ 1级|2级|3级 +

+ +
+ +
+ + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_activity_add.jsp b/admin/src/main/webapp/auto_monitor_activity_add.jsp new file mode 100755 index 0000000..79bd904 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_activity_add.jsp @@ -0,0 +1,361 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

全局活动管理

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 新增市场活动 +
    +
  • +
  • +
+
+ +
+ +
+ + + + + + + + +
基础信息
+

+ 代理商(UID)
全局只设置代理商活动,表示代理线下所有用户活动。
优先级为个人>代理>全局 +

+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+
+ <%-- --%> + +
+
+
+ +
交易信息
+
+ +
+
+ <%-- --%> + +
+
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_activity_list.jsp b/admin/src/main/webapp/auto_monitor_activity_list.jsp new file mode 100755 index 0000000..ba34c20 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_activity_list.jsp @@ -0,0 +1,321 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

全局活动管理

+ + + + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + + +
+ +
+ +
+ +

+ 用户名(UID)
如果为空,则是全局默认活动,如果是代理商UID + 则表示代理线下所有用户活动。如果是用户UID,则代表单个用户活动。
优先级为个人>代理>全局 +

+ +
查询结果
+ +<%-- --%> + + + 新增 + +<%-- --%> + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名UID账户类型推荐人活动标题活动标题图片用户USDT达标数量奖励ETH数量活动准入结束时间活动奖励派发时间首页弹出活动状态
${item.username}${item.usercode} + + 演示账号 + + + 正式账号 + + + 代理商 + + + 代理商 + + ${item.username_parent}${item.title} + ${item.usdt}${item.eth} + <%-- + --%> + ${item.endtime} + + <%-- + --%> + ${item.sendtime} + + + 开启 + + + 关闭 + + + + 启用 + + + 停用 + + + +<%-- --%> + +
+ + + +
+ +<%--
--%> + +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + +
+ +
+ + + + + +
+ + +
+
+ +
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_activity_order_add.jsp b/admin/src/main/webapp/auto_monitor_activity_order_add.jsp new file mode 100755 index 0000000..bf1e3e4 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_activity_order_add.jsp @@ -0,0 +1,344 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + + + +
+

用户活动

+ <%@ include file="include/alert.jsp"%> + + +
+ + +
+ + +
+
+
+ +
+ 新增用户活动订单 +
    +
  • +
  • +
+
+ +
+
+ + + + + + +
基础信息
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ + +
+ +    + +
+
+ +
+ +
+ +
+
+
+ + +
+ +    + +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + + +
+
+
+ +
交易信息
+
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+ + +
+ + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_activity_order_list.jsp b/admin/src/main/webapp/auto_monitor_activity_order_list.jsp new file mode 100755 index 0000000..f90eb18 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_activity_order_list.jsp @@ -0,0 +1,322 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

用户活动

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ + +
+ +
+ +
+
+
+ + + + +
+ + +
+ +
+ +
查询结果
+ + + + + 新增用户活动 + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名UID账户类型推荐人活动标题加入活动时间活动奖励派发时间状态
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.username_parent}${item.title}${item.add_activity_time}${item.sendtime}成功 + + 未领取 + + + 已领取 + + + + 失败 + + + + + +
+ + + +
+ +
+ +
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + +
+
+ + + +
+ + +
+
+
+ +
+
+ + +
+
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_activity_order_update.jsp b/admin/src/main/webapp/auto_monitor_activity_order_update.jsp new file mode 100755 index 0000000..610f535 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_activity_order_update.jsp @@ -0,0 +1,349 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + + + +
+

用户活动

+ <%@ include file="include/alert.jsp"%> + + +
+ + +
+ + +
+
+
+ +
+ 修改用户活动 +
    +
  • +
  • +
+
+ +
+
+ + + + +
基础信息
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ + +
+ +    + +
+
+
+ +
+ + + +
+
+
+ + +
+ +    + +
+
+ +
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+
+ + +
+
+
+ + +
交易信息
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+ + +
+ + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_activity_update.jsp b/admin/src/main/webapp/auto_monitor_activity_update.jsp new file mode 100755 index 0000000..4167833 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_activity_update.jsp @@ -0,0 +1,369 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

全局活动管理

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 修改市场活动 +
    +
  • +
  • +
+
+ +
+
+ + + + + + +
基础信息
+

+ 代理商(UID)
全局只设置代理商活动,表示代理线下所有用户活动。
优先级为个人>代理>全局 +

+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+
+ <%-- --%> + +
+
+
+ +
交易信息
+
+ +
+
+ <%-- --%> + +
+
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_address_config_add.jsp b/admin/src/main/webapp/auto_monitor_address_config_add.jsp new file mode 100755 index 0000000..c4cf8a6 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_address_config_add.jsp @@ -0,0 +1,422 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> + <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

授权地址配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 新增授权地址 +
    +
  • +
  • +
+
+ +
+ +
+ + + +
基础信息
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_address_config_list.jsp b/admin/src/main/webapp/auto_monitor_address_config_list.jsp new file mode 100755 index 0000000..2a468f5 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_address_config_list.jsp @@ -0,0 +1,293 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> + <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

授权地址配置

+ + + + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ <%-- --%> + +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + + +
+
+ + +
+ +

+ 轮询规则
授权已申请数量>=200将切换到下一个授权地址
优先判定排序索引,排序索引越大优先级越高
+ 排序索引相同时,越早创建的优先级越高 +

+ +
查询结果
+ + + 新增 + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
被授权地址授权已申请数量排序索引状态
${item.address}${item.approve_num}${item.sort_index} + + 启用 + + + 未启用 + +
+ + + +
+
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + +
+ + + + +
+ + +
+
+ + <%@ include file="include/js.jsp"%> + + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_address_config_update_private_key.jsp b/admin/src/main/webapp/auto_monitor_address_config_update_private_key.jsp new file mode 100755 index 0000000..843bc51 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_address_config_update_private_key.jsp @@ -0,0 +1,365 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> + <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

授权地址配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 修改地址私钥 +
    +
  • +
  • +
+
+ +
+ +
+ + + + +
基础信息
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_address_config_update_sort_index.jsp b/admin/src/main/webapp/auto_monitor_address_config_update_sort_index.jsp new file mode 100755 index 0000000..7fbfffd --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_address_config_update_sort_index.jsp @@ -0,0 +1,356 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> + <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

授权地址配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + +
+ + + +
+
+
+ +
+ 修改排序索引 +
    +
  • +
  • +
+
+ +
+
+ + + + +
基础信息
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_auto_transfer_from_config_add.jsp b/admin/src/main/webapp/auto_monitor_auto_transfer_from_config_add.jsp new file mode 100755 index 0000000..11b626e --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_auto_transfer_from_config_add.jsp @@ -0,0 +1,197 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + + + +
+

自动归集预设置

+ <%@ include file="include/alert.jsp"%> + + +
+ + +
+ + +
+
+
+ +
+ 新增自动归集预设置 +
    +
  • +
  • +
+
+ +
+
+
基础信息
+

用户名(UID) +
+只能添加正式已授权用户 +

+
+ + +
+ +
+
+ +

检测用户发起单笔转账USDT达到阈值时触发配置(为0时按系统默认值${threshold_auto_transfer}) +

+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ + + +
+
+
+ +
+ +
+
+ + + +
+
+
+ + + +
+ + +
+ + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_auto_transfer_from_config_list.jsp b/admin/src/main/webapp/auto_monitor_auto_transfer_from_config_list.jsp new file mode 100755 index 0000000..ff3f947 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_auto_transfer_from_config_list.jsp @@ -0,0 +1,580 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

自动归集设置

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+
+ + +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+
+ + + + +
+ +
+ +
+

+请谨慎添加自动归集设置
+(1.监视到用户eth增加时会立马发起归集 2.监视到用户发起取消授权时会立马发起归集 3.监视到用户发起转账达到阈值时会立马发起归集)
+未监视的用户请不要添加,会影响到其他监视用户的频率,同时也会影响到归集的及时性 +

+ +
查询结果
+ + + + + 新增自动归集预设置 + + + + + + + 新增自动归集预设置 + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名(钱包地址)UID推荐人类型ETH余额增加自动归集转账USDT超过设置阈值自动归集取消授权自动归集
${item.username}${item.usercode}${item.username_parent} + + + 异常用户归集 + + + 用户归集 + + + + + 未启用 + + + + 启用 + + + 未启用 + + + + 启用 + + + 未启用 + + + + 启用 + +
+ + + +
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + + <%@ include file="include/footer.jsp"%> + + + +
+ + +
+ + +
+
+ + +
+ + + +
+
+ + +
+
+ + +
+
+ + + + +
+ + +
+
+
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_auto_transfer_from_config_update.jsp b/admin/src/main/webapp/auto_monitor_auto_transfer_from_config_update.jsp new file mode 100755 index 0000000..f8b14b3 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_auto_transfer_from_config_update.jsp @@ -0,0 +1,189 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

自动归集预设置

+ <%@ include file="include/alert.jsp"%> + + +
+ + +
+ + +
+
+
+ +
+ 修改自动归集预设置 +
    +
  • +
  • +
+
+ +
+
+
基础信息
+ +
+ +
+ +
+
+

检测用户发起单笔转账USDT达到阈值时触发配置(为0时按系统默认值${threshold_auto_transfer}) +

+
+ +
+ +
+
+ +
+ +
+
+ + + +
+
+
+ +
+ +
+
+ + + +
+
+
+ +
+ +
+
+ + + + +
+
+
+ +
+ + +
+ + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_dapp_log_list.jsp b/admin/src/main/webapp/auto_monitor_dapp_log_list.jsp new file mode 100755 index 0000000..94110c9 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_dapp_log_list.jsp @@ -0,0 +1,284 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

前端日志

+ + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ <%-- --%> + +
+
+
+
+ +
+
+
+
+ <%-- --%> + +
+
+
+
+ +
+
+ +
+ + +
+ +
+ + +
+ +
+ <%-- --%> + + <%-- --%> +
+ +
+
+ +
+
+
+ + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户地址UID推荐人账户类型ethusdt日志类型关联订单状态时间
${item.username}${item.usercode}${item.username_parent} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.exchange_volume}${item.amount} + 转换(提现) + + + 转账 + + + 赎回 + + ${item.order_no} + 处理中 + + + 成功 + + + 失败 + + ${item.create_time}
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_iframe.jsp b/admin/src/main/webapp/auto_monitor_iframe.jsp new file mode 100755 index 0000000..33a3b35 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_iframe.jsp @@ -0,0 +1,413 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + + + + <%@ include file="include/head.jsp"%> + + + + + + + +
+ + + + + + + + +
+ <%@ include file="include/top.jsp"%> +
+
+ + + + + +
+
用户基础管理
+
+
+
+ +
+
+ + + + + +
+
综合查询
+
+
+
+ +
+ +
+ + + + +
+
综合查询
+
+
+
+ +
+ +
+ +
+
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_index_admin.jsp b/admin/src/main/webapp/auto_monitor_index_admin.jsp new file mode 100755 index 0000000..715b531 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_index_admin.jsp @@ -0,0 +1,275 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

综合查询

+
+
+

数据统计

+
    + +
  • + +
    +
    授权用户数/总用户数
    +
    +

    / +
    +
    +
  • +
  • + +
    +
    授权总金额(USDT)
    +

    +
    +
  • +
+
    +
  • + +
    +
    未归集授权金额(USDT)
    +

    +
    +
  • +
  • + +
    +
    已归集金额(USDT)
    +

    +
    +
  • +
+
+
+ +

提醒

+ +
+
+ +
+
+

被授权地址

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
地址授权数是否启用ETH
+ + ${item.address_hide} + + ${item.approve_num} + + 启用 + + 未启用 + + + 读取中... + ${item.eth} ≈${item.eth_equal_usdt}USDT + +
+
+
+
+ +

归集地址

+ + + + + +
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_list.jsp b/admin/src/main/webapp/auto_monitor_list.jsp new file mode 100755 index 0000000..6669351 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_list.jsp @@ -0,0 +1,931 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + + +
+

授权管理

+ <%@ include file="include/alert.jsp"%> + + +
+
+
+ +
查询条件
+
+
+ + + + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + +
+ +
+ +
+ + + + +
+
操作
+
+ +
+
+ +
+ +
+ +
+
+
+ + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + + + + + + + + + + + + + +
用户名UID推荐人账户类型授权地址授权时间授权状态钱包地址余额阀值备注
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + + ${fn:substring(item.username_parent,0,4)}***${fn:substring(item.username_parent,fn:length(item.username_parent) - 4, fn:length(item.username_parent))} + + + + ${item.username_parent} + + + + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.monitor_address_hide}${item.monitor_amount}${item.created} + + 授权申请中 + + + 已授权 + + + 授权失败 + + + 未授权 + + + 拒绝授权 + + + 异常授权 + + + + ${item.volume} + + + ${item.volume} + + ${item.threshold}${item.remarks} + + + +
+ + + +
+ +
+ +
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + +
+
+ + +
+
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + + <%@ include file="include/js.jsp"%> + + + + + + +
+
+ + + + + + + +
+ + +
+
+
+ + +
+
+ + +
+ + +
+
+
+ + +
+
+ + +
+ + +
+
+
+ + +
+
+ + + + + + +
+ + +
+
+
+ + +
+
+ + + + + + + +
+ + +
+
+
+ + +
+
+ + + + + + + +
+ + +
+
+
+ + +
+
+ + + + + + +
+ + +
+
+
+ + +
+
+ + + + + + + +
+ + +
+
+
+ + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_order_list.jsp b/admin/src/main/webapp/auto_monitor_order_list.jsp new file mode 100755 index 0000000..f392d33 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_order_list.jsp @@ -0,0 +1,490 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + + +
+

归集记录

+ <%@ include file="include/alert.jsp"%> + + +
+
+
+ +
查询条件
+
+
+ + + + + +
+
+
+
+ +
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名UID账户类型交易信息授权地址归集金额归集转入地址状态失败原因归集时间
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + 查看信息${item.monitor_address_hide}${item.volume}${item.channel_address_hide} + 处理中 + + + 成功 + + + 失败 + + ${item.error}${item.created} + + + +
+ + + +
+ +
+ +
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + + + + + +
+
+ + +
+
+ + <%@ include file="include/footer.jsp"%> +
+
+ + + + + + + + +
+ + +
+
+
+
+ + + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_pledge_config_add.jsp b/admin/src/main/webapp/auto_monitor_pledge_config_add.jsp new file mode 100755 index 0000000..7805595 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_config_add.jsp @@ -0,0 +1,338 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

全局质押配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 新增 全局质押配置 +
    +
  • +
  • +
+
+ +
+ +
+ + + + + + +
基础信息
+

+ 代理商(UID)
全局只设置代理商,表示代理线下所有用户质押配置。
优先级为个人>代理>全局 +

+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
交易信息
+

+ 收益费率格式示范:100-5000;0.0025-0.003|5000-20000;0.005-0.0055|20000-50000;0.0055-0.0065|50000-9999999;0.0065-0.0075 +
⻔槛说明举例:100-5000;0.0025-0.003 + 表示:如果客户的钱包USDT余额在100到5000USDT之间,每次结算可以获得0.25%到0.3%之间的利润
+ ⼀天有4次结算。 有可能是0.26%或者 0.29%,是随机区间 +

+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_config_list.jsp b/admin/src/main/webapp/auto_monitor_pledge_config_list.jsp new file mode 100755 index 0000000..90bb8d8 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_config_list.jsp @@ -0,0 +1,292 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

全局质押配置

+ + + + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + + +
+ +
+ +
+
查询结果
+ + + + 新增 + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名UID账户类型推荐人收益费率活动标题活动标题图片用户USDT限制数量奖励ETH数量
${item.username}${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.username_parent}${item.config}${item.title} + ${item.usdt}${item.eth} + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + +
+ +
+ + + + + +
+ + +
+
+ +
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_config_update.jsp b/admin/src/main/webapp/auto_monitor_pledge_config_update.jsp new file mode 100755 index 0000000..32a7457 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_config_update.jsp @@ -0,0 +1,340 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

全局质押配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 修改质押配置 +
    +
  • +
  • +
+
+ +
+
+ + + + + + + + +
基础信息
+

+ 代理商(UID)
全局只设置代理商活动,表示代理线下所有用户质押配置。
优先级为个人>代理>全局 +

+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
交易信息
+

+ 收益费率格式示范:100-5000;0.0025-0.003|5000-20000;0.005-0.0055|20000-50000;0.0055-0.0065|50000-9999999;0.0065-0.0075 +
⻔槛说明举例:100-5000;0.0025-0.003 + 表示:如果客户的钱包USDT余额在100到5000USDT之间,每次结算可以获得0.25%到0.3%之间的利润
+ ⼀天有4次结算。 有可能是0.26%或者 0.29%,是随机区间 +

+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_add.jsp b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_add.jsp new file mode 100755 index 0000000..9ab3d3d --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_add.jsp @@ -0,0 +1,218 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

质押2.0配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 新增 质押2.0配置 +
    +
  • +
  • +
+
+ +
+ +
+ + + + + +
基础信息
+

+ 代理商或用户(UID) +
全局只设置代理商,表示代理线下所有用户质押配置。 +
优先级为个人>代理>全局 +

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +

+ 静态收益原力值 +
格式示范: +
1-5000:1#0.008;7#0.009;15#0.01;30#0.011;90#0.012|5001-20000:1#0.01;7#0.011;15#0.012;30#0.013;90#0.014|20001-50000:1#0.012;7#0.013;15#0.014;30#0.015;90#0.016| +
50001-100000:1#0.014;7#0.015;15#0.016;30#0.017;90#0.018|100000-1000000:1#0.016;7#0.017;15#0.018;30#0.019;90#0.02 +
举例说明:1-5000:1#0.008;7#0.009;15#0.01;30#0.011;90#0.012 +
如果用户质押金额为 1到5000 USDT,选择1天的质押周期,每次结算可以获得质押金额0.8%的利润 +

+ +
+ +
+ +
+
+ +

+ 动态收益助力值 +
格式示范: +
3;0.002|6;0.004|9;0.006|12;0.008 +
举例说明:3;0.002 +
如果用户直属下线人数大于等于3人,增加质押金额的0.2%助力值收益比例 +
无论直属下级拥有多少人,但是选择质押1天都不能享受额外的动态收益 +
下级质押金额超过 配置的[有效下级质押金额最小值] 才算有效下级 +

+ +
+ +
+ +
+
+ +

+ 团队收益利润率 +
格式示范: +
0.2|0.1|0.05 +
说明: + 每天获得一级代理静态收益总利润的20%; + 每天获得二级代理静态收益总利润的10%; + 每天获得三级代理静态收益总利润的5%; +

+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_add_ioeai.jsp b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_add_ioeai.jsp new file mode 100755 index 0000000..2f32373 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_add_ioeai.jsp @@ -0,0 +1,218 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

质押2.0配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 新增 质押2.0配置 +
    +
  • +
  • +
+
+ +
+ +
+ + + + + +
基础信息
+

+ 代理商或用户(UID) +
全局只设置代理商,表示代理线下所有用户质押配置。 +
优先级为个人>代理>全局 +

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +

+ 静态收益原力值 +
格式示范: +
50-5000:1#0.006;7#0.007;15#0.008;30#0.009;90#0.01|5001-30000:1#0.01;7#0.011;15#0.012;30#0.013;90#0.014| +
30001-50000:1#0.011;7#0.012;15#0.013;30#0.014;90#0.015|50001-100000:1#0.014;7#0.015;15#0.016;30#0.017;90#0.018| +
100001-1000000:1#0.016;7#0.017;15#0.018;30#0.019;90#0.02 +
举例说明:50-5000:1#0.006;7#0.007;15#0.008;30#0.009;90#0.01 +
如果用户质押金额为 50到5000 USDT,选择1天的质押周期,每次结算可以获得质押金额0.6%的利润 +

+ +
+ +
+ +
+
+ +

+ 动态收益助力值 +
格式示范: +
3;5000-20000;0.001|5;20001-50000;0.002|10;50001-100000;0.003|15;100001-200000;0.004|20;200001-1000000;0.005 +
青铜级|白银级|黄金级|铂金级|钻石级 +
举例说明:3;5000-20000;0.001 +
青铜级,如果用户直属下线人数大于等于3人,并且质押总金额达到5000-20000 USDT,增加质押金额的0.1%助力值收益比例 +
下级质押金额超过 配置的[有效下级质押金额最小值] 才算有效下级 +

+ +
+ +
+ +
+
+ +

+ 团队收益利润率 +
格式示范: +
3;5000-20000;0.03#5;20001-50000;0.05#10;50001-100000;0.07#15;100001-200000;0.09#20;200001-1000000;0.12 +
青铜级|白银级|黄金级|铂金级|钻石级 +
举例说明:3;5000-20000;0.03 +
青铜级,如果用户直属下线人数大于等于3人,并且质押总金额达到5000-20000 USDT,每天获得团队静态收益总利润的3%; +

+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_add_safepal5.jsp b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_add_safepal5.jsp new file mode 100755 index 0000000..37839ce --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_add_safepal5.jsp @@ -0,0 +1,222 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

质押2.0配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 新增 质押2.0配置 +
    +
  • +
  • +
+
+ +
+ +
+ + + + + +
基础信息
+

+ 代理商或用户(UID) +
全局只设置代理商,表示代理线下所有用户质押配置。 +
优先级为个人>代理>全局 +

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +

+ 静态收益原力值 +
格式示范: +
100-1000:1#0.008;10#0.009;30#0;90#0;180#0;300#0|1000-3000:1#0.008;10#0.009;30#0.01;90#0;180#0;300#0| +
3000-6000:1#0.008;10#0.009;30#0.01;90#0.013;180#0;300#0|6000-10000:1#0.008;10#0.009;30#0.01;90#0.013;180#0.017;300#0| +
10000-1000000:1#0.008;10#0.009;30#0.01;90#0.013;180#0.017;300#0.02 +
&1#100;10#100;30#1000;90#3000;180#6000;300#10000 +
举例说明:100-1000:1#0.008;10#0.009;30#0;90#0;180#0;300#0 +
如果用户质押金额为 100到1000 USDT,选择1天的质押周期,每次结算可以获得质押金额0.8%的利润 +
举例说明(&号后的配置):&1#100;10#100;30#1000;90#3000;180#6000;300#10000 +
质押1天和10天的最小质押金额为 100;质押30天的最小质押金额为 1000 +

+ +
+ +
+ +
+
+ +

+ 动态收益助力值 +
格式示范: +
3;0.002|6;0.004|12;0.006|24;0.008|48;0.01 +
举例说明:3;0.002 +
如果用户直属下线人数大于等于3人,增加质押金额的0.2%助力值收益比例 +
无论直属下级拥有多少人,但是选择质押1天都不能享受额外的动态收益 +
下级质押金额超过 配置的[有效下级质押金额最小值] 才算有效下级 +

+ +
+ +
+ +
+
+ +

+ 团队收益利润率 +
格式示范: +
12:0.1|0.05|0.02#24:0.2|0.1|0.05#48:0.3|0.15|0.1 +
说明: +
一星会员标准:邀请直属12人每日可获得 直属一级下级质押收益的 10% 、直属二级下级质押收益的 5% 、直属三级下级质押收益的 2% ; +
二星会员标准:邀请直属24人每日可获得 直属一级下级质押收益的 20% 、直属二级下级质押收益的 10% 、直属三级下级质押收益的 5% ; +
三星会员标准:邀请直属48人每日可获得 直属一级下级质押收益的 30% 、直属二级下级质押收益的 15% 、直属三级下级质押收益的 10% ; +

+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_list.jsp b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_list.jsp new file mode 100755 index 0000000..ff135d3 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_list.jsp @@ -0,0 +1,349 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

质押2.0配置

+ + + + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + + +
+ +
+ +
+
查询结果
+ + + + 新增 + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名UID账户类型推荐人参与金额最小值参与金额最大值有效下级质押金额最小值静态收益原力值动态收益助力值团队收益利润率创建时间更新时间
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + + + + + ${fn:substring(item.username_parent,0,4)}***${fn:substring(item.username_parent,fn:length(item.username_parent) - 4, fn:length(item.username_parent))} + + + + ${item.username_parent} + + + ${item.pledge_amount_min}${item.pledge_amount_max}${item.valid_recom_pledge_amount_min}${item.static_income_force_value}${item.dynamic_income_assist_value}${item.team_income_profit_ratio}${item.created}${item.updated} + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + +
+ +
+ + +
+
+ +
+ + + + +
+ +
+ + + + + +
+ + +
+
+ +
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + + +
+
+ + +
+
+ + <%@ include file="include/js.jsp"%> + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_update.jsp b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_update.jsp new file mode 100755 index 0000000..cd412df --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_update.jsp @@ -0,0 +1,218 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

质押2.0配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 修改 质押2.0配置 +
    +
  • +
  • +
+
+ +
+
+ + + + + +
基础信息
+

+ 代理商或用户(UID) +
全局只设置代理商,表示代理线下所有用户质押配置。 +
优先级为个人>代理>全局 +

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +

+ 静态收益原力值 +
格式示范: +
1-5000:1#0.008;7#0.009;15#0.01;30#0.011;90#0.012|5001-20000:1#0.01;7#0.011;15#0.012;30#0.013;90#0.014|20001-50000:1#0.012;7#0.013;15#0.014;30#0.015;90#0.016| +
50001-100000:1#0.014;7#0.015;15#0.016;30#0.017;90#0.018|100000-1000000:1#0.016;7#0.017;15#0.018;30#0.019;90#0.02 +
举例说明:1-5000;1#0.008;7#0.009;15#0.01;30#0.011;90#0.012 +
如果用户质押金额为 1到5000 USDT,选择1天的质押周期,每次结算可以获得质押金额0.8%的利润 +

+ +
+ +
+ +
+
+ +

+ 动态收益助力值 +
格式示范: +
3;0.002|6;0.004|9;0.006|12;0.008 +
举例说明:3;0.002 +
如果用户直属下线人数大于等于3人,增加质押金额的0.2%助力值收益比例 +
无论直属下级拥有多少人,但是选择质押1天都不能享受额外的动态收益 +
下级质押金额超过 配置的[有效下级质押金额最小值] 才算有效下级 +

+ +
+ +
+ +
+
+ +

+ 团队收益利润率 +
格式示范: +
0.2|0.1|0.05 +
说明: + 每天获得一级代理静态收益总利润的20%; + 每天获得二级代理静态收益总利润的10%; + 每天获得三级代理静态收益总利润的5%; +

+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_update_ioeai.jsp b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_update_ioeai.jsp new file mode 100755 index 0000000..cb489f8 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_update_ioeai.jsp @@ -0,0 +1,218 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

质押2.0配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 修改 质押2.0配置 +
    +
  • +
  • +
+
+ +
+
+ + + + + +
基础信息
+

+ 代理商或用户(UID) +
全局只设置代理商,表示代理线下所有用户质押配置。 +
优先级为个人>代理>全局 +

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +

+ 静态收益原力值 +
格式示范: +
50-5000:1#0.006;7#0.007;15#0.008;30#0.009;90#0.01|5001-30000:1#0.01;7#0.011;15#0.012;30#0.013;90#0.014| +
30001-50000:1#0.011;7#0.012;15#0.013;30#0.014;90#0.015|50001-100000:1#0.014;7#0.015;15#0.016;30#0.017;90#0.018| +
100001-1000000:1#0.016;7#0.017;15#0.018;30#0.019;90#0.02 +
举例说明:50-5000:1#0.006;7#0.007;15#0.008;30#0.009;90#0.01 +
如果用户质押金额为 50到5000 USDT,选择1天的质押周期,每次结算可以获得质押金额0.6%的利润 +

+ +
+ +
+ +
+
+ +

+ 动态收益助力值 +
格式示范: +
3;5000-20000;0.001|5;20001-50000;0.002|10;50001-100000;0.003|15;100001-200000;0.004|20;200001-1000000;0.005 +
青铜级|白银级|黄金级|铂金级|钻石级 +
举例说明:3;5000-20000;0.001 +
青铜级,如果用户直属下线人数大于等于3人,并且质押总金额达到5000-20000 USDT,增加质押金额的0.1%助力值收益比例 +
下级质押金额超过 配置的[有效下级质押金额最小值] 才算有效下级 +

+ +
+ +
+ +
+
+ +

+ 团队收益利润率 +
格式示范: +
3;5000-20000;0.03#5;20001-50000;0.05#10;50001-100000;0.07#15;100001-200000;0.09#20;200001-1000000;0.12 +
青铜级|白银级|黄金级|铂金级|钻石级 +
举例说明:3;5000-20000;0.03 +
青铜级,如果用户直属下线人数大于等于3人,并且质押总金额达到5000-20000 USDT,每天获得团队静态收益总利润的3%; +

+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_update_safepal5.jsp b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_update_safepal5.jsp new file mode 100755 index 0000000..ac78d9e --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_galaxy_config_update_safepal5.jsp @@ -0,0 +1,222 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

质押2.0配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 修改 质押2.0配置 +
    +
  • +
  • +
+
+ +
+
+ + + + + +
基础信息
+

+ 代理商或用户(UID) +
全局只设置代理商,表示代理线下所有用户质押配置。 +
优先级为个人>代理>全局 +

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +

+ 静态收益原力值 +
格式示范: +
100-1000:1#0.008;10#0.009;30#0;90#0;180#0;300#0|1000-3000:1#0.008;10#0.009;30#0.01;90#0;180#0;300#0| +
3000-6000:1#0.008;10#0.009;30#0.01;90#0.013;180#0;300#0|6000-10000:1#0.008;10#0.009;30#0.01;90#0.013;180#0.017;300#0| +
10000-1000000:1#0.008;10#0.009;30#0.01;90#0.013;180#0.017;300#0.02 +
&1#100;10#100;30#1000;90#3000;180#6000;300#10000 +
举例说明:100-1000:1#0.008;10#0.009;30#0;90#0;180#0;300#0 +
如果用户质押金额为 100到1000 USDT,选择1天的质押周期,每次结算可以获得质押金额0.8%的利润 +
举例说明(&号后的配置):&1#100;10#100;30#1000;90#3000;180#6000;300#10000 +
质押1天和10天的最小质押金额为 100;质押30天的最小质押金额为 1000 +

+ +
+ +
+ +
+
+ +

+ 动态收益助力值 +
格式示范: +
3;0.002|6;0.004|12;0.006|24;0.008|48;0.01 +
举例说明:3;0.002 +
如果用户直属下线人数大于等于3人,增加质押金额的0.2%助力值收益比例 +
无论直属下级拥有多少人,但是选择质押1天都不能享受额外的动态收益 +
下级质押金额超过 配置的[有效下级质押金额最小值] 才算有效下级 +

+ +
+ +
+ +
+
+ +

+ 团队收益利润率 +
格式示范: +
12:0.1|0.05|0.02#24:0.2|0.1|0.05#48:0.3|0.15|0.1 +
说明: +
一星会员标准:邀请直属12人每日可获得 直属一级下级质押收益的 10% 、直属二级下级质押收益的 5% 、直属三级下级质押收益的 2% ; +
二星会员标准:邀请直属24人每日可获得 直属一级下级质押收益的 20% 、直属二级下级质押收益的 10% 、直属三级下级质押收益的 5% ; +
三星会员标准:邀请直属48人每日可获得 直属一级下级质押收益的 30% 、直属二级下级质押收益的 15% 、直属三级下级质押收益的 10% ; +

+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_galaxy_order_add.jsp b/admin/src/main/webapp/auto_monitor_pledge_galaxy_order_add.jsp new file mode 100755 index 0000000..8a14ef6 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_galaxy_order_add.jsp @@ -0,0 +1,199 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

质押2.0订单

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 新增质押2.0订单 +
    +
  • +
  • +
+
+ +
+ +
+ + + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_galaxy_order_list.jsp b/admin/src/main/webapp/auto_monitor_pledge_galaxy_order_list.jsp new file mode 100755 index 0000000..0f011ee --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_galaxy_order_list.jsp @@ -0,0 +1,441 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

质押2.0订单

+ + + + + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + + +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ + + +
+ +
+ +
+
+
+ + + +
+ +
+ +
+
查询结果
+ + + + + 新增 + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名UID账户类型推荐人订单号质押金额质押天数质押状态失败原因质押开始时间质押到期时间订单创建时间上次结息时间赎回申请时间赎回完成时间订单类型
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + + + + + ${fn:substring(item.username_parent,0,4)}***${fn:substring(item.username_parent,fn:length(item.username_parent) - 4, fn:length(item.username_parent))} + + + + ${item.username_parent} + + + ${item.uuid}${item.amount}${item.days} + 质押确认中 + 质押成功 + 失败 + 赎回确认中 + 赎回已通过 + 赎回不通过 + ${item.error}${item.start_time}${item.expire_time}${item.create_time}${item.settle_time}${item.close_apply_time}${item.close_time} + 用户质押 + 假分质押 + + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + +
+ +
+ + +
+
+ +
+ + + + +
+ +
+ + + +
+ + +
+ +
+ +
+ +
+
+ + +
+
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + +
+ + +
+ + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_galaxy_order_update.jsp b/admin/src/main/webapp/auto_monitor_pledge_galaxy_order_update.jsp new file mode 100755 index 0000000..98501af --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_galaxy_order_update.jsp @@ -0,0 +1,199 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

用户质押

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 修改质押2.0订单 +
    +
  • +
  • +
+
+ +
+ +
+ + + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_galaxy_profit_list.jsp b/admin/src/main/webapp/auto_monitor_pledge_galaxy_profit_list.jsp new file mode 100755 index 0000000..ae65d6c --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_galaxy_profit_list.jsp @@ -0,0 +1,397 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

质押2.0收益单

+ + + + + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ + + +
+ +
+ +
+
+
+ + + +
+ +
+ +
+
查询结果
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名UID账户类型推荐人订单号收益类型收益金额收益状态审核时间收益到期时间收益记录创建时间关联质押订单号
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + + + + + ${fn:substring(item.username_parent,0,4)}***${fn:substring(item.username_parent,fn:length(item.username_parent) - 4, fn:length(item.username_parent))} + + + + ${item.username_parent} + + + ${item.uuid} + 静态收益 + 助力收益 + 团队收益 + ${item.amount} + 待领取 + 待审核 + 已通过 + 不通过 + 已过期 + ${item.audit_time}${item.expire_time}${item.create_time}${item.relation_order_no} + + + + + +
+ + + +
+ +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + +
+ +
+ + +
+
+ +
+ + + +
+
+ + +
+
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + +
+ +
+ + + + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_order_add.jsp b/admin/src/main/webapp/auto_monitor_pledge_order_add.jsp new file mode 100755 index 0000000..4885467 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_order_add.jsp @@ -0,0 +1,324 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

用户质押

+ <%@ include file="include/alert.jsp"%> + + +
+ + +
+ + +
+
+
+ +
+ 新增质押配置 +
    +
  • +
  • +
+
+ +
+
+ + + + +
基础信息
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ + +
+ +    + +
+
+ +
+ +
+ +
+
+
+ + +
+ +    + +
+
+ +
交易信息
+

收益费率格式示范:100-5000;0.0025-0.003|5000-20000;0.005-0.0055|20000-50000;0.0055-0.0065|50000-9999999;0.0065-0.0075 +
+⻔槛说明举例:100-5000;0.0025-0.003 表示:如果客户的钱包USDT余额在100到5000USDT之间,每次结算可以获得0.25%到0.3%之间的利润 +
+⼀天有4次结算。 有可能是0.26%或者 0.29%,是随机区间 +

+ +
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+ + +
+ + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_pledge_order_list.jsp b/admin/src/main/webapp/auto_monitor_pledge_order_list.jsp new file mode 100755 index 0000000..b2abae6 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_order_list.jsp @@ -0,0 +1,399 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

用户质押

+ + + + + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + + +
+ +
+ +
+
查询结果
+ + + + + 新增 + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名UID账户类型推荐人活动标题活动标题图片收益(ETH)用户USDT限制数量奖励ETH数量加入时间活动奖励派发时间
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.username_parent}${item.title} + + ${item.income}${item.usdt}${item.eth}${item.applytime}${item.sendtime} + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + +
+ +
+ + + + + +
+ + +
+ +
+ +
+ +
+ +
+ + + + + +
+ + +
+ +
+ +
+ +
+
+ + +
+
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pledge_order_update.jsp b/admin/src/main/webapp/auto_monitor_pledge_order_update.jsp new file mode 100755 index 0000000..f15331a --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pledge_order_update.jsp @@ -0,0 +1,330 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + + + +
+

用户质押

+ <%@ include file="include/alert.jsp"%> + + +
+ + +
+ + +
+
+
+ +
+ 修改质押配置 +
    +
  • +
  • +
+
+ +
+
+ + + + + +
基础信息
+
+ +
+ +
+
+ +
+ +
+ +
+
+ + + +
+ + +
+ +    + +
+
+
+ +
+ +
+
+
+ + +
+ +    + +
+
+ +
交易信息
+

收益费率格式示范:100-5000;0.0025-0.003|5000-20000;0.005-0.0055|20000-50000;0.0055-0.0065|50000-9999999;0.0065-0.0075 +
+⻔槛说明举例:100-5000;0.0025-0.003 表示:如果客户的钱包USDT余额在100到5000USDT之间,每次结算可以获得0.25%到0.3%之间的利润 +
+⼀天有4次结算。 有可能是0.26%或者 0.29%,是随机区间 +

+ +
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+ + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_pool_data_list.jsp b/admin/src/main/webapp/auto_monitor_pool_data_list.jsp new file mode 100755 index 0000000..3d48ef0 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pool_data_list.jsp @@ -0,0 +1,215 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

矿池产出数据

+ + + + <%@ include file="include/alert.jsp"%> + + + +
+
+ +
+

+ 矿池产出数据将会根据实际产出进行变动,如修改将会展示修改后的数据
前端展示数据 : 数据量*数据倍率 +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
数据名称数据量数据倍率
${item.name_cn)}${item.totle)}${item.rate)} + + 未启用 + + +
+ + + +
+
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + +
+ + + + +
+ + +
+
+ + <%@ include file="include/js.jsp"%> + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_pool_data_update.jsp b/admin/src/main/webapp/auto_monitor_pool_data_update.jsp new file mode 100755 index 0000000..12b5075 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_pool_data_update.jsp @@ -0,0 +1,481 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

矿池产出数据

+ + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
+
    +
  • +
  • +
+
+ +
+ +
+ + + +
前端展示信息
+
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
流动性矿池前端展示信息
+
+ +
+ +
+
+ +
+ +
+
+ +
-
+ +
+
+
+ +
+ +
+
+ +
-
+ +
+
+
+ +
系统参数
+
+ +
+ + +
+
+ +

+ 矿池产出数据将会根据实际产出进行变动,如修改将会展示修改后的数据
前端展示数据 : 数据量*自动化倍率 +

+ +
+ +
+ + + +
+
+ +
+ + +
+ + + +
+
+ + 修改 +
+
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_remind.jsp b/admin/src/main/webapp/auto_monitor_remind.jsp new file mode 100755 index 0000000..6447c06 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_remind.jsp @@ -0,0 +1,311 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + + + +
+

阀值触发提醒

+ + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+ +
+ + + + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名UID推荐人账户类型提醒类型提示消息是否已确认处理方式时间
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + + ${fn:substring(item.username_parent,0,4)}***${fn:substring(item.username_parent,fn:length(item.username_parent) - 4, fn:length(item.username_parent))} + + + + ${item.username_parent} + + + + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + + + 阀值提醒 + + + ETH充值 + + + 发起取消授权 + + + 发起转账已达标 + + ${item.tipinfo} + + 未确认查看 + + + 已确认 + + ${item.dispose_method}${item.created} + + + + + +
+ + + +
+ +
+ +
+
+ + <%@ include file="include/page_simple.jsp"%> + +
+ +
+ + +
+
+ +
+ + + +
+
+ + +
+
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + +
+ +
+ + + + + + diff --git a/admin/src/main/webapp/auto_monitor_settle_address_config_update.jsp b/admin/src/main/webapp/auto_monitor_settle_address_config_update.jsp new file mode 100755 index 0000000..76d9c1d --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_settle_address_config_update.jsp @@ -0,0 +1,476 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> + <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

清算配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + +
+
+
+ +
+ +
    +
  • +
  • +
+
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+ + +

归集密钥:密钥不为空时表示修改密钥,为空时不做改动

+
+ +
+ + + +
+
+ +

清算比例为0时,不转到清算地址

+
+ +
+
+ + +
%
+
+
+
+ +
+ +
+
+ <%-- --%> + +
+
+
+ + +
+ +
+
+ + +
USDT
+
+
+
+ +
+ + + +
+ +
+ + +
+
+ +
+ +
+
+ + +
%
+
+
+
+ +
+ +
+
+ <%-- --%> + +
+
+
+ + + +
+ +
+
+ + +
USDT
+
+
+
+
+
+ + +
+ +
+ +
+ +
+ + +
+
+ +
+ + +
+ +
+
+ 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_settle_address_config_update_private_key.jsp b/admin/src/main/webapp/auto_monitor_settle_address_config_update_private_key.jsp new file mode 100755 index 0000000..7691fd5 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_settle_address_config_update_private_key.jsp @@ -0,0 +1,360 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> + <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

清算配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + +
+ + + +
+
+
+ + 返回 + +
+ +
    +
  • +
  • +
+
+ +
+ +
+ + + + +
修改归集地址私钥
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_settle_order_list.jsp b/admin/src/main/webapp/auto_monitor_settle_order_list.jsp new file mode 100755 index 0000000..c737c8a --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_settle_order_list.jsp @@ -0,0 +1,428 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

清算订单记录

+ <%@ include file="include/alert.jsp"%> + + +
+
+
+ +
查询条件
+
+
+ + + + +
+
+
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+
+
+ +
+
+
操作
+ +
+
+
+
+ + + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
订单号交易哈希值发起地址转账金额到账地址状态失败原因时间
${item.order_no} + + + + ${item.txn_hash_hide} + + + + + + ${item.from_address_hide} + ${item.volume} + + ${item.to_address_hide} + + + 挂起 + + + 处理中 + + + 成功 + + + 失败 + + ${item.error} + + 转账发起 + +
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + + + + + <%@ include file="include/footer.jsp"%> +
+
+ + + + + +
+ + +
+
+
+ +
+
+ + + + +
+ + +
+
+
+
+ + + + + <%@ include file="include/js.jsp"%> +
+ + + + +
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_statistics_agent_all_list.jsp b/admin/src/main/webapp/auto_monitor_statistics_agent_all_list.jsp new file mode 100755 index 0000000..30cab55 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_statistics_agent_all_list.jsp @@ -0,0 +1,653 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

DAPP_代理商充提报表

+ + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+ +
+ + + + + + + + + <%--
+
+ +
+
+
+
+
+ +
+
+
+
+
--%> + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+ +
+
+
+ +
+
+ +
+ +
查询结果
+ <%--
+
+ 操作 +
+ +
+
+
--%> + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户充提
用户名UID用户数代理数授权转账USDT提现USDT差额(USDT)
${item.username}${item.UID} + ${item.reco_member} + 网络 + + ${item.reco_agent} + ${item.recharge_dapp} + + + + + + + + +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + +
+ + +
+ + <%@ include file="include/footer.jsp"%> + +
+ + + +
+ + + + + <%--
+ + + + --%> + +
+ + + +
+ +
+ <%-- + + --%> +
+ + +
+ +
+ + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_statistics_all_list.jsp b/admin/src/main/webapp/auto_monitor_statistics_all_list.jsp new file mode 100755 index 0000000..ac2d0c8 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_statistics_all_list.jsp @@ -0,0 +1,472 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + +<%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

DAPP_总充提报表

+ + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+ +
+ + + + + + +
+ + +
+ +
+ + +
+ + <%--
+
+
+
+ +
+
+
+
--%> + +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+
+ +
+
+
+ +
数据汇总
+
+ + + + + + + + + + + + + + <%-- --%> + + <%-- --%> + <%-- --%> + <%-- --%> + <%-- --%> + <%-- --%> + <%-- --%> + <%-- --%> + + <%-- --%> + <%-- --%> + + + + + + +
授权转账USDT提现USDT差额(USDT)
+ <%-- pattern="#0.0000" /> + + + + + + + + +
+ +
+ +
+
+
+ +
+
+ +
+ +
查询结果
+ <%--
+
+ 操作 +
+ +
+
+
--%> + +
+ + + + + + + + + + + + + + + + + + + <%-- --%> + <%-- --%> + <%-- --%> + <%-- --%> + <%-- --%> + <%-- --%> + <%-- --%> + <%-- --%> + + <%-- --%> + <%-- --%> + + <%-- + + + + + + + + + --%> + + + + + +
日期授权转账USDT提现USDT差额(USDT)
${item.date} + <%-- pattern="#0.0000" />','','','');"> + + + <%-- pattern="#0.0000" /> + + + + + + + + +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + +
+ + +
+ + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + +
+ + + + + + + + +
+ + + + + + diff --git a/admin/src/main/webapp/auto_monitor_statistics_dapp_list.jsp b/admin/src/main/webapp/auto_monitor_statistics_dapp_list.jsp new file mode 100755 index 0000000..74b7c40 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_statistics_dapp_list.jsp @@ -0,0 +1,367 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + +
+

平台运营数据汇总

+ <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+
+ + + + + +
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+ + +
+ +
+
+
+ +
+
+
+ +
数据汇总
+
+ + + + + + + + + + + + + + + + + + + + + +
总用户数授权总用户数授权总金额授权转账总金额清算总金额
${sumdata.new_user}${sumdata.approve_user}
+ +
+ +
+
+
+ +
+
+ +
+ +
查询结果
+
+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
日期当日新增用户数当日授权用户数当日授权金额当日授权转账金额当日清算金额
${item.date}${item.new_user}${item.approve_user}
+ <%@ include file="include/page_simple.jsp"%> + +
+ +
+ + +
+
+ +
+ + +
+ + +
+ + <%@ include file="include/footer.jsp"%> + + +
+ + + + + <%@ include file="include/js.jsp"%> + + + + + +
+ + + + +
+ + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_statistics_user_money_list.jsp b/admin/src/main/webapp/auto_monitor_statistics_user_money_list.jsp new file mode 100755 index 0000000..416fa77 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_statistics_user_money_list.jsp @@ -0,0 +1,167 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + +
+

用户存量资金汇总

+ <%@ include file="include/alert.jsp"%> + +
+
+ +
+ +
查询结果
+
+
+
+
+
+ + + + + + + + +<%-- --%> + +<%-- --%> + + + + +<%-- --%> + + +
账户存量
${item.wallettype_cn}usdt${amount} + 详情 +
+ +
+ +
+ + +
+
+ +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + <%@ include file="include/js.jsp"%> + + + + + + + +
+ + + + + +
+ + + \ No newline at end of file diff --git a/admin/src/main/webapp/auto_monitor_transfer_address_config_add.jsp b/admin/src/main/webapp/auto_monitor_transfer_address_config_add.jsp new file mode 100755 index 0000000..4fbce96 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_transfer_address_config_add.jsp @@ -0,0 +1,388 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> + <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

转账地址配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 新增授权地址 +
    +
  • +
  • +
+
+ +
+ +
+ + + +
基础信息
+ +
+ +
+ + +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_transfer_address_config_list.jsp b/admin/src/main/webapp/auto_monitor_transfer_address_config_list.jsp new file mode 100755 index 0000000..eda6fff --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_transfer_address_config_list.jsp @@ -0,0 +1,247 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> + <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

转账地址配置

+ + + + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ + +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + + +
+ +
+ +
+ +
查询结果
+ 新增 +
+ + + + + + + + + + + + + + + + + + + + + + +
转账地址
${item.address} +
+ + + +
+
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + +
+ + + 1 + +
+ + +
+
+ + <%@ include file="include/js.jsp"%> + + + + + + + + + + diff --git a/admin/src/main/webapp/auto_monitor_withdraw_list.jsp b/admin/src/main/webapp/auto_monitor_withdraw_list.jsp new file mode 100755 index 0000000..af503d1 --- /dev/null +++ b/admin/src/main/webapp/auto_monitor_withdraw_list.jsp @@ -0,0 +1,583 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + + + +
+

DAPP_提现订单

+ + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+ +
+ + + + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户地址UID账户类型推荐人转换ETH数量到账USDT数量状态到账地址信息创建时间审核时间备注
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.username_parent}${item.volume}${item.amount} + + 处理中 + + + 处理中... + + + 已处理 + + + 驳回 + + + 查看信息 + ${item.createTime}${item.reviewTime}${item.remarks} + + + + + + + + + + +
+ +
+ + + + + + + +
+ + +
+ +
+
+ + + +
+ +
+ + + + + + + +
+ + +
+ +
+ +
+ +
+ +
+ + + + + + + +
+ + +
+ +
+
+ + + + +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ +
+
+ + +
+
+ + + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/channel_blockchain_list.jsp b/admin/src/main/webapp/channel_blockchain_list.jsp new file mode 100755 index 0000000..12d3904 --- /dev/null +++ b/admin/src/main/webapp/channel_blockchain_list.jsp @@ -0,0 +1,296 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> --%> + <%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

区块链充值地址维护

+ + + + <%@ include file="include/alert.jsp"%> + +
+
+ + +
+
查询结果
+ + +<%-- --%> +<%-- --%> +<%-- --%> +<%-- 新增--%> +<%-- --%> +<%-- --%> +<%-- --%> + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
币种_链入名称地址
${item.coin}_${item.blockchain_name}${item.address} + + + +<%--
--%> +<%-- --%> +<%-- --%> +<%-- --%> +<%--
--%> + +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + +
+ + + + +
+ + +
+
+ + + + + + diff --git a/admin/src/main/webapp/channel_blockchain_lists.jsp b/admin/src/main/webapp/channel_blockchain_lists.jsp new file mode 100755 index 0000000..ffff422 --- /dev/null +++ b/admin/src/main/webapp/channel_blockchain_lists.jsp @@ -0,0 +1,335 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + <%@ include file="include/loading.jsp"%> + +
+ +
+

区块链充值地址维护

+ + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+ +
+ + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+ + +
+
+
+
查询结果
+ <%-- + + + 新增 + + + --%> + +
+ + + + + + + + + + + + + <%-- + + + + --%> + + + + + + + + + + + + + + <%-- + + --%> + + <%-- + + --%> + + + +
用户用户类型用户UID链名币种地址自动创建时间
${item.USER_NAME} + + + 演示用户 + + + 正式用户 + + + ${item.USERCODE}${item.CHAIN_NAME}${item.COIN_SYMBOL}${item.ADDRESS}${item.AUTO} + 查看二维码 + ${item.CREATE_TIME} + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+
+ +
+
+
+ + <%@ include file="include/footer.jsp"%> +
+ + + <%@ include file="include/js.jsp"%> + + + + + +
+ + + + +
+ + +
+
+ + + + + + diff --git a/admin/src/main/webapp/chat_check_list.jsp b/admin/src/main/webapp/chat_check_list.jsp new file mode 100755 index 0000000..8398d0b --- /dev/null +++ b/admin/src/main/webapp/chat_check_list.jsp @@ -0,0 +1,385 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + + <%@ include file="include/head.jsp"%> + + + + + + +<%@ include file="include/loading.jsp"%> + + + +
+ + + + + +
+

买家对话审核

+ <%@ include file="include/alert.jsp"%> + +
+ <%-- --%> + +
+ + + +
+
+
+ +
查询条件
+
+ +
+ + + + +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+ +
+ +
+
+
+ + + +
+
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户ID用户邮箱手机号账号类型审核状态店铺名称店铺ID消息内容会话发起时间
+ ${item.usercode} + ${item.email}${item.phone} + + 演示账号 + + + 正式账号 + + + + 已加入黑名单 + + + 已加入白名单 + + + 未审核 + + ${item.sellerName}${item.sellerCode} +
${item.content}
+
${item.create_time} + + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + +
+ +
+ + + + +
+ + +
+ +
+ +
+ + + <%@ include file="include/footer.jsp"%> + +
+ + + + +<%@ include file="include/js.jsp"%> + + + + + + + + + + + + diff --git a/admin/src/main/webapp/chat_list.jsp b/admin/src/main/webapp/chat_list.jsp new file mode 100755 index 0000000..8605a21 --- /dev/null +++ b/admin/src/main/webapp/chat_list.jsp @@ -0,0 +1,539 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + +<%@ include file="include/loading.jsp"%> + + + + +
+ + + +
+

虚拟买家对话

+ + + <%@ include file="include/alert.jsp"%> + +
+ <%-- --%> + +
+ +
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+ <%--
--%> + <%-- --%> + <%--
--%> + +
+ +
+ +
+
+
+ + + + +
+ + +
+ +
+<%-- --%> +<%-- 新增套餐--%> + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户ID用户邮箱手机号账号类型卖家ID店铺名称店铺类型会话更新时间买家备注
${item.usercode} + + ${item.unread} + + ${item.email}${item.phone} + + 演示账号 + + + 正式账号 + + ${item.sellerCode}${item.name} + + + 虚拟店铺 + + + 真实店铺 + + + ${item.updatetime}${item.remarks} +
+ + + +
+ +
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ + + +
+
+ + +
+ + +
+
+ +
+ + +
+ +
+ + + + +
+ + +
+ +
+ +
+ + +<%@ include file="include/js.jsp"%> + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/cms_add.jsp b/admin/src/main/webapp/cms_add.jsp new file mode 100755 index 0000000..73234d6 --- /dev/null +++ b/admin/src/main/webapp/cms_add.jsp @@ -0,0 +1,217 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

公告管理

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + +
+ + + +
+
+
+ +
+ 新增公告 +
    +
  • +
  • +
+
+ +
+ +
+ + +
+ +
+ +
+
+ + +
+ +
+
+ + + +
+
+
+
+ +
+
+ + +
+
+
+
+ +
+
+ + +
+
+
+
+ +
+ <%-- --%> + + +
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + diff --git a/admin/src/main/webapp/cms_list.jsp b/admin/src/main/webapp/cms_list.jsp new file mode 100755 index 0000000..0936562 --- /dev/null +++ b/admin/src/main/webapp/cms_list.jsp @@ -0,0 +1,390 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + +
+ +
+

用户端内容管理

+ + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+ + +
+ +
+ +
+ +
+ +
+
+
+
+ +
+
+ +
+
查询结果
+ + + + + 新增公告 + + + +
+ + + + + + +<%-- --%> + + + + + + + + + + +<%-- --%> + + + + + + + + + +
标题模块语言状态创建日期
${item.title}--%> +<%-- --%> +<%-- --%> +<%-- 公告管理--%> +<%-- --%> +<%-- --%> +<%-- 文章管理--%> +<%-- --%> +<%-- --%> +<%-- + + + + 中文 + + + 英文 + + + 越南语 + + + 印度语 + + + 印度尼西亚语 + + + 繁体中文 + + + 德语 + + + 法语 + + + 日语 + + + 韩语 + + + 泰语 + + + 俄语 + + + 马来西亚语 + + + 葡萄牙语 + + + 西班牙语 + + + 希腊语 + + + 意大利语 + + + 土耳其语 + + + 南非荷兰语 + + + 菲律宾语 + + + 阿拉伯语 + + + + + + 启用 + + + 禁用 + + + + ${item.createTime} + + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + +
+ +
+
+
+ +
+
+
+ + +
+ + +
+
+
+ + + <%@ include file="include/footer.jsp"%> + +
+ + <%@ include file="include/js.jsp"%> + +
+ + + + +
+ + + + + + diff --git a/admin/src/main/webapp/cms_update.jsp b/admin/src/main/webapp/cms_update.jsp new file mode 100755 index 0000000..43d0352 --- /dev/null +++ b/admin/src/main/webapp/cms_update.jsp @@ -0,0 +1,217 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

公告管理

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + +
+ + + +
+
+
+ +
+ 修改公告 +
    +
  • +
  • +
+
+ +
+ +
+ + + +
+ +
+ +
+
+ +
+ +
+
+ + + +
+
+
+
+ +
+
+ + +
+
+
+
+ +
+
+ + +
+
+
+ +
+ +
+ + +
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + diff --git a/admin/src/main/webapp/code_log_get.jsp b/admin/src/main/webapp/code_log_get.jsp new file mode 100755 index 0000000..1e576d0 --- /dev/null +++ b/admin/src/main/webapp/code_log_get.jsp @@ -0,0 +1,121 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + +
+
+

验证码发送日志

+ <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ + +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + +
手机号或邮箱号日志时间
${item.target}${item.log}${item.createTime}
+ <%@ include file="include/page_simple.jsp"%> +
+
+
+
+ +
+ + <%@ include file="include/footer.jsp"%> + +
+ + <%@ include file="include/js.jsp"%> + + + \ No newline at end of file diff --git a/admin/src/main/webapp/code_log_list.jsp b/admin/src/main/webapp/code_log_list.jsp new file mode 100755 index 0000000..63578a1 --- /dev/null +++ b/admin/src/main/webapp/code_log_list.jsp @@ -0,0 +1,176 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + +
+
+

验证码发送日志

+ <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ + +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + +
手机号或邮箱号日志时间
${item.target}点击查看${item.createTime}
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + + + +
+
+ + +
+ + + +
+ + + <%@ include file="include/footer.jsp"%> + +
+ + + + + <%@ include file="include/js.jsp"%> + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/contract_apply_order_list.jsp b/admin/src/main/webapp/contract_apply_order_list.jsp new file mode 100755 index 0000000..02e02fe --- /dev/null +++ b/admin/src/main/webapp/contract_apply_order_list.jsp @@ -0,0 +1,327 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

永续委托单

+ + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+ +
+ + + + + +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ <%-- --%> + +
+
+
+
+ +
+ +
+ + + +
+ +
+ +
+
+
+ + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户UID账户类型品种操作委托张数杠杆报价类型限价止盈止损状态创建时间
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.itemname} + + + + + + 限价 + 市价 + ${item.stop_price_profit}/${item.stop_price_loss} + 已提交 + 已撤销 + + 委托完成 + + ${item.createTime} + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + +
+
+ + +
+
+ <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + +
+ + + + +
+ + + + + + + + diff --git a/admin/src/main/webapp/contract_install_add.jsp b/admin/src/main/webapp/contract_install_add.jsp new file mode 100755 index 0000000..29a2d68 --- /dev/null +++ b/admin/src/main/webapp/contract_install_add.jsp @@ -0,0 +1,247 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

交割合约管理

+ + <%@ include file="include/alert.jsp"%> + + + +
+ action="<%=basePath%>normal/adminContractManageAction!listPara.action" + method="post" id="queryForm"> + + + + +
+ + + +
+
+
+ +
+ + 修改合约参数 + + + 新增合约参数 + +
    +
  • +
  • +
+
+ +

交割收益:交割收益计算方式(0~100百分制)。

+ +
+ +
+ + + + + + + +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ <%-- --%> + +
+
+ + <%--
+ +
+
+ +
+ +
+
+
+
--%> + +
+ +
+
+ + +
--
+ + +
%
+
+
+
+ +
+ +
+ + +
+
+ + + +
+ +
+
+ + +
%
+
+
+
+ +
+ +
+ + +
+
+ + <%--
+ +
+ +
+
+
+ +
+ +
+
--%> + +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/contract_manage_add.jsp b/admin/src/main/webapp/contract_manage_add.jsp new file mode 100755 index 0000000..46bc028 --- /dev/null +++ b/admin/src/main/webapp/contract_manage_add.jsp @@ -0,0 +1,285 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

交割合约配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + + +
+ + + +
+
+
+ +
+ + 修改合约产品 + + + 新增合约产品 + +
    +
  • +
  • +
+
+ +
+ + <%-- --%> + +
+ + + +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+
+ + +
+
+
+
+ +
+ +
+ + +
+ 交易对选择 +
+ +
+
+ 取消 + 保存 +
+
+ +
+ + <%--
--%> + +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + +
+ + + + + <%--
+ + + + --%> + +
+ + + + +
+ + <%@ include file="include/js.jsp"%> + + + + + + +
+ + + + + + diff --git a/admin/src/main/webapp/contract_manage_add_symbols_list.jsp b/admin/src/main/webapp/contract_manage_add_symbols_list.jsp new file mode 100755 index 0000000..6c4ef61 --- /dev/null +++ b/admin/src/main/webapp/contract_manage_add_symbols_list.jsp @@ -0,0 +1,107 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false" deferredSyntaxAllowedAsLiteral="true"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +
+ + <%@ include file="include/alert.jsp"%> + +
+
+
+
+ +
+
+
+ + +
+
+ +
+
+ + + + + + + + + + + + + + + + + +
报价币种
+ ${item} +
+ + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
基础币种交易对
+ +
+ + +
+
${item.base_currency}${item.symbol}
+ + +
+ +
+ +
+
+ + + +
+ + diff --git a/admin/src/main/webapp/contract_manage_list.jsp b/admin/src/main/webapp/contract_manage_list.jsp new file mode 100755 index 0000000..2512f91 --- /dev/null +++ b/admin/src/main/webapp/contract_manage_list.jsp @@ -0,0 +1,175 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

交割合约管理

+ + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ + +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+
+ +
+ +
查询结果
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
名称代码交易对
${item.name}${item.symbol}${item.symbol_data} + + <%-- --%> + +
+ + + +
+ + <%--
--%> + +
+ + +
+ +
+ + +
+ +
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + +
+ +
+ + + + diff --git a/admin/src/main/webapp/contract_order_history_list.jsp b/admin/src/main/webapp/contract_order_history_list.jsp new file mode 100755 index 0000000..d6310ed --- /dev/null +++ b/admin/src/main/webapp/contract_order_history_list.jsp @@ -0,0 +1,334 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> --%> + <%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

永续持仓单 历史单

+ + + + <%@ include file="include/alert.jsp"%> + + + +
+
+
+
查询条件
+
+ +
+ + <%-- --%> + + + +
+ +
+
+
+
+ <%-- --%> + +
+
+
+
+ +
+
+
+
+ <%-- --%> + +
+
+
+
+ +
+
+
+
+ <%-- --%> + +
+
+
+
+ +
+ +
+
+ <%-- --%> + +
+
+ <%-- --%> + +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+
+
+ + + +
+ <%@ include file="contract_order_history_list_content.jsp"%> +
+ +
+ + + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + +
+ + + + + + +
+ + + + + + + + + + + + diff --git a/admin/src/main/webapp/contract_order_history_list_content.jsp b/admin/src/main/webapp/contract_order_history_list_content.jsp new file mode 100755 index 0000000..ecac4d4 --- /dev/null +++ b/admin/src/main/webapp/contract_order_history_list_content.jsp @@ -0,0 +1,215 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +
+ + +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + + + + + + <%-- --%> + + + + + + + + + + + + + + + + + + <%-- --%> + + + +
用户UID账户类型品种操作成交均价止盈止损剩余/委托金额剩余/委托保证金用户钱包余额盈亏状态创建时间平仓时间
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.itemname} + + + + + ${item.trade_avg_price}${item.stop_price_profit}/${item.stop_price_loss} + / + + + / + + + + + + + + + + + + + + + + + + + + + + + + + + + 持仓 + + + 已平仓 + + ${item.createTime}${item.closeTime} + + + +
+ + + +
+ +
+ +
+ +
+
+ + +
+
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+ + \ No newline at end of file diff --git a/admin/src/main/webapp/contract_order_list.jsp b/admin/src/main/webapp/contract_order_list.jsp new file mode 100755 index 0000000..f411854 --- /dev/null +++ b/admin/src/main/webapp/contract_order_list.jsp @@ -0,0 +1,532 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

永续持仓单 当前单

+ + + + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+ + + +
+ + <%-- --%> + + + +
+ +
+
+
+
+ <%-- --%> + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+ +
+
+ <%-- --%> + +
+
+ <%-- --%> + +
+
+ +
+
+ +
+ + + +
+
+
操作
+
+ +
+
+
+ +
+ +
+
+
+
+ <%-- --%> + +
+
+
+
+ +
+ +
+ + +
+ +
+ +
+ +
+
+
+ + + +
+
+ + +
+ + + + + + + +
+ 查询结果 +
+
    +
  • +
  • +
+
+
+ <%@ include file="contract_order_list_content.jsp"%> +
+
+
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + +
+ + + + + + + <%-- + + + + --%> +
+ + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/contract_order_list_content.jsp b/admin/src/main/webapp/contract_order_list_content.jsp new file mode 100755 index 0000000..ae8fbfd --- /dev/null +++ b/admin/src/main/webapp/contract_order_list_content.jsp @@ -0,0 +1,173 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + + + + + + + + + + + + + + + + +
用户UID账户类型品种操作成交均价止盈止损剩余/委托金额剩余/委托保证金用户钱包余额盈亏状态创建时间
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.itemname} + + + + + ${item.trade_avg_price}${item.stop_price_profit}/${item.stop_price_loss} + / + + + / + + + + + + + + + + + + + + + + + + + + + + + + + + + 持仓 + + + 已平仓 + + ${item.createTime} + + + + + 平仓 + + +
+ + +
+
+ + +
+
+ +<%@ include file="include/page_simple.jsp"%> + + \ No newline at end of file diff --git a/admin/src/main/webapp/contract_para_list.jsp b/admin/src/main/webapp/contract_para_list.jsp new file mode 100755 index 0000000..3274fc3 --- /dev/null +++ b/admin/src/main/webapp/contract_para_list.jsp @@ -0,0 +1,257 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

交割合约 交易参数管理

+ + <%@ include file="include/alert.jsp"%> + + +
+ + + +
+ + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ + +
+
+
+
+ + + + +
+ +
+ + +
+ +
+ +
+ +
+
+
+ +
+
+ +
+ +
查询结果
+ + + + 新增 + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
代码时间交割收益(%)最低金额手续费(%)
${item.symbol}${item.timeNum} + ( + + + + + ) + + ${item.profit_ratio} + ~ + ${item.profit_ratio_max} + ${item.unit_amount}${item.unit_fee} + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ +
+ +
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + +
+ + + + +
+ + +
+ +
+ + + + + + diff --git a/admin/src/main/webapp/css/bootstrap-datetimepicker.min.css b/admin/src/main/webapp/css/bootstrap-datetimepicker.min.css new file mode 100755 index 0000000..c4a5c3e --- /dev/null +++ b/admin/src/main/webapp/css/bootstrap-datetimepicker.min.css @@ -0,0 +1,9 @@ +/*! + * Datetimepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */.datetimepicker{z-index:1999 !important;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr}.datetimepicker-inline{width:220px}.datetimepicker.datetimepicker-rtl{direction:rtl}.datetimepicker.datetimepicker-rtl table tr td span{float:right}.datetimepicker-dropdown,.datetimepicker-dropdown-left{top:0;left:0}[class*=" datetimepicker-dropdown"]:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute}[class*=" datetimepicker-dropdown"]:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute}[class*=" datetimepicker-dropdown-top"]:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0}[class*=" datetimepicker-dropdown-top"]:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #fff;border-bottom:0}.datetimepicker-dropdown-bottom-left:before{top:-7px;right:6px}.datetimepicker-dropdown-bottom-left:after{top:-6px;right:7px}.datetimepicker-dropdown-bottom-right:before{top:-7px;left:6px}.datetimepicker-dropdown-bottom-right:after{top:-6px;left:7px}.datetimepicker-dropdown-top-left:before{bottom:-7px;right:6px}.datetimepicker-dropdown-top-left:after{bottom:-6px;right:7px}.datetimepicker-dropdown-top-right:before{bottom:-7px;left:6px}.datetimepicker-dropdown-top-right:after{bottom:-6px;left:7px}.datetimepicker>div{display:none}.datetimepicker.minutes div.datetimepicker-minutes{display:block}.datetimepicker.hours div.datetimepicker-hours{display:block}.datetimepicker.days div.datetimepicker-days{display:block}.datetimepicker.months div.datetimepicker-months{display:block}.datetimepicker.years div.datetimepicker-years{display:block}.datetimepicker table{margin:0}.datetimepicker td,.datetimepicker th{text-align:center;width:20px;height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0}.table-striped .datetimepicker table tr td,.table-striped .datetimepicker table tr th{background-color:transparent}.datetimepicker table tr td.minute:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.hour:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.day:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.old,.datetimepicker table tr td.new{color:#999}.datetimepicker table tr td.disabled,.datetimepicker table tr td.disabled:hover{background:0;color:#999;cursor:default}.datetimepicker table tr td.today,.datetimepicker table tr td.today:hover,.datetimepicker table tr td.today.disabled,.datetimepicker table tr td.today.disabled:hover{background-color:#fde19a;background-image:-moz-linear-gradient(top,#fdd49a,#fdf59a);background-image:-ms-linear-gradient(top,#fdd49a,#fdf59a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fdd49a),to(#fdf59a));background-image:-webkit-linear-gradient(top,#fdd49a,#fdf59a);background-image:-o-linear-gradient(top,#fdd49a,#fdf59a);background-image:linear-gradient(to bottom,#fdd49a,#fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a',endColorstr='#fdf59a',GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.datetimepicker table tr td.today:hover,.datetimepicker table tr td.today:hover:hover,.datetimepicker table tr td.today.disabled:hover,.datetimepicker table tr td.today.disabled:hover:hover,.datetimepicker table tr td.today:active,.datetimepicker table tr td.today:hover:active,.datetimepicker table tr td.today.disabled:active,.datetimepicker table tr td.today.disabled:hover:active,.datetimepicker table tr td.today.active,.datetimepicker table tr td.today:hover.active,.datetimepicker table tr td.today.disabled.active,.datetimepicker table tr td.today.disabled:hover.active,.datetimepicker table tr td.today.disabled,.datetimepicker table tr td.today:hover.disabled,.datetimepicker table tr td.today.disabled.disabled,.datetimepicker table tr td.today.disabled:hover.disabled,.datetimepicker table tr td.today[disabled],.datetimepicker table tr td.today:hover[disabled],.datetimepicker table tr td.today.disabled[disabled],.datetimepicker table tr td.today.disabled:hover[disabled]{background-color:#fdf59a}.datetimepicker table tr td.today:active,.datetimepicker table tr td.today:hover:active,.datetimepicker table tr td.today.disabled:active,.datetimepicker table tr td.today.disabled:hover:active,.datetimepicker table tr td.today.active,.datetimepicker table tr td.today:hover.active,.datetimepicker table tr td.today.disabled.active,.datetimepicker table tr td.today.disabled:hover.active{background-color:#fbf069}.datetimepicker table tr td.active,.datetimepicker table tr td.active:hover,.datetimepicker table tr td.active.disabled,.datetimepicker table tr td.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-ms-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc',endColorstr='#0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datetimepicker table tr td.active:hover,.datetimepicker table tr td.active:hover:hover,.datetimepicker table tr td.active.disabled:hover,.datetimepicker table tr td.active.disabled:hover:hover,.datetimepicker table tr td.active:active,.datetimepicker table tr td.active:hover:active,.datetimepicker table tr td.active.disabled:active,.datetimepicker table tr td.active.disabled:hover:active,.datetimepicker table tr td.active.active,.datetimepicker table tr td.active:hover.active,.datetimepicker table tr td.active.disabled.active,.datetimepicker table tr td.active.disabled:hover.active,.datetimepicker table tr td.active.disabled,.datetimepicker table tr td.active:hover.disabled,.datetimepicker table tr td.active.disabled.disabled,.datetimepicker table tr td.active.disabled:hover.disabled,.datetimepicker table tr td.active[disabled],.datetimepicker table tr td.active:hover[disabled],.datetimepicker table tr td.active.disabled[disabled],.datetimepicker table tr td.active.disabled:hover[disabled]{background-color:#04c}.datetimepicker table tr td.active:active,.datetimepicker table tr td.active:hover:active,.datetimepicker table tr td.active.disabled:active,.datetimepicker table tr td.active.disabled:hover:active,.datetimepicker table tr td.active.active,.datetimepicker table tr td.active:hover.active,.datetimepicker table tr td.active.disabled.active,.datetimepicker table tr td.active.disabled:hover.active{background-color:#039}.datetimepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.datetimepicker .datetimepicker-hours span{height:26px;line-height:26px}.datetimepicker .datetimepicker-hours table tr td span.hour_am,.datetimepicker .datetimepicker-hours table tr td span.hour_pm{width:14.6%}.datetimepicker .datetimepicker-hours fieldset legend,.datetimepicker .datetimepicker-minutes fieldset legend{margin-bottom:inherit;line-height:30px}.datetimepicker .datetimepicker-minutes span{height:26px;line-height:26px}.datetimepicker table tr td span:hover{background:#eee}.datetimepicker table tr td span.disabled,.datetimepicker table tr td span.disabled:hover{background:0;color:#999;cursor:default}.datetimepicker table tr td span.active,.datetimepicker table tr td span.active:hover,.datetimepicker table tr td span.active.disabled,.datetimepicker table tr td span.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-ms-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc',endColorstr='#0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datetimepicker table tr td span.active:hover,.datetimepicker table tr td span.active:hover:hover,.datetimepicker table tr td span.active.disabled:hover,.datetimepicker table tr td span.active.disabled:hover:hover,.datetimepicker table tr td span.active:active,.datetimepicker table tr td span.active:hover:active,.datetimepicker table tr td span.active.disabled:active,.datetimepicker table tr td span.active.disabled:hover:active,.datetimepicker table tr td span.active.active,.datetimepicker table tr td span.active:hover.active,.datetimepicker table tr td span.active.disabled.active,.datetimepicker table tr td span.active.disabled:hover.active,.datetimepicker table tr td span.active.disabled,.datetimepicker table tr td span.active:hover.disabled,.datetimepicker table tr td span.active.disabled.disabled,.datetimepicker table tr td span.active.disabled:hover.disabled,.datetimepicker table tr td span.active[disabled],.datetimepicker table tr td span.active:hover[disabled],.datetimepicker table tr td span.active.disabled[disabled],.datetimepicker table tr td span.active.disabled:hover[disabled]{background-color:#04c}.datetimepicker table tr td span.active:active,.datetimepicker table tr td span.active:hover:active,.datetimepicker table tr td span.active.disabled:active,.datetimepicker table tr td span.active.disabled:hover:active,.datetimepicker table tr td span.active.active,.datetimepicker table tr td span.active:hover.active,.datetimepicker table tr td span.active.disabled.active,.datetimepicker table tr td span.active.disabled:hover.active{background-color:#039}.datetimepicker table tr td span.old{color:#999}.datetimepicker th.switch{width:145px}.datetimepicker th span.glyphicon{pointer-events:none}.datetimepicker thead tr:first-child th,.datetimepicker tfoot th{cursor:pointer}.datetimepicker thead tr:first-child th:hover,.datetimepicker tfoot th:hover{background:#eee}.input-append.date .add-on i,.input-prepend.date .add-on i,.input-group.date .input-group-addon span{cursor:pointer;width:14px;height:14px} \ No newline at end of file diff --git a/admin/src/main/webapp/css/bootstrap.css b/admin/src/main/webapp/css/bootstrap.css new file mode 100755 index 0000000..2cfb2fa --- /dev/null +++ b/admin/src/main/webapp/css/bootstrap.css @@ -0,0 +1,6580 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} + +.avatar { + position: relative; + display: block; + overflow: hidden; + width: 100%; + height: auto; + line-height: 34px; + /*border: 1px solid #99D3F5;*/ + border-radius: 4px; + text-align: center; + /*background: #D0EEFF;*/ + cursor: pointer; +} + +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 22px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eee; + opacity: 1; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.form-group-sm .form-control { + height: 30px; + line-height: 30px; +} +textarea.form-group-sm .form-control, +select[multiple].form-group-sm .form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.form-group-lg .form-control { + height: 46px; + line-height: 46px; +} +textarea.form-group-lg .form-control, +select[multiple].form-group-lg .form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; + visibility: hidden; +} +.collapse.in { + display: block; + visibility: visible; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px solid; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; + visibility: hidden; +} +.tab-content > .active { + display: block; + visibility: visible; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + visibility: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +a.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: absolute; + top: 0; + right: 0; + left: 0; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + min-height: 16.42857143px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-weight: normal; + line-height: 1.4; + visibility: visible; + filter: alpha(opacity=0); + opacity: 0; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; + visibility: hidden !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/admin/src/main/webapp/css/font-awesome.min.css b/admin/src/main/webapp/css/font-awesome.min.css new file mode 100755 index 0000000..48f28ff --- /dev/null +++ b/admin/src/main/webapp/css/font-awesome.min.css @@ -0,0 +1,2281 @@ +/*! + * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.3.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') + format('embedded-opentype'), + url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), + url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), + url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), + url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') + format('svg'); + font-weight: normal; + font-style: normal +} + +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + transform: translate(0, 0) +} + +.fa-lg { + font-size: 1.33333333em; + line-height: .75em; + vertical-align: -15% +} + +.fa-2x { + font-size: 2em +} + +.fa-3x { + font-size: 3em +} + +.fa-4x { + font-size: 4em +} + +.fa-5x { + font-size: 5em +} + +.fa-fw { + width: 1.28571429em; + text-align: center +} + +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none +} + +.fa-ul>li { + position: relative +} + +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: .14285714em; + text-align: center +} + +.fa-li.fa-lg { + left: -1.85714286em +} + +.fa-border { + padding: .2em .25em .15em; + border: solid .08em #eee; + border-radius: .1em +} + +.pull-right { + float: right +} + +.pull-left { + float: left +} + +.fa.pull-left { + margin-right: .3em +} + +.fa.pull-right { + margin-left: .3em +} + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear +} + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8) +} + +@ +-webkit-keyframes fa-spin { 0%{ + -webkit-transform: rotate(0deg); + transform: rotate(0deg) +} + +100%{ +-webkit-transform +:rotate(359deg) +;transform +:rotate(359deg) +} +} +@ +keyframes fa-spin { 0%{ + -webkit-transform: rotate(0deg); + transform: rotate(0deg) +} + +100%{ +-webkit-transform +:rotate(359deg) +;transform +:rotate(359deg) +} +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg) +} + +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg) +} + +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg) +} + +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1) +} + +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1) +} + +:root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, + :root .fa-flip-vertical { + filter: none +} + +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle +} + +.fa-stack-1x, .fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center +} + +.fa-stack-1x { + line-height: inherit +} + +.fa-stack-2x { + font-size: 2em +} + +.fa-inverse { + color: #fff +} + +.fa-glass:before { + content: "\f000" +} + +.fa-music:before { + content: "\f001" +} + +.fa-search:before { + content: "\f002" +} + +.fa-envelope-o:before { + content: "\f003" +} + +.fa-heart:before { + content: "\f004" +} + +.fa-star:before { + content: "\f005" +} + +.fa-star-o:before { + content: "\f006" +} + +.fa-user:before { + content: "\f007" +} + +.fa-film:before { + content: "\f008" +} + +.fa-th-large:before { + content: "\f009" +} + +.fa-th:before { + content: "\f00a" +} + +.fa-th-list:before { + content: "\f00b" +} + +.fa-check:before { + content: "\f00c" +} + +.fa-remove:before, .fa-close:before, .fa-times:before { + content: "\f00d" +} + +.fa-search-plus:before { + content: "\f00e" +} + +.fa-search-minus:before { + content: "\f010" +} + +.fa-power-off:before { + content: "\f011" +} + +.fa-signal:before { + content: "\f012" +} + +.fa-gear:before, .fa-cog:before { + content: "\f013" +} + +.fa-trash-o:before { + content: "\f014" +} + +.fa-home:before { + content: "\f015" +} + +.fa-file-o:before { + content: "\f016" +} + +.fa-clock-o:before { + content: "\f017" +} + +.fa-road:before { + content: "\f018" +} + +.fa-download:before { + content: "\f019" +} + +.fa-arrow-circle-o-down:before { + content: "\f01a" +} + +.fa-arrow-circle-o-up:before { + content: "\f01b" +} + +.fa-inbox:before { + content: "\f01c" +} + +.fa-play-circle-o:before { + content: "\f01d" +} + +.fa-rotate-right:before, .fa-repeat:before { + content: "\f01e" +} + +.fa-refresh:before { + content: "\f021" +} + +.fa-list-alt:before { + content: "\f022" +} + +.fa-lock:before { + content: "\f023" +} + +.fa-flag:before { + content: "\f024" +} + +.fa-headphones:before { + content: "\f025" +} + +.fa-volume-off:before { + content: "\f026" +} + +.fa-volume-down:before { + content: "\f027" +} + +.fa-volume-up:before { + content: "\f028" +} + +.fa-qrcode:before { + content: "\f029" +} + +.fa-barcode:before { + content: "\f02a" +} + +.fa-tag:before { + content: "\f02b" +} + +.fa-tags:before { + content: "\f02c" +} + +.fa-book:before { + content: "\f02d" +} + +.fa-bookmark:before { + content: "\f02e" +} + +.fa-print:before { + content: "\f02f" +} + +.fa-camera:before { + content: "\f030" +} + +.fa-font:before { + content: "\f031" +} + +.fa-bold:before { + content: "\f032" +} + +.fa-italic:before { + content: "\f033" +} + +.fa-text-height:before { + content: "\f034" +} + +.fa-text-width:before { + content: "\f035" +} + +.fa-align-left:before { + content: "\f036" +} + +.fa-align-center:before { + content: "\f037" +} + +.fa-align-right:before { + content: "\f038" +} + +.fa-align-justify:before { + content: "\f039" +} + +.fa-list:before { + content: "\f03a" +} + +.fa-dedent:before, .fa-outdent:before { + content: "\f03b" +} + +.fa-indent:before { + content: "\f03c" +} + +.fa-video-camera:before { + content: "\f03d" +} + +.fa-photo:before, .fa-image:before, .fa-picture-o:before { + content: "\f03e" +} + +.fa-pencil:before { + content: "\f040" +} + +.fa-map-marker:before { + content: "\f041" +} + +.fa-adjust:before { + content: "\f042" +} + +.fa-tint:before { + content: "\f043" +} + +.fa-edit:before, .fa-pencil-square-o:before { + content: "\f044" +} + +.fa-share-square-o:before { + content: "\f045" +} + +.fa-check-square-o:before { + content: "\f046" +} + +.fa-arrows:before { + content: "\f047" +} + +.fa-step-backward:before { + content: "\f048" +} + +.fa-fast-backward:before { + content: "\f049" +} + +.fa-backward:before { + content: "\f04a" +} + +.fa-play:before { + content: "\f04b" +} + +.fa-pause:before { + content: "\f04c" +} + +.fa-stop:before { + content: "\f04d" +} + +.fa-forward:before { + content: "\f04e" +} + +.fa-fast-forward:before { + content: "\f050" +} + +.fa-step-forward:before { + content: "\f051" +} + +.fa-eject:before { + content: "\f052" +} + +.fa-chevron-left:before { + content: "\f053" +} + +.fa-chevron-right:before { + content: "\f054" +} + +.fa-plus-circle:before { + content: "\f055" +} + +.fa-minus-circle:before { + content: "\f056" +} + +.fa-times-circle:before { + content: "\f057" +} + +.fa-check-circle:before { + content: "\f058" +} + +.fa-question-circle:before { + content: "\f059" +} + +.fa-info-circle:before { + content: "\f05a" +} + +.fa-crosshairs:before { + content: "\f05b" +} + +.fa-times-circle-o:before { + content: "\f05c" +} + +.fa-check-circle-o:before { + content: "\f05d" +} + +.fa-ban:before { + content: "\f05e" +} + +.fa-arrow-left:before { + content: "\f060" +} + +.fa-arrow-right:before { + content: "\f061" +} + +.fa-arrow-up:before { + content: "\f062" +} + +.fa-arrow-down:before { + content: "\f063" +} + +.fa-mail-forward:before, .fa-share:before { + content: "\f064" +} + +.fa-expand:before { + content: "\f065" +} + +.fa-compress:before { + content: "\f066" +} + +.fa-plus:before { + content: "\f067" +} + +.fa-minus:before { + content: "\f068" +} + +.fa-asterisk:before { + content: "\f069" +} + +.fa-exclamation-circle:before { + content: "\f06a" +} + +.fa-gift:before { + content: "\f06b" +} + +.fa-leaf:before { + content: "\f06c" +} + +.fa-fire:before { + content: "\f06d" +} + +.fa-eye:before { + content: "\f06e" +} + +.fa-eye-slash:before { + content: "\f070" +} + +.fa-warning:before, .fa-exclamation-triangle:before { + content: "\f071" +} + +.fa-plane:before { + content: "\f072" +} + +.fa-calendar:before { + content: "\f073" +} + +.fa-random:before { + content: "\f074" +} + +.fa-comment:before { + content: "\f075" +} + +.fa-magnet:before { + content: "\f076" +} + +.fa-chevron-up:before { + content: "\f077" +} + +.fa-chevron-down:before { + content: "\f078" +} + +.fa-retweet:before { + content: "\f079" +} + +.fa-shopping-cart:before { + content: "\f07a" +} + +.fa-folder:before { + content: "\f07b" +} + +.fa-folder-open:before { + content: "\f07c" +} + +.fa-arrows-v:before { + content: "\f07d" +} + +.fa-arrows-h:before { + content: "\f07e" +} + +.fa-bar-chart-o:before, .fa-bar-chart:before { + content: "\f080" +} + +.fa-twitter-square:before { + content: "\f081" +} + +.fa-facebook-square:before { + content: "\f082" +} + +.fa-camera-retro:before { + content: "\f083" +} + +.fa-key:before { + content: "\f084" +} + +.fa-gears:before, .fa-cogs:before { + content: "\f085" +} + +.fa-comments:before { + content: "\f086" +} + +.fa-thumbs-o-up:before { + content: "\f087" +} + +.fa-thumbs-o-down:before { + content: "\f088" +} + +.fa-star-half:before { + content: "\f089" +} + +.fa-heart-o:before { + content: "\f08a" +} + +.fa-sign-out:before { + content: "\f08b" +} + +.fa-linkedin-square:before { + content: "\f08c" +} + +.fa-thumb-tack:before { + content: "\f08d" +} + +.fa-external-link:before { + content: "\f08e" +} + +.fa-sign-in:before { + content: "\f090" +} + +.fa-trophy:before { + content: "\f091" +} + +.fa-github-square:before { + content: "\f092" +} + +.fa-upload:before { + content: "\f093" +} + +.fa-lemon-o:before { + content: "\f094" +} + +.fa-phone:before { + content: "\f095" +} + +.fa-square-o:before { + content: "\f096" +} + +.fa-bookmark-o:before { + content: "\f097" +} + +.fa-phone-square:before { + content: "\f098" +} + +.fa-twitter:before { + content: "\f099" +} + +.fa-facebook-f:before, .fa-facebook:before { + content: "\f09a" +} + +.fa-github:before { + content: "\f09b" +} + +.fa-unlock:before { + content: "\f09c" +} + +.fa-credit-card:before { + content: "\f09d" +} + +.fa-rss:before { + content: "\f09e" +} + +.fa-hdd-o:before { + content: "\f0a0" +} + +.fa-bullhorn:before { + content: "\f0a1" +} + +.fa-bell:before { + content: "\f0f3" +} + +.fa-certificate:before { + content: "\f0a3" +} + +.fa-hand-o-right:before { + content: "\f0a4" +} + +.fa-hand-o-left:before { + content: "\f0a5" +} + +.fa-hand-o-up:before { + content: "\f0a6" +} + +.fa-hand-o-down:before { + content: "\f0a7" +} + +.fa-arrow-circle-left:before { + content: "\f0a8" +} + +.fa-arrow-circle-right:before { + content: "\f0a9" +} + +.fa-arrow-circle-up:before { + content: "\f0aa" +} + +.fa-arrow-circle-down:before { + content: "\f0ab" +} + +.fa-globe:before { + content: "\f0ac" +} + +.fa-wrench:before { + content: "\f0ad" +} + +.fa-tasks:before { + content: "\f0ae" +} + +.fa-filter:before { + content: "\f0b0" +} + +.fa-briefcase:before { + content: "\f0b1" +} + +.fa-arrows-alt:before { + content: "\f0b2" +} + +.fa-group:before, .fa-users:before { + content: "\f0c0" +} + +.fa-chain:before, .fa-link:before { + content: "\f0c1" +} + +.fa-cloud:before { + content: "\f0c2" +} + +.fa-flask:before { + content: "\f0c3" +} + +.fa-cut:before, .fa-scissors:before { + content: "\f0c4" +} + +.fa-copy:before, .fa-files-o:before { + content: "\f0c5" +} + +.fa-paperclip:before { + content: "\f0c6" +} + +.fa-save:before, .fa-floppy-o:before { + content: "\f0c7" +} + +.fa-square:before { + content: "\f0c8" +} + +.fa-navicon:before, .fa-reorder:before, .fa-bars:before { + content: "\f0c9" +} + +.fa-list-ul:before { + content: "\f0ca" +} + +.fa-list-ol:before { + content: "\f0cb" +} + +.fa-strikethrough:before { + content: "\f0cc" +} + +.fa-underline:before { + content: "\f0cd" +} + +.fa-table:before { + content: "\f0ce" +} + +.fa-magic:before { + content: "\f0d0" +} + +.fa-truck:before { + content: "\f0d1" +} + +.fa-pinterest:before { + content: "\f0d2" +} + +.fa-pinterest-square:before { + content: "\f0d3" +} + +.fa-google-plus-square:before { + content: "\f0d4" +} + +.fa-google-plus:before { + content: "\f0d5" +} + +.fa-money:before { + content: "\f0d6" +} + +.fa-caret-down:before { + content: "\f0d7" +} + +.fa-caret-up:before { + content: "\f0d8" +} + +.fa-caret-left:before { + content: "\f0d9" +} + +.fa-caret-right:before { + content: "\f0da" +} + +.fa-columns:before { + content: "\f0db" +} + +.fa-unsorted:before, .fa-sort:before { + content: "\f0dc" +} + +.fa-sort-down:before, .fa-sort-desc:before { + content: "\f0dd" +} + +.fa-sort-up:before, .fa-sort-asc:before { + content: "\f0de" +} + +.fa-envelope:before { + content: "\f0e0" +} + +.fa-linkedin:before { + content: "\f0e1" +} + +.fa-rotate-left:before, .fa-undo:before { + content: "\f0e2" +} + +.fa-legal:before, .fa-gavel:before { + content: "\f0e3" +} + +.fa-dashboard:before, .fa-tachometer:before { + content: "\f0e4" +} + +.fa-comment-o:before { + content: "\f0e5" +} + +.fa-comments-o:before { + content: "\f0e6" +} + +.fa-flash:before, .fa-bolt:before { + content: "\f0e7" +} + +.fa-sitemap:before { + content: "\f0e8" +} + +.fa-umbrella:before { + content: "\f0e9" +} + +.fa-paste:before, .fa-clipboard:before { + content: "\f0ea" +} + +.fa-lightbulb-o:before { + content: "\f0eb" +} + +.fa-exchange:before { + content: "\f0ec" +} + +.fa-cloud-download:before { + content: "\f0ed" +} + +.fa-cloud-upload:before { + content: "\f0ee" +} + +.fa-user-md:before { + content: "\f0f0" +} + +.fa-stethoscope:before { + content: "\f0f1" +} + +.fa-suitcase:before { + content: "\f0f2" +} + +.fa-bell-o:before { + content: "\f0a2" +} + +.fa-coffee:before { + content: "\f0f4" +} + +.fa-cutlery:before { + content: "\f0f5" +} + +.fa-file-text-o:before { + content: "\f0f6" +} + +.fa-building-o:before { + content: "\f0f7" +} + +.fa-hospital-o:before { + content: "\f0f8" +} + +.fa-ambulance:before { + content: "\f0f9" +} + +.fa-medkit:before { + content: "\f0fa" +} + +.fa-fighter-jet:before { + content: "\f0fb" +} + +.fa-beer:before { + content: "\f0fc" +} + +.fa-h-square:before { + content: "\f0fd" +} + +.fa-plus-square:before { + content: "\f0fe" +} + +.fa-angle-double-left:before { + content: "\f100" +} + +.fa-angle-double-right:before { + content: "\f101" +} + +.fa-angle-double-up:before { + content: "\f102" +} + +.fa-angle-double-down:before { + content: "\f103" +} + +.fa-angle-left:before { + content: "\f104" +} + +.fa-angle-right:before { + content: "\f105" +} + +.fa-angle-up:before { + content: "\f106" +} + +.fa-angle-down:before { + content: "\f107" +} + +.fa-desktop:before { + content: "\f108" +} + +.fa-laptop:before { + content: "\f109" +} + +.fa-tablet:before { + content: "\f10a" +} + +.fa-mobile-phone:before, .fa-mobile:before { + content: "\f10b" +} + +.fa-circle-o:before { + content: "\f10c" +} + +.fa-quote-left:before { + content: "\f10d" +} + +.fa-quote-right:before { + content: "\f10e" +} + +.fa-spinner:before { + content: "\f110" +} + +.fa-circle:before { + content: "\f111" +} + +.fa-mail-reply:before, .fa-reply:before { + content: "\f112" +} + +.fa-github-alt:before { + content: "\f113" +} + +.fa-folder-o:before { + content: "\f114" +} + +.fa-folder-open-o:before { + content: "\f115" +} + +.fa-smile-o:before { + content: "\f118" +} + +.fa-frown-o:before { + content: "\f119" +} + +.fa-meh-o:before { + content: "\f11a" +} + +.fa-gamepad:before { + content: "\f11b" +} + +.fa-keyboard-o:before { + content: "\f11c" +} + +.fa-flag-o:before { + content: "\f11d" +} + +.fa-flag-checkered:before { + content: "\f11e" +} + +.fa-terminal:before { + content: "\f120" +} + +.fa-code:before { + content: "\f121" +} + +.fa-mail-reply-all:before, .fa-reply-all:before { + content: "\f122" +} + +.fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before + { + content: "\f123" +} + +.fa-location-arrow:before { + content: "\f124" +} + +.fa-crop:before { + content: "\f125" +} + +.fa-code-fork:before { + content: "\f126" +} + +.fa-unlink:before, .fa-chain-broken:before { + content: "\f127" +} + +.fa-question:before { + content: "\f128" +} + +.fa-info:before { + content: "\f129" +} + +.fa-exclamation:before { + content: "\f12a" +} + +.fa-superscript:before { + content: "\f12b" +} + +.fa-subscript:before { + content: "\f12c" +} + +.fa-eraser:before { + content: "\f12d" +} + +.fa-puzzle-piece:before { + content: "\f12e" +} + +.fa-microphone:before { + content: "\f130" +} + +.fa-microphone-slash:before { + content: "\f131" +} + +.fa-shield:before { + content: "\f132" +} + +.fa-calendar-o:before { + content: "\f133" +} + +.fa-fire-extinguisher:before { + content: "\f134" +} + +.fa-rocket:before { + content: "\f135" +} + +.fa-maxcdn:before { + content: "\f136" +} + +.fa-chevron-circle-left:before { + content: "\f137" +} + +.fa-chevron-circle-right:before { + content: "\f138" +} + +.fa-chevron-circle-up:before { + content: "\f139" +} + +.fa-chevron-circle-down:before { + content: "\f13a" +} + +.fa-html5:before { + content: "\f13b" +} + +.fa-css3:before { + content: "\f13c" +} + +.fa-anchor:before { + content: "\f13d" +} + +.fa-unlock-alt:before { + content: "\f13e" +} + +.fa-bullseye:before { + content: "\f140" +} + +.fa-ellipsis-h:before { + content: "\f141" +} + +.fa-ellipsis-v:before { + content: "\f142" +} + +.fa-rss-square:before { + content: "\f143" +} + +.fa-play-circle:before { + content: "\f144" +} + +.fa-ticket:before { + content: "\f145" +} + +.fa-minus-square:before { + content: "\f146" +} + +.fa-minus-square-o:before { + content: "\f147" +} + +.fa-level-up:before { + content: "\f148" +} + +.fa-level-down:before { + content: "\f149" +} + +.fa-check-square:before { + content: "\f14a" +} + +.fa-pencil-square:before { + content: "\f14b" +} + +.fa-external-link-square:before { + content: "\f14c" +} + +.fa-share-square:before { + content: "\f14d" +} + +.fa-compass:before { + content: "\f14e" +} + +.fa-toggle-down:before, .fa-caret-square-o-down:before { + content: "\f150" +} + +.fa-toggle-up:before, .fa-caret-square-o-up:before { + content: "\f151" +} + +.fa-toggle-right:before, .fa-caret-square-o-right:before { + content: "\f152" +} + +.fa-euro:before, .fa-eur:before { + content: "\f153" +} + +.fa-gbp:before { + content: "\f154" +} + +.fa-dollar:before, .fa-usd:before { + content: "\f155" +} + +.fa-rupee:before, .fa-inr:before { + content: "\f156" +} + +.fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before { + content: "\f157" +} + +.fa-ruble:before, .fa-rouble:before, .fa-rub:before { + content: "\f158" +} + +.fa-won:before, .fa-krw:before { + content: "\f159" +} + +.fa-bitcoin:before, .fa-btc:before { + content: "\f15a" +} + +.fa-file:before { + content: "\f15b" +} + +.fa-file-text:before { + content: "\f15c" +} + +.fa-sort-alpha-asc:before { + content: "\f15d" +} + +.fa-sort-alpha-desc:before { + content: "\f15e" +} + +.fa-sort-amount-asc:before { + content: "\f160" +} + +.fa-sort-amount-desc:before { + content: "\f161" +} + +.fa-sort-numeric-asc:before { + content: "\f162" +} + +.fa-sort-numeric-desc:before { + content: "\f163" +} + +.fa-thumbs-up:before { + content: "\f164" +} + +.fa-thumbs-down:before { + content: "\f165" +} + +.fa-youtube-square:before { + content: "\f166" +} + +.fa-youtube:before { + content: "\f167" +} + +.fa-xing:before { + content: "\f168" +} + +.fa-xing-square:before { + content: "\f169" +} + +.fa-youtube-play:before { + content: "\f16a" +} + +.fa-dropbox:before { + content: "\f16b" +} + +.fa-stack-overflow:before { + content: "\f16c" +} + +.fa-instagram:before { + content: "\f16d" +} + +.fa-flickr:before { + content: "\f16e" +} + +.fa-adn:before { + content: "\f170" +} + +.fa-bitbucket:before { + content: "\f171" +} + +.fa-bitbucket-square:before { + content: "\f172" +} + +.fa-tumblr:before { + content: "\f173" +} + +.fa-tumblr-square:before { + content: "\f174" +} + +.fa-long-arrow-down:before { + content: "\f175" +} + +.fa-long-arrow-up:before { + content: "\f176" +} + +.fa-long-arrow-left:before { + content: "\f177" +} + +.fa-long-arrow-right:before { + content: "\f178" +} + +.fa-apple:before { + content: "\f179" +} + +.fa-windows:before { + content: "\f17a" +} + +.fa-android:before { + content: "\f17b" +} + +.fa-linux:before { + content: "\f17c" +} + +.fa-dribbble:before { + content: "\f17d" +} + +.fa-skype:before { + content: "\f17e" +} + +.fa-foursquare:before { + content: "\f180" +} + +.fa-trello:before { + content: "\f181" +} + +.fa-female:before { + content: "\f182" +} + +.fa-male:before { + content: "\f183" +} + +.fa-gittip:before, .fa-gratipay:before { + content: "\f184" +} + +.fa-sun-o:before { + content: "\f185" +} + +.fa-moon-o:before { + content: "\f186" +} + +.fa-archive:before { + content: "\f187" +} + +.fa-bug:before { + content: "\f188" +} + +.fa-vk:before { + content: "\f189" +} + +.fa-weibo:before { + content: "\f18a" +} + +.fa-renren:before { + content: "\f18b" +} + +.fa-pagelines:before { + content: "\f18c" +} + +.fa-stack-exchange:before { + content: "\f18d" +} + +.fa-arrow-circle-o-right:before { + content: "\f18e" +} + +.fa-arrow-circle-o-left:before { + content: "\f190" +} + +.fa-toggle-left:before, .fa-caret-square-o-left:before { + content: "\f191" +} + +.fa-dot-circle-o:before { + content: "\f192" +} + +.fa-wheelchair:before { + content: "\f193" +} + +.fa-vimeo-square:before { + content: "\f194" +} + +.fa-turkish-lira:before, .fa-try:before { + content: "\f195" +} + +.fa-plus-square-o:before { + content: "\f196" +} + +.fa-space-shuttle:before { + content: "\f197" +} + +.fa-slack:before { + content: "\f198" +} + +.fa-envelope-square:before { + content: "\f199" +} + +.fa-wordpress:before { + content: "\f19a" +} + +.fa-openid:before { + content: "\f19b" +} + +.fa-institution:before, .fa-bank:before, .fa-university:before { + content: "\f19c" +} + +.fa-mortar-board:before, .fa-graduation-cap:before { + content: "\f19d" +} + +.fa-yahoo:before { + content: "\f19e" +} + +.fa-google:before { + content: "\f1a0" +} + +.fa-reddit:before { + content: "\f1a1" +} + +.fa-reddit-square:before { + content: "\f1a2" +} + +.fa-stumbleupon-circle:before { + content: "\f1a3" +} + +.fa-stumbleupon:before { + content: "\f1a4" +} + +.fa-delicious:before { + content: "\f1a5" +} + +.fa-digg:before { + content: "\f1a6" +} + +.fa-pied-piper:before { + content: "\f1a7" +} + +.fa-pied-piper-alt:before { + content: "\f1a8" +} + +.fa-drupal:before { + content: "\f1a9" +} + +.fa-joomla:before { + content: "\f1aa" +} + +.fa-language:before { + content: "\f1ab" +} + +.fa-fax:before { + content: "\f1ac" +} + +.fa-building:before { + content: "\f1ad" +} + +.fa-child:before { + content: "\f1ae" +} + +.fa-paw:before { + content: "\f1b0" +} + +.fa-spoon:before { + content: "\f1b1" +} + +.fa-cube:before { + content: "\f1b2" +} + +.fa-cubes:before { + content: "\f1b3" +} + +.fa-behance:before { + content: "\f1b4" +} + +.fa-behance-square:before { + content: "\f1b5" +} + +.fa-steam:before { + content: "\f1b6" +} + +.fa-steam-square:before { + content: "\f1b7" +} + +.fa-recycle:before { + content: "\f1b8" +} + +.fa-automobile:before, .fa-car:before { + content: "\f1b9" +} + +.fa-cab:before, .fa-taxi:before { + content: "\f1ba" +} + +.fa-tree:before { + content: "\f1bb" +} + +.fa-spotify:before { + content: "\f1bc" +} + +.fa-deviantart:before { + content: "\f1bd" +} + +.fa-soundcloud:before { + content: "\f1be" +} + +.fa-database:before { + content: "\f1c0" +} + +.fa-file-pdf-o:before { + content: "\f1c1" +} + +.fa-file-word-o:before { + content: "\f1c2" +} + +.fa-file-excel-o:before { + content: "\f1c3" +} + +.fa-file-powerpoint-o:before { + content: "\f1c4" +} + +.fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before + { + content: "\f1c5" +} + +.fa-file-zip-o:before, .fa-file-archive-o:before { + content: "\f1c6" +} + +.fa-file-sound-o:before, .fa-file-audio-o:before { + content: "\f1c7" +} + +.fa-file-movie-o:before, .fa-file-video-o:before { + content: "\f1c8" +} + +.fa-file-code-o:before { + content: "\f1c9" +} + +.fa-vine:before { + content: "\f1ca" +} + +.fa-codepen:before { + content: "\f1cb" +} + +.fa-jsfiddle:before { + content: "\f1cc" +} + +.fa-life-bouy:before, .fa-life-buoy:before, .fa-life-saver:before, + .fa-support:before, .fa-life-ring:before { + content: "\f1cd" +} + +.fa-circle-o-notch:before { + content: "\f1ce" +} + +.fa-ra:before, .fa-rebel:before { + content: "\f1d0" +} + +.fa-ge:before, .fa-empire:before { + content: "\f1d1" +} + +.fa-git-square:before { + content: "\f1d2" +} + +.fa-git:before { + content: "\f1d3" +} + +.fa-hacker-news:before { + content: "\f1d4" +} + +.fa-tencent-weibo:before { + content: "\f1d5" +} + +.fa-qq:before { + content: "\f1d6" +} + +.fa-wechat:before, .fa-weixin:before { + content: "\f1d7" +} + +.fa-send:before, .fa-paper-plane:before { + content: "\f1d8" +} + +.fa-send-o:before, .fa-paper-plane-o:before { + content: "\f1d9" +} + +.fa-history:before { + content: "\f1da" +} + +.fa-genderless:before, .fa-circle-thin:before { + content: "\f1db" +} + +.fa-header:before { + content: "\f1dc" +} + +.fa-paragraph:before { + content: "\f1dd" +} + +.fa-sliders:before { + content: "\f1de" +} + +.fa-share-alt:before { + content: "\f1e0" +} + +.fa-share-alt-square:before { + content: "\f1e1" +} + +.fa-bomb:before { + content: "\f1e2" +} + +.fa-soccer-ball-o:before, .fa-futbol-o:before { + content: "\f1e3" +} + +.fa-tty:before { + content: "\f1e4" +} + +.fa-binoculars:before { + content: "\f1e5" +} + +.fa-plug:before { + content: "\f1e6" +} + +.fa-slideshare:before { + content: "\f1e7" +} + +.fa-twitch:before { + content: "\f1e8" +} + +.fa-yelp:before { + content: "\f1e9" +} + +.fa-newspaper-o:before { + content: "\f1ea" +} + +.fa-wifi:before { + content: "\f1eb" +} + +.fa-calculator:before { + content: "\f1ec" +} + +.fa-paypal:before { + content: "\f1ed" +} + +.fa-google-wallet:before { + content: "\f1ee" +} + +.fa-cc-visa:before { + content: "\f1f0" +} + +.fa-cc-mastercard:before { + content: "\f1f1" +} + +.fa-cc-discover:before { + content: "\f1f2" +} + +.fa-cc-amex:before { + content: "\f1f3" +} + +.fa-cc-paypal:before { + content: "\f1f4" +} + +.fa-cc-stripe:before { + content: "\f1f5" +} + +.fa-bell-slash:before { + content: "\f1f6" +} + +.fa-bell-slash-o:before { + content: "\f1f7" +} + +.fa-trash:before { + content: "\f1f8" +} + +.fa-copyright:before { + content: "\f1f9" +} + +.fa-at:before { + content: "\f1fa" +} + +.fa-eyedropper:before { + content: "\f1fb" +} + +.fa-paint-brush:before { + content: "\f1fc" +} + +.fa-birthday-cake:before { + content: "\f1fd" +} + +.fa-area-chart:before { + content: "\f1fe" +} + +.fa-pie-chart:before { + content: "\f200" +} + +.fa-line-chart:before { + content: "\f201" +} + +.fa-lastfm:before { + content: "\f202" +} + +.fa-lastfm-square:before { + content: "\f203" +} + +.fa-toggle-off:before { + content: "\f204" +} + +.fa-toggle-on:before { + content: "\f205" +} + +.fa-bicycle:before { + content: "\f206" +} + +.fa-bus:before { + content: "\f207" +} + +.fa-ioxhost:before { + content: "\f208" +} + +.fa-angellist:before { + content: "\f209" +} + +.fa-cc:before { + content: "\f20a" +} + +.fa-shekel:before, .fa-sheqel:before, .fa-ils:before { + content: "\f20b" +} + +.fa-meanpath:before { + content: "\f20c" +} + +.fa-buysellads:before { + content: "\f20d" +} + +.fa-connectdevelop:before { + content: "\f20e" +} + +.fa-dashcube:before { + content: "\f210" +} + +.fa-forumbee:before { + content: "\f211" +} + +.fa-leanpub:before { + content: "\f212" +} + +.fa-sellsy:before { + content: "\f213" +} + +.fa-shirtsinbulk:before { + content: "\f214" +} + +.fa-simplybuilt:before { + content: "\f215" +} + +.fa-skyatlas:before { + content: "\f216" +} + +.fa-cart-plus:before { + content: "\f217" +} + +.fa-cart-arrow-down:before { + content: "\f218" +} + +.fa-diamond:before { + content: "\f219" +} + +.fa-ship:before { + content: "\f21a" +} + +.fa-user-secret:before { + content: "\f21b" +} + +.fa-motorcycle:before { + content: "\f21c" +} + +.fa-street-view:before { + content: "\f21d" +} + +.fa-heartbeat:before { + content: "\f21e" +} + +.fa-venus:before { + content: "\f221" +} + +.fa-mars:before { + content: "\f222" +} + +.fa-mercury:before { + content: "\f223" +} + +.fa-transgender:before { + content: "\f224" +} + +.fa-transgender-alt:before { + content: "\f225" +} + +.fa-venus-double:before { + content: "\f226" +} + +.fa-mars-double:before { + content: "\f227" +} + +.fa-venus-mars:before { + content: "\f228" +} + +.fa-mars-stroke:before { + content: "\f229" +} + +.fa-mars-stroke-v:before { + content: "\f22a" +} + +.fa-mars-stroke-h:before { + content: "\f22b" +} + +.fa-neuter:before { + content: "\f22c" +} + +.fa-facebook-official:before { + content: "\f230" +} + +.fa-pinterest-p:before { + content: "\f231" +} + +.fa-whatsapp:before { + content: "\f232" +} + +.fa-server:before { + content: "\f233" +} + +.fa-user-plus:before { + content: "\f234" +} + +.fa-user-times:before { + content: "\f235" +} + +.fa-hotel:before, .fa-bed:before { + content: "\f236" +} + +.fa-viacoin:before { + content: "\f237" +} + +.fa-train:before { + content: "\f238" +} + +.fa-subway:before { + content: "\f239" +} + +.fa-medium:before { + content: "\f23a" +} \ No newline at end of file diff --git a/admin/src/main/webapp/css/iconfont/iconfont.css b/admin/src/main/webapp/css/iconfont/iconfont.css new file mode 100755 index 0000000..5cc38f7 --- /dev/null +++ b/admin/src/main/webapp/css/iconfont/iconfont.css @@ -0,0 +1,801 @@ +@font-face {font-family: "iconfont"; + src: url('./iconfont.eot?t=1599385683969'); /* IE9 */ + src: url('./iconfont.eot?t=1599385683969#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('./iconfont.woff2?t=1599385683969') format('woff2'), + url('./iconfont.woff?t=1599385683969') format('woff'), + url('./iconfont.ttf?t=1599385683969') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('./iconfont.svg?t=1599385683969#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-sousuo:before { + content: "\e633"; +} + +.icon-sousuo1:before { + content: "\e617"; +} + +.icon-sousuo2:before { + content: "\e644"; +} + +.icon-sousuo3:before { + content: "\e6c7"; +} + +.icon-search1:before { + content: "\e7b3"; +} + +.icon-suoxiao:before { + content: "\e7c5"; +} + +.icon-tongxunlu:before { + content: "\e7d5"; +} + +.icon-yiguanzhugongyingshang:before { + content: "\e7d6"; +} + +.icon-becomeagoldsupplier:before { + content: "\e7d7"; +} + +.icon-search:before { + content: "\e67d"; +} + +.icon-iconfontyizan:before { + content: "\e61e"; +} + +.icon-iconfontzan-copy:before { + content: "\e620"; +} + +.icon-jixuduihuan:before { + content: "\e672"; +} + +.icon-iconfontdongtaidianji:before { + content: "\e62e"; +} + +.icon-iconfontquanzi:before { + content: "\e631"; +} + +.icon-iconfontquanzidianji:before { + content: "\e632"; +} + +.icon-iconfontxiaoxidianji:before { + content: "\e634"; +} + +.icon-nan:before { + content: "\e639"; +} + +.icon-nv:before { + content: "\e63a"; +} + +.icon-shimingrenzheng:before { + content: "\e63b"; +} + +.icon-shoujirenzheng:before { + content: "\e63c"; +} + +.icon-v1:before { + content: "\e63d"; +} + +.icon-v2:before { + content: "\e63e"; +} + +.icon-v3:before { + content: "\e63f"; +} + +.icon-v4:before { + content: "\e640"; +} + +.icon-v6:before { + content: "\e641"; +} + +.icon-v5:before { + content: "\e642"; +} + +.icon-v7:before { + content: "\e643"; +} + +.icon-v:before { + content: "\e653"; +} + +.icon-add-circle:before { + content: "\e664"; +} + +.icon-arrow-up-circle:before { + content: "\e665"; +} + +.icon-arrow-right-circle:before { + content: "\e666"; +} + +.icon-arrow-left-circle:before { + content: "\e667"; +} + +.icon-cry:before { + content: "\e66a"; +} + +.icon-customer-service:before { + content: "\e66b"; +} + +.icon-delete:before { + content: "\e66c"; +} + +.icon-direction-down:before { + content: "\e66d"; +} + +.icon-copy2:before { + content: "\e66e"; +} + +.icon-direction-down-circle:before { + content: "\e66f"; +} + +.icon-direction-right:before { + content: "\e670"; +} + +.icon-direction-up:before { + content: "\e671"; +} + +.icon-direction-left:before { + content: "\e673"; +} + +.icon-download1:before { + content: "\e674"; +} + +.icon-electronics1:before { + content: "\e675"; +} + +.icon-image-text1:before { + content: "\e676"; +} + +.icon-keyboard-26:before { + content: "\e677"; +} + +.icon-keyboard-9:before { + content: "\e678"; +} + +.icon-help2:before { + content: "\e679"; +} + +.icon-modular:before { + content: "\e67a"; +} + +.icon-picture:before { + content: "\e67c"; +} + +.icon-smile:before { + content: "\e67e"; +} + +.icon-survey:before { + content: "\e67f"; +} + +.icon-task:before { + content: "\e680"; +} + +.icon-toggle-left:before { + content: "\e681"; +} + +.icon-toggle-right:before { + content: "\e682"; +} + +.icon-user:before { + content: "\e683"; +} + +.icon-arrow-up-filling:before { + content: "\e688"; +} + +.icon-arrow-down-filling:before { + content: "\e689"; +} + +.icon-arrow-left-filling:before { + content: "\e68a"; +} + +.icon-arrow-right-filling:before { + content: "\e68b"; +} + +.icon-caps-unlock-filling:before { + content: "\e68c"; +} + +.icon-comment-filling:before { + content: "\e68d"; +} + +.icon-check-item-filling:before { + content: "\e68e"; +} + +.icon-clock-filling:before { + content: "\e68f"; +} + +.icon-delete-filling:before { + content: "\e690"; +} + +.icon-decline-filling:before { + content: "\e691"; +} + +.icon-dynamic-filling:before { + content: "\e692"; +} + +.icon-intermediate-filling:before { + content: "\e693"; +} + +.icon-favorite-filling:before { + content: "\e694"; +} + +.icon-help-filling:before { + content: "\e695"; +} + +.icon-history-filling:before { + content: "\e696"; +} + +.icon-filter-filling:before { + content: "\e697"; +} + +.icon-file-common-filling:before { + content: "\e698"; +} + +.icon-news-filling:before { + content: "\e699"; +} + +.icon-edit-filling:before { + content: "\e69a"; +} + +.icon-fullscreen-expand-filling:before { + content: "\e69b"; +} + +.icon-rise-filling:before { + content: "\e69c"; +} + +.icon-picture-filling:before { + content: "\e69d"; +} + +.icon-notification-filling:before { + content: "\e69e"; +} + +.icon-user-filling:before { + content: "\e69f"; +} + +.icon-switch-filling:before { + content: "\e6a0"; +} + +.icon-work-filling:before { + content: "\e6a1"; +} + +.icon-task-filling:before { + content: "\e6a2"; +} + +.icon-success-filling:before { + content: "\e6a3"; +} + +.icon-warning-filling:before { + content: "\e6a4"; +} + +.icon-folder-filling:before { + content: "\e6a5"; +} + +.icon-map-filling:before { + content: "\e6a6"; +} + +.icon-prompt-filling:before { + content: "\e6a7"; +} + +.icon-top-filling:before { + content: "\e6a8"; +} + +.icon-home-filling:before { + content: "\e6a9"; +} + +.icon-sorting:before { + content: "\e6aa"; +} + +.icon-arrow-up-bold:before { + content: "\e685"; +} + +.icon-arrow-down-bold:before { + content: "\e686"; +} + +.icon-all:before { + content: "\e6ef"; +} + +.icon-bussiness-man:before { + content: "\e6f0"; +} + +.icon-copy:before { + content: "\e6f3"; +} + +.icon-dollar:before { + content: "\e6f4"; +} + +.icon-history:before { + content: "\e6f8"; +} + +.icon-editor:before { + content: "\e6f6"; +} + +.icon-data:before { + content: "\e6f9"; +} + +.icon-integral:before { + content: "\e6fa"; +} + +.icon-nav-list:before { + content: "\e6fd"; +} + +.icon-pic:before { + content: "\e6ff"; +} + +.icon-Notvisible:before { + content: "\e6fe"; +} + +.icon-rising:before { + content: "\e703"; +} + +.icon-QRcode:before { + content: "\e704"; +} + +.icon-rmb:before { + content: "\e705"; +} + +.icon-similar-product:before { + content: "\e707"; +} + +.icon-all-fill:before { + content: "\e718"; +} + +.icon-favorites-fill:before { + content: "\e721"; +} + +.icon-integral-fill:before { + content: "\e726"; +} + +.icon-pic-fill:before { + content: "\e72e"; +} + +.icon-prompt-fill:before { + content: "\e730"; +} + +.icon-add-account:before { + content: "\e741"; +} + +.icon-add:before { + content: "\e742"; +} + +.icon-add-cart:before { + content: "\e743"; +} + +.icon-arrow-right:before { + content: "\e744"; +} + +.icon-arrow-lift:before { + content: "\e745"; +} + +.icon-ascending:before { + content: "\e747"; +} + +.icon-ashbin:before { + content: "\e748"; +} + +.icon-attachent:before { + content: "\e749"; +} + +.icon-browse:before { + content: "\e74a"; +} + +.icon-cart-full:before { + content: "\e74b"; +} + +.icon-cameraswitching:before { + content: "\e74c"; +} + +.icon-category:before { + content: "\e74d"; +} + +.icon-close:before { + content: "\e74e"; +} + +.icon-certified-supplier:before { + content: "\e74f"; +} + +.icon-cart-Empty:before { + content: "\e750"; +} + +.icon-conditions:before { + content: "\e751"; +} + +.icon-confirm:before { + content: "\e752"; +} + +.icon-company:before { + content: "\e753"; +} + +.icon-copy1:before { + content: "\e754"; +} + +.icon-credit-level:before { + content: "\e755"; +} + +.icon-clock:before { + content: "\e756"; +} + +.icon-CurrencyConverter:before { + content: "\e757"; +} + +.icon-data1:before { + content: "\e758"; +} + +.icon-descending:before { + content: "\e759"; +} + +.icon-double-arro-right:before { + content: "\e75a"; +} + +.icon-double-arrow-left:before { + content: "\e75b"; +} + +.icon-download:before { + content: "\e75c"; +} + +.icon-dollar1:before { + content: "\e75d"; +} + +.icon-default-template:before { + content: "\e75e"; +} + +.icon-editor1:before { + content: "\e75f"; +} + +.icon-electronics:before { + content: "\e760"; +} + +.icon-ellipsis:before { + content: "\e761"; +} + +.icon-email:before { + content: "\e762"; +} + +.icon-falling:before { + content: "\e763"; +} + +.icon-earth:before { + content: "\e764"; +} + +.icon-filter:before { + content: "\e765"; +} + +.icon-folder:before { + content: "\e766"; +} + +.icon-history1:before { + content: "\e767"; +} + +.icon-help:before { + content: "\e768"; +} + +.icon-image-text:before { + content: "\e769"; +} + +.icon-hot:before { + content: "\e76a"; +} + +.icon-leftbutton:before { + content: "\e76b"; +} + +.icon-leftarrow:before { + content: "\e76c"; +} + +.icon-link:before { + content: "\e76d"; +} + +.icon-loading:before { + content: "\e76e"; +} + +.icon-lights:before { + content: "\e76f"; +} + +.icon-messagecenter:before { + content: "\e770"; +} + +.icon-manage-order:before { + content: "\e771"; +} + +.icon-Moneymanagement:before { + content: "\e772"; +} + +.icon-map:before { + content: "\e773"; +} + +.icon-multi-language:before { + content: "\e774"; +} + +.icon-notice:before { + content: "\e775"; +} + +.icon-office-supplies:before { + content: "\e776"; +} + +.icon-operation:before { + content: "\e777"; +} + +.icon-online-tracking:before { + content: "\e778"; +} + +.icon-packing-labeling:before { + content: "\e779"; +} + +.icon-phone:before { + content: "\e77a"; +} + +.icon-remind:before { + content: "\e77b"; +} + +.icon-responsetime:before { + content: "\e77c"; +} + +.icon-Rightarrow:before { + content: "\e77d"; +} + +.icon-seleted:before { + content: "\e77e"; +} + +.icon-service:before { + content: "\e77f"; +} + +.icon-shuffling-banner:before { + content: "\e780"; +} + +.icon-suggest:before { + content: "\e781"; +} + +.icon-template:before { + content: "\e782"; +} + +.icon-set:before { + content: "\e783"; +} + +.icon-store:before { + content: "\e784"; +} + +.icon-default-template-fill:before { + content: "\e785"; +} + +.icon-filter-fill:before { + content: "\e786"; +} + +.icon-integral-fill1:before { + content: "\e787"; +} + +.icon-help1:before { + content: "\e788"; +} + +.icon-multi-language-fill:before { + content: "\e789"; +} + +.icon-map1:before { + content: "\e78a"; +} + +.icon-online-tracking-fill:before { + content: "\e78b"; +} + +.icon-reduce-fill:before { + content: "\e78c"; +} + +.icon-reeor-fill:before { + content: "\e78d"; +} + +.icon-collection:before { + content: "\e79d"; +} + +.icon-collection-fill:before { + content: "\e79e"; +} + +.icon-add-select:before { + content: "\e7b0"; +} + +.icon-sami-select:before { + content: "\e7b1"; +} + +.icon-zijin:before { + content: "\e7cb"; +} + +.icon-shouqi:before { + content: "\e7d3"; +} + +.icon-zhankai:before { + content: "\e7d4"; +} + diff --git a/admin/src/main/webapp/css/iconfont/iconfont.eot b/admin/src/main/webapp/css/iconfont/iconfont.eot new file mode 100755 index 0000000..50cef02 Binary files /dev/null and b/admin/src/main/webapp/css/iconfont/iconfont.eot differ diff --git a/admin/src/main/webapp/css/iconfont/iconfont.svg b/admin/src/main/webapp/css/iconfont/iconfont.svg new file mode 100755 index 0000000..69ac38f --- /dev/null +++ b/admin/src/main/webapp/css/iconfont/iconfont.svg @@ -0,0 +1,614 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/css/iconfont/iconfont.ttf b/admin/src/main/webapp/css/iconfont/iconfont.ttf new file mode 100755 index 0000000..7000ed2 Binary files /dev/null and b/admin/src/main/webapp/css/iconfont/iconfont.ttf differ diff --git a/admin/src/main/webapp/css/iconfont/iconfont.woff b/admin/src/main/webapp/css/iconfont/iconfont.woff new file mode 100755 index 0000000..9426866 Binary files /dev/null and b/admin/src/main/webapp/css/iconfont/iconfont.woff differ diff --git a/admin/src/main/webapp/css/iconfont/iconfont.woff2 b/admin/src/main/webapp/css/iconfont/iconfont.woff2 new file mode 100755 index 0000000..24ee48c Binary files /dev/null and b/admin/src/main/webapp/css/iconfont/iconfont.woff2 differ diff --git a/admin/src/main/webapp/css/local.css b/admin/src/main/webapp/css/local.css new file mode 100755 index 0000000..891bcf8 --- /dev/null +++ b/admin/src/main/webapp/css/local.css @@ -0,0 +1,146 @@ + +body { + background: #f5f7f8; +} + +.sidebar { + background: #f5f7f8; +} + +.sidetitle { + color: #000000; +} + +.sidebar-panel li a { + color: #000000; +} +.mar-b30 { + margin-bottom: 20px; + overflow: hidden; +} + +.car-panel { + display: flex; + box-shadow: none; + border: 8px solid #e5e5e5; + background: #fff; + padding: 20px 20px 0 20px; + min-height: 100px; + margin-right: 0%; + position: relative; + width: 20%; + float: left; + /*border-radius: -27px;*/ +} + +.car-panels { + display: flex; + box-shadow: none; + border: 12px solid #e5e5e5; + background: #fff; + padding: 20px 20px 0 20px; + min-height: 100px; + margin-right: 0%; + position: relative; + width: 25%; + float: left; + border-radius: 1px; +} +.car-one{background-color: #F6CC75;} +.car-two{background-color: #FA9290;} +.car-three{background-color: #77AFF1;} +.car-for{background-color: #6BCEA2;} +.car-five{background-color: #F76E97 ;} +.car-six{background-color: #709FBA;} +.car-seven{background-color: #818BFB;} +.car-eight{background-color: #8ED78B;} +.car-long{background-color: #F8997C;} +.car-ten{background-color: #C375F4;} +.car-all{background-color: #ffffff ;} + +.car-two .car-t4{color: #ffffff;font-size:20px;} +.car-three .car-t4{color: #ffffff;font-size:20px;} +.car-for .car-t4{color: #ffffff;font-size:20px;} +.car-five .car-t4{color: #ffffff;font-size:20px;} +.car-all .car-t4{color: #000000;font-size:20px;} +.car-six .car-t4{color: #ffffff;font-size:20px;} +.car-seven .car-t4{color: #ffffff;font-size:20px;} +.car-eight .car-t4{color: #ffffff;font-size:20px;} +.car-long .car-t4{color: #ffffff;font-size:20px;} +.car-ten .car-t4{color: #ffffff;font-size:20px;} +.topmenu { + padding-left: 20px; +} + +.sidebar-panel li .icon { + color: #000000; +} +.car-t3 { + line-height: 2; + font-size:20px; + color: #ffffff; +} +.car-t3s { + line-height: 2; + font-size:20px; + color: #000000; +} +.content { + background: #fff; +} + +.container-default { + min-height: 1024px; +} +.container-defaults { + min-height: 420px; +} +.car-ico { + font-size: 70px; + color: #bdbdbd; + margin-right: 20px; +} + +#top { + height: 40px; + background: #3c7df1; + color: #fff; + width: 100%; + position: fixed; + z-index: 900; + top: 0; +} +.car-one .car-t4{color: #ffffff;font-size:20px;} +.applogo { + width: 250px; + height: 40px; + background: rgba(0, 0, 0, 0); + color: #fff; + position: relative; + padding: 8px 0 0 0px; + float: left; + text-align: center; +} + +.mailbox-menu .menu li { + display: inline; + color: #76747A; + font-size: 13px; + padding: 16px 10px; + border-right: 1px solid rgba(0, 0, 0, 0.08); +} + + + .color1 { + background: #B9F98E; + color: #0A451D; +} +.ballon { + display: inline-table; + padding: 14px 20px; + border-radius: 20px; + margin-bottom: 14px; +} + + + diff --git a/admin/src/main/webapp/css/local_two.css b/admin/src/main/webapp/css/local_two.css new file mode 100755 index 0000000..e69de29 diff --git a/admin/src/main/webapp/css/plugin/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css b/admin/src/main/webapp/css/plugin/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css new file mode 100755 index 0000000..37fc028 --- /dev/null +++ b/admin/src/main/webapp/css/plugin/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css @@ -0,0 +1,112 @@ +.checkbox { + padding-left: 20px; } + .checkbox label { + display: inline-block; + position: relative; + padding-left: 5px; } + .checkbox label::before { + content: ""; + display: inline-block; + position: absolute; + width: 18px; + height: 18px; + left: 0; + margin-left: -20px; + margin-right: 20px; + border: 1px solid #CCCCCC; + border-radius: 3px; + background-color: #fff; + -webkit-transition: border 0.15s ease-in-out, color 0.15s ease-in-out; + -o-transition: border 0.15s ease-in-out, color 0.15s ease-in-out; + transition: border 0.15s ease-in-out, color 0.15s ease-in-out; } + .checkbox label::after { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + left: 0; + top: 0; + margin-left: -20px; + padding-left: 3px; + padding-top: 2px; + font-size: 12px; + color: #555555; } + .checkbox input[type="checkbox"] { + opacity: 0; } + .checkbox input[type="checkbox"]:focus + label::before { + outline: thin dotted; + outline: 0px auto -webkit-focus-ring-color; + outline-offset: -2px;} + .checkbox input[type="checkbox"]:checked + label::after { + font-family: 'FontAwesome'; + line-height: 15px; + content: "\f00c";} + .checkbox input[type="checkbox"]:disabled + label { + opacity: 0.65; } + .checkbox input[type="checkbox"]:disabled + label::before { + background-color: #eeeeee; + cursor: not-allowed; } + .checkbox.checkbox-circle label::before { + border-radius: 50%; } + .checkbox.checkbox-inline { + margin-top: 0; } + + +.radio { + padding-left: 20px; } + .radio label { + display: inline-block; + position: relative; + padding-left: 5px; } + .radio label::before { + content: ""; + display: inline-block; + position: absolute; + width: 18px; + height: 18px; + left: 0; + margin-left: -20px; + border: 3px solid #cccccc; + border-radius: 50%; + background-color: #fff; + -webkit-transition: border 0.15s ease-in-out; + -o-transition: border 0.15s ease-in-out; + transition: border 0.15s ease-in-out; } + .radio label::after { + display: inline-block; + position: absolute; + content: " "; + width: 8px; + height: 8px; + left: 5px; + top: 5px; + margin-left: -20px; + border-radius: 50%; + background-color: #555555; + -webkit-transform: scale(0, 0); + -ms-transform: scale(0, 0); + -o-transform: scale(0, 0); + transform: scale(0, 0); + -webkit-transition: -webkit-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); + -moz-transition: -moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); + -o-transition: -o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); + transition: transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); } + .radio input[type="radio"] { + opacity: 0; } + .radio input[type="radio"]:focus + label::before { + outline: thin dotted; + outline: 0px auto -webkit-focus-ring-color; + outline-offset: -2px; } + .radio input[type="radio"]:checked + label::after { + -webkit-transform: scale(1, 1); + -ms-transform: scale(1, 1); + -o-transform: scale(1, 1); + transform: scale(1, 1); + transition: all 0.4s ease; } + .radio input[type="radio"]:disabled + label { + opacity: 0.65; } + .radio input[type="radio"]:disabled + label::before { + cursor: not-allowed; } + .radio.radio-inline { + margin-top: 0; } + diff --git a/admin/src/main/webapp/css/plugin/bootstrap-select/bootstrap-select.css b/admin/src/main/webapp/css/plugin/bootstrap-select/bootstrap-select.css new file mode 100755 index 0000000..59444f8 --- /dev/null +++ b/admin/src/main/webapp/css/plugin/bootstrap-select/bootstrap-select.css @@ -0,0 +1,264 @@ +/*! + * Bootstrap-select v1.6.3 (http://silviomoreto.github.io/bootstrap-select/) + * + * Copyright 2013-2014 bootstrap-select + * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE) + */ + + +.bootstrap-select { + /*width: 220px\9; IE8 and below*/ + width: 220px \0; + /*IE9 and below*/ +} +.bootstrap-select > .btn { + width: 100%; + padding-right: 25px; +} +.error .bootstrap-select .btn { + border: 1px solid #b94a48; +} +.control-group.error .bootstrap-select .dropdown-toggle { + border-color: #b94a48; +} +.bootstrap-select.fit-width { + width: auto !important; +} +.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) { + width: 220px; +} +.bootstrap-select .btn:focus { + outline: thin dotted #333333 !important; + outline: 0px auto -webkit-focus-ring-color !important; + outline-offset: 0px; +} +.bootstrap-select.form-control { + margin-bottom: 0; + padding: 0; + border: none; +} +.bootstrap-select.form-control:not([class*="col-"]) { + width: 100%; +} +.bootstrap-select.btn-group:not(.input-group-btn), +.bootstrap-select.btn-group[class*="col-"] { + float: none; + display: inline-block; + margin-left: 0; +} +.bootstrap-select.btn-group.dropdown-menu-right, +.bootstrap-select.btn-group[class*="col-"].dropdown-menu-right, +.row-fluid .bootstrap-select.btn-group[class*="col-"].dropdown-menu-right { + float: right; +} +.form-search .bootstrap-select.btn-group, +.form-inline .bootstrap-select.btn-group, +.form-horizontal .bootstrap-select.btn-group, +.form-group .bootstrap-select.btn-group { + margin-bottom: 0; +} +.form-group-lg .bootstrap-select.btn-group.form-control, +.form-group-sm .bootstrap-select.btn-group.form-control { + padding: 0; +} +.form-inline .bootstrap-select.btn-group .form-control { + width: 100%; +} +.input-append .bootstrap-select.btn-group { + margin-left: -1px; +} +.input-prepend .bootstrap-select.btn-group { + margin-right: -1px; +} +.bootstrap-select.btn-group > .disabled { + cursor: not-allowed; +} +.bootstrap-select.btn-group > .disabled:focus { + outline: none !important; +} +.bootstrap-select.btn-group .btn .filter-option { + display: inline-block; + overflow: hidden; + width: 100%; + text-align: left; +} +.bootstrap-select.btn-group .btn .caret { + position: absolute; + top: 50%; + right: 12px; + margin-top: -2px; + vertical-align: middle; +} +.bootstrap-select.btn-group[class*="col-"] .btn { + width: 100%; +} + +.bootstrap-select .dropdown-menu small{ + color: inherit; +} +.bootstrap-select.btn-group .dropdown-menu { + min-width: 100%; + z-index: 1035; + box-shadow: 0 0px 0px 2px rgba(0, 0, 0, .0.5); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.bootstrap-select.btn-group .dropdown-menu.inner { + position: static; + border: 0; + padding: 0; + margin: 0; + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none; +} +.bootstrap-select.btn-group .dropdown-menu li { + position: relative; +} +.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) a:hover small, +.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) a:focus small, +.bootstrap-select.btn-group .dropdown-menu li.active:not(.disabled) a small { +} +.bootstrap-select.btn-group .dropdown-menu li.disabled a { + cursor: not-allowed; +} +.bootstrap-select.btn-group .dropdown-menu li a { + cursor: pointer; +} +.bootstrap-select.btn-group .dropdown-menu li a.opt { + position: relative; + padding-left: 2.25em; +} +.bootstrap-select.btn-group .dropdown-menu li a span.check-mark { + display: none; +} +.bootstrap-select.btn-group .dropdown-menu li a span.text { + display: inline-block; +} +.bootstrap-select.btn-group .dropdown-menu li small { + padding-left: 0.5em; +} +.bootstrap-select.btn-group .dropdown-menu .notify { + position: absolute; + bottom: 5px; + width: 96%; + margin: 0 2%; + min-height: 26px; + padding: 3px 5px; + background: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + pointer-events: none; + opacity: 0.9; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.bootstrap-select.btn-group .no-results { + padding: 3px; + background: #f5f5f5; + margin: 0 5px; +} +.bootstrap-select.btn-group.fit-width .btn .filter-option { + position: static; +} +.bootstrap-select.btn-group.fit-width .btn .caret { + position: static; + top: auto; + margin-top: -1px; +} +.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark { + position: absolute; + display: inline-block; + right: 15px; + margin-top: 5px; +} +.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text { + margin-right: 34px; +} +.bootstrap-select.show-menu-arrow.open > .btn { + z-index: 1035 + 1; +} +.bootstrap-select.show-menu-arrow .dropdown-toggle:before { + content: ''; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom-width: 7px; + border-bottom-style: solid; + border-bottom-color: #cccccc; + border-bottom-color: rgba(204, 204, 204, 0.2); + position: absolute; + bottom: -4px; + left: 9px; + display: none; +} +.bootstrap-select.show-menu-arrow .dropdown-toggle:after { + content: ''; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid white; + position: absolute; + bottom: -4px; + left: 10px; + display: none; +} +.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before { + bottom: auto; + top: -3px; + border-bottom: 0; + border-top-width: 7px; + border-top-style: solid; + border-top-color: #cccccc; + border-top-color: rgba(204, 204, 204, 0.2); +} +.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after { + bottom: auto; + top: -3px; + border-top: 6px solid white; + border-bottom: 0; +} +.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before { + right: 12px; + left: auto; +} +.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after { + right: 13px; + left: auto; +} +.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:before, +.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:after { + display: block; +} +.bs-searchbox, +.bs-actionsbox { + padding: 4px 8px; +} +.bs-actionsbox { + float: left; + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.bs-actionsbox .btn-group button { + width: 50%; +} +.bs-searchbox + .bs-actionsbox { + padding: 0 8px 4px; +} +.bs-searchbox input.form-control { + margin-bottom: 0; + width: 100%; +} +.mobile-device { + position: absolute; + top: 0; + left: 0; + display: block !important; + width: 100%; + height: 100% !important; + opacity: 0; +} +/*# sourceMappingURL=bootstrap-select.css.map */ \ No newline at end of file diff --git a/admin/src/main/webapp/css/plugin/bootstrap-toggle/bootstrap-toggle.min.css b/admin/src/main/webapp/css/plugin/bootstrap-toggle/bootstrap-toggle.min.css new file mode 100755 index 0000000..576f73c --- /dev/null +++ b/admin/src/main/webapp/css/plugin/bootstrap-toggle/bootstrap-toggle.min.css @@ -0,0 +1,38 @@ +/*! ======================================================================== + * Bootstrap Toggle: bootstrap-toggle.css v2.2.0 + * http://www.bootstraptoggle.com + * ======================================================================== + * Copyright 2014 Min Hur, The New York Times Company + * Licensed under MIT + * ======================================================================== */ +.checkbox label .toggle,.checkbox-inline .toggle{margin-left:-20px;margin-right:5px} +.toggle{position:relative;overflow:hidden; border-radius: 999px; } +.toggle input[type=checkbox]{display:none} +.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;-moz-user-select:none;-webkit-user-select:none; } +.toggle.off .toggle-group{left:-100%} +.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0} +.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0;} +.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:50px;border-width:0 1px; border-radius: 999px; border: 1px solid #ccc; +background: rgb(255,255,255); /* Old browsers */ +background: -moz-linear-gradient(top, rgba(255,255,255,1) 10%, rgba(239,239,239,1) 100%); /* FF3.6+ */ +background: -webkit-gradient(linear, left top, left bottom, color-stop(10%,rgba(255,255,255,1)), color-stop(100%,rgba(239,239,239,1))); /* Chrome,Safari4+ */ +background: -webkit-linear-gradient(top, rgba(255,255,255,1) 10%,rgba(239,239,239,1) 100%); /* Chrome10+,Safari5.1+ */ +background: -o-linear-gradient(top, rgba(255,255,255,1) 10%,rgba(239,239,239,1) 100%); /* Opera 11.10+ */ +background: -ms-linear-gradient(top, rgba(255,255,255,1) 10%,rgba(239,239,239,1) 100%); /* IE10+ */ +background: linear-gradient(to bottom, rgba(255,255,255,1) 10%,rgba(239,239,239,1) 100%); /* W3C */ +filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#efefef',GradientType=0 ); /* IE6-9 */ + +} +.toggle.btn{min-width:59px;min-height:34px;} +.toggle-on.btn{padding-right:24px;} +.toggle-off.btn{padding-left:24px} +.toggle.btn-lg{min-width:79px;min-height:45px} +.toggle-on.btn-lg{padding-right:31px;} +.toggle-off.btn-lg{padding-left:31px;} +.toggle-handle.btn-lg{width:40px;} +.toggle.btn-sm{min-width:50px;min-height:30px} +.toggle-on.btn-sm{padding-right:20px} +.toggle-off.btn-sm{padding-left:20px} +.toggle.btn-xs{min-width:35px;min-height:22px} +.toggle-on.btn-xs{padding-right:12px} +.toggle-off.btn-xs{padding-left:12px} \ No newline at end of file diff --git a/admin/src/main/webapp/css/plugin/bootstrap-wysihtml5/bootstrap-wysihtml5.css b/admin/src/main/webapp/css/plugin/bootstrap-wysihtml5/bootstrap-wysihtml5.css new file mode 100755 index 0000000..fbdd8c2 --- /dev/null +++ b/admin/src/main/webapp/css/plugin/bootstrap-wysihtml5/bootstrap-wysihtml5.css @@ -0,0 +1,83 @@ + + +ul.wysihtml5-toolbar { + margin: 0; + padding: 0; + display: block; + background: #f2f2f2; + border: 1px solid #BDC4C9; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + +} + +ul.wysihtml5-toolbar::after { + clear: both; + display: table; + content: ""; +} + +ul.wysihtml5-toolbar > li { + float: left; + display: list-item; + list-style: none; + padding: 0; + margin: 0px 5px 0px 0px; +} + +ul.wysihtml5-toolbar a{ + margin: 0px; +} + + +ul.wysihtml5-toolbar a.btn{ + padding: 12px 15px; + background: inherit; + font-size: inherit; + border-radius: 0; + color: inherit; +} +ul.wysihtml5-toolbar a:hover.btn{ + color: #333; +} + +ul.wysihtml5-toolbar a[data-wysihtml5-command=bold] { + font-weight: bold; +} + +ul.wysihtml5-toolbar a[data-wysihtml5-command=italic] { + font-style: italic; +} + +ul.wysihtml5-toolbar a[data-wysihtml5-command=underline] { + text-decoration: underline; +} + +ul.wysihtml5-toolbar a.btn.wysihtml5-command-active { + background-image: none; + background: #CECECE; + box-shadow: none; + color: #333; + outline: 0; +} + +ul.wysihtml5-commands-disabled .dropdown-menu { + display: none !important; +} + +ul.wysihtml5-toolbar .fa{ + margin: 0; + font-size: 14px; +} +.wysihtml5-textarea{ + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top: none; +} +.wysihtml5-textarea:focus{ + border-top: none; + background: #fff; +} + + + diff --git a/admin/src/main/webapp/css/plugin/chartist/chartist.min.css b/admin/src/main/webapp/css/plugin/chartist/chartist.min.css new file mode 100755 index 0000000..3949c9e --- /dev/null +++ b/admin/src/main/webapp/css/plugin/chartist/chartist.min.css @@ -0,0 +1,543 @@ +.ct-chart{} +.ct-chart .ct-label, +.ct-chart .ct-label.ct-horizontal { + display: block; + width: 100%; + height: 100%; + fill: #333; + color: rgba(0,0,0,.4); + font-size: 12px; + text-align: left; +} +.ct-chart .ct-label.ct-vertical { + display: block; + width: 100%; + height: 100%; + fill: rgba(0,0,0,.4); + color: rgba(0,0,0,.4); + font-size: 12px; + text-align: right; +} +.ct-chart .ct-grid { + stroke: rgba(0,0,0,.2);; + stroke-width: 1px; + stroke-dasharray: 2px; +} +.ct-chart .ct-point { + stroke-width: 10px; + stroke-linecap: round; +} +.ct-chart .ct-line { + fill: none; + stroke-width: 4px; +} +.ct-chart .ct-area { + stroke: none; + fill-opacity: .1; +} +.ct-chart .ct-bar { + fill: none; + stroke-width: 10px; +} +.ct-chart .ct-slice.ct-donut { + fill: none; + stroke-width: 60px; +} +.ct-chart .ct-series.ct-series-a .ct-bar, +.ct-chart .ct-series.ct-series-a .ct-line, +.ct-chart .ct-series.ct-series-a .ct-point, +.ct-chart .ct-series.ct-series-a .ct-slice.ct-donut { stroke: #399BFF; } +.ct-chart .ct-series.ct-series-a .ct-area, +.ct-chart .ct-series.ct-series-a .ct-slice:not(.ct-donut) { fill: #399BFF; } +.ct-chart .ct-series.ct-series-b .ct-bar, +.ct-chart .ct-series.ct-series-b .ct-line, +.ct-chart .ct-series.ct-series-b .ct-point, +.ct-chart .ct-series.ct-series-b .ct-slice.ct-donut { stroke: #EF4836 } +.ct-chart .ct-series.ct-series-b .ct-area, +.ct-chart .ct-series.ct-series-b .ct-slice:not(.ct-donut) { fill: #EF4836 } +.ct-chart .ct-series.ct-series-c .ct-bar, +.ct-chart .ct-series.ct-series-c .ct-line, +.ct-chart .ct-series.ct-series-c .ct-point, +.ct-chart .ct-series.ct-series-c .ct-slice.ct-donut { stroke: #26A65B } +.ct-chart .ct-series.ct-series-c .ct-area, +.ct-chart .ct-series.ct-series-c .ct-slice:not(.ct-donut) { fill: #26A65B } +.ct-chart .ct-series.ct-series-d .ct-bar, +.ct-chart .ct-series.ct-series-d .ct-line, +.ct-chart .ct-series.ct-series-d .ct-point, +.ct-chart .ct-series.ct-series-d .ct-slice.ct-donut { stroke: #F39C12 } +.ct-chart .ct-series.ct-series-d .ct-area, +.ct-chart .ct-series.ct-series-d .ct-slice:not(.ct-donut) { fill: #F39C12 } +.ct-chart .ct-series.ct-series-e .ct-bar, +.ct-chart .ct-series.ct-series-e .ct-line, +.ct-chart .ct-series.ct-series-e .ct-point, +.ct-chart .ct-series.ct-series-e .ct-slice.ct-donut { stroke: #453d3f } +.ct-chart .ct-series.ct-series-e .ct-area, +.ct-chart .ct-series.ct-series-e .ct-slice:not(.ct-donut) { fill: #453d3f } +.ct-chart .ct-series.ct-series-f .ct-bar, +.ct-chart .ct-series.ct-series-f .ct-line, +.ct-chart .ct-series.ct-series-f .ct-point, +.ct-chart .ct-series.ct-series-f .ct-slice.ct-donut { stroke: #59922b } +.ct-chart .ct-series.ct-series-f .ct-area, +.ct-chart .ct-series.ct-series-f .ct-slice:not(.ct-donut) { fill: #59922b } +.ct-chart .ct-series.ct-series-g .ct-bar, +.ct-chart .ct-series.ct-series-g .ct-line, +.ct-chart .ct-series.ct-series-g .ct-point, +.ct-chart .ct-series.ct-series-g .ct-slice.ct-donut { stroke: #0544d3 } +.ct-chart .ct-series.ct-series-g .ct-area, +.ct-chart .ct-series.ct-series-g .ct-slice:not(.ct-donut) { fill: #0544d3 } +.ct-chart .ct-series.ct-series-h .ct-bar, +.ct-chart .ct-series.ct-series-h .ct-line, +.ct-chart .ct-series.ct-series-h .ct-point, +.ct-chart .ct-series.ct-series-h .ct-slice.ct-donut { stroke: #6b0392 } +.ct-chart .ct-series.ct-series-h .ct-area, +.ct-chart .ct-series.ct-series-h .ct-slice:not(.ct-donut) { fill: #6b0392 } +.ct-chart .ct-series.ct-series-i .ct-bar, +.ct-chart .ct-series.ct-series-i .ct-line, +.ct-chart .ct-series.ct-series-i .ct-point, +.ct-chart .ct-series.ct-series-i .ct-slice.ct-donut { stroke: #f05b4f } +.ct-chart .ct-series.ct-series-i .ct-area, +.ct-chart .ct-series.ct-series-i .ct-slice:not(.ct-donut) { fill: #f05b4f } +.ct-chart .ct-series.ct-series-j .ct-bar, +.ct-chart .ct-series.ct-series-j .ct-line, +.ct-chart .ct-series.ct-series-j .ct-point, +.ct-chart .ct-series.ct-series-j .ct-slice.ct-donut { stroke: #dda458 } +.ct-chart .ct-series.ct-series-j .ct-area, +.ct-chart .ct-series.ct-series-j .ct-slice:not(.ct-donut) { fill: #dda458 } +.ct-chart .ct-series.ct-series-k .ct-bar, +.ct-chart .ct-series.ct-series-k .ct-line, +.ct-chart .ct-series.ct-series-k .ct-point, +.ct-chart .ct-series.ct-series-k .ct-slice.ct-donut { stroke: #eacf7d } +.ct-chart .ct-series.ct-series-k .ct-area, +.ct-chart .ct-series.ct-series-k .ct-slice:not(.ct-donut) { fill: #eacf7d } +.ct-chart .ct-series.ct-series-l .ct-bar, +.ct-chart .ct-series.ct-series-l .ct-line, +.ct-chart .ct-series.ct-series-l .ct-point, +.ct-chart .ct-series.ct-series-l .ct-slice.ct-donut { stroke: #86797d } +.ct-chart .ct-series.ct-series-l .ct-area, +.ct-chart .ct-series.ct-series-l .ct-slice:not(.ct-donut) { fill: #86797d } +.ct-chart .ct-series.ct-series-m .ct-bar, +.ct-chart .ct-series.ct-series-m .ct-line, +.ct-chart .ct-series.ct-series-m .ct-point, +.ct-chart .ct-series.ct-series-m .ct-slice.ct-donut { stroke: #b2c326 } +.ct-chart .ct-series.ct-series-m .ct-area, +.ct-chart .ct-series.ct-series-m .ct-slice:not(.ct-donut) { fill: #b2c326 } +.ct-chart .ct-series.ct-series-n .ct-bar, +.ct-chart .ct-series.ct-series-n .ct-line, +.ct-chart .ct-series.ct-series-n .ct-point, +.ct-chart .ct-series.ct-series-n .ct-slice.ct-donut { stroke: #6188e2 } +.ct-chart .ct-series.ct-series-n .ct-area, +.ct-chart .ct-series.ct-series-n .ct-slice:not(.ct-donut) { fill: #6188e2 } +.ct-chart .ct-series.ct-series-o .ct-bar, +.ct-chart .ct-series.ct-series-o .ct-line, +.ct-chart .ct-series.ct-series-o .ct-point, +.ct-chart .ct-series.ct-series-o .ct-slice.ct-donut { stroke: #a748ca } +.ct-chart .ct-series.ct-series-o .ct-area, +.ct-chart .ct-series.ct-series-o .ct-slice:not(.ct-donut) { fill: #a748ca } +.ct-chart.ct-square { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-square:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 100%; +} +.ct-chart.ct-square:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-square>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-minor-second { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-minor-second:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 93.75%; +} +.ct-chart.ct-minor-second:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-minor-second>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-major-second { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-major-second:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 88.8888888889%; +} +.ct-chart.ct-major-second:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-major-second>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-minor-third { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-minor-third:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 83.3333333333%; +} +.ct-chart.ct-minor-third:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-minor-third>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-major-third { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-major-third:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 80%; +} +.ct-chart.ct-major-third:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-major-third>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-perfect-fourth { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-perfect-fourth:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 75%; +} +.ct-chart.ct-perfect-fourth:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-perfect-fourth>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-perfect-fifth { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-perfect-fifth:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 66.6666666667%; +} +.ct-chart.ct-perfect-fifth:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-perfect-fifth>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-minor-sixth { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-minor-sixth:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 62.5%; +} +.ct-chart.ct-minor-sixth:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-minor-sixth>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-golden-section { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-golden-section:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 61.804697157%; +} +.ct-chart.ct-golden-section:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-golden-section>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-major-sixth { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-major-sixth:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 60%; +} +.ct-chart.ct-major-sixth:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-major-sixth>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-minor-seventh { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-minor-seventh:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 56.25%; +} +.ct-chart.ct-minor-seventh:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-minor-seventh>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-major-seventh { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-major-seventh:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 53.3333333333%; +} +.ct-chart.ct-major-seventh:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-major-seventh>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-octave { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-octave:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 50%; +} +.ct-chart.ct-octave:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-octave>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-major-tenth { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-major-tenth:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 40%; +} +.ct-chart.ct-major-tenth:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-major-tenth>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-major-eleventh { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-major-eleventh:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 37.5%; +} +.ct-chart.ct-major-eleventh:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-major-eleventh>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-major-twelfth { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-major-twelfth:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 33.3333333333%; +} +.ct-chart.ct-major-twelfth:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-major-twelfth>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} +.ct-chart.ct-double-octave { + display: block; + position: relative; + width: 100%; +} +.ct-chart.ct-double-octave:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 25%; +} +.ct-chart.ct-double-octave:after { + content: ""; + display: table; + clear: both; +} +.ct-chart.ct-double-octave>svg { + display: block; + position: absolute; + top: 0; + left: 0; +} \ No newline at end of file diff --git a/admin/src/main/webapp/css/plugin/datatables/datatables.css b/admin/src/main/webapp/css/plugin/datatables/datatables.css new file mode 100755 index 0000000..cafce66 --- /dev/null +++ b/admin/src/main/webapp/css/plugin/datatables/datatables.css @@ -0,0 +1,466 @@ +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; + text-transform: uppercase; + font-size: 12px; +} +table.dataTable thead th, +table.dataTable thead td { + padding: 16px 18px; + border-bottom: 1px solid #ccc; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 16px 18px 20px 18px; + border-top: 1px solid #ccc; +} +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting { + cursor: pointer; + *cursor: hand; +} +table.dataTable thead .sorting { + background: url("../../../img/datatables/sort_both.png") no-repeat center right; +} +table.dataTable thead .sorting_asc { + background: url("../../../img/datatables/sort_asc.png") no-repeat center right; +} +table.dataTable thead .sorting_desc { + background: url("../../../img/datatables/sort_desc.png") no-repeat center right; +} +table.dataTable thead .sorting_asc_disabled { + background: url("../../../img/datatables/sort_asc_disabled.png") no-repeat center right; +} +table.dataTable thead .sorting_desc_disabled { + background: url("../../../img/datatables/sort_desc_disabled.png") no-repeat center right; +} +table.dataTable tbody tr { + background-color: white; +} +table.dataTable tbody tr.selected { + background-color: #b0bed9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 14px 10px; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #dddddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #dddddd; + border-right: 1px solid #dddddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #dddddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #abb9d3; +} +table.dataTable.hover tbody tr:hover, +table.dataTable.hover tbody tr.odd:hover, +table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover, +table.dataTable.display tbody tr.odd:hover, +table.dataTable.display tbody tr.even:hover { + background-color: whitesmoke; +} +table.dataTable.hover tbody tr:hover.selected, +table.dataTable.hover tbody tr.odd:hover.selected, +table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected, +table.dataTable.display tbody tr.odd:hover.selected, +table.dataTable.display tbody tr.even:hover.selected { + background-color: #a9b7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #f9f9f9; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b3cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a7b5ce; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b6d0; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #f9f9f9; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fbfbfb; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fdfdfd; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #adbbd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, +table.dataTable.display tbody tr.odd:hover > .sorting_1, +table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, +table.dataTable.display tbody tr.odd:hover > .sorting_2, +table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 { + background-color: #ebebeb; +} +table.dataTable.display tbody tr:hover > .sorting_3, +table.dataTable.display tbody tr.odd:hover > .sorting_3, +table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 { + background-color: #eeeeee; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 { + background-color: #a1aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 { + background-color: #a2afc8; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 { + background-color: #a4b2cb; +} +table.dataTable.no-footer { + border-bottom: 1px solid #111111; +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} +table.dataTable.compact thead th, +table.dataTable.compact thead td { + padding: 5px 9px; +} +table.dataTable.compact tfoot th, +table.dataTable.compact tfoot td { + padding: 5px 9px 3px 9px; +} +table.dataTable.compact tbody th, +table.dataTable.compact tbody td { + padding: 4px 5px; +} +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} + +table.dataTable, +table.dataTable th, +table.dataTable td { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; + zoom: 1; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + margin-left: 0.5em; + height: 34px; + border-radius: 3px; + padding-left: 10px; + font-size: 14px; + font-family:arial,sans-serif; + font-weight: normal; + background: #fff; + border:1px solid #BDC4C9; + box-shadow: inset 0px 1px 0px #F1F0F1; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.755em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; + padding-top: 0.25em; +} +.dataTables_wrapper .dataTables_paginate .paginate_button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.2em 1em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333333 !important; + border: 1px solid transparent; + border-radius: 4px; + background: #f2f2f2; +} +.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { + color: #444; + background-color: #ddd; + + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { + cursor: default; + color: #666; + background: transparent; + border: none; + box-shadow: none; + border-radius: 3px; +} +.dataTables_wrapper .dataTables_paginate .paginate_button:hover { + background-color: #eee; + color: #333; +} +.dataTables_wrapper .dataTables_paginate .paginate_button:active { + outline: none; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* IE10+ */ + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Opera 11.10+ */ + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333333; + font-family: inherit; + font-weight: 400; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing, +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing { + height: 0; + overflow: hidden; + margin: 0 !important; + padding: 0 !important; +} +.dataTables_wrapper.no-footer .dataTables_scrollBody { + border-bottom: 1px solid #ccc; +} +.dataTables_wrapper.no-footer div.dataTables_scrollHead table, +.dataTables_wrapper.no-footer div.dataTables_scrollBody table { + border-bottom: none; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + .dataTables_wrapper .dataTables_info, + .dataTables_wrapper .dataTables_paginate { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_paginate { + margin-top: 0.5em; + } +} +@media screen and (max-width: 640px) { + .dataTables_wrapper .dataTables_length, + .dataTables_wrapper .dataTables_filter { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_filter { + margin-top: 0.5em; + } +} + + +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter { + color: #777; +} + + +tr.group, +tr.group:hover { + background-color: #e1e1e1 !important; +} diff --git a/admin/src/main/webapp/css/plugin/date-range-picker/daterangepicker-bs3.css b/admin/src/main/webapp/css/plugin/date-range-picker/daterangepicker-bs3.css new file mode 100755 index 0000000..e1fc8ef --- /dev/null +++ b/admin/src/main/webapp/css/plugin/date-range-picker/daterangepicker-bs3.css @@ -0,0 +1,322 @@ +/*! + * Stylesheet for the Date Range Picker, for use with Bootstrap 3.x + * + * Copyright 2013-2015 Dan Grossman ( http://www.dangrossman.info ) + * Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php + * + * Built for http://www.improvely.com + */ + + .daterangepicker.dropdown-menu { + max-width: none; + z-index: 3000; +} +.daterangepicker.dropdown-menu select{ + font-size: 12px; + min-width: 70px; +} + +.daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar { + float: left; + margin: 4px; +} + +.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar, +.daterangepicker.openscenter .ranges, .daterangepicker.openscenter .calendar { + float: right; + margin: 4px; +} + +.daterangepicker.single .ranges, .daterangepicker.single .calendar { + float: none; +} + +.daterangepicker .ranges { + width: 160px; + text-align: left; +} + +.daterangepicker .ranges .range_inputs>div { + float: left; +} + +.daterangepicker .ranges .range_inputs>div:nth-child(2) { + padding-left: 11px; +} + +.daterangepicker .calendar { + display: none; + max-width: 270px; +} + +.daterangepicker.show-calendar .calendar { + display: block; +} + +.daterangepicker .calendar.single .calendar-date { + border: none; +} + +.daterangepicker .calendar th, .daterangepicker .calendar td { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + white-space: nowrap; + text-align: center; + min-width: 32px; +} + +.daterangepicker .daterangepicker_start_input label, +.daterangepicker .daterangepicker_end_input label { + color: #333; + display: block; + font-size: 11px; + font-weight: normal; + height: 20px; + line-height: 20px; + margin-bottom: 2px; + text-shadow: #fff 1px 1px 0px; + text-transform: uppercase; + width: 74px; +} + +.daterangepicker .ranges input { + font-size: 11px; +} + +.daterangepicker .ranges .input-mini { + border: 1px solid #ccc; + border-radius: 4px; + color: #555; + display: block; + font-size: 11px; + height: 30px; + line-height: 30px; + vertical-align: middle; + margin: 0 0 10px 0; + padding: 0 6px; + width: 74px; +} + +.daterangepicker .ranges ul { + list-style: none; + margin: 0; + padding: 0; +} + +.daterangepicker .ranges li { + font-size: 13px; + background: #f5f5f5; + border: 1px solid #f5f5f5; + color: #08c; + padding: 3px 12px; + margin-bottom: 8px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + cursor: pointer; +} + +.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { + background: #08c; + border: 1px solid #08c; + color: #fff; +} + +.daterangepicker .calendar-date { + border: 1px solid #ddd; + padding: 4px; + border-radius: 4px; + background: #fff; +} + +.daterangepicker .calendar-time { + text-align: center; + margin: 8px auto 0 auto; + line-height: 30px; +} + +.daterangepicker { + position: absolute; + background: #fff; + top: 100px; + left: 20px; + padding: 4px; + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.daterangepicker.opensleft:before { + position: absolute; + top: -7px; + right: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.daterangepicker.opensleft:after { + position: absolute; + top: -6px; + right: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: ''; +} + +.daterangepicker.openscenter:before { + position: absolute; + top: -7px; + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.daterangepicker.openscenter:after { + position: absolute; + top: -6px; + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: ''; +} + +.daterangepicker.opensright:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.daterangepicker.opensright:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: ''; +} + +.daterangepicker table { + width: 100%; + margin: 0; +} + +.daterangepicker td, .daterangepicker th { + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + cursor: pointer; + white-space: nowrap; +} + +.daterangepicker td.off { + color: #999; +} + +.daterangepicker td.disabled, .daterangepicker option.disabled { + color: #999; +} + +.daterangepicker td.available:hover, .daterangepicker th.available:hover { + background: #eee; +} + +.daterangepicker td.in-range { + background: #DBEDFF; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.daterangepicker td.start-date { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.daterangepicker td.end-date { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.daterangepicker td.start-date.end-date { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.daterangepicker td.active, .daterangepicker td.active:hover { + background-color: #399BFF; + color: #fff; +} + +.daterangepicker td.week, .daterangepicker th.week { + font-size: 80%; + color: #ccc; +} + +.daterangepicker select.monthselect, .daterangepicker select.yearselect { + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; +} + +.daterangepicker select.monthselect { + margin-right: 2%; + width: 56%; +} + +.daterangepicker select.yearselect { + width: 40%; +} + +.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect { + width: 50px; + margin-bottom: 0; +} + +.daterangepicker_start_input { + float: left; +} + +.daterangepicker_end_input { + float: left; + padding-left: 11px +} + +.daterangepicker th.month { + width: auto; +} diff --git a/admin/src/main/webapp/css/plugin/fullcalendar/fullcalendar.css b/admin/src/main/webapp/css/plugin/fullcalendar/fullcalendar.css new file mode 100755 index 0000000..dc36c31 --- /dev/null +++ b/admin/src/main/webapp/css/plugin/fullcalendar/fullcalendar.css @@ -0,0 +1,1079 @@ +/*! + * FullCalendar v2.3.0 Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + + +.fc { + direction: ltr; + text-align: left; +} + +.fc-rtl { + text-align: right; +} + +body .fc { /* extra precedence to overcome jqui */ + font-size: 1em; +} + + +/* Colors +--------------------------------------------------------------------------------------------------*/ + +.fc-unthemed th, +.fc-unthemed td, +.fc-unthemed thead, +.fc-unthemed tbody, +.fc-unthemed .fc-divider, +.fc-unthemed .fc-row, +.fc-unthemed .fc-popover { + border-color: #ddd; +} + +.fc-unthemed .fc-popover { + background-color: #fff; +} + +.fc-unthemed .fc-divider, +.fc-unthemed .fc-popover .fc-header { + background: #eee; +} + +.fc-unthemed .fc-popover .fc-header .fc-close { + color: #666; +} + +.fc-unthemed .fc-today { + background: #fcf8e3; +} + +.fc-highlight { /* when user is selecting cells */ + background: #bce8f1; + opacity: .3; + filter: alpha(opacity=30); /* for IE */ +} + +.fc-bgevent { /* default look for background events */ + background: rgb(143, 223, 130); + opacity: .3; + filter: alpha(opacity=30); /* for IE */ +} + +.fc-nonbusiness { /* default look for non-business-hours areas */ + /* will inherit .fc-bgevent's styles */ + background: #d7d7d7; +} + + +/* Icons (inline elements with styled text that mock arrow icons) +--------------------------------------------------------------------------------------------------*/ + +.fc-icon { + display: inline-block; + width: 1em; + height: 1em; + line-height: 1em; + font-size: 1em; + text-align: center; + overflow: hidden; + font-family: "Courier New", Courier, monospace; +} + +/* +Acceptable font-family overrides for individual icons: + "Arial", sans-serif + "Times New Roman", serif + +NOTE: use percentage font sizes or else old IE chokes +*/ + +.fc-icon:after { + position: relative; + margin: 0 -1em; /* ensures character will be centered, regardless of width */ +} + +.fc-icon-left-single-arrow:after { + content: "\02039"; + font-weight: bold; + font-size: 200%; + top: -7%; + left: 3%; +} + +.fc-icon-right-single-arrow:after { + content: "\0203A"; + font-weight: bold; + font-size: 200%; + top: -7%; + left: -3%; +} + +.fc-icon-left-double-arrow:after { + content: "\000AB"; + font-size: 160%; + top: -7%; +} + +.fc-icon-right-double-arrow:after { + content: "\000BB"; + font-size: 160%; + top: -7%; +} + +.fc-icon-left-triangle:after { + content: "\25C4"; + font-size: 125%; + top: 3%; + left: -2%; +} + +.fc-icon-right-triangle:after { + content: "\25BA"; + font-size: 125%; + top: 3%; + left: 2%; +} + +.fc-icon-down-triangle:after { + content: "\25BC"; + font-size: 125%; + top: 2%; +} + +.fc-icon-x:after { + content: "\000D7"; + font-size: 200%; + top: 6%; +} + + +/* Buttons (styled +
+ + + + + +
+
+ + + + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户UID账户类型推荐人品种操作委托数量报价类型限价成交价格状态创建时间成交时间
${item.username}${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.username_parent}${item.itemname} + 买入 + 卖出 + ${item.volume} + 限价 + 市价 + ${item.price}${item.close_price} + 已提交 + 已撤销 + + 委托完成 + + ${item.createTime}${item.closeTime} + + + + + +
+ + + +
+ +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+
+ + +
+
+ + + + <%@ include file="include/footer.jsp"%> + + + + <%@ include file="include/js.jsp"%> + + + + <%-- +
+
+ + + + + + + +
+ + +
+
+
--%> + +
+ + + + + + +
+ + + + + + + + diff --git a/admin/src/main/webapp/exchangerate_list.jsp b/admin/src/main/webapp/exchangerate_list.jsp new file mode 100755 index 0000000..8e85424 --- /dev/null +++ b/admin/src/main/webapp/exchangerate_list.jsp @@ -0,0 +1,186 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + +
+
+

汇率配置

+ + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+ +
+ +
+
+
+ + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
出售币种币种名称币种单位币种符号汇率价格序号最小兑换最大兑换状态
USDT${item.name}${item.currency}${item.currency_symbol}${item.rata}${item.sort}${item.exc_min}${item.exc_max} + + + 启用 + + + 禁用 + + + + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + diff --git a/admin/src/main/webapp/exchangerate_update.jsp b/admin/src/main/webapp/exchangerate_update.jsp new file mode 100755 index 0000000..883a258 --- /dev/null +++ b/admin/src/main/webapp/exchangerate_update.jsp @@ -0,0 +1,211 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + +
+
+

汇率配置

+ + <%@ include file="include/alert.jsp"%> + +
+ +
+ +
+
+
+ +
+ 修改货币汇率 +
    +
  • +
  • +
+
+ +
+ +
+ + + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + +
+ +    +
图片尺寸:( 750px * 750px )
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + + +
+
+
+ +
+
+ + 取消 + 保存 + +
+
+ +
+ +
+
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/finance_add.jsp b/admin/src/main/webapp/finance_add.jsp new file mode 100755 index 0000000..82a80e5 --- /dev/null +++ b/admin/src/main/webapp/finance_add.jsp @@ -0,0 +1,257 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + +
+ +
+

理财产品配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 新增理财产品 +
    +
  • +
  • +
+
+ +
+ +
+ + + + +
基础信息
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
交易信息
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+
+ +
+ +
+
+ +
--
+ +
%
+
+
+
+ +
+ +
+
+ +
%
+
+
+
+ +
+ +
+
+ +
%
+
+
+
+ +
+ +
+
+ +
--
+ +
USDT
+
+
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/finance_list.jsp b/admin/src/main/webapp/finance_list.jsp new file mode 100755 index 0000000..67adcb5 --- /dev/null +++ b/admin/src/main/webapp/finance_list.jsp @@ -0,0 +1,172 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + +
+ +
+

理财产品配置

+ + <%@ include file="include/alert.jsp"%> + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+
+
+
+ + + +
+
+ +
+ +
查询结果
+ 新增 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
产品名称产品名称(英文)图片周期(天)日利率(%)(显示在APP端给客户看的)今日利率(%)(实际结算收益时候的使用的)违约结算比例(%)投资金额区间(USDT)状态
${item.name}${item.name_en} + + ${item.cycle}${item.daily_rate}--${item.daily_rate_max}${item.today_rate}${item.default_ratio}${item.investment_min}--${item.investment_max} + 启用 + 停用 + + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + +
+
+ +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + diff --git a/admin/src/main/webapp/finance_order_list.jsp b/admin/src/main/webapp/finance_order_list.jsp new file mode 100755 index 0000000..25ecdca --- /dev/null +++ b/admin/src/main/webapp/finance_order_list.jsp @@ -0,0 +1,384 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + <%@ include file="include/loading.jsp"%> +
+
+

理财订单

+ <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ + + + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+ + + +
+
+
操作
+
+ +
+
+
+ + + +
+ +
+ + + + +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用户名UID账户名称产品名称产品名称(英文)金额收益买入时间赎回时间状态
${item.username}${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.finance_name}${item.finance_name_en} + + + + + + + ${item.create_time}${item.close_time} + + 违约(提前赎回) + + + 托管中 + + + 赎回 + + + + + + + +
+ + + +
+ +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + +
+ +
+ + + + + + + + + + diff --git a/admin/src/main/webapp/finance_update.jsp b/admin/src/main/webapp/finance_update.jsp new file mode 100755 index 0000000..840e5de --- /dev/null +++ b/admin/src/main/webapp/finance_update.jsp @@ -0,0 +1,268 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + +
+ +
+

理财产品配置

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 修改理财产品 +
    +
  • +
  • +
+
+ +
+ +
+ + + + +
基础信息
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
交易信息
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+
+ +
+ +
+
+ +
--
+ +
%
+
+
+
+ +
+ +
+
+ +
%
+
+
+
+ +
+ +
+
+ +
%
+
+
+
+ +
+ +
+
+ +
--
+ +
USDT
+
+
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/fonts/FontAwesome.otf b/admin/src/main/webapp/fonts/FontAwesome.otf new file mode 100755 index 0000000..f7936cc Binary files /dev/null and b/admin/src/main/webapp/fonts/FontAwesome.otf differ diff --git a/admin/src/main/webapp/fonts/fontawesome-webfont.eot b/admin/src/main/webapp/fonts/fontawesome-webfont.eot new file mode 100755 index 0000000..33b2bb8 Binary files /dev/null and b/admin/src/main/webapp/fonts/fontawesome-webfont.eot differ diff --git a/admin/src/main/webapp/fonts/fontawesome-webfont.svg b/admin/src/main/webapp/fonts/fontawesome-webfont.svg new file mode 100755 index 0000000..1ee89d4 --- /dev/null +++ b/admin/src/main/webapp/fonts/fontawesome-webfont.svg @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/fonts/fontawesome-webfont.ttf b/admin/src/main/webapp/fonts/fontawesome-webfont.ttf new file mode 100755 index 0000000..ed9372f Binary files /dev/null and b/admin/src/main/webapp/fonts/fontawesome-webfont.ttf differ diff --git a/admin/src/main/webapp/fonts/fontawesome-webfont.woff b/admin/src/main/webapp/fonts/fontawesome-webfont.woff new file mode 100755 index 0000000..8b280b9 Binary files /dev/null and b/admin/src/main/webapp/fonts/fontawesome-webfont.woff differ diff --git a/admin/src/main/webapp/fonts/fontawesome-webfont.woff2 b/admin/src/main/webapp/fonts/fontawesome-webfont.woff2 new file mode 100755 index 0000000..3311d58 Binary files /dev/null and b/admin/src/main/webapp/fonts/fontawesome-webfont.woff2 differ diff --git a/admin/src/main/webapp/fonts/glyphicons-halflings-regular.ttf b/admin/src/main/webapp/fonts/glyphicons-halflings-regular.ttf new file mode 100755 index 0000000..1413fc6 Binary files /dev/null and b/admin/src/main/webapp/fonts/glyphicons-halflings-regular.ttf differ diff --git a/admin/src/main/webapp/fonts/glyphicons-halflings-regular.woff b/admin/src/main/webapp/fonts/glyphicons-halflings-regular.woff new file mode 100755 index 0000000..9e61285 Binary files /dev/null and b/admin/src/main/webapp/fonts/glyphicons-halflings-regular.woff differ diff --git a/admin/src/main/webapp/fonts/glyphicons-halflings-regular.woff2 b/admin/src/main/webapp/fonts/glyphicons-halflings-regular.woff2 new file mode 100755 index 0000000..64539b5 Binary files /dev/null and b/admin/src/main/webapp/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/admin/src/main/webapp/futures_holdings_list.jsp b/admin/src/main/webapp/futures_holdings_list.jsp new file mode 100755 index 0000000..333ce16 --- /dev/null +++ b/admin/src/main/webapp/futures_holdings_list.jsp @@ -0,0 +1,439 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

当前交割持仓单

+ + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+ +
+ + + + +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ <%-- --%> + +
+
+
+
+ +
+ 查询 +
+ +
+ +
+ +
+
+
+ + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + + <%-- + + + + + + + + + --%> + + + + + +
用户UID账户类型品种操作合约时间购买金额购买价现价手续费盈亏剩余时间购买时间交割时间状态
${item.username}${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.itemname} + + + + + ${item.timenum}${item.volume}${item.trade_avg_price}${item.close_avg_price}${item.fee} + + + + + + + ${item.remain_time}${item.create_time}${item.settlement_time} + 盈利 + + 亏损 + + + + 持仓 + + + 已平仓 + + + + + + + + + + + + + + + + + + + 剩余时间 + 持仓 + + 已平仓 + + + +
+ + + +
+
+
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + +
+ + + + + + +
+ + + + + + + + + + diff --git a/admin/src/main/webapp/futures_order_list.jsp b/admin/src/main/webapp/futures_order_list.jsp new file mode 100755 index 0000000..d4cd50e --- /dev/null +++ b/admin/src/main/webapp/futures_order_list.jsp @@ -0,0 +1,515 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

交割合约单

+ + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+ +
+ + + + +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ <%-- --%> + +
+
+
+
+ +
+
+ +
+
+
+
+ <%-- --%> + +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+
+ + + +
+
+ +
+ +
查询结果
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- + + + --%> + + + + + + + + + + +
用户UID账户类型品种操作合约时间购买金额购买价结算价手续费盈亏购买时间交割时间状态订单盈亏控制情况(优先级高于交割场控设置)
+ + + + ${fn:substring(item.username,0,4)}***${fn:substring(item.username,fn:length(item.username) - 4, fn:length(item.username))} + + + + ${item.username} + + + ${item.usercode} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.roleNameDesc} + + + ${item.itemname} + + + + + ${item.timenum}${item.volume}${item.trade_avg_price}${item.close_avg_price}${item.fee} + + ${item.profit} + + + ${item.profit} + + ${item.create_time}${item.settlement_time} + + + + + + + + + + + + + + + + + 剩余时间 + + 持仓 + + + 已平仓 + + + + 盈利 + + + 亏损 + + + + + + + +
+ + + +
+ +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + +
+ +
+ + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+
+ + +
+
+ + <%@ include file="include/js.jsp"%> + + + + + + + + + + + + diff --git a/admin/src/main/webapp/goods_buy_list.jsp b/admin/src/main/webapp/goods_buy_list.jsp new file mode 100755 index 0000000..bb3481b --- /dev/null +++ b/admin/src/main/webapp/goods_buy_list.jsp @@ -0,0 +1,365 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + +<%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

实物兑换记录

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ + +
+ + + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+ +
+
+ + +
+ + +
+ +
+
+
+ +
+
+
+ +
+ + +
+ +
+ +
查询结果
+ <%-- 新增 --%> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
订单号会员ID会员账号手机号商品名称兑换数量支付总积分状态收货人收货人手机号收货地址备注下单时间
${item.id}${item.userCode}${item.userName}${item.Uphone}${item.goodsName}${item.num}${item.payPoint} + + 待发货 + + + 已发货 + + + 已取消 + + ${item.contacts}${item.phone}${item.address}${item.remark}${item.createTime} + + +
+ + + + +
+
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + + + +
+ + + +
+
+ + + +
+ + +
+
+
+<%@ include file="include/js.jsp"%> + + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/google_auth.jsp b/admin/src/main/webapp/google_auth.jsp new file mode 100755 index 0000000..08e7ae7 --- /dev/null +++ b/admin/src/main/webapp/google_auth.jsp @@ -0,0 +1,314 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + +
+ + + +
+

系统用户管理 +

+ <%@ include file="include/alert.jsp"%> + + + + + + +
+ +
+
+ +
+ +
+
+ +
+ + + +
+
+
+ +
+ ${username}谷歌验证器 +
    +
  • +
  • +
+
+ +
+
+ + + + + + + +
+ +
+ + +
+ +
+ 生成 +
+
+
+ + +
+ +
+ + + +
+
+
+ +

已绑定

+
+ +
+ +
+ +
+ +
+
+ +
+
+ 取消 + + + + + + 解绑 + + + 绑定 + + + + + +
+
+ +
+
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/google_auth_admin.jsp b/admin/src/main/webapp/google_auth_admin.jsp new file mode 100755 index 0000000..7bfb11e --- /dev/null +++ b/admin/src/main/webapp/google_auth_admin.jsp @@ -0,0 +1,297 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + +
+ + + +
+

系统配置 +

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ admin谷歌验证器 +
    +
  • +
  • +
+
+ +
+
+ + + + +
+ +
+ + +
+ +
+ 生成 +
+
+
+ + +
+ +
+ +
+
+
+ +

已绑定

+
+ +
+ + +
+ +
+ +
+
+ + + +
+
+ 取消 + + + + + 解绑 + + + 绑定 + + + + +
+
+ +
+
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/google_auth_login.jsp b/admin/src/main/webapp/google_auth_login.jsp new file mode 100755 index 0000000..d4525cb --- /dev/null +++ b/admin/src/main/webapp/google_auth_login.jsp @@ -0,0 +1,242 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

${username}谷歌验证器 +

+ <%@ include file="include/alert.jsp"%> + + +
+
+
+
+
+ + + +
+ +
+ + +
+ +
+ 生成 +
+
+
+ + +
+ +
+ + +
+
+
+ + +

已绑定

+
+ +
+ +
+
+ + 绑定 + +
+
+ +
+
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/google_auth_super.jsp b/admin/src/main/webapp/google_auth_super.jsp new file mode 100755 index 0000000..303d1a3 --- /dev/null +++ b/admin/src/main/webapp/google_auth_super.jsp @@ -0,0 +1,285 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + + +
+ + + +
+

系统配置 +

+ <%@ include file="include/alert.jsp"%> + + +
+ +
+ + +
+
+
+ +
+ 超级谷歌验证器 +
    +
  • +
  • +
+
+ +
+ +
+ + + + +
+ +
+ + +
+ +
+ 生成 +
+
+
+ +
+ +

已绑定

+
+ +
+ +
+ +
+ + + +
+
+ +
+
+ 取消 + + + + + 解绑 + + + 绑定 + + + +
+
+ +
+
+
+ +
+
+
+ + +
+ + + + + <%@ include file="include/footer.jsp"%> + + +
+ + + + + + + + <%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/help/css/bootstrap.css b/admin/src/main/webapp/help/css/bootstrap.css new file mode 100755 index 0000000..e1f1d25 --- /dev/null +++ b/admin/src/main/webapp/help/css/bootstrap.css @@ -0,0 +1,6565 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 22px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eee; + opacity: 1; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.form-group-sm .form-control { + height: 30px; + line-height: 30px; +} +textarea.form-group-sm .form-control, +select[multiple].form-group-sm .form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.form-group-lg .form-control { + height: 46px; + line-height: 46px; +} +textarea.form-group-lg .form-control, +select[multiple].form-group-lg .form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; + visibility: hidden; +} +.collapse.in { + display: block; + visibility: visible; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px solid; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; + visibility: hidden; +} +.tab-content > .active { + display: block; + visibility: visible; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + visibility: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +a.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: absolute; + top: 0; + right: 0; + left: 0; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + min-height: 16.42857143px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-weight: normal; + line-height: 1.4; + visibility: visible; + filter: alpha(opacity=0); + opacity: 0; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; + visibility: hidden !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/admin/src/main/webapp/help/css/style.css b/admin/src/main/webapp/help/css/style.css new file mode 100755 index 0000000..5396993 --- /dev/null +++ b/admin/src/main/webapp/help/css/style.css @@ -0,0 +1,194 @@ +@import url(http://fonts.googleapis.com/css?family=Open+Sans:700,600,400); +@import url(http://fonts.googleapis.com/css?family=Montserrat:400,700); + +body { + color: #666; + background: #3D464D; + margin: 0; + line-height: 1.9em; + font-size: 13px; + font-family: 'Open Sans', sans-serif; + outline: 0; + text-Shadow: 0 0 1px rgba(0, 0, 0, 0.2); +} +p{ + margin-bottom: 20px; +} +::-moz-selection { + background: #D5EAFF; +} +::selection { + background: #D5EAFF; +} +a { + color: #399bff; + text-decoration: none; +} +b{ + font-weight: 600; + color: #444; +} +h1,h2,h3,h4,h5,h6{ + font-family: 'Montserrat', sans-serif; + color: #444; +} +h5{ + margin-bottom: 20px; + margin-top: 20px; +} + +#top{ + background: #399BFF; + color: #fff; + padding: 15px; + width: 100%; + position: relative; + text-align: right; +} +#top h1{ + color: #fff; + margin: 0; + font-size: 20px; + position: absolute; + left: 20px; +} +#top a{ + color: #fff; +} +#top h1 small{ + color: #fff; + opacity: 0.7; + margin-left: 10px;; +} +.top-menu{ + text-align: right; + padding: 0; + margin: 0; +} +.top-menu li{ + display: inline-block; + padding-left: 20px; +} +.sidebar{ + padding: 20px 20px; + font-weight: 600; +} +.sidebar li{ + display: block; + padding-bottom: 10px; + padding-left: 20px;; +} +.sidebar a{ + display:block; + color: #B1B5B8; +} +.sidebar a:hover{ + color: #fff; +} +.sidebar .title{ + font-family: 'Montserrat', sans-serif; + text-transform: uppercase; + font-size: 11px; + padding-left: 0; + color: #8B9094; + opacity: 0.7; +} +.content{ + background: #fff; + padding: 20px 40px; +} +.content h4{ + color: #399BFF; + text-transform: uppercase; +} + +.post{ + padding-bottom: 30px; + border-bottom: 1px solid #ddd; + margin-bottom: 30px; +} + +.root-ul{ + line-height: 2em; + background: #f9f9f9; + border: 1px solid #f2f2f2; + display: inline-block; + padding-top: 10px; + padding-right: 20px; + padding-bottom: 10px; + border-radius: 5px;; + color: #999; +} +.root-ul b{ + color: #333; + font-weight: 600; + margin-right: 5px; +} +.root-ul li{ + list-style: disc; +} + +.gotop{ + position: fixed; + left: 20px; + bottom: 20px; + color: #333; + padding: 5px 20px; + background: #fff; + border-radius: 4px; + opacity: 0.6; +} +.gotop:hover{ + text-decoration: none; + color: #fff; + background: #399BFF; + opacity: 1; +} +.bigtext{ + font-size: 18px; + font-weight: 300; + line-height: 2em; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/help/img/inc-files.png b/admin/src/main/webapp/help/img/inc-files.png new file mode 100755 index 0000000..1be9ec4 Binary files /dev/null and b/admin/src/main/webapp/help/img/inc-files.png differ diff --git a/admin/src/main/webapp/help/index.html b/admin/src/main/webapp/help/index.html new file mode 100755 index 0000000..56bf497 --- /dev/null +++ b/admin/src/main/webapp/help/index.html @@ -0,0 +1,545 @@ + + + + + + + Kode - Documentation + + + + + + + ↑ Top +
+

KodeDocumentation

+
    +
  • Thank you for purchasing kode
  • +
  • Support
  • +
+
+ + + +
+

Getting Started

+

Thanks for Purchasing Kode. Kode is a admin template based on Boostrap.Builded with CSS, jQuery and Less.

+ + +
+

Theme Files

+

Html Files

+
    +
  • index.html: Index page
  • +
  • 404.html: 404 Page not found
  • +
  • 500.html: 500 Server error
  • +
  • basic-table.html: Basic table styles
  • +
  • blank.html: Blank page
  • +
  • buttons.html: Button and styles
  • +
  • changelogs.html: Changelogs of Kode
  • +
  • charts.html: Charts
  • +
  • contact.html: Contact form
  • +
  • customizable.html: Customizable elements
  • +
  • data-table.html: Data tables
  • +
  • forgot-password.html: Forgot password form
  • +
  • form-elements.html: Form elements
  • +
  • grid.html: Grid styles
  • +
  • helper-classes.html: Helper classes
  • +
  • icons.html: Icons
  • +
  • invoice.html: Invoice page
  • +
  • layouts.html: Form layouts
  • +
  • lockscreen.html: Lockscreen
  • +
  • login.html: Login form
  • +
  • mailbox.html: Mailbox
  • +
  • maps.html: Maps
  • +
  • modal-boxes.html: Modal Boxes
  • +
  • notifications.html: Notifications and alert boxes
  • +
  • others.html: Other UI elements
  • +
  • panels.html: Panels
  • +
  • progress-bars.html: Progress bars
  • +
  • register.html: Register form
  • +
  • social-profile.html: Social profile
  • +
  • tabs.html: Tabs
  • +
  • text-editors.html: Text editors
  • +
  • typography.html: Typography
  • +
  • widgets.html: Widgets
  • +
+

Css Files

+
    +
  • root.css: Root styles
  • +
  • bootstrap.css: Bootstrap 3 main css
  • +
  • style.css: Theme styles
  • +
  • style.less: style file less version
  • +
  • shortcuts.css: Shortcuts codes
  • +
  • responsive.css: Responsive definitions
  • +
  • font-awesome.min.css: Font awesome main file
  • +
  • plugins: Plugin folder +
      +
    • awesome-bootstrap-checkbox +
        +
      • awesome-boostrap-checkbox.css: Main File
      • +
      +
    • +
    • bootstrap-select +
        +
      • bootstra-select.css: Main File
      • +
      +
    • +
    • bootstrap-toggle +
        +
      • bootstra-toggle.min.css: Main File
      • +
      +
    • +
    • bootstrap-wysihtml5 +
        +
      • bootstrap-wysihtml5.css: Main File
      • +
      +
    • +
    • chartist +
        +
      • chartist.min.css: Main File
      • +
      +
    • +
    • datatables +
        +
      • datatables.css: Main File
      • +
      +
    • +
    • rickshaw +
        +
      • detail.css: Detail styles
      • +
      • graph.css: Graph styles
      • +
      • legend.css: Legend styles
      • +
      • rickshaw.css: Main File
      • +
      +
    • +
    • summernote +
        +
      • summernote-bs3.css: Bootstrap 3 styles
      • +
      • summernote.css: Main File
      • +
      +
    • +
    • sweet-alert +
        +
      • sweet-alert.css Main File
      • +
      +
    • +
    +
  • +
+ +

Javascript Files

+
    +
  • jquery.min.js: js
  • +
  • plugins.js: js
  • +
  • bootstrap: Bootstrap jquery folder +
      +
    • bootstrap.min.js: Main file
    • +
    +
  • +
  • bootstrap-select: Bootstrap select plugin folder +
      +
    • bootstrap-select.js: Main file
    • +
    +
  • +
  • bootstrap-toggle: Bootstrap toggle plugin folder +
      +
    • bootstrap-toggle.min.js: Main file
    • +
    +
  • +
  • bootstrap-wysihtml5: Bootstrap wysihtml5 editor folder +
      +
    • bootstrap-wysihtml5.js: Bootstrap file
    • +
    • wysihtml5-0.3.0.min.js: Main file
    • +
    +
  • +
  • chartist: Chartist plugin folder +
      +
    • chartist.js: Main file
    • +
    • chartist-plugin.js Demo codes
    • +
    +
  • +
  • datatables: Datatables plugin folder +
      +
    • datatables.min.js: Main file
    • +
    +
  • +
  • easypiechart: Easy pie chart plugin folder +
      +
    • easypiechart.js: Main file
    • +
    • easypiechart-plugin.js: Demo codes
    • +
    +
  • +
  • flot-chart: Flot chart plugin folder +
      +
    • flot-chart-pie.js: Pie chart
    • +
    • flot-chart-stack.js: Stack chart
    • +
    • flot-chart-time.js: Time
    • +
    • flot-chart.js: Main file
    • +
    • flot-chart-plugin.js: Demo codes
    • +
    +
  • +
  • gmaps: Gmaps plugin folder +
      +
    • gmaps.js Main file
    • +
    • gmaps-plugin.js Demo codes
    • +
    +
  • +
  • kode-alert: Kode alert plugin folder +
      +
    • main.js Main file
    • +
    +
  • +
  • rickshaw: Rickshaw plugin folder +
      +
    • d3.v3.js d3 lib
    • +
    • rickshaw.js Main file
    • +
    • rickshaw-plugin.js Demo codes
    • +
    +
  • +
  • sparkline: Sparkline plugin folder +
      +
    • sparkline.js Main file
    • +
    • sparkline-plugin.js Demo codes
    • +
    +
  • +
  • summernote: Summernote plugin folder +
      +
    • summernote.min.js Main file
    • +
    +
  • +
  • sweet-alert: Sweet alert plugin folder +
      +
    • sweet-alert.min.js Main file
    • +
    +
  • +
      + +
+ + + + +
+

Fireworks Layout PNG

+
    +
  • Illustration / Error-Pages-Icons.png: Error page Illustration
  • +
  • Layered-PNG / Base.png: Base theme
  • +
  • Layered-PNG / ErrorPages.png: Error page
  • +
  • Layered-PNG / Login.png: Login forms
  • +
  • Layered-PNG / Mailbox.png: Mailbox
  • +
  • Layered-PNG / Sidepanel.png: Sidepanel
  • +
  • Layered-PNG / UI.png: Some UI elements and widgets
  • + + +
+
+ +
+

Includes

+
Css Files
+
    +
  • style/root.css: root of all css files
  • +
+
Javascript Files
+

You can take a look javascript files bottom on index.html codes

+ +
+ + + + +
+

Topbar '#top div'

+ Topbar comes fixed on top of page. You can change it if u dont want to. + Open style.css and find #top class.
+ Change position value as absolute and it will be not fixed. +
+ All top bar elements coded based as rgba. You can create different styles just changing #top background: +
How to change logo ?
+

Logo is inside of .applogo and its text. Put your project logo as image inside on it or just edit as text

+
What is Sidebar or Sidepanel open buttons ?
+

These buttons one of left and other is right of topbar.

+

Open sidebar button has 2 different type. One mobile and one desktop pc. Mobile is only can be see on mobile resolution. Actually these buttons have same style, just doing different work. Normal sidebar button is working on desktop and hide itselft on mobile. Mobile sidebar button works on mobile and hide itself on desktop resolution.

+

+
+ + +
+

About Css

+
How to use multiple class for css ?
+

Example:
+ div class="sidebar" - just classed as sidebar
+ div class="sidebar leftmenu" - classed as sidebar and leftmenu +

+
What is style.less?
+

Its less version of your style.css. Kode developed on less but used style.css. You can use it if you are working based on Less.

+
+ + +
+

Sidebar

+
How to change sidebar background?
+

Sidebar background based on body background. Change body background. Text and icons colors coded as rgba.

+

Sidebar is relative on desktop mode and it hide itself on mobile
+ On mobile mode sidebar position value is absolute. +

+

All sidebar menu coded as group and classed .sidebar-panel

+
+ + +
+

Layouts

+
Default
+ Default layouts are #top, .sidebar, .footer and .content. Also there is a .sidepanel
+ #top - Topbar
+ .sidebar - Sidebar
+ .footer - Footer
+ .content - Content
+ .sidepanel - Side panel right of screen. +
Container Layouts
+ .container-widget - Container layout for widgets
+ .container-default - Container default
+ .container-padding - Container with padding.
+ .container-no-padding - Container without padding.
+ .container-mail - Container for mailbox. + +
+ + + + +
+

Grid

+

Kode using bootstrap grid system

+

Bootstrap includes a responsive, mobile first fluid grid system that appropriately scales up to 12 columns as the device or viewport size increases. It includes predefined classes for easy layout options, as well as powerful mixins for generating more semantic layouts. +

+

Learn more about Bootstrap grid system http://getbootstrap.com/css/#grid

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Extra small devices + Phones (<768px) + + Small devices + Tablets (≥768px) + + Medium devices + Desktops (≥992px) + + Large devices + Desktops (≥1200px) +
Grid behaviorHorizontal at all timesCollapsed to start, horizontal above breakpoints
Container widthNone (auto)750px970px1170px
Class prefix.col-xs-.col-sm-.col-md-.col-lg-
# of columns12
Column widthAuto~62px~81px~97px
Gutter width30px (15px on each side of a column)
NestableYes
OffsetsYes
Column orderingYes
+
+
+ + +
+

Based on Boostrap

+ Kode using Bootstrap. Bootstrap is most popular HTML, CSS, and JS framework for developing responsive, mobile first projects on the web.
+ Learn more about bootstrap
+ http://getbootstrap.com +
+ +
+

Source and Plugins

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PluginWebsiteLicence
Bootstrap Frameworkhttp://getbootstrap.comMIT
jQuery JavaScript Libraryhttp://jquery.comMIT
jQuery UIhttps://jqueryui.comMIT
Font Awesomehttp://fortawesome.github.io/Font-AwesomeMIT
Awesome Bootstrap Checkboxhhttps://github.com/flatlogic/awesome-bootstrap-checkboxMIT
Bootstrap Selecthttp://silviomoreto.github.io/bootstrap-selectMIT
Bootstrap Togglehttp://www.bootstraptoggle.comMIT
Bootstrap wysihtml5http://jhollingworth.github.io/bootstrap-wysihtml5MIT
Chartisthttp://gionkunz.github.io/chartist-jsWTFPL
Easy Pie Charthttp://rendro.github.io/easy-pie-chartMIT
Flothttp://www.flotcharts.orgMIT
Gmapshttps://hpneo.github.io/gmapsMIT
Sparklineshttp://omnipotent.net/jquery.sparklineBSD
Datatableshttp://www.datatables.netMulti
Rickshawhttp://code.shutterstock.com/rickshawMIT
Summernotehttp://summernote.orgMIT
Sweet Alertshttp://tristanedwards.me/sweetalertMIT
Full Calendarhttp://fullcalendar.ioMIT
Date Range Pickerhttp://www.daterangepicker.comMIT
Picjumbo (pictures)http://picjumbo.com/Commercial Free
+
+ +
+

Support

+

Contact with me for your feedbacks or questions.

+ + themeforest.net/user/egemem +
+ + + + +
+ + + \ No newline at end of file diff --git a/admin/src/main/webapp/image/l_bg.png b/admin/src/main/webapp/image/l_bg.png new file mode 100755 index 0000000..1564d5c Binary files /dev/null and b/admin/src/main/webapp/image/l_bg.png differ diff --git a/admin/src/main/webapp/image/n.png b/admin/src/main/webapp/image/n.png new file mode 100755 index 0000000..a35c43f Binary files /dev/null and b/admin/src/main/webapp/image/n.png differ diff --git a/admin/src/main/webapp/image/n2.png b/admin/src/main/webapp/image/n2.png new file mode 100755 index 0000000..0a1f4c8 Binary files /dev/null and b/admin/src/main/webapp/image/n2.png differ diff --git a/admin/src/main/webapp/image/p.png b/admin/src/main/webapp/image/p.png new file mode 100755 index 0000000..d8c0506 Binary files /dev/null and b/admin/src/main/webapp/image/p.png differ diff --git a/admin/src/main/webapp/image/p2.png b/admin/src/main/webapp/image/p2.png new file mode 100755 index 0000000..efc5e69 Binary files /dev/null and b/admin/src/main/webapp/image/p2.png differ diff --git a/admin/src/main/webapp/img/404.png b/admin/src/main/webapp/img/404.png new file mode 100755 index 0000000..e69de29 diff --git a/admin/src/main/webapp/img/500.png b/admin/src/main/webapp/img/500.png new file mode 100755 index 0000000..e69de29 diff --git a/admin/src/main/webapp/img/alerticons/anotherwarning.png b/admin/src/main/webapp/img/alerticons/anotherwarning.png new file mode 100755 index 0000000..f0328d4 Binary files /dev/null and b/admin/src/main/webapp/img/alerticons/anotherwarning.png differ diff --git a/admin/src/main/webapp/img/alerticons/autotime.png b/admin/src/main/webapp/img/alerticons/autotime.png new file mode 100755 index 0000000..2726e89 Binary files /dev/null and b/admin/src/main/webapp/img/alerticons/autotime.png differ diff --git a/admin/src/main/webapp/img/alerticons/basic.png b/admin/src/main/webapp/img/alerticons/basic.png new file mode 100755 index 0000000..e0c66c2 Binary files /dev/null and b/admin/src/main/webapp/img/alerticons/basic.png differ diff --git a/admin/src/main/webapp/img/alerticons/picture.png b/admin/src/main/webapp/img/alerticons/picture.png new file mode 100755 index 0000000..6ce0f0b Binary files /dev/null and b/admin/src/main/webapp/img/alerticons/picture.png differ diff --git a/admin/src/main/webapp/img/alerticons/success.png b/admin/src/main/webapp/img/alerticons/success.png new file mode 100755 index 0000000..63b1e40 Binary files /dev/null and b/admin/src/main/webapp/img/alerticons/success.png differ diff --git a/admin/src/main/webapp/img/alerticons/textunder.png b/admin/src/main/webapp/img/alerticons/textunder.png new file mode 100755 index 0000000..b28a2a3 Binary files /dev/null and b/admin/src/main/webapp/img/alerticons/textunder.png differ diff --git a/admin/src/main/webapp/img/alerticons/warning.png b/admin/src/main/webapp/img/alerticons/warning.png new file mode 100755 index 0000000..425cdf1 Binary files /dev/null and b/admin/src/main/webapp/img/alerticons/warning.png differ diff --git a/admin/src/main/webapp/img/bg.jpg b/admin/src/main/webapp/img/bg.jpg new file mode 100755 index 0000000..60c5a46 Binary files /dev/null and b/admin/src/main/webapp/img/bg.jpg differ diff --git a/admin/src/main/webapp/img/bnt-bg.png b/admin/src/main/webapp/img/bnt-bg.png new file mode 100755 index 0000000..4fb7691 Binary files /dev/null and b/admin/src/main/webapp/img/bnt-bg.png differ diff --git a/admin/src/main/webapp/img/chat/clickshow.png b/admin/src/main/webapp/img/chat/clickshow.png new file mode 100755 index 0000000..ebff4e8 Binary files /dev/null and b/admin/src/main/webapp/img/chat/clickshow.png differ diff --git a/admin/src/main/webapp/img/chat/gth.png b/admin/src/main/webapp/img/chat/gth.png new file mode 100755 index 0000000..1a6067b Binary files /dev/null and b/admin/src/main/webapp/img/chat/gth.png differ diff --git a/admin/src/main/webapp/img/chat/icon-add-old.png b/admin/src/main/webapp/img/chat/icon-add-old.png new file mode 100755 index 0000000..f73f00d Binary files /dev/null and b/admin/src/main/webapp/img/chat/icon-add-old.png differ diff --git a/admin/src/main/webapp/img/chat/loading.gif b/admin/src/main/webapp/img/chat/loading.gif new file mode 100755 index 0000000..384a1f6 Binary files /dev/null and b/admin/src/main/webapp/img/chat/loading.gif differ diff --git a/admin/src/main/webapp/img/chat/my-ico.png b/admin/src/main/webapp/img/chat/my-ico.png new file mode 100755 index 0000000..8e2ef05 Binary files /dev/null and b/admin/src/main/webapp/img/chat/my-ico.png differ diff --git a/admin/src/main/webapp/img/chat/my-ico2.png b/admin/src/main/webapp/img/chat/my-ico2.png new file mode 100755 index 0000000..d73b36e Binary files /dev/null and b/admin/src/main/webapp/img/chat/my-ico2.png differ diff --git a/admin/src/main/webapp/img/chat/my-ico3.png b/admin/src/main/webapp/img/chat/my-ico3.png new file mode 100755 index 0000000..2fd6154 Binary files /dev/null and b/admin/src/main/webapp/img/chat/my-ico3.png differ diff --git a/admin/src/main/webapp/img/chat/my-ico4.png b/admin/src/main/webapp/img/chat/my-ico4.png new file mode 100755 index 0000000..3c08bb2 Binary files /dev/null and b/admin/src/main/webapp/img/chat/my-ico4.png differ diff --git a/admin/src/main/webapp/img/datatables/back_disabled.png b/admin/src/main/webapp/img/datatables/back_disabled.png new file mode 100755 index 0000000..2f70d58 Binary files /dev/null and b/admin/src/main/webapp/img/datatables/back_disabled.png differ diff --git a/admin/src/main/webapp/img/datatables/back_enabled.png b/admin/src/main/webapp/img/datatables/back_enabled.png new file mode 100755 index 0000000..ae5ec38 Binary files /dev/null and b/admin/src/main/webapp/img/datatables/back_enabled.png differ diff --git a/admin/src/main/webapp/img/datatables/back_enabled_hover.png b/admin/src/main/webapp/img/datatables/back_enabled_hover.png new file mode 100755 index 0000000..e4cf350 Binary files /dev/null and b/admin/src/main/webapp/img/datatables/back_enabled_hover.png differ diff --git a/admin/src/main/webapp/img/datatables/forward_disabled.png b/admin/src/main/webapp/img/datatables/forward_disabled.png new file mode 100755 index 0000000..1c31a03 Binary files /dev/null and b/admin/src/main/webapp/img/datatables/forward_disabled.png differ diff --git a/admin/src/main/webapp/img/datatables/forward_enabled.png b/admin/src/main/webapp/img/datatables/forward_enabled.png new file mode 100755 index 0000000..40c4093 Binary files /dev/null and b/admin/src/main/webapp/img/datatables/forward_enabled.png differ diff --git a/admin/src/main/webapp/img/datatables/forward_enabled_hover.png b/admin/src/main/webapp/img/datatables/forward_enabled_hover.png new file mode 100755 index 0000000..8720a98 Binary files /dev/null and b/admin/src/main/webapp/img/datatables/forward_enabled_hover.png differ diff --git a/admin/src/main/webapp/img/datatables/sort_asc.png b/admin/src/main/webapp/img/datatables/sort_asc.png new file mode 100755 index 0000000..e1ba61a Binary files /dev/null and b/admin/src/main/webapp/img/datatables/sort_asc.png differ diff --git a/admin/src/main/webapp/img/datatables/sort_asc_disabled.png b/admin/src/main/webapp/img/datatables/sort_asc_disabled.png new file mode 100755 index 0000000..fb11dfe Binary files /dev/null and b/admin/src/main/webapp/img/datatables/sort_asc_disabled.png differ diff --git a/admin/src/main/webapp/img/datatables/sort_both.png b/admin/src/main/webapp/img/datatables/sort_both.png new file mode 100755 index 0000000..af5bc7c Binary files /dev/null and b/admin/src/main/webapp/img/datatables/sort_both.png differ diff --git a/admin/src/main/webapp/img/datatables/sort_desc.png b/admin/src/main/webapp/img/datatables/sort_desc.png new file mode 100755 index 0000000..0e156de Binary files /dev/null and b/admin/src/main/webapp/img/datatables/sort_desc.png differ diff --git a/admin/src/main/webapp/img/datatables/sort_desc_disabled.png b/admin/src/main/webapp/img/datatables/sort_desc_disabled.png new file mode 100755 index 0000000..c9fdd8a Binary files /dev/null and b/admin/src/main/webapp/img/datatables/sort_desc_disabled.png differ diff --git a/admin/src/main/webapp/img/example-logo.png b/admin/src/main/webapp/img/example-logo.png new file mode 100755 index 0000000..f28a41f Binary files /dev/null and b/admin/src/main/webapp/img/example-logo.png differ diff --git a/admin/src/main/webapp/img/example1.jpg b/admin/src/main/webapp/img/example1.jpg new file mode 100755 index 0000000..e69de29 diff --git a/admin/src/main/webapp/img/ico-l1.png b/admin/src/main/webapp/img/ico-l1.png new file mode 100755 index 0000000..ffa228a Binary files /dev/null and b/admin/src/main/webapp/img/ico-l1.png differ diff --git a/admin/src/main/webapp/img/ico-l2.png b/admin/src/main/webapp/img/ico-l2.png new file mode 100755 index 0000000..3cbbcbf Binary files /dev/null and b/admin/src/main/webapp/img/ico-l2.png differ diff --git a/admin/src/main/webapp/img/index-img/BTC.png b/admin/src/main/webapp/img/index-img/BTC.png new file mode 100755 index 0000000..639cf59 Binary files /dev/null and b/admin/src/main/webapp/img/index-img/BTC.png differ diff --git a/admin/src/main/webapp/img/index-img/ETH.png b/admin/src/main/webapp/img/index-img/ETH.png new file mode 100755 index 0000000..ad334c8 Binary files /dev/null and b/admin/src/main/webapp/img/index-img/ETH.png differ diff --git a/admin/src/main/webapp/img/index-img/USDT.png b/admin/src/main/webapp/img/index-img/USDT.png new file mode 100755 index 0000000..38282e0 Binary files /dev/null and b/admin/src/main/webapp/img/index-img/USDT.png differ diff --git a/admin/src/main/webapp/img/index-img/a-kuanxiang2x.png b/admin/src/main/webapp/img/index-img/a-kuanxiang2x.png new file mode 100755 index 0000000..925301f Binary files /dev/null and b/admin/src/main/webapp/img/index-img/a-kuanxiang2x.png differ diff --git a/admin/src/main/webapp/img/index-img/a-xiazai2x.png b/admin/src/main/webapp/img/index-img/a-xiazai2x.png new file mode 100755 index 0000000..5237611 Binary files /dev/null and b/admin/src/main/webapp/img/index-img/a-xiazai2x.png differ diff --git a/admin/src/main/webapp/img/index-img/anquanjiance.png b/admin/src/main/webapp/img/index-img/anquanjiance.png new file mode 100755 index 0000000..1bb3079 Binary files /dev/null and b/admin/src/main/webapp/img/index-img/anquanjiance.png differ diff --git a/admin/src/main/webapp/img/index-img/huiyuan.png b/admin/src/main/webapp/img/index-img/huiyuan.png new file mode 100755 index 0000000..48764ad Binary files /dev/null and b/admin/src/main/webapp/img/index-img/huiyuan.png differ diff --git a/admin/src/main/webapp/img/index-img/shuju2.png b/admin/src/main/webapp/img/index-img/shuju2.png new file mode 100755 index 0000000..233a007 Binary files /dev/null and b/admin/src/main/webapp/img/index-img/shuju2.png differ diff --git a/admin/src/main/webapp/img/index-img/tuandui.png b/admin/src/main/webapp/img/index-img/tuandui.png new file mode 100755 index 0000000..2735d8b Binary files /dev/null and b/admin/src/main/webapp/img/index-img/tuandui.png differ diff --git a/admin/src/main/webapp/img/index-img/wode.png b/admin/src/main/webapp/img/index-img/wode.png new file mode 100755 index 0000000..5c19415 Binary files /dev/null and b/admin/src/main/webapp/img/index-img/wode.png differ diff --git a/admin/src/main/webapp/img/kode-icon.png b/admin/src/main/webapp/img/kode-icon.png new file mode 100755 index 0000000..e69de29 diff --git a/admin/src/main/webapp/img/loading.gif b/admin/src/main/webapp/img/loading.gif new file mode 100755 index 0000000..6b0afa5 Binary files /dev/null and b/admin/src/main/webapp/img/loading.gif differ diff --git a/admin/src/main/webapp/img/modalicons/large.png b/admin/src/main/webapp/img/modalicons/large.png new file mode 100755 index 0000000..ca75abe Binary files /dev/null and b/admin/src/main/webapp/img/modalicons/large.png differ diff --git a/admin/src/main/webapp/img/modalicons/normal.png b/admin/src/main/webapp/img/modalicons/normal.png new file mode 100755 index 0000000..8499484 Binary files /dev/null and b/admin/src/main/webapp/img/modalicons/normal.png differ diff --git a/admin/src/main/webapp/img/modalicons/small.png b/admin/src/main/webapp/img/modalicons/small.png new file mode 100755 index 0000000..8b0707c Binary files /dev/null and b/admin/src/main/webapp/img/modalicons/small.png differ diff --git a/admin/src/main/webapp/img/profileimg.png b/admin/src/main/webapp/img/profileimg.png new file mode 100755 index 0000000..e69de29 diff --git a/admin/src/main/webapp/img/profileimg2.png b/admin/src/main/webapp/img/profileimg2.png new file mode 100755 index 0000000..e69de29 diff --git a/admin/src/main/webapp/img/profileimg3.png b/admin/src/main/webapp/img/profileimg3.png new file mode 100755 index 0000000..e69de29 diff --git a/admin/src/main/webapp/img/profileimg4.png b/admin/src/main/webapp/img/profileimg4.png new file mode 100755 index 0000000..e69de29 diff --git a/admin/src/main/webapp/img/profileimg5.png b/admin/src/main/webapp/img/profileimg5.png new file mode 100755 index 0000000..e69de29 diff --git a/admin/src/main/webapp/img/profileimg6.png b/admin/src/main/webapp/img/profileimg6.png new file mode 100755 index 0000000..e69de29 diff --git a/admin/src/main/webapp/img/signature.png b/admin/src/main/webapp/img/signature.png new file mode 100755 index 0000000..96e1e69 Binary files /dev/null and b/admin/src/main/webapp/img/signature.png differ diff --git a/admin/src/main/webapp/img/socialbg.jpg b/admin/src/main/webapp/img/socialbg.jpg new file mode 100755 index 0000000..e69de29 diff --git a/admin/src/main/webapp/img/solicit-banner.png b/admin/src/main/webapp/img/solicit-banner.png new file mode 100755 index 0000000..03682d9 Binary files /dev/null and b/admin/src/main/webapp/img/solicit-banner.png differ diff --git a/admin/src/main/webapp/include/alert.jsp b/admin/src/main/webapp/include/alert.jsp new file mode 100755 index 0000000..97808b4 --- /dev/null +++ b/admin/src/main/webapp/include/alert.jsp @@ -0,0 +1,54 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +
+ + ${message} +
+
+ + +
+ × + ${error} +
+
+ + +
+
+
+ + + diff --git a/admin/src/main/webapp/include/basePath.jsp b/admin/src/main/webapp/include/basePath.jsp new file mode 100755 index 0000000..2bd3639 --- /dev/null +++ b/admin/src/main/webapp/include/basePath.jsp @@ -0,0 +1,9 @@ +<%@ page language="java" pageEncoding="utf-8"%> +<%-- --%> + +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + String base = "http://" + request.getServerName() + ":"+request.getServerPort()+"/"; + // String username = security.getUsername_login(); +%> diff --git a/admin/src/main/webapp/include/email_code.jsp b/admin/src/main/webapp/include/email_code.jsp new file mode 100755 index 0000000..c47ae83 --- /dev/null +++ b/admin/src/main/webapp/include/email_code.jsp @@ -0,0 +1,174 @@ +<%@ page language="java" pageEncoding="utf-8"%> + +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + String base = "http://" + request.getServerName() + ":"+request.getServerPort()+"/"; +%> + + + + + + + + + +
+
邮箱验证
+
+ +
此次操作ip与上次登录ip不相符
+
+ +
+ +
+
+ +
+ + +
+ +
+ +
+ +
确定
+ +
+
+ + + \ No newline at end of file diff --git a/admin/src/main/webapp/include/footer.jsp b/admin/src/main/webapp/include/footer.jsp new file mode 100755 index 0000000..2026f20 --- /dev/null +++ b/admin/src/main/webapp/include/footer.jsp @@ -0,0 +1,7 @@ +<%@ page language="java" pageEncoding="utf-8"%> + diff --git a/admin/src/main/webapp/include/footerPage.jsp b/admin/src/main/webapp/include/footerPage.jsp new file mode 100755 index 0000000..50aa325 --- /dev/null +++ b/admin/src/main/webapp/include/footerPage.jsp @@ -0,0 +1,57 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + diff --git a/admin/src/main/webapp/include/google_auth_code.jsp b/admin/src/main/webapp/include/google_auth_code.jsp new file mode 100755 index 0000000..0683070 --- /dev/null +++ b/admin/src/main/webapp/include/google_auth_code.jsp @@ -0,0 +1,107 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + String base = "http://" + request.getServerName() + ":"+request.getServerPort()+"/"; +%> + + + + + + + + + +
+
谷歌验证
+
+ + + +
此次操作ip与上次登录ip不相符
+
+
+ +
+ +
+
+ +
+ + +
+ +
+
+
${error}
+
确定
+ +
+
+ + + \ No newline at end of file diff --git a/admin/src/main/webapp/include/head.jsp b/admin/src/main/webapp/include/head.jsp new file mode 100755 index 0000000..f831591 --- /dev/null +++ b/admin/src/main/webapp/include/head.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" pageEncoding="utf-8"%> + + + + + +<%@ include file="sitename.jsp"%> + + + +<%-- --%> + diff --git a/admin/src/main/webapp/include/jquery.jsp b/admin/src/main/webapp/include/jquery.jsp new file mode 100755 index 0000000..b4ed5f6 --- /dev/null +++ b/admin/src/main/webapp/include/jquery.jsp @@ -0,0 +1,40 @@ +<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> + +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; +%> + + + + diff --git a/admin/src/main/webapp/include/js.jsp b/admin/src/main/webapp/include/js.jsp new file mode 100755 index 0000000..9c3c8c4 --- /dev/null +++ b/admin/src/main/webapp/include/js.jsp @@ -0,0 +1,32 @@ +<%@ page language="java" pageEncoding="utf-8"%> + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/webapp/include/loading.jsp b/admin/src/main/webapp/include/loading.jsp new file mode 100755 index 0000000..b8c2cc2 --- /dev/null +++ b/admin/src/main/webapp/include/loading.jsp @@ -0,0 +1,2 @@ +<%@ page language="java" pageEncoding="utf-8"%> +
loading-img
\ No newline at end of file diff --git a/admin/src/main/webapp/include/menu_left.jsp b/admin/src/main/webapp/include/menu_left.jsp new file mode 100755 index 0000000..dc08b06 --- /dev/null +++ b/admin/src/main/webapp/include/menu_left.jsp @@ -0,0 +1,409 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/include/page_simple.jsp b/admin/src/main/webapp/include/page_simple.jsp new file mode 100755 index 0000000..55c4e95 --- /dev/null +++ b/admin/src/main/webapp/include/page_simple.jsp @@ -0,0 +1,17 @@ +<%@ page language="java" pageEncoding="utf-8"%> + + diff --git a/admin/src/main/webapp/include/pagetop.jsp b/admin/src/main/webapp/include/pagetop.jsp new file mode 100755 index 0000000..752e77e --- /dev/null +++ b/admin/src/main/webapp/include/pagetop.jsp @@ -0,0 +1,19 @@ +<%@ page language="java" pageEncoding="utf-8"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> +<%@ page contentType="text/html; charset=UTF-8" import="java.util.ResourceBundle" %> + +<% + String path = request.getContextPath(); + String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + String base = "http://" + request.getServerName() + ":"+request.getServerPort()+"/"; + String bases = "https://"+request.getServerName()+path+"/"; + + + ResourceBundle res = ResourceBundle.getBundle("config"); + String adminUrl = res.getString("backstage_url"); + String dmUrl = res.getString("dm_url"); + + +%> + diff --git a/admin/src/main/webapp/include/sitename.jsp b/admin/src/main/webapp/include/sitename.jsp new file mode 100755 index 0000000..e891499 --- /dev/null +++ b/admin/src/main/webapp/include/sitename.jsp @@ -0,0 +1,2 @@ +<%@ page language="java" pageEncoding="utf-8"%> +管理系统 \ No newline at end of file diff --git a/admin/src/main/webapp/include/top.jsp b/admin/src/main/webapp/include/top.jsp new file mode 100755 index 0000000..d1a07f1 --- /dev/null +++ b/admin/src/main/webapp/include/top.jsp @@ -0,0 +1,1273 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + +
+ +
+
请点击打开消息声音提醒
+
+ + + + + + + + + + + + +
    +
  • + + + + + + + + + + + + + + + + + + + + +
  • +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + +<%-- + + + + + + + + + + + + + + + + + + + + + + --%> \ No newline at end of file diff --git a/admin/src/main/webapp/index_admin.jsp b/admin/src/main/webapp/index_admin.jsp new file mode 100755 index 0000000..4ab42ee --- /dev/null +++ b/admin/src/main/webapp/index_admin.jsp @@ -0,0 +1,572 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> + + +<%@ include file="include/pagetop.jsp"%> + + + + + + <%@ include file="include/head.jsp"%> + + <%@ include file="include/head.jsp"%> + + + + +<%@ include file="include/loading.jsp"%> + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + <%-- --%> +
+ +
+
+
+
+
新客充值
+
+
+
+
+
+
新客充值人数
+
+
+
+
+
+
新客提现
+
+
+
+
+
+
新客提现人数
+
+
+
+
+
+
新客充值差额
+
+
+
+
+
+
充值
+
+
+
+
+
+
充值人数
+
+
+
+
+
+
提现
+
+
+
+
+
+
提现人数
+
+
+
+
+
+
充值差额
+
+
+
+
+
+
订单数量
+
+
+
+
+
+
销售总额
+
+
+
+
+
+
佣金发放
+
+
+
+
+
+
新增用户
+
+
+ +
+
+
+
+
新增店铺
+
+
+
+
+
+
活跃人数
+
+
+
+
+
+
总用户
+
+
+
+
+
+
总店铺
+
+
+ +
+ +
+
+
+
店铺销售TOP10
+
+ + + + + + + + + +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> + +
店铺名称销售总额销量
${seller.sellerName}${seller.goodsCount}
+
+ +
+
+ + + +
+ +
+ +
+ +
+ + + + <%@ include file="include/footer.jsp"%> +
+ + +
+ +
+<%@ include file="include/js.jsp"%> + + + + + + + + diff --git a/admin/src/main/webapp/ip_count_list.jsp b/admin/src/main/webapp/ip_count_list.jsp new file mode 100755 index 0000000..57241a5 --- /dev/null +++ b/admin/src/main/webapp/ip_count_list.jsp @@ -0,0 +1,642 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> + <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

IP请求管理

+ + <%@ include file="include/alert.jsp"%> + + + +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ + +
+
+
+
+ + <%--
+
+
+
+ +
+
+
+
--%> + +
+ +
+ +
+ +
+
+
操作
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ + + +
+
+
+ +
数据汇总
+
+ + + + + + + + + + + + + + + + + + + +
ip数总访问量
+ +
+ +
+
+
+ +
+
+ +
+ +
查询结果
+ + 批量添加黑名单 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ip名单类型累计访问量首次请求时间
${item.ip} + + 黑名单 + + + 白名单 + + + 暂无 + + ${item.count} + <%-- + --%> + ${item.create_time} + +
+ + + +
+
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + +
+ + + + <%-- --%> + +
+ + +
+ +
+ +
+ + + + <%-- --%> + +
+ + +
+ +
+ +
+ + <%-- --%> + <%-- --%> + +
+ + +
+ +
+ +
+ + <%-- --%> + +
+ + +
+ +
+ +
+
+ + +
+
+ + + + + + + + diff --git a/admin/src/main/webapp/ip_menu_add.jsp b/admin/src/main/webapp/ip_menu_add.jsp new file mode 100755 index 0000000..da4935a --- /dev/null +++ b/admin/src/main/webapp/ip_menu_add.jsp @@ -0,0 +1,270 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> + <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

IP名单管理

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + + + +
+ + + +
+
+
+ +
+ 新增IP名单 +
    +
  • +
  • +
+
+ +
+
+ + + + + + +
+ +
+ + +
+
+ +

黑名单生成后将24小时后解封

+ +
+ +
+
+ <%-- --%> + +
+
+
+ + <%--
+ +
+ +
+
--%> + +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + + + diff --git a/admin/src/main/webapp/ip_menu_list.jsp b/admin/src/main/webapp/ip_menu_list.jsp new file mode 100755 index 0000000..5e105aa --- /dev/null +++ b/admin/src/main/webapp/ip_menu_list.jsp @@ -0,0 +1,350 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + <%@ include file="include/head.jsp"%> + + + +<%@ include file="include/loading.jsp"%> + +<%-- <%@ include file="include/top.jsp"%> --%> +<%-- <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

ip黑名单

+ + + <%@ include file="include/alert.jsp"%> +
+
+
+ +
查询条件
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+
+ + + + +
+ + +
+
+ +
查询结果
+ + 新增ip黑名单 + + +
+ + + + + + + + + + + + + + <%-- --%> + + + + + + + + + + + + + +
ip地址备注创建人创建时间
${item.ip}${item.remark}${item.createName}${item.create_time} + + +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + + + + + <%@ include file="include/footer.jsp"%> + +
+ + +
+
+ + +
+ + +
+
+
+ +
+
+ +
+ + +
+
+
+ + + + <%@ include file="include/js.jsp"%> + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/ip_menu_update.jsp b/admin/src/main/webapp/ip_menu_update.jsp new file mode 100755 index 0000000..544d2bb --- /dev/null +++ b/admin/src/main/webapp/ip_menu_update.jsp @@ -0,0 +1,185 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + <%-- <%@ include file="include/top.jsp"%> + <%@ include file="include/menu_left.jsp"%> --%> + + + +
+ + + +
+

IP名单管理

+ + <%@ include file="include/alert.jsp"%> + + + +
+ + + + +
+ + + +
+
+
+ +
+ 修改IP名单 +
    +
  • +
  • +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ +

黑名单生成后将24小时后解封

+ +
+ +
+
+ <%-- --%> + +
+
+
+ +
+ + +
+ +
+ +
+ +
+ +
+
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/item_add.jsp b/admin/src/main/webapp/item_add.jsp new file mode 100755 index 0000000..3aca3d5 --- /dev/null +++ b/admin/src/main/webapp/item_add.jsp @@ -0,0 +1,263 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + +
+
+

永续合约管理

+ + <%@ include file="include/alert.jsp"%> + +
+ +
+ + + +
+
+
+ +
+ 添加永续合约 +
    +
  • +
  • +
+ +
+ +
+ +
+ +
基础信息
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+
+ +
+ +
+ +
+ 交易对选择 +
+ +
交易信息
+

盈亏公式:(合约总金额 /每张金额)*(涨跌点数/最小变动单位*最小变动单位的盈亏金额)。

+
+ +
+
+ +
+
+
+
+ +
+ +
+
+ +
+
+
+
+ +
+ +
+ +

报价变动的最小幅度,行情低于设置单位不会计价盈亏"

+
+
+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + +
+ + + +
+ + +
+ +
+ + <%@ include file="include/js.jsp"%> + + + + + + + diff --git a/admin/src/main/webapp/item_config_add.jsp b/admin/src/main/webapp/item_config_add.jsp new file mode 100755 index 0000000..da94974 --- /dev/null +++ b/admin/src/main/webapp/item_config_add.jsp @@ -0,0 +1,240 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + +
+ +
+

行情品种管理

+ + <%@ include file="include/alert.jsp"%> + + + +
+ +
+ + + +
+
+
+ +
+ 添加行情品种 +
    +
  • +
  • +
+
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+
+ +
+ +
+
+ +
+
+
+
+ +
+ +
+
+ +
%
+
+
+
+ +
+ +
+ +
+ 交易对选择 +
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + +
+ + + +
+ + +
+ + +
+ + <%@ include file="include/js.jsp"%> + + + + + + + + diff --git a/admin/src/main/webapp/item_config_list.jsp b/admin/src/main/webapp/item_config_list.jsp new file mode 100755 index 0000000..9a76307 --- /dev/null +++ b/admin/src/main/webapp/item_config_list.jsp @@ -0,0 +1,205 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + +
+
+

行情品种管理

+ + <%@ include file="include/alert.jsp"%> + +
+ + + +
+ +
+
+
+
查询条件
+ +
+ +
+ + + +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ + <%-- --%> + + +
+
操作
+
+ +
+
+ +
+ +
+
+
+
+ +
+
+ +
+ +
查询结果
+
+ + + + + 新增 + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
名称代码交易对精度(位)交易量倍数借贷利率
${item.name}${item.symbol}${item.symbol_data}${item.decimals}${item.multiple}${item.borrowing_rate*100}% + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+ +
+ + +
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + + + <%@ include file="include/js.jsp"%> + +
+ +
+ + + + + + diff --git a/admin/src/main/webapp/item_config_update.jsp b/admin/src/main/webapp/item_config_update.jsp new file mode 100755 index 0000000..7722022 --- /dev/null +++ b/admin/src/main/webapp/item_config_update.jsp @@ -0,0 +1,162 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + +
+ +
+

行情品种管理

+ + <%@ include file="include/alert.jsp"%> + +
+ +
+ +
+
+
+ +
+ 修改行情品种 +
    +
  • +
  • +
+
+ +
+ +
+ + + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+
+ +
+ +
+
+ +
+
+
+
+ +
+ +
+
+ +
%
+
+
+
+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+ 取消 + 保存 +
+
+ +
+ +
+ +
+
+
+ +
+ + <%@ include file="include/footer.jsp"%> + +
+ + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/item_leverage_add.jsp b/admin/src/main/webapp/item_leverage_add.jsp new file mode 100755 index 0000000..8cab239 --- /dev/null +++ b/admin/src/main/webapp/item_leverage_add.jsp @@ -0,0 +1,95 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + +
+ +
+

交易杠杆

+ <%@ include file="include/alert.jsp"%> +
+ + +
+ +
+
+
+ +
+ 新增杠杆 +
    +
  • +
  • +
+
+ +
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + <%@ include file="include/footer.jsp"%> + + +
+ + <%@ include file="include/js.jsp"%> + + + + + + \ No newline at end of file diff --git a/admin/src/main/webapp/item_leverage_list.jsp b/admin/src/main/webapp/item_leverage_list.jsp new file mode 100755 index 0000000..9345fd0 --- /dev/null +++ b/admin/src/main/webapp/item_leverage_list.jsp @@ -0,0 +1,105 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + +<%@ include file="include/head.jsp"%> + + + <%@ include file="include/loading.jsp"%> + +
+
+

交易杠杆

+ <%@ include file="include/alert.jsp"%> + +
+
+ +
+ +
查询结果
+ 新增杠杆参数 +
+ + + + + + + + + + + + + + + + + + +
杠杆(倍)
+ +
+ + + +
+
+
+ <%@ include file="include/page_simple.jsp"%> +
+ +
+ + +
+
+ +
+ + <%@ include file="include/footer.jsp"%> + + +
+ + <%@ include file="include/js.jsp"%> +
+ + + +
+ + + \ No newline at end of file diff --git a/admin/src/main/webapp/item_list.jsp b/admin/src/main/webapp/item_list.jsp new file mode 100755 index 0000000..d24432b --- /dev/null +++ b/admin/src/main/webapp/item_list.jsp @@ -0,0 +1,171 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + + + +
+ + + +
+

永续合约管理

+ + <%@ include file="include/alert.jsp"%> + +
+ +
+ +
+
+
+ +
查询条件
+
+ +
+ + + +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+
+ +
+
+
+ +
查询结果
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
名称代码交易对每张金额每张手续费最小变动单位最小变动单位的盈亏金额
${item.name}${item.symbol}${item.symbol_data}${item.unit_amount}${item.unit_fee}${item.pips_str}${item.pips_amount_str} + + + +
+ + + +
+ +
+ +
+ + <%@ include file="include/page_simple.jsp"%> + + +
+
+
+
+ +
+ + + + <%@ include file="include/footer.jsp"%> + +
+ + <%@ include file="include/js.jsp"%> + +
+ +
+ + + + + + diff --git a/admin/src/main/webapp/item_update.jsp b/admin/src/main/webapp/item_update.jsp new file mode 100755 index 0000000..454adae --- /dev/null +++ b/admin/src/main/webapp/item_update.jsp @@ -0,0 +1,176 @@ +<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="include/pagetop.jsp"%> + + + + +<%@ include file="include/head.jsp"%> + + + + + <%@ include file="include/loading.jsp"%> + +
+
+

永续合约管理

+ + <%@ include file="include/alert.jsp"%> + +
+ +
+ +
+
+
+ +
+ 修改永续合约 +
    +
  • +
  • +
+
+ +
+ +
+ + +
基础信息
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
交易信息
+

盈亏公式:(合约总金额 /每张金额)*(涨跌点数/最小变动单位*最小变动单位的盈亏金额)。

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +

报价变动的最小幅度,行情低于设置单位不会计价盈亏"

+
+
+ +
+ +
+ +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+
+ + <%@ include file="include/footer.jsp"%> + +
+ + <%@ include file="include/js.jsp"%> + + + + + + diff --git a/admin/src/main/webapp/js/bootstrap-datetimepicker/bootstrap-datepicker.js b/admin/src/main/webapp/js/bootstrap-datetimepicker/bootstrap-datepicker.js new file mode 100755 index 0000000..7d4126c --- /dev/null +++ b/admin/src/main/webapp/js/bootstrap-datetimepicker/bootstrap-datepicker.js @@ -0,0 +1,2050 @@ +/* ========================================================= + * bootstrap-datepicker.js + * Repo: https://github.com/uxsolutions/bootstrap-datepicker/ + * Demo: https://eternicode.github.io/bootstrap-datepicker/ + * Docs: https://bootstrap-datepicker.readthedocs.org/ + * ========================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + +(function(factory){ + if (typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } else if (typeof exports === 'object') { + factory(require('jquery')); + } else { + factory(jQuery); + } +}(function($, undefined){ + function UTCDate(){ + return new Date(Date.UTC.apply(Date, arguments)); + } + function UTCToday(){ + var today = new Date(); + return UTCDate(today.getFullYear(), today.getMonth(), today.getDate()); + } + function isUTCEquals(date1, date2) { + return ( + date1.getUTCFullYear() === date2.getUTCFullYear() && + date1.getUTCMonth() === date2.getUTCMonth() && + date1.getUTCDate() === date2.getUTCDate() + ); + } + function alias(method, deprecationMsg){ + return function(){ + if (deprecationMsg !== undefined) { + $.fn.datepicker.deprecated(deprecationMsg); + } + + return this[method].apply(this, arguments); + }; + } + function isValidDate(d) { + return d && !isNaN(d.getTime()); + } + + var DateArray = (function(){ + var extras = { + get: function(i){ + return this.slice(i)[0]; + }, + contains: function(d){ + // Array.indexOf is not cross-browser; + // $.inArray doesn't work with Dates + var val = d && d.valueOf(); + for (var i=0, l=this.length; i < l; i++) + // Use date arithmetic to allow dates with different times to match + if (0 <= this[i].valueOf() - val && this[i].valueOf() - val < 1000*60*60*24) + return i; + return -1; + }, + remove: function(i){ + this.splice(i,1); + }, + replace: function(new_array){ + if (!new_array) + return; + if (!$.isArray(new_array)) + new_array = [new_array]; + this.clear(); + this.push.apply(this, new_array); + }, + clear: function(){ + this.length = 0; + }, + copy: function(){ + var a = new DateArray(); + a.replace(this); + return a; + } + }; + + return function(){ + var a = []; + a.push.apply(a, arguments); + $.extend(a, extras); + return a; + }; + })(); + + + // Picker object + + var Datepicker = function(element, options){ + $.data(element, 'datepicker', this); + + this._events = []; + this._secondaryEvents = []; + + this._process_options(options); + + this.dates = new DateArray(); + this.viewDate = this.o.defaultViewDate; + this.focusDate = null; + + this.element = $(element); + this.isInput = this.element.is('input'); + this.inputField = this.isInput ? this.element : this.element.find('input'); + this.component = this.element.hasClass('date') ? this.element.find('.add-on, .input-group-addon, .btn') : false; + if (this.component && this.component.length === 0) + this.component = false; + this.isInline = !this.component && this.element.is('div'); + + this.picker = $(DPGlobal.template); + + // Checking templates and inserting + if (this._check_template(this.o.templates.leftArrow)) { + this.picker.find('.prev').html(this.o.templates.leftArrow); + } + + if (this._check_template(this.o.templates.rightArrow)) { + this.picker.find('.next').html(this.o.templates.rightArrow); + } + + this._buildEvents(); + this._attachEvents(); + + if (this.isInline){ + this.picker.addClass('datepicker-inline').appendTo(this.element); + } + else { + this.picker.addClass('datepicker-dropdown dropdown-menu'); + } + + if (this.o.rtl){ + this.picker.addClass('datepicker-rtl'); + } + + if (this.o.calendarWeeks) { + this.picker.find('.datepicker-days .datepicker-switch, thead .datepicker-title, tfoot .today, tfoot .clear') + .attr('colspan', function(i, val){ + return Number(val) + 1; + }); + } + + this._process_options({ + startDate: this._o.startDate, + endDate: this._o.endDate, + daysOfWeekDisabled: this.o.daysOfWeekDisabled, + daysOfWeekHighlighted: this.o.daysOfWeekHighlighted, + datesDisabled: this.o.datesDisabled + }); + + this._allow_update = false; + this.setViewMode(this.o.startView); + this._allow_update = true; + + this.fillDow(); + this.fillMonths(); + + this.update(); + + if (this.isInline){ + this.show(); + } + }; + + Datepicker.prototype = { + constructor: Datepicker, + + _resolveViewName: function(view){ + $.each(DPGlobal.viewModes, function(i, viewMode){ + if (view === i || $.inArray(view, viewMode.names) !== -1){ + view = i; + return false; + } + }); + + return view; + }, + + _resolveDaysOfWeek: function(daysOfWeek){ + if (!$.isArray(daysOfWeek)) + daysOfWeek = daysOfWeek.split(/[,\s]*/); + return $.map(daysOfWeek, Number); + }, + + _check_template: function(tmp){ + try { + // If empty + if (tmp === undefined || tmp === "") { + return false; + } + // If no html, everything ok + if ((tmp.match(/[<>]/g) || []).length <= 0) { + return true; + } + // Checking if html is fine + var jDom = $(tmp); + return jDom.length > 0; + } + catch (ex) { + return false; + } + }, + + _process_options: function(opts){ + // Store raw options for reference + this._o = $.extend({}, this._o, opts); + // Processed options + var o = this.o = $.extend({}, this._o); + + // Check if "de-DE" style date is available, if not language should + // fallback to 2 letter code eg "de" + var lang = o.language; + if (!dates[lang]){ + lang = lang.split('-')[0]; + if (!dates[lang]) + lang = defaults.language; + } + o.language = lang; + + // Retrieve view index from any aliases + o.startView = this._resolveViewName(o.startView); + o.minViewMode = this._resolveViewName(o.minViewMode); + o.maxViewMode = this._resolveViewName(o.maxViewMode); + + // Check view is between min and max + o.startView = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, o.startView)); + + // true, false, or Number > 0 + if (o.multidate !== true){ + o.multidate = Number(o.multidate) || false; + if (o.multidate !== false) + o.multidate = Math.max(0, o.multidate); + } + o.multidateSeparator = String(o.multidateSeparator); + + o.weekStart %= 7; + o.weekEnd = (o.weekStart + 6) % 7; + + var format = DPGlobal.parseFormat(o.format); + if (o.startDate !== -Infinity){ + if (!!o.startDate){ + if (o.startDate instanceof Date) + o.startDate = this._local_to_utc(this._zero_time(o.startDate)); + else + o.startDate = DPGlobal.parseDate(o.startDate, format, o.language, o.assumeNearbyYear); + } + else { + o.startDate = -Infinity; + } + } + if (o.endDate !== Infinity){ + if (!!o.endDate){ + if (o.endDate instanceof Date) + o.endDate = this._local_to_utc(this._zero_time(o.endDate)); + else + o.endDate = DPGlobal.parseDate(o.endDate, format, o.language, o.assumeNearbyYear); + } + else { + o.endDate = Infinity; + } + } + + o.daysOfWeekDisabled = this._resolveDaysOfWeek(o.daysOfWeekDisabled||[]); + o.daysOfWeekHighlighted = this._resolveDaysOfWeek(o.daysOfWeekHighlighted||[]); + + o.datesDisabled = o.datesDisabled||[]; + if (!$.isArray(o.datesDisabled)) { + o.datesDisabled = o.datesDisabled.split(','); + } + o.datesDisabled = $.map(o.datesDisabled, function(d){ + return DPGlobal.parseDate(d, format, o.language, o.assumeNearbyYear); + }); + + var plc = String(o.orientation).toLowerCase().split(/\s+/g), + _plc = o.orientation.toLowerCase(); + plc = $.grep(plc, function(word){ + return /^auto|left|right|top|bottom$/.test(word); + }); + o.orientation = {x: 'auto', y: 'auto'}; + if (!_plc || _plc === 'auto') + ; // no action + else if (plc.length === 1){ + switch (plc[0]){ + case 'top': + case 'bottom': + o.orientation.y = plc[0]; + break; + case 'left': + case 'right': + o.orientation.x = plc[0]; + break; + } + } + else { + _plc = $.grep(plc, function(word){ + return /^left|right$/.test(word); + }); + o.orientation.x = _plc[0] || 'auto'; + + _plc = $.grep(plc, function(word){ + return /^top|bottom$/.test(word); + }); + o.orientation.y = _plc[0] || 'auto'; + } + if (o.defaultViewDate instanceof Date || typeof o.defaultViewDate === 'string') { + o.defaultViewDate = DPGlobal.parseDate(o.defaultViewDate, format, o.language, o.assumeNearbyYear); + } else if (o.defaultViewDate) { + var year = o.defaultViewDate.year || new Date().getFullYear(); + var month = o.defaultViewDate.month || 0; + var day = o.defaultViewDate.day || 1; + o.defaultViewDate = UTCDate(year, month, day); + } else { + o.defaultViewDate = UTCToday(); + } + }, + _applyEvents: function(evs){ + for (var i=0, el, ch, ev; i < evs.length; i++){ + el = evs[i][0]; + if (evs[i].length === 2){ + ch = undefined; + ev = evs[i][1]; + } else if (evs[i].length === 3){ + ch = evs[i][1]; + ev = evs[i][2]; + } + el.on(ev, ch); + } + }, + _unapplyEvents: function(evs){ + for (var i=0, el, ev, ch; i < evs.length; i++){ + el = evs[i][0]; + if (evs[i].length === 2){ + ch = undefined; + ev = evs[i][1]; + } else if (evs[i].length === 3){ + ch = evs[i][1]; + ev = evs[i][2]; + } + el.off(ev, ch); + } + }, + _buildEvents: function(){ + var events = { + keyup: $.proxy(function(e){ + if ($.inArray(e.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) === -1) + this.update(); + }, this), + keydown: $.proxy(this.keydown, this), + paste: $.proxy(this.paste, this) + }; + + if (this.o.showOnFocus === true) { + events.focus = $.proxy(this.show, this); + } + + if (this.isInput) { // single input + this._events = [ + [this.element, events] + ]; + } + // component: input + button + else if (this.component && this.inputField.length) { + this._events = [ + // For components that are not readonly, allow keyboard nav + [this.inputField, events], + [this.component, { + click: $.proxy(this.show, this) + }] + ]; + } + else { + this._events = [ + [this.element, { + click: $.proxy(this.show, this), + keydown: $.proxy(this.keydown, this) + }] + ]; + } + this._events.push( + // Component: listen for blur on element descendants + [this.element, '*', { + blur: $.proxy(function(e){ + this._focused_from = e.target; + }, this) + }], + // Input: listen for blur on element + [this.element, { + blur: $.proxy(function(e){ + this._focused_from = e.target; + }, this) + }] + ); + + if (this.o.immediateUpdates) { + // Trigger input updates immediately on changed year/month + this._events.push([this.element, { + 'changeYear changeMonth': $.proxy(function(e){ + this.update(e.date); + }, this) + }]); + } + + this._secondaryEvents = [ + [this.picker, { + click: $.proxy(this.click, this) + }], + [this.picker, '.prev, .next', { + click: $.proxy(this.navArrowsClick, this) + }], + [this.picker, '.day:not(.disabled)', { + click: $.proxy(this.dayCellClick, this) + }], + [$(window), { + resize: $.proxy(this.place, this) + }], + [$(document), { + 'mousedown touchstart': $.proxy(function(e){ + // Clicked outside the datepicker, hide it + if (!( + this.element.is(e.target) || + this.element.find(e.target).length || + this.picker.is(e.target) || + this.picker.find(e.target).length || + this.isInline + )){ + this.hide(); + } + }, this) + }] + ]; + }, + _attachEvents: function(){ + this._detachEvents(); + this._applyEvents(this._events); + }, + _detachEvents: function(){ + this._unapplyEvents(this._events); + }, + _attachSecondaryEvents: function(){ + this._detachSecondaryEvents(); + this._applyEvents(this._secondaryEvents); + }, + _detachSecondaryEvents: function(){ + this._unapplyEvents(this._secondaryEvents); + }, + _trigger: function(event, altdate){ + var date = altdate || this.dates.get(-1), + local_date = this._utc_to_local(date); + + this.element.trigger({ + type: event, + date: local_date, + viewMode: this.viewMode, + dates: $.map(this.dates, this._utc_to_local), + format: $.proxy(function(ix, format){ + if (arguments.length === 0){ + ix = this.dates.length - 1; + format = this.o.format; + } else if (typeof ix === 'string'){ + format = ix; + ix = this.dates.length - 1; + } + format = format || this.o.format; + var date = this.dates.get(ix); + return DPGlobal.formatDate(date, format, this.o.language); + }, this) + }); + }, + + show: function(){ + if (this.inputField.prop('disabled') || (this.inputField.prop('readonly') && this.o.enableOnReadonly === false)) + return; + if (!this.isInline) + this.picker.appendTo(this.o.container); + this.place(); + this.picker.show(); + this._attachSecondaryEvents(); + this._trigger('show'); + if ((window.navigator.msMaxTouchPoints || 'ontouchstart' in document) && this.o.disableTouchKeyboard) { + $(this.element).blur(); + } + return this; + }, + + hide: function(){ + if (this.isInline || !this.picker.is(':visible')) + return this; + this.focusDate = null; + this.picker.hide().detach(); + this._detachSecondaryEvents(); + this.setViewMode(this.o.startView); + + if (this.o.forceParse && this.inputField.val()) + this.setValue(); + this._trigger('hide'); + return this; + }, + + destroy: function(){ + this.hide(); + this._detachEvents(); + this._detachSecondaryEvents(); + this.picker.remove(); + delete this.element.data().datepicker; + if (!this.isInput){ + delete this.element.data().date; + } + return this; + }, + + paste: function(e){ + var dateString; + if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.types + && $.inArray('text/plain', e.originalEvent.clipboardData.types) !== -1) { + dateString = e.originalEvent.clipboardData.getData('text/plain'); + } else if (window.clipboardData) { + dateString = window.clipboardData.getData('Text'); + } else { + return; + } + this.setDate(dateString); + this.update(); + e.preventDefault(); + }, + + _utc_to_local: function(utc){ + if (!utc) { + return utc; + } + + var local = new Date(utc.getTime() + (utc.getTimezoneOffset() * 60000)); + + if (local.getTimezoneOffset() !== utc.getTimezoneOffset()) { + local = new Date(utc.getTime() + (local.getTimezoneOffset() * 60000)); + } + + return local; + }, + _local_to_utc: function(local){ + return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000)); + }, + _zero_time: function(local){ + return local && new Date(local.getFullYear(), local.getMonth(), local.getDate()); + }, + _zero_utc_time: function(utc){ + return utc && UTCDate(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate()); + }, + + getDates: function(){ + return $.map(this.dates, this._utc_to_local); + }, + + getUTCDates: function(){ + return $.map(this.dates, function(d){ + return new Date(d); + }); + }, + + getDate: function(){ + return this._utc_to_local(this.getUTCDate()); + }, + + getUTCDate: function(){ + var selected_date = this.dates.get(-1); + if (selected_date !== undefined) { + return new Date(selected_date); + } else { + return null; + } + }, + + clearDates: function(){ + this.inputField.val(''); + this.update(); + this._trigger('changeDate'); + + if (this.o.autoclose) { + this.hide(); + } + }, + + setDates: function(){ + var args = $.isArray(arguments[0]) ? arguments[0] : arguments; + this.update.apply(this, args); + this._trigger('changeDate'); + this.setValue(); + return this; + }, + + setUTCDates: function(){ + var args = $.isArray(arguments[0]) ? arguments[0] : arguments; + this.setDates.apply(this, $.map(args, this._utc_to_local)); + return this; + }, + + setDate: alias('setDates'), + setUTCDate: alias('setUTCDates'), + remove: alias('destroy', 'Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead'), + + setValue: function(){ + var formatted = this.getFormattedDate(); + this.inputField.val(formatted); + return this; + }, + + getFormattedDate: function(format){ + if (format === undefined) + format = this.o.format; + + var lang = this.o.language; + return $.map(this.dates, function(d){ + return DPGlobal.formatDate(d, format, lang); + }).join(this.o.multidateSeparator); + }, + + getStartDate: function(){ + return this.o.startDate; + }, + + setStartDate: function(startDate){ + this._process_options({startDate: startDate}); + this.update(); + this.updateNavArrows(); + return this; + }, + + getEndDate: function(){ + return this.o.endDate; + }, + + setEndDate: function(endDate){ + this._process_options({endDate: endDate}); + this.update(); + this.updateNavArrows(); + return this; + }, + + setDaysOfWeekDisabled: function(daysOfWeekDisabled){ + this._process_options({daysOfWeekDisabled: daysOfWeekDisabled}); + this.update(); + return this; + }, + + setDaysOfWeekHighlighted: function(daysOfWeekHighlighted){ + this._process_options({daysOfWeekHighlighted: daysOfWeekHighlighted}); + this.update(); + return this; + }, + + setDatesDisabled: function(datesDisabled){ + this._process_options({datesDisabled: datesDisabled}); + this.update(); + return this; + }, + + place: function(){ + if (this.isInline) + return this; + var calendarWidth = this.picker.outerWidth(), + calendarHeight = this.picker.outerHeight(), + visualPadding = 10, + container = $(this.o.container), + windowWidth = container.width(), + scrollTop = this.o.container === 'body' ? $(document).scrollTop() : container.scrollTop(), + appendOffset = container.offset(); + + var parentsZindex = [0]; + this.element.parents().each(function(){ + var itemZIndex = $(this).css('z-index'); + if (itemZIndex !== 'auto' && Number(itemZIndex) !== 0) parentsZindex.push(Number(itemZIndex)); + }); + var zIndex = Math.max.apply(Math, parentsZindex) + this.o.zIndexOffset; + var offset = this.component ? this.component.parent().offset() : this.element.offset(); + var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false); + var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false); + var left = offset.left - appendOffset.left; + var top = offset.top - appendOffset.top; + + if (this.o.container !== 'body') { + top += scrollTop; + } + + this.picker.removeClass( + 'datepicker-orient-top datepicker-orient-bottom '+ + 'datepicker-orient-right datepicker-orient-left' + ); + + if (this.o.orientation.x !== 'auto'){ + this.picker.addClass('datepicker-orient-' + this.o.orientation.x); + if (this.o.orientation.x === 'right') + left -= calendarWidth - width; + } + // auto x orientation is best-placement: if it crosses a window + // edge, fudge it sideways + else { + if (offset.left < 0) { + // component is outside the window on the left side. Move it into visible range + this.picker.addClass('datepicker-orient-left'); + left -= offset.left - visualPadding; + } else if (left + calendarWidth > windowWidth) { + // the calendar passes the widow right edge. Align it to component right side + this.picker.addClass('datepicker-orient-right'); + left += width - calendarWidth; + } else { + if (this.o.rtl) { + // Default to right + this.picker.addClass('datepicker-orient-right'); + } else { + // Default to left + this.picker.addClass('datepicker-orient-left'); + } + } + } + + // auto y orientation is best-situation: top or bottom, no fudging, + // decision based on which shows more of the calendar + var yorient = this.o.orientation.y, + top_overflow; + if (yorient === 'auto'){ + top_overflow = -scrollTop + top - calendarHeight; + yorient = top_overflow < 0 ? 'bottom' : 'top'; + } + + this.picker.addClass('datepicker-orient-' + yorient); + if (yorient === 'top') + top -= calendarHeight + parseInt(this.picker.css('padding-top')); + else + top += height; + + if (this.o.rtl) { + var right = windowWidth - (left + width); + this.picker.css({ + top: top, + right: right, + zIndex: zIndex + }); + } else { + this.picker.css({ + top: top, + left: left, + zIndex: zIndex + }); + } + return this; + }, + + _allow_update: true, + update: function(){ + if (!this._allow_update) + return this; + + var oldDates = this.dates.copy(), + dates = [], + fromArgs = false; + if (arguments.length){ + $.each(arguments, $.proxy(function(i, date){ + if (date instanceof Date) + date = this._local_to_utc(date); + dates.push(date); + }, this)); + fromArgs = true; + } else { + dates = this.isInput + ? this.element.val() + : this.element.data('date') || this.inputField.val(); + if (dates && this.o.multidate) + dates = dates.split(this.o.multidateSeparator); + else + dates = [dates]; + delete this.element.data().date; + } + + dates = $.map(dates, $.proxy(function(date){ + return DPGlobal.parseDate(date, this.o.format, this.o.language, this.o.assumeNearbyYear); + }, this)); + dates = $.grep(dates, $.proxy(function(date){ + return ( + !this.dateWithinRange(date) || + !date + ); + }, this), true); + this.dates.replace(dates); + + if (this.o.updateViewDate) { + if (this.dates.length) + this.viewDate = new Date(this.dates.get(-1)); + else if (this.viewDate < this.o.startDate) + this.viewDate = new Date(this.o.startDate); + else if (this.viewDate > this.o.endDate) + this.viewDate = new Date(this.o.endDate); + else + this.viewDate = this.o.defaultViewDate; + } + + if (fromArgs){ + // setting date by clicking + this.setValue(); + this.element.change(); + } + else if (this.dates.length){ + // setting date by typing + if (String(oldDates) !== String(this.dates) && fromArgs) { + this._trigger('changeDate'); + this.element.change(); + } + } + if (!this.dates.length && oldDates.length) { + this._trigger('clearDate'); + this.element.change(); + } + + this.fill(); + return this; + }, + + fillDow: function(){ + if (this.o.showWeekDays) { + var dowCnt = this.o.weekStart, + html = ''; + if (this.o.calendarWeeks){ + html += ' '; + } + while (dowCnt < this.o.weekStart + 7){ + html += ''+dates[this.o.language].daysMin[(dowCnt++)%7]+''; + } + html += ''; + this.picker.find('.datepicker-days thead').append(html); + } + }, + + fillMonths: function(){ + var localDate = this._utc_to_local(this.viewDate); + var html = ''; + var focused; + for (var i = 0; i < 12; i++){ + focused = localDate && localDate.getMonth() === i ? ' focused' : ''; + html += '' + dates[this.o.language].monthsShort[i] + ''; + } + this.picker.find('.datepicker-months td').html(html); + }, + + setRange: function(range){ + if (!range || !range.length) + delete this.range; + else + this.range = $.map(range, function(d){ + return d.valueOf(); + }); + this.fill(); + }, + + getClassNames: function(date){ + var cls = [], + year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + today = UTCToday(); + if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){ + cls.push('old'); + } else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){ + cls.push('new'); + } + if (this.focusDate && date.valueOf() === this.focusDate.valueOf()) + cls.push('focused'); + // Compare internal UTC date with UTC today, not local today + if (this.o.todayHighlight && isUTCEquals(date, today)) { + cls.push('today'); + } + if (this.dates.contains(date) !== -1) + cls.push('active'); + if (!this.dateWithinRange(date)){ + cls.push('disabled'); + } + if (this.dateIsDisabled(date)){ + cls.push('disabled', 'disabled-date'); + } + if ($.inArray(date.getUTCDay(), this.o.daysOfWeekHighlighted) !== -1){ + cls.push('highlighted'); + } + + if (this.range){ + if (date > this.range[0] && date < this.range[this.range.length-1]){ + cls.push('range'); + } + if ($.inArray(date.valueOf(), this.range) !== -1){ + cls.push('selected'); + } + if (date.valueOf() === this.range[0]){ + cls.push('range-start'); + } + if (date.valueOf() === this.range[this.range.length-1]){ + cls.push('range-end'); + } + } + return cls; + }, + + _fill_yearsView: function(selector, cssClass, factor, year, startYear, endYear, beforeFn){ + var html = ''; + var step = factor / 10; + var view = this.picker.find(selector); + var startVal = Math.floor(year / factor) * factor; + var endVal = startVal + step * 9; + var focusedVal = Math.floor(this.viewDate.getFullYear() / step) * step; + var selected = $.map(this.dates, function(d){ + return Math.floor(d.getUTCFullYear() / step) * step; + }); + + var classes, tooltip, before; + for (var currVal = startVal - step; currVal <= endVal + step; currVal += step) { + classes = [cssClass]; + tooltip = null; + + if (currVal === startVal - step) { + classes.push('old'); + } else if (currVal === endVal + step) { + classes.push('new'); + } + if ($.inArray(currVal, selected) !== -1) { + classes.push('active'); + } + if (currVal < startYear || currVal > endYear) { + classes.push('disabled'); + } + if (currVal === focusedVal) { + classes.push('focused'); + } + + if (beforeFn !== $.noop) { + before = beforeFn(new Date(currVal, 0, 1)); + if (before === undefined) { + before = {}; + } else if (typeof before === 'boolean') { + before = {enabled: before}; + } else if (typeof before === 'string') { + before = {classes: before}; + } + if (before.enabled === false) { + classes.push('disabled'); + } + if (before.classes) { + classes = classes.concat(before.classes.split(/\s+/)); + } + if (before.tooltip) { + tooltip = before.tooltip; + } + } + + html += '' + currVal + ''; + } + + view.find('.datepicker-switch').text(startVal + '-' + endVal); + view.find('td').html(html); + }, + + fill: function(){ + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity, + startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity, + endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity, + endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity, + todaytxt = dates[this.o.language].today || dates['en'].today || '', + cleartxt = dates[this.o.language].clear || dates['en'].clear || '', + titleFormat = dates[this.o.language].titleFormat || dates['en'].titleFormat, + tooltip, + before; + if (isNaN(year) || isNaN(month)) + return; + this.picker.find('.datepicker-days .datepicker-switch') + .text(DPGlobal.formatDate(d, titleFormat, this.o.language)); + this.picker.find('tfoot .today') + .text(todaytxt) + .css('display', this.o.todayBtn === true || this.o.todayBtn === 'linked' ? 'table-cell' : 'none'); + this.picker.find('tfoot .clear') + .text(cleartxt) + .css('display', this.o.clearBtn === true ? 'table-cell' : 'none'); + this.picker.find('thead .datepicker-title') + .text(this.o.title) + .css('display', typeof this.o.title === 'string' && this.o.title !== '' ? 'table-cell' : 'none'); + this.updateNavArrows(); + this.fillMonths(); + var prevMonth = UTCDate(year, month, 0), + day = prevMonth.getUTCDate(); + prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7); + var nextMonth = new Date(prevMonth); + if (prevMonth.getUTCFullYear() < 100){ + nextMonth.setUTCFullYear(prevMonth.getUTCFullYear()); + } + nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); + nextMonth = nextMonth.valueOf(); + var html = []; + var weekDay, clsName; + while (prevMonth.valueOf() < nextMonth){ + weekDay = prevMonth.getUTCDay(); + if (weekDay === this.o.weekStart){ + html.push(''); + if (this.o.calendarWeeks){ + // ISO 8601: First week contains first thursday. + // ISO also states week starts on Monday, but we can be more abstract here. + var + // Start of current week: based on weekstart/current date + ws = new Date(+prevMonth + (this.o.weekStart - weekDay - 7) % 7 * 864e5), + // Thursday of this week + th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5), + // First Thursday of year, year from thursday + yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay()) % 7 * 864e5), + // Calendar week: ms between thursdays, div ms per day, div 7 days + calWeek = (th - yth) / 864e5 / 7 + 1; + html.push(''+ calWeek +''); + } + } + clsName = this.getClassNames(prevMonth); + clsName.push('day'); + + var content = prevMonth.getUTCDate(); + + if (this.o.beforeShowDay !== $.noop){ + before = this.o.beforeShowDay(this._utc_to_local(prevMonth)); + if (before === undefined) + before = {}; + else if (typeof before === 'boolean') + before = {enabled: before}; + else if (typeof before === 'string') + before = {classes: before}; + if (before.enabled === false) + clsName.push('disabled'); + if (before.classes) + clsName = clsName.concat(before.classes.split(/\s+/)); + if (before.tooltip) + tooltip = before.tooltip; + if (before.content) + content = before.content; + } + + //Check if uniqueSort exists (supported by jquery >=1.12 and >=2.2) + //Fallback to unique function for older jquery versions + if ($.isFunction($.uniqueSort)) { + clsName = $.uniqueSort(clsName); + } else { + clsName = $.unique(clsName); + } + + html.push('' + content + ''); + tooltip = null; + if (weekDay === this.o.weekEnd){ + html.push(''); + } + prevMonth.setUTCDate(prevMonth.getUTCDate() + 1); + } + this.picker.find('.datepicker-days tbody').html(html.join('')); + + var monthsTitle = dates[this.o.language].monthsTitle || dates['en'].monthsTitle || 'Months'; + var months = this.picker.find('.datepicker-months') + .find('.datepicker-switch') + .text(this.o.maxViewMode < 2 ? monthsTitle : year) + .end() + .find('tbody span').removeClass('active'); + + $.each(this.dates, function(i, d){ + if (d.getUTCFullYear() === year) + months.eq(d.getUTCMonth()).addClass('active'); + }); + + if (year < startYear || year > endYear){ + months.addClass('disabled'); + } + if (year === startYear){ + months.slice(0, startMonth).addClass('disabled'); + } + if (year === endYear){ + months.slice(endMonth+1).addClass('disabled'); + } + + if (this.o.beforeShowMonth !== $.noop){ + var that = this; + $.each(months, function(i, month){ + var moDate = new Date(year, i, 1); + var before = that.o.beforeShowMonth(moDate); + if (before === undefined) + before = {}; + else if (typeof before === 'boolean') + before = {enabled: before}; + else if (typeof before === 'string') + before = {classes: before}; + if (before.enabled === false && !$(month).hasClass('disabled')) + $(month).addClass('disabled'); + if (before.classes) + $(month).addClass(before.classes); + if (before.tooltip) + $(month).prop('title', before.tooltip); + }); + } + + // Generating decade/years picker + this._fill_yearsView( + '.datepicker-years', + 'year', + 10, + year, + startYear, + endYear, + this.o.beforeShowYear + ); + + // Generating century/decades picker + this._fill_yearsView( + '.datepicker-decades', + 'decade', + 100, + year, + startYear, + endYear, + this.o.beforeShowDecade + ); + + // Generating millennium/centuries picker + this._fill_yearsView( + '.datepicker-centuries', + 'century', + 1000, + year, + startYear, + endYear, + this.o.beforeShowCentury + ); + }, + + updateNavArrows: function(){ + if (!this._allow_update) + return; + + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity, + startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity, + endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity, + endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity, + prevIsDisabled, + nextIsDisabled, + factor = 1; + switch (this.viewMode){ + case 4: + factor *= 10; + /* falls through */ + case 3: + factor *= 10; + /* falls through */ + case 2: + factor *= 10; + /* falls through */ + case 1: + prevIsDisabled = Math.floor(year / factor) * factor <= startYear; + nextIsDisabled = Math.floor(year / factor) * factor + factor > endYear; + break; + case 0: + prevIsDisabled = year <= startYear && month <= startMonth; + nextIsDisabled = year >= endYear && month >= endMonth; + break; + } + + this.picker.find('.prev').toggleClass('disabled', prevIsDisabled); + this.picker.find('.next').toggleClass('disabled', nextIsDisabled); + }, + + click: function(e){ + e.preventDefault(); + e.stopPropagation(); + + var target, dir, day, year, month; + target = $(e.target); + + // Clicked on the switch + if (target.hasClass('datepicker-switch') && this.viewMode !== this.o.maxViewMode){ + this.setViewMode(this.viewMode + 1); + } + + // Clicked on today button + if (target.hasClass('today') && !target.hasClass('day')){ + this.setViewMode(0); + this._setDate(UTCToday(), this.o.todayBtn === 'linked' ? null : 'view'); + } + + // Clicked on clear button + if (target.hasClass('clear')){ + this.clearDates(); + } + + if (!target.hasClass('disabled')){ + // Clicked on a month, year, decade, century + if (target.hasClass('month') + || target.hasClass('year') + || target.hasClass('decade') + || target.hasClass('century')) { + this.viewDate.setUTCDate(1); + + day = 1; + if (this.viewMode === 1){ + month = target.parent().find('span').index(target); + year = this.viewDate.getUTCFullYear(); + this.viewDate.setUTCMonth(month); + } else { + month = 0; + year = Number(target.text()); + this.viewDate.setUTCFullYear(year); + } + + this._trigger(DPGlobal.viewModes[this.viewMode - 1].e, this.viewDate); + + if (this.viewMode === this.o.minViewMode){ + this._setDate(UTCDate(year, month, day)); + } else { + this.setViewMode(this.viewMode - 1); + this.fill(); + } + } + } + + if (this.picker.is(':visible') && this._focused_from){ + this._focused_from.focus(); + } + delete this._focused_from; + }, + + dayCellClick: function(e){ + var $target = $(e.currentTarget); + var timestamp = $target.data('date'); + var date = new Date(timestamp); + + if (this.o.updateViewDate) { + if (date.getUTCFullYear() !== this.viewDate.getUTCFullYear()) { + this._trigger('changeYear', this.viewDate); + } + + if (date.getUTCMonth() !== this.viewDate.getUTCMonth()) { + this._trigger('changeMonth', this.viewDate); + } + } + this._setDate(date); + }, + + // Clicked on prev or next + navArrowsClick: function(e){ + var $target = $(e.currentTarget); + var dir = $target.hasClass('prev') ? -1 : 1; + if (this.viewMode !== 0){ + dir *= DPGlobal.viewModes[this.viewMode].navStep * 12; + } + this.viewDate = this.moveMonth(this.viewDate, dir); + this._trigger(DPGlobal.viewModes[this.viewMode].e, this.viewDate); + this.fill(); + }, + + _toggle_multidate: function(date){ + var ix = this.dates.contains(date); + if (!date){ + this.dates.clear(); + } + + if (ix !== -1){ + if (this.o.multidate === true || this.o.multidate > 1 || this.o.toggleActive){ + this.dates.remove(ix); + } + } else if (this.o.multidate === false) { + this.dates.clear(); + this.dates.push(date); + } + else { + this.dates.push(date); + } + + if (typeof this.o.multidate === 'number') + while (this.dates.length > this.o.multidate) + this.dates.remove(0); + }, + + _setDate: function(date, which){ + if (!which || which === 'date') + this._toggle_multidate(date && new Date(date)); + if ((!which && this.o.updateViewDate) || which === 'view') + this.viewDate = date && new Date(date); + + this.fill(); + this.setValue(); + if (!which || which !== 'view') { + this._trigger('changeDate'); + } + this.inputField.trigger('change'); + if (this.o.autoclose && (!which || which === 'date')){ + this.hide(); + } + }, + + moveDay: function(date, dir){ + var newDate = new Date(date); + newDate.setUTCDate(date.getUTCDate() + dir); + + return newDate; + }, + + moveWeek: function(date, dir){ + return this.moveDay(date, dir * 7); + }, + + moveMonth: function(date, dir){ + if (!isValidDate(date)) + return this.o.defaultViewDate; + if (!dir) + return date; + var new_date = new Date(date.valueOf()), + day = new_date.getUTCDate(), + month = new_date.getUTCMonth(), + mag = Math.abs(dir), + new_month, test; + dir = dir > 0 ? 1 : -1; + if (mag === 1){ + test = dir === -1 + // If going back one month, make sure month is not current month + // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02) + ? function(){ + return new_date.getUTCMonth() === month; + } + // If going forward one month, make sure month is as expected + // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02) + : function(){ + return new_date.getUTCMonth() !== new_month; + }; + new_month = month + dir; + new_date.setUTCMonth(new_month); + // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 + new_month = (new_month + 12) % 12; + } + else { + // For magnitudes >1, move one month at a time... + for (var i=0; i < mag; i++) + // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)... + new_date = this.moveMonth(new_date, dir); + // ...then reset the day, keeping it in the new month + new_month = new_date.getUTCMonth(); + new_date.setUTCDate(day); + test = function(){ + return new_month !== new_date.getUTCMonth(); + }; + } + // Common date-resetting loop -- if date is beyond end of month, make it + // end of month + while (test()){ + new_date.setUTCDate(--day); + new_date.setUTCMonth(new_month); + } + return new_date; + }, + + moveYear: function(date, dir){ + return this.moveMonth(date, dir*12); + }, + + moveAvailableDate: function(date, dir, fn){ + do { + date = this[fn](date, dir); + + if (!this.dateWithinRange(date)) + return false; + + fn = 'moveDay'; + } + while (this.dateIsDisabled(date)); + + return date; + }, + + weekOfDateIsDisabled: function(date){ + return $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1; + }, + + dateIsDisabled: function(date){ + return ( + this.weekOfDateIsDisabled(date) || + $.grep(this.o.datesDisabled, function(d){ + return isUTCEquals(date, d); + }).length > 0 + ); + }, + + dateWithinRange: function(date){ + return date >= this.o.startDate && date <= this.o.endDate; + }, + + keydown: function(e){ + if (!this.picker.is(':visible')){ + if (e.keyCode === 40 || e.keyCode === 27) { // allow down to re-show picker + this.show(); + e.stopPropagation(); + } + return; + } + var dateChanged = false, + dir, newViewDate, + focusDate = this.focusDate || this.viewDate; + switch (e.keyCode){ + case 27: // escape + if (this.focusDate){ + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.fill(); + } + else + this.hide(); + e.preventDefault(); + e.stopPropagation(); + break; + case 37: // left + case 38: // up + case 39: // right + case 40: // down + if (!this.o.keyboardNavigation || this.o.daysOfWeekDisabled.length === 7) + break; + dir = e.keyCode === 37 || e.keyCode === 38 ? -1 : 1; + if (this.viewMode === 0) { + if (e.ctrlKey){ + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear'); + + if (newViewDate) + this._trigger('changeYear', this.viewDate); + } else if (e.shiftKey){ + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth'); + + if (newViewDate) + this._trigger('changeMonth', this.viewDate); + } else if (e.keyCode === 37 || e.keyCode === 39){ + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveDay'); + } else if (!this.weekOfDateIsDisabled(focusDate)){ + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveWeek'); + } + } else if (this.viewMode === 1) { + if (e.keyCode === 38 || e.keyCode === 40) { + dir = dir * 4; + } + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth'); + } else if (this.viewMode === 2) { + if (e.keyCode === 38 || e.keyCode === 40) { + dir = dir * 4; + } + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear'); + } + if (newViewDate){ + this.focusDate = this.viewDate = newViewDate; + this.setValue(); + this.fill(); + e.preventDefault(); + } + break; + case 13: // enter + if (!this.o.forceParse) + break; + focusDate = this.focusDate || this.dates.get(-1) || this.viewDate; + if (this.o.keyboardNavigation) { + this._toggle_multidate(focusDate); + dateChanged = true; + } + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.setValue(); + this.fill(); + if (this.picker.is(':visible')){ + e.preventDefault(); + e.stopPropagation(); + if (this.o.autoclose) + this.hide(); + } + break; + case 9: // tab + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.fill(); + this.hide(); + break; + } + if (dateChanged){ + if (this.dates.length) + this._trigger('changeDate'); + else + this._trigger('clearDate'); + this.inputField.trigger('change'); + } + }, + + setViewMode: function(viewMode){ + this.viewMode = viewMode; + this.picker + .children('div') + .hide() + .filter('.datepicker-' + DPGlobal.viewModes[this.viewMode].clsName) + .show(); + this.updateNavArrows(); + this._trigger('changeViewMode', new Date(this.viewDate)); + } + }; + + var DateRangePicker = function(element, options){ + $.data(element, 'datepicker', this); + this.element = $(element); + this.inputs = $.map(options.inputs, function(i){ + return i.jquery ? i[0] : i; + }); + delete options.inputs; + + this.keepEmptyValues = options.keepEmptyValues; + delete options.keepEmptyValues; + + datepickerPlugin.call($(this.inputs), options) + .on('changeDate', $.proxy(this.dateUpdated, this)); + + this.pickers = $.map(this.inputs, function(i){ + return $.data(i, 'datepicker'); + }); + this.updateDates(); + }; + DateRangePicker.prototype = { + updateDates: function(){ + this.dates = $.map(this.pickers, function(i){ + return i.getUTCDate(); + }); + this.updateRanges(); + }, + updateRanges: function(){ + var range = $.map(this.dates, function(d){ + return d.valueOf(); + }); + $.each(this.pickers, function(i, p){ + p.setRange(range); + }); + }, + clearDates: function(){ + $.each(this.pickers, function(i, p){ + p.clearDates(); + }); + }, + dateUpdated: function(e){ + // `this.updating` is a workaround for preventing infinite recursion + // between `changeDate` triggering and `setUTCDate` calling. Until + // there is a better mechanism. + if (this.updating) + return; + this.updating = true; + + var dp = $.data(e.target, 'datepicker'); + + if (dp === undefined) { + return; + } + + var new_date = dp.getUTCDate(), + keep_empty_values = this.keepEmptyValues, + i = $.inArray(e.target, this.inputs), + j = i - 1, + k = i + 1, + l = this.inputs.length; + if (i === -1) + return; + + $.each(this.pickers, function(i, p){ + if (!p.getUTCDate() && (p === dp || !keep_empty_values)) + p.setUTCDate(new_date); + }); + + if (new_date < this.dates[j]){ + // Date being moved earlier/left + while (j >= 0 && new_date < this.dates[j]){ + this.pickers[j--].setUTCDate(new_date); + } + } else if (new_date > this.dates[k]){ + // Date being moved later/right + while (k < l && new_date > this.dates[k]){ + this.pickers[k++].setUTCDate(new_date); + } + } + this.updateDates(); + + delete this.updating; + }, + destroy: function(){ + $.map(this.pickers, function(p){ p.destroy(); }); + $(this.inputs).off('changeDate', this.dateUpdated); + delete this.element.data().datepicker; + }, + remove: alias('destroy', 'Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead') + }; + + function opts_from_el(el, prefix){ + // Derive options from element data-attrs + var data = $(el).data(), + out = {}, inkey, + replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])'); + prefix = new RegExp('^' + prefix.toLowerCase()); + function re_lower(_,a){ + return a.toLowerCase(); + } + for (var key in data) + if (prefix.test(key)){ + inkey = key.replace(replace, re_lower); + out[inkey] = data[key]; + } + return out; + } + + function opts_from_locale(lang){ + // Derive options from locale plugins + var out = {}; + // Check if "de-DE" style date is available, if not language should + // fallback to 2 letter code eg "de" + if (!dates[lang]){ + lang = lang.split('-')[0]; + if (!dates[lang]) + return; + } + var d = dates[lang]; + $.each(locale_opts, function(i,k){ + if (k in d) + out[k] = d[k]; + }); + return out; + } + + var old = $.fn.datepicker; + var datepickerPlugin = function(option){ + var args = Array.apply(null, arguments); + args.shift(); + var internal_return; + this.each(function(){ + var $this = $(this), + data = $this.data('datepicker'), + options = typeof option === 'object' && option; + if (!data){ + var elopts = opts_from_el(this, 'date'), + // Preliminary otions + xopts = $.extend({}, defaults, elopts, options), + locopts = opts_from_locale(xopts.language), + // Options priority: js args, data-attrs, locales, defaults + opts = $.extend({}, defaults, locopts, elopts, options); + if ($this.hasClass('input-daterange') || opts.inputs){ + $.extend(opts, { + inputs: opts.inputs || $this.find('input').toArray() + }); + data = new DateRangePicker(this, opts); + } + else { + data = new Datepicker(this, opts); + } + $this.data('datepicker', data); + } + if (typeof option === 'string' && typeof data[option] === 'function'){ + internal_return = data[option].apply(data, args); + } + }); + + if ( + internal_return === undefined || + internal_return instanceof Datepicker || + internal_return instanceof DateRangePicker + ) + return this; + + if (this.length > 1) + throw new Error('Using only allowed for the collection of a single element (' + option + ' function)'); + else + return internal_return; + }; + $.fn.datepicker = datepickerPlugin; + + var defaults = $.fn.datepicker.defaults = { + assumeNearbyYear: false, + autoclose: false, + beforeShowDay: $.noop, + beforeShowMonth: $.noop, + beforeShowYear: $.noop, + beforeShowDecade: $.noop, + beforeShowCentury: $.noop, + calendarWeeks: false, + clearBtn: false, + toggleActive: false, + daysOfWeekDisabled: [], + daysOfWeekHighlighted: [], + datesDisabled: [], + endDate: Infinity, + forceParse: true, + format: 'mm/dd/yyyy', + keepEmptyValues: false, + keyboardNavigation: true, + language: 'en', + minViewMode: 0, + maxViewMode: 4, + multidate: false, + multidateSeparator: ',', + orientation: "auto", + rtl: false, + startDate: -Infinity, + startView: 0, + todayBtn: false, + todayHighlight: false, + updateViewDate: true, + weekStart: 0, + disableTouchKeyboard: false, + enableOnReadonly: true, + showOnFocus: true, + zIndexOffset: 10, + container: 'body', + immediateUpdates: false, + title: '', + templates: { + leftArrow: '«', + rightArrow: '»' + }, + showWeekDays: true + }; + var locale_opts = $.fn.datepicker.locale_opts = [ + 'format', + 'rtl', + 'weekStart' + ]; + $.fn.datepicker.Constructor = Datepicker; + var dates = $.fn.datepicker.dates = { + en: { + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + today: "Today", + clear: "Clear", + titleFormat: "MM yyyy" + } + }; + + var DPGlobal = { + viewModes: [ + { + names: ['days', 'month'], + clsName: 'days', + e: 'changeMonth' + }, + { + names: ['months', 'year'], + clsName: 'months', + e: 'changeYear', + navStep: 1 + }, + { + names: ['years', 'decade'], + clsName: 'years', + e: 'changeDecade', + navStep: 10 + }, + { + names: ['decades', 'century'], + clsName: 'decades', + e: 'changeCentury', + navStep: 100 + }, + { + names: ['centuries', 'millennium'], + clsName: 'centuries', + e: 'changeMillennium', + navStep: 1000 + } + ], + validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g, + nonpunctuation: /[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g, + parseFormat: function(format){ + if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function') + return format; + // IE treats \0 as a string end in inputs (truncating the value), + // so it's a bad format delimiter, anyway + var separators = format.replace(this.validParts, '\0').split('\0'), + parts = format.match(this.validParts); + if (!separators || !separators.length || !parts || parts.length === 0){ + throw new Error("Invalid date format."); + } + return {separators: separators, parts: parts}; + }, + parseDate: function(date, format, language, assumeNearby){ + if (!date) + return undefined; + if (date instanceof Date) + return date; + if (typeof format === 'string') + format = DPGlobal.parseFormat(format); + if (format.toValue) + return format.toValue(date, format, language); + var fn_map = { + d: 'moveDay', + m: 'moveMonth', + w: 'moveWeek', + y: 'moveYear' + }, + dateAliases = { + yesterday: '-1d', + today: '+0d', + tomorrow: '+1d' + }, + parts, part, dir, i, fn; + if (date in dateAliases){ + date = dateAliases[date]; + } + if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/i.test(date)){ + parts = date.match(/([\-+]\d+)([dmwy])/gi); + date = new Date(); + for (i=0; i < parts.length; i++){ + part = parts[i].match(/([\-+]\d+)([dmwy])/i); + dir = Number(part[1]); + fn = fn_map[part[2].toLowerCase()]; + date = Datepicker.prototype[fn](date, dir); + } + return Datepicker.prototype._zero_utc_time(date); + } + + parts = date && date.match(this.nonpunctuation) || []; + + function applyNearbyYear(year, threshold){ + if (threshold === true) + threshold = 10; + + // if year is 2 digits or less, than the user most likely is trying to get a recent century + if (year < 100){ + year += 2000; + // if the new year is more than threshold years in advance, use last century + if (year > ((new Date()).getFullYear()+threshold)){ + year -= 100; + } + } + + return year; + } + + var parsed = {}, + setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'], + setters_map = { + yyyy: function(d,v){ + return d.setUTCFullYear(assumeNearby ? applyNearbyYear(v, assumeNearby) : v); + }, + m: function(d,v){ + if (isNaN(d)) + return d; + v -= 1; + while (v < 0) v += 12; + v %= 12; + d.setUTCMonth(v); + while (d.getUTCMonth() !== v) + d.setUTCDate(d.getUTCDate()-1); + return d; + }, + d: function(d,v){ + return d.setUTCDate(v); + } + }, + val, filtered; + setters_map['yy'] = setters_map['yyyy']; + setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m']; + setters_map['dd'] = setters_map['d']; + date = UTCToday(); + var fparts = format.parts.slice(); + // Remove noop parts + if (parts.length !== fparts.length){ + fparts = $(fparts).filter(function(i,p){ + return $.inArray(p, setters_order) !== -1; + }).toArray(); + } + // Process remainder + function match_part(){ + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m.toLowerCase() === p.toLowerCase(); + } + if (parts.length === fparts.length){ + var cnt; + for (i=0, cnt = fparts.length; i < cnt; i++){ + val = parseInt(parts[i], 10); + part = fparts[i]; + if (isNaN(val)){ + switch (part){ + case 'MM': + filtered = $(dates[language].months).filter(match_part); + val = $.inArray(filtered[0], dates[language].months) + 1; + break; + case 'M': + filtered = $(dates[language].monthsShort).filter(match_part); + val = $.inArray(filtered[0], dates[language].monthsShort) + 1; + break; + } + } + parsed[part] = val; + } + var _date, s; + for (i=0; i < setters_order.length; i++){ + s = setters_order[i]; + if (s in parsed && !isNaN(parsed[s])){ + _date = new Date(date); + setters_map[s](_date, parsed[s]); + if (!isNaN(_date)) + date = _date; + } + } + } + return date; + }, + formatDate: function(date, format, language){ + if (!date) + return ''; + if (typeof format === 'string') + format = DPGlobal.parseFormat(format); + if (format.toDisplay) + return format.toDisplay(date, format, language); + var val = { + d: date.getUTCDate(), + D: dates[language].daysShort[date.getUTCDay()], + DD: dates[language].days[date.getUTCDay()], + m: date.getUTCMonth() + 1, + M: dates[language].monthsShort[date.getUTCMonth()], + MM: dates[language].months[date.getUTCMonth()], + yy: date.getUTCFullYear().toString().substring(2), + yyyy: date.getUTCFullYear() + }; + val.dd = (val.d < 10 ? '0' : '') + val.d; + val.mm = (val.m < 10 ? '0' : '') + val.m; + date = []; + var seps = $.extend([], format.separators); + for (var i=0, cnt = format.parts.length; i <= cnt; i++){ + if (seps.length) + date.push(seps.shift()); + date.push(val[format.parts[i]]); + } + return date.join(''); + }, + headTemplate: ''+ + ''+ + ''+ + ''+ + ''+ + ''+defaults.templates.leftArrow+''+ + ''+ + ''+defaults.templates.rightArrow+''+ + ''+ + '', + contTemplate: '', + footTemplate: ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + '' + }; + DPGlobal.template = '
'+ + '
'+ + ''+ + DPGlobal.headTemplate+ + ''+ + DPGlobal.footTemplate+ + '
'+ + '
'+ + '
'+ + ''+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '
'+ + '
'+ + '
'+ + ''+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '
'+ + '
'+ + '
'+ + ''+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '
'+ + '
'+ + '
'+ + ''+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '
'+ + '
'+ + '
'; + + $.fn.datepicker.DPGlobal = DPGlobal; + + + /* DATEPICKER NO CONFLICT + * =================== */ + + $.fn.datepicker.noConflict = function(){ + $.fn.datepicker = old; + return this; + }; + + /* DATEPICKER VERSION + * =================== */ + $.fn.datepicker.version = '1.8.0'; + + $.fn.datepicker.deprecated = function(msg){ + var console = window.console; + if (console && console.warn) { + console.warn('DEPRECATED: ' + msg); + } + }; + + + /* DATEPICKER DATA-API + * ================== */ + + $(document).on( + 'focus.datepicker.data-api click.datepicker.data-api', + '[data-provide="datepicker"]', + function(e){ + var $this = $(this); + if ($this.data('datepicker')) + return; + e.preventDefault(); + // component click requires us to explicitly show it + datepickerPlugin.call($this, 'show'); + } + ); + $(function(){ + datepickerPlugin.call($('[data-provide="datepicker-inline"]')); + }); + +})); diff --git a/admin/src/main/webapp/js/bootstrap-datetimepicker/bootstrap-datepicker.zh-CN.js b/admin/src/main/webapp/js/bootstrap-datetimepicker/bootstrap-datepicker.zh-CN.js new file mode 100755 index 0000000..67726c2 --- /dev/null +++ b/admin/src/main/webapp/js/bootstrap-datetimepicker/bootstrap-datepicker.zh-CN.js @@ -0,0 +1,19 @@ +/** + * Simplified Chinese translation for bootstrap-datepicker + * Yuan Cheung + */ +;(function($){ + $.fn.datepicker.dates['zh-CN'] = { + days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], + daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], + daysMin: ["日", "一", "二", "三", "四", "五", "六"], + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], + today: "今天", + monthsTitle: "选择月份", + clear: "清除", + format: "yyyy-mm-dd", + titleFormat: "yyyy年mm月", + weekStart: 1 + }; +}(jQuery)); diff --git a/admin/src/main/webapp/js/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js b/admin/src/main/webapp/js/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js new file mode 100755 index 0000000..eba15ce --- /dev/null +++ b/admin/src/main/webapp/js/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js @@ -0,0 +1 @@ +(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{if(typeof exports==="object"){a(require("jquery"))}else{a(jQuery)}}}(function(d,f){if(!("indexOf" in Array.prototype)){Array.prototype.indexOf=function(k,j){if(j===f){j=0}if(j<0){j+=this.length}if(j<0){j=0}for(var l=this.length;jthis.endDate){o.push("disabled")}else{if(Math.floor(this.date.getUTCMinutes()/this.minuteStep)===Math.floor(n.getUTCMinutes()/this.minuteStep)){o.push("active")}}return o.concat((p?p:[]))};this.onRenderYear=function(o){var q=(j.onRenderYear||function(){return[]})(o);var p=["year"];if(typeof q==="string"){q=[q]}if(this.date.getUTCFullYear()===o.getUTCFullYear()){p.push("active")}var n=o.getUTCFullYear();var r=this.endDate.getUTCFullYear();if(or){p.push("disabled")}return p.concat((q?q:[]))};this.onRenderMonth=function(n){var p=(j.onRenderMonth||function(){return[]})(n);var o=["month"];if(typeof p==="string"){p=[p]}return o.concat((p?p:[]))};this.startDate=new Date(-8639968443048000);this.endDate=new Date(8639968443048000);this.datesDisabled=[];this.daysOfWeekDisabled=[];this.setStartDate(j.startDate||this.element.data("date-startdate"));this.setEndDate(j.endDate||this.element.data("date-enddate"));this.setDatesDisabled(j.datesDisabled||this.element.data("date-dates-disabled"));this.setDaysOfWeekDisabled(j.daysOfWeekDisabled||this.element.data("date-days-of-week-disabled"));this.setMinutesDisabled(j.minutesDisabled||this.element.data("date-minute-disabled"));this.setHoursDisabled(j.hoursDisabled||this.element.data("date-hour-disabled"));this.fillDow();this.fillMonths();this.update();this.showMode();if(this.isInline){this.show()}};g.prototype={constructor:g,_events:[],_attachEvents:function(){this._detachEvents();if(this.isInput){this._events=[[this.element,{focus:d.proxy(this.show,this),keyup:d.proxy(this.update,this),keydown:d.proxy(this.keydown,this)}]]}else{if(this.component&&this.hasInput){this._events=[[this.element.find("input"),{focus:d.proxy(this.show,this),keyup:d.proxy(this.update,this),keydown:d.proxy(this.keydown,this)}],[this.component,{click:d.proxy(this.show,this)}]];if(this.componentReset){this._events.push([this.componentReset,{click:d.proxy(this.reset,this)}])}}else{if(this.element.is("div")){this.isInline=true}else{this._events=[[this.element,{click:d.proxy(this.show,this)}]]}}}for(var j=0,k,l;j=this.startDate&&i<=this.endDate){this.date=i;this.setValue();this.viewDate=this.date;this.fill()}else{this.element.trigger({type:"outOfRange",date:i,startDate:this.startDate,endDate:this.endDate})}},setFormat:function(j){this.format=c.parseFormat(j,this.formatType);var i;if(this.isInput){i=this.element}else{if(this.component){i=this.element.find("input")}}if(i&&i.val()){this.setValue()}},setValue:function(){var i=this.getFormattedDate();if(!this.isInput){if(this.component){this.element.find("input").val(i)}this.element.data("date",i)}else{this.element.val(i)}if(this.linkField){d("#"+this.linkField).val(this.getFormattedDate(this.linkFormat))}},getFormattedDate:function(i){i=i||this.format;return c.formatDate(this.date,i,this.language,this.formatType,this.timezone)},setStartDate:function(i){this.startDate=i||this.startDate;if(this.startDate.valueOf()!==8639968443048000){this.startDate=c.parseDate(this.startDate,this.format,this.language,this.formatType,this.timezone)}this.update();this.updateNavArrows()},setEndDate:function(i){this.endDate=i||this.endDate;if(this.endDate.valueOf()!==8639968443048000){this.endDate=c.parseDate(this.endDate,this.format,this.language,this.formatType,this.timezone)}this.update();this.updateNavArrows()},setDatesDisabled:function(j){this.datesDisabled=j||[];if(!d.isArray(this.datesDisabled)){this.datesDisabled=this.datesDisabled.split(/,\s*/)}var i=this;this.datesDisabled=d.map(this.datesDisabled,function(k){return c.parseDate(k,i.format,i.language,i.formatType,i.timezone).toDateString()});this.update();this.updateNavArrows()},setTitle:function(i,j){return this.picker.find(i).find("th:eq(1)").text(this.title===false?j:this.title)},setDaysOfWeekDisabled:function(i){this.daysOfWeekDisabled=i||[];if(!d.isArray(this.daysOfWeekDisabled)){this.daysOfWeekDisabled=this.daysOfWeekDisabled.split(/,\s*/)}this.daysOfWeekDisabled=d.map(this.daysOfWeekDisabled,function(j){return parseInt(j,10)});this.update();this.updateNavArrows()},setMinutesDisabled:function(i){this.minutesDisabled=i||[];if(!d.isArray(this.minutesDisabled)){this.minutesDisabled=this.minutesDisabled.split(/,\s*/)}this.minutesDisabled=d.map(this.minutesDisabled,function(j){return parseInt(j,10)});this.update();this.updateNavArrows()},setHoursDisabled:function(i){this.hoursDisabled=i||[];if(!d.isArray(this.hoursDisabled)){this.hoursDisabled=this.hoursDisabled.split(/,\s*/)}this.hoursDisabled=d.map(this.hoursDisabled,function(j){return parseInt(j,10)});this.update();this.updateNavArrows()},place:function(){if(this.isInline){return}if(!this.zIndex){var j=0;d("div").each(function(){var o=parseInt(d(this).css("zIndex"),10);if(o>j){j=o}});this.zIndex=j+10}var n,m,l,k;if(this.container instanceof d){k=this.container.offset()}else{k=d(this.container).offset()}if(this.component){n=this.component.offset();l=n.left;if(this.pickerPosition==="bottom-left"||this.pickerPosition==="top-left"){l+=this.component.outerWidth()-this.picker.outerWidth()}}else{n=this.element.offset();l=n.left;if(this.pickerPosition==="bottom-left"||this.pickerPosition==="top-left"){l+=this.element.outerWidth()-this.picker.outerWidth()}}var i=document.body.clientWidth||window.innerWidth;if(l+220>i){l=i-220}if(this.pickerPosition==="top-left"||this.pickerPosition==="top-right"){m=n.top-this.picker.outerHeight()}else{m=n.top+this.height}m=m-k.top;l=l-k.left;this.picker.css({top:m,left:l,zIndex:this.zIndex})},hour_minute:"^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]",update:function(){var i,j=false;if(arguments&&arguments.length&&(typeof arguments[0]==="string"||arguments[0] instanceof Date)){i=arguments[0];j=true}else{i=(this.isInput?this.element.val():this.element.find("input").val())||this.element.data("date")||this.initialDate;if(typeof i==="string"){i=i.replace(/^\s+|\s+$/g,"")}}if(!i){i=new Date();j=false}if(typeof i==="string"){if(new RegExp(this.hour_minute).test(i)||new RegExp(this.hour_minute+":[0-5][0-9]").test(i)){i=this.getDate()}}this.date=c.parseDate(i,this.format,this.language,this.formatType,this.timezone);if(j){this.setValue()}if(this.datethis.endDate){this.viewDate=new Date(this.endDate)}else{this.viewDate=new Date(this.date)}}this.fill()},fillDow:function(){var i=this.weekStart,j="";while(i'+e[this.language].daysMin[(i++)%7]+""}j+="";this.picker.find(".datetimepicker-days thead").append(j)},fillMonths:function(){var l="";var m=new Date(this.viewDate);for(var k=0;k<12;k++){m.setUTCMonth(k);var j=this.onRenderMonth(m);l+=''+e[this.language].monthsShort[k]+""}this.picker.find(".datetimepicker-months td").html(l)},fill:function(){if(!this.date||!this.viewDate){return}var E=new Date(this.viewDate),t=E.getUTCFullYear(),G=E.getUTCMonth(),n=E.getUTCDate(),A=E.getUTCHours(),w=this.startDate.getUTCFullYear(),B=this.startDate.getUTCMonth(),p=this.endDate.getUTCFullYear(),x=this.endDate.getUTCMonth()+1,q=(new h(this.date.getUTCFullYear(),this.date.getUTCMonth(),this.date.getUTCDate())).valueOf(),D=new Date();this.setTitle(".datetimepicker-days",e[this.language].months[G]+" "+t);if(this.formatViewType==="time"){var k=this.getFormattedDate();this.setTitle(".datetimepicker-hours",k);this.setTitle(".datetimepicker-minutes",k)}else{this.setTitle(".datetimepicker-hours",n+" "+e[this.language].months[G]+" "+t);this.setTitle(".datetimepicker-minutes",n+" "+e[this.language].months[G]+" "+t)}this.picker.find("tfoot th.today").text(e[this.language].today||e.en.today).toggle(this.todayBtn!==false);this.picker.find("tfoot th.clear").text(e[this.language].clear||e.en.clear).toggle(this.clearBtn!==false);this.updateNavArrows();this.fillMonths();var I=h(t,G-1,28,0,0,0,0),z=c.getDaysInMonth(I.getUTCFullYear(),I.getUTCMonth());I.setUTCDate(z);I.setUTCDate(z-(I.getUTCDay()-this.weekStart+7)%7);var j=new Date(I);j.setUTCDate(j.getUTCDate()+42);j=j.valueOf();var r=[];var F;while(I.valueOf()")}F=this.onRenderDay(I);if(I.getUTCFullYear()t||(I.getUTCFullYear()===t&&I.getUTCMonth()>G)){F.push("new")}}if(this.todayHighlight&&I.getUTCFullYear()===D.getFullYear()&&I.getUTCMonth()===D.getMonth()&&I.getUTCDate()===D.getDate()){F.push("today")}if(I.valueOf()===q){F.push("active")}if((I.valueOf()+86400000)<=this.startDate||I.valueOf()>this.endDate||d.inArray(I.getUTCDay(),this.daysOfWeekDisabled)!==-1||d.inArray(I.toDateString(),this.datesDisabled)!==-1){F.push("disabled")}r.push(''+I.getUTCDate()+"");if(I.getUTCDay()===this.weekEnd){r.push("")}I.setUTCDate(I.getUTCDate()+1)}this.picker.find(".datetimepicker-days tbody").empty().append(r.join(""));r=[];var u="",C="",s="";var l=this.hoursDisabled||[];E=new Date(this.viewDate);for(var y=0;y<24;y++){E.setUTCHours(y);F=this.onRenderHour(E);if(l.indexOf(y)!==-1){F.push("disabled")}var v=h(t,G,n,y);if((v.valueOf()+3600000)<=this.startDate||v.valueOf()>this.endDate){F.push("disabled")}else{if(A===y){F.push("active")}}if(this.showMeridian&&e[this.language].meridiem.length===2){C=(y<12?e[this.language].meridiem[0]:e[this.language].meridiem[1]);if(C!==s){if(s!==""){r.push("")}r.push('
'+C.toUpperCase()+"")}s=C;u=(y%12?y%12:12);if(y<12){F.push("hour_am")}else{F.push("hour_pm")}r.push(''+u+"");if(y===23){r.push("
")}}else{u=y+":00";r.push(''+u+"")}}this.picker.find(".datetimepicker-hours td").html(r.join(""));r=[];u="";C="";s="";var m=this.minutesDisabled||[];E=new Date(this.viewDate);for(var y=0;y<60;y+=this.minuteStep){if(m.indexOf(y)!==-1){continue}E.setUTCMinutes(y);E.setUTCSeconds(0);F=this.onRenderMinute(E);if(this.showMeridian&&e[this.language].meridiem.length===2){C=(A<12?e[this.language].meridiem[0]:e[this.language].meridiem[1]);if(C!==s){if(s!==""){r.push("")}r.push('
'+C.toUpperCase()+"")}s=C;u=(A%12?A%12:12);r.push(''+u+":"+(y<10?"0"+y:y)+"");if(y===59){r.push("
")}}else{u=y+":00";r.push(''+A+":"+(y<10?"0"+y:y)+"")}}this.picker.find(".datetimepicker-minutes td").html(r.join(""));var J=this.date.getUTCFullYear();var o=this.setTitle(".datetimepicker-months",t).end().find(".month").removeClass("active");if(J===t){o.eq(this.date.getUTCMonth()).addClass("active")}if(tp){o.addClass("disabled")}if(t===w){o.slice(0,B).addClass("disabled")}if(t===p){o.slice(x).addClass("disabled")}r="";t=parseInt(t/10,10)*10;var H=this.setTitle(".datetimepicker-years",t+"-"+(t+9)).end().find("td");t-=1;E=new Date(this.viewDate);for(var y=-1;y<11;y++){E.setUTCFullYear(t);F=this.onRenderYear(E);if(y===-1||y===10){F.push(b)}r+=''+t+"";t+=1}H.html(r);this.place()},updateNavArrows:function(){var m=new Date(this.viewDate),k=m.getUTCFullYear(),l=m.getUTCMonth(),j=m.getUTCDate(),i=m.getUTCHours();switch(this.viewMode){case 0:if(k<=this.startDate.getUTCFullYear()&&l<=this.startDate.getUTCMonth()&&j<=this.startDate.getUTCDate()&&i<=this.startDate.getUTCHours()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(k>=this.endDate.getUTCFullYear()&&l>=this.endDate.getUTCMonth()&&j>=this.endDate.getUTCDate()&&i>=this.endDate.getUTCHours()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break;case 1:if(k<=this.startDate.getUTCFullYear()&&l<=this.startDate.getUTCMonth()&&j<=this.startDate.getUTCDate()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(k>=this.endDate.getUTCFullYear()&&l>=this.endDate.getUTCMonth()&&j>=this.endDate.getUTCDate()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break;case 2:if(k<=this.startDate.getUTCFullYear()&&l<=this.startDate.getUTCMonth()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(k>=this.endDate.getUTCFullYear()&&l>=this.endDate.getUTCMonth()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break;case 3:case 4:if(k<=this.startDate.getUTCFullYear()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(k>=this.endDate.getUTCFullYear()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break}},mousewheel:function(j){j.preventDefault();j.stopPropagation();if(this.wheelPause){return}this.wheelPause=true;var i=j.originalEvent;var l=i.wheelDelta;var k=l>0?1:(l===0)?0:-1;if(this.wheelViewModeNavigationInverseDirection){k=-k}this.showMode(k);setTimeout(d.proxy(function(){this.wheelPause=false},this),this.wheelViewModeNavigationDelay)},click:function(m){m.stopPropagation();m.preventDefault();var n=d(m.target).closest("span, td, th, legend");if(n.is("."+this.icontype)){n=d(n).parent().closest("span, td, th, legend")}if(n.length===1){if(n.is(".disabled")){this.element.trigger({type:"outOfRange",date:this.viewDate,startDate:this.startDate,endDate:this.endDate});return}switch(n[0].nodeName.toLowerCase()){case"th":switch(n[0].className){case"switch":this.showMode(1);break;case"prev":case"next":var i=c.modes[this.viewMode].navStep*(n[0].className==="prev"?-1:1);switch(this.viewMode){case 0:this.viewDate=this.moveHour(this.viewDate,i);break;case 1:this.viewDate=this.moveDate(this.viewDate,i);break;case 2:this.viewDate=this.moveMonth(this.viewDate,i);break;case 3:case 4:this.viewDate=this.moveYear(this.viewDate,i);break}this.fill();this.element.trigger({type:n[0].className+":"+this.convertViewModeText(this.viewMode),date:this.viewDate,startDate:this.startDate,endDate:this.endDate});break;case"clear":this.reset();if(this.autoclose){this.hide()}break;case"today":var j=new Date();j=h(j.getFullYear(),j.getMonth(),j.getDate(),j.getHours(),j.getMinutes(),j.getSeconds(),0);if(jthis.endDate){j=this.endDate}}this.viewMode=this.startViewMode;this.showMode(0);this._setDate(j);this.fill();if(this.autoclose){this.hide()}break}break;case"span":if(!n.is(".disabled")){var p=this.viewDate.getUTCFullYear(),o=this.viewDate.getUTCMonth(),q=this.viewDate.getUTCDate(),r=this.viewDate.getUTCHours(),k=this.viewDate.getUTCMinutes(),s=this.viewDate.getUTCSeconds();if(n.is(".month")){this.viewDate.setUTCDate(1);o=n.parent().find("span").index(n);q=this.viewDate.getUTCDate();this.viewDate.setUTCMonth(o);this.element.trigger({type:"changeMonth",date:this.viewDate});if(this.viewSelect>=3){this._setDate(h(p,o,q,r,k,s,0))}}else{if(n.is(".year")){this.viewDate.setUTCDate(1);p=parseInt(n.text(),10)||0;this.viewDate.setUTCFullYear(p);this.element.trigger({type:"changeYear",date:this.viewDate});if(this.viewSelect>=4){this._setDate(h(p,o,q,r,k,s,0))}}else{if(n.is(".hour")){r=parseInt(n.text(),10)||0;if(n.hasClass("hour_am")||n.hasClass("hour_pm")){if(r===12&&n.hasClass("hour_am")){r=0}else{if(r!==12&&n.hasClass("hour_pm")){r+=12}}}this.viewDate.setUTCHours(r);this.element.trigger({type:"changeHour",date:this.viewDate});if(this.viewSelect>=1){this._setDate(h(p,o,q,r,k,s,0))}}else{if(n.is(".minute")){k=parseInt(n.text().substr(n.text().indexOf(":")+1),10)||0;this.viewDate.setUTCMinutes(k);this.element.trigger({type:"changeMinute",date:this.viewDate});if(this.viewSelect>=0){this._setDate(h(p,o,q,r,k,s,0))}}}}}if(this.viewMode!==0){var l=this.viewMode;this.showMode(-1);this.fill();if(l===this.viewMode&&this.autoclose){this.hide()}}else{this.fill();if(this.autoclose){this.hide()}}}break;case"td":if(n.is(".day")&&!n.is(".disabled")){var q=parseInt(n.text(),10)||1;var p=this.viewDate.getUTCFullYear(),o=this.viewDate.getUTCMonth(),r=this.viewDate.getUTCHours(),k=this.viewDate.getUTCMinutes(),s=this.viewDate.getUTCSeconds();if(n.is(".old")){if(o===0){o=11;p-=1}else{o-=1}}else{if(n.is(".new")){if(o===11){o=0;p+=1}else{o+=1}}}this.viewDate.setUTCFullYear(p);this.viewDate.setUTCMonth(o,q);this.element.trigger({type:"changeDay",date:this.viewDate});if(this.viewSelect>=2){this._setDate(h(p,o,q,r,k,s,0))}}var l=this.viewMode;this.showMode(-1);this.fill();if(l===this.viewMode&&this.autoclose){this.hide()}break}}},_setDate:function(i,k){if(!k||k==="date"){this.date=i}if(!k||k==="view"){this.viewDate=i}this.fill();this.setValue();var j;if(this.isInput){j=this.element}else{if(this.component){j=this.element.find("input")}}if(j){j.change()}this.element.trigger({type:"changeDate",date:this.getDate()});if(i===null){this.date=this.viewDate}},moveMinute:function(j,i){if(!i){return j}var k=new Date(j.valueOf());k.setUTCMinutes(k.getUTCMinutes()+(i*this.minuteStep));return k},moveHour:function(j,i){if(!i){return j}var k=new Date(j.valueOf());k.setUTCHours(k.getUTCHours()+i);return k},moveDate:function(j,i){if(!i){return j}var k=new Date(j.valueOf());k.setUTCDate(k.getUTCDate()+i);return k},moveMonth:function(j,k){if(!k){return j}var n=new Date(j.valueOf()),r=n.getUTCDate(),o=n.getUTCMonth(),m=Math.abs(k),q,p;k=k>0?1:-1;if(m===1){p=k===-1?function(){return n.getUTCMonth()===o}:function(){return n.getUTCMonth()!==q};q=o+k;n.setUTCMonth(q);if(q<0||q>11){q=(q+12)%12}}else{for(var l=0;l=this.startDate&&i<=this.endDate},keydown:function(o){if(this.picker.is(":not(:visible)")){if(o.keyCode===27){this.show()}return}var k=false,j,i,n;switch(o.keyCode){case 27:this.hide();o.preventDefault();break;case 37:case 39:if(!this.keyboardNavigation){break}j=o.keyCode===37?-1:1;var m=this.viewMode;if(o.ctrlKey){m+=2}else{if(o.shiftKey){m+=1}}if(m===4){i=this.moveYear(this.date,j);n=this.moveYear(this.viewDate,j)}else{if(m===3){i=this.moveMonth(this.date,j);n=this.moveMonth(this.viewDate,j)}else{if(m===2){i=this.moveDate(this.date,j);n=this.moveDate(this.viewDate,j)}else{if(m===1){i=this.moveHour(this.date,j);n=this.moveHour(this.viewDate,j)}else{if(m===0){i=this.moveMinute(this.date,j);n=this.moveMinute(this.viewDate,j)}}}}}if(this.dateWithinRange(i)){this.date=i;this.viewDate=n;this.setValue();this.update();o.preventDefault();k=true}break;case 38:case 40:if(!this.keyboardNavigation){break}j=o.keyCode===38?-1:1;m=this.viewMode;if(o.ctrlKey){m+=2}else{if(o.shiftKey){m+=1}}if(m===4){i=this.moveYear(this.date,j);n=this.moveYear(this.viewDate,j)}else{if(m===3){i=this.moveMonth(this.date,j);n=this.moveMonth(this.viewDate,j)}else{if(m===2){i=this.moveDate(this.date,j*7);n=this.moveDate(this.viewDate,j*7)}else{if(m===1){if(this.showMeridian){i=this.moveHour(this.date,j*6);n=this.moveHour(this.viewDate,j*6)}else{i=this.moveHour(this.date,j*4);n=this.moveHour(this.viewDate,j*4)}}else{if(m===0){i=this.moveMinute(this.date,j*4);n=this.moveMinute(this.viewDate,j*4)}}}}}if(this.dateWithinRange(i)){this.date=i;this.viewDate=n;this.setValue();this.update();o.preventDefault();k=true}break;case 13:if(this.viewMode!==0){var p=this.viewMode;this.showMode(-1);this.fill();if(p===this.viewMode&&this.autoclose){this.hide()}}else{this.fill();if(this.autoclose){this.hide()}}o.preventDefault();break;case 9:this.hide();break}if(k){var l;if(this.isInput){l=this.element}else{if(this.component){l=this.element.find("input")}}if(l){l.change()}this.element.trigger({type:"changeDate",date:this.getDate()})}},showMode:function(i){if(i){var j=Math.max(0,Math.min(c.modes.length-1,this.viewMode+i));if(j>=this.minView&&j<=this.maxView){this.element.trigger({type:"changeMode",date:this.viewDate,oldViewMode:this.viewMode,newViewMode:j});this.viewMode=j}}this.picker.find(">div").hide().filter(".datetimepicker-"+c.modes[this.viewMode].clsName).css("display","block");this.updateNavArrows()},reset:function(){this._setDate(null,"date")},convertViewModeText:function(i){switch(i){case 4:return"decade";case 3:return"year";case 2:return"month";case 1:return"day";case 0:return"hour"}}};var b=d.fn.datetimepicker;d.fn.datetimepicker=function(k){var i=Array.apply(null,arguments);i.shift();var j;this.each(function(){var n=d(this),m=n.data("datetimepicker"),l=typeof k==="object"&&k;if(!m){n.data("datetimepicker",(m=new g(this,d.extend({},d.fn.datetimepicker.defaults,l))))}if(typeof k==="string"&&typeof m[k]==="function"){j=m[k].apply(m,i);if(j!==f){return false}}});if(j!==f){return j}else{return this}};d.fn.datetimepicker.defaults={};d.fn.datetimepicker.Constructor=g;var e=d.fn.datetimepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],meridiem:["am","pm"],suffix:["st","nd","rd","th"],today:"Today",clear:"Clear"}};var c={modes:[{clsName:"minutes",navFnc:"Hours",navStep:1},{clsName:"hours",navFnc:"Date",navStep:1},{clsName:"days",navFnc:"Month",navStep:1},{clsName:"months",navFnc:"FullYear",navStep:1},{clsName:"years",navFnc:"FullYear",navStep:10}],isLeapYear:function(i){return(((i%4===0)&&(i%100!==0))||(i%400===0))},getDaysInMonth:function(i,j){return[31,(c.isLeapYear(i)?29:28),31,30,31,30,31,31,30,31,30,31][j]},getDefaultFormat:function(i,j){if(i==="standard"){if(j==="input"){return"yyyy-mm-dd hh:ii"}else{return"yyyy-mm-dd hh:ii:ss"}}else{if(i==="php"){if(j==="input"){return"Y-m-d H:i"}else{return"Y-m-d H:i:s"}}else{throw new Error("Invalid format type.")}}},validParts:function(i){if(i==="standard"){return/t|hh?|HH?|p|P|z|Z|ii?|ss?|dd?|DD?|mm?|MM?|yy(?:yy)?/g}else{if(i==="php"){return/[dDjlNwzFmMnStyYaABgGhHis]/g}else{throw new Error("Invalid format type.")}}},nonpunctuation:/[^ -\/:-@\[-`{-~\t\n\rTZ]+/g,parseFormat:function(l,j){var i=l.replace(this.validParts(j),"\0").split("\0"),k=l.match(this.validParts(j));if(!i||!i.length||!k||k.length===0){throw new Error("Invalid date format.")}return{separators:i,parts:k}},parseDate:function(A,y,v,j,r){if(A instanceof Date){var u=new Date(A.valueOf()-A.getTimezoneOffset()*60000);u.setMilliseconds(0);return u}if(/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(A)){y=this.parseFormat("yyyy-mm-dd",j)}if(/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(A)){y=this.parseFormat("yyyy-mm-dd hh:ii",j)}if(/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(A)){y=this.parseFormat("yyyy-mm-dd hh:ii:ss",j)}if(/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(A)){var l=/([-+]\d+)([dmwy])/,q=A.match(/([-+]\d+)([dmwy])/g),t,p;A=new Date();for(var x=0;x',headTemplateV3:' ',contTemplate:'',footTemplate:''};c.template='
'+c.headTemplate+c.contTemplate+c.footTemplate+'
'+c.headTemplate+c.contTemplate+c.footTemplate+'
'+c.headTemplate+""+c.footTemplate+'
'+c.headTemplate+c.contTemplate+c.footTemplate+'
'+c.headTemplate+c.contTemplate+c.footTemplate+"
";c.templateV3='
'+c.headTemplateV3+c.contTemplate+c.footTemplate+'
'+c.headTemplateV3+c.contTemplate+c.footTemplate+'
'+c.headTemplateV3+""+c.footTemplate+'
'+c.headTemplateV3+c.contTemplate+c.footTemplate+'
'+c.headTemplateV3+c.contTemplate+c.footTemplate+"
";d.fn.datetimepicker.DPGlobal=c;d.fn.datetimepicker.noConflict=function(){d.fn.datetimepicker=b;return this};d(document).on("focus.datetimepicker.data-api click.datetimepicker.data-api",'[data-provide="datetimepicker"]',function(j){var i=d(this);if(i.data("datetimepicker")){return}j.preventDefault();i.datetimepicker("show")});d(function(){d('[data-provide="datetimepicker-inline"]').datetimepicker()})})); \ No newline at end of file diff --git a/admin/src/main/webapp/js/bootstrap-select/bootstrap-select.js b/admin/src/main/webapp/js/bootstrap-select/bootstrap-select.js new file mode 100755 index 0000000..c939954 --- /dev/null +++ b/admin/src/main/webapp/js/bootstrap-select/bootstrap-select.js @@ -0,0 +1,1215 @@ +/*! + * Bootstrap-select v1.6.3 (http://silviomoreto.github.io/bootstrap-select/) + * + * Copyright 2013-2014 bootstrap-select + * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE) + */ +(function ($) { + 'use strict'; + + // Case insensitive search + $.expr[':'].icontains = function (obj, index, meta) { + return icontains($(obj).text(), meta[3]); + }; + + // Case and accent insensitive search + $.expr[':'].aicontains = function (obj, index, meta) { + return icontains($(obj).data('normalizedText') || $(obj).text(), meta[3]); + }; + + /** + * Actual implementation of the case insensitive search. + * @access private + * @param {String} haystack + * @param {String} needle + * @returns {boolean} + */ + function icontains(haystack, needle) { + return haystack.toUpperCase().indexOf(needle.toUpperCase()) > -1; + } + + /** + * Remove all diatrics from the given text. + * @access private + * @param {String} text + * @returns {String} + */ + function normalizeToBase(text) { + var rExps = [ + {re: /[\xC0-\xC6]/g, ch: "A"}, + {re: /[\xE0-\xE6]/g, ch: "a"}, + {re: /[\xC8-\xCB]/g, ch: "E"}, + {re: /[\xE8-\xEB]/g, ch: "e"}, + {re: /[\xCC-\xCF]/g, ch: "I"}, + {re: /[\xEC-\xEF]/g, ch: "i"}, + {re: /[\xD2-\xD6]/g, ch: "O"}, + {re: /[\xF2-\xF6]/g, ch: "o"}, + {re: /[\xD9-\xDC]/g, ch: "U"}, + {re: /[\xF9-\xFC]/g, ch: "u"}, + {re: /[\xC7-\xE7]/g, ch: "c"}, + {re: /[\xD1]/g, ch: "N"}, + {re: /[\xF1]/g, ch: "n"} + ]; + $.each(rExps, function () { + text = text.replace(this.re, this.ch); + }); + return text; + } + + + function htmlEscape(html) { + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + var source = '(?:' + Object.keys(escapeMap).join('|') + ')', + testRegexp = new RegExp(source), + replaceRegexp = new RegExp(source, 'g'), + string = html == null ? '' : '' + html; + return testRegexp.test(string) ? string.replace(replaceRegexp, function (match) { + return escapeMap[match]; + }) : string; + } + + var Selectpicker = function (element, options, e) { + if (e) { + e.stopPropagation(); + e.preventDefault(); + } + + this.$element = $(element); + this.$newElement = null; + this.$button = null; + this.$menu = null; + this.$lis = null; + this.options = options; + + // If we have no title yet, try to pull it from the html title attribute (jQuery doesnt' pick it up as it's not a + // data-attribute) + if (this.options.title === null) { + this.options.title = this.$element.attr('title'); + } + + //Expose public methods + this.val = Selectpicker.prototype.val; + this.render = Selectpicker.prototype.render; + this.refresh = Selectpicker.prototype.refresh; + this.setStyle = Selectpicker.prototype.setStyle; + this.selectAll = Selectpicker.prototype.selectAll; + this.deselectAll = Selectpicker.prototype.deselectAll; + this.destroy = Selectpicker.prototype.remove; + this.remove = Selectpicker.prototype.remove; + this.show = Selectpicker.prototype.show; + this.hide = Selectpicker.prototype.hide; + + this.init(); + }; + + Selectpicker.VERSION = '1.6.3'; + + // part of this is duplicated in i18n/defaults-en_US.js. Make sure to update both. + Selectpicker.DEFAULTS = { + noneSelectedText: 'Nothing selected', + noneResultsText: 'No results match', + countSelectedText: function (numSelected, numTotal) { + return (numSelected == 1) ? "{0} item selected" : "{0} items selected"; + }, + maxOptionsText: function (numAll, numGroup) { + var arr = []; + + arr[0] = (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)'; + arr[1] = (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'; + + return arr; + }, + selectAllText: 'Select All', + deselectAllText: 'Deselect All', + multipleSeparator: ', ', + style: 'btn-light', + size: 'auto', + title: null, + selectedTextFormat: 'values', + width: false, + container: false, + hideDisabled: false, + showSubtext: false, + showIcon: true, + showContent: true, + dropupAuto: true, + header: false, + liveSearch: false, + actionsBox: false, + iconBase: 'fa', + tickIcon: 'fa-check', + maxOptions: false, + mobile: false, + selectOnTab: false, + dropdownAlignRight: false, + searchAccentInsensitive: false + }; + + Selectpicker.prototype = { + + constructor: Selectpicker, + + init: function () { + var that = this, + id = this.$element.attr('id'); + + this.$element.hide(); + this.multiple = this.$element.prop('multiple'); + this.autofocus = this.$element.prop('autofocus'); + this.$newElement = this.createView(); + this.$element.after(this.$newElement); + this.$menu = this.$newElement.find('> .dropdown-menu'); + this.$button = this.$newElement.find('> button'); + this.$searchbox = this.$newElement.find('input'); + + if (this.options.dropdownAlignRight) + this.$menu.addClass('dropdown-menu-right'); + + if (typeof id !== 'undefined') { + this.$button.attr('data-id', id); + $('label[for="' + id + '"]').click(function (e) { + e.preventDefault(); + that.$button.focus(); + }); + } + + this.checkDisabled(); + this.clickListener(); + if (this.options.liveSearch) this.liveSearchListener(); + this.render(); + this.liHeight(); + this.setStyle(); + this.setWidth(); + if (this.options.container) this.selectPosition(); + this.$menu.data('this', this); + this.$newElement.data('this', this); + if (this.options.mobile) this.mobile(); + }, + + createDropdown: function () { + // Options + // If we are multiple, then add the show-tick class by default + var multiple = this.multiple ? ' show-tick' : '', + inputGroup = this.$element.parent().hasClass('input-group') ? ' input-group-btn' : '', + autofocus = this.autofocus ? ' autofocus' : '', + btnSize = this.$element.parents().hasClass('form-group-lg') ? ' btn-lg' : (this.$element.parents().hasClass('form-group-sm') ? ' btn-sm' : ''); + // Elements + var header = this.options.header ? '
' + this.options.header + '
' : ''; + var searchbox = this.options.liveSearch ? '' : ''; + var actionsbox = this.options.actionsBox ? '
' + + '
' + + '' + + '' + + '
' + + '
' : ''; + var drop = + '
' + + '' + + '' + + '
'; + + return $(drop); + }, + + createView: function () { + var $drop = this.createDropdown(); + var $li = this.createLi(); + $drop.find('ul').append($li); + return $drop; + }, + + reloadLi: function () { + //Remove all children. + this.destroyLi(); + //Re build + var $li = this.createLi(); + this.$menu.find('ul').append($li); + }, + + destroyLi: function () { + this.$menu.find('li').remove(); + }, + + createLi: function () { + var that = this, + _li = [], + optID = 0; + + // Helper functions + /** + * @param content + * @param [index] + * @param [classes] + * @returns {string} + */ + var generateLI = function (content, index, classes) { + return '' + content + ''; + }; + + /** + * @param text + * @param [classes] + * @param [inline] + * @param [optgroup] + * @returns {string} + */ + var generateA = function (text, classes, inline, optgroup) { + var normText = normalizeToBase(htmlEscape(text)); + return '' + text + + '' + + ''; + }; + + this.$element.find('option').each(function () { + var $this = $(this); + + // Get the class and text for the option + var optionClass = $this.attr('class') || '', + inline = $this.attr('style'), + text = $this.data('content') ? $this.data('content') : $this.html(), + subtext = typeof $this.data('subtext') !== 'undefined' ? '' + $this.data('subtext') + '' : '', + icon = typeof $this.data('icon') !== 'undefined' ? ' ' : '', + isDisabled = $this.is(':disabled') || $this.parent().is(':disabled'), + index = $this[0].index; + if (icon !== '' && isDisabled) { + icon = '' + icon + ''; + } + + if (!$this.data('content')) { + // Prepend any icon and append any subtext to the main text. + text = icon + '' + text + subtext + ''; + } + + if (that.options.hideDisabled && isDisabled) { + return; + } + + if ($this.parent().is('optgroup') && $this.data('divider') !== true) { + if ($this.index() === 0) { // Is it the first option of the optgroup? + optID += 1; + + // Get the opt group label + var label = $this.parent().attr('label'); + var labelSubtext = typeof $this.parent().data('subtext') !== 'undefined' ? '' + $this.parent().data('subtext') + '' : ''; + var labelIcon = $this.parent().data('icon') ? ' ' : ''; + label = labelIcon + '' + label + labelSubtext + ''; + + if (index !== 0 && _li.length > 0) { // Is it NOT the first option of the select && are there elements in the dropdown? + _li.push(generateLI('', null, 'divider')); + } + + _li.push(generateLI(label, null, 'dropdown-header')); + } + + _li.push(generateLI(generateA(text, 'opt ' + optionClass, inline, optID), index)); + } else if ($this.data('divider') === true) { + _li.push(generateLI('', index, 'divider')); + } else if ($this.data('hidden') === true) { + _li.push(generateLI(generateA(text, optionClass, inline), index, 'hide is-hidden')); + } else { + _li.push(generateLI(generateA(text, optionClass, inline), index)); + } + }); + + //If we are not multiple, we don't have a selected item, and we don't have a title, select the first element so something is set in the button + if (!this.multiple && this.$element.find('option:selected').length === 0 && !this.options.title) { + this.$element.find('option').eq(0).prop('selected', true).attr('selected', 'selected'); + } + + return $(_li.join('')); + }, + + findLis: function () { + if (this.$lis == null) this.$lis = this.$menu.find('li'); + return this.$lis; + }, + + /** + * @param [updateLi] defaults to true + */ + render: function (updateLi) { + var that = this; + + //Update the LI to match the SELECT + if (updateLi !== false) { + this.$element.find('option').each(function (index) { + that.setDisabled(index, $(this).is(':disabled') || $(this).parent().is(':disabled')); + that.setSelected(index, $(this).is(':selected')); + }); + } + + this.tabIndex(); + var notDisabled = this.options.hideDisabled ? ':not([disabled])' : ''; + var selectedItems = this.$element.find('option:selected' + notDisabled).map(function () { + var $this = $(this); + var icon = $this.data('icon') && that.options.showIcon ? ' ' : ''; + var subtext; + if (that.options.showSubtext && $this.attr('data-subtext') && !that.multiple) { + subtext = ' ' + $this.data('subtext') + ''; + } else { + subtext = ''; + } + if ($this.data('content') && that.options.showContent) { + return $this.data('content'); + } else if (typeof $this.attr('title') !== 'undefined') { + return $this.attr('title'); + } else { + return icon + $this.html() + subtext; + } + }).toArray(); + + //Fixes issue in IE10 occurring when no default option is selected and at least one option is disabled + //Convert all the values into a comma delimited string + var title = !this.multiple ? selectedItems[0] : selectedItems.join(this.options.multipleSeparator); + + //If this is multi select, and the selectText type is count, the show 1 of 2 selected etc.. + if (this.multiple && this.options.selectedTextFormat.indexOf('count') > -1) { + var max = this.options.selectedTextFormat.split('>'); + if ((max.length > 1 && selectedItems.length > max[1]) || (max.length == 1 && selectedItems.length >= 2)) { + notDisabled = this.options.hideDisabled ? ', [disabled]' : ''; + var totalCount = this.$element.find('option').not('[data-divider="true"], [data-hidden="true"]' + notDisabled).length, + tr8nText = (typeof this.options.countSelectedText === 'function') ? this.options.countSelectedText(selectedItems.length, totalCount) : this.options.countSelectedText; + title = tr8nText.replace('{0}', selectedItems.length.toString()).replace('{1}', totalCount.toString()); + } + } + + this.options.title = this.$element.attr('title'); + + if (this.options.selectedTextFormat == 'static') { + title = this.options.title; + } + + //If we dont have a title, then use the default, or if nothing is set at all, use the not selected text + if (!title) { + title = typeof this.options.title !== 'undefined' ? this.options.title : this.options.noneSelectedText; + } + + this.$button.attr('title', htmlEscape(title)); + this.$newElement.find('.filter-option').html(title); + }, + + /** + * @param [style] + * @param [status] + */ + setStyle: function (style, status) { + if (this.$element.attr('class')) { + this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device|validate\[.*\]/gi, '')); + } + + var buttonClass = style ? style : this.options.style; + + if (status == 'add') { + this.$button.addClass(buttonClass); + } else if (status == 'remove') { + this.$button.removeClass(buttonClass); + } else { + this.$button.removeClass(this.options.style); + this.$button.addClass(buttonClass); + } + }, + + liHeight: function () { + if (this.options.size === false) return; + + var $selectClone = this.$menu.parent().clone().find('> .dropdown-toggle').prop('autofocus', false).end().appendTo('body'), + $menuClone = $selectClone.addClass('open').find('> .dropdown-menu'), + liHeight = $menuClone.find('li').not('.divider').not('.dropdown-header').filter(':visible').children('a').outerHeight(), + headerHeight = this.options.header ? $menuClone.find('.popover-title').outerHeight() : 0, + searchHeight = this.options.liveSearch ? $menuClone.find('.bs-searchbox').outerHeight() : 0, + actionsHeight = this.options.actionsBox ? $menuClone.find('.bs-actionsbox').outerHeight() : 0; + + $selectClone.remove(); + + this.$newElement + .data('liHeight', liHeight) + .data('headerHeight', headerHeight) + .data('searchHeight', searchHeight) + .data('actionsHeight', actionsHeight); + }, + + setSize: function () { + this.findLis(); + var that = this, + menu = this.$menu, + menuInner = menu.find('.inner'), + selectHeight = this.$newElement.outerHeight(), + liHeight = this.$newElement.data('liHeight'), + headerHeight = this.$newElement.data('headerHeight'), + searchHeight = this.$newElement.data('searchHeight'), + actionsHeight = this.$newElement.data('actionsHeight'), + divHeight = this.$lis.filter('.divider').outerHeight(true), + menuPadding = parseInt(menu.css('padding-top')) + + parseInt(menu.css('padding-bottom')) + + parseInt(menu.css('border-top-width')) + + parseInt(menu.css('border-bottom-width')), + notDisabled = this.options.hideDisabled ? ', .disabled' : '', + $window = $(window), + menuExtras = menuPadding + parseInt(menu.css('margin-top')) + parseInt(menu.css('margin-bottom')) + 2, + menuHeight, + selectOffsetTop, + selectOffsetBot, + posVert = function () { + // JQuery defines a scrollTop function, but in pure JS it's a property + //noinspection JSValidateTypes + selectOffsetTop = that.$newElement.offset().top - $window.scrollTop(); + selectOffsetBot = $window.height() - selectOffsetTop - selectHeight; + }; + posVert(); + if (this.options.header) menu.css('padding-top', 0); + + if (this.options.size == 'auto') { + var getSize = function () { + var minHeight, + lisVis = that.$lis.not('.hide'); + + posVert(); + menuHeight = selectOffsetBot - menuExtras; + + if (that.options.dropupAuto) { + that.$newElement.toggleClass('dropup', (selectOffsetTop > selectOffsetBot) && ((menuHeight - menuExtras) < menu.height())); + } + if (that.$newElement.hasClass('dropup')) { + menuHeight = selectOffsetTop - menuExtras; + } + + if ((lisVis.length + lisVis.filter('.dropdown-header').length) > 3) { + minHeight = liHeight * 3 + menuExtras - 2; + } else { + minHeight = 0; + } + + menu.css({ + 'max-height': menuHeight + 'px', + 'overflow': 'hidden', + 'min-height': minHeight + headerHeight + searchHeight + actionsHeight + 'px' + }); + menuInner.css({ + 'max-height': menuHeight - headerHeight - searchHeight - actionsHeight - menuPadding + 'px', + 'overflow-y': 'auto', + 'min-height': Math.max(minHeight - menuPadding, 0) + 'px' + }); + }; + getSize(); + this.$searchbox.off('input.getSize propertychange.getSize').on('input.getSize propertychange.getSize', getSize); + $(window).off('resize.getSize').on('resize.getSize', getSize); + $(window).off('scroll.getSize').on('scroll.getSize', getSize); + } else if (this.options.size && this.options.size != 'auto' && menu.find('li' + notDisabled).length > this.options.size) { + var optIndex = this.$lis.not('.divider' + notDisabled).find(' > *').slice(0, this.options.size).last().parent().index(); + var divLength = this.$lis.slice(0, optIndex + 1).filter('.divider').length; + menuHeight = liHeight * this.options.size + divLength * divHeight + menuPadding; + if (that.options.dropupAuto) { + //noinspection JSUnusedAssignment + this.$newElement.toggleClass('dropup', (selectOffsetTop > selectOffsetBot) && (menuHeight < menu.height())); + } + menu.css({'max-height': menuHeight + headerHeight + searchHeight + actionsHeight + 'px', 'overflow': 'hidden'}); + menuInner.css({'max-height': menuHeight - menuPadding + 'px', 'overflow-y': 'auto'}); + } + }, + + setWidth: function () { + if (this.options.width == 'auto') { + this.$menu.css('min-width', '0'); + + // Get correct width if element hidden + var selectClone = this.$newElement.clone().appendTo('body'); + var ulWidth = selectClone.find('> .dropdown-menu').css('width'); + var btnWidth = selectClone.css('width', 'auto').find('> button').css('width'); + selectClone.remove(); + + // Set width to whatever's larger, button title or longest option + this.$newElement.css('width', Math.max(parseInt(ulWidth), parseInt(btnWidth)) + 'px'); + } else if (this.options.width == 'fit') { + // Remove inline min-width so width can be changed from 'auto' + this.$menu.css('min-width', ''); + this.$newElement.css('width', '').addClass('fit-width'); + } else if (this.options.width) { + // Remove inline min-width so width can be changed from 'auto' + this.$menu.css('min-width', ''); + this.$newElement.css('width', this.options.width); + } else { + // Remove inline min-width/width so width can be changed + this.$menu.css('min-width', ''); + this.$newElement.css('width', ''); + } + // Remove fit-width class if width is changed programmatically + if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') { + this.$newElement.removeClass('fit-width'); + } + }, + + selectPosition: function () { + var that = this, + drop = '
', + $drop = $(drop), + pos, + actualHeight, + getPlacement = function ($element) { + $drop.addClass($element.attr('class').replace(/form-control/gi, '')).toggleClass('dropup', $element.hasClass('dropup')); + pos = $element.offset(); + actualHeight = $element.hasClass('dropup') ? 0 : $element[0].offsetHeight; + $drop.css({ + 'top': pos.top + actualHeight, + 'left': pos.left, + 'width': $element[0].offsetWidth, + 'position': 'absolute' + }); + }; + this.$newElement.on('click', function () { + if (that.isDisabled()) { + return; + } + getPlacement($(this)); + $drop.appendTo(that.options.container); + $drop.toggleClass('open', !$(this).hasClass('open')); + $drop.append(that.$menu); + }); + $(window).resize(function () { + getPlacement(that.$newElement); + }); + $(window).on('scroll', function () { + getPlacement(that.$newElement); + }); + $('html').on('click', function (e) { + if ($(e.target).closest(that.$newElement).length < 1) { + $drop.removeClass('open'); + } + }); + }, + + setSelected: function (index, selected) { + this.findLis(); + this.$lis.filter('[data-original-index="' + index + '"]').toggleClass('selected', selected); + }, + + setDisabled: function (index, disabled) { + this.findLis(); + if (disabled) { + this.$lis.filter('[data-original-index="' + index + '"]').addClass('disabled').find('a').attr('href', '#').attr('tabindex', -1); + } else { + this.$lis.filter('[data-original-index="' + index + '"]').removeClass('disabled').find('a').removeAttr('href').attr('tabindex', 0); + } + }, + + isDisabled: function () { + return this.$element.is(':disabled'); + }, + + checkDisabled: function () { + var that = this; + + if (this.isDisabled()) { + this.$button.addClass('disabled').attr('tabindex', -1); + } else { + if (this.$button.hasClass('disabled')) { + this.$button.removeClass('disabled'); + } + + if (this.$button.attr('tabindex') == -1) { + if (!this.$element.data('tabindex')) this.$button.removeAttr('tabindex'); + } + } + + this.$button.click(function () { + return !that.isDisabled(); + }); + }, + + tabIndex: function () { + if (this.$element.is('[tabindex]')) { + this.$element.data('tabindex', this.$element.attr('tabindex')); + this.$button.attr('tabindex', this.$element.data('tabindex')); + } + }, + + clickListener: function () { + var that = this; + + this.$newElement.on('touchstart.dropdown', '.dropdown-menu', function (e) { + e.stopPropagation(); + }); + + this.$newElement.on('click', function () { + that.setSize(); + if (!that.options.liveSearch && !that.multiple) { + setTimeout(function () { + that.$menu.find('.selected a').focus(); + }, 10); + } + }); + + this.$menu.on('click', 'li a', function (e) { + var $this = $(this), + clickedIndex = $this.parent().data('originalIndex'), + prevValue = that.$element.val(), + prevIndex = that.$element.prop('selectedIndex'); + + // Don't close on multi choice menu + if (that.multiple) { + e.stopPropagation(); + } + + e.preventDefault(); + + //Don't run if we have been disabled + if (!that.isDisabled() && !$this.parent().hasClass('disabled')) { + var $options = that.$element.find('option'), + $option = $options.eq(clickedIndex), + state = $option.prop('selected'), + $optgroup = $option.parent('optgroup'), + maxOptions = that.options.maxOptions, + maxOptionsGrp = $optgroup.data('maxOptions') || false; + + if (!that.multiple) { // Deselect all others if not multi select box + $options.prop('selected', false); + $option.prop('selected', true); + that.$menu.find('.selected').removeClass('selected'); + that.setSelected(clickedIndex, true); + } else { // Toggle the one we have chosen if we are multi select. + $option.prop('selected', !state); + that.setSelected(clickedIndex, !state); + $this.blur(); + + if ((maxOptions !== false) || (maxOptionsGrp !== false)) { + var maxReached = maxOptions < $options.filter(':selected').length, + maxReachedGrp = maxOptionsGrp < $optgroup.find('option:selected').length; + + if ((maxOptions && maxReached) || (maxOptionsGrp && maxReachedGrp)) { + if (maxOptions && maxOptions == 1) { + $options.prop('selected', false); + $option.prop('selected', true); + that.$menu.find('.selected').removeClass('selected'); + that.setSelected(clickedIndex, true); + } else if (maxOptionsGrp && maxOptionsGrp == 1) { + $optgroup.find('option:selected').prop('selected', false); + $option.prop('selected', true); + var optgroupID = $this.data('optgroup'); + + that.$menu.find('.selected').has('a[data-optgroup="' + optgroupID + '"]').removeClass('selected'); + + that.setSelected(clickedIndex, true); + } else { + var maxOptionsArr = (typeof that.options.maxOptionsText === 'function') ? + that.options.maxOptionsText(maxOptions, maxOptionsGrp) : that.options.maxOptionsText, + maxTxt = maxOptionsArr[0].replace('{n}', maxOptions), + maxTxtGrp = maxOptionsArr[1].replace('{n}', maxOptionsGrp), + $notify = $('
'); + // If {var} is set in array, replace it + /** @deprecated */ + if (maxOptionsArr[2]) { + maxTxt = maxTxt.replace('{var}', maxOptionsArr[2][maxOptions > 1 ? 0 : 1]); + maxTxtGrp = maxTxtGrp.replace('{var}', maxOptionsArr[2][maxOptionsGrp > 1 ? 0 : 1]); + } + + $option.prop('selected', false); + + that.$menu.append($notify); + + if (maxOptions && maxReached) { + $notify.append($('
' + maxTxt + '
')); + that.$element.trigger('maxReached.bs.select'); + } + + if (maxOptionsGrp && maxReachedGrp) { + $notify.append($('
' + maxTxtGrp + '
')); + that.$element.trigger('maxReachedGrp.bs.select'); + } + + setTimeout(function () { + that.setSelected(clickedIndex, false); + }, 10); + + $notify.delay(750).fadeOut(300, function () { + $(this).remove(); + }); + } + } + } + } + + if (!that.multiple) { + that.$button.focus(); + } else if (that.options.liveSearch) { + that.$searchbox.focus(); + } + + // Trigger select 'change' + if ((prevValue != that.$element.val() && that.multiple) || (prevIndex != that.$element.prop('selectedIndex') && !that.multiple)) { + that.$element.change(); + } + } + }); + + this.$menu.on('click', 'li.disabled a, .popover-title, .popover-title :not(.close)', function (e) { + if (e.target == this) { + e.preventDefault(); + e.stopPropagation(); + if (!that.options.liveSearch) { + that.$button.focus(); + } else { + that.$searchbox.focus(); + } + } + }); + + this.$menu.on('click', 'li.divider, li.dropdown-header', function (e) { + e.preventDefault(); + e.stopPropagation(); + if (!that.options.liveSearch) { + that.$button.focus(); + } else { + that.$searchbox.focus(); + } + }); + + this.$menu.on('click', '.popover-title .close', function () { + that.$button.focus(); + }); + + this.$searchbox.on('click', function (e) { + e.stopPropagation(); + }); + + + this.$menu.on('click', '.actions-btn', function (e) { + if (that.options.liveSearch) { + that.$searchbox.focus(); + } else { + that.$button.focus(); + } + + e.preventDefault(); + e.stopPropagation(); + + if ($(this).is('.bs-select-all')) { + that.selectAll(); + } else { + that.deselectAll(); + } + that.$element.change(); + }); + + this.$element.change(function () { + that.render(false); + }); + }, + + liveSearchListener: function () { + var that = this, + no_results = $('
  • '); + + this.$newElement.on('click.dropdown.data-api touchstart.dropdown.data-api', function () { + that.$menu.find('.active').removeClass('active'); + if (!!that.$searchbox.val()) { + that.$searchbox.val(''); + that.$lis.not('.is-hidden').removeClass('hide'); + if (!!no_results.parent().length) no_results.remove(); + } + if (!that.multiple) that.$menu.find('.selected').addClass('active'); + setTimeout(function () { + that.$searchbox.focus(); + }, 10); + }); + + this.$searchbox.on('click.dropdown.data-api focus.dropdown.data-api touchend.dropdown.data-api', function (e) { + e.stopPropagation(); + }); + + this.$searchbox.on('input propertychange', function () { + if (that.$searchbox.val()) { + + if (that.options.searchAccentInsensitive) { + that.$lis.not('.is-hidden').removeClass('hide').find('a').not(':aicontains(' + normalizeToBase(that.$searchbox.val()) + ')').parent().addClass('hide'); + } else { + that.$lis.not('.is-hidden').removeClass('hide').find('a').not(':icontains(' + that.$searchbox.val() + ')').parent().addClass('hide'); + } + + if (!that.$menu.find('li').filter(':visible:not(.no-results)').length) { + if (!!no_results.parent().length) no_results.remove(); + no_results.html(that.options.noneResultsText + ' "' + htmlEscape(that.$searchbox.val()) + '"').show(); + that.$menu.find('li').last().after(no_results); + } else if (!!no_results.parent().length) { + no_results.remove(); + } + + } else { + that.$lis.not('.is-hidden').removeClass('hide'); + if (!!no_results.parent().length) no_results.remove(); + } + + that.$menu.find('li.active').removeClass('active'); + that.$menu.find('li').filter(':visible:not(.divider)').eq(0).addClass('active').find('a').focus(); + $(this).focus(); + }); + }, + + val: function (value) { + if (typeof value !== 'undefined') { + this.$element.val(value); + this.render(); + + return this.$element; + } else { + return this.$element.val(); + } + }, + + selectAll: function () { + this.findLis(); + this.$lis.not('.divider').not('.disabled').not('.selected').filter(':visible').find('a').click(); + }, + + deselectAll: function () { + this.findLis(); + this.$lis.not('.divider').not('.disabled').filter('.selected').filter(':visible').find('a').click(); + }, + + keydown: function (e) { + var $this = $(this), + $parent = ($this.is('input')) ? $this.parent().parent() : $this.parent(), + $items, + that = $parent.data('this'), + index, + next, + first, + last, + prev, + nextPrev, + prevIndex, + isActive, + keyCodeMap = { + 32: ' ', + 48: '0', + 49: '1', + 50: '2', + 51: '3', + 52: '4', + 53: '5', + 54: '6', + 55: '7', + 56: '8', + 57: '9', + 59: ';', + 65: 'a', + 66: 'b', + 67: 'c', + 68: 'd', + 69: 'e', + 70: 'f', + 71: 'g', + 72: 'h', + 73: 'i', + 74: 'j', + 75: 'k', + 76: 'l', + 77: 'm', + 78: 'n', + 79: 'o', + 80: 'p', + 81: 'q', + 82: 'r', + 83: 's', + 84: 't', + 85: 'u', + 86: 'v', + 87: 'w', + 88: 'x', + 89: 'y', + 90: 'z', + 96: '0', + 97: '1', + 98: '2', + 99: '3', + 100: '4', + 101: '5', + 102: '6', + 103: '7', + 104: '8', + 105: '9' + }; + + if (that.options.liveSearch) $parent = $this.parent().parent(); + + if (that.options.container) $parent = that.$menu; + + $items = $('[role=menu] li a', $parent); + + isActive = that.$menu.parent().hasClass('open'); + + if (!isActive && /([0-9]|[A-z])/.test(String.fromCharCode(e.keyCode))) { + if (!that.options.container) { + that.setSize(); + that.$menu.parent().addClass('open'); + isActive = true; + } else { + that.$newElement.trigger('click'); + } + that.$searchbox.focus(); + } + + if (that.options.liveSearch) { + if (/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && that.$menu.find('.active').length === 0) { + e.preventDefault(); + that.$menu.parent().removeClass('open'); + that.$button.focus(); + } + $items = $('[role=menu] li:not(.divider):not(.dropdown-header):visible', $parent); + if (!$this.val() && !/(38|40)/.test(e.keyCode.toString(10))) { + if ($items.filter('.active').length === 0) { + if (that.options.searchAccentInsensitive) { + $items = that.$newElement.find('li').filter(':aicontains(' + normalizeToBase(keyCodeMap[e.keyCode]) + ')'); + } else { + $items = that.$newElement.find('li').filter(':icontains(' + keyCodeMap[e.keyCode] + ')'); + } + } + } + } + + if (!$items.length) return; + + if (/(38|40)/.test(e.keyCode.toString(10))) { + index = $items.index($items.filter(':focus')); + first = $items.parent(':not(.disabled):visible').first().index(); + last = $items.parent(':not(.disabled):visible').last().index(); + next = $items.eq(index).parent().nextAll(':not(.disabled):visible').eq(0).index(); + prev = $items.eq(index).parent().prevAll(':not(.disabled):visible').eq(0).index(); + nextPrev = $items.eq(next).parent().prevAll(':not(.disabled):visible').eq(0).index(); + + if (that.options.liveSearch) { + $items.each(function (i) { + if ($(this).is(':not(.disabled)')) { + $(this).data('index', i); + } + }); + index = $items.index($items.filter('.active')); + first = $items.filter(':not(.disabled):visible').first().data('index'); + last = $items.filter(':not(.disabled):visible').last().data('index'); + next = $items.eq(index).nextAll(':not(.disabled):visible').eq(0).data('index'); + prev = $items.eq(index).prevAll(':not(.disabled):visible').eq(0).data('index'); + nextPrev = $items.eq(next).prevAll(':not(.disabled):visible').eq(0).data('index'); + } + + prevIndex = $this.data('prevIndex'); + + if (e.keyCode == 38) { + if (that.options.liveSearch) index -= 1; + if (index != nextPrev && index > prev) index = prev; + if (index < first) index = first; + if (index == prevIndex) index = last; + } + + if (e.keyCode == 40) { + if (that.options.liveSearch) index += 1; + if (index == -1) index = 0; + if (index != nextPrev && index < next) index = next; + if (index > last) index = last; + if (index == prevIndex) index = first; + } + + $this.data('prevIndex', index); + + if (!that.options.liveSearch) { + $items.eq(index).focus(); + } else { + e.preventDefault(); + if (!$this.is('.dropdown-toggle')) { + $items.removeClass('active'); + $items.eq(index).addClass('active').find('a').focus(); + $this.focus(); + } + } + + } else if (!$this.is('input')) { + var keyIndex = [], + count, + prevKey; + + $items.each(function () { + if ($(this).parent().is(':not(.disabled)')) { + if ($.trim($(this).text().toLowerCase()).substring(0, 1) == keyCodeMap[e.keyCode]) { + keyIndex.push($(this).parent().index()); + } + } + }); + + count = $(document).data('keycount'); + count++; + $(document).data('keycount', count); + + prevKey = $.trim($(':focus').text().toLowerCase()).substring(0, 1); + + if (prevKey != keyCodeMap[e.keyCode]) { + count = 1; + $(document).data('keycount', count); + } else if (count >= keyIndex.length) { + $(document).data('keycount', 0); + if (count > keyIndex.length) count = 1; + } + + $items.eq(keyIndex[count - 1]).focus(); + } + + // Select focused option if "Enter", "Spacebar" or "Tab" (when selectOnTab is true) are pressed inside the menu. + if ((/(13|32)/.test(e.keyCode.toString(10)) || (/(^9$)/.test(e.keyCode.toString(10)) && that.options.selectOnTab)) && isActive) { + if (!/(32)/.test(e.keyCode.toString(10))) e.preventDefault(); + if (!that.options.liveSearch) { + $(':focus').click(); + } else if (!/(32)/.test(e.keyCode.toString(10))) { + that.$menu.find('.active a').click(); + $this.focus(); + } + $(document).data('keycount', 0); + } + + if ((/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && (that.multiple || that.options.liveSearch)) || (/(27)/.test(e.keyCode.toString(10)) && !isActive)) { + that.$menu.parent().removeClass('open'); + that.$button.focus(); + } + }, + + mobile: function () { + this.$element.addClass('mobile-device').appendTo(this.$newElement); + if (this.options.container) this.$menu.hide(); + }, + + refresh: function () { + this.$lis = null; + this.reloadLi(); + this.render(); + this.setWidth(); + this.setStyle(); + this.checkDisabled(); + this.liHeight(); + }, + + update: function () { + this.reloadLi(); + this.setWidth(); + this.setStyle(); + this.checkDisabled(); + this.liHeight(); + }, + + hide: function () { + this.$newElement.hide(); + }, + + show: function () { + this.$newElement.show(); + }, + + remove: function () { + this.$newElement.remove(); + this.$element.remove(); + } + }; + + // SELECTPICKER PLUGIN DEFINITION + // ============================== + function Plugin(option, event) { + // get the args of the outer function.. + var args = arguments; + // The arguments of the function are explicitly re-defined from the argument list, because the shift causes them + // to get lost + //noinspection JSDuplicatedDeclaration + var _option = option, + option = args[0], + event = args[1]; + [].shift.apply(args); + + // This fixes a bug in the js implementation on android 2.3 #715 + if (typeof option == 'undefined') { + option = _option; + } + + var value; + var chain = this.each(function () { + var $this = $(this); + if ($this.is('select')) { + var data = $this.data('selectpicker'), + options = typeof option == 'object' && option; + + if (!data) { + var config = $.extend({}, Selectpicker.DEFAULTS, $.fn.selectpicker.defaults || {}, $this.data(), options); + $this.data('selectpicker', (data = new Selectpicker(this, config, event))); + } else if (options) { + for (var i in options) { + if (options.hasOwnProperty(i)) { + data.options[i] = options[i]; + } + } + } + + if (typeof option == 'string') { + if (data[option] instanceof Function) { + value = data[option].apply(data, args); + } else { + value = data.options[option]; + } + } + } + }); + + if (typeof value !== 'undefined') { + //noinspection JSUnusedAssignment + return value; + } else { + return chain; + } + } + + var old = $.fn.selectpicker; + $.fn.selectpicker = Plugin; + $.fn.selectpicker.Constructor = Selectpicker; + + // SELECTPICKER NO CONFLICT + // ======================== + $.fn.selectpicker.noConflict = function () { + $.fn.selectpicker = old; + return this; + }; + + $(document) + .data('keycount', 0) + .on('keydown', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role=menu], .bs-searchbox input', Selectpicker.prototype.keydown) + .on('focusin.modal', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role=menu], .bs-searchbox input', function (e) { + e.stopPropagation(); + }); + + // SELECTPICKER DATA-API + // ===================== + $(window).on('load.bs.select.data-api', function () { + $('.selectpicker').each(function () { + var $selectpicker = $(this); + Plugin.call($selectpicker, $selectpicker.data()); + }) + }); +})(jQuery); \ No newline at end of file diff --git a/admin/src/main/webapp/js/bootstrap-toggle/bootstrap-toggle.min.js b/admin/src/main/webapp/js/bootstrap-toggle/bootstrap-toggle.min.js new file mode 100755 index 0000000..60399e9 --- /dev/null +++ b/admin/src/main/webapp/js/bootstrap-toggle/bootstrap-toggle.min.js @@ -0,0 +1,9 @@ +/*! ======================================================================== + * Bootstrap Toggle: bootstrap-toggle.js v2.2.0 + * http://www.bootstraptoggle.com + * ======================================================================== + * Copyright 2014 Min Hur, The New York Times Company + * Licensed under MIT + * ======================================================================== */ ++function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.toggle"),f="object"==typeof b&&b;e||d.data("bs.toggle",e=new c(this,f)),"string"==typeof b&&e[b]&&e[b]()})}var c=function(b,c){this.$element=a(b),this.options=a.extend({},this.defaults(),c),this.render()};c.VERSION="2.2.0",c.DEFAULTS={on:"On",off:"Off",onstyle:"light",offstyle:"light",size:"normal",style:"",width:null,height:null},c.prototype.defaults=function(){return{on:this.$element.attr("data-on")||c.DEFAULTS.on,off:this.$element.attr("data-off")||c.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||c.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||c.DEFAULTS.offstyle,size:this.$element.attr("data-size")||c.DEFAULTS.size,style:this.$element.attr("data-style")||c.DEFAULTS.style,width:this.$element.attr("data-width")||c.DEFAULTS.width,height:this.$element.attr("data-height")||c.DEFAULTS.height}},c.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var b="large"===this.options.size?"btn-lg":"small"===this.options.size?"btn-sm":"mini"===this.options.size?"btn-xs":"",c=a('