跳到主要内容

博客

代码人生:编织技术与生活的博客之旅

下定决心还是再学一遍 CSS 等前端知识

1. background

1.1 background-image

  • 用于设置元素的背景图片
    • 会盖在(不是覆盖)background-color 的上面
  • 如果设置了多张图片
    • 设置的第一张图片将显示在最上面,其他图片按顺序层叠在下面
  • 如果设置了背景图片后,元素没有具体的宽高,背景图片是不会显示出来的

1.2 background-repeat

1.3 background-size

  • auto: 默认值,以背景图本身大小显示
  • cover:缩放背景图,以完全覆盖铺满元素,可能背景图片部分看不见
  • contain:
  • <percentage>
  • Length

1.4 background-position

  • 用于设置背景图片在水平,垂直方向上的具体位置
    • 可以设置具体的数值,比如 20px 30px
    • 水平方向还可以设值:left, center, right
    • 垂直方向还可以设值: top, center, bottom
    • 如果只设置了一个方向,另一个方向默认是 center

1.5 background- attachment

  • 决定背景图像的位置是在视口内固定,或者随着包含它的区块滚动
  • 可以设置以下三个值
    • scroll:表示背景相对于元素本身固定,而不是随着它的内容滚动
    • local:表示背景相对于元素的内容固定,如果一个元素拥有滚动机制,背景将会随着元素的内容滚动
    • fixed

1.6 缩写属性

1.7 background-image vs. img

imgbackground-image
性质HTML 元素CSS 样式
图片是否占用空间
浏览器右键直接查看地址
支持 CSS Sprite(精灵图)
更有可能被搜索引擎收录✅(结合 alt 属性)
CSS学习笔记前端阅读需 2 分钟

本地智能知识库使用手册

1. 启动

​ 因为知识库背后需要一些软件,交付之前已经设置开机启动,所以无特殊情况不用进行1.1,可以直接看1.2进行登陆访问

1.1 启动Docker Desktop

​ 在搜索栏中搜索 Docker Desktop,直接点击打开,然后就不用管了,可以把它最小化,以免干扰

image-20250430153423704

1.2 注册

找到任意的浏览器,搜索localhost,并回车即可看到登陆页面,可以先进行注册

在注册界面依次填入邮箱,用户名,密码即可

image-20250504172840703

1.3 登陆访问

在登陆页面输入你的信息

image-20250430153626993

​ 初始管理员邮箱: admin@test.com , 密码: 123456

​ 后期可以自己修改

2. 简单使用

​ 我们期望本地智能知识库可以给我们提供业务上的帮助,所以一般使用聊天对话的方式和知识库互动,获取自己想要的信息。

​ 点击页面标题中间的“聊天”,可以看到页面的变化

​ 这里左侧提供了两个聊天助手,一个是“统计分析助手”,另一个是“通用知识库助手”,可以根据需求不同,来找对应的助手进行“咨询”

​ 两个助手的区别在于,提示词不同以及所使用的知识库不同。

image-20250430162943704

2.1 通用知识库助手

**使用场景:**对业务不太熟悉,直接询问某些业务的技术术语解释,助手会给出基于已有行业知识文件的内容来进行解析。

使用方式:点击“通用知识库助手”,找你之前的某个聊天,或者点击聊天右侧的➕号,新建一个。

然后直接提问即可,比如我这里提问:“OLT是什么”,他会根据我的问题,先去本地知识库中搜索相关的文件,接着结合大模型的回答进行回答。

image-20250430163551684

2.2 统计分析助手

**使用场景:**想基于已有的某个文件或者某些文件进行数据分析。

使用方式:点击“统计分析助手”,找你之前的某个聊天,或者点击聊天右侧的➕号,新建一个,步骤和2.1类似,不再赘述。

本助手和前一个助手有所区别的是,所用知识库中有一些excel,可以用来对excel中的数据提供基本的数据分析。

3. 维护行业知识文件

​ 作为一个本地知识库,和一般大模型不同的就是我们可以维护自己的知识库,以期望大模型可以帮我们回答一般通用大模型(Deepseek R1)无法回答的问题,而本地的知识是需要通过某种方式给到我们的软件。

3.1 知识库介绍

image-20250430155058488

这里有两个知识库:表格知识库 以及 通用知识库

  • 表格知识库可以对excel,csv等表格型的文件更好的处理和管理
  • 通用知识库可以对一些PPT,word,PDF等格式更好的处理和管理

3.2 上传文件到知识库

进入某个知识库,这里以通用知识库为例,

点击新增文件,选择本地文件

image-20250504171809039

勾选创建时解析,然后点击上传文件或者拖拽上传,点击确定即可

image-20250504171909821

解析会占用一定的时间,等待这里的状态变为完成才可使用这个文件中的内容

image-20250504172042200

  • 注意,虽然可以处理比较大的文件,但是最好不要超过一定的大小,比如30M,解析会比较慢

3.3 从知识库中删除文件

在知识库中可以对文件进行删除或者其他操作

image-20250504172200785

4. 人员管理

一般部署本地知识库是给整个团队或者公司提升效率,为了避免多人使用同一个账号带来的隐私性问题,支持多账号登陆管理。

4.1 添加人员

先让其他团队成员按照1.2,1.3注册登陆,

然后管理员(你)按照如下操作

image-20250504172527632

image-20250504172551256

输入正确的团队成员邮箱之后,即可发送邀请 image-20250504173154481

而被邀请同事来到相同的界面(用他自己的账号登陆),则可以看到需要他同意

image-20250504173750974

被邀请人同意之后,admin这里会看到角色状态的变更:

image-20250504174102555

此时其他团队成员也可以看到所有的知识库了(需要admin在知识库的设置中权限设置为“团队”)

image-20250504174636910

但为了防止API key的滥用,如果其他人员需要添加文件,是不允许的,需要自己绑定自己的API key来使用

4.2 删除人员

在团队成员列表中的末尾有个删除按钮

image-20250504174812483

5. 大模型配置

5.1 LLM大模型的配置

LLM表示聊天对话大模型,用来在聊天助手对话那块。

目前因为机器的配置原因采用的是线上满血DeepSeek R1版,如果后期需要修改,可以通过如下步骤进行修改:

image-20250504175252953

接下来的对话框会让你提供一个API-Key

image-20250504175305478

不同的大模型的API-Key获取方式不太一样,但思路是一样的:

