redis并发锁 thinkphp5_Thinkphp5+Redis实现商品秒杀代码实例讲解_Mike昊的博客-CSDN博客

mikel阅读(812)

来源: (1条消息) redis并发锁 thinkphp5_Thinkphp5+Redis实现商品秒杀代码实例讲解_Mike昊的博客-CSDN博客

环境:wamp,redis

要求:安装WAMP,Redis,以及为PHP安装Redis扩展

秒杀功能大致思路:获取缓存列表的长度,如果长度(llen)等于0,就停止秒杀,即秒杀失败,如果长度大于0,则继续运行,先从缓存中移除一个元素(lpop),再进行数据库操作(添加订单表,商品库存数量减一),如果再进一个人秒杀,就再走一遍流程,循环往复。

一、安装Redis扩展

1.查看PHP版本信息

打开phpinfo.php,查看PHP版本,我的是PHP7.3.4,还有一个需要注意Architecture x64

 

2.下载扩展文件

根据自己环境,选择合适的版本

3.解压

解压下载的压缩包,并把php_redis.dll、php_redis.pdb和php_igbinary.dll、php_igbinary.pdb四个文件,移至自己PHP版本对应目录下的ext文件夹下E:\phpstudy_pro\Extensions\php\php7.3.4nts\ext

 

 

4.修改php.ini

添加如下代码:

extension=php_igbinary.dll

extension=php_redis.dll

如果有这两句可以把前面的分号删掉,没有就自己添加上,要注意顺序,php_igbinary.dll 要在php_redis.dll 前面

 

5.重启Apache

重启后,再运行phpinfo.php,查看是否安装成功

 

二、数据结构

一共三张表,ab_goods商品表,ab_order订单表,ab_log日志表

商品表

 

订单表

 

日志表 记录秒杀信息

 

三、代码

namespace app\index\controller;

use think\Controller;

use think\Db;

use think\cache\driver\Redis;

class Miaosha extends Controller

{
private $redis = null;

private $cachekey = null; //缓存变量名

private $basket = []; //私有数组,存放商品信息

private $store = 50;

/**

* 购物车初始化,传入用户id

*/

public function __construct()

{
parent::__construct();

$this->redis = new \Redis(); // 实例化

$this->redis->connect(‘127.0.0.1′,’6379’);

$this->redis->auth(‘zxf123456′);

}

/**

* 秒杀初始化

*/

public function Ms_init()

{
// 删除缓存列表

$this->redis->del($this->cachekey);

$len = $this->redis->llen($this->cachekey);

$count = $this->store – $len;

for ($i=0; $i < $count; $i++) {
// 向库存列表推进50个,模拟50个商品库存

$this->redis->lpush($this->cachekey,1);

}

echo “库存初始化完成:”.$this->redis->llen($this->cachekey);

}

/**

* 秒杀入口

*/

public function index()

{
$id = 1; //商品编号

if (empty($id)) {
// 记录失败日志

return $this->writeLog(0,’商品编号不存在’);

}

// 计算库存列表长度

$count = $this->redis->llen($this->cachekey);

// 先判断库存是否为0,为0秒杀失败,不为0,则进行先移除一个元素,再进行数据库操作

if ($count == 0) { //库存为0

$this->writeLog(0,’库存为0′);

echo “库存为0”;

exit;

}else{
// 有库存

//先移除一个列表元素

$this->redis->lpop($this->cachekey);

$ordersn = $this->build_order_no(); //生成订单

$uid = rand(0,9999); //随机生成用户id

$status = 1;

// 再进行数据库操作

$data = Db::table(‘ab_goods’)->field(‘count,amount’)->where(‘id’,$id)->find(); //查找商品

if (!$data) {
return $this->writeLog(0,’该商品不存在’);

}

$insert_data = [

‘order_sn’ => $ordersn,

‘user_id’ => $uid,

‘goods_id’ => $id,

‘price’ => $data[‘amount’],

‘status’ => $status,

‘addtime’ => date(‘Y-m-d H:i:s’)

];

// 订单入库

$result = Db::table(‘ab_order’)->insert($insert_data);

// 自动减少一个库存

$res = Db::table(‘ab_goods’)->where(‘id’,$id)->setDec(‘count’);

if ($res) {
echo “第”.$count.”件秒杀成功”;

$this->writeLog(1,’秒杀成功’);

}else{
echo “第”.$count.”件秒杀失败”;

$this->writeLog(0,’秒杀失败’);

}

}

}

/**

* 生成订单号

*/

public function build_order_no()

{
return date(‘ymd’).substr(implode(NULL, array_map(‘ord’, str_split(substr(uniqid(), 7, 13), 1))), 0, 8);

}

/**

* 生成日志 1成功 0失败

*/

public function writeLog($status = 1,$msg)

{
$data[‘count’] = 1;

$data[‘status’] = $status;

$data[‘addtime’] = date(‘Y-m-d H:i:s’);

$data[‘msg’] = $msg;

return Db::table(‘ab_log’)->insertGetId($data);

}

}

