Ant Design介绍 - 简书

mikel阅读(1390)

来源: Ant Design介绍 – 简书

1、Ant Design设计语言和组件库
蚂蚁金服体验技术部经过大量的项目实践和总结,沉淀出设计语言 Ant Design,这可不单纯只是设计原则、控件规范和视觉尺寸,还配套有前端代码实现方案。也就是说采用Ant Design后,UI设计和前端界面研发可同步完成,效率大大提升。目前有阿里、美团、滴滴、简书采用。Ant Design有Web版和Moblie版。

Paste_Image.png

Ant Design Web版: https://ant.design/index-cn
Ant Design Mobile版: https://mobile.ant.design/index-cn

2、Ant Motion(动效解决方案)
Ant Design里的前端代码实现方案可不是搭建静态的界面这么简单,还包含动效的解决方案,也提供动效设计风格和原则,要知道大部分动效做不出来的场景,都是因为设计师方案和研发代码实现存在一定的鸿沟,有了Ant Motion完整的解决方案,设计和研发工程师沟通协作无障碍,动效实现将会非常轻松。

Paste_Image.png

Ant Motion: https://motion.ant.design/
3、AntD Library(Ant Design官方Axure控件库)
其实类似于Ant Design的设计语言搭配前端实现方案的也不止支付宝这一家,但是牛逼的是支付宝还将Ant Design做成了Axure控件库并公开下载,Web和Mobile全都有,简直是造福行业,功德无量。

Paste_Image.png

AntD Library下载地址: http://library.ant.design/
4、AntUX(站点地图模板)
除了Axure控件库以外,还提供Axure、Sketch、OmniGraffle三种格式的站点地图模板。提升流程图、站点地图、产品整体结构图的绘制效率。据悉,未来还会提供Illustrator版本。

Paste_Image.png

AntUX下载地址: http://ux.ant.design/
5、Ant V(可视化图表解决方案)
可视化图表能让复杂的逻辑和臃肿的数字变动更清晰更容易理解,Ant V对不同的图表类型提供了详细的介绍、案例和使用建议,并总结出图表设计原则和相关文献推荐,所有的图表的Web和Moblie前端实现方案也一应俱全。

Paste_Image.png

Ant V: https://antv.alipay.com/index.html

作者:lwoodenheart
链接:https://www.jianshu.com/p/2ca388e8d68a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

手把手带你体验Stream流

mikel阅读(596)

来源: 手把手带你体验Stream流

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

上一篇讲解到了Lambda表达式的使用《最近学到的Lambda表达式基础知识》,还没看的同学可以先去阅读一下哈~

相信也有不少的同学想要知道:Lambda表达式在工作中哪个场景会用得比较多?跟Lambda搭边的,使用Stream流会比较多

一般人第一次看Stream流的代码,都会有点看不懂(它的代码看起来好像就不是写Java一样.),希望这篇文章能带大家入个门

一、体验Stream流

大家在自学时,大多数会学过一个程序:算出从数组元素的和,当时我们是怎么写的?一般来说是这样的:

public static void main(String[] args) {
    int[] nums = { 123 };
    int sum = 0;
    for (int i : nums) {
        sum += i;
    }
    System.out.println("结果为:" + sum);
}

如果我们使用Stream流的话,可以这样:

public static void main(String[] args) {
    int[] nums = { 123 };
    int sum2 = IntStream.of(nums).sum();
    System.out.println("结果为:" + sum2);
}

代码量上可以明显看出,用Stream流的方式会少一些。

我理解的Stream流编程就是:某些场景会经常用到操作(求和/去重/过滤….等等),已经封装好API给你了,你自己别写了,调我给你提供的API就好了

1.1 支持并发

回到我们最原始的代码:

public static void main(String[] args) {
    int[] nums = { 123 };
    int sum = 0;
    for (int i : nums) {
        sum += i;
    }
    System.out.println("结果为:" + sum);
}

如果我们想要for循环的内部支持并发的话,显然不太好去写。但使用Stream流的方式,调用一个方法就可以支持并发(parallel):

public static void main(String[] args) {
    int[] nums = { 123 };
    int sum2 = IntStream.of(nums).parallel().sum();
    System.out.println("结果为:" + sum2);
}

优点:调API肯定是比自己写的代码量要少。

缺点:不方便调试

为什么要使用Stream流在我看来就是以上两个原因:

  • 方便并发
  • 代码量少(直接调用API)

二、如何使用Stream流?

图片
Stream继承结构图

使用Stream流分为三步:

  1. 创建Stream流
  2. 通过Stream流对象执行中间操作
  3. 执行最终操作,得到结果
图片
三步走

2.1 创建流

创建流我们最常用的就是从集合中创建出流

/**
 * 返回的都是流对象
 * @param args
 */
public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    // 从集合创建
    Stream<String> stream = list.stream();
    Stream<String> stream1 = list.parallelStream();

    // 从数组创建
    IntStream stream2 = Arrays.stream(new int[]{235});

    // 创建数字流
    IntStream intStream = IntStream.of(123);

    // 使用random创建
    IntStream limit = new Random().ints().limit(10);

}

2.2 执行中间操作

怎么理解中间操作?意思是这样的:在上面我们已经能创建出Stream了,我们是对Stream进行操作,对Stream操作返回完返回的还是Stream,那么我们称这个操作为中间操作。

图片
中间操作 解释

比如,我们现在有个字符串my name is 007,代码如下:

String str = "my name is 007";

Stream.of(str.split(" ")).filter(s -> s.length() > 2)
    .map(s -> s.length()).forEach(System.out::println);

分解:

1、从字符串数组创建出流对象:

