住建部网站查询系统网站服务器用来做啥

diannao/2026/1/25 2:20:33/文章来源:
住建部网站查询系统,网站服务器用来做啥,建设摩托车官网整车验证系统,wordpress登陆图标修改1故事背景 忘记密码这件事#xff0c;相信绝大多数人都遇到过#xff0c;输一次错一次#xff0c;错到几次以上#xff0c;就不允许你继续尝试了。 但当你尝试重置密码#xff0c;又发现新密码不能和原密码重复#xff1a; 图片 相信此刻心情只能用一张图形容#xf…1故事背景 忘记密码这件事相信绝大多数人都遇到过输一次错一次错到几次以上就不允许你继续尝试了。 但当你尝试重置密码又发现新密码不能和原密码重复 图片 相信此刻心情只能用一张图形容 图片 虽然但是密码还是很重要的顺便我有了一个问题三次输错密码后系统是怎么做到不让我继续尝试的 2我想了想有如下几个问题需要搞定 是只有输错密码才锁定还是账户名和密码任何一个输错就锁定 输错之后也不是完全冻结为啥隔了几分钟又可以重新输了 技术栈到底麻不麻烦 去网上搜了搜也问了下ChatGPT找到一套解决方案SpringBootRedisLua脚本。 这套方案也不算新很早就有人在用了不过难得是自己想到的问题和解法就记录一下吧。 顺便回答一下上面的三个问题 锁定的是IP不是输入的账户名或者密码也就是说任一一个输错3次就会被锁定 Redis的Lua脚本中实现了key过期策略当key消失时锁定自然也就消失了 技术栈同SpringBootRedisLua脚本 3那么自己动手实现一下 前端部分 首先写一个账密输入页面使用很简单HTML加表单提交 !DOCTYPE html html headtitle登录页面/titlestylebody {background-color: #F5F5F5;}form {width: 300px;margin: 0 auto;margin-top: 100px;padding: 20px;background-color: white;border-radius: 5px;box-shadow: 0 0 10px rgba(0,0,0,0.2);}label {display: block;margin-bottom: 10px;}input[typetext], input[typepassword] {border: none;padding: 10px;margin-bottom: 20px;border-radius: 5px;box-shadow: 0 0 5px rgba(0,0,0,0.1);width: 100%;box-sizing: border-box;font-size: 16px;}input[typesubmit] {background-color: #30B0F0;color: white;border: none;padding: 10px;border-radius: 5px;box-shadow: 0 0 5px rgba(0,0,0,0.1);width: 100%;font-size: 16px;cursor: pointer;}input[typesubmit]:hover {background-color: #1C90D6;}/style /head bodyform actionhttp://localhost:8080/login methodgetlabel forusername用户名/labelinput typetext idusername nameusername placeholder请输入用户名 requiredlabel forpassword密码/labelinput typepassword idpassword namepassword placeholder请输入密码 requiredinput typesubmit value登录/form /body /html效果如下: 图片 后端部分 技术选型分析 首先我们画一个流程图来分析一下这个登录限制流程 图片 从流程图上看首先访问次数的统计与判断不是在登录逻辑执行后而是执行前就加1了 其次登录逻辑的成功与失败并不会影响到次数的统计 最后还有一点流程图上没有体现出来这个次数的统计是有过期时间的当过期之后又可以重新登录了。 那为什么是RedisLua脚本呢 Redis的选择不难看出这个流程比较重要的是存在一个用来计数的变量这个变量既要满足分布式读写需求还要满足全局递增或递减的需求那Redis的incr方法是最优选了。 那为什么需要Lua脚本呢流程上在验证用户操作前有些操作如图 图片 这里至少有3步Redis的操作get、incr、expire如果全放到应用里面来操作有点慢且浪费资源。 Lua脚本的优点如下 减少网络开销。 可以将多个请求通过脚本的形式一次发送减少网络时延。 原子操作。 Redis会将整个脚本作为一个整体执行中间不会被其他请求插入。因此在脚本运行过程中无需担心会出现竞态条件无需使用事务。 复用。 客户端发送的脚本会永久存在redis中这样其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。 最后为了增加功能的复用性我打算使用Java注解的方式实现这个功能。 代码实现 项目结构如下 图片 配置文件 pom.xml ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.11/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.example/groupIdartifactIdLoginLimit/artifactIdversion0.0.1-SNAPSHOT/versionnameLoginLimit/namedescriptionDemo project for Spring Boot/descriptionpropertiesjava.version1.8/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency!-- redis --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!-- Jedis --dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactId/dependency!--切面依赖 --dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactId/dependency!-- commons-lang3 --dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactId/dependency!-- guava --dependencygroupIdcom.google.guava/groupIdartifactIdguava/artifactIdversion23.0/version/dependency!-- lombok --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/projectapplication.properties ## Redis配置 spring.redis.host127.0.0.1 spring.redis.port6379 spring.redis.password spring.redis.timeout1000 ## Jedis配置 spring.redis.jedis.pool.min-idle0 spring.redis.jedis.pool.max-idle500 spring.redis.jedis.pool.max-active2000 spring.redis.jedis.pool.max-wait10000注解部分 LimitCount.java package com.example.loginlimit.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** 次数限制注解* 作用在接口方法上*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface LimitCount {/*** 资源名称用于描述接口功能*/String name() default ;/*** 资源 key*/String key() default ;/*** key prefix** return*/String prefix() default ;/*** 时间的单位秒* 默认60s过期*/int period() default 60;/*** 限制访问次数* 默认3次*/int count() default 3; }核心处理逻辑类LimitCountAspect.java package com.example.loginlimit.aspect;import java.io.Serializable; import java.lang.reflect.Method; import java.util.Objects;import javax.servlet.http.HttpServletRequest;import com.example.loginlimit.annotation.LimitCount; import com.example.loginlimit.util.IPUtil; import com.google.common.collect.ImmutableList; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.data.redis.core.script.RedisScript; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes;Slf4j Aspect Component public class LimitCountAspect {private final RedisTemplateString, Serializable limitRedisTemplate;Autowiredpublic LimitCountAspect(RedisTemplateString, Serializable limitRedisTemplate) {this.limitRedisTemplate  limitRedisTemplate;}Pointcut(annotation(com.example.loginlimit.annotation.LimitCount))public void pointcut() {// do nothing}Around(pointcut())public Object around(ProceedingJoinPoint point) throws Throwable {HttpServletRequest request  ((ServletRequestAttributes)Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();MethodSignature signature  (MethodSignature)point.getSignature();Method method  signature.getMethod();LimitCount annotation  method.getAnnotation(LimitCount.class);//注解名称String name  annotation.name();//注解keyString key  annotation.key();//访问IPString ip  IPUtil.getIpAddr(request);//过期时间int limitPeriod  annotation.period();//过期次数int limitCount  annotation.count();ImmutableListString keys  ImmutableList.of(StringUtils.join(annotation.prefix()  _, key, ip));String luaScript  buildLuaScript();RedisScriptNumber redisScript  new DefaultRedisScript(luaScript, Number.class);Number count  limitRedisTemplate.execute(redisScript, keys, limitCount, limitPeriod);log.info(IP:{} 第 {} 次访问key为 {}描述为 [{}] 的接口, ip, count, keys, name);if (count ! null  count.intValue()  limitCount) {return point.proceed();} else {return 接口访问超出频率限制;}}/*** 限流脚本* 调用的时候不超过阈值则直接返回并执行计算器自加。** return lua脚本*/private String buildLuaScript() {return local c \nc  redis.call(get,KEYS[1]) \nif c and tonumber(c)  tonumber(ARGV[1]) then \nreturn c; \nend \nc  redis.call(incr,KEYS[1]) \nif tonumber(c)  1 then \nredis.call(expire,KEYS[1],ARGV[2]) \nend \nreturn c;;}}获取IP地址的功能我写了一个工具类IPUtil.java代码如下: package com.example.loginlimit.util;import javax.servlet.http.HttpServletRequest;public class IPUtil {private static final String UNKNOWN  unknown;protected IPUtil() {}/*** 获取 IP地址* 使用 Nginx等反向代理软件 则不能通过 request.getRemoteAddr()获取 IP地址* 如果使用了多级反向代理的话X-Forwarded-For的值并不止一个而是一串IP地址* X-Forwarded-For中第一个非 unknown的有效IP字符串则为真实IP地址*/public static String getIpAddr(HttpServletRequest request) {String ip  request.getHeader(x-forwarded-for);if (ip  null || ip.length()  0 || UNKNOWN.equalsIgnoreCase(ip)) {ip  request.getHeader(Proxy-Client-IP);}if (ip  null || ip.length()  0 || UNKNOWN.equalsIgnoreCase(ip)) {ip  request.getHeader(WL-Proxy-Client-IP);}if (ip  null || ip.length()  0 || UNKNOWN.equalsIgnoreCase(ip)) {ip  request.getRemoteAddr();}return 0:0:0:0:0:0:0:1.equals(ip) ? 127.0.0.1 : ip;}}另外就是Lua限流脚本的说明脚本代码如下 private String buildLuaScript() {return local c \nc  redis.call(get,KEYS[1]) \nif c and tonumber(c)  tonumber(ARGV[1]) then \nreturn c; \nend \nc  redis.call(incr,KEYS[1]) \nif tonumber(c)  1 then \nredis.call(expire,KEYS[1],ARGV[2]) \nend \nreturn c;;}这段脚本有一个判断 tonumber(c) tonumber(ARGV[1])这行表示如果当前key 的值大于了limitCount直接返回否则调用incr方法进行累加1且调用expire方法设置过期时间。 最后就是RedisConfig.java代码如下 package com.example.loginlimit.config;import java.io.IOException; import java.io.Serializable; import java.time.Duration; import java.util.Arrays;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisPassword; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.jedis.JedisClientConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import org.springframework.data.redis.serializer.StringRedisSerializer; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig;Configuration public class RedisConfig extends CachingConfigurerSupport {Value(${spring.redis.host})private String host;Value(${spring.redis.port})private int port;Value(${spring.redis.password})private String password;Value(${spring.redis.timeout})private int timeout;Value(${spring.redis.jedis.pool.max-idle})private int maxIdle;Value(${spring.redis.jedis.pool.max-wait})private long maxWaitMillis;Value(${spring.redis.database:0})private int database;Beanpublic JedisPool redisPoolFactory() {JedisPoolConfig jedisPoolConfig  new JedisPoolConfig();jedisPoolConfig.setMaxIdle(maxIdle);jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);if (StringUtils.isNotBlank(password)) {return new JedisPool(jedisPoolConfig, host, port, timeout, password, database);} else {return new JedisPool(jedisPoolConfig, host, port, timeout, null, database);}}BeanJedisConnectionFactory jedisConnectionFactory() {RedisStandaloneConfiguration redisStandaloneConfiguration  new RedisStandaloneConfiguration();redisStandaloneConfiguration.setHostName(host);redisStandaloneConfiguration.setPort(port);redisStandaloneConfiguration.setPassword(RedisPassword.of(password));redisStandaloneConfiguration.setDatabase(database);JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfiguration  JedisClientConfiguration.builder();jedisClientConfiguration.connectTimeout(Duration.ofMillis(timeout));jedisClientConfiguration.usePooling();return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration.build());}Bean(name  redisTemplate)SuppressWarnings({rawtypes})ConditionalOnMissingBean(name  redisTemplate)public RedisTemplateObject, Object redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplateObject, Object template  new RedisTemplate();//使用 fastjson 序列化JacksonRedisSerializer jacksonRedisSerializer  new JacksonRedisSerializer(Object.class);// value 值的序列化采用 fastJsonRedisSerializertemplate.setValueSerializer(jacksonRedisSerializer);template.setHashValueSerializer(jacksonRedisSerializer);// key 的序列化采用 StringRedisSerializertemplate.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());template.setConnectionFactory(redisConnectionFactory);return template;}//缓存管理器Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {RedisCacheManager.RedisCacheManagerBuilder builder  RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory);return builder.build();}BeanConditionalOnMissingBean(StringRedisTemplate.class)public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {StringRedisTemplate template  new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}Beanpublic KeyGenerator wiselyKeyGenerator() {return (target, method, params) - {StringBuilder sb  new StringBuilder();sb.append(target.getClass().getName());sb.append(method.getName());Arrays.stream(params).map(Object::toString).forEach(sb::append);return sb.toString();};}Beanpublic RedisTemplateString, Serializable limitRedisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplateString, Serializable template  new RedisTemplate();template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());template.setConnectionFactory(redisConnectionFactory);return template;} }class JacksonRedisSerializerT implements RedisSerializerT {private ClassT clazz;private ObjectMapper mapper;JacksonRedisSerializer(ClassT clazz) {super();this.clazz  clazz;this.mapper  new ObjectMapper();mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);}Overridepublic byte[] serialize(T t) throws SerializationException {try {return mapper.writeValueAsBytes(t);} catch (JsonProcessingException e) {e.printStackTrace();return null;}}Overridepublic T deserialize(byte[] bytes) throws SerializationException {if (bytes.length  0) {return null;}try {return mapper.readValue(bytes, clazz);} catch (IOException e) {e.printStackTrace();return null;}} }LoginController.java package com.example.loginlimit.controller;import javax.servlet.http.HttpServletRequest;import com.example.loginlimit.annotation.LimitCount; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;Slf4j RestController public class LoginController {GetMapping(/login)LimitCount(key  login, name  登录接口, prefix  limit)public String login(RequestParam(required  true) String username,RequestParam(required  true) String password, HttpServletRequest request) throws Exception {if (StringUtils.equals(张三, username)  StringUtils.equals(123456, password)) {return 登录成功;}return 账户名或密码错误;}}LoginLimitApplication.java package com.example.loginlimit;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication public class LoginLimitApplication {public static void main(String[] args) {SpringApplication.run(LoginLimitApplication.class, args);}}4演示一下效果 图片 上面这套限流的逻辑感觉用在小型或中型的项目上应该问题不大不过目前的登录很少有直接锁定账号不能输入的一般都是弹出一个验证码框让你输入验证码再提交。我觉得用我这套逻辑改改应该不成问题核心还是接口尝试次数的限制嘛

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