四、压力测试

使用apache压力测试工具 AB 测试,模拟多用户秒杀商品,模拟60秒内发起3000个请求,并发600次,秒杀50个库存商品

AB测试相关参数说明

-r 指定接收到错误信息时不退出程序

-t 等待响应的最大时间

-n 指定压力测试总共的执行次数

-c 用于指定压力测试的并发数

1.初始化50个库存,运行ms_init方法

2.测试 命令行:

E:\phpstudy_pro\Extensions\Apache2.4.39\bin>ab -r -t 60 -n 3000 -c 1000 http://gouwuche.zxf/index/miaosha/index

 

3.检测数据库数据

 

 

日志表状态为1(秒杀成功)的数据有50人,订单表里的订单数也是50条,商品表里的商品数量变成了0(测试之前是50),商品秒杀成功完成!

如果不用redis而是直接用mySQL的话,商品表订单的数量count会变成负数,而秒杀成功的人数也多余50人,订单表里的订单数量也多余50条(新测),下面是直接用MySQL的例子;

public function sqlMs()

{
$id = 1; //商品编号

$count = 50;

$ordersn = $this->build_order_no(); //生成订单

$uid = rand(0,9999); //随机生成用户id

$status = 1;

// 再进行数据库操作

$data = Db::table(‘ab_goods’)->field(‘count,amount’)->where(‘id’,$id)->find(); //查找商品

// 查询还剩多少库存

$rs = Db::table(‘ab_goods’)->where(‘id’,$id)->value(‘count’);

if ($rs <= 0) {
$this->writeLog(0,’库存为0′);

}else{
$insert_data = [

‘order_sn’ => $ordersn,

‘user_id’ => $uid,

‘goods_id’ => $id,

‘price’ => $data[‘amount’],

‘status’ => $status,

‘addtime’ => date(‘Y-m-d H:i:s’)

];

// 订单入库

$result = Db::table(‘ab_order’)->insert($insert_data);

// 自动减少一个库存

$res = Db::table(‘ab_goods’)->where(‘id’,$id)->setDec(‘count’);

if ($res) {
echo “第”.$data[‘count’].”件秒杀成功”;

$this->writeLog(1,’秒杀成功’);

}else{
echo “第”.$data[‘count’].”件秒杀失败”;

$this->writeLog(0,’秒杀失败’);

}

}

}

到此这篇关于Thinkphp5+Redis实现商品秒杀的文章就介绍到这了,更多相关Thinkphp5+Redis实现商品秒杀内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
————————————————
版权声明:本文为CSDN博主「Mike昊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_35645230/article/details/113019644

C#报错:输入字符串格式不正确_pyy的博客-CSDN博客_输入字符串的格式不正确

mikel阅读(807)

来源: (1条消息) C#报错:输入字符串格式不正确_pyy的博客-CSDN博客_输入字符串的格式不正确

List<Model> data1 = list.Select(x => new Model { num = Convert.ToDecimal(x.PM25) }).OrderBy(x => x.num).ToList();

修改如下:

data = list.OrderBy(x => x.CO).Select(x => x.CO).ToList();
List<decimal> list3 = new List<decimal>();
decimal s3 = 0;
list3 = data.ConvertAll<decimal>(x => decimal.TryParse(x, out s3) == true ? s3 : s3);

附TryParse的使用方法如下:

https://blog.csdn.net/firetaker/article/details/5638914

Convert.ToDouble double.TryParse 使用方式比较

2010年06月01日 11:20:00 firetaker 阅读数:5258 标签: exceptionstring测试

 

 view plain copy

  1. static void Main(string[] args)
  2.       {
  3.          try
  4.          {
  5.             string str = “”;
  6.             // 如果当前str为空串,则出异常:输入字符串格式不正确
  7.             Console.WriteLine(Convert.ToDouble(str));
  8.          }
  9.          catch (Exception ex)
  10.          {
  11.             Console.WriteLine(ex.Message);
  12.          }
  13.          Console.ReadLine();
  14.       }

 

