python3 阿里云api进行巡检发送邮件

python3 脚本爬取阿里云进行巡检

  • 不确定pip能不能安装上,使用时候可以百度一下,脚本是可以使用的,没有问题的

太长时间了,pip安装依赖忘记那些了,使用科大星火询问了下,给了下面的,看看能不能使用吧
根据您提供的代码,您需要安装以下Python库:

  1. HTMLTable(来自HTMLTable库)
  2. email.mime.multipart(来自email库)
  3. paramiko
  4. clickhouse-driver(来自clickhouse_driver库)
  5. smtplib
  6. string
  7. json
  8. requests
  9. time
  10. datetime
  11. prettytable(来自prettytable库)
  12. ntpath(来自ntpath库)
  13. email.header(来自email库)
  14. aliyunsdkcore(来自aliyunsdkcore库)
  15. email.mime.text(来自email库)
  16. aliyunsdkcore.request(来自aliyunsdkcore库)
  17. aliyunsdkecs.request.v20140526(来自aliyunsdkecs库)
  18. aliyunsdkcore.acs_exception.exceptions(来自aliyunsdkcore库)
  19. aliyunsdkcms.request.v20190101(来自aliyunsdkcms库)
  20. aliyunsdkr_kvstore.request.v20150101(来自aliyunsdkr_kvstore库)
  21. aliyunsdkdts.request.v20200101(来自aliyunsdkdts库)
  22. aliyunsdkr_kvstore.request.v20150101(来自aliyunsdkr_kvstore库)

不确定pip能不能安装上,使用时候可以百度一下,脚本是可以使用的,没有问题的

pip install HTMLTable
pip install email
pip install paramiko
pip install clickhouse-driver
pip install smtplib
pip install string
pip install json
pip install requests
pip install time
pip install datetime
pip install prettytable
pip install ntpath
pip install email.header
pip install aliyunsdkcore
pip install email.mime.text
pip install aliyunsdkcore.request
pip install aliyunsdkecs.request.v20140526
pip install aliyunsdkcore.acs_exception.exceptions
pip install aliyunsdkcms.request.v20190101
pip install aliyunsdkr_kvstore.request.v20150101
pip install aliyunsdkdts.request.v20200101
pip install aliyunsdkr_kvstore.request.v20150101
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from HTMLTable import (HTMLTable,)
from email.mime.multipart import MIMEMultipart

import paramiko
from clickhouse_driver import Client, connect
import smtplib
import string
import json
import requests
import time
import datetime
import prettytable as pt
from ntpath import join
from email.header import Header
from aliyunsdkcore import client
from email.mime.text import MIMEText
from aliyunsdkcore.request import CommonRequest
from aliyunsdkecs.request.v20140526 import DescribeInstancesRequest
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcms.request.v20190101.DescribeMetricTopRequest import DescribeMetricTopRequest
from aliyunsdkr_kvstore.request.v20150101.DescribeInstancesRequest import \
    DescribeInstancesRequest as DescribeInstancesRequest2
from aliyunsdkdts.request.v20200101.DescribeDtsJobsRequest import DescribeDtsJobsRequest
from aliyunsdkr_kvstore.request.v20150101.DescribeInstanceAttributeRequest import DescribeInstanceAttributeRequest

# 阿里云认证
clt = client.AcsClient('TT','BB', 'cn-chengdu')


# 脚本所需参数
# 设置页数
page_number = '1'
# 设置每页返回多少,默认为10条
strip_number = '100'
# ECS到期时间范围单位是‘天’
expire_days = '7'
# 云服务的数据命名空间(磁盘使用率那进行调用)
ecs_namespace = 'acs_ecs_dashboard'
# 云服务(ECS)的监控项名称
Disk_metricname = 'vm.DiskUtilization'  # 磁盘
Mem_metricname = 'vm.MemoryUtilization'  # 内存
CPU_metricname = 'cpu_total'  # CPU
# 磁盘使用率阀值(%)
Disk_use_rate = '70'
# 内存使用率阀值(%)
Mem_user_rate = '70'
# CPU使用率阀值(%)
Cpu_user_rate = '70'
str_time = "%s-%s-%s" % (datetime.datetime.now().year,
                         datetime.datetime.now().month, datetime.datetime.now().day)
