尚融宝25-投资列表展示以及实现充值功能

news2024/11/27 23:52:36

目录

一、展示投资列表

(一)需求

(二)后端

(三)前端

二、充值功能

(一)需求

1、需求描述

2、流程

(二)充值

1、后端

2、前端

(三)回调接口

1、定义回调接口

2、增加交易流水

(四)接口调用幂等性

1、接口幂等性原则

2、解决方案


一、展示投资列表

(一)需求

标的形成后,客户可在客户端看到标的列表,投资者可以通过点击标的了解详情并投资心仪标的

(二)后端

LendController中创建list方法

@Api(tags = "标的")
@RestController
@RequestMapping("/api/core/lend")
@Slf4j
public class LendController {

    @Resource
    private LendService lendService;

    @ApiOperation("获取标的列表")
    @GetMapping("/list")
    public R list() {
        List<Lend> lendList = lendService.selectList();
        return R.ok().data("lendList", lendList);
    }
}

(三)前端

pages/lend/index.vue

脚本

此处使用了服务器端渲染

<template>
  <!--列表-->
  <div class="page-filter wrap">
    <div class="breadcrumbs">
      <a href="index.html">首页</a>&gt;<span class="cur">散标投资列表</span>
    </div>
    <div class="invest-filter" data-target="sideMenu">
      <div class="filter-inner clearfix">
        <div class="filter-item">
          <div class="hd">
            <h3>筛选投资项目</h3>
            <label>
              <input id="filterMulti" name="multiple_choice" type="checkbox" />
              多选</label
            >
          </div>
          <div class="bd">
            <dl>
              <dt>项目类型</dt>
              <dd>
                <ul>
                  <li class="n1">
                    <a
                      href="javascript:url('post_type','');"
                      id="post_type_"
                      class="active"
                      >不限</a
                    >
                  </li>
                  <li class="n2">
                    <a
                      href="javascript:url('post_type','car');"
                      id="post_type_car"
                      >车易贷</a
                    >
                  </li>
                  <li class="n3">
                    <a
                      href="javascript:url('post_type','house');"
                      id="post_type_house"
                      >房易贷</a
                    >
                  </li>
                  <li class="n4">
                    <a
                      href="javascript:url('post_type','bridge');"
                      id="post_type_bridge"
                      >赎楼贷</a
                    >
                  </li>
                  <li class="n5">
                    <a
                      href="javascript:url('post_type','worth');"
                      id="post_type_worth"
                      >债权贷</a
                    >
                  </li>
                </ul>
              </dd>
            </dl>
            <dl>
              <dt>年利率</dt>
              <dd>
                <ul>
                  <li class="n1">
                    <a
                      href="javascript:url('borrow_interestrate','');"
                      id="borrow_interestrate_"
                      class="active"
                      >不限</a
                    >
                  </li>
                  <li class="n2">
                    <a
                      id="borrow_interestrate_1"
                      href="javascript:url('borrow_interestrate','1');"
                      >12%以下</a
                    >
                  </li>
                  <li class="n3">
                    <a
                      id="borrow_interestrate_2"
                      href="javascript:url('borrow_interestrate','2');"
                      >12%-14%</a
                    >
                  </li>
                  <li class="n4">
                    <a
                      id="borrow_interestrate_3"
                      href="javascript:url('borrow_interestrate','3');"
                      >14%-16%</a
                    >
                  </li>
                  <li class="n5">
                    <a
                      id="borrow_interestrate_4"
                      href="javascript:url('borrow_interestrate','4');"
                      >16%及以上</a
                    >
                  </li>
                </ul>
              </dd>
            </dl>
            <dl>
              <dt>期限</dt>
              <dd>
                <ul>
                  <li class="n1">
                    <a
                      href="javascript:url('spread_month','');"
                      id="spread_month_"
                      class="active"
                      >不限</a
                    >
                  </li>
                  <li class="n2">
                    <a
                      id="spread_month_1"
                      href="javascript:url('spread_month','1');"
                      >1月以下</a
                    >
                  </li>
                  <li class="n3">
                    <a
                      id="spread_month_2"
                      href="javascript:url('spread_month','2');"
                      >1-3月</a
                    >
                  </li>
                  <li class="n4">
                    <a
                      id="spread_month_3"
                      href="javascript:url('spread_month','3');"
                      >3-6月</a
                    >
                  </li>
                  <li class="n5">
                    <a
                      id="spread_month_4"
                      href="javascript:url('spread_month','4');"
                      >6-12月</a
                    >
                  </li>
                  <li class="n6">
                    <a
                      id="spread_month_5"
                      href="javascript:url('spread_month','5');"
                      >12月及以上</a
                    >
                  </li>
                </ul>
              </dd>
            </dl>
            <dl class="repayment">
              <dt>还款方式</dt>
              <dd>
                <ul>
                  <li class="n1">
                    <a
                      href="javascript:url('repay_style','');"
                      id="repay_style_"
                      class="active"
                      >不限</a
                    >
                  </li>
                  <li class="n2">
                    <a
                      id="repay_style_end"
                      href="javascript:url('repay_style','end');"
                      >到期还本付息</a
                    >
                  </li>
                  <li class="n2">
                    <a
                      id="repay_style_endmonth"
                      href="javascript:url('repay_style','endmonth');"
                      >按月付息,到期还本</a
                    >
                  </li>
                  <li class="n2">
                    <a
                      id="repay_style_month"
                      href="javascript:url('repay_style','month');"
                      >等额本息</a
                    >
                  </li>
                </ul>
              </dd>
            </dl>
          </div>
        </div>
        <div class="common-problem">
          <h3>常见问题</h3>
          <ul>
            <li><a href="#">什么是债权贷?</a></li>
            <li><a href="#">关于"债权贷"产品的说明</a></li>
            <li><a href="#">金融理财收费标准</a></li>
            <li><a href="#">债权贷和房易贷、车易贷有什么区别?</a></li>
          </ul>
        </div>
      </div>
    </div>
    <div class="invest-list mrt30 clearfix">
      <div class="hd">
        <h3>投资列表</h3>
        <div class="count">
          <ul>
            <li class="line">
              散标投资交易金额&nbsp;&nbsp;<span class="f20 bold"
                >73.54亿元</span
              >
            </li>
            <li>
              累计赚取收益&nbsp;&nbsp;<span class="f20 bold">2.52亿元</span>
            </li>
          </ul>
        </div>
      </div>
      <div class="bd">
        <div class="invest-table clearfix">
          <div class="title clearfix">
            <ul>
              <li class="col-330">借款标题</li>
              <li class="col-180">
                <a href="javascript:url('order','account_up');" class=""
                  >借款金额</a
                >
              </li>
              <li class="col-110">
                <a href="javascript:url('order','apr_up');" class="">年利率</a>
              </li>
              <li class="col-150">
                <a href="javascript:url('order','period_up');" class=""
                  >借款期限</a
                >
              </li>
              <li class="col-150">还款方式</li>
              <li class="col-120">
                <a href="javascript:url('order','scale_up');" class=""
                  >借款进度</a
                >
              </li>
              <li class="col-120-t">操作</li>
            </ul>
          </div>
          <!------------投资列表-------------->
          <div class="item" v-for="lend in lendList" :key="lend.id">
            <ul>
              <li class="col-330 col-t">
                <NuxtLink :to="'/lend/' + lend.id" target="_blank">
                  <i class="icon icon-zhai"></i>
                </NuxtLink>
                <NuxtLink
                  class="f18"
                  :to="'/lend/' + lend.id"
                  :title="lend.title"
                  target="_blank"
                >
                  {{ lend.title }}
                </NuxtLink>
              </li>
              <li class="col-180">
                <span class="f20 c-333"> {{ lend.amount }}元 </span>
              </li>
              <li class="col-110 relative">
                <span class="f20 c-orange">
                  {{ lend.lendYearRate * 100 }}%
                </span>
              </li>
              <li class="col-150">
                <span class="f20 c-333">{{ lend.period }}个月</span>
              </li>
              <li class="col-150">{{ lend.params.returnMethod }}</li>
              <li class="col-120">
                <div class="circle">
                  <div class="left progress-bar">
                    <!-- <div
                      :class="
                        'progress-bgPic progress-bfb' +
                          Math.floor((lend.investAmount / lend.amount) * 10)
                      "
                    > -->
                    <div
                      :class="
                        'progress-bgPic progress-bfb' +
                          Math.floor((lend.investAmount / lend.amount) * 10)
                      "
                    >
                      <div class="show-bar">
                        {{ (lend.investAmount / lend.amount) * 100 }}%
                      </div>
                    </div>
                  </div>
                </div>
              </li>
              <li class="col-120-2">
                <NuxtLink
                  class="ui-btn btn-gray"
                  :to="'/lend/' + lend.id"
                  target="_blank"
                >
                  {{ lend.params.status }}
                </NuxtLink>
              </li>
            </ul>
          </div>
          <!------------投资列表-------------->
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import '~/assets/css/index.css'
import '~/assets/css/detail.css'
export default {
  async asyncData({ $axios }) {
    console.log('服务器端获取远程数据。。。。。。。。。。。。。。。。')
    let response = await $axios.$get('/api/core/lend/list')
    return {
      lendList: response.data.lendList,
    }
  },
}
</script>

