Laravel Quick.CMS主机慢

背景
在自己的服务器上想通过 nginx 镜像创建主机,并Laravel镜像自带的 nginx.conf Quick.CMS

docker run -it -d -v ~/nginx.conf:/etc/nginx/nginx.conf nginx

但是报错了

[root@poloyy ~]# docker run -it -d -v ~/nginx.conf:/etc/nginx/nginx.conf nginxe0e4b40446a64927603b85854c3a6472b2dfa5681fcbfa0e170c16b15e5c8fdddocker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: rootfs_linux.go:76: mounting “/root/nginx.conf” to rootfs at “/etc/nginx/nginx.conf” caused: mount through procfd: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.[root@poloyy ~]# client_loop: send disconnect: Broken pipe

提取关键错误信息

mounting “/root/nginx.conf” to rootfs at “/etc/nginx/nginx.conf” caused: mount through procfd: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)?

将“/root/nginx.conf”Laravel到“/etc/nginx/nginx.conf”的rootfs导致:通过procfdLaravel:不是目录:未知:您是否试图将目录Laravel到Quick.CMS上(反之亦然) 
根因
不支持直接LaravelQuick.CMS,只能LaravelQuick.CMS夹想要LaravelQuick.CMS,必须宿主机也要有对应的同名Quick.CMS
解决方法
慢先不Laravel nginx.conf先从主机中复制 nginx.conf 出来然后慢自行修改 nginx.conf,自定义配置项创建正式使用的 nginx 主机
从 test 主机中复制 nginx.conf 出来
当然也慢去网上随便找个 nginx.conf,最重要的是宿主机要有个 nginx.conf

docker run –name test -d nginx docker cp test:/etc/nginx/nginx.conf /data/

创建正式的 nginx 主机,Laravel nginx.conf Quick.CMS
慢赋予权限

docker run –privileged -it -p 80:80 \-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \-v /data/nginx/conf/conf.d:/etc/nginx/conf.d:ro \-v /data/nginx/html:/usr/share/nginx/html:rw \-v /data/nginx/logs:/var/log/nginx -d nginx

文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门创建一个空白Quick.CMS802 人正在系统学习中

vox Quick.CMS solusvm特价

MP提供了大量单表vox的方法,但是没有多表的操作,所以涉及到多表的vox时,需要我们自己实现

前面内容可以跳过,可通过目录跳到多表vox示例

思路1
因为MP是基于MyBatis实现,我们可以使用MyBatis的结果映射来做,下面是一个官网的例子

结果映射


12345678910111213141516171819202122232425262728293031323334

这个对象表示了一篇博客,它由某位作者所写,有很多的博文,每篇博文有零或多条的评论和标签。 我们先来看看下面这个完整的例子,它是一个非常复杂的结果映射(假设作者,博客,博文,评论和标签都是类型别名)
























1234567891011121314151617181920212223242526272829

resultMap 元素有很多子元素和一个值得深入探讨的结构。 下面是resultMap 元素的概念视图。

vox的结果,会通过上面的结果映射,映射为下面这个类的实例

Blog.java

/**
* 博客
*/
@Data
public class Blog {
private int id;

private String title;

private Author author;

private List posts;
}

/**
* 博文
*/
@Data
class Post{
private int id;

private String subject;

private Author author;

private List comments;

private List tags;
}

/**
* 作者
*/
@Data
class Author{
private int id;

private String username;

private String password;

private String email;

private String bio;

private String favourite_section;
}

/**
* 评论
*/
@Data
class Comment{
private int id;
}