time_mail = time.strftime('%Y%m%d%H%M%S ', time.localtime(time.time()))
# 发送邮件相关信息
sender = 'aaaaaaa@163.com'

# 收件人邮箱
receiver = 'bbbbb@163.com','ccccc@163.com'
# receiver = 'wangzq@icbf.com.cn','yangyang@icbf.com.cn'

subject = '%s运维巡检表' % (str_time)
# 邮箱账户命密码
username = 'aaaaaaa@163.com'
password = 'aaaaaaaa'

'''
阿里云采样范围太大就会提示(是因为每个月阿里云api是有固定免费额度的)
{"status":"error","errorType":"execution",
"error":"query processing would load too many samples into memory in query execution"}
'''

# 生成表格
def form(column_name, field_information, title):
    table = HTMLTable(caption='')
    table.append_header_rows(((column_name),))
    for field in field_information:
        table.append_data_rows(((field),))
    # 表格样式,即<table>标签样式
    table.set_style({
        'border-collapse': 'collapse',
        'word-break': 'keep-all',
        'white-space': 'nowrap',
        'font-size': '14px',
        'margin-left': '30px',
        'text-align': 'center',
    })
    # 统一设置所有单元格样式,<td>或<th>
    table.set_cell_style({
        'border-color': '#000',
        'border-width': '1px',
        'border-style': 'solid',
        'padding': '5px',
    })
    # 表头样式
    table.set_header_row_style({
        'color': '#fff',
        'background-color': '#48a6fb',
        'font-size': '18px',
    })

    # 覆盖表头单元格字体样式
    table.set_header_cell_style({
        'padding': '15px',
    })
    html = table.to_html()
    html = '<h3 style="color:red;margin-left: 30px" > %s </h3>' % (
        title) + html
    return html

# 把巡检信息进行html格式化
def html_formatting( Aliyun_html):
    html_text = """
<!DOCTYPE html>
<html lang="en">
<head>
    <title></title>
    <meta charset="utf-8">
</head>
<body>
    <div class="page" style="margin-left: 20px">
        <h1> {time_mail} 巡检结果如下 </h1>
        <h2 style="color:blue;margin-left: 15px"> 阿里云 </h2>
        {Aliyun_html}
        </div>
    </div>
</body>
</html>
""".format(
        time_mail=str_time,
        Aliyun_html=Aliyun_html,
    )
    msge = html_text
    return msge



# 列表---ECS列表
def get_sys_info():
    request = DescribeInstancesRequest.DescribeInstancesRequest()
    # request.set_PageNumber('page_number')   #设置页数
    request.set_PageSize(strip_number)  # 设置每页返回多少,默认为10条
    request.set_accept_format('json')
    response = json.loads(clt.do_action(request)).get(
        'Instances').get('Instance')
    return response

# ECS 5天内到期时间
def ecs_five_endtime():
    field_information = []
    count = 0
    for i in get_sys_info():
        # 阿里云UTC时间转换成北京时间
        ecs_endtime_0 = i['ExpiredTime']
        ecs_endtime_1 = "%Y-%m-%dT%H:%MZ"
        ecs_endtime_2 = datetime.datetime.strptime(
            ecs_endtime_0, ecs_endtime_1)
        ecs_endtime_3 = ecs_endtime_2 + \
            datetime.timedelta(hours=8) - datetime.timedelta(seconds=1)
        ecs_endtime_4 = ecs_endtime_3.strftime('%Y-%m-%d')
        # 计算到期时间与现在时间之差
        current_time = time.strftime("%Y-%m-%d", time.localtime())
        current = time.mktime(time.strptime(current_time, '%Y-%m-%d'))
        ecs_endtime_5 = time.mktime(time.strptime(ecs_endtime_4, '%Y-%m-%d'))
        count_days = int((ecs_endtime_5 - current) / (24 * 60 * 60))

        # 距离到期时间小于天数
        if count_days <= int(expire_days):
            count = count + 1
            ecs_remarks = i['InstanceId'], i['InstanceName']
            ecs_IP_0 = i['VpcAttributes']
            ecs_IP_1 = ecs_IP_0["PrivateIpAddress"]["IpAddress"][0]
            field = count, list(ecs_remarks)[0], ecs_IP_1, ecs_endtime_3.strftime(
                '%Y年%m月%d日 %H:%M'), list(ecs_remarks)[1]
        #    print(field)
            field_information.append(field)

    title = 'ECS到期时间(%s天内)' % (expire_days)
    column_name = ["序号", "实例ID", "IP地址", "到期时间", "备注"]
    html_table = form(column_name=column_name, title=title,
                      field_information=field_information)
    return html_table