二、充值功能

(一)需求

1、需求描述

标的产生后,平台展示标的,投资人就可以在平台投资标的,获取收益;投资人投资标的必须满足以下条件:

充值过程与绑定过程一致,也是在平台发送充值请求,跳转到资金托管平台(汇付宝),在资金托管平台(汇付宝)完成充值,然后同步或异步返回或通知平台

操作表:user_account(用户账户表) ====> trans_flow(交易流水表)

用户输入充值后,点击确认,此时我们需要有一个方法返回一个表单且需自动提交(携带汇付宝需要的参数且不能让客户看到表单,因此需要自动提交),然后汇付宝会调用我们的回调方法,在回调方法中,我们需要更新用户账户表并在交易流水表中产生一个记录

汇付宝携带参数说明

 

 

2、流程

step1:用户在个人中心点击 “充值” 

step2:尚融宝展示账户充值页面

step3:用户填写充值金额,点击“充值”按钮

step4:跳转到汇付宝页面(资金托管接口调用)

 

 step5:汇付宝验证用户交易密码

 

step6:汇付宝修改账号资金余额(更新user_account记录中的amount的值,这一步汇付宝做)

step7:异步回调

(1)账户金额更改

(2)添加交易流水

step8:用户点击“返回平台”,返回尚融宝

 

(二)充值

1、后端

controller

UserAccountController 

@Api(tags = "会员账户")
@RestController
@RequestMapping("/api/core/userAccount")
@Slf4j
public class UserAccountController {

    @Resource
    private UserAccountService userAccountService;

    @ApiOperation("充值")
    @PostMapping("/auth/commitCharge/{chargeAmt}")
    public R commitCharge(
            @ApiParam(value = "充值金额", required = true)
            @PathVariable BigDecimal chargeAmt, HttpServletRequest request) {

        String token = request.getHeader("token");
        Long userId = JwtUtils.getUserId(token);
        String formStr = userAccountService.commitCharge(chargeAmt, userId);
        return R.ok().data("formStr", formStr);
    }
}

service

接口:UserAccountService

String commitCharge(BigDecimal chargeAmt, Long userId);

实现:UserAccountServiceImpl

@Resource
private UserInfoMapper userInfoMapper;

@Override
public String commitCharge(BigDecimal chargeAmt, Long userId) {

    UserInfo userInfo = userInfoMapper.selectById(userId);
    String bindCode = userInfo.getBindCode();
    //判断账户绑定状态
    Assert.notEmpty(bindCode, ResponseEnum.USER_NO_BIND_ERROR);

    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("agentId", HfbConst.AGENT_ID);
    paramMap.put("agentBillNo", LendNoUtils.getNo());
    paramMap.put("bindCode", bindCode);
    paramMap.put("chargeAmt", chargeAmt);
    paramMap.put("feeAmt", new BigDecimal("0"));
    paramMap.put("notifyUrl", HfbConst.RECHARGE_NOTIFY_URL);//检查常量是否正确
    paramMap.put("returnUrl", HfbConst.RECHARGE_RETURN_URL);
    paramMap.put("timestamp", RequestHelper.getTimestamp());
    String sign = RequestHelper.getSign(paramMap);
    paramMap.put("sign", sign);

    //构建充值自动提交表单
    String formStr = FormHelper.buildForm(HfbConst.RECHARGE_URL, paramMap);
    return formStr;
}

 

2、前端

pages/user/recharge.vue

methods: {
    commitCharge() {
      this.$alert(
        '<div style="size: 18px;color: red;">您即将前往汇付宝充值</div>',
        '前往汇付宝资金托管平台',
        {
          dangerouslyUseHTMLString: true,
          confirmButtonText: '立即前往',
          callback: (action) => {
            if (action === 'confirm') {
              this.$axios
                .$post(
                  '/api/core/userAccount/auth/commitCharge/' + this.chargeAmt
                )
                .then((response) => {
                  document.write(response.data.formStr)
                })
            }
          },
        }
      )
    },
},

(三)回调接口

1、定义回调接口

controller

UserAccountController中创建回调方法 

@ApiOperation(value = "用户充值异步回调")
@PostMapping("/notify")
public String notify(HttpServletRequest request) {
    Map<String, Object> paramMap = RequestHelper.switchMap(request.getParameterMap());
    log.info("用户充值异步回调:" + JSON.toJSONString(paramMap));

    //校验签名
    if(RequestHelper.isSignEquals(paramMap)) {
        //充值成功交易
        if("0001".equals(paramMap.get("resultCode"))) {
            return userAccountService.notify(paramMap);
        } else {
            log.info("用户充值异步回调充值失败:" + JSON.toJSONString(paramMap));
            return "success";
        }
    } else {
        log.info("用户充值异步回调签名错误:" + JSON.toJSONString(paramMap));
        return "fail";
    }
}

service

接口:UserAccountService

String notify(Map<String, Object> paramMap);

实现:UserAccountServiceImpl

@Transactional(rollbackFor = Exception.class)
@Override
public String notify(Map<String, Object> paramMap) {

    log.info("充值成功:" + JSONObject.toJSONString(paramMap));

    String bindCode = (String)paramMap.get("bindCode"); //充值人绑定协议号
    String chargeAmt = (String)paramMap.get("chargeAmt"); //充值金额

    //优化
    baseMapper.updateAccount(bindCode, new BigDecimal(chargeAmt), new BigDecimal(0));
    
    //增加交易流水
    //TODO
    
    return "success";
}

mapper

接口:UserAccountMapper

void updateAccount(
    @Param("bindCode")String bindCode,
    @Param("amount")BigDecimal amount,
    @Param("freezeAmount")BigDecimal freezeAmount);

 XML:UserAccountMapper.xml

<update id="updateAccount">
    update
    user_account
    set
    amount = amount + #{amount},
    freeze_amount = freeze_amount + #{freezeAmount}
    where
    user_id = (select id from user_info where bind_code = #{bindCode})
</update>

 2、增加交易流水

增加枚举TransTypeEnum

@AllArgsConstructor
@Getter
public enum TransTypeEnum {
    RECHARGE(1,"充值"),
    INVEST_LOCK(2,"投标锁定"),
    INVEST_UNLOCK(3,"放款解锁"),
    CANCEL_LEND(4,"撤标"),
    BORROW_BACK(5,"放款到账"),
    RETURN_DOWN(6,"还款扣减"),
    INVEST_BACK(7,"出借回款"),
    WITHDRAW(8,"提现"),
    ;

    private Integer transType ;
    private String transTypeName;


    public static String getTransTypeName(int transType) {
        for (TransTypeEnum obj : TransTypeEnum.values()) {
            if (transType == obj.getTransType().intValue()) {
                return obj.getTransTypeName();
            }
        }
        return "";
    }

}

创建BO对象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TransFlowBO {

    private String agentBillNo;
    private String bindCode;
    private BigDecimal amount;
    private TransTypeEnum transTypeEnum;
    private String memo;
}

 service

接口:TransFlowService

void saveTransFlow(TransFlowBO transFlowBO);

实现:TransFlowServiceImpl

@Resource
private UserInfoMapper userInfoMapper;

@Override
public void saveTransFlow(TransFlowBO transFlowBO) {

    //获取用户基本信息 user_info
    QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<>();
    userInfoQueryWrapper.eq("bind_code", transFlowBO.getBindCode());
    UserInfo userInfo = userInfoMapper.selectOne(userInfoQueryWrapper);

    //存储交易流水数据
    TransFlow transFlow = new TransFlow();
    transFlow.setUserId(userInfo.getId());
    transFlow.setUserName(userInfo.getName());
    transFlow.setTransNo(transFlowBO.getAgentBillNo());
    transFlow.setTransType(transFlowBO.getTransTypeEnum().getTransType());
    transFlow.setTransTypeName(transFlowBO.getTransTypeEnum().getTransTypeName());
    transFlow.setTransAmount(transFlowBO.getAmount());
    transFlow.setMemo(transFlowBO.getMemo());
    baseMapper.insert(transFlow);
}

 完整的回调函数notify

@Resource
private TransFlowService transFlowService;

@Transactional(rollbackFor = Exception.class)
@Override
public String notify(Map<String, Object> paramMap) {


    log.info("充值成功:" + JSONObject.toJSONString(paramMap));

    String bindCode = (String)paramMap.get("bindCode"); //充值人绑定协议号
    String chargeAmt = (String)paramMap.get("chargeAmt"); //充值金额

    //优化
    baseMapper.updateAccount(bindCode, new BigDecimal(chargeAmt), new BigDecimal(0));
    
    //增加交易流水
    String agentBillNo = (String)paramMap.get("agentBillNo"); //商户充值订单号
    TransFlowBO transFlowBO = new TransFlowBO(
        agentBillNo,
        bindCode,
        new BigDecimal(chargeAmt),
        TransTypeEnum.RECHARGE,
        "充值");
    transFlowService.saveTransFlow(transFlowBO);
    
    return "success";
}

(四)接口调用幂等性

1、接口幂等性原则

接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次调用而产生了副作用。

举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条...这就没有保证接口的幂等性

回调重试

汇付宝向尚融宝发起回调,如果没有收到正确的响应 "success",则尚融宝会发起重试

汇付宝中的相关代码如下:

@Slf4j
public class NotifyThread implements Runnable {

    private int count = 1;
    private String notifyUrl;
    private Map<String, Object> paramMap;

    public NotifyThread(){}

    public NotifyThread(String notifyUrl, Map<String, Object> paramMap) {
        this.notifyUrl = notifyUrl;
        this.paramMap = paramMap;
    }

    @Override
    public void run() {
        task();
    }

    private void task() {
        String result = SignUtil.sendRequest(paramMap,notifyUrl);
        log.info(notifyUrl + ":" + result + " count:" + count);
        if(!"success".equals(result)) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //ScheduledTask.queue.offer(new NotifyVo(notifyUrl, paramMap));
            count++;
            if(count <= 5) {
                task();
                log.info("失败重试:" + JSON.toJSONString(this));
            }
        }
    }
}

存在的问题:当回调重试时,金额和流水会重复增加

 

 

2、解决方案

① 设置唯一索引

设置了唯一索引后,即使回调重复执行,遇到唯一索引,就会抛出异常,从而使事务回滚。

但很显然,我们不能光靠报错回滚数据库事务来防止接口幂等性 

② 判断流水是否存在

判断流水如果存在,则从业务方法中直接退出

接口:TransFlowService

boolean isSaveTransFlow(String agentBillNo);

实现:TransFlowServiceImpl

@Override
public boolean isSaveTransFlow(String agentBillNo) {
    QueryWrapper<TransFlow> queryWrapper = new QueryWrapper();
    queryWrapper.eq("trans_no", agentBillNo);
    int count = baseMapper.selectCount(queryWrapper);
    if(count > 0) {
        return true;
    }
    return false;
}

调用 :UserAccountServiceImpl

@Transactional(rollbackFor = Exception.class)
@Override
public void notify(Map<String, Object> paramMap) {

    log.info("充值成功:" + JSONObject.toJSONString(paramMap));

    //判断交易流水是否存在
    String agentBillNo = (String)paramMap.get("agentBillNo"); //商户充值订单号
    boolean isSave = transFlowService.isSaveTransFlow(agentBillNo);
    if(isSave){
        log.warn("幂等性返回");
        return;
    }

   ......
       
    //增加交易流水
    //agentBillNo = (String)paramMap.get("agentBillNo"); //商户充值订单号

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/471056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第九章 C#脚本(下)

本章节我们说一说MonoBehaviour这个类&#xff0c;它的内部有很多方法用来执行不同的逻辑。Unity脚本从唤醒到销毁都有着一套比较完善的生命周期&#xff0c;添加任何脚本都要遵守生命周期法则&#xff01;直白的讲&#xff0c;就是MonoBehaviour类中的方法的执行是有严格的顺序…

Windows强制删除文件夹

命令&#xff1a;rd/s/q 路径 如果文件较大&#xff0c;需要等待几分钟&#xff0c;但一定会删掉的。

使用Fork和GitHub完成团队项目开发

前提 拥有自己的GitHub账号项目组组长已经创建好了 一个远程仓库能够科学上网安装了Fork软件 基础步骤 该内容分为两个部分&#xff0c;分别为团队协作者&#xff08;项目成员&#xff09;和团队组织者&#xff08;项目组长&#xff09;&#xff0c;我们首先来介绍作为项目成员…

Docker-Compose 了解 部署nginx与lnmp

Docker-Compose Docker-compose 简介YAML 文件格式及编写注意事项Docker Compose配置常用字段Docker Compose 常用命令Docker Compose 文件结构部署 composeDocker Compose 环境安装 compose部署nginx&#xff08;1&#xff09;准备依赖文件编写配置文件docker-compose.yml com…

学生无线耳机哪款好?两百左右适合学生党的无线耳机推荐

学生无线耳机哪款好&#xff1f;现如今&#xff0c;学生党也成为了蓝牙耳机的主要用户群体之一。接下来&#xff0c;我来给学生群体推荐几款两百左右的无线耳机&#xff0c;一起来看看吧。 一、南卡小音舱Lite2蓝牙耳机 参考价&#xff1a;299 南卡小音舱的音质和佩戴体验都在…

Vue过渡与动画的实现效果

使用 transition 标签配合 CSS3 过渡实现【不完整代码】&#xff1a; Vue 还提供了四个 class 类名&#xff0c;分别是进入的起点&#xff08;v-enter&#xff09;进入的终点&#xff08;v-enter-to&#xff09;离开的起点&#xff08;v-leave&#xff09;离开的终点&#xff…

纷享销客标讯通,大客招标经营的杀手锏

呀&#xff0c;对手都中标了&#xff0c;我咋才知道&#xff1f;呀&#xff0c;能不能预测目标客户的招标&#xff1f;呀&#xff0c;对手有什么客户可以挖一挖&#xff1f; 呀&#xff0c;ROI 300倍的奥秘是什么&#xff1f; 纷享销客标讯通&#xff0c;帮助企业&#xff1a…

射频基础(一)

目录 一、电磁波 二、直射波 三、反射波 四、绕射波 五、散射波 六、趋肤效应 七、多径效应 八、阴影效应 九、菲涅尔区 十、慢衰落和快衰落 一、电磁波 电磁波是能量的一种&#xff0c;凡是高于绝对零度的物体&#xff0c;都会释出电磁波。电与磁可说是一体两面&#xff0c;电…

85.qt qml-炫酷烟花粒子特效(支持多种爆炸模式(文字)、爆炸阴影、背景场景)

效果如下所示: 截图如下所示: 实现内容如下所示: 1.实现多个爆炸效果2.爆炸的时候增加光度阴影效果3.由于场景有湖面,所以还需要增加一个倒影粒子组首先我们来学习下,该示例中所需要常用的类型点 1.如何更改粒子生命周期时的颜色变换动画 方法有两种。 1.1通过colorTable和s…

在 PDF 中添加文本的 3 种简单方法

我们更喜欢将我们的文件保存为 PDF 并打印它&#xff0c;这样打印的文件将保持原始的完美结构。你不得不承认&#xff0c;有时候&#xff0c;当你打印一个 Word 文件时&#xff0c;它可能会打印出乱七八糟的排版&#xff0c;这对进一步的工作来说是令人沮丧的。 PDF在我们的日…

【Python基础篇】从Hello, world到函数几分钟看完就都会了~

大家好&#xff0c;我是辣条哥~ Python是一种高级编程语言&#xff0c;易于学习和使用。以下是Python入门基础的一小部分&#xff1a; 目录 安装Python&#xff1a;编写第一个Python程序变量和数据类型运算符算术运算符&#xff1a;比较运算符&#xff1a;逻辑运算符&#xff1…

[CDC 2018] 理解压缩对抗隐私

Understanding Compressive Adversarial Privacy | IEEE Conference Publication | IEEE Xplore 摘要 本文提出了一种新的隐私保护方法&#xff0c;称为 压缩对抗隐私&#xff08;Compressive Adversarial Privacy&#xff0c;CAP&#xff09;&#xff0c;它结合了 压缩感知和 …

移动通信网络频段大全

01 5G NR 3GPP已指定5G NR 支持的频段列表&#xff0c;5G NR频谱范围可达100GHz&#xff0c;指定了两大频率范围&#xff1a; ①Frequency range 1 &#xff08;FR1&#xff09;&#xff1a;就是我们通常讲的6GHz以下频段&#xff0c;被称为 sub 6GHz&#xff1b; •频率范围&…

TDA4VM/VH 芯片硬件 mailbox

请从官网下载 TD4VM 技术参考手册&#xff0c;地址如下&#xff1a; TDA4VM 技术参考手册地址 概述 (Mailbox 的介绍在 TRM 的第7.1章节) Mailbox 使用邮箱中断机制实现了 VM 芯片的核间通信。 Mailbox 是集成在 NAVSS0 域下的一个外设&#xff08;NAVSS0 的说明可以查看&a…

(六)ArcCatalog应用基础——目录内容浏览

&#xff08;二&#xff09;ArcCatalog应用基础——目录内容浏览 目录 &#xff08;二&#xff09;ArcCatalog应用基础——目录内容浏览1.目录内容浏览2.地理数据浏览3.表格数据浏览3.1调整、冻结、排列3.2修改属性3.3表格数据统计3.4查询3.5数据字段的增删 1.目录内容浏览 Ca…

职责链设计模式解读

目录 问题引进 传统方案解决 OA 系统审批&#xff0c;传统的设计方案(类图) 传统方案解决 OA 系统审批问题分析 职责链模式基本介绍 基本介绍 职责链模式的原理类图 对原理类图的说明 职责链模式解决 OA 系统采购审批 应用实例要求 思路分析和图解(类图) 代码落地 …

局域网远程桌面工具推荐

有多种软件选项适用于局域网 (LAN) 中的远程桌面&#xff0c;包括 微软远程桌面、Splashtop、Teamviewer 等。 以下是根据性能、安全性、价格、品牌历史和其他因素对这些软件选项进行的详细比较和分析。 微软远程桌面&#xff1a; 微软远程桌面是专为 Windows 设备设计的远程…

题解,超星进程

A - Geometric Progression 思路&#xff1a;矩阵快速幂 构造[1,c]*[f(n-1)] [0,c] [c^(n-2)] ​ #include<bits/stdc.h> #include<iostream> using namespace std; typedef long long ll; ll a, x, MOD; struct matrix {ll a1, a2, b1, b2;matrix(ll a1, …

Day957.重构“烂代码” -遗留系统现代化实战

重构“烂代码” Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于重构“烂代码”的内容。 一、基于坏味道的重构 在重构时&#xff0c;要尽量先去识别《重构》中总结的二十几种坏味道&#xff0c;再用书中对应的重构手法去重构。可能会质疑&#xff0c;要不要这么教条…

powershell搞定烦人的Windows Defender

0x00 Windows Defender真烦 最近装了不少虚拟机&#xff0c;发现目前较新版本的windows Defender是真的烦&#xff0c;关了一段时间后&#xff0c;自己又打开。特别是装了域控后的winserver 2016&#xff0c;半都关不掉&#xff0c;做个实验是真烦。 顺手去查了下如何使用pow…