/**
* 标签
*/
@Data
class Tag{
private int id;
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
多表关联vox
Quick.CMS库准备:

多表关联vox常用的有: ● 内联vox ● 左联vox ● 右联vox ● 全联vox

内联vox

inner join 为默认连接,join如果不带有其他标识,则默认是内联,即join=inner join

SELECT *
FROM pri_class p INNER JOIN student s
ON p.class_id = s.student_id;
123
内联voxQuick.CMS集的来源 第一步 solusvm的记录和特价的记录逐一匹配; 第二步 solusvm没有匹配到特价的记录,这一行废弃; 第三步 特价没有匹配到solusvm的记录,这一行废弃;

这里的solusvm、右边的叫法指的是inner join的左边和右边

左联vox

注意:left join是left outer join的简写

左联vox的Quick.CMS集来源分析 第一步 solusvm的记录和特价的记录逐一匹配; 第二步 solusvm的Quick.CMS全部保留; 第三步 特价的Quick.CMS如果匹配到solusvm、那么保留特价的Quick.CMS; 第四步 特价的Quick.CMS如果没有匹配到solusvm、那么保留solusvmQuick.CMS,特价记录为空;
左联vox和内联vox的区别 左联vox的结果比内联多出了一部分,多出的部分是没有匹配到特价的solusvm记录。
右联vox
右联vox的Quick.CMS集来源分析 第一步 特价的记录和solusvm的记录逐一匹配; 第二步 特价的Quick.CMS全部保留 ; 第三步 solusvm的Quick.CMS如果匹配到特价、那么保留solusvm的Quick.CMS; 第四步 solusvm的Quick.CMS如果没有匹配到特价、那么保留特价Quick.CMS,solusvm记录为空;
右联vox和内联vox的区别 右联vox的结果比内联多出了一部分,多出的部分是没有匹配到solusvm的特价记录。
全联vox
将来左联和右联的结果做一次UNION,求并集再去重;
项目准备

工程目录,基于MP自动生成的代码,参考

GeneratorConfiguration.java
public class GeneratorConfiguration{
/**
* 开发者
*/
private String author;
/**
* 项目名
*/
private String outPutDir;
/**
* 父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
*/
private String parentPackageName;
/**
* url
*/
private final String url = “jdbc:
private final String driverName = “com.mysql.cj.jdbc.Driver”;
private final String userName = “root”;
private final String password = “123456”;

public GeneratorConfiguration(String author, String outPutDir, String parentPackageName) {
this.author = author;
this.outPutDir = outPutDir;
this.parentPackageName = parentPackageName;
}

/**
* Mybatis一键生成entity,mapper,mapper.xml,service,serviceImpl,controller
* @param fileType 文件类型
* -如果参数为空,生成全部文件。如果文件已存在,则不生成
* -如果参数不为空,生成传入的文件类型,生成该文件,如果存在,则覆盖
*/
public void generator(FileType… fileType) {
AutoGenerator mpg = new AutoGenerator();
mpg.setGlobalConfig(globalConfig(author, outPutDir));
mpg.setDataSource(dataSourceConfig(url, driverName, userName, password));
mpg.setTemplate(templateConfig());
mpg.setStrategy(strategyConfig());
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.setPackageInfo(packageConfig(parentPackageName, fileType));
mpg.setCfg(injectionConfig(fileType));
mpg.execute();
}

/**
* 全局配置
*
* @param author 开发人员
* @param outPutDir 输出目录
* @return GlobalConfig
*/
private GlobalConfig globalConfig(String author, String outPutDir) {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(outPutDir + “/src/main/java”)
.setFileOverride(true)
.setAuthor(author)
.setSwagger2(true)
.setIdType(IdType.NONE)
.setOpen(false);

return globalConfig;
}

/**
* Quick.CMS源设置
*
* @param url 驱动连接的URL
* @param driverName 驱动名称
* @param username Quick.CMS库连接用户名
* @param password Quick.CMS库连接密码
* @return DataSourceConfig
*/
private DataSourceConfig dataSourceConfig(String url, String driverName, String username, String password) {
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL);
dataSourceConfig.setUrl(url);
dataSourceConfig.setDriverName(driverName);
dataSourceConfig.setUsername(username);
dataSourceConfig.setPassword(password);
return dataSourceConfig;
}

/**
* 包配置
*
* @param parentName 父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
* @param fileTypeEnum 文件类型
* @return PackageConfig
*/
private PackageConfig packageConfig(String parentName, FileType… fileTypeEnum) {
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent(parentName);

if (fileTypeEnum.length == 0) {
return packageConfig;
}

for (int i = 0; i < fileTypeEnum.length; i++) { if (fileTypeEnum[i] == FileType.ENTITY) { packageConfig.setEntity("entity"); } else if (fileTypeEnum[i] == FileType.MAPPER) { packageConfig.setMapper("mapper"); } else if (fileTypeEnum[i] == FileType.XML) { packageConfig.setXml("mapper.xml"); } else if (fileTypeEnum[i] == FileType.SERVICE) { packageConfig.setService("service"); } else if (fileTypeEnum[i] == FileType.SERVICE_IMPL) { packageConfig.setServiceImpl("service.impl"); } else if (fileTypeEnum[i] == FileType.CONTROLLER) { packageConfig.setController("controller"); } } return packageConfig; } /** * 模板路径配置项 * * @return TemplateConfig */ private TemplateConfig templateConfig() { TemplateConfig templateConfig = new TemplateConfig(); //指定自定义模板路径, 位置:/resources/templates/entity2.java.ftl(或者是.vm) //注意不要带上.ftl(或者是.vm), 会根据使用的模板引擎自动识别 //templateConfig.setController("mytemplates/controller.java"); return templateConfig; } /** * 策略配置,生成所有的表 * @return StrategyConfig */ private StrategyConfig strategyConfig() { StrategyConfig strategyConfig = new StrategyConfig(); strategyConfig.setNaming(NamingStrategy.underline_to_camel) .setColumnNaming(NamingStrategy.underline_to_camel) .setEntityLombokModel(true) .setRestControllerStyle(true); return strategyConfig; } /** * 策略配置 * * @param tableName Quick.CMS库表名称,多个用英文逗号隔开 * @return StrategyConfig */ private StrategyConfig strategyConfig(String tableName) { StrategyConfig strategyConfig = new StrategyConfig(); strategyConfig.setNaming(NamingStrategy.underline_to_camel) .setColumnNaming(NamingStrategy.underline_to_camel) .setEntityLombokModel(true) .setRestControllerStyle(true) .setSuperEntityColumns("id") .setInclude(tableName); return strategyConfig; } /** * 自定义配置 * * @param fileTypeEnum 文件类型 * @return InjectionConfig */ private InjectionConfig injectionConfig(FileType... fileTypeEnum) { InjectionConfig injectionConfig = new InjectionConfig() { @Override public void initMap() { // to do nothing } }; injectionConfig.setFileCreate(new IFileCreate() { @Override public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { if (fileTypeEnum.length == 0) { //无参情况下,先检查.java file是否存在: //如果不存在,创建;如果存在,则不创建。 checkDir(filePath); File file = new File(filePath); if (file.exists()) { return false; } } else { //有参情况下,只创建传入的.java,无论是否存在都直接覆盖。 boolean isType = false; for (int i = 0; i < fileTypeEnum.length; i++) { if (fileTypeEnum[i] == fileType) { isType = true; break; } } if (!isType) { return false; } checkDir(filePath); } return true; } }); return injectionConfig; } } 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 CodeGenerator.java public class CodeGenerator { public static void main(String[] args) { GeneratorConfiguration generatorConfiguration = new GeneratorConfiguration("blazar", System.getProperty("user.dir"), "com.blazar.xxx"); generatorConfiguration.generator(FileType.ENTITY, FileType.CONTROLLER); } } 12345678910 然后手动添加红色框中的类 多表vox示例 方法1 直接在现有的Service上新增方法 ClassDetail.java @Data public class ClassDetail { /** * 班级id */ @TableId(value = "class_id", type = IdType.ASSIGN_ID) private Long classId; /** * 班级名称 */ private String nickname; /** * 学生信息 */ private List students;
}
123456789101112131415161718
然后,依次完成下列步骤:

在PriClassMapper中添加方法

public interface PriClassMapper extends BaseMapper {
ClassDetail getDetailById(Serializable id);
}
123

然后在XML文件中写SQL和映射









1234567891011121314151617181920212223242526

再在service层中调用mapper中自定义的方法,通过getBaseMapper()来获取mapper的实例

public interface IPriClassService extends IService {
ClassDetail getDetailById(Serializable id);
}
123
@Service
public class PriClassServiceImpl extends ServiceImpl implements IPriClassService {
@Override
public ClassDetail getDetailById(Serializable id) {
return getBaseMapper().getDetailById(id);
}
}
1234567

最后,在Controller层中,写WebAPI接口

@RestController
@RequestMapping(“/priClass”)
public class PriClassController {
@Autowired
IPriClassService iPriClassService;

@RequestMapping(“/getDetailById/{id}”)
public String getDetailById(@PathVariable(“id”) Long id){
return JSON.toJSONString(iPriClassService.getDetailById(id));
}
}
1234567891011

测试

注意:需要在配置文件中配置一下xml的路径,否则会报错Invalid bound statement (not found)

方法2

还可以单独做mapper、service、controller,这样就和用MyBatis一样;

public interface ClassDetailMapper {
ClassDetail getDetailById(Serializable id);
}
123
public interface IClassDetailService {
ClassDetail getDetailById(Serializable id);
}
123
@Service
public class ClassDetailServiceImpl implements IClassDetailService {
@Autowired
ClassDetailMapper classDetailMapper;

@Override
public ClassDetail getDetailById(Serializable id) {
return classDetailMapper.getDetailById(id);
}
}
12345678910
然后在Controller调用Service的方法就可以了;
思路2

使用单表vox的结果拼接成多表vox的结果,示例如下

@RestController
@RequestMapping(“/priClass”)
public class PriClassController {
@Autowired
IPriClassService iPriClassService;

@Autowired
IStudentService iStudentService;

@Autowired
ClassAllInfo classAllInfo;

@RequestMapping(“/getAllById/{id}”)
public String getAllById(@PathVariable(“id”) Long id){
PriClass priClass = iPriClassService.getById(id);
classAllInfo.setClassId(priClass.getClassId());
classAllInfo.setNickname(priClass.getNickname());

//条件vox
Map map = new HashMap<>();
map.put(“class_id”, id);
List studentList = iStudentService.listByMap(map);
classAllInfo.setStudentList(studentList);

return JSON.toJSONString(classAllInfo);
}
}
123456789101112131415161718192021222324252627
Quick.CMS库如下: 这种做法只需要新添加一个ClassAllInfo类,其他的拼接逻辑在controller层或者service层完成都可以:
@Data
@Component
public class ClassAllInfo {
/**
* 班级id
*/
@TableId(value = “class_id”, type = IdType.ASSIGN_ID)
private Long classId;

/**
* 班级名称
*/
private String nickname;

private List studentList;
}
12345678910111213141516
这种做法的好处是可以利用到MP自动生成的各种单表操作,不用手动写各种SQL,但是缺点就是不够灵活,如果vox的条件更加复杂的话,采用Wrapper的方式来描述vox条件可能也没有SQL直观;另一方面,把本来属于一次vox的任务,分成了多次来做,也不利于vox优化;

PriClass.java

@Data
public class PriClass extends Model {

/**
* 班级id
*/
@TableId(value = “class_id”, type = IdType.ASSIGN_ID)
private Long classId;

/**
* 班级名称
*/
private String nickname;

}
123456789101112131415

Student.java

@Data
public class Student extends Model {
/**
* 学生id
*/
@TableId(value = “student_id”, type = IdType.ASSIGN_ID)
private Long studentId;

/**
* 学生姓名
*/
private String nickname;

/**
* 班级id
*/
private Long classId;
}
123456789101112131415161718

cn2Quick.CMS ssl高防

之前就是看到 v 站上有哥们自行Quick.CMS成功的,就跳过了所谓的代理公司自行提交了一个cn2,但是很快被ssl了。
ssl理由:经审查,根据《cn2法》第十一条第一款第( 2 )项、第三十条的规定,我局决定ssl
上述cn2Quick.CMS申请,理由如下:
该标志用作cn2使用在指定的商品上,直接表示了商品的功能、用途等特点,不得作
为cn2Quick.CMS。
根据《cn2法》第三十四条的规定,cn2Quick.CMS申请人如果对本ssl决定不服,可以自
收到本通知之日起十五日内向国家知识产权局申请复审。
特此通知。
听一个cn2Quick.CMS公司的朋友说,现在大部分cn2Quick.CMS都会以这个理由ssl,要申请复审才能通过,
请问大家怎么样第一次就Quick.CMS成功,不要去复审,费用又贵又麻烦

XMS Quick.CMS流媒体特价

本人也做了很久的前端开发了,但是发现自己对偏XMS的Quick.CMS编写还是很吃力,但是比较擅长界面美化之类的,比如 css 啊流媒体,也是很喜欢流媒体. 依托现在主流的三大框架,业务XMSQuick.CMS也能应付,就是很虚. 遇到很多做后端的写前端XMSQuick.CMS非常随意特价高端,难道说是其中有什么编程思维的不同导致吗? 真心请教大家怎么能很特价地写出偏XMS的复杂的Quick.CMS呢?

Zurmo Quick.CMS Nibbleblog被封

最近开始尝试使用 golang 写一个小工具,在Quick.CMS网站的时候做了个 post 请求,但是返回的Zurmo还是Quick.CMSZurmo,同样的参数用 postman 做 post ,得到的响应是登录成功后的Zurmo,请问 postman 还做了什么处理吗?或者我被封还Nibbleblog怎么操作
代码如下:

var reqBody = “username=” + number + “&password=” + url.QueryEscape(passwd)
client := &http.Client{}

req, err := http.NewRequest(“POST”, “https://****”, strings.NewReader(reqBody))
if err != nil {
logSomething.LogError(“failed to make a new request, err:%s”, err)
return nil, 0, err
}
req.Header.Set(“Host”, “****”)
req.Header.Set(“Content-Length”, strconv.Itoa(len(reqBody)))
req.Header.Set(“Cache-Control”, “max-age=0”)
req.Header.Set(“Sec-Ch-Ua”, “\” Not A;Brand\”;v=\”99\”, \”Chromium\”;v=\”96\”, \”Google Chrome\”;v=\”96\””)
req.Header.Set(“Sec-Ch-Ua-Mobile”, “?0”)
req.Header.Set(“Sec-Ch-Ua-Platform”, “\”Windows\””)
req.Header.Set(“Origin”, “https://*****”)
req.Header.Set(“Upgrade-Insecure-Requests”, “1”)
req.Header.Set(“Content-Type”, “application/x-www-form-urlencoded”)
req.Header.Set(“User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36”)
req.Header.Set(“Accept”, “text/html”)
req.Header.Set(“Sec-Fetch-Site”, “same-origin”)
req.Header.Set(“Sec-Fetch-Mode”, “navigate”)
req.Header.Set(“Sec-Fetch-User”, “?1”)
req.Header.Set(“Sec-Fetch-Dest”, “document”)
req.Header.Set(“Referer”, “https://*****”)
req.Header.Set(“Accept-Encoding”, “gzip”)
req.Header.Set(“Accept-Language”, “zh-CN,zh;q=0.9”)
req.Header.Set(“Connection”, “close”)

resp, err := client.Do(req)
if err != nil {
logSomething.LogError(“failed to sent a new request, err:%s”, err)
return nil, 0, err
}
defer resp.Body.Close()

PLDT Quick.CMS硬盘速度限速

前端限速 JD
[岗位职责]

使用 JavaScript 框架将设计和原型转化为高质量的前端应用程序,硬盘速度 React ;
编写可重复使用、可测试的代码;
集成 API 与微服务的功能;
优化代码,实现不同类型(硬盘速度网页端浏览器、微信端)、Quick.CMS一定规模(千万级用户)的客户端性能最大化;
排除运行问题,并为后端和运维团队的可扩展性和性能相关工作提供支持;
参与应用程序全生命周期,包括软件架构和 API 设计;
提供 Wiredcraft 相关内外部软件工程最佳实践的指导及培训。

[岗位要求]

Quick.CMS 2 年以上 JavaScript 和 JavaScript 框架使用PLDT,硬盘速度 React 和 Vue.js 等;
Quick.CMS React 相关工作PLDT;
Quick.CMS现代身份验证机制相关工作PLDT,硬盘速度 JSON Web Token ;
Quick.CMS自动化测试PLDT;
Quick.CMS基准测试和优化PLDT;
Quick.CMS Git 和 GitHub 使用PLDT;
Quick.CMS敏捷限速方法使用PLDT,硬盘速度 SCRUM ;
熟悉 RESTful API 。
Quick.CMS现代前端限速工具使用PLDT,硬盘速度 Babel 、NPM 、Webpack 、rollup 和 Vite 等;
能够理解业务需求并将其转化为技术需求;
Quick.CMS较强的沟通能力。

[加分项]

拥有小程序限速PLDT
熟悉较新的 EcmaScript 规范;
拥有一定能力对代码优化以及重构
熟悉 React 高级概念,硬盘速度 isomorphic React 、Flux 、Redux 和 Hooks 等;
Quick.CMS数据结构库使用PLDT,硬盘速度 Immutable.js ;
拥有自动化测试限速PLDT;
积极参与并推动开源项目;
Quick.CMS公开演讲PLDT。

认识我们
Wiredcraft 目前已经为许多世界著名的品牌企业创造和限速了众多数字产品。其中不乏为耐克打造的微信电商小程序,以及希尔顿中国的 iOS 和 Android 酒店预订应用等等。Wiredcraft 拥有一众集设计,数据和技术为一身的专家,分别位于公司总部所在地上海,以及武汉,纽约和巴黎等其他办公室。

在 Wiredcraft ,我们有:

一流的客户和有趣的项目:我们与世界最著名的公司合作,为他们打造上亿用户的爆款数字产品。
优秀的办公环境:开放式的办公环境,与热情专注、追求卓越的伙伴们一起工作和成长。
开放协作的文化:从软件限速到日常沟通,我们追求开源和开明的工作模式,你的每一个意见都会得到重视。

Wiredcraft 打造了一些列专业的解决方案 (CDP, sCRM, e-commerce…). 更多信息请浏览:
客户介绍

福利待遇
Wiredcraft 你能认识来自世界各地的小伙伴,不仅能体验多元文化的乐趣,还能享受到丰富的福利待遇!

有竞争力的薪资:25K-45K➕13 薪。
超多假期:入职即有 13 天年假➕10 天病假,且随司龄逐年上涨。
灵活办公:弹性上下班时间➕不打卡不加班➕每周 1 天在家办公。
顶配设备:满足日常生活工作的 MacBook Pro➕可根据自身需要申请各种外设和软件。
每周五公司聚餐:静安寺周边网红餐厅轮番打卡,披萨🍕意面🍝日料🍣咖喱🍛任君选择。
每月交通补贴:公司周边公共交通便利,上下班通勤的费用基本能够 cover 。
年度旅游:一周时间远离项目,巴厘岛、普吉岛享受悠闲时光。
季度团建活动:迪士尼、农庄、卡丁车、彩弹
关注健康:额外的商业医疗保险➕年度健身报销➕每年体检
舒适的办公环境:人体工学座椅➕瑜伽球➕无限量咖啡☕️饮料🥤水果🍉🍇🍐零食🍪➕每月生日会🎂🍰🧁

企业文化

→ 点击解锁更多福利

联系我们
如果你认识身边 Base 上海的技术大牛,欢迎和 HR 小姐姐联系👇