Stream<String> split = Stream.of(str.split(" "));

2、通过流对象的API执行中间操作(filter),返回的还是流对象:

Stream<String> filterStream = split.filter(s -> s.length() > 2);

3、通过返回的流对象再执行中间操作(map),返回的还是流对象:

Stream<Integer> integerStream = filterStream.map(s -> s.length());

因为中间操作返回的都是流对象,所以我们可以链式调用

注意:Stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行(惰性求值)。

比如说,peek()是一个中间操作,返回的是Stream流对象,只要它不执行最终的操作,这个Stream是不会执行的。

String str = "my name is 007";
Stream.of(str.split(" ")).peek(System.out::println); // 不会有信息打印

2.3 执行最终操作

最终操作返回的不再是Stream对象,调用了最终操作的方法,Stream才会执行。还是以上面的例子为例:

String str = "my name is 007";
Stream.of(str.split(" ")).peek(System.out::println).forEach(System.out::println)

这次我们加入了最终操作,所以这次的Stream流会被执行,由于中间操作和最终操作都是执行打印,所以会看到两次打印:

图片
结果图

至于中间操作和最终操作怎么区分,我们以返回值来看就行了。中间操作返回的是Stream实例对象,最终操作返回的不是Stream实例对象:

图片
Stream接口的方法

最后

这篇文章主要跟大家一起初步认识一下Stream流,至于中间操作、最终操作的API讲解我就不写了(网上的教程也很多)

使用Stream的原因我认为有两个:

  1. JDK库提供现有的API,代码写起来简洁优化
  2. 方便并发。大家可以记住一个结论:在多核情况下,可以使用并行Stream API来发挥多核优势。在单核的情况下,我们自己写的for性能不比Stream API 差多少

参考资料:

最近学到的Lambda表达式基础知识

mikel阅读(562)

来源: 最近学到的Lambda表达式基础知识

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

中秋去了躺上海,在外滩上打了个卡:

图片
外滩

紧接着学了一下Java的函数式编程,给大家整理了一下,一起学习!

一、Lambda用法

之前写Optional这个类的时候,简单说了一下Lambda是怎么用的,这里再跟大家一起回顾一下,Lambda的语法是这样的:

图片
语法

以Lambda语法创建线程和匿名内部类创建线程的区别(显然代码少了很多!):

public static void main(String[] args) {
    // 用匿名内部类的方式来创建线程
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("公众号:Java3y---关注我!");
        }
    });

    // 使用Lambda来创建线程
    new Thread(() -> System.out.println("公众号:Java3y---关注我!"));
}

使用Lambda表达式,实际就是创建出该接口的实例对象

图片
返回一个Runnable对象实例

图示;Runnable接口来举例:

图片
以Runnable接口为例

使用Labmda表达式需要函数式编程接口,比如在Runnable接口上我们可以看到@FunctionalInterface注解(标记着这个接口只有一个抽象方法)

图片
函数式编程接口只有一个抽象方法

1.1 函数式编程接口

从上面的代码例子可以看出,我们使用Lambda表达式创建线程的时候,并不关心接口名,方法名,参数名。我们只关注他的参数类型,参数个数,返回值

JDK原生就给我们提供了一些函数式编程接口方便我们去使用,下面是一些常用的接口:

图片
常用的函数式编程接口

简单说明一下:

  • 表格中的一元接口表示只有一个入参,二元接口表示有两个入参
图片
以BiFunction为例
图片
常用的函数式接口

Demo:

// Consumer 一个入参,无返回值
Consumer<String> consumer = s-> System.out.println(s);
consumer.accept("Java3y");

// Supplier 无入参,有返回值
Supplier<String> supplier = () -> "Java4y";
String s = supplier.get();
System.out.println(s);

//.....

使用Lambda时,要记住的就两点:

  1. Lambda返回的是接口的实例对象
  2. 有没有参数、参数有多少个、需不需要有返回值、返回值的类型是什么—->选择自己合适的函数式接口

1.2 方法引用

在学Lambda的时候,还可能会发现一种比较奇怪的写法,例如下面的代码:

// 方法引用写法
Consumer<String> consumer = System.out::println;
consumer.accept("Java3y");

如果按正常Lambda的写法可能是这样的:

// 普通的Lambda写法
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("Java3y");

显然使用方法引用比普通的Lambda表达式又简洁了一些。

如果函数式接口的实现恰好可以通过调用一个方法来实现,那么我们可以使用方法引用

图片
函数式接口的实现恰好可以通过调用一个方法来实现

方法引用又分了几种:

  • 静态方法的方法引用
  • 非静态方法的方法引用
  • 构造函数的方法引用

方法引用Demo:

public class Demo {
    public static void main(String[] args) {
        // 静态方法引用--通过类名调用
        Consumer<String> consumerStatic = Java3y::MyNameStatic;
        consumerStatic.accept("3y---static");

        //实例方法引用--通过实例调用
        Java3y java3y = new Java3y();
        Consumer<String> consumer = java3y::myName;
        consumer.accept("3y---instance");

        // 构造方法方法引用--无参数
        Supplier<Java3y> supplier = Java3y::new;
        System.out.println(supplier.get());
    }
}

class Java3y {
    // 静态方法
    public static void MyNameStatic(String name) {
        System.out.println(name);
    }

    // 实例方法
    public void myName(String name) {
        System.out.println(name);
    }

    // 无参构造方法
    public Java3y() {
    }
}

结果如下:

图片
结果

最后

Lambda虽然代码看起来是简洁,但是如果复杂的话还是比较难看明白的。

在学习Lambda的时候,首先我们得知道有哪些常用函数式编程接口,这些函数式编程接口的有什么区别(参数个数、返回值类型)