首先来到对应的官网,比如DeepSeek(https://platform.deepseek.com/api_keys)

进入后来到API-Keys,点击创建

image-20250504175607557

输入名称,点击创建

image-20250504175653670

然后会弹出一个对话框,显示了API Key,点击拷贝复制到我们的网站上(注意这里的API-Key只会出现一次,最好找个地方记下来,否则忘记的话只能删了重新创建了

image-20250504175750264

我们粘贴刚才的API Key,

image-20250504175909776

可以看到添加成功:

image-20250504175938664

那既然在系统里面添加了LLM模型,我们就可以在聊天助手中使用了

image-20250504180056048

在聊天助手的右侧鼠标停留一段时间,会出现编辑按钮

image-20250504180158885

在新对话框,模型设置的tab下面就可以选择新的模型了

5.2 Embedding模型的配置

Embedding模型主要是用来解析本地文件的,把本地知识向量化,这样后期检索会更快。

可以也按照5.1的方式找添加一个带embedding标识的大模型即可

之后来到表格知识库,可以设置embedding的模型了: image-20250504180431732

RAG使用交付阅读需 6 分钟

算法商业项目阅读需 1 分钟

快捷键

1. 插件

  • intellij-idea-keybindings

  • Material Icon Theme

2. 设置技巧

  • 自动保存打开

  • directory 的indent设置成大一点

3. 快捷键

  • macOS: command + shift + P打开命令窗口,搜索shell, install
vscode工具阅读需 1 分钟

下定决心还是再学一遍CSS等前端知识

CSS选择器

  • 什么是CSS选择器

    • 按照一定的规则选出符合条件的元素,为之添加CSS样式
  • 选择器的种类繁多

    • 通用选择器(universal selector)
    • 元素选择器(type selectors)
    • 类选择器(class selectors)
    • id选择器(id selectors)
    • 属性选择器(attribute selectors)
    • 组合(combinators)
    • 伪类(pseudo-classes)
    • 伪元素(psedo-elements)

通用选择器(universal selector)

  • 选择所有的元素

  • 一般用来给所有元素设置一些通用性的设置

    • 比如内边距,外边距
    • 比如重置一些内容
  • 效率比较低,尽量不要使用

  • body 默认有一个margin 8px

* {
font-size: 20px;
}

/*尽量不用通配符*/

body, p, div, h2, span {
margin: 0;
padding: 0;
}

简单选择器

  • 一个HTML文档里面的id值是唯一的,不能重复

    • id值如果由多个单词组成,单词之间可以用中划线下划线连接,也可以使用驼峰标识
    • 最好不要用标签名作为id值
  • 中华线又叫连字符(hyphen)

元素选择器(type selectors), 使用元素的名称

类选择器(class selectors),.类名

id选择器(id selectors),#id

属性选择器

  • 拥有某一个属性 [att]

  • 属性等于某个值 [att=val]

  • 其他了解下

    • [att*=val]: 属性值包含某一个值val
    • [att^=val]: 属性值以val开头
    • [att$=val]: 属性值以val结尾
    • [att|=val]: 属性值等于val或者以val开头后面紧跟连接符-
    • [att~=val]: 属性值包含val,如果有其他值,比如以空格和val分割
<div title="div"></div>

<h2 title="h2"></h2>
[title] {
color: red;
}

[title=div] {
background-color: red;
}

后代选择器(descendant combinator)

  • 后代选择器一:所有后代(直接和间接的后代)

    • 选择器之间以空格分割
      • .box span {xxx}
  • 后代选择器二:直接子代选择器(必须是直接自带)

    • 选择器之间以 >分割

兄弟选择器(sibling combinator)

  • 相邻兄弟选择器
    • .box + .content {}
  • 普遍兄弟选择器 ~
    • .box ~ div {}

选择器组

交集选择器

  • 同时符合两个选择器条件,为了精准选择某一个元素
<div class="box"></div>
<p class="box"></p>

div.box {
xxx
}

并集选择器

  • 符合一个选择器条件即可,两个选择器以,分割

body, h2, p, div {
xxx
}

伪类

认识伪类

  • Pseudo-classes,伪类

  • 伪类是选择器的一种,用于选择处于特定状态的元素

  • 常见的伪装

    • 动态伪类(dynamic pseudo-classes)
      • :link
      • :visited
      • :hover
      • :active
      • :focus
    • 目标伪类(target pseudo-classes)
      • :target
    • 语言伪类(language pseudo-classes)
      • :lang(en)
    • 元素状态伪类(UI element states pseudo-classes)
      • :enabled
      • :disabled
      • :checked
    • 结构伪类(structural pseudo-classes)
      • :nth
        • :nth-child()
        • :nth-last-child()
        • :nth-of-type()
        • :nth-last-of-type()
      • :first
        • :first-child()
        • :last-last-child()
        • :first-of-type()
        • :last-of-type()
      • 第三类
        • :root
        • :only-child
        • :only-of-type
        • :empty
    • 否定伪类(negation pseudo-classes) :not()
div:hover{

}

动态伪类(dynamic pseudo-classes)

  • :link

    • a:link 未访问的连接
  • :visited

    • a:visited 已访问的连接
  • :hover

    • a:hover 鼠标挪动到链接上
  • :active

    • a:active 激活的连接(鼠标在链接上长按住未松开)
  • :focus

    • 指当前拥有输入焦点的元素(能接收键盘输入)
    • 文本输入框一聚焦后,背景就会变成红色
    • 因为链接a元素可以被键盘的tab键选中聚焦,所以:focus也适用于a元素
  • 使用注意

    • :hover必须放在:link:visited后面才能完全生效
    • :active必须放在:hover后面才能完全生效
    • 所以建议的编写顺序是:link:visited:hover:active
  • 除了a元素,:hover:active也可以用在其他元素上

  • 动态伪类的编写顺序建议为:

    • :link:visited:focus:hover:active
  • 直接给a元素设置样式,相当于给a元素的所有动态伪类都设置了

伪元素(pseudo-elements)

  • 常见的伪元素有

    • :first-line, ::first-line
    • :first-letter, ::first-letter
    • :before, ::before
    • :after, ::after
  • 为了区分伪类和伪元素,建议用两个冒号

  • :first-line, ::first-line

    • 可以针对首行文本设置属性
CSS学习笔记前端阅读需 4 分钟

下定决心还是再学一遍 CSS 等前端知识

大纲

CSS 文本属性

text-decoration

  • text-decoration(常用):用于设置文字的装饰线

    • none:无任何装饰线,可以去除 a 元素默认的下划线
    • underline: 下划线
    • overline: 上划线
    • line-through: 中划线
  • 企业中常用的

    • css/reset.css 在里面设置, 在 html 通过 link 引入
a {
text-decoration: none;
}

text-transform

  • text-transform(一般)
    • capitalize(每个单词的首字母大写)
    • uppercase 大写
    • lowercase 小写
    • none 没有任何影响

text-indent

  • text-indent(一般): 设置第一行内容的缩进
    • font-size: 40px; text-indent: 80px;
    • text-indent: 2em;

text-align

  • text-align(重要)
    • 直接翻译过来设置文本的对齐方式
    • MDN:定义行内内容(例如文字),如何想对它的块 父元素对其
    • 常用的值
      • left
      • right
      • center
      • justify: 两端对齐,基本很少用
        • 需要和text-align-last: justify一起配合用
    • W3C
      • This shorthand property sets the 'text-align-all' and 'text-align-last' properties and describes how the inline-level content of a block is aligned along the inline axis if the content does not completely fill

word/letter-spacing

  • word/letter-spacing
    • letter-spacing: 10px;
    • word-spacing: 10px;

CSS 字体的属性

font-size

  • 常用设置
    • 具体数值 + 单位:默认为 16px(浏览器设置我们自己的大小就是 16px)
    • em
    • 百分比
      • 可以继承

font-family

  • 用于设置文字的字体名称 - 可以设置 1 个或者多个字体名称 - 浏览器会选择列表中第一个该计算机上有安装的字体 - 或者是通过 @font-face 指定的可以直接下载的字体 可以继承

font-weight(重要)

  • 用于设置文字的粗细(重量)
  • 常见的取值
    • 100, 200, 300, 400, 500, 600, 700, 800, 900, 每一个数字表示一个重量
    • normal: 等于 400
    • bold: 等于 700
  • strong, b, h1-h6 默认设置的就是 bold

font-style(一般)

  • 设置文字的常规,斜体显示

    • normal
    • italic:斜体,字体本身支持斜体时,显示的斜体
    • oblique:斜体,不管字体支持不支持斜体,都给字体做倾斜,看起来像斜体
  • 早期 em, i, cite, address, var, dfn 等元素的 font-style 默认就是 italic

font-variant(了解)

可以影响小写字母的显示形式,variant 是变形的意思

可以设置的值如下: - normal - small-caps 将小写字母替换为缩小过的大写字母 - My Name Is ->

line-height(常用)

  • 用于设置文本的行高

    • 可以先简单理解为一行文字所占据的高度
  • 为什么文本需要行高

    • 方便文本的阅读和理解
  • 严格定义

    • 两行文字(基线)之间的间距
    • 基线:与小写字母 x 对齐的线

基线以及行距

  • line-height - 文本的高度 = 行距
  • 文本默认会在一行的中间显示

font

  • font 是一个缩写属性

    • font-style
    • font-size
    • font-weight
    • font-variant
    • font-family
    • line-height
    • font-style font-variant font-weight font-size/line-height font-family;
  • 规则

    • font-style font-variant font-weight 可以随意调换顺序,也可以省略
    • /line-height 可以省略, 如果不省略,必须跟在 font-size 后面
      • 如果是数值,表示 2 倍或者 1.5 倍前面的行高
    • font-size, font-family 不可以调换顺序,不可以省略
font-size: 30px;
font-weight: 700;
font-variant: small-caps;
font-style: italic;
font-family: serif;
line-height: 30px;

font: italic small-caps 700 30px/30px serif;

CSS 选择器

CSS学习笔记前端阅读需 3 分钟

下定决心还是再学一遍 CSS 等前端知识

CSS

  • 三种引入方式

    • inline
    • <style></style>
    • 文件引入的方式:<link rel="stylesheet", href="./css/style.css">
  • index.css, 把其他 CSS 文件放到这里

@import url(./style.css) @import url(./test.css); /* @import "./style.css"
但是推荐上面的那一种,用括号的方式,意思是作为函数参数传入
*/
  • CSS 的注释
    • /*CSS的注释*/

一个好问题:如果写多了注释,用户在下载文件的时候会不会太大,造成打开网页缓慢?

这个考虑是对的,但未来我们会用打包工具,比如 webpack,上传到服务器的代码会删除我们写的注释

常见的 CSS 元素

必须掌握的 CSS 属性

定位(Position)和布局(Layout)

展示(display)和可见(visibility)

盒子模型(box model)顺序

背景设置(background)

字体(Font),文本(text)

其他属性(Other Property)

CSS 属性的官方文档

案例练习

/* 方式一:改变元素的特性和垂直方向的布局 */
display: inline-block;
vertical-align: top;

/* 方式二: 通过浮动完成 */
float: left;

额外知识补充 2

  • link 元素是外部资源链接元素,规范了文档与外部资源的关系

    • link 元素通常是在 head 元素中
  • 最常用的链接是样式表(CSS)

    • 此外也可以被用来创建站点图标(比如"favicon"图标)
  • link 元素常见的属性

    • href:此属性指定被链接资源的 URL。URL 可以是绝对的,也可以是相对的
    • ref:指定链接类型,常见的链接类型
      • icon:站点图标
      • stylesheet:CSS 样式
  • 属性

    • dns-prefetch
  • preload 预加载,在 webpack 会讲到

进制

  • 二进制:0b 开头
  • 八进制:0o 开头
  • 16 进制:0x 开头

CSS 里面颜色的表示方法

  • 颜色关键字

  • RGB 颜色

    • RGB 是一种色彩空间,通过 R,G,B 三原色来组成不同的颜色
    • RGB 各个原色的取值范围是 0-255
  • 当所有颜色都是 0 的时候,呈现黑色

    • 黑色是最纯洁的颜色
  • RGB 的表示方法

    • 十六进制 (#RRGGBB[AA])
    • 十六进制 (#RGB[A])
    • 函数符 RGB(100, 100, 100)
    • RGBA(), A 表示透明度

Chrome 浏览器开发者工具

  • 打开

    • 右键->检查
    • 快捷键 F12
  • 其他技巧

    • 快捷键:ctrl+ 可以调整页面或者工具的字体大小
    • 通过删除某些元素来查看网页结构
    • 通过增删 css 来调试网页样式

浏览器的渲染流程 HTML,CSS

浏览器的渲染流程

Dom Tree -> Render Tree(With CSS)

CSS学习笔记前端阅读需 3 分钟

团队成员经常忘记写单元测试,那如何强制让写测试呢?

通过在 gradle 中添加相关的配置:

1. 在build.gradle中添加相关的配置

plugins中需要引入jacoco的依赖:

plugins {
id 'java'
id 'org.springframework.boot' version '3.3.2'
id 'io.spring.dependency-management' version '1.1.6'
id 'jacoco'
}

添加一个生成jacoco测试报告的任务:

jacocoTestReport {
dependsOn test
reports {
xml.required = false
csv.required = false
html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco"))
}
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: ['**/dto', '**/entity', '**/domain'])
}))
}
}
  • 生成的测试报告路径: build/reports/jacoco/index.html
  • 可以忽略某些文件,比如 entity 等

