thinkphp下调试错误比较底层的做法

在调试老项目,xxjn网时,总是找不出error在哪里使用,
最后发现

 //在Think.Class.php内容下,直接底层的调试代码
 static public function halt($error) {
        $e = array();
        if (APP_DEBUG || IS_CLI) {var_dump($error);exit;
            //调试模式下输出错误信息
            if (!is_array($error)) {//var_dump($error);exit;

只要能输出问题,后面遇到的问题都好解决!

vs2019下的aspnet webapi转到vscode下使用

1.添加.vscode配置

Run->add configuration
微信截图_20210607174409

2.添加插件

https://juejin.cn/post/6844903826063884296
推荐:
C#
gitlens
Project Manager

3.调整vscode配置

Tree: Indent
Side Bar: Location
Files: Exclude

4.添加工作区

https://blog.csdn.net/a592733740/article/details/104948607

5.调整vscode配置为自动猜测文件编码

配置中搜索:autoGuessEncoding

6.一些快捷键

7.调试代码

sqlsugar两种in查询方式

int [] allIds =new int[]{2,3,31};
db.Queryable<OrderItem>().Where(it => allIds.Contains(it.OrderId)).ToList()
 List<IConditionalModel> conModels = new List<IConditionalModel>();
conModels.Add(new ConditionalModel { FieldName = "TradeNo", ConditionalType = ConditionalType.In, FieldValue = payRecordList.Join(r => r.TradeNo, ',') });
            var refundRecordList = Db.Queryable<Payment_RecordDetail>()
                .Where(conModels).Sum(i => i.Amount);

枚举字符串转换为对应的枚举对象(枚举code 转 枚举对象)

支持写法:

object?.ToEnum<SettleAccountType?>()?.GetStringValue(); //GetStringValue为获取枚举描述值 
        /// <summary>
        /// 枚举扩展方法提取字符串值
        /// Will get the string value for a given enums value, this will
        /// only work if you assign the StringValue attribute to
        /// the items in your enum.
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string GetStringValue(this Enum value)
        {
            // Get the type
            Type type = value.GetType();

            // Get fieldinfo for this type
            FieldInfo fieldInfo = type.GetField(value.ToString());

            // Get the stringvalue attributes
            StringValueAttribute[] attribs = fieldInfo.GetCustomAttributes(
                typeof(StringValueAttribute), false) as StringValueAttribute[];

            // Return the first if there was a match.
            return attribs.Length > 0 ? attribs[0].StringValue : null;
        }

                /// <summary>
        /// 从枚举中获取Description
        /// 说明:
        /// 单元测试-->通过
        /// </summary>
        /// <param name="enumName">需要获取枚举描述的枚举</param>
        /// <returns>描述内容</returns>
        public static string GetDescription(this Enum enumName)
        {
            try
            {
                string _description = string.Empty;
                FieldInfo _fieldInfo = enumName.GetType().GetField(enumName.ToString());
                DescriptionAttribute[] _attributes = _fieldInfo.GetDescriptAttr();
                if (_attributes != null && _attributes.Length > 0)
                    _description = _attributes[0].Description;
                else
                    _description = null;//enumName.ToString();
                return _description;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
        /// <summary>
        /// 枚举字符串转换为对应的枚举对象(枚举code 转 枚举对象)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="code">枚举Code</param>
        /// <returns></returns>
        public static T ToEnum<T>(this string code)
        {
            Type type = typeof(T);
            var enumType = type.IsEnum ? type : Nullable.GetUnderlyingType(typeof(T));
            var isDefined = false;
            if (int.TryParse(code, out int n))
            {
                isDefined = System.Enum.IsDefined(enumType, n);
            }
            else
            {
                isDefined = System.Enum.IsDefined(enumType, code);
            }

            if (isDefined && System.Enum.TryParse(enumType, code, true, out object enumObj))
            {
                return (T)enumObj;
            };
            return default(T); //default(T)会根据T返回 ,如T为可空时可能返回null,T为具体enum时一定不会返回null
        }

mysql测试行锁

https://blog.csdn.net/qq_21891743/article/details/85096819?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-4&spm=1001.2101.3001.4242

start TRANSACTION
select *From test where id=11 for update;
-- commit 
start TRANSACTION
update test set id=111 where id =11;
-- commit 
show OPEN TABLES where In_use > 0;

docker安装elasticsearch

1.拉取官方镜像

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.12.1

也可以去docker官方pull

2.创建单点容器:使用低内存运行
创建映射data和yml配置文件

mkdir /data/docker-elasticsearch/config
mkdir /data/docker-elasticsearch/data
chmod -R g+rwx /data/docker-elasticsearch #elasticsearch using uid:gid 1000:0
chgrp -R 0 /data/docker-elasticsearch
$:touch /data/docker-elasticsearch/config/elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
xpack.security.enabled: true  #启动了安全插件,如果不想要密码就不需要这项配置

运行容器

docker run -d -p 9200:9200 -p 9300:9300 \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v /data/docker-elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /data/docker-elasticsearch/data:/usr/share/elasticsearch/data \ 
--name elasticsearch \
docker.elastic.co/elasticsearch/elasticsearch:7.12.1

ES_JAVA_OPTS:设置运行内存,目前默认是4G了。
single-node:单点运行(非集群)

3.配置密码安全
curl localhost:9200 //发现认证错误,因为我们启用了安全

$:docker exec -it elasticsearch bash
cd /usr/share/elasticsearch/bin
elasticsearch-setup-passwords interactive  #开始配置多项密码,用户名默认elastic

微信截图_20210428182116

curl curl -uelastic localhost:9200 #默认用户名elastic

3.添加超级管理员

cd /usr/share/elasticsearch/bin
elasticsearch-users useradd admin -r superuser

curl curl -uadmin localhost:9200 #使用超级管理员登录

4.安装中文分词工具-ik
5.安装kibana
*6.安装logstash


有条件就不要安装ElasticSearch-Head,直接上kibana

不需要全部merge,只合并指定的commit至分支中

cherry-pick功能
1.合并一个commit提交:

git cherry-pick commit-hash

2.合并多个commit提交

git cherry-pick commit-hash1 commit-hash2

3.合并连续的commit提交

//如果要合并的提交比较多,且是连续,操作符:"^..",指定分支:"-m 1"
git cherry-pick -m 1 commit-hash1^..commit-hash9

会把hash1至hash9之前的提交都合并,包括hash1

4.合并多条commit时如果有冲突,会暂停cherry-pick,并要求用户自己选择接下来的操作
注意这里的使用,会一条一条的commit执行合并,也就是会多次执行git add .
指定分支时也麻烦,需要理清数字1,2,3代表哪个分支

--continue

用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 Cherry pick 过程继续执行。

--abort

发生代码冲突后,放弃合并,回到操作前的样子。

--quit

发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。

参考:http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html