window下启动redis服务

在windows环境下启动redis服务,前提是你安装好了,启动如下:

一,进入redis的安装目录下,在地址栏输入“cmd”,回车
二,然后会进入cmd界面,直接运行命令redis-server.exe redis.windows.conf。如果报错,依次执行第一条指令:redis-cli.exe,第二条指令:shutdown第三条指令:exit
三,在命令行窗口输入redis-server.exe redis.windows.conf,就会显示Redis服务器的信息,就代表Redis服务器已经启动了。


ps: 另外给大家推荐一款redis 可视化工具:RedisDesktopManager。

参考地址:
https://www.cnblogs.com/chaojiyingxiong/p/11281502.html

Yii2-admin的详细使用教程1

网上很多说用composer安装,但是其实国内的环境和网速大家懂的,所以还是下载安装比较快

1.下载地址:
https://github.com/mdmsoft/yii2-admin/releases

2.解压这个下载的包到vendor/mdm/目录下,如果没有mdm目录就新建一个

3.配置backend/config/main.php

<?php
params = array_merge(
    require __DIR__ . '/../../common/config/params.php',
    require __DIR__ . '/../../common/config/params-local.php',
    require __DIR__ . '/params.php',
    require __DIR__ . '/params-local.php'
);

return [
    'aliases' => [
        '@mdm/admin' => '@vendor/mdm/yii2-admin-2.11',
        'layout' => 'left-menu',
        // for example: '@mdm/admin' => '@app/extensions/mdm/yii2-admin-2.0.0',
        //...
    ],    'id' => 'app-backend',
    'basePath' => dirname(__DIR__),
    'controllerNamespace' => 'backend\controllers',
    'bootstrap' => ['log'],
    'modules' => [],
    'modules' => [
        'admin' => [
            'class' => 'mdm\admin\Module',
            'layout' => 'left-menu',//yii2-admin的导航菜单
        ]

    ],
    'components' => [
        /*'authManager' => [
            'class' => 'yii\rbac\DbManager',//'yii\rbac\PhpManager', // or use        ],*/
        'authManager' => [
            'class' => 'yii\rbac\DbManager', // 使用数据库管理配置文件
        ],
        'request' => [
            'csrfParam' => '_csrf-backend',
        ],
        'user' => [
            'identityClass' => 'backend\models\Adminuser',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
        ],
        'session' => [
            // this is the name of the session cookie used for login on the backend
            'name' => 'advanced-backend',
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        /*
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
        */
    ],
    'as access' => [
        'class' => 'mdm\admin\components\AccessControl',
        'allowActions' => [
            'site/*',
            'admin/*',
            'some-controller/some-action',
            // The actions listed here will be allowed to everyone including guests.
            // So, 'admin/*' should not appear here in the production, of course.
            // But in the earlier stages of your development, you may probably want to
            // add a lot of actions here until you finally completed setting up rbac,
            // otherwise you may not even take a first step.
        ]
    ],
    'params' =>params,
];

4.配置common/config/main.php

<?php
return [
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'authManager' => [
            'class' => 'yii\rbac\DbManager', // 使用数据库管理配置文件
        ],
    ],
];

5.创建相应的数据库表
在控制台中输入以下命令:

yii migrate --migrationPath=migrations
yii migrate --migrationPath=@yii/rbac/migrations
安装到此完成。
访问http#//localhost/path/to/index.php?r=admin可以看到yii2-admin的管理界面

6.配置访问权限示例
以节点terms(一个自定义的节点)为例,节点terms下共有index,view,create,update,delete五个子节点。
配置目标:
未登录用户仅能访问index节点
一般登录用户能访问index,view,create三个节点
管理员能访问所有节点

步骤一:添加可分配列表

打开yii2-admin路由列表页,点击可用输入框后面的刷新图标将列出当前网站所有可用的路由列表,选中terms各节点路由表添加至右侧可分配路由列表中。

步骤二:添加权限

权限列表=>新增权限,填好名称提交后,添加对应的路由规则即可。
可用列表中除了路由列表还有已经添加了的权限列表,一个权限可以包含另一个权限。

步骤三:添加角色

角色列表=》新增角色,分别添加管理员、一般用户、未登录用户,将对应的权限分配给角色。

步骤四:分配角色

分配界面列出来的用户名是当前系统中已注册的用户。现注册了admin和user账号用于演示。
点击账号后边的眼睛图案,进行权限分配。
按需要,给予相应的权限。

步骤五:配置网站默认访问权限

上面四步配置完成后,我们访问terms各节点测试结果:
以一般用户身份登录时,可以浏览、添加信息,要更新、删除信息时会提示无权操作。符合预期。

以管理员身份登录时,可进行所有操作。符合预期。
但是如果不登录,在访问terms首页时会跳转到登录页面。预期结果是未登录时能访问terms首页。
就是说当前系统默认不认可我们配置给未登录用户的权限。
只需要在配置文件中加一行指定默认规则的代码即可:

    'authManager'=> [
        'class' => 'yii\rbac\DbManager',
        'defaultRoles' => ['未登录用户'],//添加此行代码,指定默认规则为 '未登录用户'
    ],