Lambda表达式返回的是接口对象实例,如果函数式接口的实现恰好可以通过调用一个方法来实现,那么我们可以使用方法引用来替代Lambda表达式

最后再完整举个例子:

// Supplier是一个无入参带返回的值的函数式编程接口

// () -> new Java3y()这整句Lambda表达式,返回的是Supplier接口的实例。从Lambda表达式可以看出无参数,带返回值
Supplier<Java3y> supplier = () -> new Java3y(); 

// 由于这个“() -> new Java3y()”Lambda表达式可以通过调用一个方法就实现了,那么我们可以优化成方法引用
Supplier<Java3y> supplier2 = Java3y::new;

分享四个Java低代码快速开发平台贼好用, 私活毕设神器_hi Edwin的博客-CSDN博客_java低代码开发平台

mikel阅读(3422)

https://opsli.com

来源: 分享四个Java低代码快速开发平台贼好用, 私活毕设神器_hi Edwin的博客-CSDN博客_java低代码开发平台

一、OPSLI 快速开发平台
OPSLI 快速开发平台基于springboot、vue、element-ui 、vue-admin-beautiful,项目采用前后端分离架构,热插拔式业务模块与插件扩展性高 ,代码简洁,功能丰富,开箱即用

官网: https://opsli.com
开源地址: https://github.com/hiparker/opsli-boot

 

 

 

 

 

二、Jfinal
Jfinal 不忘初心,在提升开发效率、降低学习成本两个方向已迭代近 10 年, 后端开发所需要的时间越来越少,已趋近极致。用上 jfinal 以后 90% 以上的时间都在折腾前端,有很多同学强烈希望官方能出一个像 jfinal 一样开发效率高、学习成本低的前端框架。
私活神器 !!

官网: https://jfinal.com

 

 

三、Jeecg 快速开发平台
Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,尤其适合SAAS项目、企业信息管理系统(MIS)、内部办公系统(OA)、企业资源计划系统(ERP)、客户关系管理系统(CRM)等,其半智能手工Merge的开发方式,可以显著提高开发效率70%以上,极大降低开发成本。项目整合了layui的layim聊天项目

官网: http://www.jeecg.com
开源地址: https://github.com/zhangdaiscott/jeecg-boot

 

 

 

四、RuoYi 低代码开发平台
RuoYi是一个后台管理系统,基于经典技术组合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf)主要目的让开发者注重专注业务,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。

官网: http://www.ruoyi.vip
开源地址: https://gitee.com/y_project/RuoYi-Vue

 

 

欢迎进群项目分享交流QQ群:724850675
————————————————
版权声明:本文为CSDN博主「hi Edwin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013416283/article/details/111595433

WordPress建立数据库连接时出错终极解决方案 - 闪电博

mikel阅读(717)

来源: WordPress建立数据库连接时出错终极解决方案 – 闪电博

“ 建立数据库连接时出错 ”可能是WordPress用户可能遇到的最常见和最可怕的错误之一。这绝对与死亡白屏(WSOD)息息相关。此错误意味着您的网站不再通信或可以访问WordPress数据库,整个网站瘫痪。

对于这样的错误,站长切勿掉以轻心的事情,应该立即尝试解决此问题,直接影响流量,SEO等等。但不用担心,今天我们将讨论导致此错误的一些常见情况,以及对应的解决方案。

建立数据库连接有什么错误?

WordPress网站上的所有信息,例如发布数据,页面数据,元信息,插件设置,登录信息等,都存储在MySQL数据库中。唯一没有存储的数据是媒体内容,例如图像,以及主题/插件/核心文件,例如index.php,wp-login.php等。当有人访问您的网站时,PHP会在页面上执行代码并从数据库中查询信息,然后将其显示到访客浏览器中。

如果由于某种原因这无法正常工作,则将出现建立数据库连接时出错,如下所示。整个页面空白,因为连接无法正常工作,无法检索任何数据以呈现页面。这不仅破坏了网站的前端,而且导致无法访问WordPress仪表板。

但是,访客可能不会立即在前端看到此错误。那是因为站点缓存还可供访问,直到缓存过期为止。

建立数据库连接时出错

建立数据库连接时出错

导致此错误的常见情况

以下是一些常见原因,后面我们会根据这些常见原因,给出不同的解决方案。

  • 最常见的问题是数据库登录凭据不正确。WordPress网站需要使用数据库相关登录信息来连接到其对应的MySQL数据库。
  • 数据库已损坏。由于主题,插件可安装卸载如此之多,长年累月的不断删除和安装,有时会导致数据库损坏。这可能是由于表丢失或个别损坏,或者是某些信息被意外删除了。
  • WordPress安装中可能存在损坏的文件
  • 数据库服务器问题。Web主机端可能有很多问题,例如数据库因流量高峰而过载或由于并发连接过多而无法响应。实际上,对于共享主机,这很常见,因为许多网站共享一台主机的资源。

如何修复“建立数据库连接时出错”

在开始对错误进行故障排查之前,建议您首先进行数据库备份,因为以下许多建议涉及操作数据库中的信息。无论你的技术水平如何,在尝试修改WordPress网站数据库之前,都应始终进行备份。

您可以使用WordPress备份插件(例如VaultPress或WP Time Capsule)来备份文件和数据库。

如果是宝塔面板用户,那就网站文件及数据库备份就很简单了,进入宝塔控制面板,在左边菜单找到“计划任务”,进入界面找到备份数据库和备份网站,手动执行即可。

备份WordPress网站

备份WordPress网站

当然你还可以通过SFTP等工具,进入服务器执行手动备份网站文件,及通过phpMyAdmin手动备份MySQL数据库。备份成功后,就该开始对“建立数据库连接时出错”问题进行故障排除了。

