Merge branch 'feature/mall_product' of http://117.33.142.185:3000/zenghuapei/cyywl_server into feature/mall_product

pull/2/head
TianYu 2023-05-19 11:35:20 +08:00
commit 98fc15f45e
27 changed files with 1195 additions and 826 deletions

View File

@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.Map; import java.util.Map;
@ -28,11 +29,12 @@ public class AliPayNotifyController {
@Autowired @Autowired
private StoreOrderService storeOrderService; private StoreOrderService storeOrderService;
@PermitAll
@PostMapping("pay_notify") @PostMapping("pay_notify")
public Object payNotify(HttpServletRequest request, @RequestBody Map<String, String> params) { public Object payNotify(HttpServletRequest request, Map<String, String> params) {
return storeOrderService.aliNotify(request, params); return storeOrderService.aliNotify(request, params);
} }
@PermitAll
@PostMapping("refund_notify") @PostMapping("refund_notify")
public Object refundNotify(HttpServletRequest request, @RequestBody Map<String, String> params) { public Object refundNotify(HttpServletRequest request, @RequestBody Map<String, String> params) {
return storeOrderService.refundNotify(request, params); return storeOrderService.refundNotify(request, params);

View File

@ -89,8 +89,8 @@ public class RechargeOrderController {
@Operation(summary = "获得订单分页") @Operation(summary = "获得订单分页")
@PreAuthorize("@ss.hasPermission('shop:recharge-order:query')") @PreAuthorize("@ss.hasPermission('shop:recharge-order:query')")
public CommonResult<PageResult<RechargeOrderRespVO>> getRechargeOrderPage(@Valid RechargeOrderPageReqVO pageVO) { public CommonResult<PageResult<RechargeOrderRespVO>> getRechargeOrderPage(@Valid RechargeOrderPageReqVO pageVO) {
PageResult<RechargeOrderDO> pageResult = rechargeOrderService.getRechargeOrderPage(pageVO); PageResult<RechargeOrderRespVO> pageResult = rechargeOrderService.getRechargeOrderPage(pageVO);
return success(RechargeOrderConvert.INSTANCE.convertPage(pageResult)); return success(pageResult);
} }

View File

@ -26,6 +26,10 @@ public class RechargeOrderPageReqVO extends PageParam {
@Schema(description = "用户姓名", example = "张三") @Schema(description = "用户姓名", example = "张三")
private String realName; private String realName;
@Schema(description = "推广员名称", example = "张三")
private String nickname;
@Schema(description = "用户电话") @Schema(description = "用户电话")
private String userPhone; private String userPhone;
@ -120,4 +124,5 @@ public class RechargeOrderPageReqVO extends PageParam {
@Schema(description = "第三方支付流水号") @Schema(description = "第三方支付流水号")
private String paySerialNumber; private String paySerialNumber;
} }

View File

@ -15,5 +15,9 @@ public class RechargeOrderRespVO extends RechargeOrderBaseVO {
@Schema(description = "创建时间") @Schema(description = "创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
@Schema(description = "组织名称")
private String parentOrganizationName;
@Schema(description = "推广员名称")
private String nickname;
} }

View File

@ -6,8 +6,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.RechargeOrderDO; import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.RechargeOrderDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.*; import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.*;
import org.apache.ibatis.annotations.Param;
/** /**
* Mapper * Mapper
@ -54,7 +56,7 @@ public interface RechargeOrderMapper extends BaseMapperX<RechargeOrderDO> {
.eqIfPresent(RechargeOrderDO::getPaySerialNumber, reqVO.getPaySerialNumber()) .eqIfPresent(RechargeOrderDO::getPaySerialNumber, reqVO.getPaySerialNumber())
.orderByDesc(RechargeOrderDO::getId)); .orderByDesc(RechargeOrderDO::getId));
} }
IPage<RechargeOrderRespVO> findListPage(IPage<RechargeOrderRespVO> page, @Param("data") RechargeOrderPageReqVO data);
default List<RechargeOrderDO> selectList(RechargeOrderExportReqVO reqVO) { default List<RechargeOrderDO> selectList(RechargeOrderExportReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<RechargeOrderDO>() return selectList(new LambdaQueryWrapperX<RechargeOrderDO>()
.eqIfPresent(RechargeOrderDO::getOrderId, reqVO.getOrderId()) .eqIfPresent(RechargeOrderDO::getOrderId, reqVO.getOrderId())

View File

@ -1166,6 +1166,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
public Object aliNotify(HttpServletRequest request, Map<String, String> params) { public Object aliNotify(HttpServletRequest request, Map<String, String> params) {
boolean verifyResult = false; boolean verifyResult = false;
try { try {
Map<String, String[]> map = request.getParameterMap();
verifyResult = AlipaySignature.rsaCheckV1(params, aliPayProperties.getAlipayPublicKey(), "UTF-8", "RSA2"); verifyResult = AlipaySignature.rsaCheckV1(params, aliPayProperties.getAlipayPublicKey(), "UTF-8", "RSA2");
log.debug("支付宝验证签名结果:{}", verifyResult); log.debug("支付宝验证签名结果:{}", verifyResult);
} catch (AlipayApiException e) { } catch (AlipayApiException e) {

View File

@ -58,7 +58,7 @@ public interface RechargeOrderService {
* @param pageReqVO * @param pageReqVO
* @return * @return
*/ */
PageResult<RechargeOrderDO> getRechargeOrderPage(RechargeOrderPageReqVO pageReqVO); PageResult<RechargeOrderRespVO> getRechargeOrderPage(RechargeOrderPageReqVO pageReqVO);
/** /**
* , Excel * , Excel

View File

@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.shop.response.member.MemberHeadResponse; import cn.iocoder.yudao.module.shop.response.member.MemberHeadResponse;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -80,8 +81,10 @@ public class RechargeOrderServiceImpl implements RechargeOrderService {
} }
@Override @Override
public PageResult<RechargeOrderDO> getRechargeOrderPage(RechargeOrderPageReqVO pageReqVO) { public PageResult<RechargeOrderRespVO> getRechargeOrderPage(RechargeOrderPageReqVO pageReqVO) {
return rechargeOrderMapper.selectPage(pageReqVO); Page<RechargeOrderRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
rechargeOrderMapper.findListPage(page,pageReqVO);
return new PageResult<>(page.getRecords(), page.getTotal());
} }
@Override @Override

View File

@ -56,7 +56,7 @@ public class AliPayStrategy implements IPayStrategy {
request.setBizContent(bizContent.toString()); request.setBizContent(bizContent.toString());
AlipayTradeWapPayResponse response = null; AlipayTradeWapPayResponse response = null;
try { try {
response = alipayClient.pageExecute(request,"get"); response = alipayClient.pageExecute(request);
orderResponse.setBody(response.getBody()); orderResponse.setBody(response.getBody());
} catch (AlipayApiException e) { } catch (AlipayApiException e) {
e.printStackTrace(); e.printStackTrace();

View File

@ -9,4 +9,48 @@
文档可见https://www.iocoder.cn/MyBatis/x-plugins/ 文档可见https://www.iocoder.cn/MyBatis/x-plugins/
--> -->
<select id="findListPage" resultType="cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderRespVO">
select
a.order_id,
a.pay_serial_number,
a.out_trade_no,
a.pay_time,
b.nickname,
a.real_name,
a.uid,
a.user_phone,
a.confirm_phone,
a.pay_type,
a.paid,
d.parent_organization_name
from cy_recharge_order a
left join member_user b on a.promoter_id = b.id
left join member_promoter c on a.promoter_id=c.user_id
left join system_dept d on d.id = c.dept_id
<where>
and a.paid=1
<if test="data.orderId !=null and data.orderId!=''">
and a.order_id like CONCAT('%',#{data.orderId},'%')
</if>
<if test="data.payserialNumber !=null and data.payserialNumber!=''">
and a.pay_serial_number like CONCAT('%',#{data.payserialNumber},'%')
</if>
<if test="data.nickname !=null and data.nickname!=''">
and a.nickname like CONCAT('%',#{data.nickname},'%')
</if>
<if test="data.realName !=null and data.realName!=''">
and a.real_name like CONCAT('%',#{data.realName},'%')
</if>
<if test="data.userPhone !=null and data.userPhone!=''">
and a.user_phone like CONCAT('%',#{data.userPhone},'%')
</if>
<if test="data.payTime !=null ">
and a.pay_time &gt;=#{data.payTime[0]}
</if>
<if test="data.payTime !=null ">
and a.pay_time &lt;=#{data.payTime[1]}
</if>
</where>
</select>
</mapper> </mapper>

View File

@ -209,7 +209,7 @@ ali:
merchantPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCAhydIKD244uxHaCAE8N4KA0kfK2UkhXayUwarvc09s/JHC7WkrtwgmeHx+JyFA/QQA1WHQREJ8jyS9HrgasmmA+BaE0vGwbu/c0R4Cde5dLeITZb4w4X1RlH+xjtF34pKLH3oVi29q9jUTRii41eCBeztL/XcbJDsxAnCNnuxcak0gk4cl8j9aoMBP/opIc5sTDSqYFSSTDSMPGh90M6KowFtCHyVZxEszcIRX9cRIuf9KtfGvBzljJMjNGshIMuaHVCFpy72E0s50HmMxC4Kodhp6HEdLV1GUBZy87PYiKTqp9WVn0CndzcfmmdUUXVUvqWPKzRN3YSxExJ0Z5KFAgMBAAECggEABovbulciXaphMnnhN581D/l+3fGN40BQ/WAxNMokDAKAUpIMHGkzmQ19bp+lCTlcUvx4fL0ZqxIFd86v+4I05xnHcY8OCv+PGn86e4q0zCNfvbeF+wGqbwW342whVLvABWsitpS9G64HCzkqChHeQScgHCyXLzTwZL7PaG7x+eWnQ3WyA5KlCpUQWOz6OBPD7flkaflVRbDDZqmhcpEwwSXC9vSQb5+E0BZ118+5nJA65Wi/EPtqCzWX4k6ioiQcN5OeJrScZ4fnQm4h4j+TRLeKqkAKCZFpAZcB7RERxA/4Mzz9mEzHOBzSbrUU+miJ3oSkd4S4ldrOZU4EVkI1AQKBgQDe5t+Qij0hOPQaMpiM2hiQnMAI3TzHRbrYf6JUlMqdzad9oasY2ap+iit60TD9OLwjRGzjy7S9WL2bUgmmU4/sOjR0NMl8z3iUTYun6EubNoMUiu9UhQXBThxBCZv/H2agJ4Uswq2lBjUuGyp383lj9qSkScngGknYgrUd/pUa5QKBgQCTnNzCsIU/1N3fhzpvh1RmUwz8JalcmPNxQqrxE53Je+hVQ4BoeVMCov8U62TjBrxmHFEDVwXqAlRUUOWsWu4ac7V/VvFlwQoqPjkjNteOW6aO+BMDAlb2FVg5GzFy/MvLw4EUtU/Sx8EmWZpyaIzjRV4IUHx4WzJoORKEUIH/IQKBgQCh+9F37p3h6Murxh0KLuwvG1qKlow2nDveXVKQeNiNuQgAyl3WX0gBUVOrmx4oxvQiBPXEzSJ5f2W62/FbR9qNZvb7g+jwpK0RyRC2Yp+fGgxD/3tRRqIaCjOKJ/uPeThRJqcnEgqypEI9UUyZgvwyYuje4yirjS8hAkuwknO06QKBgHH4tnbX5jovuBPDjHnaSm8rBqaUyZxGOAimCehTVgvgULWshbOkoVQy17KmQWIMrGBG0sI6acWRgN0NDRgzqQ3hcyxby8zd7GRLYMBwsqQm3YYbwkobf1tHhbOp7Fc1GoE8dSixCW3cb6SVoGtfkBBWWdEfm8st1tCj6EkjBAwhAoGAShd1PY/QOEJ6Cj9IDXvD25DAh0dKs54PRxENetbIxPgYpH7db6n/smmbwM69U4TXZyFfqme1Bc0JwM2J7D6gs4OV88AhXJvfj091eJQhYC5e80Eo8dySserwLp8/ka6FV/EFUplg/DD4JR/jbVzO2fbOPCLm6I+sZqG3K7mg6IM= merchantPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCAhydIKD244uxHaCAE8N4KA0kfK2UkhXayUwarvc09s/JHC7WkrtwgmeHx+JyFA/QQA1WHQREJ8jyS9HrgasmmA+BaE0vGwbu/c0R4Cde5dLeITZb4w4X1RlH+xjtF34pKLH3oVi29q9jUTRii41eCBeztL/XcbJDsxAnCNnuxcak0gk4cl8j9aoMBP/opIc5sTDSqYFSSTDSMPGh90M6KowFtCHyVZxEszcIRX9cRIuf9KtfGvBzljJMjNGshIMuaHVCFpy72E0s50HmMxC4Kodhp6HEdLV1GUBZy87PYiKTqp9WVn0CndzcfmmdUUXVUvqWPKzRN3YSxExJ0Z5KFAgMBAAECggEABovbulciXaphMnnhN581D/l+3fGN40BQ/WAxNMokDAKAUpIMHGkzmQ19bp+lCTlcUvx4fL0ZqxIFd86v+4I05xnHcY8OCv+PGn86e4q0zCNfvbeF+wGqbwW342whVLvABWsitpS9G64HCzkqChHeQScgHCyXLzTwZL7PaG7x+eWnQ3WyA5KlCpUQWOz6OBPD7flkaflVRbDDZqmhcpEwwSXC9vSQb5+E0BZ118+5nJA65Wi/EPtqCzWX4k6ioiQcN5OeJrScZ4fnQm4h4j+TRLeKqkAKCZFpAZcB7RERxA/4Mzz9mEzHOBzSbrUU+miJ3oSkd4S4ldrOZU4EVkI1AQKBgQDe5t+Qij0hOPQaMpiM2hiQnMAI3TzHRbrYf6JUlMqdzad9oasY2ap+iit60TD9OLwjRGzjy7S9WL2bUgmmU4/sOjR0NMl8z3iUTYun6EubNoMUiu9UhQXBThxBCZv/H2agJ4Uswq2lBjUuGyp383lj9qSkScngGknYgrUd/pUa5QKBgQCTnNzCsIU/1N3fhzpvh1RmUwz8JalcmPNxQqrxE53Je+hVQ4BoeVMCov8U62TjBrxmHFEDVwXqAlRUUOWsWu4ac7V/VvFlwQoqPjkjNteOW6aO+BMDAlb2FVg5GzFy/MvLw4EUtU/Sx8EmWZpyaIzjRV4IUHx4WzJoORKEUIH/IQKBgQCh+9F37p3h6Murxh0KLuwvG1qKlow2nDveXVKQeNiNuQgAyl3WX0gBUVOrmx4oxvQiBPXEzSJ5f2W62/FbR9qNZvb7g+jwpK0RyRC2Yp+fGgxD/3tRRqIaCjOKJ/uPeThRJqcnEgqypEI9UUyZgvwyYuje4yirjS8hAkuwknO06QKBgHH4tnbX5jovuBPDjHnaSm8rBqaUyZxGOAimCehTVgvgULWshbOkoVQy17KmQWIMrGBG0sI6acWRgN0NDRgzqQ3hcyxby8zd7GRLYMBwsqQm3YYbwkobf1tHhbOp7Fc1GoE8dSixCW3cb6SVoGtfkBBWWdEfm8st1tCj6EkjBAwhAoGAShd1PY/QOEJ6Cj9IDXvD25DAh0dKs54PRxENetbIxPgYpH7db6n/smmbwM69U4TXZyFfqme1Bc0JwM2J7D6gs4OV88AhXJvfj091eJQhYC5e80Eo8dySserwLp8/ka6FV/EFUplg/DD4JR/jbVzO2fbOPCLm6I+sZqG3K7mg6IM=
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgIcnSCg9uOLsR2ggBPDeCgNJHytlJIV2slMGq73NPbPyRwu1pK7cIJnh8fichQP0EANVh0ERCfI8kvR64GrJpgPgWhNLxsG7v3NEeAnXuXS3iE2W+MOF9UZR/sY7Rd+KSix96FYtvavY1E0YouNXggXs7S/13GyQ7MQJwjZ7sXGpNIJOHJfI/WqDAT/6KSHObEw0qmBUkkw0jDxofdDOiqMBbQh8lWcRLM3CEV/XESLn/SrXxrwc5YyTIzRrISDLmh1Qhacu9hNLOdB5jMQuCqHYaehxHS1dRlAWcvOz2Iik6qfVlZ9Ap3c3H5pnVFF1VL6ljys0Td2EsRMSdGeShQIDAQAB alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgIcnSCg9uOLsR2ggBPDeCgNJHytlJIV2slMGq73NPbPyRwu1pK7cIJnh8fichQP0EANVh0ERCfI8kvR64GrJpgPgWhNLxsG7v3NEeAnXuXS3iE2W+MOF9UZR/sY7Rd+KSix96FYtvavY1E0YouNXggXs7S/13GyQ7MQJwjZ7sXGpNIJOHJfI/WqDAT/6KSHObEw0qmBUkkw0jDxofdDOiqMBbQh8lWcRLM3CEV/XESLn/SrXxrwc5YyTIzRrISDLmh1Qhacu9hNLOdB5jMQuCqHYaehxHS1dRlAWcvOz2Iik6qfVlZ9Ap3c3H5pnVFF1VL6ljys0Td2EsRMSdGeShQIDAQAB
gatewayUrl: https://openapi.alipay.com/gateway.do gatewayUrl: https://openapi.alipay.com/gateway.do
notify-url: http://yuxy.perrymake.com/app-api/pay/ali/pay_notify notify-url: http://yuxy.perrymake.com/admin-api/notify/ali/pay_notify
# 芋道配置项,设置当前项目所有自定义的配置 # 芋道配置项,设置当前项目所有自定义的配置
yudao: yudao:
captcha: captcha:

View File

@ -146,7 +146,8 @@ yudao:
- /admin-api/pay/notify/callback/* # 支付回调通知,不携带租户编号 - /admin-api/pay/notify/callback/* # 支付回调通知,不携带租户编号
- /jmreport/* # 积木报表,无法携带租户编号 - /jmreport/* # 积木报表,无法携带租户编号
- /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,无法携带租户编号 - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,无法携带租户编号
- /admin-api/notify/wxpay/** - /admin-api/notify/wxpay/** # 微信公众号开放平台,微信支付回调接口,无法携带租户编号
- /admin-api/notify/ali/pay_notify #支付宝回调
ignore-tables: ignore-tables:
- system_tenant - system_tenant
- system_tenant_package - system_tenant_package

View File

@ -84,6 +84,9 @@ export const DICT_TYPE = {
PROMOTION_COUPON_TAKE_TYPE: 'promotion_coupon_take_type', // 优惠劵的领取方式 PROMOTION_COUPON_TAKE_TYPE: 'promotion_coupon_take_type', // 优惠劵的领取方式
PROMOTION_ACTIVITY_STATUS: 'promotion_activity_status', // 优惠活动的状态 PROMOTION_ACTIVITY_STATUS: 'promotion_activity_status', // 优惠活动的状态
PROMOTION_CONDITION_TYPE: 'promotion_condition_type', // 营销的条件类型枚举 PROMOTION_CONDITION_TYPE: 'promotion_condition_type', // 营销的条件类型枚举
PAY_TYPE:'pay_type'
} }
/** /**

View File

@ -3,15 +3,24 @@
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="订单号" prop="orderId"> <el-form-item label="订单号" prop="orderId">
<el-input v-model="queryParams.orderId" placeholder="请输入订单号" clearable @keyup.enter.native="handleQuery"/> <el-input v-model="queryParams.orderId" placeholder="请输入订单号" clearable @keyup.enter.native="handleQuery"/>
</el-form-item> </el-form-item>
<el-form-item label="交易流水号" prop="paySerialNumber">
<el-form-item label="用户姓名" prop="realName"> <el-input v-model="queryParams.paySerialNumber" placeholder="请输入交易流水号" clearable @keyup.enter.native="handleQuery"/>
<el-input v-model="queryParams.realName" placeholder="请输入用户姓名" clearable @keyup.enter.native="handleQuery"/>
</el-form-item> </el-form-item>
<el-form-item label="用户电话" prop="userPhone"> <el-form-item label="下单时间" prop="payTime">
<el-input v-model="queryParams.userPhone" placeholder="请输入用户电话" clearable @keyup.enter.native="handleQuery"/> <el-date-picker v-model="queryParams.payTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="推广员" prop="nickname">
<el-input v-model="queryParams.nickname" placeholder="请输入推广员" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="会员名称" prop="realName">
<el-input v-model="queryParams.realName" placeholder="请输入会员名称" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="充值号码" prop="userPhone">
<el-input v-model="queryParams.userPhone" placeholder="请输入充值号码" clearable @keyup.enter.native="handleQuery"/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery"></el-button> <el-button type="primary" icon="el-icon-search" @click="handleQuery"></el-button>
@ -21,10 +30,10 @@
<!-- 操作工具栏 --> <!-- 操作工具栏 -->
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <!-- <el-col :span="1.5">-->
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" <!-- <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"-->
v-hasPermi="['shop:recharge-order:create']">新增</el-button> <!-- v-hasPermi="['shop:recharge-order:create']">新增</el-button>-->
</el-col> <!-- </el-col>-->
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading" <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
v-hasPermi="['shop:recharge-order:export']">导出</el-button> v-hasPermi="['shop:recharge-order:export']">导出</el-button>
@ -34,62 +43,32 @@
<!-- 列表 --> <!-- 列表 -->
<el-table v-loading="loading" :data="list"> <el-table v-loading="loading" :data="list">
<el-table-column label="订单ID" align="center" prop="id" /> <el-table-column label="订单编号" align="center" prop="orderId" />
<el-table-column label="订单号" align="center" prop="orderId" /> <el-table-column label="交易流水号" align="center" prop="paySerialNumber" />
<el-table-column label="用户id" align="center" prop="uid" /> <el-table-column label="订单支付时间" align="center" prop="payTime" width="180"/>
<el-table-column label="用户姓名" align="center" prop="realName" /> <el-table-column label="推广员" align="center" prop="parentOrganizationName" >
<el-table-column label="用户电话" align="center" prop="userPhone" /> <template v-slot="scope">
<el-table-column label="确认手机号" align="center" prop="confirmPhone" /> <span>{{ scope.row.parentOrganizationName }}-{{ scope.row.nickname }}</span>
<el-table-column label="订单商品总数" align="center" prop="totalNum" /> </template>
<el-table-column label="订单总价" align="center" prop="totalPrice" /> </el-table-column>
<el-table-column label="实际支付金额" align="center" prop="payPrice" /> <el-table-column label="会员名称" align="center" prop="realName" />
<el-table-column label="会员账号" align="center" prop="uid" />
<el-table-column label="充值号码" align="center" prop="userPhone" />
<el-table-column label="确认号码" align="center" prop="confirmPhone" />
<el-table-column label="订单总价(元)" align="center" prop="totalPrice" />
<el-table-column label="实际金额(元)" align="center" prop="payPrice" />
<el-table-column label="支付方式" align="center" prop="payType" >
<template v-slot="scope">
<dict-tag :type="DICT_TYPE.PAY_TYPE" :value="scope.row.payType"/>
</template>
</el-table-column>
<el-table-column label="支付状态" align="center" prop="paid" /> <el-table-column label="支付状态" align="center" prop="paid" />
<el-table-column label="支付截止时间" align="center" prop="payTime" width="180">
<template v-slot="scope">
<span>{{ parseTime(scope.row.payTime) }}</span>
</template>
</el-table-column>
<el-table-column label="支付截止时间" align="center" prop="payEndTime" width="180">
<template v-slot="scope">
<span>{{ parseTime(scope.row.payEndTime) }}</span>
</template>
</el-table-column>
<el-table-column label="支付方式" align="center" prop="payType" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template v-slot="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="订单状态0待发货1待收货2已收货待评价3已完成" align="center" prop="status" />
<el-table-column label="0 未退款 1 申请中 2 已退款 3 退款中" align="center" prop="refundStatus" />
<el-table-column label="退款图片" align="center" prop="refundReasonWapImg" />
<el-table-column label="退款用户说明" align="center" prop="refundReasonWapExplain" />
<el-table-column label="前台退款原因" align="center" prop="refundReasonWap" />
<el-table-column label="不退款的理由" align="center" prop="refundReason" />
<el-table-column label="退款时间" align="center" prop="refundReasonTime" width="180">
<template v-slot="scope">
<span>{{ parseTime(scope.row.refundReasonTime) }}</span>
</template>
</el-table-column>
<el-table-column label="退款金额" align="center" prop="refundPrice" />
<el-table-column label="备注" align="center" prop="mark" />
<el-table-column label="管理员备注" align="center" prop="remark" />
<el-table-column label="成本价" align="center" prop="cost" />
<el-table-column label="支付渠道(0微信公众号1微信小程序2余额)" align="center" prop="isChannel" />
<el-table-column label="消息提醒" align="center" prop="isRemind" />
<el-table-column label="后台是否删除" align="center" prop="isSystemDel" />
<el-table-column label="订单类型:0-普通订单1-视频号订单" align="center" prop="type" />
<el-table-column label="商品总价" align="center" prop="proTotalPrice" />
<el-table-column label="改价前支付金额" align="center" prop="beforePayPrice" />
<el-table-column label="是否改价,0-否1-是" align="center" prop="isAlterPrice" />
<el-table-column label="商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号" align="center" prop="outTradeNo" />
<el-table-column label="第三方支付流水号" align="center" prop="paySerialNumber" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template v-slot="scope"> <template v-slot="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['shop:recharge-order:update']">修改</el-button> v-hasPermi="['shop:recharge-order:update']">发起退款</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['shop:recharge-order:delete']">删除</el-button> v-hasPermi="['shop:recharge-order:delete']">同意退款</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -97,131 +76,21 @@
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
@pagination="getList"/> @pagination="getList"/>
<!-- 对话框(添加 / 修改) -->
<el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="订单号" prop="orderId">
<el-input v-model="form.orderId" placeholder="请输入订单号" />
</el-form-item>
<el-form-item label="用户id" prop="uid">
<el-input v-model="form.uid" placeholder="请输入用户id" />
</el-form-item>
<el-form-item label="用户姓名" prop="realName">
<el-input v-model="form.realName" placeholder="请输入用户姓名" />
</el-form-item>
<el-form-item label="用户电话" prop="userPhone">
<el-input v-model="form.userPhone" placeholder="请输入用户电话" />
</el-form-item>
<el-form-item label="确认手机号" prop="confirmPhone">
<el-input v-model="form.confirmPhone" placeholder="请输入确认手机号" />
</el-form-item>
<el-form-item label="订单商品总数" prop="totalNum">
<el-input v-model="form.totalNum" placeholder="请输入订单商品总数" />
</el-form-item>
<el-form-item label="订单总价" prop="totalPrice">
<el-input v-model="form.totalPrice" placeholder="请输入订单总价" />
</el-form-item>
<el-form-item label="实际支付金额" prop="payPrice">
<el-input v-model="form.payPrice" placeholder="请输入实际支付金额" />
</el-form-item>
<el-form-item label="支付状态" prop="paid">
<el-input v-model="form.paid" placeholder="请输入支付状态" />
</el-form-item>
<el-form-item label="支付截止时间" prop="payTime">
<el-date-picker clearable v-model="form.payTime" type="date" value-format="timestamp" placeholder="选择支付截止时间" />
</el-form-item>
<el-form-item label="支付截止时间" prop="payEndTime">
<el-date-picker clearable v-model="form.payEndTime" type="date" value-format="timestamp" placeholder="选择支付截止时间" />
</el-form-item>
<el-form-item label="支付方式" prop="payType">
<el-select v-model="form.payType" placeholder="请选择支付方式">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="订单状态0待发货1待收货2已收货待评价3已完成" prop="status">
<el-radio-group v-model="form.status">
<el-radio label="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="0 未退款 1 申请中 2 已退款 3 退款中" prop="refundStatus">
<el-radio-group v-model="form.refundStatus">
<el-radio label="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="退款图片" prop="refundReasonWapImg">
<el-input v-model="form.refundReasonWapImg" placeholder="请输入退款图片" />
</el-form-item>
<el-form-item label="退款用户说明" prop="refundReasonWapExplain">
<el-input v-model="form.refundReasonWapExplain" placeholder="请输入退款用户说明" />
</el-form-item>
<el-form-item label="前台退款原因" prop="refundReasonWap">
<el-input v-model="form.refundReasonWap" placeholder="请输入前台退款原因" />
</el-form-item>
<el-form-item label="不退款的理由" prop="refundReason">
<el-input v-model="form.refundReason" placeholder="请输入不退款的理由" />
</el-form-item>
<el-form-item label="退款时间" prop="refundReasonTime">
<el-date-picker clearable v-model="form.refundReasonTime" type="date" value-format="timestamp" placeholder="选择退款时间" />
</el-form-item>
<el-form-item label="退款金额" prop="refundPrice">
<el-input v-model="form.refundPrice" placeholder="请输入退款金额" />
</el-form-item>
<el-form-item label="备注" prop="mark">
<el-input v-model="form.mark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="管理员备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入管理员备注" />
</el-form-item>
<el-form-item label="成本价" prop="cost">
<el-input v-model="form.cost" placeholder="请输入成本价" />
</el-form-item>
<el-form-item label="支付渠道(0微信公众号1微信小程序2余额)" prop="isChannel">
<el-input v-model="form.isChannel" placeholder="请输入支付渠道(0微信公众号1微信小程序2余额)" />
</el-form-item>
<el-form-item label="消息提醒" prop="isRemind">
<el-input v-model="form.isRemind" placeholder="请输入消息提醒" />
</el-form-item>
<el-form-item label="后台是否删除" prop="isSystemDel">
<el-radio-group v-model="form.isSystemDel">
<el-radio label="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="订单类型:0-普通订单1-视频号订单" prop="type">
<el-select v-model="form.type" placeholder="请选择订单类型:0-普通订单1-视频号订单">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="商品总价" prop="proTotalPrice">
<el-input v-model="form.proTotalPrice" placeholder="请输入商品总价" />
</el-form-item>
<el-form-item label="改价前支付金额" prop="beforePayPrice">
<el-input v-model="form.beforePayPrice" placeholder="请输入改价前支付金额" />
</el-form-item>
<el-form-item label="是否改价,0-否1-是" prop="isAlterPrice">
<el-radio-group v-model="form.isAlterPrice">
<el-radio label="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号" prop="outTradeNo">
<el-input v-model="form.outTradeNo" placeholder="请输入商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号" />
</el-form-item>
<el-form-item label="第三方支付流水号" prop="paySerialNumber">
<el-input v-model="form.paySerialNumber" placeholder="请输入第三方支付流水号" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { createRechargeOrder, updateRechargeOrder, deleteRechargeOrder, getRechargeOrder, getRechargeOrderPage, exportRechargeOrderExcel } from "@/api/shop/rechargeOrder"; import { createRechargeOrder, updateRechargeOrder, deleteRechargeOrder, getRechargeOrder, getRechargeOrderPage, exportRechargeOrderExcel } from "@/api/shop/rechargeOrder";
import {DICT_TYPE} from "@/utils/dict";
export default { export default {
name: "RechargeOrder", name: "RechargeOrder",
computed: {
DICT_TYPE() {
return DICT_TYPE
}
},
components: { components: {
}, },
data() { data() {
@ -246,6 +115,7 @@ export default {
pageSize: 10, pageSize: 10,
orderId: null, orderId: null,
uid: null, uid: null,
nickname:null,
realName: null, realName: null,
userPhone: null, userPhone: null,
confirmPhone: null, confirmPhone: null,

View File

@ -17,7 +17,9 @@
mapActions, mapActions,
mapGetters mapGetters
} from 'vuex' } from 'vuex'
import {
memberGradeInfo
} from '@/api/member.js';
export default { export default {
globalData: { globalData: {
spid: 0, spid: 0,
@ -29,6 +31,16 @@
id: 0 id: 0
}, },
onLaunch: function(option) { onLaunch: function(option) {
const res = memberGradeInfo().then((res) =>{
if(res.data.some((item) => !!!parseInt(item.isExist))){
uni.setTabBarItem({
index: 2,
text: 'text',
pagePath: '/pages/member_equity/index'
})
}
})
let that = this; let that = this;
// #ifdef H5 // #ifdef H5
uni.getSystemInfo({ uni.getSystemInfo({

View File

@ -1,144 +1,166 @@
<template> <template>
<view class="box"> <view class="box">
<image class="phone-money" src='../../static/images/phoneMoney.png'></image>
<view class="box-member"> <view class="box-member">
<view :class="[activeIndex.includes(index) && 'member-active',!!parseInt(item.isExist) && 'member-disbled', 'member-item']" v-for="(item,index) in memberData" :key="index" @click="handleMember(item,index)"> <view class="box-title">
<view class="member-image"> <image src='../../static/images/memberTitle.png'></image>
<image src='../../static/images/f.png'></image> </view>
</view> <view class="member-list">
<view class="member-text"> <view
<view class="text-title"> :class="[activeIndex.includes(index) && 'member-active',!!parseInt(item.isExist) && 'member-disbled', 'member-item']"
<text>{{item.name.split('得')[0]}}<text>{{item.name.split('得')[1]}}</text></text> v-for="(item,index) in memberData" :key="index" @click="handleMember(item,index)">
<view></view> <view class="member-image">
<image src='../../static/images/f.png'></image>
</view>
<view class="member-text">
<view class="text-title">
<text>{{item.name.split('得')[0]}}<text>{{item.name.split('得')[1]}}</text></text>
<view></view>
</view>
<text class="text-content">{{item.gearRemarks}}</text>
</view> </view>
<text class="text-content">{{item.gearRemarks}}</text>
</view> </view>
</view> </view>
</view> </view>
<view class="box-privilege"> <view class="box-privilege">
<view class="privilege-item" v-for="(item,index) in 4" :key="index"> <view class="box-title">
<image src='../../static/images/f.png'></image> <image src='../../static/images/memberTitle.png'></image>
<text class="privilege-text"> </view>
开通立享大额话费返送 <view class="privilege-list">
</text> <view class="privilege-item" v-for="(item,index) in 4" :key="index">
<image src='../../static/images/vip1.png'></image>
<text class="privilege-text">
开通立享大额话费返送
</text>
</view>
</view> </view>
</view> </view>
<paymentMember :payMode='payMode' :pay_close="pay_close" @onChangeFun='onChangeFun' :payInfo="payInfo"></paymentMember> <paymentMember :payMode='payMode' :pay_close="pay_close" @onChangeFun='onChangeFun' :payInfo="payInfo">
</paymentMember>
<button class="box-submit" @click="goPay"></button> <button class="box-submit" @click="goPay"></button>
</view> </view>
</template> </template>
<script> <script>
import { import {
memberGradeInfo memberGradeInfo
} from '@/api/member.js'; } from '@/api/member.js';
import paymentMember from '@/components/paymentMember'; import paymentMember from '@/components/paymentMember';
import store from '@/store/index'; import store from '@/store/index';
export default { export default {
name: "member_application", name: "member_application",
components: { components: {
paymentMember paymentMember
}, },
data() { data() {
return { return {
memberData:[], memberData: [],
payInfo:{ payInfo: {
userPhone: '', userPhone: '',
confirmPhone: '', confirmPhone: '',
orderInfos: [] orderInfos: []
}, },
payMode: [{ payMode: [{
name: "微信支付", name: "微信支付",
icon: "icon-weixinzhifu", icon: "icon-weixinzhifu",
value: 'WXPAY', value: 'WXPAY',
title: '微信快捷支付' title: '微信快捷支付'
}, },
{ {
name: "支付宝", name: "支付宝",
icon: "icon-zhifubao", icon: "icon-zhifubao",
value: 'ALIPAY', value: 'ALIPAY',
title: '支付宝快捷支付' title: '支付宝快捷支付'
} }
], ],
pay_close: false, pay_close: false,
activeIndex:[], activeIndex: [],
form: { form: {
phone:'' phone: ''
}, },
}; };
}, },
async onLoad() { async onLoad() {
const res = await memberGradeInfo() // uni.setTabBarItem({
this.memberData = res.data // index: 2,
// text: 'text',
// pagePath: '/pages/member_equity/index'
// })
// uni.switchTab({
// url:'/pages/member_equity/index'
// })
const res = await memberGradeInfo()
this.memberData = res.data
}, },
methods: { methods: {
handleMember(value,index){ handleMember(value, index) {
if(!!parseInt(value.isExist)) return if (!!parseInt(value.isExist)) return
if(this.activeIndex.includes(index)){ if (this.activeIndex.includes(index)) {
this.activeIndex = this.activeIndex.filter(item => item !== index) this.activeIndex = this.activeIndex.filter(item => item !== index)
}else{ } else {
this.activeIndex.push(index) this.activeIndex.push(index)
} }
}, },
/** /**
* 打开支付组件 * 打开支付组件
* *
*/ */
goPay() { goPay() {
if(this.activeIndex.length){ if (this.activeIndex.length) {
this.$set(this, 'pay_close', true); this.$set(this, 'pay_close', true);
const orderInfos = this.activeIndex.map((item) => { const orderInfos = this.activeIndex.map((item) => {
return { return {
...this.memberData[item], ...this.memberData[item],
gearId:this.memberData[item].id gearId: this.memberData[item].id
}
})
this.payInfo = {
userPhone: store.state.app.userInfo.mobile,
orderInfos
}
} }
}) },
this.payInfo = { /**
userPhone: store.state.app.userInfo.mobile, * 事件回调
orderInfos *
} */
}
},
/**
* 事件回调
*
*/
onChangeFun: function(e) {
let opt = e;
let action = opt.action || null;
let value = opt.value != undefined ? opt.value : null;
(action && this[action]) && this[action](value);
},
/**
* 关闭支付组件
*
*/
payClose: function() {
this.pay_close = false;
},
/**
* 支付成功回调
*
*/
pay_complete: function() {
this.status = false;
this.page = 1;
this.$set(this, 'bargain', []);
this.$set(this, 'pay_close', false);
this.getBargainUserList();
},
/**
* 支付失败回调
*
*/
pay_fail: function() {
this.pay_close = false;
},
onChangeFun: function(e) { onChangeFun: function(e) {
let opt = e; let opt = e;
let action = opt.action || null; let action = opt.action || null;
let value = opt.value != undefined ? opt.value : null; let value = opt.value != undefined ? opt.value : null;
(action && this[action]) && this[action](value); (action && this[action]) && this[action](value);
},
/**
* 关闭支付组件
*
*/
payClose: function() {
this.pay_close = false;
},
/**
* 支付成功回调
*
*/
pay_complete: function() {
this.status = false;
this.page = 1;
this.$set(this, 'bargain', []);
this.$set(this, 'pay_close', false);
this.getBargainUserList();
},
/**
* 支付失败回调
*
*/
pay_fail: function() {
this.pay_close = false;
},
onChangeFun: function(e) {
let opt = e;
let action = opt.action || null;
let value = opt.value != undefined ? opt.value : null;
(action && this[action]) && this[action](value);
}, },
} }
}; };
@ -146,158 +168,261 @@ import store from '@/store/index';
<style lang="scss" scoped> <style lang="scss" scoped>
.box { .box {
padding: 0 40rpx; position: relative;
padding: 207rpx 40rpx 0 40rpx;
height: 100vh;
background: url(../../static/images/bg.png);
background-size: cover;
background-repeat: no-repeat;
background-attachment: fixed;
.phone-money {
width: 604rpx;
height: 140rpx;
position: absolute;
top: 2%;
left: 15%;
}
.box-member { .box-member {
border-radius: 20rpx; box-shadow: 0px 0px 15px -5px #000;
width: 100%; width: 100%;
margin-top: 207rpx; border-radius: 20px;
padding: 83rpx 30rpx 30rpx 30rpx; box-sizing: border-box;
background: linear-gradient(#FFD55D,#FD752F); border: 1px solid transparent;
background-image: linear-gradient(#FFD55D, #FD752F),
linear-gradient(to bottom, #FFD55D, #FDCB3B);
background-origin: border-box;
background-clip: content-box, border-box;
border-radius: 20px;
position: relative;
.member-item { .box-title {
display: flex; position: absolute;
justify-content: space-between; top: -5.5%;
background: #fff; left: -203rpx;
margin-bottom: 20rpx; margin-left: 50%;
padding: 30rpx 20rpx 27rpx 20rpx;
border-radius: 20rpx;
.member-image { image {
width: 104rpx; width: 406rpx;
height: 104rpx; height: 87rpx;
border-radius: 35rpx; position: relative;
background: linear-gradient(#FFEBB2,#FDCB3B); display: flex;
padding: 20rpx; align-items: center;
justify-content: center;
image {
width: 100%; &::before {
height: 100%; content: '会员详情介绍';
} position: absolute;
} font-size: 34rpx;
font-family: Adobe Heiti Std;
.member-text { font-weight: normal;
color: #FF4B47;
text-shadow: 1px 5px 5px rgba(255, 195, 30, 0.78);
}
}
}
.member-list {
margin: 83rpx 30rpx 30rpx 30rpx;
position: relative;
.member-item {
padding: 30rpx 20rpx 27rpx 20rpx;
display: flex; display: flex;
flex-direction: column;
justify-content: space-between; justify-content: space-between;
flex: .9; background: #fff;
margin-bottom: 20rpx;
border-radius: 20rpx;
.text-title { .member-image {
margin-top: -14rpx; width: 104rpx;
font-size: 32rpx; height: 104rpx;
font-weight: bolder; border-radius: 35rpx;
transform: skew(-6deg, 0); background: linear-gradient(#FFEBB2, #FDCB3B);
padding: 20rpx;
image {
width: 100%;
height: 100%;
}
}
.member-text {
display: flex; display: flex;
flex-direction: column;
justify-content: space-between; justify-content: space-between;
text{ flex: .9;
text{
color: #C80D00;
}
}
view{
width: 18rpx;
height: 6rpx;
background: #FEAC49;
border-radius: 3rpx;
}
}
.text-content { .text-title {
font-size: 24rpx; margin-top: -14rpx;
color: #747474; font-size: 32rpx;
} font-weight: bolder;
} transform: skew(-6deg, 0);
} display: flex;
.member-active{ justify-content: space-between;
transition: .3s;
background: linear-gradient(#FF995F,#DA0E00);
.member-image { text {
background: linear-gradient(#FF995F,#DA0E00); text {
} color: #C80D00;
.member-text {
.text-title {
text{
color: #fff;
text{
color: rgb(223,208,42);
} }
}
view{
background: #fff;
} }
}
.text-content { view {
color: #fff; width: 18rpx;
height: 6rpx;
background: #FEAC49;
border-radius: 3rpx;
}
}
.text-content {
font-size: 24rpx;
color: #747474;
}
} }
} }
}
.member-disbled{ .member-active {
transition: .3s; transition: .3s;
background: linear-gradient(#EFEFEF,#BCBCBC); background: linear-gradient(#FF995F, #DA0E00);
.member-image { .member-image {
background: linear-gradient(#AAAAAA,#989898); background: linear-gradient(#FF995F, #FDCB3B);
}
.member-text {
.text-title {
text {
color: #fff;
text {
color: rgb(223, 208, 42);
}
}
view {
background: #fff;
}
}
.text-content {
color: #fff;
}
}
} }
.member-text { .member-disbled {
.text-title { transition: .3s;
text{ background: linear-gradient(#EFEFEF, #BCBCBC);
color: #868585;
text{ .member-image {
background: linear-gradient(#AAAAAA, #989898);
}
.member-text {
.text-title {
text {
color: #868585;
text {
color: #868585; color: #868585;
} }
}
view{
background: #fff;
} }
}
.text-content { view {
color: #5C5C5C; background: #fff;
}
}
.text-content {
color: #5C5C5C;
}
} }
} }
} }
} }
.box-privilege { .box-privilege {
box-shadow: 0px 0px 15px -5px #000;
border-radius: 36rpx; border-radius: 36rpx;
width: 100%; width: 100%;
margin-top: 44rpx; margin-top: 12%;
padding: 84rpx 10rpx 40rpx 10rpx; border-radius: 20px;
background: linear-gradient(#FFD55D,#FD7630); box-sizing: border-box;
border: 1px solid transparent;
background-image: linear-gradient(#FFD55D, #FD752F),
linear-gradient(to bottom, #FFEBB2, #FDCB3B);
background-origin: border-box;
background-clip: content-box, border-box;
border-radius: 20px;
display: flex; display: flex;
flex: 1; flex: 1;
position: relative;
.privilege-item { .box-title {
display: flex; position: absolute;
flex-direction: column; top: -9%;
align-items: center; left: -203rpx;
justify-content: space-between; margin-left: 50%;
background: #fff;
padding: 16rpx 16rpx;
border-radius: 20rpx;
margin: 0 10rpx;
image { image {
width: 87rpx; width: 406rpx;
height: 87rpx; height: 87rpx;
border-radius: 50%; position: relative;
margin-bottom: 15rpx; display: flex;
align-items: center;
justify-content: center;
&::before {
content: '特权详情';
position: absolute;
font-size: 34rpx;
font-family: Adobe Heiti Std;
font-weight: normal;
color: #FF4B47;
text-shadow: 1px 5px 5px rgba(255, 195, 30, 0.78);
}
} }
.privilege-text { }
color: #000000;
line-height: 36rpx; .privilege-list {
text-align: center; margin: 84rpx 10rpx 40rpx 10rpx;
font-size: 26rpx; display: flex;
justify-content: space-between;
.privilege-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
background: #fff;
padding: 16rpx 16rpx;
border-radius: 20rpx;
margin: 0 10rpx;
image {
width: 96rpx;
height: 96rpx;
border-radius: 50%;
margin-bottom: 15rpx;
}
.privilege-text {
color: #000000;
line-height: 36rpx;
text-align: center;
font-size: 26rpx;
}
} }
} }
} }
.box-submit { .box-submit {
background: linear-gradient(#FFC82B,#FD7A32); background: linear-gradient(#FFC82B, #FD7A32);
margin-top: 127rpx; margin-top: 127rpx;
margin-bottom: 75rpx; margin-bottom: 75rpx;
display: flex; display: flex;

View File

@ -10,19 +10,17 @@
<text>再升1级即可获得XX等6项权益</text> <text>再升1级即可获得XX等6项权益</text>
</view> </view>
<view class="member-right"> <view class="member-right">
<image src='../../static/images/f.png'></image> <image src='../../static/images/vipStar.png'></image>
<text >会员等级3级</text> <text >会员等级3级</text>
<button>立即续费</button> <button>立即续费</button>
</view> </view>
</view> </view>
<view class="box-equity"> <view class="box-equity">
<view class="equity-text"> <view class="equity-text">
<view class="equity-title">
</view>
<text class="equity-member">我的会员权益</text> <text class="equity-member">我的会员权益</text>
<text class="equity-look">查看权益></text> <text class="equity-look">查看权益></text>
</view> </view>
<view class="equity-item" v-for="(item,index) in 2" :key="index"> <view class="equity-item" v-for="(item,index) in 2" :key="index">
<view class="equity-grade"> <view class="equity-grade">
<text>办理档次640</text> <text>办理档次640</text>
<text>办理日期2021.12.30</text> <text>办理日期2021.12.30</text>
@ -101,10 +99,14 @@
<style lang="scss" scoped> <style lang="scss" scoped>
.box { .box {
padding: 36rpx 40rpx;
background: #fff; background: #fff;
height: 100vh; height: 100vh;
background: url(../../static/images/memberBg.png);
background-size: cover;
background-repeat: no-repeat;
background-attachment: fixed;
.box-member { .box-member {
padding: 36rpx 40rpx;
border-radius: 20rpx; border-radius: 20rpx;
width: 100%; width: 100%;
// padding: 20rpx 20rpx 30rpx 20rpx; // padding: 20rpx 20rpx 30rpx 20rpx;
@ -162,34 +164,34 @@
} }
.box-equity { .box-equity {
border-radius: 20rpx; // border-radius: 20rpx;
width: 100%; width: 100%;
margin-top: 10%; padding: 0 40rpx;
padding: 40rpx 10rpx 40rpx 10rpx; background: url(../../static/images/memberEquity.png);
// background: #fff; background-size: 100%;
background-repeat: no-repeat;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
position: relative;
.equity-text{ .equity-text{
display: flex; margin:5% 0;
align-items: center; display: flex;
position: relative; align-items: center;
.equity-title{ height: 10%;
display: flex; .equity-member{
justify-content: center; margin: 0 10%;
align-items: center; font-size: 30rpx;
width: 200rpx; font-family: PingFang SC;
height: 90rpx; font-weight: 400;
background: #fff; color: #FFFFFF;
border-radius: 8px;/* 设置圆角 */
transform: perspective(8px)scale(1.1, 1.3) rotateX(5deg);
/* 镜头距离元素表面的位置为8pxx轴为1.1倍y轴为1.3倍绕x轴旋转5度 */
transform-origin: bottom left;
margin-right: 20rpx;
}
.equity-member{
position: absolute;
} }
.equity-look{ .equity-look{
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 400;
color: #FF4922;
} }
} }
.equity-item { .equity-item {
@ -198,10 +200,9 @@
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
border-radius: 20rpx; border-radius: 20rpx;
margin: 15rpx; margin: 0 20rpx 20rpx 20rpx;
padding: 30rpx 24rpx; // padding: 30rpx 24rpx;
.equity-grade{ .equity-grade{
background: greenyellow;
border-radius: 10rpx 10rpx; border-radius: 10rpx 10rpx;
padding: 20rpx; padding: 20rpx;
display: flex; display: flex;
@ -209,9 +210,10 @@
} }
.equity-money { .equity-money {
display: flex; display: flex;
justify-content: space-between; justify-content: space-around;
flex-wrap: wrap; flex-wrap: wrap;
.money-box{ .money-box{
width: 46%;
padding: 24rpx 25rpx; padding: 24rpx 25rpx;
border-radius: 10px; border-radius: 10px;
display: flex; display: flex;

View File

@ -11,178 +11,184 @@
</u--form> </u--form>
</view> </view>
<view class="box-member"> <view class="box-member">
<view :class="[activeIndex.includes(index) && 'member-active',!!parseInt(item.isExist) && 'member-disbled', 'member-item']" v-for="(item,index) in memberData" :key="index" @click="handleMember(item,index)"> <view class="box-title">
<view class="member-image"> <image src='../../static/images/memberTitle.png'></image>
<image src='../../static/images/f.png'></image>
</view>
<view class="member-text">
<view class="text-title">
<text>{{item.name.split('得')[0]}}<text>{{item.name.split('得')[1]}}</text></text>
<view></view>
</view>
<text class="text-content">{{item.gearRemarks}}</text>
</view>
</view> </view>
<view class="member-prompt"> <view class="member-list">
* 办理三个项目即可升级会员2会员2享XX权益 <view
:class="[activeIndex.includes(index) && 'member-active',!!parseInt(item.isExist) && 'member-disbled', 'member-item']"
v-for="(item,index) in memberData" :key="index" @click="handleMember(item,index)">
<view class="member-image">
<image src='../../static/images/f.png'></image>
</view>
<view class="member-text">
<view class="text-title">
<text>{{item.name.split('得')[0]}}<text>{{item.name.split('得')[1]}}</text></text>
<view></view>
</view>
<text class="text-content">{{item.gearRemarks}}</text>
</view>
</view>
<view class="member-prompt">
* 办理三个项目即可升级会员2会员2享XX权益
</view>
</view> </view>
</view> </view>
<paymentMember :payMode='payMode' :pay_close="pay_close" @onChangeFun='onChangeFun' :payInfo="payInfo"></paymentMember> <paymentMember :payMode='payMode' :pay_close="pay_close" @onChangeFun='onChangeFun' :payInfo="payInfo">
</paymentMember>
<button class="box-submit" @click="goPay"></button> <button class="box-submit" @click="goPay"></button>
</view> </view>
</template> </template>
<script> <script>
import { import {
memberGradeInfo memberGradeInfo
} from '@/api/member.js'; } from '@/api/member.js';
import paymentMember from '@/components/paymentMember'; import paymentMember from '@/components/paymentMember';
import store from '@/store/index'; import store from '@/store/index';
export default { export default {
name: "member_application", name: "member_application",
components: { components: {
paymentMember paymentMember
}, },
data() { data() {
return { return {
memberData:[], memberData: [],
payInfo:{ payInfo: {
userPhone: '', userPhone: '',
confirmPhone: '', confirmPhone: '',
orderInfos: [] orderInfos: []
}, },
payMode: [{ payMode: [{
name: "微信支付", name: "微信支付",
icon: "icon-weixinzhifu", icon: "icon-weixinzhifu",
value: 'WXPAY', value: 'WXPAY',
title: '微信快捷支付' title: '微信快捷支付'
}, },
{ {
name: "支付宝", name: "支付宝",
icon: "icon-zhifubao", icon: "icon-zhifubao",
value: 'ALIPAY', value: 'ALIPAY',
title: '支付宝快捷支付' title: '支付宝快捷支付'
} }
], ],
pay_close: false, pay_close: false,
activeIndex:[], activeIndex: [],
form: { form: {
userPhone:'', userPhone: '',
confirmPhone:'' confirmPhone: ''
}, },
rules: { rules: {
userPhone: [ userPhone: [{
{
required: true, required: true,
message: '手机号不能为空', message: '手机号不能为空',
// blurchange // blurchange
trigger: ['change', 'blur'] trigger: ['change', 'blur']
}, },
{
pattern: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[1-25-9])\d{8}$/g,
//
transform(value) {
return String(value);
},
message: '手机号不正确190.193号段不可充值)',
trigger: ['change', 'blur']
},
],
confirmPhone:[
{ {
pattern: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[1-25-9])\d{8}$/g,
//
transform(value) {
return String(value);
},
message: '手机号不正确190.193号段不可充值)',
trigger: ['change', 'blur']
},
],
confirmPhone: [{
required: true, required: true,
message: '手机号确认不能为空', message: '手机号确认不能为空',
// blurchange // blurchange
trigger: ['change', 'blur'] trigger: ['change', 'blur']
}, },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
return this.form.userPhone == this.form.confirmPhone return this.form.userPhone == this.form.confirmPhone
}, },
message: '手机号不一致', message: '手机号不一致',
trigger: ['change','blur'], trigger: ['change', 'blur'],
} }
] ]
} }
}; };
}, },
async onLoad() { async onLoad() {
const res = await memberGradeInfo() const res = await memberGradeInfo()
this.memberData = res.data this.memberData = res.data
}, },
methods: { methods: {
handleMember(value,index){ handleMember(value, index) {
if(!!parseInt(value.isExist)) return if (!!parseInt(value.isExist)) return
if(this.activeIndex.includes(index)){ if (this.activeIndex.includes(index)) {
this.activeIndex = this.activeIndex.filter(item => item !== index) this.activeIndex = this.activeIndex.filter(item => item !== index)
}else{ } else {
this.activeIndex.push(index) this.activeIndex.push(index)
} }
}, },
/** /**
* 打开支付组件 * 打开支付组件
* *
*/ */
goPay() { goPay() {
this.$refs.uForm.validate().then(res => { this.$refs.uForm.validate().then(res => {
if(this.activeIndex.length){ if (this.activeIndex.length) {
this.$set(this, 'pay_close', true); this.$set(this, 'pay_close', true);
const orderInfos = this.activeIndex.map((item) => { const orderInfos = this.activeIndex.map((item) => {
return { return {
...this.memberData[item], ...this.memberData[item],
gearId:this.memberData[item].id gearId: this.memberData[item].id
} }
}) })
this.payInfo = { this.payInfo = {
userPhone: this.form.userPhone, userPhone: this.form.userPhone,
confirmPhone: this.form.confirmPhone, confirmPhone: this.form.confirmPhone,
orderInfos orderInfos
} }
} }
}).catch(errors => { }).catch(errors => {
uni.$u.toast('校验失败') uni.$u.toast('校验失败')
}) })
}, },
/** /**
* 事件回调 * 事件回调
* *
*/ */
onChangeFun: function(e) {
let opt = e;
let action = opt.action || null;
let value = opt.value != undefined ? opt.value : null;
(action && this[action]) && this[action](value);
},
/**
* 关闭支付组件
*
*/
payClose: function() {
this.pay_close = false;
},
/**
* 支付成功回调
*
*/
pay_complete: function() {
this.status = false;
this.page = 1;
this.$set(this, 'bargain', []);
this.$set(this, 'pay_close', false);
this.getBargainUserList();
},
/**
* 支付失败回调
*
*/
pay_fail: function() {
this.pay_close = false;
},
onChangeFun: function(e) { onChangeFun: function(e) {
let opt = e; let opt = e;
let action = opt.action || null; let action = opt.action || null;
let value = opt.value != undefined ? opt.value : null; let value = opt.value != undefined ? opt.value : null;
(action && this[action]) && this[action](value); (action && this[action]) && this[action](value);
},
/**
* 关闭支付组件
*
*/
payClose: function() {
this.pay_close = false;
},
/**
* 支付成功回调
*
*/
pay_complete: function() {
this.status = false;
this.page = 1;
this.$set(this, 'bargain', []);
this.$set(this, 'pay_close', false);
this.getBargainUserList();
},
/**
* 支付失败回调
*
*/
pay_fail: function() {
this.pay_close = false;
},
onChangeFun: function(e) {
let opt = e;
let action = opt.action || null;
let value = opt.value != undefined ? opt.value : null;
(action && this[action]) && this[action](value);
}, },
} }
}; };
@ -190,148 +196,291 @@ import store from '@/store/index';
<style lang="scss" scoped> <style lang="scss" scoped>
.box { .box {
padding: 63rpx 40rpx; position: relative;
.box-phone { padding: 8% 40rpx 0 40rpx;
.u-form-item{ height: 100vh;
background: url(../../static/images/bg.png);
background-size: cover;
background-repeat: no-repeat;
background-attachment: fixed;
.box-phone {
.u-form-item {
margin-bottom: 32rpx; margin-bottom: 32rpx;
} }
::v-deep .u-form-item__body {
::v-deep .u-form-item__body {
height: 100rpx; height: 100rpx;
border-radius: 20rpx; border-radius: 20rpx;
padding: 0 30rpx; padding: 0 30rpx;
background: #fff; background: #fff;
} }
} }
.box-member {
border-radius: 20rpx;
width: 100%;
margin-top: 60rpx;
padding: 83rpx 30rpx 30rpx 30rpx;
background: linear-gradient(#FFD55D,#FD752F);
.member-item { .phone-money {
display: flex; width: 604rpx;
justify-content: space-between; height: 140rpx;
background: #fff; position: absolute;
margin-bottom: 20rpx; top: 2%;
padding: 30rpx 20rpx 27rpx 20rpx; left: 15%;
border-radius: 20rpx; }
.member-image { .box-member {
width: 104rpx; margin-top: 10%;
height: 104rpx; box-shadow: 0px 0px 15px -5px #000;
border-radius: 35rpx; width: 100%;
background: linear-gradient(#FFEBB2,#FDCB3B); border-radius: 20px;
padding: 20rpx; box-sizing: border-box;
border: 1px solid transparent;
background-image: linear-gradient(#FFD55D, #FD752F),
linear-gradient(to bottom, #FFD55D, #FDCB3B);
background-origin: border-box;
background-clip: content-box, border-box;
border-radius: 20px;
position: relative;
image { .box-title {
width: 100%; position: absolute;
height: 100%; top: -5.5%;
} left: -203rpx;
} margin-left: 50%;
.member-text { image {
display: flex; width: 406rpx;
flex-direction: column; height: 87rpx;
justify-content: space-between; position: relative;
flex: .9; display: flex;
align-items: center;
justify-content: center;
.text-title { &::before {
margin-top: -14rpx; content: '会员详情介绍';
font-size: 32rpx; position: absolute;
font-weight: bolder; font-size: 34rpx;
transform: skew(-6deg, 0); font-family: Adobe Heiti Std;
display: flex; font-weight: normal;
justify-content: space-between; color: #FF4B47;
text{ text-shadow: 1px 5px 5px rgba(255, 195, 30, 0.78);
text{ }
color: #C80D00; }
}
}
view{
width: 18rpx;
height: 6rpx;
background: #FEAC49;
border-radius: 3rpx;
}
}
.text-content { }
font-size: 24rpx;
color: #747474;
}
}
}
.member-active{
transition: .3s;
background: linear-gradient(#FF995F,#DA0E00);
.member-image { .member-list {
background: linear-gradient(#FF995F,#DA0E00); margin: 83rpx 30rpx 30rpx 30rpx;
} position: relative;
.member-text { .member-item {
.text-title { padding: 30rpx 20rpx 27rpx 20rpx;
text{ display: flex;
color: #fff; justify-content: space-between;
text{ background: #fff;
color: rgb(223,208,42); margin-bottom: 20rpx;
} border-radius: 20rpx;
}
view{
background: #fff;
}
}
.text-content {
color: #fff;
}
}
}
.member-disbled{ .member-image {
transition: .3s; width: 104rpx;
background: linear-gradient(#EFEFEF,#BCBCBC); height: 104rpx;
border-radius: 35rpx;
background: linear-gradient(#FFEBB2, #FDCB3B);
padding: 20rpx;
.member-image { image {
background: linear-gradient(#AAAAAA,#989898); width: 100%;
} height: 100%;
}
}
.member-text { .member-text {
.text-title { display: flex;
text{ flex-direction: column;
color: #868585; justify-content: space-between;
text{ flex: .9;
color: #868585;
}
}
view{
background: #fff;
}
}
.text-content {
color: #5C5C5C;
}
}
}
.member-prompt{
display: flex;
justify-content: center;
font-size: 24rpx;
color: #fff;
}
}
.box-submit { .text-title {
background: linear-gradient(#FFC82B,#FD7A32); margin-top: -14rpx;
margin-top: 127rpx; font-size: 32rpx;
margin-bottom: 75rpx; font-weight: bolder;
display: flex; transform: skew(-6deg, 0);
justify-content: center; display: flex;
align-items: center; justify-content: space-between;
height: 87rpx;
border-radius: 44rpx; text {
color: #fff; text {
font-size: 32rpx; color: #C80D00;
} }
}
view {
width: 18rpx;
height: 6rpx;
background: #FEAC49;
border-radius: 3rpx;
}
}
.text-content {
font-size: 24rpx;
color: #747474;
}
}
}
.member-active {
transition: .3s;
background: linear-gradient(#FF995F, #DA0E00);
.member-image {
background: linear-gradient(#FF995F, #FDCB3B);
}
.member-text {
.text-title {
text {
color: #fff;
text {
color: rgb(223, 208, 42);
}
}
view {
background: #fff;
}
}
.text-content {
color: #fff;
}
}
}
.member-disbled {
transition: .3s;
background: linear-gradient(#EFEFEF, #BCBCBC);
.member-image {
background: linear-gradient(#AAAAAA, #989898);
}
.member-text {
.text-title {
text {
color: #868585;
text {
color: #868585;
}
}
view {
background: #fff;
}
}
.text-content {
color: #5C5C5C;
}
}
}
.member-prompt {
display: flex;
justify-content: center;
font-size: 24rpx;
color: #fff;
}
}
}
.box-privilege {
box-shadow: 0px 0px 15px -5px #000;
border-radius: 36rpx;
width: 100%;
margin-top: 12%;
border-radius: 20px;
box-sizing: border-box;
border: 1px solid transparent;
background-image: linear-gradient(#FFD55D, #FD752F),
linear-gradient(to bottom, #FFEBB2, #FDCB3B);
background-origin: border-box;
background-clip: content-box, border-box;
border-radius: 20px;
display: flex;
flex: 1;
position: relative;
.box-title {
position: absolute;
top: -9%;
left: -203rpx;
margin-left: 50%;
image {
width: 406rpx;
height: 87rpx;
position: relative;
display: flex;
align-items: center;
justify-content: center;
&::before {
content: '特权详情';
position: absolute;
font-size: 34rpx;
font-family: Adobe Heiti Std;
font-weight: normal;
color: #FF4B47;
text-shadow: 1px 5px 5px rgba(255, 195, 30, 0.78);
}
}
}
.privilege-list {
margin: 84rpx 10rpx 40rpx 10rpx;
display: flex;
justify-content: space-between;
.privilege-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
background: #fff;
padding: 16rpx 16rpx;
border-radius: 20rpx;
margin: 0 10rpx;
image {
width: 96rpx;
height: 96rpx;
border-radius: 50%;
margin-bottom: 15rpx;
}
.privilege-text {
color: #000000;
line-height: 36rpx;
text-align: center;
font-size: 26rpx;
}
}
}
}
.box-submit {
background: linear-gradient(#FFC82B, #FD7A32);
margin-top: 127rpx;
margin-bottom: 75rpx;
display: flex;
justify-content: center;
align-items: center;
height: 87rpx;
border-radius: 44rpx;
color: #fff;
font-size: 32rpx;
}
} }
</style> </style>

View File

@ -8,7 +8,7 @@
</view> </view>
<view class="item-text"> <view class="item-text">
<text>充值档次{{item.grade}}</text> <text>充值档次{{item.grade}}</text>
<text>日期{{item.createTime}}</text> <text>日期{{item.stringCreateTime}}</text>
</view> </view>
</view> </view>
</view> </view>
@ -36,17 +36,17 @@
this.memberData.sort((a,b) =>{ this.memberData.sort((a,b) =>{
let aIndex = this.keyword.indexOf(a.userPhone) let aIndex = this.keyword.indexOf(a.userPhone)
let bIndex = this.keyword.indexOf(b.userPhone) let bIndex = this.keyword.indexOf(b.userPhone)
console.log(aIndex,bIndex)
if(aIndex > bIndex) return -1 if(aIndex > bIndex) return -1
if(aIndex < bIndex) return 1 if(aIndex < bIndex) return 1
if(a.userPhone == b.userPhone){ if(a.userPhone == b.userPhone){
return a.createTime - b.createTime return a.stringCreateTime - b.stringCreateTime
}else{ }else{
if(a.createTime<b.createTime) return -1 if(a.stringCreateTime<b.stringCreateTime) return -1
if(a.createTime>b.createTime) return 1 if(a.stringCreateTime>b.stringCreateTime) return 1
return 0 return 0
} }
}) })
console.log(this.memberData)
},1000) },1000)
}, },
methods: { methods: {

View File

@ -7,23 +7,30 @@
</u-form-item> </u-form-item>
</u--form> </u--form>
</view> </view>
<view class="box-member"> <view class="box-member">
<view :class="[activeIndex.includes(index) && 'member-active',!!parseInt(item.isExist) && 'member-disbled', 'member-item']" v-for="(item,index) in memberData" :key="index" @click="handleMember(item,index)"> <view class="box-title">
<view class="member-image"> <image src='../../static/images/memberTitle.png'></image>
<image src='../../static/images/f.png'></image> </view>
<view class="member-list">
<view
:class="[activeIndex.includes(index) && 'member-active',!!parseInt(item.isExist) && 'member-disbled', 'member-item']"
v-for="(item,index) in memberData" :key="index" @click="handleMember(item,index)">
<view class="member-image">
<image src='../../static/images/f.png'></image>
</view>
<view class="member-text">
<view class="text-title">
<text>{{item.name.split('得')[0]}}<text>{{item.name.split('得')[1]}}</text></text>
<view></view>
</view>
<text class="text-content">{{item.gearRemarks}}</text>
</view>
</view>
<view class="member-prompt">
* 办理三个项目即可升级会员2会员2享XX权益
</view> </view>
<view class="member-text">
<view class="text-title">
<text>{{item.name.split('得')[0]}}<text>{{item.name.split('得')[1]}}</text></text>
<view></view>
</view>
<text class="text-content">{{item.gearRemarks}}</text>
</view>
</view> </view>
<view class="member-prompt">
* 办理三个项目即可升级会员2会员2享XX权益
</view> </view>
</view>
<paymentMember :payMode='payMode' :pay_close="pay_close" @onChangeFun='onChangeFun' :payInfo="payInfo"></paymentMember> <paymentMember :payMode='payMode' :pay_close="pay_close" @onChangeFun='onChangeFun' :payInfo="payInfo"></paymentMember>
<button class="box-submit" @click="goPay"></button> <button class="box-submit" @click="goPay"></button>
</view> </view>
@ -166,153 +173,292 @@ import store from '@/store/index';
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.box { .box {
padding: 63rpx 40rpx; position: relative;
.u-input{ padding: 8% 40rpx 0 40rpx;
background: #fff !important; height: 100vh;
} background: url(../../static/images/bg.png);
.box-phone { background-size: cover;
.u-form-item{ background-repeat: no-repeat;
margin-bottom: 32rpx; background-attachment: fixed;
}
::v-deep .u-form-item__body { .box-phone {
height: 100rpx; .u-form-item {
border-radius: 20rpx; margin-bottom: 32rpx;
padding: 0 30rpx; }
background: #fff;
} ::v-deep .u-form-item__body,.u-input {
} height: 100rpx;
border-radius: 20rpx;
padding: 0 30rpx;
background: #fff !important;
}
}
.phone-money {
width: 604rpx;
height: 140rpx;
position: absolute;
top: 2%;
left: 15%;
}
.box-member { .box-member {
border-radius: 20rpx; margin-top: 10%;
box-shadow: 0px 0px 15px -5px #000;
width: 100%; width: 100%;
margin-top: 60rpx; border-radius: 20px;
padding: 83rpx 30rpx 30rpx 30rpx; box-sizing: border-box;
background: linear-gradient(#FFD55D,#FD752F); border: 1px solid transparent;
background-image: linear-gradient(#FFD55D, #FD752F),
linear-gradient(to bottom, #FFD55D, #FDCB3B);
background-origin: border-box;
background-clip: content-box, border-box;
border-radius: 20px;
position: relative;
.member-item { .box-title {
display: flex; position: absolute;
justify-content: space-between; top: -5.5%;
background: #fff; left: -203rpx;
margin-bottom: 20rpx; margin-left: 50%;
padding: 30rpx 20rpx 27rpx 20rpx;
border-radius: 20rpx;
.member-image { image {
width: 104rpx; width: 406rpx;
height: 104rpx; height: 87rpx;
border-radius: 35rpx; position: relative;
background: linear-gradient(#FFEBB2,#FDCB3B); display: flex;
padding: 20rpx; align-items: center;
justify-content: center;
image { &::before {
width: 100%; content: '会员详情介绍';
height: 100%; position: absolute;
} font-size: 34rpx;
} font-family: Adobe Heiti Std;
font-weight: normal;
color: #FF4B47;
text-shadow: 1px 5px 5px rgba(255, 195, 30, 0.78);
}
}
.member-text { }
display: flex;
flex-direction: column;
justify-content: space-between;
flex: .9;
.text-title { .member-list {
margin-top: -14rpx; margin: 83rpx 30rpx 30rpx 30rpx;
font-size: 32rpx; position: relative;
font-weight: bolder;
transform: skew(-6deg, 0);
display: flex;
justify-content: space-between;
text{
text{
color: #C80D00;
}
}
view{
width: 18rpx;
height: 6rpx;
background: #FEAC49;
border-radius: 3rpx;
}
}
.text-content { .member-item {
font-size: 24rpx; padding: 30rpx 20rpx 27rpx 20rpx;
color: #747474; display: flex;
} justify-content: space-between;
} background: #fff;
} margin-bottom: 20rpx;
.member-active{ border-radius: 20rpx;
transition: .3s;
background: linear-gradient(#FF995F,#DA0E00);
.member-image { .member-image {
background: linear-gradient(#FF995F,#DA0E00); width: 104rpx;
} height: 104rpx;
border-radius: 35rpx;
background: linear-gradient(#FFEBB2, #FDCB3B);
padding: 20rpx;
.member-text { image {
.text-title { width: 100%;
text{ height: 100%;
color: #fff; }
text{ }
color: rgb(223,208,42);
}
}
view{
background: #fff;
}
}
.text-content {
color: #fff;
}
}
}
.member-disbled{ .member-text {
transition: .3s; display: flex;
background: linear-gradient(#EFEFEF,#BCBCBC); flex-direction: column;
justify-content: space-between;
flex: .9;
.member-image { .text-title {
background: linear-gradient(#AAAAAA,#989898); margin-top: -14rpx;
} font-size: 32rpx;
font-weight: bolder;
transform: skew(-6deg, 0);
display: flex;
justify-content: space-between;
.member-text { text {
.text-title { text {
text{ color: #C80D00;
color: #868585; }
text{ }
color: #868585;
}
}
view{
background: #fff;
}
}
.text-content {
color: #5C5C5C;
}
}
}
.member-prompt{
display: flex;
justify-content: center;
font-size: 24rpx;
color: #fff;
}
}
view {
width: 18rpx;
height: 6rpx;
background: #FEAC49;
border-radius: 3rpx;
}
}
.box-submit { .text-content {
background: linear-gradient(#FFC82B,#FD7A32); font-size: 24rpx;
margin-top: 127rpx; color: #747474;
margin-bottom: 75rpx; }
display: flex; }
justify-content: center; }
align-items: center;
height: 87rpx; .member-active {
border-radius: 44rpx; transition: .3s;
color: #fff; background: linear-gradient(#FF995F, #DA0E00);
font-size: 32rpx;
} .member-image {
} background: linear-gradient(#FF995F, #FDCB3B);
}
.member-text {
.text-title {
text {
color: #fff;
text {
color: rgb(223, 208, 42);
}
}
view {
background: #fff;
}
}
.text-content {
color: #fff;
}
}
}
.member-disbled {
transition: .3s;
background: linear-gradient(#EFEFEF, #BCBCBC);
.member-image {
background: linear-gradient(#AAAAAA, #989898);
}
.member-text {
.text-title {
text {
color: #868585;
text {
color: #868585;
}
}
view {
background: #fff;
}
}
.text-content {
color: #5C5C5C;
}
}
}
.member-prompt {
display: flex;
justify-content: center;
font-size: 24rpx;
color: #fff;
}
}
}
.box-privilege {
box-shadow: 0px 0px 15px -5px #000;
border-radius: 36rpx;
width: 100%;
margin-top: 12%;
border-radius: 20px;
box-sizing: border-box;
border: 1px solid transparent;
background-image: linear-gradient(#FFD55D, #FD752F),
linear-gradient(to bottom, #FFEBB2, #FDCB3B);
background-origin: border-box;
background-clip: content-box, border-box;
border-radius: 20px;
display: flex;
flex: 1;
position: relative;
.box-title {
position: absolute;
top: -9%;
left: -203rpx;
margin-left: 50%;
image {
width: 406rpx;
height: 87rpx;
position: relative;
display: flex;
align-items: center;
justify-content: center;
&::before {
content: '特权详情';
position: absolute;
font-size: 34rpx;
font-family: Adobe Heiti Std;
font-weight: normal;
color: #FF4B47;
text-shadow: 1px 5px 5px rgba(255, 195, 30, 0.78);
}
}
}
.privilege-list {
margin: 84rpx 10rpx 40rpx 10rpx;
display: flex;
justify-content: space-between;
.privilege-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
background: #fff;
padding: 16rpx 16rpx;
border-radius: 20rpx;
margin: 0 10rpx;
image {
width: 96rpx;
height: 96rpx;
border-radius: 50%;
margin-bottom: 15rpx;
}
.privilege-text {
color: #000000;
line-height: 36rpx;
text-align: center;
font-size: 26rpx;
}
}
}
}
.box-submit {
background: linear-gradient(#FFC82B, #FD7A32);
margin-top: 127rpx;
margin-bottom: 75rpx;
display: flex;
justify-content: center;
align-items: center;
height: 87rpx;
border-radius: 44rpx;
color: #fff;
font-size: 32rpx;
}
}
</style> </style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB