Java相关

lambda表达式推导过程

package com.liu.lambda;

interface iInterface {
    void lambda();
}

// 1. 外部类
class Interface1 implements iInterface{
    @Override
    public void lambda() {
        System.out.println("外部类");;
    }
}


public class LambdaTest {
    // 2. 静态内部类
    static class Interface2 implements iInterface{
        @Override
        public void lambda() {
            System.out.println("静态内部类");
        }
    }

    public static void main(String[] args) {
        iInterface itest = new Interface1();
        // 1. 外部类调用
        iInterface i1 = new Interface1();
        i1.lambda();

        // 2. 静态内部类调用
        iInterface i2 = new Interface2();
        i2.lambda();

        // 3. 局部内部类
        class Interface3 extends Interface1 implements iInterface{
            @Override
            public void lambda() {
                System.out.println("局部内部类");
            }
        }
        // 3. 局部内部类调用
        iInterface i3 = new Interface3();
        i3.lambda();

        // 4. 匿名函数
        itest = new iInterface(){
            @Override
            public void lambda() {
                System.out.println("匿名函数");
            }
        };
        // 调用匿名函数
        itest.lambda();

        // 5. lambda 最终推导出表达式
        itest = () -> System.out.println("lambda 表达式实现");
        itest.lambda();
    }
}

Api

指定日期几天后

public static Date getDateAfter(Date date, int day) {
	Calendar now = Calendar.getInstance();
	now.setTime(date);
	now.set(Calendar.DATE, now.get(Calendar.DATE) + day);
	return now.getTime();
}

对象 List 指定属性去重

public List<BaseCustom> quChong (List<BaseCustom> to){
	List<BaseCustom> list = to.stream().collect(
		Collectors.collectingAndThen(Collectors.toCollection(
			() -> new TreeSet<>(Comparator.comparing(p -> p.getCusName()))), ArrayList::new)
	);
	list.forEach(System.out::println);
	return list;
}

public List<BaseCustom> quChong (List<BaseCustom> customList){
	Set<String> set = new HashSet<>();
	List<BaseCustom> list = new ArrayList<>();
	for (BaseCustom item : customList) {
		if (!"".equals(item.getCusName())){
			boolean add = set.add(item.getCusName());
			if(add){
				list.add(item);
			}
		}
	}
	return list;
}

通过税率计算含税金额或是不含税

sum:含税、money:不含税、rate:税率
计算含税则不含税金额传0,不含税反之

public static BigDecimal mathRateMoney(BigDecimal sum, BigDecimal money, BigDecimal rate){
	if(sum != null  && sum.compareTo(new BigDecimal(0)) == 1){
		if(rate != null  && rate.compareTo(new BigDecimal(0)) == 1){
			Double tempRate = rate.doubleValue();
			Double tempSum = sum.doubleValue();
			money = new BigDecimal(tempSum /( 1 + tempRate / 100));
			return money;
		}else{
			money = sum;
			return money;
		}
	}
	// 计算含税
	else if(money != null  && money.compareTo(new BigDecimal(0)) == 1){
		if(rate != null  && rate.compareTo(new BigDecimal(0)) == 1){
			Double tempRate = rate.doubleValue();
			Double tempMoney = money.doubleValue();
			sum = new BigDecimal(tempMoney * ( 1 + tempRate / 100));
			return sum;
		}else{
			sum = money;
			return sum;
		}
	}
	return null;
}

Java获取字段的类型

obj.getClass().getTypeName()

springboot

@Repository 注解

作用在持久层的接口上,这个注解是将接口的实现类交给 spring 管理

不使用 @Repository 注解,IDEA会报错,提示找不到这个 bean,直接忽略即可,不影响程序运行

他的作用

他本身不只是将类识别为 bean,同时还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常。Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常接口,用于封装不同的持久层架构抛出的异常,使得异常独立于底层框架

springboot 对象复制

org.springframework.beans.BeanUtils.copyProperties(cmContract.getProjectInfo(), contractProjectExtend); 括号内第一个参数是数据来源对象,第二个参数是待传入拷贝参数的对象

限制接口访问次数

mybatis

对象的属性也为对象的判断方式

先判断对象是否为空,在判断参数

<if test="baseCustom != null and baseCustom.id != null and baseCustom.id != '' "> 
	and bc.id = #{baseCustom.id}
</if>

mybatis 创建数据表

  • 对象结构