添加一个测试覆盖率检查的任务:

jacocoTestCoverageVerification {
dependsOn test
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: ['**/dto', '**/entity', '**/domain'])
}))
}
violationRules {
rule {
limit {
counter = 'LINE'
value = 'COVEREDRATIO'
minimum = 0.7
}
}
rule {
limit {
counter = 'BRANCH'
value = 'COVEREDRATIO'
minimum = 0.8
}
}
}
}

我这里lineCoverage 需要达到 70%, 分支覆盖率需要达到 80%

2. git hooks配置

3. CI/CD 中的配置

gradlejacoco阅读需 1 分钟

1.1 查看历史命令

1.1.1 简单查看

  1. 查看所有
    • 命令行: history
    • 快捷键查看所有 Command + shift + H
  2. 模糊匹配
  • 命令行: history | grep python
  • 快捷键: Ctrl + R

1.2 iTerm中使用历史补全

1.2.1 内置快捷键 Command + ;

  1. 输入命令前缀:
    • 在 iTerm 的命令行中,输入一个命令的前缀,比如,gcloud
  2. 按快捷键: Command + ;, iTerm 会弹出一个窗口,列出当前会话中所有以你输入的前缀开头的历史命令。
    • 例如: iTerm 命令行中先键入一个命令的前缀
  3. 选择并补全:
    • 从弹出的列表中选择你需要的命令,选择后就会自动补全,然后可以自己去修改