参考阅读:《使用BackWPup插件备份WordPress教程》、《如何安全备份WordPress博客网站数据?

1.检查数据库登录凭据

首先要做的是检查以确保WordPress配置文件的数据库登录凭据正确。这是迄今为止“建立数据库连接时出错”报错的最常见原因,特别是在迁移网站到新的托管服务提供商之后。WordPress网站的连接详细信息存储在wp-config.php文件中,该文件通常位于WordPress网站的根目录下。

它包含四个重要信息,这些信息都必须正确才能成功进行连接数据库。

数据库名称

// ** MySQL settings ** //
/** The name of the database for WordPress */
define(‘DB_NAME’, ‘xxxxxx’);

数据库用户名

/** MySQL database username */
define(‘DB_USER’, ‘xxxxxx’);

数据库密码

/** MySQL database password */
define(‘DB_PASSWORD’, ‘xxxxxxxxx’);

主机名(服务器)

/** MySQL hostname */
define(‘DB_HOST’, ‘localhost’);

要访问wp-config.php文件,您可以通过SFTP连接到站点并浏览到站点的根目录。或者,如果您使用的是宝塔,则可以进入宝塔控制面板单击“文件”,浏览到站点的根目录,然后右键单击以编辑文件。

宝塔文件管理

宝塔文件管理

以下是打开文件后的示例。

wp-config.php文件数据库访问凭证

wp-config.php文件数据库访问凭证

现在,您需要对照当前值及服务器数据库真实值,以确保它们正确无误。对于宝塔用户,请按照以下说明进行操作。

检查宝塔面板中的数据库凭据

您需要登录宝塔面板,进入数据库即可找到网站对应的数据库,找到数据库名、用户名及密码等信息 。

宝塔面板查看数据库账号密码

宝塔面板查看数据库账号密码

然后核对wp-config.php文件的对应信息,确保两边的信息一致即可,非常方便。(或者这也就是国内众多站长选择使用宝塔面板的原因)

检查cPanel面板中的数据库凭据

如果你是使用cPanel管理主机,整个步骤稍微有点复杂。

首先要检查的是数据库名称。为此,您需要进入cPanel控制面板登录phpMyAdmin 。

cPanel控制面板的phpMyAdmin

cPanel控制面板的phpMyAdmin

在左侧菜单找到你的网站对应的数据库名称。忽略“information_schema”数据库,因为这是主机使用的数据库。然后,将该名称与wp-config.php文件中的DB_NAME值进行比较。如果它们匹配,那么这不是问题。如果它们不匹配,那么您需要更新wp-config.php文件。

cPanel 数据库名称

cPanel 数据库名称

您还可以通过确保数据库是否包含你网站的URL来验证这是正确的数据库。只需单击数据库,然后单击wp_options表(出于安全目的,此名称可能稍有不同,例如wpxx_options)。在表格的顶部,您将看到网站URL和名称的值。如果这些与您当前站点匹配,说明这个是你的网站的数据库。

在phpMyAdmin检查网站URL

在phpMyAdmin检查网站URL

如果数据库名称正确,但是在建立数据库连接时仍然出现错误,那你还需要检查用户名和密码。为此,你需要在WordPress网站的根目录中创建一个新的PHP文件(随意命名,例如checkdb.php),并输入以下代码,需使用wp-config.php文件中的值替换为db_user和db_password的值。

<?php
$test = mysqli_connect(‘localhost’, ‘db_user’, ‘db_password’);
if (!$test) {
die(‘MySQL Error: ‘ . mysqli_error());
}
echo ‘Database connection is working properly!’;
mysqli_close($testConnection);

浏览器访问https://yourdomain.com/checkdb.php。如果收到“MySQL Error: Access denied(MySQL错误:访问被拒绝)”,则说明您的用户名或密码错误,您将需要继续执行下一步以重置凭据。

MySQL错误:访问被拒绝

MySQL错误:访问被拒绝

但如果是“Database connection is working properly.(数据库连接正常工作)”,则说明数据库用户名和密码正确。完成测试后,请确保删除此文件。

数据库连接正常工作

数据库连接正常工作

如果确定数据库用户名和密码错误,接下来您需要重置用户名和密码。在cPanel中,点击“MySQL数据库”。

cPanel 控制面板之MySQL数据库

cPanel 控制面板之MySQL数据库

向下滚动并创建一个新的MySQL用户。尝试选择唯一的用户名和密码(可以使用提供的密码生成器工具生成高强度密码),以免轻易被猜中。然后点击“Create User”。或者,您也可以在此界面上更改当前数据库用户的密码。

创建MySQL用户

创建MySQL用户

然后向下滚动并将新用户添加到数据库中。下一个界面将询问您要分配的特权,选择“All Privileges(所有权限)”。

使用cPanel新增数据库用户

使用cPanel新增数据库用户

然后使用这些新凭据并更新至wp-config.php文件(更新DB_USER和DB_PASSWORD值)。到此,你也可以使用前面提到的测试文件验证数据库凭证信息是否正确。但如果这未能解决问题,可能是主机名(DB_HOST)错误。某些主机使用不同的值,你可以参阅一些常见数据库主机值列表,或者查看主机相关文档及联系主机提供商提供。有些人可能还会使用127.0.0.1而不是localhost。

如果您已完成上述所有操作,但仍是“建立数据库连接时出错”,继续往下看。

2. 修复损坏的数据库