// 表对象
public class SysTempTable 
{
    private String tableName;
    private String tableMemo;
    private Long entid;
    private String isMain;
    private List<SysTempfield> list;
}
// 字段对象
public class SysTempfield 
{
    private String name;
    private String dataType;
    private String memo;
}
  • mybatis 语句
  • 使用特殊符号 &apos; 实现单引号,完成字段备注
<update id="newDataTable" parameterType="SysTempTable">
    CREATE TABLE ${tableName} (
        `id` BIGINT(19) NOT NULL AUTO_INCREMENT COMMENT 'ID',
        `main_table_id` BIGINT(19) NOT NULL COMMENT '主表数据ID',
        `vouch_id` BIGINT(19) NOT NULL COMMENT '单据ID',
        `vouch_code` VARCHAR(1024) NOT NULL COMMENT '单据CODE',
        `entid` BIGINT(19) NULL DEFAULT NULL COMMENT '企业id',
        `memo` VARCHAR(500) NULL DEFAULT NULL COMMENT '备注' COLLATE 'utf8mb4_general_ci',
        `is_deleted` TINYINT(1) NULL DEFAULT '0' COMMENT '是否删除  默认0 删除1',
        `create_userid` BIGINT(19) NULL DEFAULT NULL COMMENT '创建人ID',
        `create_by` VARCHAR(64) NULL DEFAULT '' COMMENT '创建者' COLLATE 'utf8mb4_0900_ai_ci',
        `create_time` DATETIME NULL DEFAULT NULL COMMENT '创建时间',
        `update_by` VARCHAR(64) NULL DEFAULT '' COMMENT '更新者' COLLATE 'utf8mb4_0900_ai_ci',
        `update_time` DATETIME NULL DEFAULT NULL COMMENT '更新时间',
        <foreach collection="list" item="item">
            ${item.name}  ${item.dataType} NULL DEFAULT NULL COMMENT ' ${item.memo} ',
        </foreach>
        PRIMARY KEY (`id`) USING BTREE
    )
    COLLATE='utf8mb4_unicode_ci'
    COMMENT ' ${tableMemo} '
    ENGINE=InnoDB
    ;
</update>

JS相关

js数组去重

普通数组去重

new Set(list) 方法,通过新数组接受去重后的数组即可

对象数组去重

  • this.allplan 是去重后返回的数据;res.row 为含有重复数据的原数组
this.allPlan = [];
let obj = {};
for(let i =0; i<res.rows.length; i++){
	if(!obj[res.rows[i].planId]){
		this.allPlan.push(res.rows[i]);
		obj[res.rows[i].planId] = true;
	}
}
this.list = new Set(this.list)

js字符串去掉最后一位

str.substr(0, str.length -1)

js 给对象增加属性

animal{
	name: "dog",
	age: 12
}
// 追加属性
animal["color"] = "black";

使用上述方法可以给js对象追加属性,但是在vue里面通过 v-model 不能修改所追加属性的值

对象追加响应式参数

this.$set(obj, 'att', value);

js 删除数据对应下表的元素

this.fileDifinitionList.forEach((item, index) => {
    if(item.fileName == row.fileName){
       this.fileDifinitionList.splice(index,1);
    }
})

splice(index, deleteCount); 分别传入起始位置下标以及删除的元素数量

js标准时间转换为yyyy-MM-dd格式时间

changeDate(date){
	let Dates = date;
	let Y = Dates.getFullYear();
	let M = Dates.getMonth() + 1;
	let D = Dates.getDate();
	let times = Y + (M < 10 ? "-0" : "-") + M + (D < 10 ? "-0" : "-") + D;
	return times;
},

字符串日期分割为yyyy-MM-dd

{{scope.row.bidDate != null ? scope.row.bidDate.substring(0, 10) : ''}}

js字符串内容替换

将字符串内部的 , 转换成 ~

str.replace(/,/, " ~ ")

js 正则校验

  • 密码校验:密码必须由数字、特殊符号、大写或小写字母三种形式组成
    ^(?=.*[A-Za-z])(?=.*\d)(?=.*[!"#$%&'()*+,-./:;<=>?@\[\]^_~])[A-Za-z\d!"#$%&'()*+,-./:;<=>?@[]^_{|}~]{8,16}$

Git相关

Git 拉取代码的流程

// 指定分支拉取代码
git pull origin [branchName]
// 代码暂时存
git add .
// 代码提交
git commit -m "[commitMessage]"
// push 到远程库
git push origin [branchName]

Git命令集合

// 列出所有的分支
 git branch -a  
// 创建新的分支
 git branch [name]
// 切换分支
 git checkout [name]
// 将本地文件加入暂存区
 git add .
// 添加commit注释
 git commit -m "[content]"
// 提交到服务器
 git push origin [name]
// 分支添加readme.txt文件
 touch readme.txt
 git add readme.txt
// 分支合并:首先切换到主分支,再选择要合并的分支
 git checkout master
 git merge [name]
// pull 命令
 git pull <远程主机名> <远程分支名>:<本地分支名>

Gitee push异常

Everything up-to-date

解决方式:新建分支提交改动

// 创建一个新的分支
 git branch [newbranch]
// 可以选择输入命令查看是否创建成功,提示带 * 号的分支就是当前工作分支
 git branch
// 切换工作分支,切换后可以继续使用检查命令检查是否切换成功
 git checkout newbranch
// 提交改动到新的分支
 git add .
 git commit -a
// 可以选择检查下代码提交情况,如果成功就可以切回主分支进行合并
 git checkout master
 git merge newbranch
// 合并可能会造成冲突,可以使用命令查看产生冲突的文件进行修改再次提交
 git diff
// 解决问题后就可以对代码进行提交
 git push -u origin master
// 删除新建的分支
 git branch -D newbranch

Gitee push 被拦截

尽量使用命令行操作,可以查看对应的异常信息进行查错

  1. 邮箱需要公开

Redis相关

redis配置开机自启动

  1. 运行 cmd,切换到 redis 所在目录下
  2. 运行命令 redis-server --service-install redis.windows-service.conf --loglevel verbose,就能成功添加 redis到服务中
其他 redis 命令
卸载服务:redis-server --service-uninstall

开启服务:redis-server --service-start

停止服务:redis-server --service-stop

redis 命令行命令

redis-server		启动服务
redis-cli		连接redis,命令行执行操作

redis 避免值被修改

SETNX 命令:等效于 SET 命令,但是当前键存在则不改变值

Windows相关

windows命令行指令

文件操作命令

// 改变盘符
 cd [path]		
// 跳转到 D 盘,其他盘同理
 D:	
// 跳转到根目录,等价于:cd \ 
 cd /	
// 跳转到上级目录
 cd ..	
// 查看目录内容
 dir		
// 新建文件夹;等价于:md [name]
 mkdir [name]	
// 删除文件夹
 rd [name]		
// 重命名文件
 ren [oldName.type] [newName.type]	
// 删除文件
 del *[name]*	
// 复制文件
 copy [oldName.type] [newName.type]		
// 预览文件内容
 type [name.type]		
// 清屏
 cls		清屏

node相关

node

检查 node 版本,命令行命令:node -v

检查 npm 版本,命令行命令: npm -v

npm install

使用原始 npm install 下载较慢

  • npm install --registry=https://registry.npm.taobao.org 指定镜像下载

工具问题

油猴脚本

CSDN免登录复制代码块数据

// ==UserScript==
// @name         CSDN免登录复制数据
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  CSDN免登录复制代码块内数据(还可以编辑数据)
// @author       Yang
// @match        */article/details/*
// @icon         
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let codes = document.querySelectorAll("code");

    codes.forEach(code => {
        code.contentEditable = "true";
    })
})();

MYSQL相关

mysql字段分隔查询

取出冒号前面的信息

substring_index(name, ':', 1)

substring_index 是函数名,name 是字段名,: 是分隔的条件,1 是需要的信息数量

MySQL 字段拼接

concat() 关键字,任意类型直接拼接

SELECT CONCAT(tbs.indexname ,tbs.val_middle ,tbs.tgunit ) AS 'target' FROM tb_scs tbs

GROUP_CONCAT() 可以拼接多个字段并用字符隔开
GROUP_CONCAT(ps.name, '(', ps.construction_area, ')') AS 'subitemName'

MySQL多字段组合

当查询到的列信息是由其他表的 id 加分号分隔组成的数据时,可以使用 FIND_IN_SETGROUP_CONCAT() 进行查询

mediapipe库镜像_mediapipe库镜像

如图所示数据,我们想要查到每个人的爱好名称可以使用下列语句进行查询:

SELECT 
	p.id, 
	p.name, 
	GROUP_CONCAT(h.name) AS hobby
FROM person p
LEFT JOIN hobby h 
	ON FIND_IN_SET(h.id, p.hobby)
GROUP BY p.id

mysql 日期数据查询

--今天

select * from 表名 where to_days(时间字段名) = to_days(now());

--昨天

SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1

--本周

SELECT * FROM  表名 WHERE YEARWEEK( date_format(  时间字段名,'%Y-%m-%d' ) ) = YEARWEEK( now() ) ;

--本月

SELECT * FROM  表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) ,'%Y%m' ) 

--上一个月

SELECT * FROM  表名 WHERE PERIOD_DIFF(date_format(now(),'%Y%m'),date_format(时间字段名,'%Y%m') =1

--本年

SELECT * FROM 表名 WHERE YEAR(  时间字段名 ) = YEAR( NOW( ) ) 


--上一月

SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1



--查询本季度数据
select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(now());
--查询上季度数据
select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(DATE_SUB(now(),interval 1 QUARTER));
--查询本年数据
select * from `ht_invoice_information` where YEAR(create_date)=YEAR(NOW());
--查询上年数据
select * from `ht_invoice_information` where year(create_date)=year(date_sub(now(),interval 1 year));




--查询当前这周的数据 
SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now());

--查询上周的数据
SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now())-1;

--查询当前月份的数据
select name,submittime from enterprise   where date_format(submittime,'%Y-%m')=date_format(now(),'%Y-%m')

--查询距离当前现在6个月的数据
select name,submittime from enterprise where submittime between date_sub(now(),interval 6 month) and now();

--查询上个月的数据
select name,submittime from enterprise   where date_format(submittime,'%Y-%m')=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m')

select * from ` user ` where DATE_FORMAT(pudate, ' %Y%m ' ) = DATE_FORMAT(CURDATE(), ' %Y%m ' ) ;

select * from user where WEEKOFYEAR(FROM_UNIXTIME(pudate,'%y-%m-%d')) = WEEKOFYEAR(now())

select * 
from user 
where MONTH (FROM_UNIXTIME(pudate, ' %y-%m-%d ' )) = MONTH (now())

select * 
from [ user ] 
where YEAR (FROM_UNIXTIME(pudate, ' %y-%m-%d ' )) = YEAR (now())
and MONTH (FROM_UNIXTIME(pudate, ' %y-%m-%d ' )) = MONTH (now())

select * 
from [ user ] 
where pudate between 上月最后一天
and 下月第一天

where   date(regdate)   =   curdate();

select   *   from   test   where   year(regdate)=year(now())   and   month(regdate)=month(now())   and   day(regdate)=day(now())

SELECT date( c_instime ) ,curdate( )
FROM `t_score`
WHERE 1
LIMIT 0 , 30

数据库调优

sql调优

  1. 避免使用 select *select * 不会走索引覆盖,会出现大量的回表操作,查询的数据过多会增加IO传输的事件
    在查询时只查需要的列
  2. 用 union all 替代 union
    union 关键字可以获取排重后的数据,使用 union all 可以获取所有数据,包括重复的数据
    排重的过程需要遍历、排序和比较,更消耗CPU资源,所以如果能用 union all 就尽量不用 union
  3. 小表驱动大表
    小表的数据集驱动大表的数据集,比如用户和订单表。我们应该用用户表驱动订单表进行查询
    我们一般使用 in 或者 exists 关键字来实现业务需求
    in 和 exists 的区别:
  • in 关键字会首先执行 in 里面的子查询
  • exists 会首先执行主查询语句,即 exists 左边的语句
    总结:in 适用于左边大表,右边小表;exists 适合右边小表,左边大表
  1. 批量操作
    插入语句时,建议批量插入500条以内的数据,避免重复请求数据库,如果大于500条建议分批次插入
  2. 用连接查询代替子查询
    mysql 在执行连接查询时会创建临时表,查询结束后会删除这些临时表,有额外的性能消耗
  3. join 的表不要太多
    阿里巴巴开发者手册约定,join 表的数量不建议超过3个,如果表太多,mysql在选择所有时很复杂
    我们一般可以通过冗余字段来减少表的关联查询
  4. join 时注意
    在使用 inner join 时。mysql会字段选择小表去驱动大表
    如果使用 left join,mysql会使用左表驱动右表,为了满足小表驱动大表原则,我们需要合理放置表的位置
  5. 控制索引的数量
    阿里巴巴开发手册约定单表索引不建议超过5个,因为在新增数据时会为对应字段创建索引,并且索引占有一定存储空间
    如果能建联合索引,就尽量不创建单个索引
  6. 选择合理的字段类型
  • 能用数字类型就不用字符串类型,字符处理比数字慢
  • 尽可能使用小的数据类型,比如:bit存布尔值,tinyint存枚举值
  • 长度固定的字符串使用char,长度可变使用 varchar
  • 金额一般使用 decimal,避免精度丢失
  1. 提示 group by 的效率
    group by 一般配合 having 使用,但是我们在条件允许的情况下可以先使用 where 进行筛选一遍再分组,可以节约一定资源
  2. 索引优化
    通过使用 explain 关键字可以查看 mysql 的执行计划,查看sql语句有没有走索引
    执行计划显示列:
    id(select 的唯一标识);select_type(select 类型);table(表名称);partitions(匹配的分区);type(连接类型);possible_keys(可能的索引选择);key(实际用到的索引);key_len(实际索引长度);ref(与索引比较的列);rows(预计要检查的行数);filtered(按表条件过滤的行百分比);Extra(附加信息)
    索引失效的常见原因:
  • 不满足最左前缀原则
  • 范围索引列没有放最后
  • 使用了 select *
  • 索引列上有计算
  • 索引列上使用了函数
  • 字符串类型没有加引号
  • 用 is null 和 is not null 没注意字段是否允许为空
  • like 查询左边有 %
  • 使用 or 关键字

回表、索引覆盖、最左匹配的概念

  1. 回表:select * from table where name = zhangsan(id主键,name普通索引);先根据name值找到name的B+树,然后获取叶子节点的id,根据id值再去主键的B+树中检索索引,得到查询结果,就叫回表(效率低,不建议使用)
  2. 索引覆盖:select id,name from table where name = zhangsan(id主键,name普通索引);根据name找到 id值,直接返回数据。索引的叶子节点包含要查询的全部字段,
  3. 最左匹配原则:组合索引包含了所有列就可以不遵循左前缀,如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配

Vue 相关

表格添加输入框

关键在于绑定值的选择,最好为行内元素

mediapipe库镜像_git_02

vue事件总线

在被监听的方法体内加上 this.$bus.$emit("theName"); 监听方法为this.$bus.$on("theName",function(){ // 执行方法 })

动态绑定样式

<span :style="{color:scope.row.unInvoice == 0 ? 'black' : 'red'}">{{scope.row.unInvoice}}</span>

vue对象新增响应式属性

this.$set(obj, 'attri', value)

data() {
	return {
		obj: {}
	}
},
mounted: {
	this.obj = {a:1, b: 2} // 改变this.obj.a this.obj.c的值视图会更新
	this.obj.c = 3 // 改变this.obj.c的值  视图不会更新
	Object.assign(this.obj, {d: 4}) // 改变this.obj.c的值 视图不会更新
	this.$set(this.obj, 'e', 5) // 改百年this.obj.e时 视图会更新
	console.log('obj' + this.obj)
}

vue子组件与父组件交互

  • emit提交方法到父组件,传递多个参数
// 子组件提交
checkData(){
	this.$emit('checkData', this.designer, this.jsonRawContent,)
},
// 父组件接受,参数为arguments,类型是数据列表
<toolbar-panel :designer="designer" :global-dsv="globalDsv" ref="toolbarRef" @saveData="getData(arguments)" @checkData="checkData(arguments)">
</toolbar-panel>

vue修改单页面背景颜色

beforeRouteEnter(to, from, next) {
	// 添加背景色
	document.querySelector('body').setAttribute('style', 'background-color:#f7f8fa;')
	next()
},
beforeRouteLeave(to, from, next) {
	// 去除背景色
	document.querySelector('body').setAttribute('style', '')
	next()
},

Element UI

开关组件

修改开关组件的默认值为 0 和 1

<el-switch
 v-model="value"
 :active-value="1"
 :inactive-value="0">
</el-switch>

element-ui checkbox 设置选中为1,未选中为0
<el-checkbox v-model="data" :true-label="1" :false-label="0"></el-checkbox>

element-ui 表格列合并

// 表格合并  this.dataList:数据列表
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
  if (columnIndex === 0) {
    const _row = (this.flitterData(this.dataList ).one)[rowIndex];
    const _col = _row > 0 ? 1 : 0;
    return {
      rowspan: _row,
      colspan: _col
    };
  }
  if (columnIndex === 1) {
    const _row = (this.flitterData(this.dataList ).two)[rowIndex];
    const _col = _row > 0 ? 1 : 0;
    return {
      rowspan: _row,
      colspan: _col
    };
  }

  if (columnIndex === 2) {
    const _row = (this.flitterData(this.dataList ).three)[rowIndex];
    const _col = _row > 0 ? 1 : 0;
    return {
      rowspan: _row,
      colspan: _col
    };
  }
},
flitterData(arr) {
  let spanOneArr = [],
    spanTwoArr = [],
    spanThreeArr = [],
    concatOne = 0,
    concatTwo = 0,
    concatThree = 0;
  arr.forEach((item, index) => {
    if (index === 0) {
      spanOneArr.push(1);
      spanTwoArr.push(1);
      spanThreeArr.push(1);
    } else {
      // item.tableName 第一列字段,判断条件
      if (item.tableName === arr[index - 1].tableName) { //第一列需合并相同内容的判断条件
        spanOneArr[concatOne] += 1;
        spanOneArr.push(0);
      } else {
        spanOneArr.push(1);
        concatOne = index;
      }

      if (item.tableMemo === arr[index - 1].tableMemo && item.tableName === arr[index - 1].tableName) {//第二列需合并相同内容的判断条件
        spanTwoArr[concatTwo] += 1;
        spanTwoArr.push(0);
      } else {
        spanTwoArr.push(1);
        concatTwo = index;
      }

      if (item.isMain === arr[index - 1].isMain && item.tableMemo === arr[index - 1].tableMemo && item.tableName === arr[index - 1].tableName) {//第二列需合并相同内容的判断条件
        spanThreeArr[concatTwo] += 1;
        spanThreeArr.push(0);
      } else {
        spanThreeArr.push(1);
        concatThree = index;
      }

    }
  })
  return {
    one: spanOneArr,
    two: spanTwoArr,
    three: spanThreeArr,
  }
},

html

标签

  • <pre></pre>
  • pre元素可自定义预格式化的文本,pre标签内的文本通常会保留空格和换行符

demo

简易的json格式化工具

<!DOCTYPE html>
<html>
<body>
    <p>原 json 数据<textarea id="strValue" value=""></textarea></p>
    <button onclick="newJson()">格式化</button>
    <p>转换后成果数据<pre id="result"></pre></p>
</body>
</html>

<style>
    textarea{
        width: 100%;
        height: 4rem;
    }
    button{background-color: green;}
</style>

<script>
    function newJson(){
        var jsonObj = JSON.parse(document.getElementById("strValue").value)
        var str = JSON.stringify(jsonObj, null, 4)
        document.getElementById("result").innerText=str;
    }
</script>

uni-app

uni-app页面添加返回顶部按钮

  • 利用 uni-app 提供的 scroll-view 并且允许纵向滚动
  • 业务代码用 <scroll-view></scroll-view> 包起来
<template>
	<scroll-view :scroll-into-view="topItem" scroll-with-animation scroll-y="true" class="scroll-cont my-home"
		@scroll="handleScroll">
		<view class="home">
			<view>// 比如想返回至这个位置(位置自己定),那么只需要写一个空的标签(记得带id名字)</view>
			<view id="topPosition"></view>
			<view v-for="(item, index) in Array(70)" :key="index">
				{{ index+1 }}、你的内容
			</view>
			<view>// 这个是你要点击的按钮</view>
			<view class="back-top" v-if="isShow" @click="handleBackTop">
				<icon type="download" :size="36"></icon>
			</view>
		</view>
	</scroll-view>
</template>

<script>
	export default {
		data() {
			return {
				// 返回的按钮是否显示
				isShow: false,
				// 返回顶部的标记点
				topItem: '',
			}
		},
		methods: {
			handleScroll(e) {
				// 只有scrollTop有用,先拿scrollTop
				let scrollTop = e.detail.scrollTop
				// 滑动大于500让按钮显示
				this.isShow = scrollTop > 500
				// 因为点第二次不行,这里记得重置清空一下
				this.topItem = ''
			},
			handleBackTop() {
				this.topItem = 'topPosition'
			}
		}
	}
</script>

<style>
	.my-home {
		padding: 36rpx;
	}

	.scroll-cont {
		height: 100vh;
	}

	.back-top {
		background-color: #ffffff;
		position: fixed;
		bottom: 40rpx;
		right: 24rpx;
	}

	.back-top icon {
		display: block;
		transform: rotate(180deg);
	}
</style>

python

设置镜像下载

  • cmd设置: pip config ser global.index-url + 镜像地址
  • 例:pip config set global.index-url https://pypi.doubanio.com/simple