继开 | 博客

热爱生活,努力学习,实现自己的价值


  • 短诗的序

  • 迷途自渡

  • 寒星三两

  • 林深见鹿

  • 记昨日书

  • 顾探往昔

Vue打包,并且部署配置成网站二级目录

发表于 2021-10-17
字数统计: 226 字 | 阅读时长 ≈ 1 min

1.修改配置

在vue项目的根目录config/index.js中找build->assetsPublicPath 将”/“ 配置为”/test/“

1
2
3
build: {
// assetsPublicPath: '/',
assetsPublicPath: '/test/',

2.打包

vue 打包命令,在vue项目的根目录执行,生成dist 文件夹

1
npm run dev

3.部署子项目

将打包好的dist 放到子项目的nginx的html文件夹,并且重命名为test
子项目的nginx 配置如下

1
2
3
4
5
6
7
8
9
10
11
server {
listen 8080;
server_name localhost;
charset utf-8;
# rewrite ^(.*)$ https://www.vhxsl.com permanent;

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}

重启nginx
此时可测试子项目的nginx 是否可以看 http://127.0.0.1:8080/test

4.部署主项目

修改主nginx 的配置

1
2
3
4
5
6
location /test{
try_files $uri @test;
}
location @test{
proxy_pass http://127.0.0.1:8081$uri;
}

重启nginx
这样访问 主项目的http://127.0.0.1:80/test 就会跳转到子项目的 http://127.0.0.1:8080/test

conn.getMetaData()获取列名重复问题解决

发表于 2021-10-12
字数统计: 189 字 | 阅读时长 ≈ 1 min

步骤

1
2
3
4
5
6
7
8
9
10
11
12
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@<server>:1521:<sid>", <username>, <password>);

DatabaseMetaData meta = conn.getMetaData();
ResultSet columns = meta.getColumns(null, null, "EMPLOYEES", null);
int i = 1;
while (columns.next())
{
System.out.printf("%d: %s (%d)\n", i++, columns.getString("COLUMN_NAME"),
columns.getInt("ORDINAL_POSITION"));
}
1
2
3
4
5
6
7
8
ResultSet中包含着一套复制所有的列,即每列返回两次。 下面是我得到的输出:

1: ID (1)
2: NAME (2)
3: CITY (3)
4: ID (1)
5: NAME (2)
6: CITY (3)

解决办法,用数组判断列名,防止重复列

1
2
3
4
5
6
7
8
9
10
11
//这里是为了防止获取重复的列;
List<String> fieldList = new ArrayList<>();
if(fieldList.size()>0){
for (String field:fieldList){
String COLUM = resultSet.getString("COLUMN_NAME");
String colum = StringUtils.underScoreCase2CamelCase((COLUM.toLowerCase()));
if(colum.equals(field)){
return;
}
}
}

IDEA安装阿里代码规范插件

发表于 2021-10-11
字数统计: 159 字 | 阅读时长 ≈ 1 min

步骤

1.下载本地zip文件,下载地址:https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines

注意:选择适合自己idea版本的插件,版本不合适,不兼容

2.打开IDEA,File-> Setteings->Plugins->Install plugin from disk,
选择刚才自己下载插件zip包的地址,(最好存放的目录路径全英文),之后点击OK。之后回到主界面弹出重启的按钮,点击重启

使用

右击项目,选择编码规约扫描,扫描出不符合代码规范的内容就在idea的下面显示了

准备

阿里规范插件GitHub地址:https://github.com/alibaba/p3c

Sqlserver数据库排序空值null始终前置的方法

发表于 2021-10-09
字数统计: 73 字 | 阅读时长 ≈ 1 min

正文

【sqlserver】:

sqlserver 认为 null 最小。

升序排列:null 值默认排在最前。

要想排后面,则:order by case when col is null then 1 else 0 end ,col

降序排列:null 值默认排在最后。

要想排在前面,则:order by case when col is null then 0 else 1 end , col desc

电信光猫获取管理员账户密码

发表于 2021-10-06
字数统计: 385 字 | 阅读时长 ≈ 1 min

正文

型号:PT924G
软件版本号:V10.00.924JX02
硬件版本 V4.0.00
因为光猫路由器用久了,网络太慢了,所以想接路由器。
后面发现此神坑,一路坎坷就不赘述。
此贴主要记录个人路由器cfg设置文件的获取方式,如果看不懂我在说什么就不用看下去了。
登入方式不是192.168.1.1登入链接为下面这个
http://192.168.1.1:8080/cgi-bin/index2.asp
登入界面不再是你熟悉的那个界面,是:我的E家
旁边登入的账号密码就是你平时登入路由器后台的账号密码,然后进入到管理员界面就后台挂着不用管了,打开新的网页输入

http://192.168.1.1:8080/romfile.cfg
这样就会自动弹出下载页面。(此处建议用谷歌浏览器,左下角会提示危险是否保留,当然选择保留!!!)
PS:有些不同地区,软件版本,硬件版本和型号的登入方式不同,要是此办法不行可以192.168.1.1到后台在输入cfg的网址下载,还不行可以试试以下cfg下载网址
http192.168.1.1/backup/settings.conf
http192.168.1.1/romfile.cfg

光猫改桥接模式

网络-》宽带设置

选择第二个(2_INTERNET_B_VID_41)
模式选择桥接(Bridge)
点击确定

网络-》Qos
Qos 选择关闭 (!!! 此处很重要,不然路由器用账号密码链接之后不久将自动断掉)

Element上传关键代码记录

发表于 2021-10-02
字数统计: 637 字 | 阅读时长 ≈ 4 min

html页面

1
2
3
4
5
6
<el-form-item label="供应商资质文件上传:"  prop="file" >
<el-upload ref="upload" class="upload-demo" action="#" :on-change="handleFileChange"
:auto-upload="true" :http-request="uploadChange" :limit="50" >
<el-button size="small" type="primary">上传供应商资质文件</el-button>
</el-upload>
</el-form-item>

方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 提交
uploadChange(param, type) {
console.log(param)
let formData = new FormData()
formData.append('file', param.file)
// formData.append("id", this.id)//额外参数
//formData.append("id", 111)//额外参数
supplierqualification_uploadSupplierQualificationFileList(formData).then(res => {
this.$message({
type: 'info',
message: res.message
});
//this.addModal = false;
//this.pages();
}).catch(error => {
debugger;
console.log(error);
});
},
1
2
3
4
5
6
7
8
9
10

import {
get,
post
} from '../utils/axios'

//提交
export function supplierqualification_uploadSupplierQualificationFileList(data) {
return post(`/supplierqualification/uploadSupplierQualificationFileList`, data);
}

axios.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import Vue from "vue";
import axios from "axios";

import { getToken,windowOpen} from '@/utils/auth' // get token from cookie
// 响应时间
axios.defaults.timeout = 600 * 1000;
Vue.prototype.$axios = axios;
// 配置cookie
// axios.defaults.withCredentials = true
// 配置请求头
// axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'
// 静态资源
Vue.prototype.$static = "";
// 配置接口地址
//这里的接口地址是你地址的相同的前半部分,方便管理
// axios.defaults.baseURL = ''
// 发送请求
//post请求

if (process.env.NODE_ENV == "production") {
axios.defaults.baseURL = "/api/";
} else {
//测试
axios.defaults.baseURL = 'http://127.0.0.1:8080'
}

axios.interceptors.request.use(
config => {
try {
var userInfo = window.sessionStorage.getItem("userInfo");
if(userInfo){
let {loginname} = JSON.parse(userInfo)
config.headers.loginName = loginname
console.log("loginname",loginname);
console.log("config.headers",config.headers);
}
} catch (e) {
console.error(e)
}
return config
},
error => {
return Promise.reject(error)
}
)

export function post(url, params) {

// const hasToken = getToken();
// if (!hasToken) { // 判断当前的token是否存在
// //若没有跳转登录界面
// windowOpen();
// }else{
return new Promise((resolve, reject) => {
// console.log(1)
// console.log()
axios.post(axios.defaults.baseURL + url, params)
.then(
res => {
resolve(res.data);
},
err => {
reject(err.data);
}
)
.catch(err => {});
});
// }

}
//get请求
export function get(url, params) {
// const hasToken = getToken();
// if (!hasToken) { // 判断当前的token是否存在
// //若没有跳转登录界面
// windowOpen();
// }else{
return new Promise((resolve, reject) => {
axios.get(axios.defaults.baseURL + url, {
params: params
})
.then(res => {
resolve(res.data);
})
.catch(err => {});
});
// }
}
//get请求
export function exp(url, params) {
return new Promise((resolve, reject) => {
axios
.post(axios.defaults.baseURL + url, params, {
responseType: "blob"
})
.then(response => {
let fileName = window.decodeURI(
response.headers["content-disposition"].split("=")[1]
);
let link = document.createElement("a");
link.href = window.URL.createObjectURL(
new Blob([response.data], {
type:
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"
})
);
link.target = "_blank";
link.download = fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
});
});
}

BigDecimal加减乘除计算

发表于 2021-09-29
字数统计: 1,487 字 | 阅读时长 ≈ 6 min

首先是BigDecimal的初始化

这里对比了两种形式,第一种直接value写数字的值,第二种用string来表示

1
2
3
4
5
6
7
8
BigDecimal num1 = new BigDecimal(0.005);
BigDecimal num2 = new BigDecimal(1000000);
BigDecimal num3 = new BigDecimal(-1000000);

//尽量用字符串的形式初始化
BigDecimal num12 = new BigDecimal("0.005");
BigDecimal num22 = new BigDecimal("1000000");
BigDecimal num32 = new BigDecimal("-1000000");

加减乘除绝对值的运算

其实就是Bigdecimal的类的一些调用

加法 add()函数
减法subtract()函数
乘法multiply()函数
除法divide()函数
绝对值abs()函数

初始化Bigdecimal分别用string和数进行运算对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class TestBigdecimal {

public static void main(String[] args) {

BigDecimal num1 = new BigDecimal(0.005);
BigDecimal num2 = new BigDecimal(1000000);
BigDecimal num3 = new BigDecimal(-1000000);
//尽量用字符串的形式初始化
BigDecimal num12 = new BigDecimal("0.005");
BigDecimal num22 = new BigDecimal("1000000");
BigDecimal num32 = new BigDecimal("-1000000");

//加法
BigDecimal result1 = num1.add(num2);
BigDecimal result12 = num12.add(num22);
//减法
BigDecimal result2 = num1.subtract(num2);
BigDecimal result22 = num12.subtract(num22);
//乘法
BigDecimal result3 = num1.multiply(num2);
BigDecimal result32 = num12.multiply(num22);
//绝对值
BigDecimal result4 = num3.abs();
BigDecimal result42 = num32.abs();
//除法
BigDecimal result5 = num2.divide(num1,20,BigDecimal.ROUND_HALF_UP);
BigDecimal result52 = num22.divide(num12,20,BigDecimal.ROUND_HALF_UP);

System.out.println("加法用value结果:"+result1);
System.out.println("加法用string结果:"+result12);

System.out.println("减法value结果:"+result2);
System.out.println("减法用string结果:"+result22);

System.out.println("乘法用value结果:"+result3);
System.out.println("乘法用string结果:"+result32);

System.out.println("绝对值用value结果:"+result4);
System.out.println("绝对值用string结果:"+result42);

System.out.println("除法用value结果:"+result5);
System.out.println("除法用string结果:"+result52);
}
}

我把result全部输出可以看到结果

这里出现了差异,这也是为什么初始化建议使用string的原因

※ 注意:
1)System.out.println()中的数字默认是double类型的,double类型小数计算不精准。