# ECS磁盘使用率
def disk_info():
    request = DescribeMetricTopRequest()
    request.set_accept_format('json')
    request.set_Namespace(ecs_namespace)
    request.set_MetricName(Disk_metricname)
    request.set_Orderby("Average")
    request.set_Length(strip_number)
    response_0 = clt.do_action_with_exception(request)
    response_1 = str(response_0, encoding='utf-8')
    return response_1

# 列出超出磁盘阈值的ECS信息
def get_disk_Value():
    field_information = []
    count = 0
    Slicing_0 = eval(str(disk_info()))
    Slicing_1 = Slicing_0["Datapoints"]
    Slicing_2 = eval(Slicing_1)
    for Slicing_3 in Slicing_2:
        if Slicing_3.get("Average") >= float(Disk_use_rate):
            for ecs_id_0 in get_sys_info():
                if Slicing_3.get("instanceId") == ecs_id_0['InstanceId']:
                    count += 1
                    ecs_remarks = ecs_id_0['InstanceId'], ecs_id_0['InstanceName']
                    ecs_IP_0 = ecs_id_0['VpcAttributes']
                    ecs_IP_1 = ecs_IP_0["PrivateIpAddress"]["IpAddress"][0]
                    field = count, Slicing_3.get("instanceId"), ecs_IP_1, Slicing_3.get(
                        "mountpoint"), Slicing_3.get("Maximum"), list(ecs_remarks)[1]
                    field_information.append(field)

    title = 'ECS磁盘使用率大于%s' % (Disk_use_rate)
    column_name = ["序号", "实例ID", "IP地址", "目录", "使用率(%)", "备注"]
    html_table = form(column_name=column_name, title=title,
                      field_information=field_information)
    return html_table

# ECS-CPU使用率
def CPU_info():
    request = DescribeMetricTopRequest()
    request.set_accept_format('json')
    request.set_Namespace(ecs_namespace)
    request.set_MetricName(CPU_metricname)
    request.set_Orderby("Average")
    request.set_Length(strip_number)
    response_0 = clt.do_action_with_exception(request)
    response_1 = str(response_0, encoding='utf-8')
    return response_1

# 列出超出CPU阈值的ECS信息
def get_CPU_Value():
    count = 0
    field_information = []
    Slicing_0 = eval(str(CPU_info()))
    Slicing_1 = Slicing_0["Datapoints"]
    Slicing_2 = eval(Slicing_1)
    for Slicing_3 in Slicing_2:
        if Slicing_3.get("Average") >= float(Cpu_user_rate):
            for ecs_id_0 in get_sys_info():
                if Slicing_3.get("instanceId") == ecs_id_0['InstanceId']:
                    ecs_remarks = ecs_id_0['InstanceId'], ecs_id_0['InstanceName']
                    ecs_IP_0 = ecs_id_0['VpcAttributes']
                    ecs_IP_1 = ecs_IP_0["PrivateIpAddress"]["IpAddress"][0]
                    count += 1
            field = count, Slicing_3.get("instanceId"), ecs_IP_1, Slicing_3.get(
                "Maximum"), list(ecs_remarks)[1]
            field_information.append(field)

    title = 'ECS-CPU使用率大于%s' % (Cpu_user_rate)
    column_name = ["序号", "实例ID", "IP地址", "使用率(%)", "备注"]
    html_table = form(column_name=column_name, title=title,
                      field_information=field_information)
    return html_table

