From 0dded054a1744e032c30bc5b10fda1f2c94a4099 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Wed, 21 Feb 2024 15:20:48 +0800 Subject: [PATCH] 抽奖 --- src/main/java/cc/mrbird/febs/mall/entity/CjInfo.java | 2 src/main/java/cc/mrbird/febs/mall/controller/ViewMallOrderController.java | 10 src/main/java/cc/mrbird/febs/mall/controller/ApiCjController.java | 5 src/main/java/cc/mrbird/febs/mall/entity/TzInfo.java | 3 src/main/resources/templates/error/404.html | 2 src/main/java/cc/mrbird/febs/mall/dto/ChoujiangInfoDto.java | 14 src/main/resources/application-prod.yml | 16 src/main/java/cc/mrbird/febs/mall/entity/CjItem.java | 2 src/main/resources/templates/febs/views/modules/order/cjList.html | 181 ++++++++++ src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java | 7 src/main/resources/templates/error/403.html | 2 src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html | 126 ------ src/main/java/cc/mrbird/febs/mall/service/impl/AsyncCjServiceImpl.java | 215 +++++++++++ src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java | 3 src/main/java/cc/mrbird/febs/mall/service/CJService.java | 1 src/main/java/cc/mrbird/febs/mall/service/impl/CJServiceImpl.java | 96 ++++ src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java | 13 src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java | 3 src/main/java/cc/mrbird/febs/mall/mapper/CjItemMapper.java | 10 src/main/resources/templates/error/500.html | 2 src/main/java/cc/mrbird/febs/mall/service/AsyncCjService.java | 17 src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java | 4 src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java | 31 + src/main/resources/templates/index.html | 2 src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java | 12 src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java | 7 src/main/resources/mapper/modules/CjItemMapper.xml | 34 + src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java | 2 src/main/resources/mapper/modules/MallOrderInfoMapper.xml | 24 + src/main/resources/templates/febs/views/modules/mallMember/moneyFlow.html | 14 src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java | 3 src/main/resources/mapper/modules/MallGoodsMapper.xml | 7 src/main/resources/templates/febs/views/modules/goods/tzList.html | 140 +++++++ src/main/java/cc/mrbird/febs/mall/controller/CommonController.java | 3 src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java | 10 src/main/resources/templates/febs/views/layout.html | 2 src/main/resources/templates/febs/views/login.html | 4 37 files changed, 865 insertions(+), 164 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java b/src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java index 5a05607..6b6f368 100644 --- a/src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java +++ b/src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java @@ -63,7 +63,7 @@ log.info("/ /` / / \\ | |\\/| | |_) | | | |_ | | | |_ "); log.info("\\_\\_, \\_\\_/ |_| | |_| |_|__ |_|__ |_| |_|__ "); log.info(" "); - log.info("鸿楼梦 权限系统启动完毕,地址:{}", url); + log.info("抽奖 权限系统启动完毕,地址:{}", url); boolean auto = febsProperties.isAutoOpenBrowser(); if (auto && StringUtils.equalsIgnoreCase(active, FebsConstant.DEVELOP)) { diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java index 9910b02..282d5c8 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java @@ -11,6 +11,7 @@ import cc.mrbird.febs.mall.dto.UpMallGoodsDto; import cc.mrbird.febs.mall.entity.MallGoods; import cc.mrbird.febs.mall.entity.MallGoodsCategory; +import cc.mrbird.febs.mall.entity.TzInfo; import cc.mrbird.febs.mall.service.IAdminMallGoodsService; import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryTreeVo; import cc.mrbird.febs.mall.vo.AdminMallGoodsTreeVo; @@ -105,6 +106,17 @@ /** * 商品列表 + * @param request + * @return + */ + @GetMapping("tzList") + public FebsResponse getTzList(TzInfo tzInfo, QueryRequest request) { + Map<String, Object> data = getDataTable(adminMallGoodsService.getTzListInPage(tzInfo, request)); + return new FebsResponse().success().data(data); + } + + /** + * 商品列表 * @param mallGoods * @param request * @return diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java index 4c7a4bb..0c2f0c7 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java @@ -55,6 +55,19 @@ private final MallMemberMapper mallMemberMapper; private final MallOrderInfoMapper mallOrderInfoMapper; + + /** + * 订单列表 + * + * @param request + * @return + */ + @GetMapping("chouJiangList") + public FebsResponse chouJiangList(ChoujiangInfoDto choujiangInfoDto, QueryRequest request) { + Map<String, Object> data = getDataTable(adminMallOrderService.getChouJiangListInPage(choujiangInfoDto, request)); + return new FebsResponse().success().data(data); + } + /** * 订单列表 * diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiCjController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiCjController.java index e259567..a2700d2 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiCjController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiCjController.java @@ -1,5 +1,6 @@ package cc.mrbird.febs.mall.controller; +import cc.mrbird.febs.common.annotation.Limit; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.ApiCreateDto; import cc.mrbird.febs.mall.dto.KjRecordDto; @@ -28,6 +29,7 @@ @ApiResponse(code = 200, message = "success", response = ApiKjRecordVo.class) }) @PostMapping(value = "/kjRecord") + @Limit(key = "kjRecord", period = 60, count = 10, name = "列表接口", prefix = "limit") public FebsResponse kjRecord(@RequestBody KjRecordDto kjRecordDto) { return cjService.kjRecord(kjRecordDto); } @@ -48,12 +50,14 @@ @ApiResponse(code = 200, message = "success", response = ApiTzInfoVo.class) }) @GetMapping(value = "/tzInfo") + @Limit(key = "tzInfo", period = 60, count = 10, name = "首页接口", prefix = "limit") public FebsResponse tzInfo() { return cjService.tzInfo(); } @ApiOperation(value = "马上投注", notes = "马上投注") @PostMapping(value = "/create") + @Limit(key = "create", period = 1, count = 1, name = "投注接口", prefix = "limit") public FebsResponse create(@RequestBody ApiCreateDto apiCreateDto) { return cjService.create(apiCreateDto); } @@ -63,6 +67,7 @@ @ApiResponse(code = 200, message = "success", response = ApiTzListVo.class) }) @PostMapping(value = "/tzInfoList") + @Limit(key = "tzInfoList", period = 60, count = 10, name = "列表接口", prefix = "limit") public FebsResponse tzInfoList(@RequestBody KjRecordDto kjRecordDto) { return cjService.tzInfoList(kjRecordDto); } diff --git a/src/main/java/cc/mrbird/febs/mall/controller/CommonController.java b/src/main/java/cc/mrbird/febs/mall/controller/CommonController.java index 67b86a1..932a834 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/CommonController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/CommonController.java @@ -1,6 +1,7 @@ package cc.mrbird.febs.mall.controller; import cc.mrbird.febs.common.annotation.ControllerEndpoint; +import cc.mrbird.febs.common.annotation.Limit; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.*; @@ -42,6 +43,7 @@ @ApiOperation(value = "获取验证码接口", notes = "获取验证码通用接口") @GetMapping(value = "/verifyCode") + @Limit(key = "verifyCode", period = 60, count = 2, name = "验证码接口", prefix = "limit") public FebsResponse verifyCode(@ApiParam(name = "account", value = "手机号", required = true) @RequestParam(value = "account") String account, @ApiParam(name = "type", value = "类型1-手机号", required = true) @RequestParam("type") String type) { log.info("#账号:{}, 类型:{}#", account, type); @@ -147,6 +149,7 @@ @ApiOperation(value = "验证验证码接口") @PostMapping(value = "/checkCode") + @Limit(key = "verifyCode", period = 60, count = 2, name = "验证码接口", prefix = "limit") public FebsResponse checkCode(@RequestBody AccountAndCodeDto accountAndCodeDto) { boolean flag = commonService.verifyCode(accountAndCodeDto.getAccount(), accountAndCodeDto.getCode()); diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java index 3119c67..1234f09 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java @@ -28,6 +28,16 @@ * 商品列表 * @return */ + @GetMapping("tzList") + @RequiresPermissions("tzList:view") + public String tzList() { + return FebsUtil.view("modules/goods/tzList"); + } + + /** + * 商品列表 + * @return + */ @GetMapping("goodsList") @RequiresPermissions("goodsList:view") public String goodsList() { diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallOrderController.java index 1d95c61..bd6d194 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallOrderController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallOrderController.java @@ -32,6 +32,16 @@ * 订单列表 * @return */ + @GetMapping("cjList") + @RequiresPermissions("cjList:view") + public String cjList() { + return FebsUtil.view("modules/order/cjList"); + } + + /** + * 订单列表 + * @return + */ @GetMapping("orderList") @RequiresPermissions("orderList:view") public String orderList() { diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ChoujiangInfoDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ChoujiangInfoDto.java new file mode 100644 index 0000000..4eaef65 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/ChoujiangInfoDto.java @@ -0,0 +1,14 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@Data +@ApiModel(value = "MallOrderInfoDto", description = "参数接收类") +public class ChoujiangInfoDto { + + private String phone; + private String kjNo; + private String zjState; + private String kjState; +} diff --git a/src/main/java/cc/mrbird/febs/mall/entity/CjInfo.java b/src/main/java/cc/mrbird/febs/mall/entity/CjInfo.java index ff59c37..9ef506b 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/CjInfo.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/CjInfo.java @@ -20,4 +20,6 @@ private BigDecimal perkAmount;//中奖总金额 @TableField(exist = false) private List<CjItem> items; + @TableField(exist = false) + private String phone;//开奖编号 } diff --git a/src/main/java/cc/mrbird/febs/mall/entity/CjItem.java b/src/main/java/cc/mrbird/febs/mall/entity/CjItem.java index 24b5870..2c21d8d 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/CjItem.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/CjItem.java @@ -13,6 +13,8 @@ private Long infoId;//主表ID private Long memberId;// private Long tzId;//投注信息ID + private String tzCode;//投注号码 + private BigDecimal tzPercent;//获奖倍率 private Integer type;//投注类型 1-按大小 2-按单双 3-按数字 private BigDecimal amount;//投入金额 private String itemNum;//投注数字 diff --git a/src/main/java/cc/mrbird/febs/mall/entity/TzInfo.java b/src/main/java/cc/mrbird/febs/mall/entity/TzInfo.java index 7b45594..77f35d9 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/TzInfo.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/TzInfo.java @@ -1,6 +1,7 @@ package cc.mrbird.febs.mall.entity; import cc.mrbird.febs.common.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -13,4 +14,6 @@ private Integer type;//类型 1-按大小 2-按单双 3-按数字 private String tzCode;//值 private BigDecimal tzPercent;//获奖倍率 + @TableField(exist = false) + private BigDecimal tzAmount;//投入总金额 } diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/CjItemMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/CjItemMapper.java index 8066114..fb491a1 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/CjItemMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/CjItemMapper.java @@ -2,6 +2,16 @@ import cc.mrbird.febs.mall.entity.CjItem; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.ArrayList; +import java.util.List; public interface CjItemMapper extends BaseMapper<CjItem> { + + List<CjItem> selectListByInfoId(@Param("infoId")Long id); + + void updateBatchById(@Param("list")ArrayList<CjItem> cjItemUpdateList); + + List<CjItem> selectSumAmountByInfoId(@Param("list")List<Long> collect); } diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java index 59206a4..af08f38 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java @@ -3,6 +3,7 @@ import cc.mrbird.febs.mall.dto.MallGoodsQueryDto; import cc.mrbird.febs.mall.entity.MallGoods; import cc.mrbird.febs.mall.entity.MallGoodsComment; +import cc.mrbird.febs.mall.entity.TzInfo; import cc.mrbird.febs.mall.vo.*; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -43,4 +44,6 @@ List<MallGoods> selectOrderGoodsList(@Param("memberId") Long memberId, @Param("date") Date date); IPage<MallGoodsCommentVo> selectMallGoodsCommentListQueryInPage(Page<MallGoodsCommentVo> page, @Param("record")MallGoodsComment mallGoodsComment); + + IPage<TzInfo> getTzListInPage(Page<TzInfo> page, TzInfo tzInfo); } diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java index 670a51b..fd29fea 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java @@ -1,8 +1,10 @@ package cc.mrbird.febs.mall.mapper; import cc.mrbird.febs.common.enumerates.OrderPayMethodEnum; +import cc.mrbird.febs.mall.dto.ChoujiangInfoDto; import cc.mrbird.febs.mall.dto.MallOrderInfoDto; import cc.mrbird.febs.mall.dto.OrderListDto; +import cc.mrbird.febs.mall.entity.CjInfo; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.mall.entity.MallOrderItem; import cc.mrbird.febs.mall.vo.AdminMallOrderInfoVo; @@ -65,4 +67,6 @@ BigDecimal selectTotalAmountByPayDoneAndDataString(@Param("payResult")int i, @Param("date") Date date); BigDecimal selectSumAmountByPayMethodAndSomeStatue(@Param("payMethod")String name, @Param("statues") List<Long> values); + + IPage<CjInfo> getChouJiangListInPage(Page<CjInfo> page, @Param("record")ChoujiangInfoDto choujiangInfoDto); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/AsyncCjService.java b/src/main/java/cc/mrbird/febs/mall/service/AsyncCjService.java new file mode 100644 index 0000000..d6007ad --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/service/AsyncCjService.java @@ -0,0 +1,17 @@ +package cc.mrbird.febs.mall.service; + +import cc.mrbird.febs.common.entity.FebsConstant; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.mall.dto.ApiCreateDto; +import cc.mrbird.febs.mall.entity.CjInfo; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.scheduling.annotation.Async; + +public interface AsyncCjService extends IService<CjInfo> { + + @Async(FebsConstant.ASYNC_POOL) + void openPriceAsync(CjInfo cjInfo, String kjNum,String danshuang,String daXiao); + + @Async(FebsConstant.ASYNC_POOL) + void create(ApiCreateDto apiCreateDto); +} diff --git a/src/main/java/cc/mrbird/febs/mall/service/CJService.java b/src/main/java/cc/mrbird/febs/mall/service/CJService.java index a453aa9..35647a8 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/CJService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/CJService.java @@ -30,4 +30,5 @@ void getNoTimeDelayMsg(String kjNo); void getOpenPriceMsg(String kjNo, String kjNum); + } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java index 4b910ee..661995b 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java @@ -7,6 +7,7 @@ import cc.mrbird.febs.mall.dto.UpMallGoodsDto; import cc.mrbird.febs.mall.entity.MallGoods; import cc.mrbird.febs.mall.entity.MallGoodsCategory; +import cc.mrbird.febs.mall.entity.TzInfo; import cc.mrbird.febs.mall.vo.AdminMailGoodsDetailVo; import cc.mrbird.febs.mall.vo.AdminMailGoodsUpdateVo; import cc.mrbird.febs.mall.vo.AdminMallGoodsTreeVo; @@ -41,4 +42,6 @@ FebsResponse goodsHot(Long id); FebsResponse goodsNotHot(Long id); + + IPage<TzInfo> getTzListInPage(TzInfo tzInfo, QueryRequest request); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java index 4dc4630..90ca06d 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java @@ -3,6 +3,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.mall.dto.*; +import cc.mrbird.febs.mall.entity.CjInfo; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.mall.entity.MallOrderRefund; @@ -73,4 +74,6 @@ FebsResponse takeGoods(Long id); IPage<AdminMallMoneyFlowVo> orderMoneyFlow(QueryRequest request, MallOrderInfo mallOrderInfo); + + IPage<CjInfo> getChouJiangListInPage(ChoujiangInfoDto choujiangInfoDto, QueryRequest request); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java index 0c29ffa..ff19c4e 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java @@ -2,6 +2,8 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.common.utils.AppContants; +import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.conversion.MallGoodsConversion; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.*; @@ -12,6 +14,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -25,6 +28,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; @Slf4j @Service @@ -38,6 +42,9 @@ private final MallGoodsStyleMapper mallGoodsStyleMapper; private final MallGoodsImagesMapper mallGoodsImagesMapper; private final MallShoppingCartMapper mallShoppingCartMapper; + private final RedisUtils redisUtils; + private final CjItemMapper cjItemMapper; + private final CjInfoMapper cjInfoMapper; @Override public IPage<AdminMallGoodsVo> getCategoryListInPage(MallGoods mallGoods, QueryRequest request) { @@ -495,5 +502,29 @@ return new FebsResponse().success(); } + @Override + public IPage<TzInfo> getTzListInPage(TzInfo tzInfo, QueryRequest request) { + Page<TzInfo> page = new Page<>(request.getPageNum(), request.getPageSize()); + IPage<TzInfo> adminMallGoodsVos = this.baseMapper.getTzListInPage(page, tzInfo); + List<TzInfo> records = adminMallGoodsVos.getRecords(); + + String kjNo = redisUtils.getString(AppContants.KJ_RECORD_NO); + QueryWrapper<CjInfo> objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("kj_no",kjNo); + List<CjInfo> cjInfos = cjInfoMapper.selectList(objectQueryWrapper); + List<Long> collect = cjInfos.stream().map(CjInfo::getId).collect(Collectors.toList()); + List<CjItem> cjItems = cjItemMapper.selectSumAmountByInfoId(collect); + for(TzInfo tzInfo1 : records){ + List<CjItem> collect1 = cjItems.stream().filter(cjItem -> cjItem.getTzCode().equals(tzInfo1.getTzCode())).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(collect1)){ + BigDecimal reduce = collect1.stream().map(CjItem::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); + tzInfo1.setTzAmount(reduce); + }else{ + tzInfo1.setTzAmount(BigDecimal.ZERO); + } + } + return adminMallGoodsVos; + } + } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java index 1e1ee93..735457f 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java @@ -2,10 +2,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; -import cc.mrbird.febs.common.enumerates.AgentLevelEnum; -import cc.mrbird.febs.common.enumerates.FlowTypeEnum; -import cc.mrbird.febs.common.enumerates.GreenScoreEnum; -import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; +import cc.mrbird.febs.common.enumerates.*; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.LoginUserUtil; @@ -476,7 +473,7 @@ } else { iApiMallMemberWalletService.add(mallSystemPayDto.getAddBalance(), mallSystemPayDto.getId(), filedType); } - mallMoneyFlowService.addMoneyFlow(memberId, bigDecimal, MoneyFlowTypeEnum.SYSTEM.getValue(), null, type); + mallMoneyFlowService.addMoneyFlow(memberId, bigDecimal, MoneyFlowTypeNewEnum.AGENT_BONUS.getValue(), null, type); return new FebsResponse().success(); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java index 0a1ff03..230ba5d 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java @@ -471,6 +471,13 @@ } @Override + public IPage<CjInfo> getChouJiangListInPage(ChoujiangInfoDto choujiangInfoDto, QueryRequest request) { + Page<CjInfo> page = new Page<>(request.getPageNum(), request.getPageSize()); + IPage<CjInfo> cjInfoIPage = mallOrderInfoMapper.getChouJiangListInPage(page, choujiangInfoDto); + return cjInfoIPage; + } + + @Override public void deliverGoodsByOrderNo(DeliverGoodsDto deliverGoodsDto) { MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectByOrderNo(deliverGoodsDto.getOrderNo()); if (mallOrderInfo == null) { diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AsyncCjServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AsyncCjServiceImpl.java new file mode 100644 index 0000000..0b206fe --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AsyncCjServiceImpl.java @@ -0,0 +1,215 @@ +package cc.mrbird.febs.mall.service.impl; + +import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; +import cc.mrbird.febs.common.enumerates.FlowTypeEnum; +import cc.mrbird.febs.common.enumerates.MoneyFlowTypeNewEnum; +import cc.mrbird.febs.common.exception.FebsException; +import cc.mrbird.febs.common.utils.AppContants; +import cc.mrbird.febs.common.utils.MallUtils; +import cc.mrbird.febs.common.utils.RedisUtils; +import cc.mrbird.febs.mall.dto.ApiCreateDto; +import cc.mrbird.febs.mall.dto.ApiCreateItemDto; +import cc.mrbird.febs.mall.entity.*; +import cc.mrbird.febs.mall.mapper.*; +import cc.mrbird.febs.mall.service.AsyncCjService; +import cc.mrbird.febs.mall.service.IApiMallMemberService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class AsyncCjServiceImpl extends ServiceImpl<CjInfoMapper, CjInfo> implements AsyncCjService { + + private final RedisUtils redisUtils; + private final DataDictionaryCustomMapper dataDictionaryCustomMapper; + private final TzInfoMapper tzInfoMapper; + private final MallMemberWalletMapper mallMemberWalletMapper; + private final CjInfoMapper cjInfoMapper; + private final CjItemMapper cjItemMapper; + private final IApiMallMemberService mallMemberService; + + @Override + public void openPriceAsync(CjInfo cjInfo, String kjNum,String danshuang,String daXiao) { + long l = System.currentTimeMillis(); + + List<CjItem> cjItems = cjItemMapper.selectListByInfoId(cjInfo.getId()); + if(CollUtil.isEmpty(cjItems)){ + return; + } + /** + * 1-按大小 2-按单双 3-按数字 + */ + BigDecimal perkAmountTotal = BigDecimal.ZERO;//中奖总金额 + + ArrayList<CjItem> CjItemUpdateList = new ArrayList<>(); + //按大小 + List<CjItem> collectDaXiao = cjItems.stream().filter(cjItem -> cjItem.getType() == 1).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(collectDaXiao)){ + for(CjItem cjItem : collectDaXiao){ + String tzCode = cjItem.getTzCode(); + cjItem.setKjNum(daXiao); + BigDecimal perkAmount = BigDecimal.ZERO; + if(daXiao.equals(tzCode)){ + perkAmount = cjItem.getAmount().multiply(cjItem.getTzPercent()).setScale(2, BigDecimal.ROUND_DOWN); + cjItem.setPerkAmount(perkAmount); + }else{ + cjItem.setPerkAmount(perkAmount); + } + CjItemUpdateList.add(cjItem); + perkAmountTotal = perkAmountTotal.add(perkAmount); + } + } + //按单双 + List<CjItem> collectDanShuang = cjItems.stream().filter(cjItem -> cjItem.getType() == 2).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(collectDanShuang)){ + for(CjItem cjItem : collectDanShuang){ + String tzCode = cjItem.getTzCode(); + cjItem.setKjNum(danshuang); + BigDecimal perkAmount = BigDecimal.ZERO; + if(danshuang.equals(tzCode)){ + perkAmount = cjItem.getAmount().multiply(cjItem.getTzPercent()).setScale(2, BigDecimal.ROUND_DOWN); + cjItem.setPerkAmount(perkAmount); + }else{ + cjItem.setPerkAmount(perkAmount); + } + CjItemUpdateList.add(cjItem); + perkAmountTotal = perkAmountTotal.add(perkAmount); + } + } + //按数字 + List<CjItem> collectNumber = cjItems.stream().filter(cjItem -> cjItem.getType() == 3).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(collectNumber)){ + for(CjItem cjItem : collectNumber){ + String tzCode = cjItem.getTzCode(); + cjItem.setKjNum(kjNum); + BigDecimal perkAmount = BigDecimal.ZERO; + if(kjNum.equals(tzCode)){ + perkAmount = cjItem.getAmount().multiply(cjItem.getTzPercent()).setScale(2, BigDecimal.ROUND_DOWN); + cjItem.setPerkAmount(perkAmount); + }else{ + cjItem.setPerkAmount(perkAmount); + } + CjItemUpdateList.add(cjItem); + perkAmountTotal = perkAmountTotal.add(perkAmount); + } + } + cjItemMapper.updateBatchById(CjItemUpdateList);//批量更新 + + if(perkAmountTotal.compareTo(BigDecimal.ZERO) > 0){ + cjInfo.setZjState(1); + }else{ + cjInfo.setZjState(0); + } + cjInfo.setPerkAmount(perkAmountTotal); + cjInfo.setKjNum(kjNum); + cjInfo.setKjState(1); + cjInfoMapper.updateById(cjInfo); + //更新用户余额 + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(cjInfo.getMemberId()); + mallMemberWallet.setBalance(mallMemberWallet.getBalance().add(perkAmountTotal)); + mallMemberWalletMapper.updateBalanceWithVersion(mallMemberWallet); + + String orderNo = MallUtils.getOrderNum("T"); + mallMemberService.addMoneyFlow( + cjInfo.getMemberId(), + perkAmountTotal, + MoneyFlowTypeNewEnum.DYNAMIC_ACHIEVE.getValue(), + orderNo, + MoneyFlowTypeNewEnum.DYNAMIC_ACHIEVE.getDescription(), + null, + cjInfo.getId(), + 2, + FlowTypeEnum.BALANCE.getValue()); + + log.info("结束:{}", (System.currentTimeMillis() - l)); + } + + @Override + public void create(ApiCreateDto apiCreateDto) { + long l = System.currentTimeMillis(); + Long memberId = 1L; + //开启下注 + DataDictionaryCustom noTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.NO_TIME.getType(), + DataDictionaryEnum.NO_TIME.getCode() + ); + if(noTimeDic.getValue().equals(2)){ + throw new FebsException("请等待下一期"); + } + + List<ApiCreateItemDto> items = apiCreateDto.getItems(); + if(CollUtil.isEmpty(items)){ + throw new FebsException("参数有误,请刷新页面"); + } + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); + BigDecimal totalAmount = BigDecimal.ZERO; + for(ApiCreateItemDto apiCreateItemDto : items){ + BigDecimal tzAmount = apiCreateItemDto.getTzAmount().setScale(2,BigDecimal.ROUND_DOWN);//投注金额 + if(BigDecimal.ZERO.compareTo(tzAmount) >= 0){ + throw new FebsException("金额必须大于0"); + } + totalAmount = totalAmount.add(tzAmount); + } + if(mallMemberWallet.getBalance().compareTo(totalAmount) < 0){ + throw new FebsException("余额不足"); + } + //更新用户余额 + mallMemberWallet.setBalance(mallMemberWallet.getBalance().subtract(totalAmount)); + mallMemberWalletMapper.updateBalanceWithVersion(mallMemberWallet); + + //新增一条投注主表记录 + CjInfo cjInfo = new CjInfo(); + cjInfo.setMemberId(memberId); + String kjNo = redisUtils.getString(AppContants.KJ_RECORD_NO); + cjInfo.setKjNo(kjNo); + cjInfo.setKjState(0); + cjInfo.setPerkAmount(BigDecimal.ZERO); + cjInfo.setTotalAmount(totalAmount); + cjInfoMapper.insert(cjInfo); + + for(ApiCreateItemDto apiCreateItemDto : items){ + Long id = apiCreateItemDto.getId();//投注ID + TzInfo tzInfo = tzInfoMapper.selectById(id); + if(ObjectUtil.isEmpty(tzInfo)){ + throw new FebsException("参数有误,请刷新页面"); + } + BigDecimal tzAmount = apiCreateItemDto.getTzAmount().setScale(2,BigDecimal.ROUND_DOWN);//投注金额 + CjItem cjItem = new CjItem(); + cjItem.setInfoId(cjInfo.getId()); + cjItem.setMemberId(memberId); + cjItem.setTzId(id); + cjItem.setTzCode(tzInfo.getTzCode()); + cjItem.setTzPercent(tzInfo.getTzPercent()); + cjItem.setType(tzInfo.getType()); + cjItem.setAmount(tzAmount); + cjItem.setItemNum(tzInfo.getTzCode()); + cjItem.setPerkAmount(BigDecimal.ZERO); + cjItemMapper.insert(cjItem); + } + + String orderNo = MallUtils.getOrderNum("T"); + mallMemberService.addMoneyFlow( + memberId, + totalAmount.negate(), + MoneyFlowTypeNewEnum.STATIC_BONUS.getValue(), + orderNo, + MoneyFlowTypeNewEnum.STATIC_BONUS.getDescription(), + null, + cjInfo.getId(), + 2, + FlowTypeEnum.BALANCE.getValue()); + + log.info("结束:{}", (System.currentTimeMillis() - l)); + } + +} diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/CJServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/CJServiceImpl.java index 3df8f3b..4b8b87d 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/CJServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/CJServiceImpl.java @@ -14,6 +14,7 @@ import cc.mrbird.febs.mall.dto.OpenPrice; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; +import cc.mrbird.febs.mall.service.AsyncCjService; import cc.mrbird.febs.mall.service.CJService; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.vo.ApiKjInfoVo; @@ -25,6 +26,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -52,6 +54,7 @@ private final CjInfoMapper cjInfoMapper; private final CjItemMapper cjItemMapper; private final IApiMallMemberService mallMemberService; + private final AsyncCjService asyncCjService; @Override public FebsResponse kjRecord(KjRecordDto kjRecordDto) { @@ -82,7 +85,43 @@ redisUtils.set(AppContants.KJ_RECORD_TIME, kjRecord.getCreatedTime(), 600); agentProducer.sendChouJiangDelayMsg(kjNo, 10 * 60 * 1000L); - agentProducer.sendNoTimeDelayMsg(kjNo, 95 * 6 * 1000L);//提前三十秒停止下注 + agentProducer.sendNoTimeDelayMsg(kjNo, 9 * 60 * 1000L);//提一分钟停止下注 + + //todo 测试下注 + ApiCreateDto apiCreateDto = new ApiCreateDto(); + List<ApiCreateItemDto> items = new ArrayList<>(); + ApiCreateItemDto apiCreateItemDto = new ApiCreateItemDto(); + apiCreateItemDto.setId(1L); + apiCreateItemDto.setTzAmount(new BigDecimal("10")); + items.add(apiCreateItemDto); + + ApiCreateItemDto apiCreateItemDto2 = new ApiCreateItemDto(); + apiCreateItemDto2.setId(2L); + apiCreateItemDto2.setTzAmount(new BigDecimal("10")); + items.add(apiCreateItemDto2); + + ApiCreateItemDto apiCreateItemDto3 = new ApiCreateItemDto(); + apiCreateItemDto3.setId(3L); + apiCreateItemDto3.setTzAmount(new BigDecimal("10")); + items.add(apiCreateItemDto3); + + ApiCreateItemDto apiCreateItemDto4 = new ApiCreateItemDto(); + apiCreateItemDto4.setId(4L); + apiCreateItemDto4.setTzAmount(new BigDecimal("10")); + items.add(apiCreateItemDto4); + + for(int i = 1;i<5;i++){ + ApiCreateItemDto apiCreateItemDto5 = new ApiCreateItemDto(); + int randomInt = RandomUtil.randomInt(1, 25); + apiCreateItemDto5.setId(Long.parseLong(String.valueOf(randomInt))); + apiCreateItemDto5.setTzAmount(new BigDecimal("10")); + items.add(apiCreateItemDto5); + apiCreateDto.setItems(items); + } + + for(int i = 0;i<=100;i++){ + asyncCjService.create(apiCreateDto); + } } @@ -181,8 +220,7 @@ @Override @Transactional public FebsResponse create(ApiCreateDto apiCreateDto) { -// Long memberId = LoginUserUtil.getLoginUser().getId(); - Long memberId = 1L; + Long memberId = LoginUserUtil.getLoginUser().getId(); //开启下注 DataDictionaryCustom noTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.NO_TIME.getType(), @@ -208,13 +246,16 @@ if(mallMemberWallet.getBalance().compareTo(totalAmount) < 0){ throw new FebsException("余额不足"); } + //更新用户余额 + mallMemberWallet.setBalance(mallMemberWallet.getBalance().subtract(totalAmount)); + mallMemberWalletMapper.updateBalanceWithVersion(mallMemberWallet); + //新增一条投注主表记录 CjInfo cjInfo = new CjInfo(); cjInfo.setMemberId(memberId); String kjNo = redisUtils.getString(AppContants.KJ_RECORD_NO); cjInfo.setKjNo(kjNo); - cjInfo.setKjState(1); - cjInfo.setZjState(1); + cjInfo.setKjState(0); cjInfo.setPerkAmount(BigDecimal.ZERO); cjInfo.setTotalAmount(totalAmount); cjInfoMapper.insert(cjInfo); @@ -226,12 +267,12 @@ throw new FebsException("参数有误,请刷新页面"); } BigDecimal tzAmount = apiCreateItemDto.getTzAmount().setScale(2,BigDecimal.ROUND_DOWN);//投注金额 - totalAmount = totalAmount.add(tzAmount); - CjItem cjItem = new CjItem(); cjItem.setInfoId(cjInfo.getId()); cjItem.setMemberId(memberId); cjItem.setTzId(id); + cjItem.setTzCode(tzInfo.getTzCode()); + cjItem.setTzPercent(tzInfo.getTzPercent()); cjItem.setType(tzInfo.getType()); cjItem.setAmount(tzAmount); cjItem.setItemNum(tzInfo.getTzCode()); @@ -242,7 +283,7 @@ String orderNo = MallUtils.getOrderNum("T"); mallMemberService.addMoneyFlow( memberId, - totalAmount, + totalAmount.negate(), MoneyFlowTypeNewEnum.STATIC_BONUS.getValue(), orderNo, MoneyFlowTypeNewEnum.STATIC_BONUS.getDescription(), @@ -256,8 +297,7 @@ @Override public FebsResponse tzInfoList(KjRecordDto kjRecordDto) { -// Long memberId = LoginUserUtil.getLoginUser().getId(); - Long memberId = 1L; + Long memberId = LoginUserUtil.getLoginUser().getId(); kjRecordDto.setMemberId(memberId); IPage<CjInfo> page = new Page<>(kjRecordDto.getPageNum(), kjRecordDto.getPageSize()); IPage<CjInfo> pages = cjInfoMapper.selectTzListByMemberId(page, kjRecordDto); @@ -278,7 +318,43 @@ @Override public void getOpenPriceMsg(String kjNo, String kjNum) { + QueryWrapper<CjInfo> objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("kj_no",kjNo); + List<CjInfo> cjInfos = cjInfoMapper.selectList(objectQueryWrapper); + if(ObjectUtil.isEmpty(cjInfos)){ + return; + } + String danshuang = judgeNumberOne(Integer.parseInt(kjNum)); + String daXiao = judgeNumberTwo(Integer.parseInt(kjNum)); + for(CjInfo cjInfo : cjInfos){ + asyncCjService.openPriceAsync(cjInfo,kjNum,danshuang,daXiao); + } + } + /** + * 取模运算符%来判断该数字是否为偶数。如果余数为0,则该数字为偶数,返回"双数";否则,该数字为奇数,返回"单数" + * @param num + * @return 1-单数 2-双数 + */ + public static String judgeNumberOne(int num) { + if (num % 2 == 0) { + return "双"; + } else { + return "单"; + } + } + + /** + * 小于等于12为小 大于12为大 + * @param num + * @return 1-小数 2-大数 + */ + public static String judgeNumberTwo(int num) { + if (num <= 12) { + return "小"; + } else { + return "大"; + } } } diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 7d991e2..a043bdd 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -13,22 +13,22 @@ # 配置默认数据源 primary: base datasource: - # 数据源-1,名称为 base + # 数据源-1,名称为 base 154.91.195.148 base: - username: db_mall_hongloumeng - password: hongloumeng123!@#123 + username: db_choujiang + password: db_choujiang123 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/db_mall_hongloumeng?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=GMT%2b8 + url: jdbc:mysql://127.0.0.1:3306/db_choujiang?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=GMT%2b8 redis: # Redis数据库索引(默认为 0) - database: 1 + database: 3 # Redis服务器地址 host: 127.0.0.1 # Redis服务器连接端口 port: 6379 # Redis 密码 - password: zhongji-mall=-0 + password: dapp!@#123 lettuce: pool: # 连接池中的最小空闲连接 @@ -44,8 +44,8 @@ rabbitmq: host: 127.0.0.1 port: 5672 - username: zj_mall - password: zj_mall123 + username: xc_rabbit + password: xuncong123 publisher-confirm-type: correlated pay: diff --git a/src/main/resources/mapper/modules/CjItemMapper.xml b/src/main/resources/mapper/modules/CjItemMapper.xml new file mode 100644 index 0000000..8f17e2a --- /dev/null +++ b/src/main/resources/mapper/modules/CjItemMapper.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="cc.mrbird.febs.mall.mapper.CjItemMapper"> + + <select id="selectListByInfoId" resultType="cc.mrbird.febs.mall.entity.CjItem"> + select * + from cj_item a + where a.info_id = #{infoId} + </select> + + <update id="updateBatchById"> + <foreach collection="list" item="item" separator=";"> + update + `cj_item` + set + `kj_num` = #{item.kjNum}, + `perk_amount` = #{item.perkAmount} + where + id = #{item.id} + </foreach> + </update> + + + + <select id="selectSumAmountByInfoId" resultType="cc.mrbird.febs.mall.entity.CjItem"> + select * + from cj_item a + where a.info_id in + <foreach collection = "list" item = "item" separator="," open = "(" close = ")" > + #{item} + </foreach > + </select> + +</mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/modules/MallGoodsMapper.xml b/src/main/resources/mapper/modules/MallGoodsMapper.xml index d93f9d7..b4cc944 100644 --- a/src/main/resources/mapper/modules/MallGoodsMapper.xml +++ b/src/main/resources/mapper/modules/MallGoodsMapper.xml @@ -240,4 +240,11 @@ order by a.created_time desc </select> + <select id="getTzListInPage" resultType="cc.mrbird.febs.mall.entity.TzInfo"> + select + a.* + from tz_info a + order by a.id asc + </select> + </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/modules/MallOrderInfoMapper.xml b/src/main/resources/mapper/modules/MallOrderInfoMapper.xml index fb2e09e..1120b05 100644 --- a/src/main/resources/mapper/modules/MallOrderInfoMapper.xml +++ b/src/main/resources/mapper/modules/MallOrderInfoMapper.xml @@ -315,4 +315,28 @@ #{item} </foreach> </select> + + + <select id="getChouJiangListInPage" resultType="cc.mrbird.febs.mall.entity.CjInfo"> + select + a.*, + c.phone + from cj_info a + left join mall_member c on a.member_id = c.id + <where> + <if test="record.phone != null and record.phone != ''"> + and c.phone=#{record.phone} + </if> + <if test="record.kjNo != null and record.kjNo != ''"> + and a.kj_no=#{record.kjNo} + </if> + <if test="record.kjState != null and record.kjState != ''"> + and a.kj_state=#{record.kjState} + </if> + <if test="record.zjState != null and record.zjState != ''"> + and a.zj_state=#{record.zjState} + </if> + </where> + order by a.created_time desc + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/templates/error/403.html b/src/main/resources/templates/error/403.html index c68ad0a..202fb1c 100644 --- a/src/main/resources/templates/error/403.html +++ b/src/main/resources/templates/error/403.html @@ -2,7 +2,7 @@ <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> - <title>鸿楼梦 权限系统</title> + <title>抽奖 权限系统</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> diff --git a/src/main/resources/templates/error/404.html b/src/main/resources/templates/error/404.html index 990d96c..cbda0fd 100644 --- a/src/main/resources/templates/error/404.html +++ b/src/main/resources/templates/error/404.html @@ -2,7 +2,7 @@ <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> - <title>鸿楼梦 权限系统</title> + <title>抽奖 权限系统</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> diff --git a/src/main/resources/templates/error/500.html b/src/main/resources/templates/error/500.html index 23013d2..ea44d4b 100644 --- a/src/main/resources/templates/error/500.html +++ b/src/main/resources/templates/error/500.html @@ -2,7 +2,7 @@ <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> - <title>鸿楼梦 权限系统</title> + <title>抽奖 权限系统</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> diff --git a/src/main/resources/templates/febs/views/layout.html b/src/main/resources/templates/febs/views/layout.html index fac6ea5..bcfe600 100644 --- a/src/main/resources/templates/febs/views/layout.html +++ b/src/main/resources/templates/febs/views/layout.html @@ -64,7 +64,7 @@ <div class="layui-side-scroll"> <div class="layui-logo" style="cursor: pointer"> <img data-th-src="@{febs/images/logo.png}"> - <span>鸿楼梦 权限系统</span> + <span>抽奖 权限系统</span> </div> <script type="text/html" diff --git a/src/main/resources/templates/febs/views/login.html b/src/main/resources/templates/febs/views/login.html index ca000e0..506b929 100644 --- a/src/main/resources/templates/febs/views/login.html +++ b/src/main/resources/templates/febs/views/login.html @@ -2,7 +2,7 @@ <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> - <title>鸿楼梦 权限系统</title> + <title>抽奖 权限系统</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> @@ -19,7 +19,7 @@ <div class="layui-container"> <div class="layui-row"> <div class="layui-col-xs12 layui-col-lg4 layui-col-lg-offset4 febs-tc"> - <div class="layui-logo"><span><b>鸿楼梦</b> 权限系统</span></div> + <div class="layui-logo"><span><b>抽奖</b> 权限系统</span></div> </div> <div class="layui-col-xs12 layui-col-lg4 layui-col-lg-offset4" id="login-div"> <div class="layui-form" lay-filter="login-form"> diff --git a/src/main/resources/templates/febs/views/modules/goods/tzList.html b/src/main/resources/templates/febs/views/modules/goods/tzList.html new file mode 100644 index 0000000..555af92 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/goods/tzList.html @@ -0,0 +1,140 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-tz" lay-title="投注列表"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-body febs-table-full"> + <form class="layui-form layui-table-form" lay-filter="user-table-form"> + <div class="layui-row"> + <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> + <i class="layui-icon"></i> + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> + <i class="layui-icon"></i> + </div> + </div> + </div> + </form> + <table lay-filter="tzTable" lay-data="{id: 'tzTable'}"></table> + <style type="text/css"> + .layui-table-cell{ + text-align:center; + height: auto; + white-space: nowrap; /*文本不会换行,在同一行显示*/ + overflow: hidden; /*超出隐藏*/ + text-overflow: ellipsis; /*省略号显示*/ + } + .layui-table img{ + max-width:100px + } + </style> + </div> + </div> + </div> + </div> +</div> +<!-- 表格操作栏 start --> +<script type="text/html" id="user-option"> + <span shiro:lacksPermission="user:view,user:update,user:delete"> + <span class="layui-badge-dot febs-bg-orange"></span> 无权限 + </span> + <a lay-event="edit" shiro:hasPermission="user:update"><i + class="layui-icon febs-edit-area febs-blue"></i></a> +</script> +<script type="text/html" id="tzTypeFormat"> + <div> + {{# if (d.type == 1) { }} + <span class="layui-badge febs-tag-green">大小</span> + {{# } else if (d.type == 2) { }} + <span class="layui-badge febs-tag-cyan">单双</span> + {{# } else { }} + <span class="layui-badge febs-tag-orange">数字</span> + {{# } }} + </div> +</script> +<style> + .layui-form-onswitch { + background-color: #5FB878 !important; + } +</style> +<!-- 表格操作栏 end --> +<script data-th-inline="none" type="text/javascript"> + // 引入组件并初始化 + layui.use([ 'jquery', 'form', 'table', 'febs'], function () { + var $ = layui.jquery, + febs = layui.febs, + form = layui.form, + table = layui.table, + $view = $('#febs-tz'), + $query = $view.find('#query'), + $reset = $view.find('#reset'), + $searchForm = $view.find('form'), + $add = $view.find('#add'), + sortObject = {field: 'phone', type: null}, + tableIns; + + form.render(); + let currPageTz = 1;//首先默认值为1,防止出错 + //获取当前页 + currPageTz = $view.find(".layui-laypage-em").next().html(); + + // 表格初始化 + initTable(); + + // 初始化表格操作栏各个按钮功能 + table.on('tool(tzTable)', function (obj) { + var data = obj.data, + layEvent = obj.event; + if (layEvent === 'goodsUpdate') { + febs.modal.open('编辑', 'modules/goods/goodsUpdateNew/' + data.id, { + btn: ['提交', '取消'], + area:['100%','100%'], + yes: function (index, layero) { + $('#febs-update').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + }); + + // 查询按钮 + $query.on('click', function () { + var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); + tableIns.reload({where: params, page: {curr: currPageTz}}); + }); + + // 刷新按钮 + $reset.on('click', function () { + $searchForm[0].reset(); + sortObject.type = 'null'; + tableIns.reload({where: getQueryParams(), page: {curr: currPageTz}, initSort: sortObject}); + }); + + function initTable() { + tableIns = febs.table.init({ + elem: $view.find('table'), + id: 'tzTable', + url: ctx + 'admin/goods/tzList', + cols: [[ + {templet:"#tzTypeFormat", title: '类型', minWidth: 100,align:'left'}, + {field: 'tzCode', title: '值', minWidth: 100,align:'left'}, + {field: 'tzPercent', title: '倍率', minWidth: 100,align:'left'}, + {field: 'tzAmount', title: '投注总额', minWidth: 100,align:'left'}, + {title: '操作', + templet: function (d) { + return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="goodsUpdate" shiro:hasPermission="user:update">编辑</button>' + },minWidth: 160,align:'center'} + ]] + }); + } + + // 获取查询参数 + function getQueryParams() { + return { + }; + } + + }) +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/mallMember/moneyFlow.html b/src/main/resources/templates/febs/views/modules/mallMember/moneyFlow.html index 0b64db2..cbfc8da 100644 --- a/src/main/resources/templates/febs/views/modules/mallMember/moneyFlow.html +++ b/src/main/resources/templates/febs/views/modules/mallMember/moneyFlow.html @@ -44,20 +44,6 @@ url: ctx + 'admin/mallMember/moneyFlow?parentId=1', cols: [[ {field: 'amount', title: '金额', minWidth: 80,align:'center'}, - {field: 'type', title: '流水类型', - templet: function (d) { - if (d.type === 1) { - return '<span>投注</span>' - } else if (d.type === 2) { - return '<span>中奖</span>' - } else if (d.type === 3) { - return '<span>充值</span>' - } else if (d.type === 4) { - return '<span>提现</span>' - }else{ - return '' - } - }, minWidth: 80,align:'center'}, {field: 'orderNo', title: '订单编号', minWidth: 150,align:'center'}, {field: 'description', title: '备注', minWidth: 150,align:'left'}, {field: 'createdTime', title: '时间', minWidth: 150,align:'left'} diff --git a/src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html b/src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html index 107977e..e5d3fe4 100644 --- a/src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html +++ b/src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html @@ -8,18 +8,6 @@ <div class="layui-col-md10"> <div class="layui-form-item"> <div class="layui-inline"> - <label class="layui-form-label">登录账户:</label> - <div class="layui-input-inline"> - <input type="text" placeholder="登录账户" name="accountLogin" autocomplete="off" class="layui-input"> - </div> - </div> - <div class="layui-inline"> - <label class="layui-form-label">名称:</label> - <div class="layui-input-inline"> - <input type="text" placeholder="名称" name="name" autocomplete="off" class="layui-input"> - </div> - </div> - <div class="layui-inline"> <label class="layui-form-label">手机号码:</label> <div class="layui-input-inline"> <input type="text" placeholder="手机号码" name="phone" autocomplete="off" class="layui-input"> @@ -30,40 +18,10 @@ <div class="layui-input-inline"> <select name="type"> <option value="">请选择</option> - <option value="1">静态收益</option> - <option value="2">直推奖</option> - <option value="8">提现</option> - <option value="9">转账</option> - <option value="10">支付</option> - <option value="11">退款</option> - <option value="14">签到</option> - <option value="16">系统拨付</option> - <option value="19">1星合伙人补贴</option> - <option value="20">2星合伙人补贴</option> - <option value="21">3星合伙人补贴</option> - <option value="22">4星合伙人补贴</option> - <option value="23">5星合伙人补贴</option> - <option value="24">6星合伙人补贴</option> - <option value="25">贡献点</option> - <option value="26">补贴额度</option> - <option value="27">团队补贴</option> - <option value="28">平级奖励补贴</option> - <option value="29">线下服务中心补贴</option> - <option value="30">代理商补贴</option> - </select> - </div> - </div> - <div class="layui-inline"> - <label class="layui-form-label">资金类型:</label> - <div class="layui-input-inline"> - <select name="flowType"> - <option value="">请选择</option> - <option value="1">余额</option> -<!-- <option value="2">赠送积分</option>--> - <option value="3">现金积分</option> - <option value="5">贡献点</option> -<!-- <option value="6">补贴额度</option>--> -<!-- <option value="4">佣金</option>--> + <option value="1">投注</option> + <option value="2">中奖</option> + <option value="3">充值</option> + <option value="4">提现</option> </select> </div> </div> @@ -130,87 +88,20 @@ id: 'moneyFlowTable', url: ctx + 'admin/mallMember/getMoneyFlowList', cols: [[ - {field: 'accountLogin', title: '登录账户', minWidth: 100,align:'left'}, - {field: 'name', title: '名称', minWidth: 100,align:'left'}, {field: 'phone', title: '手机号码', minWidth: 150,align:'left'}, {field: 'amount', title: '金额', minWidth: 150,align:'left'}, - {field: 'fromMemberName', title: '来自', minWidth: 150,align:'left'}, {field: 'type', title: '流水类型', templet: function (d) { if (d.type === 1) { - return '<span>静态收益</span>' + return '<span>投注</span>' } else if (d.type === 2) { - return '<span>直推奖</span>' + return '<span>中奖</span>' } else if (d.type === 3) { - return '<span>代理收益</span>' + return '<span>充值</span>' } else if (d.type === 4) { - return '<span>排名收益</span>' - }else if (d.type === 5) { - return '<span>总监收益</span>' - }else if (d.type === 6) { - return '<span>社区店补</span>' - }else if (d.type === 7) { - return '<span>一代收益</span>' - }else if (d.type === 8) { return '<span>提现</span>' - }else if (d.type === 9) { - return '<span>转账</span>' - }else if (d.type === 10) { - return '<span>支付</span>' - }else if (d.type === 11) { - return '<span>退款</span>' - }else if (d.type === 12) { - return '<span>佣金转竞猜积分</span>' - }else if (d.type === 13) { - return '<span>佣金转余额</span>' - }else if (d.type === 14) { - return '<span>签到</span>' - }else if (d.type === 15) { - return '<span>感恩奖</span>' - }else if (d.type === 16) { - return '<span>系统拨付</span>' - }else if (d.type === 17) { - return '<span>抽奖</span>' - }else if (d.type === 18) { - return '<span>积分池收益</span>' - }else if (d.type === 19) { - return '<span>1星合伙人补贴</span>' - }else if (d.type === 20) { - return '<span>2星合伙人补贴</span>' - }else if (d.type === 21) { - return '<span>3星合伙人补贴</span>' - }else if (d.type === 22) { - return '<span>4星合伙人补贴</span>' - }else if (d.type === 23) { - return '<span>5星合伙人补贴</span>' - }else if (d.type === 24) { - return '<span>6星合伙人补贴</span>' - }else if (d.type === 25) { - return '<span>贡献点</span>' - }else if (d.type === 26) { - return '<span>补贴额度</span>' - }else if (d.type === 27) { - return '<span>团队补贴</span>' - }else if (d.type === 28) { - return '<span>平级奖励补贴</span>' - }else if (d.type === 29) { - return '<span>线下服务中心补贴</span>' - }else if (d.type === 30) { - return '<span>代理商补贴</span>' }else{ return '' - } - }, minWidth: 80,align:'center'}, - {field: 'flowType', title: '资金类型', - templet: function (d) { - if (d.flowType === 1) { - return '余额'; - } else if(d.flowType === 3) { - return '现金积分' - } else if(d.flowType === 5) { - return '贡献点' - } else { - return '-'; } }, minWidth: 80,align:'center'}, {field: 'orderNo', title: '订单编号', minWidth: 150,align:'left'}, @@ -223,11 +114,8 @@ // 获取查询参数 function getQueryParams() { return { - name: $searchForm.find('input[name="name"]').val().trim(), - accountLogin: $searchForm.find('input[name="accountLogin"]').val().trim(), phone: $searchForm.find('input[name="phone"]').val().trim(), type: $searchForm.find("select[name='type']").val(), - flowType: $searchForm.find("select[name='flowType']").val(), }; } diff --git a/src/main/resources/templates/febs/views/modules/order/cjList.html b/src/main/resources/templates/febs/views/modules/order/cjList.html new file mode 100644 index 0000000..2dc5b4b --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/order/cjList.html @@ -0,0 +1,181 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-choujiang" lay-title="投注列表"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-body febs-table-full"> + <form class="layui-form layui-table-form" lay-filter="user-table-form"> + <div class="layui-form-item"> + <div class="layui-col-md10"> + <div class="layui-inline"> + <label class="layui-form-label">账号:</label> + <div class="layui-input-inline"> + <input type="text" placeholder="账号" name="phone" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-inline"> + <label class="layui-form-label">期号:</label> + <div class="layui-input-inline"> + <input type="text" placeholder="期号" name="kjNo" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-inline"> + <label class="layui-form-label">是否开奖:</label> + <div class="layui-input-inline"> + <select name="kjState"> + <option value="">请选择</option> + <option value="0">未开奖</option> + <option value="1">已开奖</option> + </select> + </div> + </div> + <div class="layui-inline"> + <label class="layui-form-label">是否中奖:</label> + <div class="layui-input-inline"> + <select name="zjState"> + <option value="">请选择</option> + <option value="0">未中奖</option> + <option value="1">中奖</option> + </select> + </div> + </div> + + </div> + + <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> + <i class="layui-icon"></i> + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> + <i class="layui-icon"></i> + </div> + </div> + </div> + </form> + <table lay-filter="chouJiangTable" lay-data="{id: 'chouJiangTable'}"></table> + <style type="text/css"> + .layui-table-cell{ + text-align:center; + height: auto; + white-space: nowrap; /*文本不会换行,在同一行显示*/ + overflow: hidden; /*超出隐藏*/ + text-overflow: ellipsis; /*省略号显示*/ + } + .layui-table img{ + max-width:100px + } + </style> + </div> + </div> + </div> + </div> +</div> +<script type="text/html" id="user-option"> + <span shiro:lacksPermission="user:view,user:update,user:delete"> + <span class="layui-badge-dot febs-bg-orange"></span> 无权限 + </span> + <a lay-event="edit" shiro:hasPermission="user:update"><i + class="layui-icon febs-edit-area febs-blue"></i></a> +</script> +<script type="text/html" id="tableToolBar"> + <div class="layui-btn-container"> + </div> +</script> +<!-- 表格操作栏 end --> +<script data-th-inline="none" type="text/javascript"> + // 引入组件并初始化 + layui.use([ 'jquery', 'form', 'table', 'febs', 'upload','laydate'], function () { + var $ = layui.jquery, + febs = layui.febs, + form = layui.form, + table = layui.table, + upload = layui.upload, + $view = $('#febs-choujiang'), + $query = $view.find('#query'), + $reset = $view.find('#reset'), + $searchForm = $view.find('form'), + $add = $view.find('#add'), + sortObject = {field: 'phone', type: null}, + laydate = layui.laydate, + tableIns; + + + form.render(); + + let currPageCj = 1;//首先默认值为1,防止出错 + //获取当前页 + currPageCj = $view.find(".layui-laypage-em").next().html(); + + // 表格初始化 + initTable(); + + + // 初始化表格操作栏各个按钮功能 + table.on('tool(chouJiangTable)', function (obj) { + var data = obj.data, + layEvent = obj.event; + }); + + // 查询按钮 + $query.on('click', function () { + var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); + tableIns.reload({where: params, page: {curr: currPageCj}}); + }); + + // 刷新按钮 + $reset.on('click', function () { + $searchForm[0].reset(); + sortObject.type = 'null'; + tableIns.reload({where: getQueryParams(), page: {curr: currPageCj}, initSort: sortObject}); + }); + + function initTable() { + tableIns = febs.table.init({ + elem: $view.find('table'), + id: 'chouJiangTable', + url: ctx + 'admin/order/chouJiangList', + defaultToolbar: [], + // toolbar: '#tableToolBar', + totalRow: true ,// 开启合计行 + cols: [[ + {field: 'kjNo', title: '期号', minWidth: 120,align:'left', totalRowText: '合计:'}, + {field: 'phone', title: '账号', minWidth: 120,align:'left'}, + {field: 'totalAmount', title: '投注金额', minWidth: 120,align:'left'}, + {field: 'perkAmount', title: '奖金', minWidth: 120,align:'left'}, + {field: 'kjState', title: '是否开奖', + templet: function (d) { + if (d.kjState === 0) { + return '<span style="color:blue;">未开奖</span>' + } else if (d.kjState === 1) { + return '<span style="color:green;">已开奖</span>' + }else{ + return '' + } + }, minWidth: 120,align:'center'}, + {field: 'zjState', title: '是否开奖', + templet: function (d) { + if (d.zjState === 0) { + return '<span style="color:green;">未中奖</span>' + } else if (d.zjState === 1) { + return '<span style="color:red;">中奖</span>' + }else{ + return '' + } + }, minWidth: 120,align:'center'}, + {field: 'kjNum', title: '中奖号码', minWidth: 120,align:'left'}, + {field: 'createdTime', title: '时间', minWidth: 200,align:'left'}, + ]] + }); + } + + // 获取查询参数 + function getQueryParams() { + return { + phone: $searchForm.find('input[name="phone"]').val().trim(), + kjNo: $searchForm.find('input[name="kjNo"]').val().trim(), + kjState: $searchForm.find("select[name='kjState']").val(), + zjState: $searchForm.find("select[name='zjState']").val(), + }; + } + + }) +</script> \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 0edae19..bc4974c 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -3,7 +3,7 @@ xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> <head> <meta charset="utf-8"> - <title>鸿楼梦 权限系统</title> + <title>抽奖 权限系统</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> -- Gitblit v1.9.1