Turbo Rails Tutorial-第三章
组织CSS文件这一章我们将使用BEM方法论,去设计项目的CSS样式,这里我们将不会使用Bootstrap或者Tailwind,因为作者觉得不好看,并打算展示一些技巧
如果你喜欢CSS,你可以学习到一些技巧,如果你不喜欢,也可直接复制代码,进入下一章的Turbo学习
我们的CSS风格CSS是一个比较难掌握的话题,像其他的编程一样,它需要一些风格和约定才能更好的使用,而学习写CSS最好的办法就是写一个小项目去设计样式
BEM方法论对于命名约定,我们使用BEM方法论,它是简单易懂的,总结为以下三点:
每个 component(or block) 应有有独立的名字,比如系统中的card,.card的CSS类应该定义在card.scss文件中,这就BEM中的B。
每个 block 可能有多个 elements,比如 card 举例,每个card都有 title 和 body,在BEM中我们应该写为 .card_title 和 .card_body,这样就可以避免命名冲突,如果另有一个block为 .box也有 title 和 body,那么这个就是.box_title和.box_b ...
勇闯SAP失败,勇敢转行成功
晚上看到Y总的勇闯腾讯的经历,脑袋一热,往日的经历让我的肾上腺素好像又高了。
我是物流专业,大三的时候,学校请的SAP培训机构来给我们上课,讲关于SAP在供应链上的应用。当时对这个外企很好奇,并且那时候刚会点儿python,正在学韩顺平的Java基础,刚好家旁边就是SAP西安分部,脑袋一热就跑公司楼下问招人吗,也没看boss直聘,到人楼下了,心里怂了,想着自己啥都不会,技术,英语,学历都不行,想还是算了吧,但又觉得既然来了,总得试试吧。
看着一个个员工出来,我愣是一个没敢上去打招呼,刚想抬手,又放下去了,发现有人用异样的眼光看我,让我更不敢上前询问了,最后坐到楼道里深呼吸,让自己放松。时间不等人,出来的员工越来越少,眼看着再不上去,今天就算白来了,等最后剩一个姐姐走门口了,我才鼓起勇气跑过去询问,她也很热情,说可以关注SAP招聘公众号,不过委婉的说基本都是研究生,除非你很优秀。我就连忙道谢,心里特别的开心,就好像已经找到工作了一样😂,之后我就在知乎上查找相关信息,并联系上一个SAP大连分公司研究生刚入职的学生,向他请教,怎么学才能有机会进去呢,人家听我是二本的物流学生,仍鼓励我可以试 ...
从Servlet到SpringMVC
从Servlet 到 SpringMVC我们从最简单的Servlet项目来查看一个请求是如何被处理的: 本案例中使用SpringBoot + Servlet + Tomcat进行演示
<dependencies>
<!-- 添加servlet依赖模块 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<!--添加tomcat依赖模块.-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
...
注解开发应用
注解在Java基础中我们都学习过简单的注解开发,但并不没有意识到重要性,直到使用了SpringBoot后,我们看到了注解相比原先配置文件的大量定义的简洁与优雅。在测试中我们也常用注解:@Test ,在方法定义时加上该注解,我们便可以执行这个方法,这到底怎么做的呢? 本文将回顾注解基础,并衍生到具有应用:
基础知识@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
上面的代码大家都很熟悉,当我们子类重新父类的方法时,会带有该注解。而我们在声明一个注解时,
首先需要使用 @Interface 来定义,这和我们定义 class,Interface 一样,最终编译时也会生成一个 class 文件
其次需要 @Target 和 @Retention 来定义该注解的作用域,这也被称为元注解,下面我们看看它们常用的范围
public enum ElementType {
/** 类, 接口 (包含注解), 枚举
...
SpringBoot自动装配原理
SpringBoot 自动装配原理@SpringBootApplication 启动注解@SpringBootApplication
public class SpringBootBasicLearnApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootBasicLearnApplication.class, args);
}
}
/**
* to store the base package from the importing configuration
* 也就是获取到我们启动类的包路径
*/
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitio ...
ABAC权限设计
这里我使用ABAC理论来设计:
数据库表设计
用户属性:
```sqlCREATE TABLE User(userId int,userName varchar(100),roleId int);
- 环境属性
- ```sql
CREATE TABLE Role
(
roleId int,
roleName varchar(100) # 比如:普通用户,付费用户,积分等级
);
操作属性:
```sqlCREATE TABLE action(actionId int,actionName varchar(100) # 比如:read读,write评论);
- 试读
- 付费读
- 免费读
- 评论
- Resources属性:
- ```sql
CREATE TABLE module # 我们最终操作的资源,例如查看的文章,数据
(
moduleId int,
moduleName varcha ...
opencv环境搭建
opencv 入门环境下载与搭建Windows用户直接在官网下载 Windows 文件:https://opencv.org/releases/ 。然后参考这篇文章:https://blog.csdn.net/qianlixiaomage/article/details/108416400。说实话Windows上操作太方便了。我用Mac捣鼓了半天,气死。
Mac用户直接在官网下载 Sources 文件:https://opencv.org/releases/ 。并进行解压。
下载cmake:brew install cmake
下载Ant:https://www.jianshu.com/p/bdca5215e9ca 这里是必须的,如果没有,最后无法生成jar包
cd opencv-4.7.0 # 这里是opencv源码包解压的文件地址
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. # 这俩点表示OpenCV的源码位置,不能省略
...
多线程事务
多线程事务 在Spring开发时,遇到一个从Excel表导入数据到数据库的需求,当然最简单的方法就是先使用EasyExcel把数据读出到集合中,然后依次插入到数据库中。但如何保证效率,原子性呢?我们一步步优化方案。这里会涉及到分布式事务的知识,如果感兴趣可以看我之前的文章:玲辰书斋,这里不会引入不必要的组件,而是我们自己模拟类似的思想。
方法1:依次顺序插入
void test() {
List<User> users = getAllUsers();
users.forEach(user -> userService.save(user));
}
方法2:使用批处理,一次操作中执行多条SQL
void test() {
List<User> users = getAllUsers();
userService.saveBatch(users);
}
方法3:使用多线程+批处理,每个线程插入多条数据
需要注意的一点,Spring容器不允许线程注入,也就是没办 ...
手写非公平锁(ReentrantLock)
手写非公平锁(ReentrantLock) ReentrantLock很多教程都在讲解,虽然很细致,但内容太多了,过段时间就很容易忘,我们知道ReentrantLock的核心是AQS(抽象队列同步器),我们这里试着使用AQS,自己写一个非公平锁使用,看看AQS承载了哪部分的职责,ReentrantLock承载了哪部分的职责
第一步:定义接口,面向接口编程嘛
public interface myLock {
// 很简单的加锁和释放锁
public void lock();
public void unlock();
}
第二步:看看ReentrantLock与AQS的关系
public class myUnFairLock implements myLock {
private final Sync sync = new Sync();
// 锁的核心由AQS管理,ReentrantLock只负责重写 tryAcquire 和 tryRelease方法的逻辑
private stat ...
Rails基础
Ruby On Rails基础介绍 Rails可以理解为一个快速构建Web应用的框架,本身基于Ruby开发,拥有很强的灵活性。
如何下载与使用Rails? 这里的前提是你已经下载好了Ruby
gem install rails # 通过ruby工具(当成功下载并使用Ruby时,该工具会一同配置好的) 下载 rails
rails -v # 如果正常下载则显示Rails版本
这里我在Mac上下载好rails并使用时,遇到了报错显示,显示rails还没有立刻被下载成功,需要再执行上面下载命令(但是并没什么用,至少我是这样,有的人说是有一个延迟时间):
Rails is not currently installed on this system. To get the latest version, simply type:
$ sudo gem install rails
You can then rerun your "rails" command.
这里我的解决方式为:
gem env # 显 ...