# ECS内存使用率
def Member_info():
    request = DescribeMetricTopRequest()
    request.set_accept_format('json')
    request.set_Namespace(ecs_namespace)
    request.set_MetricName(Mem_metricname)
    request.set_Orderby("Average")
    request.set_Length(strip_number)
    response_0 = clt.do_action_with_exception(request)
    response_1 = str(response_0, encoding='utf-8')
    return response_1

# 列出超出内存阈值的ECS信息
def get_Member_Value():
    count = 0
    field_information = []
    Slicing_0 = eval(str(Member_info()))
    Slicing_1 = Slicing_0["Datapoints"]
    Slicing_2 = eval(Slicing_1)
    for Slicing_3 in Slicing_2:
        if Slicing_3.get("Average") >= float(Mem_user_rate):
            for ecs_id_0 in get_sys_info():
                if Slicing_3.get("instanceId") == ecs_id_0['InstanceId']:
                    ecs_remarks = ecs_id_0['InstanceId'], ecs_id_0['InstanceName']
                    ecs_IP_0 = ecs_id_0['VpcAttributes']
                    ecs_IP_1 = ecs_IP_0["PrivateIpAddress"]["IpAddress"][0]
                    count += 1
            field = count, Slicing_3.get("instanceId"), ecs_IP_1, Slicing_3.get(
                "Maximum"), list(ecs_remarks)[1]
            field_information.append(field)

    title = 'ECS内存使用率大于%s' % (Mem_user_rate)
    column_name = ["序号", "实例ID", "IP地址", "使用率(%)", "备注"]
    html_table = form(column_name=column_name, title=title,
                      field_information=field_information)
    return html_table

# 列表---RDS实例列表
def get_rds_info():
    request = CommonRequest()
    request.set_accept_format('json')
    request.set_domain('rds.aliyuncs.com')
    request.set_method('POST')
    request.set_protocol_type('https')  # https | http
    request.set_version('2014-08-15')
    request.set_action_name('DescribeDBInstances')
    request.add_query_param('RegionId', "cn-beijing")
    request.add_query_param('PageSize', strip_number)  # 条数
    # request.add_query_param('PageNumber', page_number) ###页码
    response = clt.do_action(request)
    false = 0
    rds_list_0 = eval(str(response, encoding='utf-8'))
    rds_list_1 = rds_list_0["Items"]["DBInstance"]
    return rds_list_1

# 列出RDS到期时间
def rds_endtime():
    field_information = []
    count = 0
    for i in get_rds_info():
        # 阿里云UTC时间转换成北京时间
        rds_endtime_0 = i['ExpireTime']
        rds_endtime_1 = "%Y-%m-%dT%H:%M:%SZ"
        rds_endtime_2 = datetime.datetime.strptime(
            rds_endtime_0, rds_endtime_1)
        rds_endtime_3 = rds_endtime_2 + \
            datetime.timedelta(hours=8) - datetime.timedelta(seconds=1)
        rds_endtime_4 = rds_endtime_3.strftime('%Y-%m-%d')
        # 计算到期时间与现在时间之差
        current_time = time.strftime("%Y-%m-%d", time.localtime())
        current = time.mktime(time.strptime(current_time, '%Y-%m-%d'))
        rds_endtime_5 = time.mktime(time.strptime(rds_endtime_4, '%Y-%m-%d'))
        count_days = int((rds_endtime_5 - current) / (24 * 60 * 60))

        # 距离到期时间小于天数
        if count_days <= int(expire_days):
            count = count + 1
            field = count, i["DBInstanceId"], rds_endtime_3.strftime(
                '%Y年%m月%d日 %H:%M'), i["DBInstanceDescription"]
            field_information.append(field)

    title = 'RDS到期时间(%s天内)' % (expire_days)
    column_name = ["序号", "实例ID", "到期时间", "备注"]
    html_table = form(column_name=column_name, title=title,
                      field_information=field_information)
    return html_table