在某些情况下,可能是数据库已损坏。有时(尽管不是很经常)会发生这种情况,因为随着时间的推移,新插件和主题会不断添加/删除数百张数据表。如果您尝试登录WordPress网站的仪表板并收到以下错误,则表明您的数据库已损坏:“一个或多个数据库表不可用。数据库可能需要修复。” 重要的是要注意,您可能只会在访问WordPress管理后台才看到此错误,而在前端仅看到建立数据库连接错误提示。

WordPress实际上提供可以启动的数据库修复模式。只需将以下内容添加到wp-config.php文件的底部。

define(‘WP_ALLOW_REPAIR’, true);

WordPress修复模式

WordPress修复模式

然后浏览器访问WordPress网站地址:https : //yourdomain.com/wp-admin/maint/repair.php。在页面你可以选择“修复数据库”或“修复并优化数据库”。由于您目前可能正在对站点进行故障排除,因此建议使用“修复数据库”选项,更高效。

WordPress修复数据库

WordPress修复数据库

在运行完上述数据库的修复之后,请确保删除添加到wp-config.php文件中的代码行,否则任何人都可以运行修复。如果您使用cPanel,则还可以从MySQL数据库界面中运行修复。

cPanel修复数据

cPanel修复数据

或者,您也可登入phpMyAdmin进行修复。只需登录phpMyAdmin,选择需要修复的网站对应的数据库,然后选择所有表。然后从下拉菜单中单击“修复表”。这实际上只是在运行REPAIR TABLE命令。

通过phpMyAdmin修复表

通过phpMyAdmin修复表

最后,你想更“装逼”些,还可以选择使用WP-CLI通过以下命令运行修复:

wp db repair

3. 修复损坏文件

“建立数据库连接时出错”另外一个可能原因是文件已损坏。无论这是由于通过FTP传输文件的问题,黑客获得了访问您的站点的权限还是主机的问题,您都可以快速解决此问题。特别提醒,尝试此操作之前先备份您的网站。

基本上,您只需要替换WordPress的核心版本,无需理会插件,主题或媒体。你可以通过访问WordPress.org下载最新版本的WordPress

下载WordPress

下载WordPress

在您的计算机上解压缩该文件,然后删除wp-content文件夹以及wp-config-sample.php文件。

删除wp-content 目录及WP初始配置文件

删除wp-content 目录及WP初始配置文件

然后,通过SFTP将其余文件上传到您的站点,覆盖现有文件。这将替换所有有问题的文件,并确保您拥有干净且未损坏的新文件。建议这样做后清除浏览器缓存。然后检查您的WordPress网站以查看错误是否仍然存在。

4. 数据库服务器问题

如果上述方法均不能帮助您解决问题,那么强烈建议您与托管服务提供商联系,因为这可能是数据库服务器的问题。例如,如果数据库并发连接太多,则可能会产生错误。因为很多主机在服务器上都限制了一次允许连接的数量。利用缓存插件可以帮助最大程度地减少您站点上的数据库交互。

这个问题在共享主机上经常发生,因为理论上其他人可能会影响您的站点。这是因为共享主机共同使用服务器上的所有资源。始终建议尽可能使用VPS主机来搭建WordPress网站,至少主机资源由自己分配利用而不会变得人满为患。独立主机通常对环境进行微调,即可处理专门针对WordPress网站的大量流量。

5. 恢复至最近备份

最后在情非得已之时,恢复最近备份数据。在某些情况下,如果无需担心发生错误之时与上一次备份之间产生的数据,这可能是解决问题的较快方法。许多服务器提供商都提供备份数据恢复支持。请记住,您可能需要同时还原数据库和文件。

如果您是宝塔用户,则可以通过宝塔控制面板的计划任务,创建备份数据库或者备份网站计划任务,支持按周期定时备份,非常方便。

宝塔控制面板备份计划

宝塔控制面板备份计划

如果是恢复数据库备份,您只需要进入宝塔控制面板,进入数据库菜单,找到你需要恢复的数据库,点击“有备份”,选择需要恢复的备份版本,点击“恢复”即可。

WordPress数据库恢复

WordPress数据库恢复

如果是恢复网站备份,则可以通过访问宝塔控制面板-文件,进入/www/backup/site目录,找到网站备份压缩包,将压缩包解压到对应网站目录即可。

WordPress网站数据恢复

WordPress网站数据恢复

小结

如您所见,有很多方法可以解决WordPress中“建立数据库连接时出错”问题。最常见的错误是wp-config.php文件中设置的数据库凭据不正确,为此检查以确保正确无误是应该作为第一步。无论是由于哪个因素导致“建立数据库连接时出错”,希望上述步骤可以帮助您恢复网站的正常运行。请记住,如果需要,应始终对网站进行备份以还原站点。

您的WordPress站点是否也曾遭遇“建立数据库连接时出错”?当时导致该错误的原因是什么?你又是如何解决?不妨在下方评论,与其他网友一起分享讨论。

苹果cms忘记后台管理员密码如何找回?_我的主题网MyTheme

mikel阅读(817)

来源: 苹果cms忘记后台管理员密码如何找回?_我的主题网MyTheme

苹果cms忘记了后台管理员密码。许多小伙伴都可能会遇到这个问题,那我就来简单分享一下苹果CMSV10如何找回管理员密码。苹果CMSV10忘记密码,如何重置管理员密码可以通过mySQL数据库表找回密码,具体操作步骤如下。

1、以宝塔面板为例,登陆宝塔找到数据库点击管理

苹果cms忘记后台管理员密码如何找回?

2、我们使用mySQL管理工具(如phpmyadmin)登陆到数据库,打开表单mac_admin,可以看到一下结果:

主要参数说明:admin_name,【管理员用户名是明文显示】;admin_pwd,【管理员密码使用md5进行了简单加密】;admin_random,【安全码,如果为开机安全码验证登陆,可忽略】;

 

苹果cms忘记后台管理员密码如何找回?

3、将图片红框内admin_pwd的内容复制下来,来到md5在线解密平台https://www.cmd5.com/把复制的内容粘贴到密文框内点击查询即可得到忘记的密码。知道密码后我们直接登陆后台就可以了。

 

苹果cms忘记后台管理员密码如何找回?

4、如果你是新装的苹果cms系统还没有什么数据,建议你直接极速重新安装来的更方便快捷一些,可以参考我们之前分享过的帮助文档教程:快速重新安装苹果cms基础教程来进行再次安装。

以上就是苹果cmsmip模板为大家搜集整理的关于:苹果cms忘记后台管理员密码如何找回?相关问题的解释和相关问题的回答,希望对你当前遇到的苹果cms忘记后台管理员密码如何找回?相关的问题能够提供和得到一些帮助!更多请关注:我的主题网帮助文档

 

docfile已损坏 docfile has been corrupted visual studio 2022

mikel阅读(1381)

docfile has been corrupted visual studio 2022

中文错误:docfile已损坏 错误代码:0x00083019 好像是这么个错误编码

就是用vs2022打开vs2019开发的项目,调试或者关闭vs2022就提示这个错误,开始以为安装的功能不全导致的,结果安装了桌面开发环境,web开发都不行,害得我还重装了win10,还是不行,百度也没个结果,害得我只能谷歌了一下,还是得谷歌啊,老外的一个帖子解决了问题:

I had the same problem with “Docfile corruption” error after upgrading to 17.2. preview 2.1 today. I could not build, load files or even close VS without forcefully ending VS process in task manager.

Message Box Error | Click for Show Full Size Imgae

Here is what fixed it for me without having to downgrade…

  1. Delete all .vs folders (Hidden Folder) from the solution
  2. Delete all files in
  3. Re-open project/solution and all working again.

Message Box Error | Click for Show Full Size Imgae

Hope this saves someone from losing a few hours on this.

就是删除vs2019的项目中的.vs文件夹,然后再用vs2022打开项目解决方案重新加载下就解决了!

国内的搜索引擎愣是找不到一个解决方案的帖子,我也是我了个去了!

老外帖子地址:https://stackoverflow.com/questions/72417857/doc-file-has-been-corrupted-error-after-updating-vs-to-microsoft-visual-studio-e

Array.prototype.filter() - JavaScript | MDN

mikel阅读(536)

来源: Array.prototype.filter() – JavaScript | MDN

Array.prototype.filter()

filter() 方法创建一个新数组,其包含通过所提供函数实现的测试的所有元素。

 

尝试一下

 

语法

var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])

参数

callback
用来测试数组的每个元素的函数。返回 true 表示该元素通过测试,保留该元素,false 则不保留。它接受以下三个参数:

element
数组中当前正在处理的元素。
index可选
正在处理的元素在数组中的索引。
array可选
调用了 filter 的数组本身。
thisArg可选
执行 callback 时,用于 this 的值。

返回值

一个新的、由通过测试的元素组成的数组,如果没有任何数组元素通过测试,则返回空数组。

描述

filter 为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回 true 或等价于 true 的值的元素创建一个新数组。callback 只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback 测试的元素会被跳过,不会被包含在新数组中。

callback 被调用时传入三个参数:

  1. 元素的值
  2. 元素的索引
  3. 被遍历的数组本身

如果为 filter 提供一个 thisArg 参数,则它会被作为 callback 被调用时的 this 值。否则,callback 的 this 值在非严格模式下将是全局对象,严格模式下为 undefinedcallback 函数最终观察到的 this 值是根据通常函数所看到的 “this”的规则确定的。

filter 不会改变原数组,它返回过滤后的新数组。

filter 遍历的元素范围在第一次调用 callback 之前就已经确定了。在调用 filter 之后被添加到数组中的元素不会被 filter 遍历到。如果已经存在的元素被改变了,则他们传入 callback 的值是 filter 遍历到它们那一刻的值。被删除或从来未被赋值的元素不会被遍历到。

示例

筛选排除所有较小的值

下例使用 filter 创建了一个新数组,该数组的元素由原数组中值大于 10 的元素组成。

function isBigEnough(element) {
  return element >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]

过滤 JSON 中的无效条目

以下示例使用 filter() 创建具有非零 id 的元素的 json。

var arr = [
  { id: 15 },
  { id: -1 },
  { id: 0 },
  { id: 3 },
  { id: 12.2 },
  { },
  { id: null },
  { id: NaN },
  { id: 'undefined' }
];

var invalidEntries = 0;

function isNumber(obj) {
  return obj !== undefined && typeof(obj) === 'number' && !isNaN(obj);
}

function filterByID(item) {
  if (isNumber(item.id) && item.id !== 0) {
    return true;
  }
  invalidEntries++;
  return false;
}

var arrByID = arr.filter(filterByID);

console.log('Filtered Array\n', arrByID);
// Filtered Array
// [{ id: 15 }, { id: -1 }, { id: 3 }, { id: 12.2 }]

console.log('Number of Invalid Entries = ', invalidEntries);
// Number of Invalid Entries = 5

在数组中搜索

下例使用 filter() 根据搜索条件来过滤数组内容。

var fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];

/**
 * Array filters items based on search criteria (query)
 */
function filterItems(query) {
  return fruits.filter(function(el) {
      return el.toLowerCase().indexOf(query.toLowerCase()) > -1;
  })
}

console.log(filterItems('ap')); // ['apple', 'grapes']
console.log(filterItems('an')); // ['banana', 'mango', 'orange']