未登录时再访问terms/index节点就能正常显示了,点别的操作时会跳到登录页面,因为未登录时仅有访问首页的权限。

除了在authManager中配置默认权限,在as access中也可以配置允许所有人访问的节点。

'as access' => [
    'allowActions' => [//下面列出的节点,所有人都可以访问,针对未登录用户的配置也可以移至这里
        'admin/*',
        'site/*',
        ]
]

参考链接:
https://www.kancloud.cn/curder/yii/247759
https://www.yiichina.com/tutorial/571

MAC中安装oracle11g,并导入数据

参考出处https://blog.csdn.net/qq_38380025/article/details/80647620
https://blog.csdn.net/qq_34928194/article/details/103536736
使用docker,如果网速好的话,从开始动手到可以使用大概也不用20分钟。

安装步骤如下:

1、安装docker

文件下载:下载docker

2、安装oracle

在终端中执行:

docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
下载完成后,启动镜像为容器:

docker run -h “oracle” –name “oracle” -d -p 49160:22 -p 49161:1521 -p 49162:8080 alexeiled/docker-oracle-xe-11g
执行成功后,可使用数据库连接工具进行访问:

默认用户是system,密码oracle。当然一般的做法是创建一个普通用户,使用这个用户进行操作。

3、创建用户

   在终端中执行以下命令进入容器:

docker exec -it 806ebe7f5231 /bin/bash
其中806ebe7f5231是容器id,可使用如下命令获得:

docker ps

进入容器后,使用如下命令登录:

sqlplus system/oracle
然后再创建用户,授权等。

4、导入数据

创建用户、表空间成功后,下一步就要导入数据。

注意:先要将数据库备份文件复制到容器中才能导入。

退出oracle连接后,使用root在容器中创建一个目录,用于放置数据库文件:

mkdir dbfile
exit退出容器,在终端中执行命令,将备份复制到容器:
sudo docker cp /Users/xxx/Desktop/backup.dbf bf939e7c2bd8:/dbfile
以上命令中,/Users/xxx/Desktop/backup.dbf是数据库备份在mac中的全路径,bf939e7c2bd8是容器id,/dbfile是在容器中的存放目录。

复制完成后,再次进入容器,使用sqlplus连接到数据库,按一般步骤进行imp导入即可。

停止/启动oracle服务:

docker stop oracle
docker start oracle

MySQL导入csv

导入csv文件

使用如下命令:
mysql> load data infile "your csv file path" into table [tablename] fields terminated by ','
注意上面导入文件时,都需要提前建立好与文件内各个段对应好的数据表。并且文件的路径需要使用引号括起来,双引号和单引号都可以。

mysql去重的最方便的方法

方法一:

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段,而无法返回其它字段

下面先来看看例子:

table
id name
1 a
2 b
3 c
4 c
5 b

库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。

比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。

select distinct name from table
得到的结果是:

name
a
b
c

好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:

select distinct name, id from table

结果会是:

id name
1 a
2 b
3 c
4 c
5 b

distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。

我们再改改查询语句:

select id, distinct name from table

很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。。。。。。。

最终好用的语句如下:

select *, count(distinct name) from table group by name

结果:

id name count(distinct name)
1 a 1
2 b 1
3 c 1

最后一项是多余的,不用管就行了,目的达到。。。。。

哦,对,再顺便说一句,group by 必须放在 order by 和 limit之前,不然会报错。。。。。。。。!OK了

总结语句:select *, count(distinct name) from (select * from table……等嵌套语句) group by name
参考出处:https://blog.csdn.net/djun100/article/details/84473838?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

d3.js自定义组件

<html>
    <head>
        <meta charset="utf-8">
        <!--script type="text/javascript" src="https://d3js.org/d3.v6.min.js"></script-->
        <script type="text/javascript" src="d3.js"></script>
        <script type="text/javascript" src="demo2.js?r=12s"></script>
    </head>
    <body onload="demo2()">
        <svg id="sticker" width="600" height="300" style="background: lightgrey"/>
            <p>hello,today is a good day!</p>
    </body>
</html>
function sticker(sel,label){
    sel.append("rect").attr("rx",5).attr("ry",5)
    .attr("width",70).attr("height",30)
.attr("x",-35).attr("y",-15)
.attr("fill","none").attr("stroke","blue")
.classed("frame",true);

sel.append("text").attr("x",0).attr("y",5)
.attr("text-anchor","middle")
.attr("font-family","sans-serif").attr("font-size",14)
.classed("label",true)
.text(label?label:d=>d);
    }

function demo2()
{
    var labels=["hello","world"];
var scX=d3.scaleLinear().domain([0,labels.length-1]).range([100,500]);
var scY = d3.scaleLinear().domain([0,labels.length-1]).range([50,150]);
d3.select("#sticker")
.selectAll("g").data(labels).enter().append("g")
.attr("transform",(d,i)=>"translate("+scX(i)+","+scY(i)+")")
.call(sticker);

d3.select("#sticker").append("g")
.attr("transform","translate(175,150)")
.call(sticker,"cool")
.selectAll(".label").attr("fill","red");
}