2)使用BigDecimal类构造方法传入double类型时,计算的结果也是不精确的!

因为不是所有的浮点数都能够被精确的表示成一个double 类型值,有些浮点数值不能够被精确的表示成 double 类型值,因此它会被表示成与它最接近的 double 类型的值。必须改用传入String的构造方法。这一点在BigDecimal类的构造方法注释中有说明。

除法divide()参数使用

使用除法函数在divide的时候要设置各种参数,要精确的小数位数和舍入模式,不然会出现报错

我们可以看到divide函数配置的参数如下

1
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

即为 (BigDecimal divisor 除数, int scale 精确小数位, int roundingMode 舍入模式)
可以看到舍入模式有很多种BigDecimal.ROUND_XXXX_XXX, 具体都是什么意思呢

计算1÷3的结果(最后一种ROUND_UNNECESSARY在结果为无限小数的情况下会报错)

八种舍入模式解释如下

1、ROUND_UP

舍入远离零的舍入模式。

在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。

注意,此舍入模式始终不会减少计算值的大小。

2、ROUND_DOWN

接近零的舍入模式。

在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。

注意,此舍入模式始终不会增加计算值的大小。

3、ROUND_CEILING

接近正无穷大的舍入模式。

如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;

如果为负,则舍入行为与 ROUND_DOWN 相同。

注意,此舍入模式始终不会减少计算值。

4、ROUND_FLOOR

接近负无穷大的舍入模式。

如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;

如果为负,则舍入行为与 ROUND_UP 相同。

注意,此舍入模式始终不会增加计算值。

5、ROUND_HALF_UP

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。

如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。

注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。

6、ROUND_HALF_DOWN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。

如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

7、ROUND_HALF_EVEN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;

如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。

注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。

此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。

如果前一位为奇数,则入位,否则舍去。

以下例子为保留小数点1位,那么这种舍入方式下的结果。

1.15>1.2 1.25>1.2

8、ROUND_UNNECESSARY

断言请求的操作具有精确的结果,因此不需要舍入。

如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

BigDecimal 四舍五入取整

1
2
3
4
System.out.println("四舍五入取整:(2)=" + new BigDecimal("2").setScale(0, BigDecimal.ROUND_HALF_UP)); 
System.out.println("四舍五入取整:(2.1)=" + new BigDecimal("2.1").setScale(0, BigDecimal.ROUND_HALF_UP));
System.out.println("四舍五入取整:(2.5)=" + new BigDecimal("2.5").setScale(0, BigDecimal.ROUND_HALF_UP));
System.out.println("四舍五入取整:(2.9)=" + new BigDecimal("2.9").setScale(0, BigDecimal.ROUND_HALF_UP));

输出

1
2
3
4
四舍五入取整:(2)=2
四舍五入取整:(2.1)=2
四舍五入取整:(2.5)=3
四舍五入取整:(2.9)=3

Docker-Compose安装mysql并且配置表名忽略大小写配置

发表于 2021-09-28
字数统计: 464 字 | 阅读时长 ≈ 2 min

docker-compose.yml 配置

test-mysql57.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#mkdir -p /data/test-mysql57/{conf,data,logs,mysql}
#docker-compose -f test-mysql57.yml up -d
#docker-compose.yml 配置文件如下
version: "2"

services:
test-mysql57:
image: mysql:5.7
ports:
- "3306:3306"
command: --default-authentication-plugin=mysql_native_password
volumes:
- /data/test-mysql57/conf:/etc/mysql
- /data/test-mysql57/logs:/var/log/mysql
- /data/test-mysql57/data:/var/lib/mysql
- /data/test-mysql57/conf/my.cnf:/etc/mysql/my.cnf
environment:
- TZ=Asia/Shanghai
- LANG=C.UTF-8
- MYSQL_ROOT_PASSWORD=Bty@1024Test
restart: always
container_name: test-mysql57
networks:
net:
ipv4_address: 172.100.0.2
networks:
net:
external: true

若没有networks配置,此处可忽略

1
2
3
4
5
6
     networks:
net:
ipv4_address: 172.100.0.2
networks:
net:
external: true

my.cnf 配置

在/data/test-mysql57/conf目录新建文件夹mysql;
mysql文件夹下添加文件my.cnf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

[mysqld]
user=mysql # MySQL启动用户
default-storage-engine=INNODB # 创建新表时将使用的默认存储引擎
character-set-server=utf8 # 设置mysql服务端默认字符集
pid-file = /var/run/mysqld/mysqld.pid # pid文件所在目录
socket = /var/run/mysqld/mysqld.sock # 用于本地连接的socket套接字
datadir = /var/lib/mysql # 数据文件存放的目录
lower_case_table_names=1 ######################## 此处关键表名忽略大小写
#log-error = /var/log/mysql/error.log
#bind-address = 127.0.0.1 # MySQL绑定IP
expire_logs_days=7 # 定义清除过期日志的时间(这里设置为7天)
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # 定义mysql应该支持的sql语法,数据校验等!

# 允许最大连接数
max_connections=200

# ================= ↓↓↓ mysql主从同步配置start ↓↓↓ =================
# 同一局域网内注意要唯一
#server-id=3310
# 开启二进制日志功能
#log-bin=mysql-bin
# ================= ↑↑↑ mysql主从同步配置end ↑↑↑ =================

[client]
default-character-set=utf8 # 设置mysql客户端默认字符集

启动容器

在yml文件同级目录,执行命令:

1
docker-compose -f test-mysql57.yml up -d

1…181920…38

继开

一辈子很短,努力的做好两件事就好:第一件事是热爱生活,好好的去爱身边的人;第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱。

303 日志
171 标签
RSS
gitee E-Mail
0%
鲁ICP备18007712号
© 2025 继开 | 站点字数统计: 262.2k
博客使用 Hexo 搭建
|
主题 — NexT.Mist v5.1.4
人访问 次查看