缺点,显示的不全

注意: 要解决 iTerm2 中 Command + ; 补全命令的历史记录跨会话保存问题,以及确保 Shell 正确保存历史记录 vi ~/.zshrc 编辑文件,在末尾添加:

# 设置历史记录文件大小和保存位置
HISTFILE=~/.zsh_history # 历史记录文件路径
HISTSIZE=10000 # 内存中保存的历史记录数量
SAVEHIST=10000 # 历史记录文件中保存的数量

# 追加历史记录(而不是覆盖)
setopt appendhistory # 多个会话的历史记录会合并
setopt inc_append_history # 实时追加历史记录(无需重启会话)
setopt share_history # 跨会话共享历史记录
setopt extended_history # 记录时间戳

保存后生效: source ~/.zshrc

1.2.2 高级补全功能

如果想要达到如下效果,在输入的时候实时显示灰色 iTerm 命令自动补全

配置方式

使用 zsh 和 oh-my-zsh:

  1. 安装 oh-my-zsh(如果尚未安装):运行 sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"。
  2. 安装 zsh-autosuggestions 插件:
  • 克隆插件到 oh-my-zsh 的插件目录:git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions
  • 编辑 .zshrc 文件,添加 zsh-autosuggestions 到插件列表:plugins=(zsh-autosuggestions) (新添加一行)
  • 保存并重启 iTerm2,或运行 source ~/.zshrc 使配置生效。
...
# Add wisely, as too many plugins slow down shell startup.
plugins=(git)
plugins=(zsh-autosuggestions)
...

使用方式

还是跟刚才类似,输入前缀,此时会自动出现匹配的历史命令,但是是灰色的,如果采纳,则按->箭头,如果不是的,则按上下箭头来翻页

iterm工具阅读需 2 分钟

认证问题

如何根据定位来确认用户是否属于某个小区

如何排除虚拟作弊

能解决的问题

很多上门费很贵,利用社区特性,接龙让师傅一天跑多家

既可以提高师傅一天处理的人家数量,又可以降低成本

https://www.heroui.com/

idea创业阅读需 1 分钟