ES2015 实现

const fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];

/**
 * Array filters items based on search criteria (query)
 */
const filterItems = (query) => {
  return fruits.filter((el) =>
    el.toLowerCase().indexOf(query.toLowerCase()) > -1
  );
}

console.log(filterItems('ap')); // ['apple', 'grapes']
console.log(filterItems('an')); // ['banana', 'mango', 'orange']

Polyfill

filter 被添加到 ECMA-262 标准第 5 版中,因此在某些实现环境中不被支持。可以把下面的代码插入到脚本的开头来解决此问题,该代码允许在那些没有原生支持 filter 的实现环境中使用它。该算法是 ECMA-262 第 5 版中指定的算法,假定 fn.call 等价于 Function.prototype.call 的初始值,且 Array.prototype.push 拥有它的初始值。

if (!Array.prototype.filter){
  Array.prototype.filter = function(func, thisArg) {
    'use strict';
    if ( ! ((typeof func === 'Function' || typeof func === 'function') && this) )
        throw new TypeError();

    var len = this.length >>> 0,
        res = new Array(len), // preallocate array
        t = this, c = 0, i = -1;
    if (thisArg === undefined){
      while (++i !== len){
        // checks to see if the key was set
        if (i in this){
          if (func(t[i], i, t)){
            res[c++] = t[i];
          }
        }
      }
    }
    else{
      while (++i !== len){
        // checks to see if the key was set
        if (i in this){
          if (func.call(thisArg, t[i], i, t)){
            res[c++] = t[i];
          }
        }
      }
    }

    res.length = c; // shrink down array to proper size
    return res;
  };
}

规范

浏览器兼容性

Report problems with this compatibility data on GitHub

JavaScript数组方法的兼容性写法 汇总:indexOf()、forEach()、map()、filter()、some()、every() - 凳子_joinery - 博客园

mikel阅读(539)

来源: JavaScript数组方法的兼容性写法 汇总:indexOf()、forEach()、map()、filter()、some()、every() – 凳子_joinery – 博客园

ECMA Script5中数组方法如indexOf()、forEach()、map()、filter()、some()并不支持IE6~8,但是国内依然有一大部分用户使用IE6~8,而以上数组方法又确实非常好用。在过去,我会为了兼容性尽量不用这些方法。但是,总不能为了旧的丢了新的吧?!虽然说JQuery已经集成好了不少语法糖,但JQuery体积太庞大,作为一名志于体面的前端儿得知道原生的兼容性写法要怎么写。于是这几天,我开始在琢磨这些方法的兼容性写法。其实并不难,就是以前不够自信不敢写。写完以后,对数组认识更深一些了。总结见下文。

备注:以下兼容性写法均可兼容至IE6;

一. indexOf()

indexOf()方法 返回根据给定元素找到的第一个索引值,否则返回-1。

语法:

array.indexOf(searchElement[, fromIndex = 0])

参数:

searchElement  // 位于数组中的元素;

fromIndex // 开始查找指定元素的索引值,默认值为 0 (即在整个数组中查找指定元素);

fromIndex大于或等于数组长度,则停止查找并返回-1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-1表示从最后一个元素开始查找,-2表示从倒数第二个元素开始查找 ,以此类推。

兼容性:不兼容IE6~8。

根据indexOf()的语法写出兼容IE6~8的写法如下:

兼容性写法:

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(ele) {
        // 获取数组长度
        var len = this.length;
        // 检查值为数字的第二个参数是否存在,默认值为0
        var fromIndex = Number(arguments[1]) || 0;
        // 当第二个参数小于0时,为倒序查找,相当于查找索引值为该索引加上数组长度后的值
        if(fromIndex < 0) {
            fromIndex += len;
        }
        // 从fromIndex起循环数组
        while(fromIndex < len) {
            // 检查fromIndex是否存在且对应的数组元素是否等于ele
            if(fromIndex in this && this[fromIndex] === ele) {
                return fromIndex;
            }
            fromIndex++;
        }
        // 当数组长度为0时返回不存在的信号:-1
        if (len === 0) {
            return -1;
        }
    }
}

调用示例:

var arr = ["a", "b", "c"];
alert(arr.indexOf("b")); // 1

二. forEach()

forEach() 方法让数组的每一项都执行一次给定的函数。forEach()方法会修改原数组。

语法:

array.forEach(callback[, thisArg])

参数:

1 . callback :在数组每一项上执行的函数,接收三个参数: currentValue(当前项的值)、index(当前项的索引)和array(数组本身)。

2 . thisArg :可选参数。用来当作callback 函数内this的值的对象,即callback 函数的执行上下文;

forEach 方法按升序为数组中含有效值的每一项执行一次callback 函数,那些已删除(使用delete方法等情况)或者从未赋值的项将被跳过(但不包括哪些值为 undefined 的项)。

兼容性:不兼容IE6~8。

根据forEach()的语法写出兼容IE6~8的写法如下:

兼容性写法:

if ( !Array.prototype.forEach) {
  Array.prototype.forEach = function forEach(callback) {
      // 获取数组长度
    var len = this.length;
    if(typeof callback != "function") {
        throw new TypeError();
    }
    // thisArg为callback 函数的执行上下文环境
    var thisArg = arguments[1];
    for(var i = 0; i < len; i++) {
        if(i in this) {
            // callback函数接收三个参数:当前项的值、当前项的索引和数组本身
            callback.call(thisArg, this[i], i, this);
        }
    }
  }
}

调用示例:

var arr = ["a", "b", "c", "a", "d", "a"];
arr.forEach(function(ele, index, array){
    if(ele == "a") {
        array[index] = "**";
    }
});
alert(newArr); // ["**", "b", "c", "**", "d", "**"]