# 列出RDS磁盘使用率
def rds_disk_info():
    request = DescribeMetricTopRequest()
    request.set_accept_format('json')
    request.set_MetricName("DiskUsage")
    request.set_Namespace("acs_rds_dashboard")
    request.set_Orderby("Average")
    request.set_Length(strip_number)
    response_0 = clt.do_action_with_exception(request)
    response_1 = str(response_0, encoding='utf-8')
    return response_1

# 列出RDS超出阀值的资源
def rds_disk_threshold():
    count = 0
    field_information = []

    rds_threshold_0 = eval(rds_disk_info())
    rds_threshold_1 = eval(rds_threshold_0["Datapoints"])
    for rds_threshold_3 in rds_threshold_1:
        if rds_threshold_3["Average"] >= float(Disk_use_rate):
            for rds_id_0 in get_rds_info():
                if rds_id_0["DBInstanceId"] == 'rm-2ze3bzdt0ej4za0t6':
                    break
                if rds_threshold_3["instanceId"] == rds_id_0["DBInstanceId"]:
                    count += 1
                    field = count, rds_threshold_3["instanceId"], rds_id_0[
                        "DBInstanceDescription"], rds_threshold_3["Average"]
                    field_information.append(field)

    title = 'RDS-磁盘使用率大于70%'
    column_name = ["序号", "实例ID", "备注", "使用率(%)"]
    html_table = form(column_name=column_name, title=title,
                      field_information=field_information)
    return html_table

# 列出redis实例列表
def get_redis_info():
    request = DescribeInstancesRequest2()
    request.set_accept_format('json')
    request.set_PageNumber(page_number)  # 页码
    request.set_PageSize(strip_number)  # 条数
    response_0 = clt.do_action_with_exception(request)
    false = true = 0
    response_1 = eval(str(response_0, encoding='utf-8'))
    response_2 = response_1["Instances"]["KVStoreInstance"]
    return response_2

# Redis到期时间
def redis_endtime():
    field_information = []
    count = 0
  
    for i in get_redis_info():
        # 阿里云UTC时间转换成北京时间
        # if i.get('UserName') == 'r-2vcik2bo8gzn07yri9':
        redis_endtime_0 = i['EndTime']
        redis_endtime_1 = "%Y-%m-%dT%H:%M:%SZ"
        redis_endtime_2 = datetime.datetime.strptime(
            redis_endtime_0, redis_endtime_1)
        redis_endtime_3 = redis_endtime_2 + datetime.timedelta(hours=8)
        redis_endtime_4 = redis_endtime_3.strftime('%Y-%m-%d')
        # 计算到期时间与现在时间之差
        current_time = time.strftime("%Y-%m-%d", time.localtime())
        current = time.mktime(time.strptime(current_time, '%Y-%m-%d'))
        redis_endtime_5 = time.mktime(
            time.strptime(redis_endtime_4, '%Y-%m-%d'))
        count_days = int((redis_endtime_5 - current) / (24 * 60 * 60))

        # 距离到期时间小于天数
        if count_days <= int(expire_days):
            count = count + 1
            field = [count, i["InstanceId"], redis_endtime_3.strftime(
                '%Y年%m月%d日 %H:%M'), i["InstanceName"]]
            field_information.append(field)

    title = 'Redis到期时间(%s天内)' %(expire_days)
    column_name = ["序号", "实例ID", "到期时间", "备注"]
    html_table = form(column_name=column_name, title=title,
                      field_information=field_information)
    return html_table