沈阳专业网站建设企业站长工具seo综合查询怎么用

姓名 李宁 日期 2015年7月13日 主要工作及心得 由于我负责服务器端的编写工作,而各部分的客户端的操作都要与服务器端通信,所以在今天的调试中,我贯穿于各部分模块的调试和检测,主要负责在出现问题…

博学云网站建设怎么把自己做的网站发布到网上

转载自 关于java.util.Properties读取中文乱码的正确解决方案(不要再用native2ascii.exe了) 碰到了用java.util.Properties读取中文内容(UTF-8格式)的配置文件,发生中文乱码的现象, Properties propnew Pro…

做水果网站特点分析wordpress插件xiazai

1. Serial GC Serial GC 是用于单线程环境的垃圾回收器,它使用复制算法(Copy)进行年轻代的垃圾回收,而老年代则使用标记-整理(Mark-Compact)算法。由于它在进行垃圾回收时会暂停其他所有的工作线程&#xf…

深圳网站建设小江宁夏交通建设有限公司网站

文章目录 文章开篇Json简介Json数据类型Json硬性规则Json数据转化网站Json和Dict类型转换json模块的使用Python数据和Json数据的类型映射json.dumps1.字典数据中含有**存在中文**2.json数据通过缩进符**美观输出**3.对Python数据类型中键进行**排序输出**4.json数据**分隔符的控…