以上代码中出现的结果为:输入字符串格式不正确。因为传入的字符串为空,转换成double类型不成功

 

 view plain copy

  1. static void Main(string[] args)
  2.       {
  3.          try
  4.          {
  5.             string str = “123.123”;
  6.             // 如果当前str为空串,则出异常:输入字符串格式不正确
  7.             Console.WriteLine(Convert.ToDouble(str));
  8.          }
  9.          catch (Exception ex)
  10.          {
  11.             Console.WriteLine(ex.Message);
  12.          }
  13.          Console.ReadLine();
  14.       }

 

随便对str赋值一个合适的值,得到结果为:123.123

下面转换用另外一种方式处理:

第一种情况设置当前的str为空

 

 view plain copy

  1. static void Main(string[] args)
  2.     {
  3.        try
  4.        {
  5.           string str = “”;
  6.           double rst = 0.0;
  7.           Console.WriteLine(“转换结果为:” + double.TryParse(str, out rst));
  8.           Console.WriteLine(rst);
  9.        }
  10.        catch (Exception ex)
  11.        {
  12.           Console.WriteLine(ex.Message);
  13.        }
  14.        Console.ReadLine();
  15.     }

 

得到的结果为:

转换结果为:false

0

第二种情况:

 

 view plain copy

  1. static void Main(string[] args)
  2.       {
  3.          try
  4.          {
  5.             string str = “123.123”;
  6.             double rst = 0.0;
  7.             Console.WriteLine(“转换结果为:” + double.TryParse(str, out rst));
  8.             Console.WriteLine(rst);
  9.          }
  10.          catch (Exception ex)
  11.          {
  12.             Console.WriteLine(ex.Message);
  13.          }
  14.          Console.ReadLine();
  15.       }

 

 

得到的结果为:

转换结果为:true

123.123

 

由以上的测试结果可以看出。使用double.TryParse()做类型转换更安全

可以对返回值进行判断,也可以设置默认的返回值0

超详细!Android Studio 首次创建工程Sync出错解决办法_林辰的博客-CSDN博客_android studio sync失败

mikel阅读(2217)

来源: (1条消息) 超详细!Android Studio 首次创建工程Sync出错解决办法_林辰的博客-CSDN博客_android studio sync失败

Android Studio 首次创建工程Sync出错解决办法
因为课程需要,昨天安装了Android Studio(以下用AS表示)建立工程时出现了sync错误:

↑ sync failed出错

尝试了单独下载gradle文件的方法,使用国内镜像的方法,网上的方法五花八门看得我眼都花了😵
弄了大半天总算是搞定了…废话不多说,上干货!

解决方法
出现sync错误,其实也是解决AS gradle下载同步卡慢的问题,是因为每次建立或者打开工程时,AS会检测一遍文件是否缺少,正常来说AS可以帮我们自动下载,但是因为国内外服务器连接的问题,没办法正常下载,所以我们可以:

手动下载gradle包
打开AS,创建工程后,切换到Project视图

找到gradle–wrapper–gradle-wrapper.properties双击打开

文件路径:(注意gradle有不同的版本)

在右侧找到文件下载路径:distributionUrl=https://services.gradle.org/distributions/gradle-5.4.1-all.zip(把http://中的 \ 删掉)在浏览器中粘贴,等待下载任务弹出。或者到Gradle网站自行下载
下载完之后,在AS中打开设置

创建并更改gradle路径:

把下载好的gradle压缩包移到gradle路径下,并解压

打开解压后的gradle-5.4.1-all文件(注意路径变化)把.ok .lck文件复制到dists路径下

如下:

回到AS,重新sync

等待,sync成功✔

使用国内镜像
可以使用阿里云镜像解决下载失败的问题。只需要添加相应的url地址就可以下载。
切换视图,在Gradle Scripts中找到build.gradle,双击打开

