记得上下班打卡 | git大法好,push需谨慎

Commit 1add9909 authored by 张国柄's avatar 张国柄

+API:购买会员开关;

迁移会员黑名单API至admin服务;
parent 0a690b34
...@@ -10,6 +10,9 @@ public class AdamRedisConst { ...@@ -10,6 +10,9 @@ public class AdamRedisConst {
public static final String INFO = ADAM.concat("info:"); public static final String INFO = ADAM.concat("info:");
public static final String INFO_TAGS_SEX = INFO.concat("tags:sex");
public static final String INFO_TAGS_MUSIC = INFO.concat("tags:music");
public static final String INFO_USER = INFO.concat("user:"); public static final String INFO_USER = INFO.concat("user:");
public static final String INFO_USER_MEMBER = INFO_USER.concat("member:"); public static final String INFO_USER_MEMBER = INFO_USER.concat("member:");
public static final String INFO_REAL_NAME = INFO.concat("real_name:"); public static final String INFO_REAL_NAME = INFO.concat("real_name:");
...@@ -30,13 +33,11 @@ public class AdamRedisConst { ...@@ -30,13 +33,11 @@ public class AdamRedisConst {
public static final String SHOT_MEMBER_ORDER = ADAM.concat("morder:"); public static final String SHOT_MEMBER_ORDER = ADAM.concat("morder:");
public static final String INFO_TAGS_SEX = INFO.concat("tags:sex");
public static final String INFO_TAGS_MUSIC = INFO.concat("tags:music");
public static final String INCR = ADAM.concat("incr:"); public static final String INCR = ADAM.concat("incr:");
public static final String INCR_MEMBER_NO = INCR.concat("member_no"); public static final String INCR_MEMBER_NO = INCR.concat("member_no");
public static final String SWITCH = ADAM.concat("switch:");
public static final String SWITCH_BUY_MEMBER = SWITCH.concat("buy:member");
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */
......
...@@ -57,6 +57,8 @@ public class AdamMemberVo implements java.io.Serializable, Cloneable { ...@@ -57,6 +57,8 @@ public class AdamMemberVo implements java.io.Serializable, Cloneable {
private List<AdamMemberRightsVo> rightsVoList; private List<AdamMemberRightsVo> rightsVoList;
@ApiModelProperty(position = 22, value = "用户会员信息") @ApiModelProperty(position = 22, value = "用户会员信息")
private AdamUserMemberVo userMemberVo; private AdamUserMemberVo userMemberVo;
@ApiModelProperty(position = 23, value = "购买会员限制[0-名额已满|1-允许购买]")
private Integer buySwitch;
private static final AdamMemberVo obj = new AdamMemberVo(); private static final AdamMemberVo obj = new AdamMemberVo();
......
...@@ -2,34 +2,39 @@ package com.liquidnet.client.admin.web.controller.zhengzai.adam; ...@@ -2,34 +2,39 @@ package com.liquidnet.client.admin.web.controller.zhengzai.adam;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberAdminService; import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberAdminService;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberCodeAdminService; import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberCodeAdminService;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.AdamMemberCodeParam; import com.liquidnet.service.adam.dto.AdamMemberCodeParam;
import com.liquidnet.service.adam.dto.AdamMemberParam; import com.liquidnet.service.adam.dto.AdamMemberParam;
import com.liquidnet.service.adam.dto.vo.AdamMemberVo; import com.liquidnet.service.adam.dto.vo.AdamMemberVo;
import com.liquidnet.service.adam.entity.AdamMember; import com.liquidnet.service.adam.entity.AdamMember;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@Api(tags = "后台管理:会员信息") @Api(tags = "会员信息")
@Slf4j @Slf4j
@Validated @Validated
@RestController @RestController
@RequestMapping("/admin/member") @RequestMapping("adam/member")
public class AdamMemberAdminController { public class AdamMemberAdminController {
@Autowired @Autowired
IAdamMemberAdminService adamMemberService; IAdamMemberAdminService adamMemberService;
@Autowired @Autowired
IAdamMemberCodeAdminService adamMemberCodeAdminService; IAdamMemberCodeAdminService adamMemberCodeAdminService;
@Autowired
RedisUtil redisUtil;
@ApiOperation(value = "添加会员卡") @ApiOperation(value = "添加会员卡")
@PostMapping("add") @PostMapping("add")
...@@ -54,8 +59,19 @@ public class AdamMemberAdminController { ...@@ -54,8 +59,19 @@ public class AdamMemberAdminController {
return adamMemberService.sync(); return adamMemberService.sync();
} }
@ApiOperation(value = "生成兑换码")
@PostMapping("gen_code") @PostMapping("gen_code")
public ResponseDto<String> genMemberCode(@RequestBody AdamMemberCodeParam parameter) { public ResponseDto<String> genMemberCode(@RequestBody AdamMemberCodeParam parameter) {
return ResponseDto.success(adamMemberCodeAdminService.createGiftCode(parameter)); return ResponseDto.success(adamMemberCodeAdminService.createGiftCode(parameter));
} }
@ApiOperation(value = "开放/限制购买会员")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "int", name = "opt", value = "0-限制|1-开放", example = "0"),
})
@PostMapping("switch/buy")
public ResponseDto<Object> purchaseSwitch(@Max(1) @Min(0) @RequestParam int opt) {
redisUtil.set(AdamRedisConst.SWITCH_BUY_MEMBER, opt);
return ResponseDto.success(redisUtil.get(AdamRedisConst.SWITCH_BUY_MEMBER));
}
} }
...@@ -24,7 +24,7 @@ import java.util.List; ...@@ -24,7 +24,7 @@ import java.util.List;
* @date 2021/6/6 16:52 * @date 2021/6/6 16:52
*/ */
@Controller @Controller
@RequestMapping("/adam/order") @RequestMapping("adam/morder")
public class AdamMemberOrderController extends BaseController public class AdamMemberOrderController extends BaseController
{ {
private String prefix = "zhengzai/adam/order"; private String prefix = "zhengzai/adam/order";
......
...@@ -21,11 +21,11 @@ import javax.validation.constraints.NotBlank; ...@@ -21,11 +21,11 @@ import javax.validation.constraints.NotBlank;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@Api(tags = "后台管理:会员价格") @Api(tags = "会员价格")
@Slf4j @Slf4j
@Validated @Validated
@RestController @RestController
@RequestMapping("admin/member/price") @RequestMapping("adam/mprice")
public class AdamMemberPriceAdminController { public class AdamMemberPriceAdminController {
@Autowired @Autowired
IAdamMemberPriceAdminService adamMemberPriceService; IAdamMemberPriceAdminService adamMemberPriceService;
......
...@@ -6,7 +6,7 @@ import com.liquidnet.client.admin.common.core.domain.AjaxResult; ...@@ -6,7 +6,7 @@ import com.liquidnet.client.admin.common.core.domain.AjaxResult;
import com.liquidnet.client.admin.common.core.page.TableDataInfo; import com.liquidnet.client.admin.common.core.page.TableDataInfo;
import com.liquidnet.client.admin.common.enums.BusinessType; import com.liquidnet.client.admin.common.enums.BusinessType;
import com.liquidnet.client.admin.common.utils.poi.ExcelUtil; import com.liquidnet.client.admin.common.utils.poi.ExcelUtil;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamUserService; import com.liquidnet.client.admin.zhengzai.adam.service.IAdamUserAdminService;
import com.liquidnet.service.adam.entity.AdamUser; import com.liquidnet.service.adam.entity.AdamUser;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -23,13 +23,13 @@ import java.util.List; ...@@ -23,13 +23,13 @@ import java.util.List;
* @date 2021-05-24 * @date 2021-05-24
*/ */
@Controller @Controller
@RequestMapping("/adam/user") @RequestMapping("adam/user")
public class AdamUserController extends BaseController public class AdamUserAdminController extends BaseController
{ {
private String prefix = "zhengzai/adam/user"; private String prefix = "zhengzai/adam/user";
@Autowired @Autowired
private IAdamUserService adamUserService; private IAdamUserAdminService adamUserService;
@RequiresPermissions("adam:user:view") @RequiresPermissions("adam:user:view")
@GetMapping() @GetMapping()
......
package com.liquidnet.client.admin.web.controller.zhengzai.adam;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.base.ResponseDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
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 javax.validation.constraints.NotBlank;
import java.util.ArrayList;
import java.util.List;
@Api(tags = "会员用户")
@Slf4j
@Validated
@RestController
@RequestMapping("adam/umember")
public class AdamUserMemberAdminController {
@Autowired
RedisUtil redisUtil;
@ApiOperation(value = "会员黑名单UID")
@PostMapping("blk/lis")
public ResponseDto<List<String>> listBlack() {
return ResponseDto.success((List<String>) redisUtil.get(AdamRedisConst.BLK_LIST_MEMBER_UID));
}
@ApiOperation(value = "添加会员黑名单")
@PostMapping("blk/add")
public ResponseDto<List<String>> addBlack(@NotBlank @RequestParam String opts) {
String[] uidArr = opts.split(",");
List<String> invalidList = new ArrayList<>(), existList = new ArrayList<>();
for (String uid : uidArr) {
if (StringUtils.isNotBlank(uid) && uid.length() < 64) {
existList.add(uid);
} else {
invalidList.add(uid);
}
}
List<String> blacklist = (List<String>) redisUtil.get(AdamRedisConst.BLK_LIST_MEMBER_UID);
if (CollectionUtils.isEmpty(blacklist)) {
blacklist = existList;
} else {
blacklist.addAll(existList);
}
if (!CollectionUtils.isEmpty(blacklist)) {
redisUtil.set(AdamRedisConst.BLK_LIST_MEMBER_UID, blacklist);
} else {
log.warn("###blacklist.add:failed,invalidList:{},existList:{},opts:{}", invalidList.size(), existList.size(), opts);
}
return ResponseDto.success(invalidList);
}
@ApiOperation(value = "删除会员黑名单")
@PostMapping("blk/del")
public ResponseDto<Object> delBlack(@NotBlank @RequestParam String opts) {
String[] uidArr = opts.split(",");
List<String> blacklist = (List<String>) redisUtil.get(AdamRedisConst.BLK_LIST_MEMBER_UID);
if (!CollectionUtils.isEmpty(blacklist)) {
for (String uid : uidArr) {
blacklist.remove(uid);
}
redisUtil.set(AdamRedisConst.BLK_LIST_MEMBER_UID, blacklist);
}
return ResponseDto.success();
}
}
...@@ -11,7 +11,7 @@ import java.util.List; ...@@ -11,7 +11,7 @@ import java.util.List;
* @author ruoyi * @author ruoyi
* @date 2021-05-24 * @date 2021-05-24
*/ */
public interface IAdamUserService extends IService<AdamUser> public interface IAdamUserAdminService extends IService<AdamUser>
{ {
/** /**
* 查询用户 * 查询用户
......
...@@ -2,7 +2,7 @@ package com.liquidnet.client.admin.zhengzai.adam.service.impl; ...@@ -2,7 +2,7 @@ package com.liquidnet.client.admin.zhengzai.adam.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.client.admin.common.core.text.Convert; import com.liquidnet.client.admin.common.core.text.Convert;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamUserService; import com.liquidnet.client.admin.zhengzai.adam.service.IAdamUserAdminService;
import com.liquidnet.service.adam.entity.AdamUser; import com.liquidnet.service.adam.entity.AdamUser;
import com.liquidnet.service.adam.mapper.AdamUserMapper; import com.liquidnet.service.adam.mapper.AdamUserMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -17,7 +17,7 @@ import java.util.List; ...@@ -17,7 +17,7 @@ import java.util.List;
* @date 2021-05-24 * @date 2021-05-24
*/ */
@Service @Service
public class AdamUserServiceImpl extends ServiceImpl<AdamUserMapper, AdamUser> implements IAdamUserService public class AdamUserAdminServiceImpl extends ServiceImpl<AdamUserMapper, AdamUser> implements IAdamUserAdminService
{ {
@Autowired @Autowired
private AdamUserMapper adamUserMapper; private AdamUserMapper adamUserMapper;
......
...@@ -3,9 +3,9 @@ package com.liquidnet.service.adam.controller; ...@@ -3,9 +3,9 @@ package com.liquidnet.service.adam.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.commons.lang.util.CurrentUtil; import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.vo.AdamMemberSimpleVo; import com.liquidnet.service.adam.dto.vo.AdamMemberSimpleVo;
import com.liquidnet.service.adam.dto.vo.AdamMemberVo; import com.liquidnet.service.adam.dto.vo.AdamMemberVo;
import com.liquidnet.service.adam.dto.vo.AdamUserInfoVo;
import com.liquidnet.service.adam.dto.vo.AdamUserMemberVo; import com.liquidnet.service.adam.dto.vo.AdamUserMemberVo;
import com.liquidnet.service.adam.service.AdamRdmService; import com.liquidnet.service.adam.service.AdamRdmService;
import com.liquidnet.service.adam.service.IAdamUserMemberService; import com.liquidnet.service.adam.service.IAdamUserMemberService;
...@@ -14,14 +14,14 @@ import io.swagger.annotations.Api; ...@@ -14,14 +14,14 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.util.ArrayList;
import java.util.List;
@ApiSupport(order = 10030) @ApiSupport(order = 10030)
@Api(tags = "会员信息") @Api(tags = "会员信息")
...@@ -42,6 +42,8 @@ public class AdamMemberController { ...@@ -42,6 +42,8 @@ public class AdamMemberController {
AdamMemberSimpleVo memberSimpleVo = adamRdmService.getMemberSimpleVo(); AdamMemberSimpleVo memberSimpleVo = adamRdmService.getMemberSimpleVo();
AdamMemberVo memberVo = null; AdamMemberVo memberVo = null;
if (null != memberSimpleVo && null != (memberVo = adamRdmService.getMemberVoByMemberId(memberSimpleVo.getMemberId()))) { if (null != memberSimpleVo && null != (memberVo = adamRdmService.getMemberVoByMemberId(memberSimpleVo.getMemberId()))) {
memberVo.setBuySwitch(adamRdmService.getSwitch(AdamRedisConst.SWITCH_BUY_MEMBER));
memberVo.setPriceVoList(adamRdmService.getMemberPriceVoByMemberId(memberVo.getMemberId())); memberVo.setPriceVoList(adamRdmService.getMemberPriceVoByMemberId(memberVo.getMemberId()));
memberVo.setRightsVoList(adamRdmService.getMemberRightsVoByMemberId(memberVo.getMemberId())); memberVo.setRightsVoList(adamRdmService.getMemberRightsVoByMemberId(memberVo.getMemberId()));
...@@ -61,56 +63,6 @@ public class AdamMemberController { ...@@ -61,56 +63,6 @@ public class AdamMemberController {
return ResponseDto.success(adamRdmService.getMemberAgreement()); return ResponseDto.success(adamRdmService.getMemberAgreement());
} }
@ApiOperationSupport(order = 10)
@ApiOperation(value = "会员黑名单UID")
@PostMapping("blk/lis")
public ResponseDto<List<String>> listBlack() {
return ResponseDto.success(adamRdmService.getBlacklistForMember());
}
@ApiOperationSupport(order = 11)
@ApiOperation(value = "添加会员黑名单")
@PostMapping("blk/add")
public ResponseDto<List<String>> addBlack(@NotBlank @RequestParam String opts) {
String[] uidArr = opts.split(",");
List<String> invalidList = new ArrayList<>(), existList = new ArrayList<>();
for (String uid : uidArr) {
AdamUserInfoVo vo = adamRdmService.getUserInfoVoByUid(uid);
if (null != vo) {
existList.add(uid);
} else {
invalidList.add(uid);
}
}
List<String> blacklist = adamRdmService.getBlacklistForMember();
if (CollectionUtils.isEmpty(blacklist)) {
blacklist = existList;
} else {
blacklist.addAll(existList);
}
if (!CollectionUtils.isEmpty(blacklist)) {
adamRdmService.setBlacklistForMember(blacklist);
} else {
log.warn("###blacklist.add:failed,invalidList:{},existList:{},opts:{}", invalidList.size(), existList.size(), opts);
}
return ResponseDto.success(invalidList);
}
@ApiOperationSupport(order = 12)
@ApiOperation(value = "删除会员黑名单")
@PostMapping("blk/del")
public ResponseDto<Object> delBlack(@NotBlank @RequestParam String opts) {
String[] uidArr = opts.split(",");
List<String> blacklist = adamRdmService.getBlacklistForMember();
if (!CollectionUtils.isEmpty(blacklist)) {
for (String uid : uidArr) {
blacklist.remove(uid);
}
adamRdmService.setBlacklistForMember(blacklist);
}
return ResponseDto.success();
}
/* ------------------------------------------------------------|API */ /* ------------------------------------------------------------|API */
@ApiOperationSupport(order = 99) @ApiOperationSupport(order = 99)
......
...@@ -9,6 +9,7 @@ import com.liquidnet.commons.lang.util.CurrentUtil; ...@@ -9,6 +9,7 @@ import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.HttpUtil; import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.JsonUtils; import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.commons.lang.util.ServletUtils; import com.liquidnet.commons.lang.util.ServletUtils;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.AdamMemberOrderCallbackParam; import com.liquidnet.service.adam.dto.AdamMemberOrderCallbackParam;
import com.liquidnet.service.adam.dto.AdamMemberOrderCodeParam; import com.liquidnet.service.adam.dto.AdamMemberOrderCodeParam;
import com.liquidnet.service.adam.dto.AdamMemberOrderParam; import com.liquidnet.service.adam.dto.AdamMemberOrderParam;
...@@ -88,6 +89,10 @@ public class AdamMemberOrderController { ...@@ -88,6 +89,10 @@ public class AdamMemberOrderController {
return ResponseDto.failure(ErrorMapping.get("10213")); return ResponseDto.failure(ErrorMapping.get("10213"));
} }
if (1 != adamRdmService.getSwitch(AdamRedisConst.SWITCH_BUY_MEMBER)) {
return ResponseDto.failure(ErrorMapping.get("10215"));
}
AdamRealInfoVo realInfoVo = adamRdmService.getRealInfoVoByUid(currentUid); AdamRealInfoVo realInfoVo = adamRdmService.getRealInfoVoByUid(currentUid);
if (null == realInfoVo) { if (null == realInfoVo) {
if (StringUtils.isBlank(param.getName()) || StringUtils.isBlank(param.getIdCard())) { if (StringUtils.isBlank(param.getName()) || StringUtils.isBlank(param.getIdCard())) {
......
...@@ -32,6 +32,11 @@ public class AdamRdmService { ...@@ -32,6 +32,11 @@ public class AdamRdmService {
@Autowired @Autowired
RedisUtil redisUtil; RedisUtil redisUtil;
public Integer getSwitch(String rk) {
Integer i = (Integer) redisUtil.get(rk);
return null == i ? 1 : i;
}
public boolean setUidByMobile(String mobile, String uid) { public boolean setUidByMobile(String mobile, String uid) {
return redisUtil.set(AdamRedisConst.IDENTITY_MOBILE.concat(mobile), uid); return redisUtil.set(AdamRedisConst.IDENTITY_MOBILE.concat(mobile), uid);
} }
......
...@@ -47,7 +47,10 @@ ...@@ -47,7 +47,10 @@
10211=订单不存在 10211=订单不存在
10212=订单状态查询失败 10212=订单状态查询失败
10213=感谢您选择登登登。距您上一次离开不足一年,登登登还没准备好再次邀您加入。不如我们给彼此多一些时间,有缘再相见。 10213=感谢您选择登登登。距您上一次离开不足一年,登登登还没准备好再次邀您加入。不如我们给彼此多一些时间,有缘再相见。
10214=
10215=本次摩登天空会员购买名额已满
10216=
...@@ -55,12 +58,10 @@ ...@@ -55,12 +58,10 @@
10401= 10401=
10500= 10500=
10501=会员订单回调处理失败,该订单不存在 10501=会员订单回调处理失败,该订单不存在
10502=会员订单回调处理失败,该订单已处理 10502=会员订单回调处理失败,该订单已处理
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment