commit 3617bcfaf06e49b6c0ca34131a3248c0cd575e6c Author: wenyongda Date: Fri Nov 18 15:29:59 2022 +0800 小达博客源码 diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..93385d9 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: npm + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 20 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2b8ad8d --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +Thumbs.db +db.json +*.log +node_modules/ +public/ +.deploy*/ +_multiconfig.yml +package-lock.json +yarn.lock \ No newline at end of file diff --git a/_config.butterfly.yml b/_config.butterfly.yml new file mode 100644 index 0000000..d068779 --- /dev/null +++ b/_config.butterfly.yml @@ -0,0 +1,47 @@ +canvas_fluttering_ribbon: + enable: true + mobile: true # false 手機端不顯示 true 手機端顯示 +# # 點擊出現愛心 +# click_heart: +# enable: true +# mobile: false +fireworks: + enable: true + zIndex: -1 # -1 or 9999 + mobile: false +# 美化頁面顯示 +beautify: + enable: true + field: site # site/post + title-prefix-icon: '\f0c1' + title-prefix-icon-color: "#F47466" +# 加載動畫 Loading Animation +preloader: true + # enable: false + # source + # 1. fullpage-loading + # 2. pace (progress bar) + # source: 1 + # pace theme (see https://codebyzach.github.io/pace/) + # pace_css_url: + +# 图片格式 background: url(http://xxxxxx.com/xxx.jpg) +# 顔色 background: '#49B202' +# 留空 显示白色 +background: '#efefef' +# background: url(https://i.loli.net/2019/09/09/5oDRkWVKctx2b6A.png) + +highlight_theme: mac light +highlight_copy: true +highlight_lang: true # show the code language 是否显示代码块语言 +highlight_shrink: false #true代码框不展开,需点击 '>' 打开 false展开 none不显示'>'按钮,代码块展开 +code_word_wrap: true +index_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/BBC19066-E176-47C2-9D22-48C81EE5DF6B.jpeg +archive_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/67239FBB-E15D-4F4F-8EE8-0F1C9F3C4E7C.jpeg + + +# Footer设置 +since: 2022 +footer_custom_text: Hi, welcome to my Xiaoda blog! +# footer是否显示图片背景(与top_img一致) +footer_bg: true \ No newline at end of file diff --git a/_config.landscape.yml b/_config.landscape.yml new file mode 100644 index 0000000..e69de29 diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..f078564 --- /dev/null +++ b/_config.yml @@ -0,0 +1,111 @@ +# Hexo Configuration +## Docs: https://hexo.io/docs/configuration.html +## Source: https://github.com/hexojs/hexo/ + +# Site +title: Xiaoda的博客 +#subtitle: 'XiaodaBlog' +description: '欢迎访问小达的博客!' +keywords: 编程 +author: Wen Yongda +language: zh-CN +timezone: 'Asia/Shanghai' + +# URL +## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project' +url: http://example.com +permalink: :year/:month/:day/:title/ +permalink_defaults: +pretty_urls: + trailing_index: true # Set to false to remove trailing 'index.html' from permalinks + trailing_html: true # Set to false to remove trailing '.html' from permalinks + +# Directory +source_dir: source +public_dir: public +tag_dir: tags +archive_dir: archives +category_dir: categories +code_dir: downloads/code +i18n_dir: :lang +skip_render: + +# Writing +new_post_name: :title.md # File name of new posts +default_layout: post +titlecase: false # Transform title into titlecase +external_link: + enable: true # Open external links in new tab + field: site # Apply to the whole site + exclude: '' +filename_case: 0 +render_drafts: false +post_asset_folder: true +marked: + prependRoot: true + postAsset: true +relative_link: false +future: true +highlight: + enable: true + line_number: false + auto_detect: false + tab_replace: + # wrap: true + hljs: true +prismjs: + enable: false + preprocess: true + line_number: false + tab_replace: '' + +# Home page setting +# path: Root path for your blogs index page. (default = '') +# per_page: Posts displayed per page. (0 = disable pagination) +# order_by: Posts order. (Order by date descending by default) +index_generator: + path: '' + per_page: 10 + order_by: -date + +# Category & Tag +default_category: uncategorized +category_map: +tag_map: + +# Metadata elements +## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta +meta_generator: true + +# Date / Time format +## Hexo uses Moment.js to parse and display date +## You can customize the date format as defined in +## http://momentjs.com/docs/#/displaying/format/ +date_format: YYYY-MM-DD +time_format: HH:mm:ss +## updated_option supports 'mtime', 'date', 'empty' +updated_option: 'mtime' + +# Pagination +## Set per_page to 0 to disable pagination +per_page: 10 +pagination_dir: page + +# Include / Exclude file(s) +## include:/exclude: options only apply to the 'source/' folder +include: +exclude: +ignore: + +# Extensions +## Plugins: https://hexo.io/plugins/ +## Themes: https://hexo.io/themes/ +# theme: landscape +theme: butterfly + +# Deployment +## Docs: https://hexo.io/docs/one-command-deployment +deploy: + type: 'git' + repo: https://gitee.com/wenyongda/xiaoda-blog.git + branch: master diff --git a/package.json b/package.json new file mode 100644 index 0000000..674df1e --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "hexo generate", + "clean": "hexo clean", + "deploy": "hexo deploy", + "server": "hexo server" + }, + "hexo": { + "version": "6.3.0" + }, + "dependencies": { + "cheerio": "^0.22.0", + "hexo": "^6.3.0", + "hexo-asset-image": "^1.0.0", + "hexo-deployer-git": "^3.0.0", + "hexo-generator-archive": "^2.0.0", + "hexo-generator-category": "^2.0.0", + "hexo-generator-index": "^3.0.0", + "hexo-generator-json-content": "^4.2.3", + "hexo-generator-tag": "^2.0.0", + "hexo-renderer-ejs": "^2.0.0", + "hexo-renderer-marked": "^6.0.0", + "hexo-renderer-pug": "^3.0.0", + "hexo-renderer-stylus": "^2.1.0", + "hexo-server": "^3.0.0", + "hexo-theme-landscape": "^0.0.3", + "hexo-theme-volantis": "^5.7.6", + "save": "^2.9.0" + } +} diff --git a/scaffolds/draft.md b/scaffolds/draft.md new file mode 100644 index 0000000..498e95b --- /dev/null +++ b/scaffolds/draft.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +tags: +--- diff --git a/scaffolds/page.md b/scaffolds/page.md new file mode 100644 index 0000000..f01ba3c --- /dev/null +++ b/scaffolds/page.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +date: {{ date }} +--- diff --git a/scaffolds/post.md b/scaffolds/post.md new file mode 100644 index 0000000..1f9b9a4 --- /dev/null +++ b/scaffolds/post.md @@ -0,0 +1,5 @@ +--- +title: {{ title }} +date: {{ date }} +tags: +--- diff --git a/source/_posts/Docker.md b/source/_posts/Docker.md new file mode 100644 index 0000000..b90e2e0 --- /dev/null +++ b/source/_posts/Docker.md @@ -0,0 +1,273 @@ +--- +title: Docker +date: 2021-03-23 10:30:31 +author: 文永达 +top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/67239FBB-E15D-4F4F-8EE8-0F1C9F3C4E7C.jpeg +--- +# Docker + +--- + +Docker:海豚,身上背着一堆集装箱 + +场景: + +传统的服务器 Docker +1G左右 几十兆几百兆 +CentOS占CPU Docker CPU引擎占用低 +1-2分钟 几秒 +安装软件 安装方便 +部署应用 部署应用,挂载,数据卷 +多个应用放到一起 每个应用服务都是一个容器,相互隔离 +一个独立的操作系统 必须依赖于操作系统,推荐使用Linux + +## docker安装: + +```shell +curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun +# 另一种方式 +curl -sSL https://get.daocloud.io/docker | sh +# 如上述两种方式都不行 +yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo +# 查看所有可安装版本 +yum list docker-ce --showduplicates | sort -r +# 安装 +yum install docker-ce-18.03.1.ce + +``` + +1、镜像:image。一个镜像代表一个软件。如:redis镜像,mysql镜像,tomcat镜像。。 + 特点:只读 +2、容器:container。一个镜像只要一启动,称之为启动了一个容器。 +3、仓库:repository。存储docker中的镜像具体位置 + 远程仓库:在全球范围内有一个远程仓库 + 本地仓库:当前自己机器中下载的镜像存储位置 + +Docker配置阿里云镜像加速 +https://www.cnblogs.com/LUA123/p/11401962.html + +## 查看docker 信息 + +```shell +docker info +``` + +## 查看docker 镜像 image + +```shell +docker images +``` + +## docker 安装镜像 image + +MySQL 5.7 + +```shell +docker pull mysql:5.7 +``` + +## docker 移除镜像 image + +若已有镜像用于容器,请先将容器删除 + +```shell +docker rm -f +``` + +```shell +docker image rm hello-world +docker rmi hello-world +``` + +```shell +# 第一个8080是外部海豚上的 第二个8080是内部集装箱上的 +docker run -p 8080:8080 +``` + +-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; +-d: 后台运行容器,并返回容器 ID; +-i: 以交互模式运行容器,通常与 -t 同时使用; +-P: 随机端口映射,容器内部端口随机映射到主机的端口 +-p: 指定端口映射,格式为:主机 (宿主) 端口:容器端口 +-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; +--name="nginx-lb": 为容器指定一个名称; +--dns 8.8.8.8: 指定容器使用的 DNS 服务器,默认和宿主一致; +--dns-search example.com: 指定容器 DNS 搜索域名,默认和宿主一致; +-h "mars": 指定容器的 hostname; +-e username="ritchie": 设置环境变量; +--env-file=[]: 从指定文件读入环境变量; +--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定 CPU 运行; +-m : 设置容器使用内存最大值; +--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; +--link=[]: 添加链接到另一个容器; +--expose=[]: 开放一个端口或一组端口; +--volume , -v 绑定一个卷 + +docker启动容器 + +```shell +docker start +``` + +docker停止容器 + +```shell +docker stop +``` + +docker重启容器 + +```shell +docker restart +``` + +## docker启动MariaDB + +拉去mariadb镜像 + +```shell +docker pull mariadb:10.2 +``` + +```shell +docker images +docker run --name mariadb10.2 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mariadb:10.2 +``` + +## dockerRedis主从复制集群搭建 + +拉取redis4.0.11镜像 + +```shell +docker pull redis:4.0.11 +``` + +编辑redis.conf + +redis-master.conf + +```shell +vim /root/mysoftware/docker-file/redis/redis-master.conf +bind 0.0.0.0 #让redis可以被任意ip访问 +daemonize yes #让redis服务后台运行 +# 如需设定密码 +requirepass masterpassword # 设定密码 +``` + +redis-slave1.conf + +```shell +vim /root/mysoftware/docker-file/redis/redis-slave1 +bind 0.0.0.0 #让redis可以被任意ip访问 +daemonize yes #让redis服务后台运行 +# 如需设定密码 +requirepass masterpassword # 设定密码 +# 设置主机地址端口 redis5.0以上为 replicaof +slaveof +# 查看master ip +docker inspect +# 主库有密码必需要配置,代表主库的访问密码 +masterauth +``` + +运行redis容器 + +redis-master + +```shell +# 运行服务 +docker run -it --name redis-master -v /usr/docker/redis/redis-master.conf:/usr/etc/redis/redis.conf -v /usr/docker/redis/data/:/data -d -p 35379:6379 redis:4.0.11 /bin/bash +# 进入容器 +docker exec -it redis-master bash +# 加载配置 +redis-server /usr/local/etc/redis/redis.conf +# 如报错 +mkdir -p /usr/redis/bin +# 测试连接 +redis-cli -a +``` + +redis-slave1 + +```shell +# 运行服务 +docker run -it --name redis-slave1 -v /usr/docker/redis/redis-slave1.conf:/usr/etc/redis/redis.conf -v /usr/docker/redis/data/:/data -d -p 35380:6379 redis:4.0.11 /bin/bash +# 进入容器 +docker exec -it redis-slave1 bash +# 加载配置 +redis-server /usr/local/etc/redis/redis.conf +# 如报错 Can't chdir to '/usr/redis/bin': No such file or directory +mkdir -p /usr/redis/bin +# 测试连接 +redis-cli +# 查看主从信息 +info Replication +# 密码认证 +auth +``` + +## dockerRedis哨兵高可用集群搭建 + +## docker的镜像迁移到另一台服务器 + +```shell +# 找到想要移动的docker容器ID +dockerCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +58ac9237b040 redis:4.0.11 "docker-entrypoint.s…" 5 hours ago Up 2 hours 0.0.0.0:6380->6379/tcp redis-slave1 +454bb484f90a redis:4.0.11 "docker-entrypoint.s…" 5 hours ago Up 2 hours 0.0.0.0:6379->6379/tcp redis-master +ps -a + +# 提交变更,并且把容器保存成镜像,命名为redis-master +docker commit 454bb484f90a redis-master +# 把redis-master镜像保存成tar文件 +docker save redis-master > /root/mysoftware/docker-file/redis/redis-master.tar +# 拷贝到新的机器,执行load命令 +docker load < ./redis-master.tar +``` + +## 修改运行中的docker容器的端口映射和挂载目录 + +方法一:删除原有容器,重建新容器 + +参考以上移除容器,启动容器 + +方法二:修改配置文件,重启docker服务 + +容器配置文件路径: + +/var/lib/docker/containers/[[hash_of_the_container]/hostconfig.json] + +其中的hashofthecontainer是docker镜像的hash值,可以通过docker ps或者docker inspect containername查看。(CONTAINER ID就可以看出来) + +可以到/var/lib/docker/containers目录下,ls -l + +```json +{"Binds":["/usr/docker/redis/redis-slave2.conf:/usr/local/etc/redis/redis.conf"],"ContainerIDFile":"","LogConfig":{"Type":"json-file","Config":{}},"NetworkMode":"default","PortBindings":{"6379/tcp":[{"HostIp":"","HostPort":"6381"}]},"RestartPolicy":{"Name":"no","MaximumRetryCount":0},"AutoRemove":false,"VolumeDriver":"","VolumesFrom":null,"CapAdd":null,"CapDrop":null,"Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IpcMode":"shareable","Cgroup":"","Links":null,"OomScoreAdj":0,"PidMode":"","Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"SecurityOpt":null,"UTSMode":"","UsernsMode":"","ShmSize":67108864,"Runtime":"runc","ConsoleSize":[0,0],"Isolation":"","CpuShares":0,"Memory":0,"NanoCpus":0,"CgroupParent":"","BlkioWeight":0,"BlkioWeightDevice":[],"BlkioDeviceReadBps":null,"BlkioDeviceWriteBps":null,"BlkioDeviceReadIOps":null,"BlkioDeviceWriteIOps":null,"CpuPeriod":0,"CpuQuota":0,"CpuRealtimePeriod":0,"CpuRealtimeRuntime":0,"CpusetCpus":"","CpusetMems":"","Devices":[],"DeviceCgroupRules":null,"DiskQuota":0,"KernelMemory":0,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":null,"OomKillDisable":false,"PidsLimit":0,"Ulimits":null,"CpuCount":0,"CpuPercent":0,"IOMaximumIOps":0,"IOMaximumBandwidth":0} +``` + +重启docker服务,再启动容器服务就可以了。 + +```shell +systemctl restart docker +docker ps -a +docker start +``` + +## docker安装code-server + +```shell +# 拉取镜像 +docker pull codercom/code-server +# 创建宿主机目录 +mkdir /usr/docker/codeserver +# 创建配置文件 +vim /usr/docker/codeserver/config.yaml + +bind-addr: 127.0.0.1:8080 +auth: password +password: 123456 +cert: false + +# 创建并启动容器 # -u 表示以 root用户运行 +docker run -d -u root -p 8088:8080 --name code-server -v /usr/docker/codeserver/config.yaml:/root/.config/code-server/config.yaml -v /usr/docker/codeserver:/home/code codercom/code-server +``` diff --git a/source/_posts/Hexo.md b/source/_posts/Hexo.md new file mode 100644 index 0000000..1d97288 --- /dev/null +++ b/source/_posts/Hexo.md @@ -0,0 +1,28 @@ +--- +title: Hexo +date: 2022-11-18 10:30:31 +author: 文永达 +--- + +# Hexo + +启动本地开发服务器 + +```shell +hexo server +# or +hexo s +``` + +清空本地缓存 + +```shell +hexo clean +``` + +发布到Git上 + +```shell +hexo g -d +``` + diff --git a/source/_posts/Jenkins.md b/source/_posts/Jenkins.md new file mode 100644 index 0000000..86ea9b5 --- /dev/null +++ b/source/_posts/Jenkins.md @@ -0,0 +1,27 @@ +--- +title: Jenkins +date: 2022-11-09 10:30:31 +author: 文永达 +top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/B18FCBB3-67FD-48CC-B4F3-457BA145F17A.jpeg +--- +# Jenkins + +```powershell +# 删除文件夹 +rmdir /q /s C:\Program" "Files\nginx-1.23.2\html\dist +# 复制文件夹到指定目录 +xcopy /y /e /i C:\Users\Administrator\Documents\source\XiaoDaERP-Vben\dist C:\Program" "Files\nginx-1.23.2\html\dist +# 发送文件(文件夹)到Linux远程服务器上 +pscp -r -l root -pw Wyd210213 C:\Users\Administrator\Documents\source\XiaoDaERP-Vben\dist 8.140.174.251:/usr/local/nginx/html +``` + +```shell +docker run -d -p 80:80 -p 443:443 --name nginxweb --privileged=true +-v /usr/local/nginx/html/:/usr/share/nginx/html +-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf +-v /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d +-v /usr/local/nginx/logs:/var/log/nginx nginx + + +ps aux | grep "nginx: worker process" | awk '{print $1}' +``` \ No newline at end of file diff --git a/source/_posts/Linux.md b/source/_posts/Linux.md new file mode 100644 index 0000000..116b763 --- /dev/null +++ b/source/_posts/Linux.md @@ -0,0 +1,535 @@ +--- +title: Linux +author: 文永达 +top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/00E0F0ED-9F1C-407A-9AA6-545649D919F4.jpeg + +--- +# Linux + +--- + +## 简介 + +在linux系统中,没有盘符的概念。 +一个盘。/根目录 +没有图形化界面 +通过指令操作 + +linux指令是可以传参数的。 + +在Linux系统下,万事万物皆文件。 + +## Linux的文件结构(19个) + +bin:存放的是二进制的可以执行文件。(重点) +sbin:存放的是二进制的可以执行文件。super,只有root用户才能访问 +etc:存放系统配置文件(重点) +usr:用来存放共享的系统资源 +home:家目录(重点) +root:就是root用户的家目录 +dev:存放设备文件 + +## Linux指令 + +ip addr(ip a):查看主机的ip地址 +clear:清屏 +cd:进入指定的目录 +ls:列出当前目录下的所有文件及目录 +ls -l:给ls指令传了一个参数l。等同于ll。列出当前目录下的所有文件及目录的详情。 +ls bin:ls后可以接目录名,要么接绝对路径。 +tab键:提示作用。自动补全。 +cd (cd ~):代表回到家目录 +pwd:查看当前所在的目录 +方向键↑和↓:浏览历史指令 + +mkdir:创建目录 +mkdir -p:创建多级目录 +cp aa.txt init:复制粘贴。把aa.txt复制到init目录下 +cp -r init spring:复制粘贴。把init目录以及包含的文件复制到spring目录下 +mv aa.txt xiaoqiang.txt:重命名。把aa.txt重命名为xiaoqiang.txt。 +mv bb.txt spring:移动。把bb.txt移动到spring目录。 +mv -f spring aaaaa:在覆盖前不提示 +mv -r aaaaa bbbbb:强行覆盖。前提是被覆盖的目录和覆盖的目录要结构相同。(慎用) +rm xiaoqiang.txt:删除xiaoqiang.txt +rm -f spring.xml:强行删除spring.xml,没有确认提示 +rm -r init:递归删除init目录 +rm -rf bbbbb:递归删除bbbbb并且没有确认提示(慎用) +rmdir aa:删除空目录aa(用的很少) +rm -rf *:删除所有的目录及文件(慎用) + +cat:显示文本文件的内容(一部分)。.java,.py,.c++,.xml,.html,.js,.css +more:分页显示文本文件的内容。只能向下查看,不能向上翻页。 +less:分页显示文本文件的内容。上下翻页。通过PgUp和PgDn进行上下翻页,↑和↓一行一行的查看。输入q退出查看。 +top -n 10 xxxx:查看文本文件的前10行 +tail -n 10 xxxx:查看文本文件的后10行 +tail -f xxxx:实时监控文本文件的变化 +Ctrl + c:几乎可以退出所有的操作 +echo:打印输出一句话。也可以用作向文本文件内写入信息。会自动追加并换行。 + +### 压缩: + +1、打包,把多个文件打成一个包。 +2、压缩,把文件占用的大小进行压缩。 + +tar命令:用来进行压缩和解压缩的。 + -c 建立一个压缩文件(打包) + -x 解开一个压缩文件(解包) + -z 是否需要使用gzip压缩 + -v 压缩过程中是否显示文件日志 + -f 使用的文件名 +tar -cf:只打包,不压缩,不显示日志 +tar -xf:解压文件,不显示日志 +tar -cvf:只打包,不压缩,显示日志 +tar -xvf:解压文件,显示日志。 +tar -zcvf:打包压缩,显示日志 +tar -zxvf:解压(最常用) + +### 系统服务: + +systemstl:操作系统服务。 + status:查看某个服务的状态 + stop:终止某个服务 + start:启动某个服务 + restart:重启某个服务 + +```shell +systemctl status mysqld +``` + +网络服务:network +防火墙服务:firewalld +Mysql:mysqld +systemctl status network + +## 文件详情:(以home目录为例) + +d:说明当前文件是一个目录(- 代表的是文件) +rwx:r,可读;w,可写;x,可执行。(代表当前文件的创建者的权限) +r-x:代表的是和文件创建者的同组的用户的权限 +r-x:代表的是其他用户 +2:链接数 +root:创建者 +root:创建者所在的组 +6:文件占用空间的大小(字节) +Apr 11 2018:最后一次修改时间 +home:文件名或目录名 + +## 进程管理 + +ps 查看前台进程 +ps -aux 查看所有进程详细信息 UID 用户 PID 进程ID +ps -ef 查看所有进程详细信息 UID 用户 PID 进程ID PPID 父进程ID +父进程id为1 为系统进程 +top 动态显示进程 +ps -aux|grep network 查看所有进程详细信息,并搜索network进程 +kill 根据PID,终止进程 +kill -9 强制终止 + +## vi命令 编辑器 + +i 切换到编辑模式 +ESC 切换到命令模式 +:wq 保存并退出 +:q 不保存退出 +:w 保存 +:q! 强制不保存退出 +:wq! 强制保存退出 +a 在光标后插入 +A 在光标当前行的行尾插入 +i 在光标前插入 +I 在光标当前行的行头插入 +:set nu 显示行号 +:set nonu 取消显示行号 +gg 到文本的第一行 +G 到文本的最后一行 +u 后退一步 相当于 Ctrl + z +Ctrl + r 前进一步 +Shift + zz 保存退出 跟:wq一样 +起始行号,结束行号 del 删除对应范围内的行 + +安装vim编辑器 + +```shell +yum install -y vim +``` + +## 配置网络 + +```shell +cd /etc/sysconfig/network-scripts +vi ifcfg-ens33 + +TYPE=Ethernet +PROXY_METHOD=none +BROWSER_ONLY=no +BOOTPROTO=dhcp +DEFROUTE=yes +IPV4_FAILURE_FATAL=no +IPV6INIT=yes +IPV6_AUTOCONF=yes +IPV6_DEFROUTE=yes +IPV6_FAILURE_FATAL=no +IPV6_ADDR_GEN_MODE=stable-privacy +NAME=ens33 +UUID=08913b58-0bc2-42c5-8b59-6782e0029d7b +DEVICE=ens33 +ONBOOT=yes + +# 修改ONBOOT=yes +systemctl restart network + +ip addr +``` + +## 软件安装 + +rpm 本地安装 +yum centos安装软件 需要源 + +安装screenFetch + +```shell +#使用wget 下载安装包 +wget https://github.com/KittyKatt/screenFetch/archive/master.zip +#使用unzip解压,unzip需要安装 +yum install unzip +unzip master.zip +#移动 +mv screenFetch-master/screenfetch-dev /usr/bin/screenfetch +``` + +## 用户 + +who am i 查看当前用户 +who --count 查看当前登录用户数量 +exit 退出登录 +groupadd 创建用户组 +groupdel 删除用户组 +useradd xiaoqiang -g user 创建一个用户xiaoqiang,并指定用户组user +passwd xiaoqiangf 给xiaoqiang用户指定密码 +su 切换用户 从root切换到其他用户不需要输入密码 如果从其他用户切换到root用户,需要输入密码 + +### 权限管理 + +Linux 下文件有三种权限 r 读 w写 x可执行 + +--- + +```shell +chmod 755 file +``` + +## 安装MySQL + +有些Linux会自带MariaDB数据库,所以需要先卸载 + +列出安装的MariaDB的包 + +```shell +rpm -qa | grep mariadb +``` + +得到查看到的包名 + +卸载包 后面加上包名 + +```shell +rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 +``` + +自此下载MariaDB已经完成了 + +切换到home目录下 + +```shell +cd /home/ +``` + +安装 wget 并下载yum库 + +```shell +yum install wget -y +wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm +rpm -Uvh mysql80-community-release-el7-1.noarch.rpm +cd /etc/yum.repos.d/ +vim mysql-community.repo +``` + +选择要安装的MySQL版本 + +```shell +[mysql57-community] +name=MySQL 5.7 Community Server +baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ +enabled=0 // 将这里的0改为1 +gpgcheck=1 +gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql + +[mysql80-community] +name=MySQL 8.0 Community Server +baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/ +enabled=1 //将这里的1改为0 +gpgcheck=1 +gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql +``` + +enabled=0为禁用对应版本的YUM库,enabled=1为启用,默认8.0的配置为enabled=1,安装5.7的话,我们就把8.0的enabled=1修改为enabled=0,然后把5.7的enabled=0修改为enabled=1 + +安装MySQL并启动 + +```shell +yum install mysql-community-server +service mysqld start +``` + +第一步安装成功之后,然后启动MySQL + +如果失败了,提示GPG + +RPM 维护一个单独的密钥环,因为它是一个系统范围的应用程序,而用户的 GPG 公钥环是一个用户特定的文件。要将 MySQL 公钥导入 RPM 密钥环,首先获取密钥,然后使用 rpm --import 导入密钥 + +```shell +# centos +rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 + +# Ubuntu: +wget -q -O - https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 | apt-key add - + +yum install mysql-community-server +``` + +查看MySQL初始密码 + +```shell +sudo grep 'temporary password' /var/log/mysqld.log +``` + +登录MySQL + +```shell +mysql -u root -p +``` + +设置密码的验证强度等级 + +```shell +set global validate_password_policy=LOW; +``` + +设置密码长度为6位 + +```shell +set global validate_password_length=6; +``` + +修改MySQL初始密码 + +```shell +ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; +``` + +给root权限开启远程登录 + +```shell +use mysql; +select user,host from user; +update user set host = '%' where user = 'root'; +flush privileges; +``` + +--- + +## 配置Java环境变量 + +将tar.gz格式的jdk解压后移动到/usr目录下 + +```shell +mv jdk1.8.0_301/ /usr/ +``` + +编辑/etc目录下profile文件 G到最后一行 + +```shell +vim /etc/profile + +export JAVA_HOME=/usr/jdk1.8.0_301 +export PATH=$PATH:$JAVA_HOME/bin + +``` + +:wq保存退出 + +重新加载配置文件 + +```shell +source /etc/profile +``` + +--- + +## CentOS7防火墙 + +放行特定端口 + +```shell +firewall-cmd --add-port=6379/tcp --permanent +``` + +重新加载防火墙 + +```shell +firewall-cmd --reload +``` + +查看防火墙开放的端口 + +```shell +firewall-cmd --list-all +``` + +指定作用域开发防火墙端口 + +```shell +firewall-cmd --zone=public --add-port=3306/tcp --permanent +# -zone 作用域 +# -add-port 添加端口,格式为端口/协议 +# -permanent 永久生效,没有此参数重启后失效 + +``` + +## 分配Swap + +查看分区大小 + +```shell +free -h +``` + +使用dd命令创建一个swap分区 + +```shell +dd if=/dev/zero of=/home/swap bs=1024 count=4194304 +``` + +count的值是:size(多少M)* 1024 + +格式化swap分区 + +```shell +mkswap /home/swap +``` + +把格式化后的文件分区设置为swap分区 + +```shell +swapon /home/swap +``` + +swap分区自动挂载 + +```shell +vim /etc/fstab +# G 在文件末尾加上 +/home/swap swap swap default 0 0 +``` + +关闭Swap + +```shell +swapoff /home/swap +``` + +### 修改swap使用率 + +swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。两个极端 + +查看swappiness + +```shell +cat /proc/sys/vm/swappiness +``` + +修改swappiness值为60 + +```shell +sysctl vm.swappiness=60 +``` + +但是这只是临时性的修改,还要做一步 + +```shell +vim /etc/sysctl.conf +# 编辑这行 +vm.swappiness=60 +``` + +## Windows Linux子系统 + +### WSL2 + +打开 Windows Terminal PowerShell + +#### 安装 + +```powershell +wsl --install +``` + +微软官方文档 [安装 WSL | Microsoft Docs](https://docs.microsoft.com/zh-cn/windows/wsl/install) + +默认安装Ubuntu 20.04 LTS版 + +更改默认安装的Linux发行版 + +```powershell +wsl --install -d +``` + +/mnt目录下是Windows系统的挂载盘,可直接访问Windows磁盘文件 + +#### 通过FinalShell连接WSL2 + +1. 需要先删除ssh,再安装ssh + +```shell +apt-get remove --purge openssh-server #先删ssh +apt-get install openssh-server #再安装ssh +rm /etc/ssh/ssh_config +service ssh --full-restart #重启ssh服务 +``` + +2. 修改配置文件 + +```shell +vim /etc/ssh/sshd_config + +Port 6666 # 指定连接端口 6666 +ListenAddress 0.0.0.0 # 指定连接的IP +PasswordAuthentication yes # 开启密码认证 +PermitRootLogin yes # 开启root用户登录 + +``` + +3. 重启ssh(每次重启wsl都要执行该语句) + +```shell +service ssh --full-restart +``` + +4. 重新生成host key + +```shell +dpkg-reconfigure openssh-serve +``` + +FinalShell就可以连接WSL2了 + +## 安装Nginx + +```shell +tar -zxvf nginx-1.21.4.tar.gz +cd nginx-1.21.4/ +./configure +make +make install +``` diff --git a/source/_posts/Oracle.md b/source/_posts/Oracle.md new file mode 100644 index 0000000..f998dcc --- /dev/null +++ b/source/_posts/Oracle.md @@ -0,0 +1,450 @@ +--- +title: Oracle +date: 2021-03-23 10:30:31 +author: 文永达 +--- +# Oracle + +## 1.1 安装Oracle 19c + +### 1.1.1 Linux下安装 + +#### 1.1.1.1 rpm方式 `没成功` + +从Oracle官网下载安装包 Linux x86-64 RPM + +https://www.oracle.com/database/technologies/oracle-database-software-downloads.html + +安装帮助文档 + +https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/preface.html#GUID-071A6B76-11E3-4421-963E-41DA6F2EF07A + +下载地址 + +https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/index.html,浏览器搜索-19c + +安装,首先执行 + +```shell +yum install oracle-database-preinstall-19c-1.0-3.el7.x86_64.rpm +``` + +会提示缺少依赖 + +可以去RPM源网站下载 + +http://www.rpmfind.net/linux/rpm2html/search.php?query=compat-libcap1(x86-64) + +安装 + +```shell +rpm -ivh compat-libcap1-1.10-7.el7.x86_64.rpm +``` + +再次执行 + +```shell +yum install oracle-database-preinstall-19c-1.0-3.el7.x86_64.rpm +``` + +安装数据库 + +```shell +yum install oracle-database-ee-19c-1.0-1.x86_64.rpm +``` + +如果发生错误 + +```shell +Exception java.lang.UnsatisfiedLinkError: /opt/oracle/product/19c/dbhome_1/oui/lib/linux64/liboraInstaller.so: libnsl.so.1: cannot open shared object file: No such file or directory occurred.. +java.lang.UnsatisfiedLinkError: /opt/oracle/product/19c/dbhome_1/oui/lib/linux64/liboraInstaller.so: libnsl.so.1: cannot open shared object file: No such file or directory + at java.lang.ClassLoader$NativeLibrary.load(Native Method) + at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941) + at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857) + at java.lang.Runtime.loadLibrary0(Runtime.java:870) + at java.lang.System.loadLibrary(System.java:1122) + at oracle.sysman.oii.oiip.osd.unix.OiipuUnixOps.loadNativeLib(OiipuUnixOps.java:388) + at oracle.sysman.oii.oiip.osd.unix.OiipuUnixOps.(OiipuUnixOps.java:130) + at oracle.sysman.oii.oiip.oiipg.OiipgEnvironment.getEnv(OiipgEnvironment.java:201) + at oracle.sysman.oii.oiix.OiixIniPair.instantiateEnvVars(OiixIniPair.java:299) + at oracle.sysman.oii.oiix.OiixIniPair.updateValue(OiixIniPair.java:230) + at oracle.sysman.oii.oiix.OiixIniPair.(OiixIniPair.java:148) + at oracle.sysman.oii.oiix.OiixIniFile.readFile(OiixIniFile.java:809) + at oracle.sysman.oii.oiix.OiixIniFile.readIniFile(OiixIniFile.java:978) + at oracle.sysman.oii.oiix.OiixIniFile.getProfileString(OiixIniFile.java:385) + at oracle.sysman.oii.oiix.OiixOraparam.getOraparamProfileString(OiixOraparam.java:338) + at oracle.sysman.oii.oiix.OiixOraparam.getOraparamProfileString(OiixOraparam.java:296) + at oracle.sysman.oii.oiix.OiixOraparam.usePrereqChecker(OiixOraparam.java:416) + at oracle.sysman.oii.oiic.OiicSessionContext.setVariables(OiicSessionContext.java:1325) + at oracle.sysman.oii.oiic.OiicBaseInventoryApp.execute(OiicBaseInventoryApp.java:771) + at oracle.sysman.oii.oiic.OiicBaseInventoryApp.main_helper(OiicBaseInventoryApp.java:690) + at oracle.sysman.oii.oiic.OiicDetachHome.main(OiicDetachHome.java:420) +'DetachHome' failed. +Exception in thread "main" java.lang.NullPointerException + at oracle.sysman.oii.oiic.OiicBaseInventoryApp.main_helper(OiicBaseInventoryApp.java:706) + at oracle.sysman.oii.oiic.OiicDetachHome.main(OiicDetachHome.java:420) +Exception java.lang.NoClassDefFoundError: Could not initialize class oracle.sysman.oii.oiip.osd.unix.OiipuUnixOps occurred.. +java.lang.NoClassDefFoundError: Could not initialize class oracle.sysman.oii.oiip.osd.unix.OiipuUnixOps + at oracle.sysman.oii.oiip.oiipg.OiipgEnvironment.getEnv(OiipgEnvironment.java:201) + at oracle.sysman.oii.oiix.OiixIniPair.instantiateEnvVars(OiixIniPair.java:299) + at oracle.sysman.oii.oiix.OiixIniPair.updateValue(OiixIniPair.java:230) + at oracle.sysman.oii.oiix.OiixIniPair.(OiixIniPair.java:148) + at oracle.sysman.oii.oiix.OiixIniFile.readFile(OiixIniFile.java:809) + at oracle.sysman.oii.oiix.OiixIniFile.readIniFile(OiixIniFile.java:978) + at oracle.sysman.oii.oiix.OiixIniFile.getProfileString(OiixIniFile.java:385) + at oracle.sysman.oii.oiix.OiixOraparam.getOraparamProfileString(OiixOraparam.java:338) + at oracle.sysman.oii.oiix.OiixOraparam.getOraparamProfileString(OiixOraparam.java:296) + at oracle.sysman.oii.oiix.OiixOraparam.usePrereqChecker(OiixOraparam.java:416) + at oracle.sysman.oii.oiic.OiicSessionContext.setVariables(OiicSessionContext.java:1325) + at oracle.sysman.oii.oiic.OiicBaseInventoryApp.execute(OiicBaseInventoryApp.java:771) + at oracle.sysman.oii.oiic.OiicBaseInventoryApp.main_helper(OiicBaseInventoryApp.java:690) + at oracle.sysman.oii.oiic.OiicAttachHome.main(OiicAttachHome.java:696) +'AttachHome' failed. +Exception in thread "main" java.lang.NullPointerException + at oracle.sysman.oii.oiic.OiicBaseInventoryApp.main_helper(OiicBaseInventoryApp.java:706) + at oracle.sysman.oii.oiic.OiicAttachHome.main(OiicAttachHome.java:696) +[SEVERE] An error occurred while registering the Oracle home. Verify logs in /var/log/oracle-database-ee-19c/results/oraInstall.log and /opt/oracle/oraInventory for more details and try again. +warning: %post(oracle-database-ee-19c-1.0-1.x86_64) scriptlet failed, exit status 1 +``` + +解决办法 + +```shell + yum -y install /lib64/libnsl.so.1 +``` + +再次执行安装 + +```shell +# 需要先删除 /opt/oracle/* +rm -rf /opt/oracle/* +# 再次执行安装 需要加上 --force +rpm -ivh oracle-database-ee-19c-1.0-1.x86_64.rpm --force +``` + +配置数据库 + +```shell +/etc/init.d/oracledb_ORCLCDB-19c configure +``` + +过程较长,等待即可 + +可能会JDK报错 + +```shell +yum install libnsl +``` + +配置号后设置当前用户下的环境变量 + +```shell +vi ~/.bashrc +# 追加oracle环境变量信息 +export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1 +export ORACLE_SID=ORCLCDBexport +PATH=$ORACLE_HOME/bin:$PATH + +# 保存退出,执行 +source ~/.bashrc +``` +验证安装是否正确 + +```shell +su oracle + +sqlplus / as sysdba + +# 提示 +SQL*Plus: Release 19.0.0.0.0 - Production on Mon Oct 17 12:25:27 2022 +Version 19.3.0.0.0 + +Copyright (c) 1982, 2019, Oracle. All rights reserved. + +Connected to an idle instance. +``` + +启动监听 + + +![image-20221017123327552](image/Oracle/image-20221017123327552.png) + +#### 1.1.1.2 Docker方式 + +安装Docker + +```shell +sudo wget -qO- https://get.docker.com/ | bash +docker --version +systemctl start docker +systemctl status docker +systemctl enable docker +``` + +拉取镜像 `quay.io/maksymbilenko/oracle-12c` + +```shell +docker pull quay.io/maksymbilenko/oracle-12c +``` + +如果有本地镜像则使用 + +```shell +docker build -t quay.io/maksymbilenko/oracle-12c . +``` + +构建容器 + +```shell +# 首先创建本地目录 +mkdir /oracle/data +# 授予权限 +chmod -R 777 /oracle/data +docker run --name o12c -d -p 8080:8080 -p 1521:1521 -v /oracle/data:/u01/app/oracle quay.io/maksymbilenko/oracle-12c +# 查看日志 +docker logs -f # 字符串ID +``` + + + +![image-20221017145702216](image/Oracle/image-20221017145702216.png) + +安装完成 + +数据库连接信息 + +```yaml +hostname: localhost +port: 1521 +sid: xe +service name: xe +username: system +password: oracle +``` + +进入容器修改账号密码设置 + +```shell +# 查看所有容器信息 +docker ps -a +docker exec -it [containerID] /bin/bash +# 切换成oracle用户 +su oracle +# 进入sqlplus +$ORACLE_HOME/bin/sqlplus / as sysdba + +SQL*Plus: Release 12.1.0.2.0 Production on Sun Aug 1 03:15:37 2021 + +Copyright (c) 1982, 2014, Oracle. All rights reserved. + + +Connected to: +Oracle Database 12c Standard Edition Release 12.1.0.2.0 - 64bit Production + +# 设置密码有效期为无限制 +SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; + +Profile altered. + +SQL> alter user SYSTEM account unlock; + +User altered. + +# 创建一个账号为act_test的用户密码设置为test +SQL> create user act_test identified by test; + +User created. +# 为这个用户赋予管理员的权限 +SQL> grant dba to act_test; + +Grant succeeded. + +# ctrl + p + q 退出容器(注意不要exit退出,防止容器直接关闭了) +``` + + + +## 2.1 Oracle SQL Developer + +### 2.1.1 设置自动提示 + +工具栏 -> 工具 -> 首选项 -> 代码编辑器 -> 完成设置 + +![image-20221017111632399](image/Oracle/image-20221017111632399.png) + +### 2.1.2 设置代码模板 + +工具栏 -> 工具 -> 首选项 -> 代码编辑器 -> 代码模板 + +![image-20221017112825105](image/Oracle/image-20221017112825105.png) + +### 2.1.3 同时打开多个表 + +工具栏 -> 工具 -> 首选项 -> 数据库 ->对象查看器 + +![image-20221020141231505](image/Oracle/image-20221020141231505.png) + + + +## 3.1 SQL PLUS + +### 3.1.1 解决控制台输错命令删除 + +使用`Ctrl + backspace`代替`backspace` + +### 3.1.2 登录 + +```shell +# 以oracle账号登录 +su oracle +$ORACLE_HOME/bin/sqlplus / as sysdba +``` + + + +## 4.1 语法 + +### 4.1.1 新建表空间 + +```sql +CREATE TABLESPACE ACT_DEV + DATAFILE + '\oracle\data\oradata\xe\FILE_SPECIFICATION1.dbf' SIZE 52428800 AUTOEXTEND ON NEXT 52428800 MAXSIZE 2147483648 + + EXTENT MANAGEMENT LOCAL; +``` + +### 4.1.2 解除占用 + +```sql +select l.session_id,o.owner,o.object_name +from v$locked_object l,dba_objects o +where l.object_id=o.object_id; + +SELECT sid, serial#, username, osuser FROM v$session where sid = sid; + +alter system kill session 'sid,serial#'; +``` + +### 4.1.3 修改表 + +```sql +-- 表重命名 +ALTER TABLE BOOK +RENAME TO BIND_PHONE_NUMBER; +-- 添加表字段Column +ALTER TABLE BIND_PHONE_NUMBER +ADD (USERNAME VARCHAR2(20) ); +-- 修改表字段Column名 +ALTER TABLE BIND_PHONE_NUMBER RENAME COLUMN NAME TO APPNAME; +``` + +### 4.1.4 使用关键字做完表名,列名 + +使用""形式,如"INDEX" + +## 5.1 内连接与外连接 + +### 5.1.1 内连接 + +合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行 + +语法: + +```sql +SELECT 字段列表 +FROM A表 INNER JOIN B表 +ON 关联条件 +WHERE 条件; +``` + +类似于: + +```sql +方式一 +SELECT e.employee_id, e.last_name, e.department_id, +d.department_id, d.location_id +FROM employees e JOIN departments d +ON (e.department_id = d.department_id); + +方式二: +SELECT employee_id,department_name +FROM employees e,departments d +WHERE e.`department_id` = d.department_id; +``` + +这种查询方式,它会把所有的符合where条件的字段查询出来。但是有这样一种情况,就是两张表的数据有的不存在某种关系。 + +缺点:如果我们想要把不满足条件的数据也查询出来,内连接就做不到。 + +于是引入外连接。 + +### 5.1.2 外连接 + +查询多表时一般要求中出现:查询所有的数据时,就一定会用到外连接。 + +两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右)外连接。没有匹配的行时,结果表中相应的列为空(NULL)。 + +#### 5.1.2.1 满外连接 + +`FULL JOIN` + +`LEFT JOIN UNION RIGHT JOIN` + +#### 5.1.2.2 左外连接 + +语法: + +```sql +SELECT 字段列表 +FROM A表 LEFT JOIN B表 +ON 关联条件 +WHERE 条件; +``` + +类似于: + +```sql +SELECT e.last_name, e.department_id, d.department_name +FROM employees e +LEFT OUTER JOIN departments d +ON (e.department_id = d.department_id) ; +``` + +`employees`表中的数据会全部显示出来 + +#### 5.1.2.3 右外连接 + +语法: + +```sql +SELECT 字段列表 +FROM A表 RIGHT JOIN B表 +ON 关联条件 +WHERE 条件; +``` + +类似于: + +```sql +SELECT e.last_name, e.department_id, d.department_name +FROM employees e +RIGHT OUTER JOIN departments d +ON (e.department_id = d.department_id) ; +``` + +`departments`表中的数据会全部显示出来 + +### 5.1.3 UNION的使用 + +·语法: + +```sql +SELECT column,... FROM table1 +UNION [ALL] +SELECT column,... FROM table2 +``` + +UNION 操作符返回两个查询的结果集的并集,去除重复记录。 + +UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。 diff --git a/source/_posts/Typora.md b/source/_posts/Typora.md new file mode 100644 index 0000000..1e40fc8 --- /dev/null +++ b/source/_posts/Typora.md @@ -0,0 +1,64 @@ +--- +title: Typora +date: 2022-11-18 14:48:31 +author: 文永达 +top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/B951AE18-D431-417F-B3FE-A382403FF21B.jpeg +--- + +# Typora + +## 设置引用图片存储路径 + +![image-20221118150139161](image/Typora/image-20221118150139161.png) + +## Typora添加右键新建Markdown文件 + +### 步骤 + +新建一个txt文本文件,写入: + +```shell +Windows Registry Editor Version 5.00 + +[HKEY_CLASSES_ROOT\.md] +@="Typora.md" +"Content Type"="text/markdown" +"PerceivedType"="text" + +[HKEY_CLASSES_ROOT\.md\ShellNew] +"NullFile"="" + + +``` + +然后修改.txt后缀为.reg的注册表文件 + +然后双击运行 + +## 几点说明 + +这个方法要先安装`Typora`。如果不安装`Typora`,只是导入上述注册表,在很久以前是可以生效的,但自从某次`Windows`更新之后就失效了,之后的 Windows 要求`[HKEY__ROOT\.md]`项的`@ 值 xxx`必须对应于注册表项`[HKEY_CLASSES_ROOT\xxx]`,这里填写`Typora.md`,是因为`Typora `已经为我们生成了`[HKEY_CLASSES_ROOT\Typora.md]`,可以不用再重入导入,这个项的`@ 值`代表右键新建该类型的名称显示。如果是自定义其他的类型,则必须导入一遍,比如要添加`.py`类型,一个最简的注册表如下: + +```shell +Windows Registry Editor Version 5.00 + +[HKEY_CLASSES_ROOT\.py] +@="PythonFile" + +[HKEY_CLASSES_ROOT\.py\ShellNew] +"NullFile"="" + +[HKEY_CLASSES_ROOT\PythonFile] +@="Python 脚本" + +``` + +## 可能遇到的问题 + +右键新建markdown文件以后,可能会发现文件有几十MB那么大。 + +解决方法:`win+R`打开“运行”输入`regedit`打开注册表,打开路径`\HKEY_CLASSES_ROOT\.md\ShellNew` + +删除多余的文件(尤其是有一个什么Markdown File),只保留如下的两项。然后关闭注册表,即可修复bug + +![img](https://www.likecs.com/default/index/img?u=aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTYwNDA5My8yMDIwMDIvMTYwNDA5My0yMDIwMDIyNTIzNDk1MDM5MS0xOTgzNTc3NDQxLnBuZw%3D%3D) \ No newline at end of file diff --git a/source/_posts/Vue.md b/source/_posts/Vue.md new file mode 100644 index 0000000..1065e5e --- /dev/null +++ b/source/_posts/Vue.md @@ -0,0 +1,1480 @@ +--- +title: Vue +date: 2021-03-23 10:30:31 +author: 文永达 +--- +# Vue + +## Vite + +官方文档 + +https://cn.vitejs.dev + +### vite.config.js配置 + +#### src设置@别名 + +```javascript +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +const { resolve } = require('path') +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue()], + resolve:{ + alias:{ + '@': resolve('src') + } + } +}) +``` + +## 1.1 vite.config.ts 引入 path 模块注意点 + +1. 安装`@types/node` + +2. 在 `tsconfig.node.json`配置 + + ```json + "compilerOptions": { + ... + "allowSyntheticDefaultTmports": true + } + ``` + + +## npm包管理器 + +```shell +# 淘宝镜像 +npm config set registry http://registry.npm.taobao.org/ +# 查看镜像 +npm config get registry +``` + + + +### CentOS7安装node js + +```shell +# 首先下载nodejs安装包 +# 解压 注意这不是gz压缩 +tar -xvf node-v14.18.1-linux-x64.tar.xz +mv node-v14.18.1-linux-x64.tar.xz /usr/node +vim /etc/profile +# node +export NODE_HOME=/usr/node +export PATH=$PATH:$NODE_HOME/bin +source /etc/profile +# 查看node 版本 +node -v +npm -v +# 安装yarn +npm install -g yarn +# 软连接,防止找不到环境 +ln -s "/usr/node/bin/node" "/usr/local/bin/node" +ln -s "/usr/node/bin/npm" "/usr/local/bin/npm" +ln -s "/usr/node/bin/yarn" "/usr/local/bin/yarn" +``` + + + +## yarn包管理器 + +```shell +# PowerShell yarn : 无法加载文件 C:\Users\Admin\AppData\Roaming\npm\yarn.ps1,因为在此系统因为在此系统上禁止运行脚本。 +# 以管理员方式运行powershell +set-ExecutionPolicy RemoteSigned + +# 查看当前镜像 +yarn config get registry + +# https://registry.yarnpkg.com +# 更换镜像 +yarn config set registry https://registry.yarnpkg.com + +# 查看镜像是否成功 +yarn config get registry + +# 全局安装PTE脚手架 +yarn global add generator-pte-cli +# 安装依赖 +yarn +# 运行项目 +yarn dev # yarn run dev +# 部署 +# 具体看 package.json +yarn deploy +yarn build +# 移除依赖 +yarn remove pte-ui +# 安装依赖 +yarn add pte-ui@2.1.54 + + +``` + +### 安装node-sass + +```shell +# 安装gyp +npm install -g node-gyp +npm config set python python2.7 +npm config set msvs_version 2017 +yarn +``` + +## Vue CLI + +### 安装 + +```shell +npm install -g @vue/cli +yarn global add @vue/cli +vue --version +``` + +### 升级 + +```shell +npm upadte -g @vue/cli +yarn global upgrade --latest @vue/cli +``` + + +### 创建一个项目 + +```shell +vue create hello-world #创建一个名叫 hello-world 的 vue cli项目 +``` + +### 配置全局环境变量 + +.env 全局默认配置文件,不论什么环境都会加载合并 + +.env.development 开发环境下的配置文件 + +.env.production 生产环境下的配置文件 + +属性名必须以VUE_APP_开头 + +.env.development + +```properties +VUE_APP_URL='' +``` + +文件的加载 + +根据启动命令vue会自动加载对应的环境,vue是根据文件名进行加载的,所以上面说“不要乱起名,也无需专门控制加载哪个文件” + +比如执行npm run serve命令,会自动加载.env.development文件,也有可能是npm run dev,这个得看package.json配置的是啥,具体看下面package.json配置 + +可通过process.env属性 (全局属性) + +.env有的,.env.development也有,就会优先.env.development,.env.development没有的,.env有的,就会有.env的 + +### vue.config.js配置 + +#### src设置@别名 + +```javascript +module.exports = { + chainWebpack: config => { + config.resolve.alias + .set('@', resolve("src")) + } +} +``` + +#### 端口设置 + +```javascript +module.exports = { + devServer: { + port: 9090 + } +} +``` + +#### 跨域代理 + +```javascript +module.exports = { + devServer: { + proxy: { + '/api': { + target: 'http://127.0.0.1:9001', + ws: true, + changeOrigin: true, + pathRewrite: { + '^/api': '' + } + } + } + } +} +``` + + + +### package.json配置 + +#### 环境配置 + +```json +{ + "scripts": { + "start": "vue-cli-service serve --open --mode production", + "dev": "vue-cli-service serve --open", + "build": "vue-cli-service build", + "build:prod": "vue-cli-service build --mode production", + "lint": "vue-cli-service lint --fix", + "upload": "vue-cli-service ssh", + "test:unit": "vue-cli-service test:unit", + "test:e2e": "vue-cli-service test:e2e --mode development" + } +} +``` + +scripts中dev 说明 需要用 npm run dev 来启动开发环境 + +如果是serve则是 npm run serve,可以手动添加serve + +```json +"scripts": { + "start": "vue-cli-service serve --open --mode production", + "dev": "vue-cli-service serve --open", + "serve": "vue-cli-service serve --open", + "build": "vue-cli-service build", + "build:prod": "vue-cli-service build --mode production", + "lint": "vue-cli-service lint --fix", + "upload": "vue-cli-service ssh", + "test:unit": "vue-cli-service test:unit", + "test:e2e": "vue-cli-service test:e2e --mode development" + } +``` + + + +# Axios + +## 安装 + +```shell +npm install axios +yarn add axios +``` + +## 创建实例 + +```javascript +// MyAxios.js +import axios from 'axios' +const instance = axios.create({ + baseURL: 'http://localhost:8080', + timeout: 3000 +}) +export default instance +``` + +```javascript +// demoApi.js +import axios from '@/utils/MyAxios' +import Qs from 'qs' +export const findList = () => { + return axios({ + url: '', + method: 'get', + params: { + + } + }) +} +export const add = (data) => { + return axios({ + url: '', + method: 'post', + //axios默认contentType为application/json springmvc默认是application/x-www-form-urlencoded + //需添加请求头 + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + //并且数据需要转换成js对象 + data: Qs.stringify(data) + }) +} +``` + + + +# TypeScript + +## 1.1 基础类型 + +### 1.1.1 布尔值 + +```typescript +let isDone: boolean = false; +``` + +### 1.1.2 数字 + +```typescript +let decLiteral: number = 6; +let hexLiteral: number = 0xf00d; +let binaryLiteral: number = 0b1010; +let octalLiteral: number = 0o744; +``` + +### 1.1.3 字符串 + +```typescript +let name: string = "bob"; +name = 'smith'; +``` + +还可以使用*模版字符串*,它可以定义多行文本和内嵌表达式。 这种字符串是被反引号包围( ```),并且以`${ expr }`这种形式嵌入表达式 + +```typescript +let name: string = `Gene`; +let age: number = 37; +let sentence: string = `Hello , my name is ${ name }. +I'll be ${ age + 1 } years old next month.`; +``` + +这与下面定义相同 + +```typescript +let sentence: string = "Hello, my name is " + name + ".\n\n" + + "I'll be " + (age + 1) + " years old next month."; +``` + +### 1.1.4 数组 + +可以在元素类型后面接上`[]`,表示由此类型元素组成的一个数组: + +```typescript +let list: number[] = [1, 2, 3]; +``` + +或者 + +```typescript +let list: Array = [1, 2, 3]; +``` + +### 1.1.5 元组 + +元组类型允许表示一个已知元素类型和类型的数组,各元素的类型不必相同。比如,你可以定义一对值分别为`string`和`number`类型的元组。 + +```typescript +let x: [string, number]; + +x = ['hello', 10]; +``` + +### 1.1.6 枚举 + +使用`enum`类型可以为一组数组赋予友好的名字。 + +```typescript +enum Color {Red, Green, Blue} +let c: Color = Color.Green; +``` + +默认情况下,从`0`开始为元素编号。 你也可以手动的指定成员的数值。 例如,我们将上面的例子改成从 `1`开始编号: + +```typescript +enum Color {Red = 1, Green, Blue} +let c: Color = Color.Green; +``` + +或者,全部都采用手动赋值: + +```typescript +enum Color {Red = 1, Green = 2, Blue = 4} +let c: Color = Color.Green; +``` + +枚举类型提供的一个便利是你可以由枚举的值得到它的名字。 例如,我们知道数值为`2`,但是不确定它映射到`Color`的哪个名字,我们可以查找相应的名字: + +```typescript +enum Color {Red = 1, Green, Blue} +let colorName: string = Color[2]; + +console.log(colorName); // 显示'Green'因为上面代码里它的值是2 +``` + +### 1.1.7 Any + +不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。 + + 那么可以使用 `any`类型来标记这些变量: + +```typescript +let notSure: any = 4; +notSure = "maybe a string instead"; +notSure = false; // okay, definitely a boolean +``` + +在对现有代码进行改写的时候,`any`类型是十分有用的,它允许你在编译时可选择地包含或移除类型检查。 你可能认为 `Object`有相似的作用,就像它在其它语言中那样。 但是 `Object`类型的变量只是允许你给它赋任意值 - 但是却不能够在它上面调用任意的方法,即便它真的有这些方法: + +```typescript +let notSure: any = 4; +notSure.ifItExists(); // okay, ifItExists might exist at runtime +notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check) + +let prettySure: Object = 4; +prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'. +``` + +当只知道一部分数据的类型时,`any`类型也是有用的。比如,有一个数组,它包含了不同类型的数据: + +```typescript +let list: any[] = [1, true, "free"]; +console.log(list[1]); // true +list[1] = 100; // 100 +``` + +比较像元组 + +### 1.1.8 Void + +`void`类型与`any`类型相反,它表示没有任何类型。当一个函数没有返回值时,通常会见到其返回类型是`void`: + +```typescript +function warnUser(): void { + console.log("This is my warning message"); +} +``` + +声明一个`void`类型的变量没有什么大用,因为你只能为它赋予`undefinded`和`null`: + +```typescript +let unusable: void = undefin +``` + + + +# VueRouter + +# Vuex + +Vuex是一个专为Vue.js应用程序开发的**状态管理模式**。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 + +状态(state)通俗说就是数据(data)。 + +可用于父子组件数据传值。最主要用于解决兄弟组件数据传值,以往通过将数据存储到localStorage中。 + +## 安装 + +```shell +yarn add vuex +``` + +## state + +state相当于组件中的data,专门用来存放全局的数据 + +在`src`下创建 `store`文件夹 + +创建`index.js`文件 + +```javascript +import { createStore } from 'vuex'; + +export default createStore({ + // state相当于组件中的data,专门用来存放全局的数据 + state: { + num: 0 + }, + // + getters: {}, + // + mutations: { + increment (state) { + state.num++ + } + }, +}) +``` + +修改入口文件`main.js` + +```javascript +import { createApp } from 'vue' +import App from './App.vue' + +// 引入store +import store from '@/store' + +createApp(App).use(store).mount('#app') +``` + +在`src`下创建`views`文件夹 + +创建`About.vue` + +```vue + + + + + +``` + +创建`Home.vue` + +```vue + + + + + +``` + +在`components`文件夹下创建`Btn.vue` + +```vue + + + + + +``` + + + +修改主组件`App.vue` + +```vue + + + + + + +``` + +## getters + +getters相当于组件中的computed,getters是全局的,computed是组件内部的 + +修改`index.js` + +```javascript +// 在store(仓库)下的index.js这份文件,就是用来做状态管理的 +// import Vuex from 'vuex'; +import { createStore } from 'vuex'; + +export default createStore({ + // state相当于组件中的data,专门用来存放全局的数据 + state: { + num: 0 + }, + // getters相当于组件中的computed,getters是全局的,computed是组件内部的 + getters: { + getNum(state) { + return state.num + } + }, + // + mutations: { + increment (state) { + state.num++ + } + }, + + +}) +``` + +修改`About.vue` + +```vue + + + + + +``` + +## mutations + +mutations相当于组件中的methods,但是它不能使用异步方法(定时器、axios) + +修改`index.js` + +```javascript +// 在store(仓库)下的index.js这份文件,就是用来做状态管理的 +// import Vuex from 'vuex'; +import { createStore } from 'vuex'; + +export default createStore({ + // state相当于组件中的data,专门用来存放全局的数据 + state: { + num: 0 + }, + // getters相当于组件中的computed,getters是全局的,computed是组件内部的 + getters: { + getNum(state) { + return state.num + } + }, + //mutations相当于组件中的methods,但是它不能使用异步方法(定时器、axios) + mutations: { + increment (state, payload) { + state.num+=payload ? payload : 1 + } + }, + + +}) +``` + +修改`Btn.vue` + +```vue + + + + + +``` + +## actions + +actions专门用来处理异步,实际修改状态值的,依然是mutations + +修改`index.js` + +```javascript +// 在store(仓库)下的index.js这份文件,就是用来做状态管理的 +// import Vuex from 'vuex'; +import { createStore } from 'vuex'; + +export default createStore({ + // state相当于组件中的data,专门用来存放全局的数据 + state: { + num: 0 + }, + // getters相当于组件中的computed,getters是全局的,computed是组件内部的 + getters: { + getNum(state) { + return state.num + } + }, + //mutations相当于组件中的methods,但是它不能使用异步方法(定时器、axios) + mutations: { + increase (state, payload) { + state.num += payload ? payload : 1 + }, + clear (state) { + state.num = 0 + }, + decrease (state, payload) { + if (state.num === 0) { + state.num = 0 + } else { + state.num -= payload ? payload : 1 + } + } + }, + // actions专门用来处理异步,实际修改状态值的,依然是mutations + actions: { + decreaseAync (context, num) { + context.commit('decrease', num) + + } + } + +}) +``` + +修改`Btn.vue` + +```vue + + + + + +``` + + + +# Vben Admin + +官方文档 + +https://vvbin.cn/doc-next/ + +# D2Admin + +## API封装 + +/src/api + +### axios实例 + +`service.js` + +### 自定义API + +modules目录 + +`sys.user.api.js` + +```javascript +// import { find, assign } from 'lodash' + +// const users = [ +// { username: 'admin', password: 'admin', uuid: 'admin-uuid', name: 'Admin' }, +// { username: 'editor', password: 'editor', uuid: 'editor-uuid', name: 'Editor' }, +// { username: 'user1', password: 'user1', uuid: 'user1-uuid', name: 'User1' } +// ] +// import Qs from 'qs' +const baseURL = '/admin' +export default ({ service, request, serviceForMock, requestForMock, mock, faker, tools }) => ({ + /** + * @description 登录 + * @param {Object} data 登录携带的信息 + */ + SYS_USER_LOGIN (data = {}) { + // 模拟数据 + // mock + // .onAny('/login') + // .reply(config => { + // const user = find(users, tools.parse(config.data)) + // return user + // ? tools.responseSuccess(assign({}, user, { token: faker.random.uuid() })) + // : tools.responseError({}, '账号或密码不正确') + // }) + // 接口请求 + return request({ + url: baseURL + '/login/login', + method: 'post', + data: data + // data: Qs.stringify(data), + // headers: { + // 'Content-Type': 'application/x-www-form-urlencoded' + // } + + }) + }, + FIND_USER_LIST (data = {}) { + return request({ + url: baseURL + '/user/getAll', + method: 'post', + data: data + }) + }, + REFRESH_MSG () { + return request({ + url: baseURL + '/user/refreshmsg', + method: 'get' + }) + }, + ADD_USER (data = {}) { + return request({ + url: baseURL + '/user/add', + method: 'post', + data: data + }) + }, + UPDATE_USER (data = {}) { + return request({ + url: baseURL + '/user/update', + method: 'put', + data: data + }) + }, + DELETE_USER_BY_ID (data = {}) { + return request({ + url: baseURL + '/user/delete', + method: 'delete', + data: data + }) + } +}) + +``` + +`sys.menu.api.js` + +```javascript +const baseURL = '/admin' +export default ({ request }) => ({ + MENU_CURRENT (data = {}) { + return request({ + url: baseURL + '/menu/get/current/menutree', + method: 'get' + }) + }, + ROUTER_CURRENT (data = {}) { + return request({ + url: baseURL + '/menu/get/current/vuerouter', + method: 'get' + }) + } +}) + +``` + + + +## 登录逻辑 + +登录页面 + +/src/views/system/login/page.vue + +`page.vue` + +```vue + +``` + +/src/store/modules/d2admin/modules/account.js + +`account.js` + +```javascript +actions: { + /** + * @description 登录 + * @param {Object} context + * @param {Object} payload username {String} 用户账号 + * @param {Object} payload password {String} 密码 + * @param {Object} payload route {Object} 登录成功后定向的路由对象 任何 vue-router 支持的格式 + */ + async login ({ dispatch }, { + username = '', + password = '', + to = '/' + } = {}) { + // 这里axios请求 + const res = await api.SYS_USER_LOGIN({ username, password }) + // 设置 cookie 一定要存 uuid 和 token 两个 cookie + // 整个系统依赖这两个数据进行校验和存储 + // uuid 是用户身份唯一标识 用户注册的时候确定 并且不可改变 不可重复 + // token 代表用户当前登录状态 建议在网络请求中携带 token + // 如有必要 token 需要定时更新,默认保存一天 + util.cookies.set('uuid', res.uuid) + util.cookies.set('token', res.token) + // 设置 vuex 用户信息 + await dispatch('d2admin/user/set', { name: res.name }, { root: true }) + // 用户登录后从持久化数据加载一系列的设置 + await dispatch('load') + // 此处执行动态菜单 动态路由 + await dispatch('updateCache', { to: to }) + }, +} +``` + +## 动态菜单 + +修改`main.js`入口文件 + +```javascript +new Vue({ + router, + store, + i18n, + render: h => h(App), + created () { + // 处理路由 得到每一级的路由设置 + this.$store.commit('d2admin/page/init', frameInRoutes) + + // 设置顶栏菜单 + // this.$store.commit('d2admin/menu/headerSet', menuHeader) + // 设置侧边栏菜单 + // this.$store.commit('d2admin/menu/asideSet', menuAside) + + // 对于已登录的做菜单,搜索数据处理 + this.$store.dispatch('d2admin/menu/get') + // 初始化菜单搜索功能 修改搜索数据根据侧边栏还是头部栏 + // this.$store.commit('d2admin/search/init', menuAside) + }, +``` + +注释掉以下 mutation + +```javascript + // 设置顶栏菜单 + // this.$store.commit('d2admin/menu/headerSet', menuHeader) + // 设置侧边栏菜单 + // this.$store.commit('d2admin/menu/asideSet', menuAside) +``` + +所有逻辑在Vuex中完成 + +到 /src/store/modules/d2admin/modules/menu.js + +`menu.js` + +```javascript +// 设置文件 +import setting from '@/setting.js' +import api from '@/api' +import { uniqueId } from 'lodash' +// 这是从/src/menu/index.js拿到的方法 负责给菜单空的path加上 d2-menu-empty- #随机数字 需要引入lodash uniqueId +function supplementPath (menu) { + return menu.map(e => ({ + ...e, + path: e.path || uniqueId('d2-menu-empty-'), + ...e.children ? { + children: supplementPath(e.children) + } : {} + })) +} +export default { + namespaced: true, + state: { + // 顶栏菜单 + header: [], + // 侧栏菜单 + aside: [], + // 侧边栏收缩 + asideCollapse: setting.menu.asideCollapse, + // 侧边栏折叠动画 + asideTransition: setting.menu.asideTransition + }, + actions: { + /** + * 设置侧边栏展开或者收缩 + * @param {Object} context + * @param {Boolean} collapse is collapse + */ + async asideCollapseSet ({ state, dispatch }, collapse) { + // store 赋值 + state.asideCollapse = collapse + // 持久化 + await dispatch('d2admin/db/set', { + dbName: 'sys', + path: 'menu.asideCollapse', + value: state.asideCollapse, + user: true + }, { root: true }) + }, + /** + * 切换侧边栏展开和收缩 + * @param {Object} context + */ + async asideCollapseToggle ({ state, dispatch }) { + // store 赋值 + state.asideCollapse = !state.asideCollapse + // 持久化 + await dispatch('d2admin/db/set', { + dbName: 'sys', + path: 'menu.asideCollapse', + value: state.asideCollapse, + user: true + }, { root: true }) + }, + // 以下为生成菜单数据的 action + /** + * 设置菜单 + * @param {*} param0 + * @param {*} aside + */ + async set ({ state, dispatch }, aside) { + aside = supplementPath(Array.from(await api.MENU_CURRENT())) + state.aside = aside + console.log('---set-------') + // 持久化 + await dispatch('d2admin/db/set', { + dbName: 'sys', + path: 'menu.aside', + value: aside, + user: true + }, { root: true }) + // 搜索 + await dispatch('d2admin/search/init', aside, { root: true }) + }, + // 这个是页面刷新用到的 + async get ({ state, dispatch, commit }) { + state.aside = await dispatch('d2admin/db/get', { + dbName: 'sys', + path: 'menu.aside', + defaultValue: [], + user: true + }, { root: true }) + commit('asideSet', state.aside) + // 搜索 + await dispatch('d2admin/search/init', state.aside, { root: true }) + }, + /** + * 设置侧边栏折叠动画 + * @param {Object} context + * @param {Boolean} transition is transition + */ + async asideTransitionSet ({ state, dispatch }, transition) { + // store 赋值 + state.asideTransition = transition + // 持久化 + await dispatch('d2admin/db/set', { + dbName: 'sys', + path: 'menu.asideTransition', + value: state.asideTransition, + user: true + }, { root: true }) + }, + /** + * 切换侧边栏折叠动画 + * @param {Object} context + */ + async asideTransitionToggle ({ state, dispatch }) { + // store 赋值 + state.asideTransition = !state.asideTransition + // 持久化 + await dispatch('d2admin/db/set', { + dbName: 'sys', + path: 'menu.asideTransition', + value: state.asideTransition, + user: true + }, { root: true }) + }, + /** + * 持久化数据加载侧边栏设置 + * @param {Object} context + */ + async asideLoad ({ state, dispatch }) { + // store 赋值 + const menu = await dispatch('d2admin/db/get', { + dbName: 'sys', + path: 'menu', + defaultValue: setting.menu, + user: true + }, { root: true }) + state.asideCollapse = menu.asideCollapse !== undefined ? menu.asideCollapse : setting.menu.asideCollapse + state.asideTransition = menu.asideTransition !== undefined ? menu.asideTransition : setting.menu.asideTransition + } + }, + mutations: { + /** + * @description 设置顶栏菜单 + * @param {Object} state state + * @param {Array} menu menu setting + */ + headerSet (state, menu) { + // store 赋值 + state.header = menu + }, + /** + * @description 设置侧边栏菜单 + * @param {Object} state state + * @param {Array} menu menu setting + */ + asideSet (state, menu) { + // store 赋值 + state.aside = menu + } + } +} + +``` + + + +到 /src/store/modules/d2admin/modules/account.js + +`account.js` + +新增一个action updateCache + +```javascript +updateCache ({ dispatch }, { to = '/' }) { + return new Promise((resolve, reject) => { + // 设置菜单 + dispatch('d2admin/menu/set', {}, { root: true }) + // 设置路由 + api.ROUTER_CURRENT().then(result => { + dispatch('d2admin/router/load', { to: to, focus: true, data: result }, { root: true }) + }) + + resolve() + }) + } +``` + +api请求 + +/src/api/modules/sys.menu.api.js + +`sys.menu.api.js` + +```javascript +const baseURL = '/admin' +export default ({ request }) => ({ + // 菜单请求 + MENU_CURRENT (data = {}) { + return request({ + url: baseURL + '/menu/get/current/menutree', + method: 'get' + }) + }, + // 路由请求 + ROUTER_CURRENT (data = {}) { + return request({ + url: baseURL + '/menu/get/current/vuerouter', + method: 'get' + }) + } +}) + +``` + +响应报文 + +```json +{ + "code": 0, + "msg": "请求成功", + "data": [ + { + "id": 1, + "title": "信评中心", + "enname": "crManager", + "parentId": -1, + "icon": "folder-o", + "sort": 1, + "isEnabled": 1, + "children": [ + { + "id": 2, + "title": "信评工作台", + "enname": "crWorkbench", + "parentId": 1, + "icon": "folder-o", + "sort": 2, + "isEnabled": 1, + "children": [ + { + "id": 3, + "title": "信用评级待办", + "parentId": 2, + "icon": "folder-o", + "sort": 3, + "isEnabled": 1 + } + ] + }, + { + "id": 4, + "title": "信用评级启动", + "parentId": 1, + "icon": "folder-o", + "isEnabled": 1, + "children": [ + { + "id": 5, + "title": "个人评级", + "enname": "cr_person_launch", + "parentId": 4, + "path": "/cr_person_launch", + "component": "cr/cr_launch/cr_person_launch/cr_person_launch", + "icon": "folder-o", + "isEnabled": 1 + }, + { + "id": 6, + "title": "企业评级", + "enname": "cr_business_launch", + "parentId": 4, + "path": "/cr_business_launch", + "component": "cr/cr_launch/cr_business_launch/cr_business_launch", + "icon": "folder-o", + "isEnabled": 1 + } + ] + }, + { + "id": 7, + "title": "信用评级查询", + "parentId": 1, + "icon": "folder-o", + "isEnabled": 1 + }, + { + "id": 8, + "title": "评级模板管理", + "parentId": 1, + "icon": "folder-o", + "isEnabled": 1 + } + ] + }, + { + "id": 9, + "title": "系统管理", + "parentId": -1, + "icon": "folder-o", + "isEnabled": 1, + "children": [ + { + "id": 10, + "title": "用户管理", + "enname": "usertable", + "parentId": 9, + "path": "/usertable", + "component": "user/usertable", + "icon": "folder-o", + "isEnabled": 1 + }, + { + "id": 11, + "title": "菜单管理", + "enname": "menu", + "parentId": 9, + "path": "/menu", + "component": "menu/menu", + "isEnabled": 1 + }, + { + "id": 16, + "title": "权限管理", + "enname": "role", + "parentId": 9, + "path": "/role", + "component": "role/role", + "isEnabled": 1 + } + ] + }, + { + "id": 12, + "title": "演示页面", + "parentId": -1, + "isEnabled": 1, + "children": [ + { + "id": 13, + "title": "页面 1", + "enname": "page1", + "parentId": 12, + "path": "/page1", + "component": "demo/page1", + "isEnabled": 1 + }, + { + "id": 14, + "title": "页面 2", + "enname": "page2", + "parentId": 12, + "path": "/page2", + "component": "demo/page2", + "isEnabled": 1 + }, + { + "id": 15, + "title": "页面 3", + "enname": "page3", + "parentId": 12, + "path": "/page3", + "component": "demo/page3", + "isEnabled": 1 + } + ] + } + ], + "type": "success" +} +``` + + + diff --git a/source/_posts/Winform.md b/source/_posts/Winform.md new file mode 100644 index 0000000..d9ba7d1 --- /dev/null +++ b/source/_posts/Winform.md @@ -0,0 +1,36 @@ +--- +title: Winform +date: 2022-11-18 14:48:31 +author: 文永达 +top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/B951AE18-D431-417F-B3FE-A382403FF21B.jpeg +--- + +# Winform + +## 1 .Net Framework + +### 1.1 控件属性 + +#### 1.1.1 Name + +表示控件名 + +```c# +this.button1.Name = "button1"; +``` + +#### 1.1.2 Text + +表示控件文本显示 + +```c# +this.button.Text = "button1"; +``` + +### 1.2 控件事件 + +#### 1.2.1 button按钮 + +##### 1.2.1.1 click + +​ diff --git a/source/_posts/image/Oracle/image-20221017111632399.png b/source/_posts/image/Oracle/image-20221017111632399.png new file mode 100644 index 0000000..06112b6 Binary files /dev/null and b/source/_posts/image/Oracle/image-20221017111632399.png differ diff --git a/source/_posts/image/Oracle/image-20221017112825105.png b/source/_posts/image/Oracle/image-20221017112825105.png new file mode 100644 index 0000000..3380e52 Binary files /dev/null and b/source/_posts/image/Oracle/image-20221017112825105.png differ diff --git a/source/_posts/image/Oracle/image-20221017123327552.png b/source/_posts/image/Oracle/image-20221017123327552.png new file mode 100644 index 0000000..47d9625 Binary files /dev/null and b/source/_posts/image/Oracle/image-20221017123327552.png differ diff --git a/source/_posts/image/Oracle/image-20221017145702216.png b/source/_posts/image/Oracle/image-20221017145702216.png new file mode 100644 index 0000000..b297ea0 Binary files /dev/null and b/source/_posts/image/Oracle/image-20221017145702216.png differ diff --git a/source/_posts/image/Oracle/image-20221020141231505.png b/source/_posts/image/Oracle/image-20221020141231505.png new file mode 100644 index 0000000..6aac9a5 Binary files /dev/null and b/source/_posts/image/Oracle/image-20221020141231505.png differ diff --git a/source/_posts/image/Typora/image-20221118150139161.png b/source/_posts/image/Typora/image-20221118150139161.png new file mode 100644 index 0000000..24c343c Binary files /dev/null and b/source/_posts/image/Typora/image-20221118150139161.png differ diff --git a/themes/.gitkeep b/themes/.gitkeep new file mode 100644 index 0000000..e69de29