# 邮件
def send_mail(email_html):
    msg = MIMEMultipart()
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] = Header('patrol-alarm@icbf.com.cn', 'utf-8')  # 发送者
    msg['To'] = Header('运维组', 'utf-8')
    msg.attach(MIMEText(email_html, 'html', 'utf-8'))
    smtp = smtplib.SMTP()
    smtp.connect('smtp.qiye.aliyun.com')
    smtp.login(username, password)
    for mailuser in receiver:
        smtp.sendmail(sender, mailuser, msg.as_string())
    print("邮件发送成功")
    smtp.quit()

# 执行
if __name__ == '__main__':
    # 到期时间 ETC_endtime() + redis_endtime() + rds_endtime() + ecs_five_endtime()
    # 磁盘阀值类: rds_disk_threshold() + get_disk_Value()
    # CPU&内存类:get_CPU_Value() + get_Member_Value()
    # print(redis_endtime())
    html = html_formatting(
        Aliyun_html=get_disk_Value() +
        rds_disk_threshold() +
        rds_endtime() +
        ecs_five_endtime() +
        get_CPU_Value() +
        get_Member_Value() +
        redis_endtime()
    )
    send_mail(email_html=html)

效果展示
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/118331.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

知识注入以对抗大型语言模型(LLM)的幻觉11.6

知识注入以对抗大型语言模型&#xff08;LLM&#xff09;的幻觉 摘要1 引言2 问题设置和实验2.1 幻觉2.2 生成响应质量 3 结果和讨论3.1 幻觉3.2 生成响应质量 4 结论和未来工作 摘要 大型语言模型&#xff08;LLM&#xff09;内容生成的一个缺点是产生幻觉&#xff0c;即在输…

WPF中的Binding的常见知识点与技巧

完全来源于十月的寒流&#xff0c;感谢大佬讲解 在XAML中&#xff0c;可以绑定到许多不同类型的数据源和属性。以下是一些可以绑定的常见数据源和属性&#xff1a; 属性&#xff1a;可以绑定到对象的属性&#xff0c;例如控件的Text、Visibility、IsEnabled等属性。 集合&am…

linux内的循环

格式 while 【 条件判断 】 do 语句体 done 上图 第一次代码&#xff0c;输入语句在外面&#xff0c;结果输入完&#xff08;非hello&#xff09;程序不断循环&#xff0c;没办法&#xff0c;ctrlc给程序终止了&#xff0c;然后把用户输入的语句放到了循环体里面…

vivo发布“蓝心千询”自然语言对话机器人

&#x1f989; AI新闻 &#x1f680; vivo发布“蓝心千询”自然语言对话机器人 摘要&#xff1a;vivo今日发布了“蓝心千询”自然语言对话机器人&#xff0c;基于蓝心大模型。蓝心千询可以进行知识信息的快速问答&#xff0c;文学创作、图片生成&#xff0c;甚至还能编写程序…

SAM 微调在医学上的尝试

1、2023下半年 1、 UNet与SAM结合的正确的道路SAMUS,一路SOTA没对手&#xff01; https://github.com/xianlin7/SAMUS 2、 本文提出 SonoSAM&#xff1a;一种用于分割超声图像上感兴趣对象的快速基础模型。 https://zhuanlan.zhihu.com/p/663988684 未开源 绿色是预测的&…

流媒体服务实现H5实时预览视频

目录 背景方案业务实践细节注意 待办 背景 客户aws服务磁盘存储告急&#xff0c;最高可扩容16T。排查如下&#xff1a;主要是视频文件存在大量复制使用的情况。例如发布节目时复制、预览时复制&#xff0c;这样上传一份视频后最大会有四份拷贝&#xff08;预览、普通发布、互动…

http中的Content-Type类型

浏览器的Content-Type 最近在做web端下载的时候需要给前端返回一个二进制的流&#xff0c;需要在请求头中设置一个 writer.Header().Set("Content-Type", "application/octet-stream")那么http中的Content-Type有具体有哪些呢&#xff1f;他们具体的使用场…

作用域,基本数据类型(常量const),转义字符,运算符