网站建设与网页设计百度文库微信小程序登录流程

一、类与类加载器 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。对于 任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独…

在线做GO分析的网站永久免费asp空间

uniapp是一款跨平台的应用开发框架,基于Vue.js和小程序原生能力进行封装,旨在帮助开发者快速构建跨平台的应用程序。在uniapp中,可以使用Vue.js语法进行页面开发,同时通过使用小程序原生能力,可以实现调用设备的摄像头…

福永营销型网站多少钱做网站做58好还是赶集好

《从零开始的Java世界》系列主要讲解Javase部分,从最简单的程序设计到面向对象编程,再到异常处理、常用API的使用,最后到注解、反射,涵盖Java基础所需的所有知识点。学习者应该从学会如何使用,到知道其实现原理全方位式…

广州做鞋的网站wordpress评论回复邮件通知

Android中可以直接使用webView来加载HTML5通过video标签来播放视频。以下为基本步骤:一、需要在AndroidManifest.xml文件中声明需要使用HardwareAccelerate, 可以细化到Activity级别,如果不需要的View可以声明不要用加速,但是需要在代码中做具…

网站建设从入门pdf做网站如何团队分工

win10安装docker后发现c盘空间急速减少,360管家查看发现images镜像安装在C盘,于是重装docker desktop以为在安装过程中能够选择,遗憾的是没有提供选择权限,默认直接就安装到了c盘。 desktop 迁移 百度得知可以将c盘的docker安装…