三. map()

map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。

语法:

array.map(callback[, thisArg])

参数:

1 . callback : 在数组每一项上执行的函数,接收三个参数: currentValue(当前项的值)、index(当前项的索引)和array(数组本身);

2 . thisArg :可选参数。用来当作callback 函数内this的值的对象,即callback 函数的执行上下文;

兼容性:不兼容IE6~8。

根据map()的语法写出兼容IE6~8的写法如下:

兼容性写法:

if (!Array.prototype.map) {
  Array.prototype.map = function(callback) {
      // 获取数组长度
      var len = this.length;
      if(typeof callback != "function") {
          throw new TypeError();
      }
      // 创建跟原数组相同长度的新数组,用于承载经回调函数修改后的数组元素
      var newArr = new Array(len);
      // thisArg为callback 函数的执行上下文环境
      var thisArg = arguments[1];
      for(var i = 0; i < len; i++) {
          if(i in this) {
              newArr[i] = callback.call(thisArg, this[i], i, this);
          }
      }
      return newArr;
  }    
}

调用示例:

var arr = ["a", "b", "c"];
var newArr = arr.map(function(ele, index, array){
    ele += "12";
    return ele;
});
alert(newArr); // ["a12", "b12", "c12"]

四. filter()

filter() 方法利用所有通过指定函数测试的元素创建一个新的数组,并返回。

语法:

arr.filter(callback[, thisArg])

参数:

1 . callback : 在数组每一项上执行的函数,接收三个参数: currentValue(当前项的值)、index(当前项的索引)和array(数组本身);

2 . thisArg :可选参数。用来当作callback 函数内this的值的对象,即callback 函数的执行上下文;

filter 为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回 “true” 的元素创建一个新数组。callback 只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback 测试的元素只会被跳过,不会被包含在新数组中。filter 不会改变原数组。

兼容性:不兼容IE6~8。

根据filter()的语法写出兼容IE6~8的写法如下:

兼容性写法:

if (!Array.prototype.filter) {
    Array.prototype.filter = function(callback) {
      // 获取数组长度
      var len = this.length;
      if(typeof callback != "function") {
          throw new TypeError();
      }
      // 创建新数组,用于承载经回调函数修改后的数组元素
      var newArr = new Array();
      // thisArg为callback 函数的执行上下文环境
      var thisArg = arguments[1];
      for(var i = 0; i < len; i++) {
          if(i in this) {
              if(callback.call(thisArg, this[i], i, this)) {
                  newArr.push(val);
              }
          }
      }
      return newArr;
  }
}

调用示例:

var arr = [1, 2, 3, 4, 3, 2, 5];
var newArr = arr.filter(function(ele, index, array){
    if(ele < 3) {
        return true;
    }else {
        return false;
    }
});
alert(newArr); // [1, 2, 2]

五. some()

some() 方法测试数组中的某些元素是否通过了指定函数的测试。返回布尔值。some() 被调用时不会改变数组。

语法:

arr.some(callback[, thisArg])

参数:

1 . callback : 在数组每一项上执行的函数,接收三个参数: currentValue(当前项的值)、index(当前项的索引)和array(数组本身);

2 . thisArg :可选参数。用来当作callback 函数内this的值的对象,即callback 函数的执行上下文;

some() 为数组中的每一个元素执行一次 callback 函数,直到找到一个使得 callback 返回一个true 的值。如果找到了这样一个值,some() 将返回 true。否则返回 false。

兼容性:不兼容IE6~8。

根据some()的语法写出兼容IE6~8的写法如下:

兼容性写法:

if (!Array.prototype.some) {
  Array.prototype.some = function(callback) {
      // 获取数组长度
      var len = this.length;
      if(typeof callback != "function") {
          throw new TypeError();
      }
      // thisArg为callback 函数的执行上下文环境
      var thisArg = arguments[1];
      for(var i = 0; i < len; i++) {
          if(i in this && callback.call(thisArg, this[i], i, this)) {
              return true;
          }
      }
      return false;
  }
}

调用示例:

var arr = [1, 2, 3, 4, 3, 2, 5];
var newArr = arr.some(function(ele, index, array){
    if(ele < 2) {
        return true;
    }else {
        return false;
    }
});
alert(newArr); // true

六. every()

every() 方法测试数组的所有元素是否都通过了指定函数的测试。every() 不会改变原数组。

语法:

arr.every(callback[, thisArg])

参数:

1 . callback : 在数组每一项上执行的函数,接收三个参数: currentValue(当前项的值)、index(当前项的索引)和array(数组本身);

2 . thisArg :可选参数。用来当作callback 函数内this的值的对象,即callback 函数的执行上下文;

every() 方法为数组中的每个元素执行一次 callback 函数。只有所有元素都在callback函数中返回true才返回true,否则返回false。

兼容性:不兼容IE6~8。

根据some()的语法写出兼容IE6~8的写法如下:

兼容性写法:

if (!Array.prototype.every) {
  Array.prototype.every = function(callback) {
      // 获取数组长度
      var len = this.length;
      if(typeof callback != "function") {
          throw new TypeError();
      }
      // thisArg为callback 函数的执行上下文环境
      var thisArg = arguments[1];
      for(var i = 0; i < len; i++) {
          if(i in this && !callback.call(thisArg, this[i], i, this)) {
              return false;
          }
      }
      return true;
  }
}

调用示例:

var arr = [1, 2, 3, 4, 3, 2, 5];
var newArr = arr.every(function(ele, index, array){
    if(ele < 3) {
        return true;
    }else {
        return false;
    }
});
alert(newArr); // false