1.作用域 全局作用域&#xff1a;定义在所有花括号外的名字具有“全局作用域” 块作用域&#xff1a;在某个花括号内定义的名字具有“块作用域” 一般把具有全局作用域的变量叫做“全局变量”&#xff0c;具有块作用域的变量叫做“局部变量” 如果在嵌套作用域里出现重名&a…

Linux进程的优先级

Linux进程的优先级 &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解Linux中进程的优先级&#xff0…

视频集中存储/云存储EasyCVR启动后查询端口是否被占用出错,该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

LINQ to SQL系列三 使用DeferredLoadingEnabled,DataLoadOption指定加载选项

介绍linq to sql 的 DataContext类DeferredLoadingEnabled属性使用,以及DataLoadOptions限定加载相关表数据的LoadWith和AssociateWith方法。 本文中举例用到的数据模型如下: Student和Class之间是多对一关系,Student和Course之间是多对多关系。 DataContext的DeferredLo…

策略模式在数据接收和发送场景的应用

在本篇文章中&#xff0c;我们介绍了策略模式&#xff0c;并在数据接收和发送场景中使用了策略模式。 背景 在最近项目中&#xff0c;需要与外部系统进行数据交互&#xff0c;刚开始交互的系统较为单一&#xff0c;刚开始设计方案时打算使用了if else 进行判断&#xff1a; if(…

宝塔面板使用Supervisor进程守护插件,配置守护Mysql的操作教程。

本篇文章主要讲解&#xff0c;在宝塔面板中使用Supervisor进程守护插件&#xff0c;配置守护Mysql的操作教程。 作者&#xff1a;任聪聪 日期&#xff1a;2023年11月5日 一、安装守护进程插件 安装插件一、进程守护插件 安装说明&#xff1a;在软件商店中搜索“进程守护”&am…

elasticsearch下载和安装(linux)看这一篇就够了

配置java环境&#xff08;11版本以上&#xff09; 1.下载安装包 我是放在usr下的java里了 2.解压 tar -zxvf jdk-17_linux-x64_bin.tar.gz3.配置环境变量 vim /etc/profile在文件的最下面添加 JAVA_HOME/usr/java/jdk-17.0.9 #你自己的安装路径 JRE_HOME$JAVA_HOME/jre C…

项目实战:组件扫描实现(1)-扫描类路径所有文件

1、ComponentScan 组件扫描类 一下知识本人都是在Maven工程下总结的&#xff0c;所以目录结构会不一样这个类的作用是扫描所有的classes目录下的所有的字节码文件&#xff0c;找到相应的类&#xff0c;然后找到相应类上的注解 package com.csdn.mymvc.core; import java.io.Fi…

6.数据类型与运算符

目录 mysql数据类型 整型数据类型 浮点数类型和定点数类型 1、日期时间类型 1、YEAR 2、TIME 3、DATE类型 4、DATETIME 5、TIMESTAMP 2、字符串类型 1、CHAR 和 VARCHAR类型&#xff1a; 2、TEXT类型 3、ENUM类型 4、SET类型 二进制字符串类型 1、BIT类型 2、…

链表面试OJ题(1)

今天讲解两道链表OJ题目。 1.链表的中间节点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个…

iOS17.2正式版什么时候发布? 13大新功能细节抢先看

苹果已经发布了针对开发者的iOS 17.2 Beta测试版&#xff0c;而iOS 17.2正式版预计会在2023年12月发&#xff0c;新版本给iPhone带来不少新功能&#xff0c;下面小编就带大家抢先了解iOS 17.2即将带来的13个新功能亮点细节。 1.手记Journal App上线 全新「手记」 Journal App终…

访问控制、RBAC和ABAC模型

访问控制、RBAC和ABAC模型 访问控制 访问控制的目的是保护对象&#xff08;数据、服务、可执行应用该程序、网络设备或其他类型的信息技术&#xff09;不受未经授权的操作的影响。操作包括&#xff1a;发现、读取、创建、编辑、删除和执行等。 为实现访问控制&#xff0c; 计…

使用cpolar配合Plex搭建私人媒体站并实现远程访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…