南昌做微网站深圳市网是科技有限公司

给文件加水印是常见的一种宣示版权的方式。像Office、WPS都自带加水印功能,能够给文档加上"保密"、"严禁复制"这样的水印。在多可系统中,也有这么一个添加水印的功能。启用该功能后,在使用HTML5预览时,多可系…

深圳华鑫峰网站建设专业推广企业网站公司

转载于:https://www.cnblogs.com/ceshi2016/p/6025027.html

电影网页制作素材郑州网站优化工资

项目->属性->C/C->代码生成->结构成员对齐 转载于:https://www.cnblogs.com/smartstone/archive/2005/12/14/296909.html

如何编写一份网站开发需求文档推广策略英语

128. 最长连续序列 【困难】 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。 Code // 解题思路 // 将所有nums中元素录入n…

昌吉建设局网站短视频素材哪里找

1.进程间的通信: 1.管道 2.信号 3.消息队列 4.共享内存 5.信号灯 6.套接字 1.管道: 1.无名管道 无名管道只能用于具有亲缘关系的进程间通信 pipe int pipe(int pipefd[2]); 功能: 创建一个无名管道 参数: …

查询网站是否备案网页设计与网站建设心得体会

代码工程。 http://dt4.8tupian.net/2/28880a66b12880.pg3这段代码是用于一个数字拔河游戏的嵌入式系统,采用了基于8051架构的单片机,使用Keil C51编译器。 主要功能包括: 数码管显示:使用了四个数码管(通过P2的控制…

增光路网站建设汕头做网站设计

翔云身份证实名认证接口将与网络平台携手共筑信息安全防线,守护每一笔交易的真实可信,助力您的企业在数字化浪潮中稳健前行! 以下是javascript语言调用翔云身份证实名认证API的代码: var form new FormData(); form.append("…

百度移动网站提交上海传媒公司简介

目录 安装 Linux的目录结构: Linux命令入门: Linux命令的基础格式: 例子: ls 参数 选项 注意: 目录切换命令:cd/pwd cd: pwd: 相对路径和绝对路径: mkdir 不用参数: …

网站秒收录怎么做的网站版块策划

Flask框架开发学习笔记《6》前后端不分离基础框架 Flask是使用python的后端,由于小程序需要后端开发,遂学习一下后端开发。 主要包含如下文件: static 目录中存储了图片templates 目录中存储了 html 文件utils.py 包含了 log 函数server.p…

捷讯官网 网站建设白家乐网站怎么建站

CPU中的主要部件是寄存器。寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制。寄存器包括:AX、BX、CX、DX、SI、DI、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。 2.1 通用寄存器 8086CPU的所有寄存器都是16位的&#x…