添加两句代码:maven{ url ‘http://maven.aliyun.com/nexus/content/groups/public/’}
具体配置如下:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
maven{ url ‘http://maven.aliyun.com/nexus/content/groups/public/’}
google()
jcenter()

}
dependencies {
classpath ‘com.Android.tools.build:gradle:3.5.2’

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
maven{ url ‘http://maven.aliyun.com/nexus/content/groups/public/’}
google()
jcenter()

}
}

task clean(type: Delete) {
delete rootProject.buildDir
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
最后重新编译一下就OK了。

需要注意
很多国外软件的文件路径是不支持带有中文路径的。
下载的gradle版本要和AS中的一致。
————————————————
版权声明:本文为CSDN博主「请叫我林辰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45464418/article/details/112860163

解决下载Gradle失败问题:ERROR: Could not install Gradle distribution from ‘https://services.gradle.org/...... - 知乎

mikel阅读(1445)

来源: 解决下载Gradle失败问题:ERROR: Could not install Gradle distribution from ‘https://services.gradle.org/…… – 知乎

1.项目场景:

第一次或升级安装 Android Studio 后创建项目或导入项目,下载Download gradle


2.问题描述:

新安装Android Studio3.5.2 后第一次创建项目是一只卡在下载https//services.gradle.org/dis 上。


3.原因分析:

网络不好、网络异常导致下载超时。

因为,这个资源是外网下载,所以很慢,慢到有时候一点击【Try Again】就直接提示下载失败!!!


4.解决方案:

4.1、直接关闭正在运行的Android Studio

4.2、通过别的方式,下载Gradle资源

例如方式一:copy【https://services.gradle.org/distributions/gradle-5.4.1-all.zip】这个链接,通过迅雷下载:

例如方式二:通过百度云等共享资源下载,自己百度一下,资源应该不少的。

4.3、将上面下载的资源,复制拷贝到对应版本的Gradle存放目录下

例如:C:\Users\Administrator.gradle\wrapper\dists\gradle-5.4.1-all\3221gyojl5jsh0helicew7rwx

4.4、重启Android Studio,耐心等待一小会儿 – >搞定!!!!

4.5、终于可以继续了!!!!


5.结束语

希望此文对大家有帮助,加油肝…吧!

哦,对了~~

感谢大家的阅读,更多精彩等待下次创作,你最大的支持就是:赞同+评论+收藏+喜欢+…,关注我。

另外,也欢迎大家关注同名宫塚豪: 聊者说

Android SDK的下载与安装 - HStranger - 博客园

mikel阅读(1678)

来源: Android SDK的下载与安装 – HStranger – 博客园

一、Android SDK简介

Android SDK(Software Development Kit,软件开发工具包)被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。它提供了 Android API 库和开发工具构建,测试和调试应用程序。简单来讲,Android SDK 可以看做用于开发和运行 Android 应用的一个软件。

二、下载SDK

1.目前官网上已经没有单独的SDK下载安装包了。谷歌官网推荐的是下载包含有Android SDK的Android Studio。官网下载地址

Android Studio是用来做安卓开发试调的官方退出的工具。但是谷歌官网在国内是无法访问

2.由于这个Android Studio 的安装包过大且官网下载需要FQ,而使用Appium 的时候实际上只需要用到SDK 工具而已。所以推荐大家去另外一个国内的Android 工具的下载网站androiddevtools下载。

①进入页面后点击【Android SDK 工具】按钮,然后在弹出的选择框内点击【SDK Tools】按钮,然后界面会自动跳转到SDK 的下载界面,选择适合自己的版本进行下载

 

 ②将下载后的安装包解压到相应的目录下,如下图:

三、安装Android 版本

①进入SDK的解压目录下,双击“SDK Manager.exe”打开SDK管理器

 

 ②在使用这个管理器的时候,需要使用FQ,才能进行下载安装;或者你也可以在上面推荐的那个下载SDK的国内安卓工具网站上下载适合你的版本的Android SDK 镜像,网站传送门

四、SDK环境配置 

在解压完成后,就可以开始配置环境变量了。方法和设置JAVA JDK的环境变量的方法类似。

“右键 我的电脑”—“属性”—“高级系统设置”—“环境变量”—“系统变量”—“新建”  SDK 需要对环境变量做如下更改(win 10):

1 创建ANDROID_HOME,值是你的刚刚SDK的解压目录,比如 E:\Android\android-sdk-windows

2.在新建完ANDROID_HOME之后,找到Path变量,然后双击打开Path 变量

将SDK的platform-tools和tool的路径添加到Path 变量内(这两个目录在你通过SDK Manager安装更新Android SDK Tools和Android SDK Platform-tools之后就会有了)
1 新建 %ANDROID_HOME%\platform-tools
2 新建 %ANDROID_HOME%\tools
3 新建 %ANDROID_HOME%\tools

 

五、创建并启动一个安卓模拟器

在安装了一个安卓SDK后,就可以创建一个对应版本的模拟器啦。

进入SDK的解压目录下,双击“AVD Manager.exe”打开安卓虚拟机管理器,如下图

然后点击“Create”按钮,打开创建安卓虚拟设备界面(如下图),然后输入各项信息进行虚拟设备创建。

不要选择超过电脑屏幕分辨率的Device,其他选项可参考上图,点击 “OK” 创建完成。

在 AVD Manage 工具中选中创建的Android虚拟机,点击 “Start…” 按钮启动(第一次启动会略慢,需要耐心的等一会儿),启动成功后如下图所示

解决php报错 chmod() has been disablde for security reasons 的教程 - 飞鸟慕鱼博客

mikel阅读(1004)

来源: 解决php报错 chmod() has been disablde for security reasons 的教程 – 飞鸟慕鱼博客

今天有一个使用我用制作的zblog静态插件的用户来反馈一个 php 报错的问题,报错提示为“chomd() has been disablde for security reasons”,虽然很快就给解决了,但还是记录一下,方便以后查看。

php chmod() has been disablde for security reasons  错误详解

错误解析如下:

chmod() has been disablde for security reasons

复制

翻译:

出于安全原因,chmod() 函数已被禁用

复制

注释:由于 chmod() 可以更改文件的权限,所以很多运维在配置 php 时,都会禁用此函数。在 chmod() 函数被禁用的情况下,如果代码里出现此函数的调用,php 就会抛出上面的错误提示!

解决方法

1、虚拟机

一般的虚拟机管理后台都有 php.ini 的设置项目,下图以阿里云(万网)虚拟机为例,可以在后台的虚拟机管理面板中,chmod() 函数的设置项,启用即可!

如果你使用的虚拟机不支持函数的禁用设置,则可以咨询虚拟机的服务商,让他们帮助解决!

chmod() has been disablde for security reasons

2、云服务器

如果你使用的为云服务器,为自建的环境(例如宝塔面板,一些环境的集成等),则可以通过修改 php 的配置文件,php.ini 来解决此问题

(1)、找到 php 的配置文件 php.ini ,并打开

(2)、搜索 “disable_functions”,并定位到其所在行,不同的配置可能“disable_functions”的值不同,但都有一个 chmod 字符串。

chmod() has been disablde for security reasons

(3)、删除上面箭头所指的 “chmod”并保存

(4)、重启 php 服务 (如果重php服务不生效,就重启一下服务器)

 THINKPHP6 页面错误!请稍后再试~问题解决日记01_Dexx的博客-CSDN博客

mikel阅读(1196)

来源: (1条消息) THINKPHP6 页面错误!请稍后再试~问题解决日记01_Dexx的博客-CSDN博客

##今天经过各大神教程学习发现对表的时候测试出来一句

页面错误!请稍后再试

自己检查好多问题表头啊结果现在就处于一个没错误提示的尴尬界面
通过搜查TP5的解决方式是换

config.php文件show_error_msg=false 改为True

同理TP6就一直找不到文件
搜代码发现TP6是更改

Config/app.php文件show_error_msg=false 改为True

问题解决!
总结
TP5跟TP6的位置不一样
现在能看到bug解决问题了!

这里感谢下给我道路指引的耕耕老师!
————————————————
版权声明:本文为CSDN博主「Dexx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43810144/article/details/110996687

Unknown character set: ‘utf8mb4‘_路窑的博客-CSDN博客

mikel阅读(741)

来源: (1条消息) Unknown character set: ‘utf8mb4‘_路窑的博客-CSDN博客

今天使用MySQL数据库运行SQL文件时遇到了这个错误:
Unknown character set: ‘utf8mb4’

错误原因:
我的MySQL是5.0版本的,版本比较低,而这个sql文件是在5.7版本的数据库中转储的,但是 MySQL 原字符集为utf8,从5.5开始采用的是utf8mb4。导致在我的数据库中无法识别这个字符集

解决方法:
使用记事本打开sql文件找到:set names utf8mb4这一行

将utf8mb4改为utf8即可

成功运行sql文件:

还是建议将mysql版本升级到5.7
————————————————
版权声明:本文为CSDN博主「路窑」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45800640/article/details/118103742

极简实用的Asp.NetCore模块化框架决定免费开源了 - realyrare - 博客园

mikel阅读(900)

来源: 极简实用的Asp.NetCore模块化框架决定免费开源了 – realyrare – 博客园

背景

 在开发这个框架之前,前前后后看过好几款模块化的框架,最后在一段时间内对ABP VNext痛下狠心,研究一段时间后,不得不说 ABP VNext的代码层面很规范,也都是一些最佳实践,开发出一个模块效率也很高。但不得不说,于我而言太重了。还看过一些其他模块化的框架,就不说了,学习成本于我而言太高了,主要是自己懒。

于是,我在想有没有一款上手简单,比较经济实用的模块化框架,只要会.net core 基本就可以上手呢,于是,将ABP VNext的模块化核心代码抽出来(在这里要特别感谢土牛了),结合ASP.NET core很完美,我本身的需求就是做到业务逻辑代码能够复用,不用经常一些已经写过好几遍的简直难受到要吐的重复代码,这于我而言就足够了。

框架简介

一款基于ASP.NET core3.1的模块化开发框架,提取了ABP VNext的模块核心,适合中小型项目快速开发,取名为神牛(ShenNius),意为大神大牛多提意见,一起参与,神牛云集,为dotnet社区贡献一份自己的力量。追求“简单”,“高效”,“实用”,总之秉承大道至简的原则开发,坚持业务模块最低复杂度复用,只要会C#,再会点Asp.NetCore基础知识,极易上手。适合小白入门进阶,更适用(实用)老手上路干活。
所有的业务代码可以按照类库划分,使用宿主托管。所有的代码坚持” Don’t repeat yourself “。坚决反对” 简单的事情复杂干 “,” 大量代码在应用层过度层层封装 “,反对” 过度设计 “的原则下进行开发。如果你有这个习惯,并且也想找一款迷你型、上手快,不用学习太多东西的框架,那么它就适合你,只要你会dotnet core,几乎没有学习成本,除了ABP VNext的模块化核心代码。另外、顺手做了个简单的后台权限管理做为入门例子。采用LayuiMini+Asp.Net Core Razor Page,本来是想用Blazor,我前后看了几款UI框架,目前都不是很成熟,需要踩坑。而我由于时间比较紧迫关系,只有自己一个人,先使用Layui,后期有时间我还是想上Blazor的,目前整个前后端交互基本都是分离的,后面想要切换到Blazor,也很好对接。
注:权限后台管理有部分样式之类的有借鉴“ FytSoaCms”这个开源项目​。​

软件架构

  1. API框架:dotNetCore
  2. ORM:SQLSugarCore
  3. 缓存:MemoryCache(后期会上redis,看项目业务需求)
  4. 日志管理:Nlog
  5. 工具类:Aes加密、Md5加密、RSA加密、Des加密
  6. token:Json Web Token
  7. 实体验证:FluentValidation
  8. 实体映射:AutoMapper

使用说明

  1. ShenNius.ModuleCore是模块化的核心代码
  2. ShenNius.Swagger是封装的API Doc
  3. ShenNius.Share.Infrastructure 基础设施、里面包含常用的扩展方法、静态类
  4. ShenNius.Share.Models 实体层、里面包括Dto验证、配置类
  5. ShenNius.Share.Service 服务层、业务逻辑基本都在这个里面、里面包含了数据访问操作。
  6. ShenNius.Sys.API 基于RBAC的权限API。
  7. ShenNius.Cms.API 基于Cms的API (待完成)
  8. ShenNius.Shop.API 基于Cms的API (待完成)
  9. ShenNius.API.Hosting API的宿主,所有API目前都放在这个里面托管,这也是魅力所在,可以Sys和Cms API各自托管使用独立的宿主,主要看业务量。拆合很容易。
  10. ShenNius.Layui.Admin 基于layui的后台管理。

安装教程

  1. git clone https://gitee.com/shenniu_code_group/shen-nius.-modularity.git
  2. 多项启动ShenNius.API.Hosting 和ShenNius.Layui.Admin
  3. ShenNius.API.Hosting 可以配置你要启动的API项目

效果图

 

最后说明

这个框架,我一直会更新下去,不断的去调整架构,关于Asp.Net Core Api如何配置swagger,FluentValidation等技术文章我近期也会更新文章出来,只要业务需要,我会将一些技术点慢慢地融入到框架中来。尽量做到务实,尽量不在应用层封装自己大量的东西,增加学习成本。我本人真的不喜欢在应用层封装大量东西的框架,包了一层又一层,没任何意义。
另外,近期我会把一些权限管理的前端bug修复下,前端技术我是个半桶水,真的很发愁,如果有人愿意一起做开源,为社区贡献一份力量,那就尽情的联系我吧。以前自己也做了大量的个人项目,但都没有开源出来。这次基本也是从小白做起,一起学习如何做好一个开源项目。

对了,近期我也会把CMS模块尽快完善起来,商城模块后面逐渐排期更新。
最后,如果有什么问题,我也自建了”dotnet根据地”这样一个微信群,可以识别下面的二维码加入,一起交流沟通,如果群二维码过期了也可以识别下面二维码加我微信,邀请你加入微信群​。

 

源码地址

码云:https://gitee.com/shenniu_code_group/shen-nius.-modularity

github:https://github.com/realyrare/ShenNiusFramework

使用宝塔本地安装wordpress测试站点 - WP主题站

mikel阅读(837)

来源: 使用宝塔本地安装wordpress测试站点 – WP主题站

大多数情况下,我们会直接在云服务器上使用WordPress建站,因为非常的方便,也不需要太多的调试。不过有些时候我们会有一些特殊的需求,比如测试插件、主题、二次开发等,这些操作不适合在正式环境中进行,这时候我们就可以在本地安装WordPress,在本文中我们将教大家使用宝塔面板Windows在本地搭建WordPress测试站点

 

安装宝塔Windows客户端

打开宝塔官网,选择Windows版,然后点击立即安装

浏览器会下载宝塔windows的安装包,打开安装包进行安装操作

初始状态下宝塔已经为我们选择好了目录,一般保持默认即可,点击立即安装,过程会持续几分钟

最后点击立即启动,这样我们的客户端就安装完毕了

 

宝塔安装本地环境

前面我们只是安装了宝塔客户端,接下来安装网站需要的基本环境,包括Nginx、PHP、MySQL

找到套件中的宝塔-Web面板,点击启动按钮

启动之后还不能直接使用,点击右上角的折叠菜单,先选择 初始化/修改密码

因为是本地搭建,密码复杂度无所谓,可以随机生成或者写一个好记的密码

 

然后访问地址 http://localhost:888/login.php,输入刚刚修改的账号和密码并登陆面板

后台选择软件管理 – 运行环境,依次安装需要的软件

建议使用Nginx + MySQL + PHP7,因为本地搭建是大部分情况下是测试站点或者开发环境,和真实的服务器安装相同的软件版本,避免出现不兼容的情况

安装过程需要等待一段时间,如果你的电脑性能不错的话会比服务器快很多

 

宝塔新建网站

有了环境之后,我们就可以添加网站了

后台选择新建站点,域名可以随意写,比如添加一个 demo.com,记得选择MySQL数据库和PHP版本

提交以后,测试站点就建好了

但是我们发现还不能访问,因为这个域名并不是我们自己的,接下来需要配置本地hosts文件

在电脑中打开如下的路径 C:\Windows\System32\drivers\etc

会看到一个叫做hosts的文件

右键使用笔记本或者Sublime之类的代码软件打开编辑,添加如下所示代码,如果你使用其他域名,修改为自己的

127.0.0.1 demo.com

注意:如果不能保存的话,使用管理员权限操作

最后访问 demo.com,如果出现恭喜,站点创建成功,那么就没有问题了,如果不出现,需要排查是否有设置错误

然后可以到 D:\wwwroot\demo.com 目录下查看网站文件,把自带的几个html文件删除

 

本地安装WordPress

环境和站点配置好以后,就可以开始安装WordPress了

打开WordPress官方下载页面,下载最新版WordPress安装包,将其解压后,把WordPress目录下的所有文件移动到网站根目录

最后的目录结构如上图

接下来访问域名 demo.com,首先会看到欢迎页面,点击现在就开始

填写数据库信息,数据库信息可以到面板中或者客户端查看

安装WordPress,配置网站基本信息

安装完成后登陆后台 http://demo.com/login.php 管理网站

注意:如果出现卡顿的情况,可能是WordPress在进行更新,可以稍等一会再进入后台

这样我们本地的WordPress就搭建完成了,你可以在上边测试和开发程序,当然需要测试多个的话,还可以随时新开站点,非常的方便。另外,如果你想要直接在服务器中安装Wordpress的话,可以查看我们的WordPress建站教程,教你零基础搭建WordPress