首页 文章 精选 留言 我的

精选列表

搜索[天玑9500],共10000篇文章
优秀的个人博客,低调大师

第214天:Angular 基础概念

一、Angular 简介 1、什么是 AngularJS - 一款非常优秀的前端高级 JS 框架 - 最早由 Misko Hevery 等人创建 - 2009 年被 Google 公式收购,用于其多款产品 - 目前有一个全职的开发团队继续开发和维护这个库 - 有了这一类框架就可以轻松构建 SPA 应用程序 - 轻松构建 SPA(单一页面应用程序) - 单一页面应用程序: + 只有一个页面(整个应用的一个载体) + 内容全部是由AJAX方式呈现出啦的 - 其核心就是通过指令扩展了 HTML,通过表达式绑定数据到 HTML。 2、为什么使用 AngularJS - 更少的代码,实现更强劲的功能 - 将一些以前在后台开发中使用的思想带入前端开发 - 带领当前市面上的框架走向模式化或者架构化 3、AngularJS 的核心特性 - MVC - 模块化 - 自动化双向数据绑定 - 指令系统 4、相关链接 - http://www.apjs.net/ - http://www.angularjs.cn/ - http://docs.angularjs.cn/api - https://material.angularjs.org - http://angular-ui.github.io/ 5、Angular 上手 - 安装 Angular (1)下载 Angular.js 的包 + https://github.com/angular/angular.js/releases (2)使用 CDN 上的 Angular.js + http://apps.bdimg.com/libs/angular.js/1.4.9/angular.min.js (3)使用 Bower 安装 ```bash bower install angular ``` (4)使用 NPM 安装 ```bash npm install angular ``` - 每种方式安装包,本质都是将angular的库下载到当前文件夹中 6、angular的优势 Angular 最大程度的减少了页面上的 DOM 操作; 让 JavaScript 中专注业务逻辑的代码; 通过简单的指令结合页面结构与逻辑数据; 通过自定义指令实现组件化编程; 代码结构更合理; 维护成本更低; Angular 解放了传统 JavaScript 中频繁的 DOM 操作 7、angular中最重要的概念是指令(directive) - ng-model 是双向数据绑定的指令,效果就是将当前元素的value属性和模型中的user.name建立绑定关系 8、运行官方文档 由于众所周知的原因,Angular 官网打不开 我们需要本地运行 Angular 文档 下载最新的 Angular 包 解压后有一个 docs 文件夹 必须通过 http 服务器访问该文件夹 可以通过 SublimeServer 或者 http-server 运行 9、推荐工具 - 在线编辑器 + https://jsfiddle.net/ 二、Angular 基础概念 1、MVC 思想 - 将应用程序的组成划分为三个部分:Model View Controller 模型:处理数据和业务逻辑 视图:以友好的方式向用户展示数据 控制器:组织调度相应的处理模型 - 控制器的作用就是初始化模型用的; - 模型就是用于存储数据的 - 视图用于展现数据 - 登陆案例分析MVC思想 - 模型 + 我们数据库中所有用户的信息 + 接受控制器传来的用户名和密码进行校验的业务逻辑并返回true/false - 控制器 + 接受用户在界面上填写的用户名和密码 + 将用户名和密码交给模型 - 视图 + 给用户呈现一个表单 + 接受用户输入内容,并将其提交给控制器 + 根据控制器返回的数据,响应用户页面 2、模块(Module) AngularJS很重要的一个特性就是实现模块化编程,我们可以通过以下方式创建一个模块,对页面进行功能业务上的划分 1 // 创建一个名字叫MyApp的模块,第二个参数指的是该模块依赖那些模块 2 3 var myApp = angular.module("MyApp", []); 也可以将重复使用的指令或过滤器之类的做成模块便于复用 注意必须指定第二个参数,否则变成找到已经定义的模块 3、控制器(Controller) 调度逻辑的集合 1 angular.module('OneApp', []) 2 3 .controller('HelloController', [ 4 5 '$scope', 6 7 function($scope) { 8 9 $scope.p = { 10 11 name: 'zhangsan' 12 13 }; 14 15 } 16 17 ]); 控制器的三种主要职责: 为应用中的模型设置初始状态 通过$scope对象把数据模型或函数行为暴露给视图 监视模型的变化,做出相应的动作 // 监视购物车内容变化,计算最新结果 $scope.$watch(‘totalCart’, calculateDiscount); $scope(上下文模型) 视图和控制器之间的桥梁 用于在视图和控制器之间传递数据 利用$scope暴露数据模型(数据,行为) 4、表达式(Expression) 作用: 使用表达式把数据绑定到 HTML。 语法: 表达式写在双大括号内:{{ expression }}。 比较: 表达式作用类似于ng-bind指令 建议更多的使用指令 AngularJS表达式很像JavaScript表达式 它们可以包含文字、运算符和变量 如 {{ 5 + 5 }} 或 {{ firstName + ‘-’ + lastName }} 对比 JavaScript 表达式 相同点: AngularJS 表达式可以包含字母,操作符,变量。 不同点: AngularJS 表达式可以写在 HTML 中。 AngularJS 表达式不支持条件判断,循环及异常。 AngularJS 表达式支持过滤器。 5、数据绑定 单向数据绑定 模型变化过后,自动同步到界面上; 一般纯展示型的数据会用到单项数据绑定; 使用表达式的方式都是单向的 双向数据绑定 两个方向的数据自动同步: 模型发生变化自动同步到视图上; 视图上的数据发生变化过后自动同步到模型上;

优秀的个人博客,低调大师

jquery学习(第三天)

高度和宽度 $(“div”).height();$(“div”).width(); .height()方法和.css(“height”)的区别:返回值不同, .height()方法返回的是 数字类型(20), .css(“height”)返回的是字符串类型(20px), 因此.height()方法常用在参与数学计算的时候 坐标值 $(“div”).offset(); // 获取或设置坐标值 **设置值后变成相对定位**$(“div”).position(); // 获取坐标值 子绝父相 **只能读取不能设置** 固定导航栏(监听scroll) <script type="text/javascript"> $(function () { // 获取顶部 top 的高度值 var topHeight = $(".top").height(); // 监听浏览器的滚动事件 $(window).scroll(function () { var docScrollTop = $(document).scrollTop(); //console.log(docScrollTop); // 判断一下 docScrollTOp 和 topHeight两个大小 // 文档被卷去的高度 大于或等于 top高度的时候 // 让导航栏变成固定定位 if(docScrollTop >= topHeight) { $(".nav").css({ "position": "fixed", "top": 0 }); $(".main").css("margin-top" ,$(".nav").height()); } else { // 让固定导航栏变为默认状态 position: static $(".nav").css({ "position": "static" }); $(".main").css("margin-top" ,0); } }); }); </script> 两侧跟随广告 <script type="text/javascript"> $(function () { $(window).scroll(function () { var docScrollTop = $(document).scrollTop(); //$(".main").css("top", docScrollTop + 80); $(".main").animate({"top" : docScrollTop + 80},30); }); }); </script> 绑定事件 bind 可以绑定一个及以上 中间用空格隔开 可以传两个参数也可以传三个参数 三个参数时中间的值就是函数获取的值$("button").bind("click mouserenter",function(){ alert(111); }); one 单次绑定事件 delegate(委托)绑定方式,可以提高性能 on 事件(就使用它) $("div").on("click","p",function(){ alert(111); }); 第一个参数:触发什么事件 第二个参数:为哪个元素触发事件 第三个参数:处理函数 事件解绑(一一对应) unbind undelegate off 触发事件(提交时校验信息合法性) image.png <script> $(function () { $("form").on("click","#btnSub",function () { var textVal = $("#txtName").val(); if (textVal === "1") { alert("登录成功"); }else { //重新获取焦点 $("#txtName").val("").trigger("focus"); } }); }); </script> click : $(“div”).click(); trigger:触发事件,并且触发浏览器默认行为 triggerHandler:不触发浏览器默认行为 jquery事件对象(重点event=e) event.stopPropagation() //阻止事件冒泡 event.preventDefault(); //阻止默认行为 会做jQuery插件 全局jQuery函数扩展方法 $.log = function() { } //$("li") jQuery扩展方法 $.fn.log = function() { } 引入第三方插件 背景色插件方法 lazyload 插件 jQuery UI 插件 用法很简单: 第一步:引入必要的包 第二步: 实现 安装包管理工具 bower install jquery.lazyloadnmp install jquery-lazyload注意使用nmp的时候需要安装nodejs在pc上 sublime 装插件 sublime 3 第一步: 装上sublime的包管理器package control ctrl+ ~ 上网把 按照package control的那段代码,粘贴一下,然后回车。 第二步:使用Ctrl + shift + p

优秀的个人博客,低调大师

nginx日志按照天进行分割

由于nginx的日志本身只是支持按照server_name或者大小进行划分,对于习惯了apache的按照一个网站每天一个日志的我来说是不可以接受的,于是从网上找了几个nginx按天分割的方法发现都是互相抄袭的,特别是里面有一个命令是kill -9 `cat nginx.pid`,需要杀掉nginx子进程,我觉得不靠谱。 我忽然想到我以前在做openstack的云存储开发时,对rsyslog的日志进行分割的方法,一用果然好用 原理是: 1.从一台已经安装好apache的机器上的apache bin目录下把rotatelogs拷贝到本机的/opt/nginx_logs下 mkdir-p/opt/nginx_logs cprotatelogs/opt/nginx_logs/ chmod+x/opt/nginx_logs/rotatelogs 2.创建有名管道 mkdir/opt/nginx_logs/abc_www/ mkfifo/opt/nginx_logs/abc_www/access_log 3.在nginx配置文件server中加上 access_log/opt/nginx_logs/abc_www/access_log; 4.创建日志目录 mkdir/opt/nginx_logs/abc_www/log/ 5.创建日志分割脚本,防止rotatelogs被kille掉 [root@localhostnginx_logs]#cat/opt/nginx_logs/abc_www/rotate.sh baselogdir=/opt/nginx_logs/abc_www rotatelogs=/opt/nginx_logs/rotatelogs while[1] do echo`date+"%F%T"`"rotatelogsaccessstart" $rotatelogs$baselogdir/log/access_%Y%m%d.log86400480<$baselogdir/access_log echo`date+"%F%T"`"rotatelogsaccessstop" sleep1; done 6.创建启动日志分割脚本 [root@localhostnginx_logs]#cat/opt/nginx_logs/abc_www/run.sh sh/opt/nginx_logs/abc_www/rotate.sh>>/opt/nginx_logs/abc_www/log/access-rotate.log2>&1& 7.最终效果 end 本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/1032567,如需转载请自行联系原作者

优秀的个人博客,低调大师

Solon for JDK 21,虚拟线程逆天!!!

本次更新的一个重点:完成 JDK21 编译测试和功能单元测试。 JDK 21 虚拟线程? 在IO密集型项目中,效果很猛!有一种:天哪天哪天哪。。。的感觉 @SolonMain public class App { public static void main(String[] args) { Solon.start(App.class, args, app->{ app.onEvent(HttpServerConfigure.class, e->{ e.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); }); }); } } Solon 是什么框架? Java 生态级应用开发框架。从零开始构建,有自己的标准规范与开放生态(历时五年,具备全球第二级别的生态规模)。与其他框架相比,解决了两个重要的痛点:启动慢,费内存。 解决痛点? 由于SolonBean容器的独特设计,不会因为扩展依赖变多而启动很慢(开发调试时,省时、爽快)!以知名开源项目“小诺”为例: “snowy-spring 版”启动 15-50秒 “snowy-solon 版”启动3-5秒,启动内存节省1/3(有兴趣的,欢迎拉取代码体验) 有什么可爱的特点? 启动快 5 ~ 10 倍。(更快) qps 高 2~ 3 倍。(更高) 运行时内存节省 1/3 ~ 1/2。(更少) 打包可以缩小到 1/2 ~ 1/10;比如,300Mb 的变成了 23Mb。(更小) 同时支持 jdk8, jdk11, jdk17, jdk21,graalvm native image 入门探索视频(用户录制): 最近更新了什么? 完成 JDK21 编译测试,功能单元测试(for JDK21) 添加 HttpServerConfigure::setExecutor 接口,用于支持虚拟线程池(for JDK21) 添加 PropUtil 类。把原来的属性表达式与模板解析独立出来 添加 ContextPathListener 类,用于控制 contentPath 对 ws,tpc 的影响 添加 ContextPathFilter 一个简化的构造函数 添加 MethodHolder::getDeclaringClz、getDeclaringClzAnnotation 接口 添加 yaml 多片段支持(即一文件多环境支持) 添加 多配置文件交差引用变量支持 添加 DownloadedFile(file,name) 构造函数 添加 Router 对 405 的支持 调整 RunUtil 执行器分离为 parallelExecutor + asyncExecutor(for JDK21) 调整 CacheService 接口(增加类型化 get) 调整 SessionState 接口(增加类型化 get) 调整 Context::session 接口(增加类型化 get) 调整 BeanWrap 的 rawSet 改为公有 调整 SolonApp::enableWebSocketMvc, enableSocketMvc, 默认为 false 调整 SolonApp::enableWebSocket, enableWebSocketD 分离设置,各不相关 调整 CloudConfig 复用主框架的属性表达式与模板解析 调整 Listener 去掉 @FunctionalInterface,所有方法标为 default 调整 ChainManager::postResult 的执行策略改为包围式(相当于倒序) 调整 ValHolder 标为弃用 调整 jdkhttp,jlhttp,smarthttp 的 contentLength 适配处理 调整 使用更多的 slf4j 替换 bus 调整 mybatis-solon-plugin 的会话提交方式,修复二级缓存控制可能失效的问题 调整 "solon.config.load" 支持按顺序加载 调整 几个特定启动参数的处理方式。改与成 Solon.cfg() 同步,再统一从 Solon.cfg() 取值 调整 启动参数与系统属性的同步时机 wood 升为 1.2.1 redisx 升为 1.5.0 mybatis-flex 升为 1.6.5 sqltoy 升为 5.2.66 polaris 升为 1.14.1 lombok 升为 1.18.28 slf4j 升为 2.0.9 lombok 升为 1.18.30(for JKD21) asm 升为 9.5 (for JDK21) 项目仓库地址? gitee:https://gitee.com/noear/solon github:https://github.com/noear/solon

优秀的个人博客,低调大师

第二天学习Java

一、复习: 计算机语言的发展迭代史 第一代:机器语言第二代:汇编语言第三代:高级语言 面向过程:C,Pascal、Fortran 面向对象:Java,JS,Python,Scala,。。。 Java语言的特点: 面向对象 两个要素:类、对象 三个特征:封装、继承、多态 健壮性去除了C语言中的指针;自动的垃圾回收机制(仍然会出现内存溢出、内存泄漏)跨平台性write once,run anywhere归功于JVM JDK的下载安装 下载:官网安装软件的路径中不能包含空格path环境变量:windows操作系统执行命令所搜寻的路径不看资料,手动编写类helloworld程序class test{public static void main(String[] args){ System.out.println("This is a test");}} 二、关键字和保留字 关键字 定义:被Java语言赋予了特殊含义,用作专门用途的的字符串(单词)特点:关键字中所有字母都为小写官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html 保留字 现有Java版本尚未使用,但以后版本可能会作为关键字使用、自己命名标志符时要避免使用这些保留字goto,const 三、标识符 Java对各种变量、方法和类等要素命名时使用的字符序列称为标志符技巧:凡是自己可以起名字的地方都叫标识符 标识符定义规则 1、由26个英文字母大小写,0-9,_或$组成2、数字不可以开头3、不可以使用关键字和保留字,但能包含关键字和保留字4、Java中严格区分大小写,长度无限制5、标识符不能包含空格如果不符合以上规则,编译不通过。 标识符命名规范 命名规范并不是必须遵守的,一般建议遵守,否则不利于区分。1、包名:多单词组成时,所有字母都小写,xxxyyyzzz2、类名、接口名:多单词组成,所有单词首字母大写,XxxYyyZzz3、变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写,xxxYyyZzz4、常量名:所有字母都大写,多单词时,每个单词用下划线连接,XXX_YYY_ZZZ5、命名时,尽量有意义,做到见名知意6、Java采用unicode字符集,因此标志符也可以使用汉字声明,但是不建议使用。例子:编写一个变量并输出class OutPut{public static void main(String[] args){ int testNumber=8; System.out.println(testNumber);}}注:println输出变量时,不需要用“”。 四、变量 变量的概念:内存中的一个存储区域;该区域的数据可以在同一类型范围内不断变化;变量是程序中最基本的存储单元,包含变量类型、变量名和存储的值变量的作用:用于在内存中保存数据。使用变量的注意事项:1、先声明和赋值,后使用(不声明或不赋值程序会报错);2、使用变量名来访问这块区域的数据;3、变量的作用域为其定义所在的一对{}内;4、变量只有在其作用域内才有效;5、同一个作用域内,不能定义重名的变量。定义变量格式: 数据类型 变量名 = 变量值;例如 int myNumber=1001也可以int myNumber;myNumber=1001; 基本数据类型 不同的数据类型,在内存中分配不同大小的内存空间。数据类型包括基本数据类型(primitive type)和引用数据类型(reference type)。基本数据类型:数值型(整数类型(byte、short、int、long)、浮点类型(float、double),字符型(char),布尔型(boolean)。引用数据类型:类(class)、接口(interface)、数组(array[ ])。java是强类型,JS是弱类型(自动判断)整型byte 1字节=8bit,范围 -128-127short 2字节 ,范围 -32768-32767int 4字节 ,范围 -2147483648-2147483647,约21亿long 8字节 ,范围 -2的63次幂-2的63次幂减1,赋值必须以l或L结尾bit是计算机中的最小存储单元,byte是计算机中的基本存储单元。1个字节8位。通常定义整型变量为int。浮点类型float 4字节,单精度,尾数可以精确到7位有效数字。很多情况下很难满足需求。float类型结尾要以f或F结尾double 8字节,双精度,精度是float的两倍,通常采用此类型。字符型char 只能是一个字符,赋值时用单引号,可以是英文、中文、日文等;也可以赋值转意字符例如/n(换行)、/t(制表符)等;可以用unicode编码方式赋值,例如u0043表示C,这样的方式很少使用。字符输出时如果出现乱码,可能是存储Java程序的格式跟JDK输出格式不一样,解决办法为保存Java代码时选择ANSI。布尔类型:boolean只能取两个值之一:true、false布尔型常在条件判断、循环结构使用。为转意字符,例如要输出“”或n时,在前面加转意字符。编写小程序输出各种数据class VariableTest{ public static void main(String[] args){ byte testByte = -127; short testShort = -30000; int testInt = 6000000; long testLong = 999999999999l; float testFloat = -12.88f; double testDouble = 8888888.8888; char testChar = 'a'; char testUnicodeChar = '\u0043'; boolean testBoolean = true; System.out.println(testByte); System.out.println(testShort); System.out.println(testInt); System.out.println(testLong); System.out.println(testFloat); System.out.println(testDouble); System.out.println(testChar); System.out.println(testUnicodeChar); System.out.println(testBoolean); if(testBoolean){ System.out.println("你不能参加单身派对"); } else { System.out.println("你可以多谈谈女朋友"); }}} 基本数据类型变量间转换 基本数据类型运算规则(7种基本数据类型,不包含boolean)1、自动类型提升当容量小的数据类型变量与容量大的数据类型的容量做运算时,结果自动提升为容量大的数据类型,这里的大小指的数据类型的大小。byte、short、char->int->long->float->double。byte、short、char运算结果(即便相同类型)为int类型例子class Boost{public static void main(String[] args){char testChar = 'a';byte testByte = 10;int testInt = testChar+testByte;System.out.println(testInt);}}2、强制类型转换强制类型转换:自动类型提升运算的逆运算强制转换需要使用强转符()。强制类型转换采用截断方式(不是四舍五入),可能会有精度损失。例子$ vim Force.javaclass Force{ public static void main(String[] args){ float testFloat=12.9f; int testInt=(int)testFloat; System.out.println(testInt);}}$ javac Force.java$ java Force12 注:整型常量,默认类型为int型;浮点型常量,默认类型为double型。

优秀的个人博客,低调大师

第一天学习Java

一、基础知识学习 环境准备:jdk1.8、maven3.x、IDEAS2017软件架构2种:B/S:浏览器 serverC/S:client serverJVM java virtual machine/java虚拟机Java编程一般有java ee/java大数据两个方向Graphical user interface GUI,图形化界面Command Line Interface CLI,命令行方式java语言特点:1、面向对象:类、对象。特性:封装、继承、多态2、健壮性3、跨平台性(JVM实现,java程序跑在JVM上)Java自动垃圾回收,但是代码写的不好也会导致内存泄露和溢出。 二、编写第一个程序helloworld: $ vim HelloBeijing.java class HelloBeiJing{ public static void main(String[] args){ System.out.println("Hello,world!"); } } $ javac HelloBeijing.java $ java HelloBeiJing Hello,world! 三、封装、继承、多态概念 封装 封装原则:隐藏对象的属性和实现细节,仅对外公开访问方法,并且控制访问级别,在面向对象方法中,用类来实现上面的要求。用类实现封装,用封装来实现高内聚,低耦合。封装的意义: • 封装的意义在于保护或者防止代码(数据)被我们无意中破坏。 • 保护成员属性,不让类以外的程序直接访问和修改; • 隐藏方法细节 继承 概念:在一组相同或类似的对象中,抽取出共性的特征(属性)和行为(方法),实现重用性。产生继承关系后,子类就可以使用父类的属性和方法,同时也可以定义自己独有的属性和方法,提高代码可重用性、可扩展性。java是单继承的,一个类只能由一个直接父类,但可以多级继承,形成树状结构。继承关系初始化,构建子类对象时,需要先构建好父类的对象,之后才能开始构建子类对象。 多态 多态性是指同一种操作作用于不同对象产生不同的响应,简单概括“一个接口,多种方法”主要通过函数重载、运算符重载(静态多态性)和虚函数(动态多态性)实现. 四、注释 注释类型3种:单行注释、多行注释、文档注释(java特有)。注释内容不参与编译。/**文档注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页形式体现的该程序的说明文档@author hongliang@version 1.8生成命令:$ javadoc -d myhello -author -version HelloBeijing.java*/class HelloBeiJing{/*多行注释:如下main方法是程序的入口main的格式是固定的*/public static void main(String[] args){ //单行注释;如下语句表示输出到控制台System.out.println("Hello,world!");}} 五、API API(application programming interface),java程序提供的基本编程接口。Java的类库,这些类库统称API。API文档:就是这些API如何使用的说明。类库文档官网网址:https://www.oracle.com/java/technologies/javase-downloads.html打开网址以后在需要的版本区域,点击Documentation Download 六、总结 第一个编程代码总结1、java程序的编写-编译-运行的过程。编写:我们将编写的java代码保存在以“.java”结尾的源文件中。编译:使用javac命令编译我们的java源文件,格式 : javac 源文件名.java运行:使用java命令解释运行我们的字节码文件,格式: java 类名2、在一个java源文件中可以声明多个class,但是,public只能加在与文件名同名的类前面,并且只有一个类可以声明为public3、程序的入口是main方法,格式是固定的。agrs是参数,可变。4、输出语句System.out.println(“helloworld”); 先输出数据,然后换行System.out.print(); 换行System.out.print(“helloworld”); 只输出数据5、每一行都以";"结束。6、编译的过程:编译以后,会生成一个或多个字节码文件,每一个类生成一个字节码文件。

优秀的个人博客,低调大师

一天搭建直播系统平台!

随着手机直播的火热,手机直播开发便获得越来越多的人讨论,甚至有人说手机直播开发只需要三个步骤!这对很多人来讲是很不可思议的。小编认为这说的对也不对,接下来小编具体分析一下。首先,手机直播开发分三步确实可以搭建起来: 第一步:分解手机直播系统开发功能,了解你所需要的直播功能 第二步:寻找合适的云服务SDK进行嵌入,在APICloud的聚合API中可以轻易找到以上的功能模块,挑选合适的模块封装到自己的App中 第三步:1. App框架搭建,在APICloud Studio中直接创建应用框架,有三个常用页面框架备选; 2.积木式拼装,将所有你挑选好的模块,用Java编写页面及模块调用,运用HTML5+CSS3搭建应用的界面UI,完成App编码全过程; 3.真机调试,通过模拟器和真机调试功能进行App优化,一键点击即可在iOS和Android手机中进行App优化; 4.云编译,在APICloud网上传App的icon、启动页和证书,一键“云编译”即可同时生成iOS和Android的原生安装包; 5.云修复,使用云修复快速迭代,随时发布新版本、新功能,无需提交新的安装包。 这就是三个步骤,但是手机直播开发是一个浩大的工程还需不断探索

优秀的个人博客,低调大师

第26天,Django之include本质

目录 一、 URL name详解 向视图传递额外的参数 利用reverse函数反向生成URL 对有参数的url设置name 二、include路由转发 传递额外的参数给include() 三、URL命名空间 四、include()本质 一、 URL name详解 from django.conf.urls import url from django.contrib import admin from calc import views as calc_views urlpatterns = [ url(r'^add/$', calc_views.add, name='add'), url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'), url(r'^admin/', admin.site.urls), ] url(r'^add/$', calc_views.add, name='add'), 这里的 name='add' 是用来干什么的呢? 简单说,name 可以用于在 templates, models, views ……中得到对应的网址,相当于“给网址取了个名字”,只要这个名字不变,网址变了也能通过名字获取到。 模板中可以这样利用name 不带参数的: {% url 'name' %} 带参数的:参数可以是变量名 {% url 'name' 参数 %} 结合上面的urls.py 不带参数: <a href="{% url 'add' %}">添加</a> 上面模板经过渲染后的标签是这样的: <a href="/add/">添加</a> 带参数的: <a href="{% url 'add2' 4 5 %}">link</a> 经过渲染后: <a href="/add/4/5/">link</a> 当 urls.py 进行更改,前提是不改 name(这个参数设定好后不要轻易改),获取的网址也会动态地跟着变,比如改成: url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'), 注意: add 变成了 new_add,但是后面的 name='add2'没改,这时 {% url 'add2' 4 5 %} 就会渲染对应的网址成/new_add/4/5/ 向视图传递额外的参数 url()中允许你传递一个Python字典作为额外的关键字参数给视图函数。 from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}), ] 在上面的例子中,对于/blog/2005/请求,Django将调用views.year_archive(request, year='2005', foo='bar')。 注意:命名关键字参数和在字典中传递的额外参数要避免重名。 利用reverse函数反向生成URL urls.py from app01 import views as views urlpatterns = [ url(r'^login/',views.login), url(r'^index/first/',views.index,name='first'), ] views.py from django.shortcuts import render,HttpResponse,redirect from django.urls import reverse def login(request): url = reverse('first') print(url) # 打印结果:/index/first/ return redirect(url) def index(request): return HttpResponse('index/first') 对有参数的url设置name urls.py: from django.conf.urls import url from . import views urlpatterns = [ #... url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'), #... ] 模板代码中使用: <a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a> # 注意模版语言的用法,注意参数的传递方法 {# Or with the year in a template context variable: #} <ul> {% for yearvar in year_list %} <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li> {% endfor %} </ul> views.py视图函数: from django.urls import reverse from django.http import HttpResponseRedirect def redirect_to_year(request): # ... year = 2006 # ...注意参数的传递方法 return HttpResponseRedirect(reverse('news-year-archive', args=(year,))) 二、include路由转发 通常,我们会在每个app里,各自创建一个urls.py路由模块,然后从根路由出发,将app所属的url请求,全部转发到相应的urls.py模块中。 创建两个app:cmdb和openstack,并分别在这两个app目录下创建urls.py文件 from django.conf.urls import url,include # 需要先导入include函数 from django.contrib import admin from app01 import views urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^cmdb/',include('cmdb.urls')), url(r'^openstack/',include('openstack.urls')), ] 传递额外的参数给include() 参数会传递给include指向的urlconf中的每一行,例如,下面两种URLconf配置方式在功能上完全相同: 配置一: # main.py from django.conf.urls import include, url urlpatterns = [ url(r'^blog/', include('inner'), {'blogid': 3}), ] # inner.py from django.conf.urls import url from mysite import views urlpatterns = [ url(r'^archive/$', views.archive), url(r'^about/$', views.about), ] 配置二: # main.py from django.conf.urls import include, url from mysite import views urlpatterns = [ url(r'^blog/', include('inner')), ] # inner.py from django.conf.urls import url urlpatterns = [ url(r'^archive/$', views.archive, {'blogid': 3}), url(r'^about/$', views.about, {'blogid': 3}), ] 注意,只有当你确定被include的URLconf中的每个视图都接收你传递给它们的额外的参数时才有意义,否则其中一个以上视图不接收该参数都将导致错误异常。 三、URL命名空间 URL命名空间可以保证反查到唯一的URL。 urls.py from django.conf.urls import url,include urlpatterns = [ url(r'^cmdb/',include('cmdb.urls',namespace='cmdb')), url(r'^openstack/',include('openstack.urls',namespace='openstack')), ] cmdb/urls.py from django.conf.urls import url from cmdb import views urlpatterns = [ url(r'host/',views.host,name='host'), ] 在模板中使用: <a href="{% url 'cmdb:host' %}">跳转</a> 在视图中利用reverse()函数反向生成url from django.shortcuts import render,HttpResponse,redirect from django.urls import reverse def host(request): url = reverse('cmdb:host') print(url) # 打印结果:/cmdb/host/ return HttpResponse('cmdb.host') 注意:namespace与name在模板文件和视图函数中使用的时候要用冒号分隔,如:“cmdb:host” 四、include()本质 include()函数实际上就是返回一个元组:([], None, None) 第一个元素可以是一个列表,列表中盛放url()子路由配置; 第二个元素是app_name,可以为None; 第三个元素是namespace,需要反向生成url时,可根据需求填写; 所以urls.py也可以这样写: from django.conf.urls import url urlpatterns = [ url(r'^openstack/',([],None,None,), ] 直接用一个元组替代include() 如下,直接进行子路由分发: from django.conf.urls import url,include from cmdb import views as cviews from app01 import views urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^index/',views.index,name='index'), url(r'^cmdb/',include('cmdb.urls',namespace='cmdb')), # url(r'^openstack/',include('openstack.urls',namespace='openstack')), url(r'^openstack/',([ url(r'^host/',cviews.host,name='host'), url(r'^host/add/',cviews.addhost,name='addhost'), url(r'^host/(\d+)/change',cviews.changehost,name='changehost'), ],None,'openstack')), ] 以上元组中的'openstack',就相当于include()函数的namespace='openstack'。

优秀的个人博客,低调大师

jQuery学习(第一天)

js的回顾 遇到的问题 1.window.onload只能使用一个(事件覆盖问题) 2.代码的容错性不强 3.浏览器兼容性问题 4.代码量较多,书写很繁琐 5.代码很乱到处都是 6.动画效果我们很难实现 jQuery的基本使用 image.png min:它是压缩过的版本 区别:我们开发过程中,会用未压缩的版本,或者压缩的。 项目上线的时候,我们要用压缩过的版本。 版本问题: 1.1.xxx 版本 jQuery-1.11.1.js 2.2.xxx 版本 不再支持IE6、7、8 引包 1.要把我们的jQuery源文件拿到我们的项目里面来 2.在我们的页面中引用jQuery文件 image.png 问题: image.png 如果遇到这种问题,那肯定是没有引用我们的jQuery源文件。 用jQuery之前,先引入jQuery,然后,再去写我们的jQuery代码。 入口函数的书写方式(两种) $(document).ready(function(){ }); $(function(){ }); 2018-01-08 17-16-29 的屏幕截图.png 事件处理程序 事件源 js:document.getElementById("id"); jq:$("#id") 2.事件 js:document.getElementById("id").onclick = function(){//语句} jq:$("#id").click(function(){//语句}) 区别: jQuery事件不带on 简单的练习 使显示的div框隐藏起来 //引包 <script src="js/jquery.js"></script> //给定格式 <style type="text/css"> * { margin: 0; padding: 0; } div { height: 200px; background: #000000; margin-bottom: 10px; /*display: none;*/ } </style> //具体函数代码 <script> //入口函数 $(document).ready(function () { //语句 $("#click").click(function () { $("div").hide(); }); }); </script> . . . //页面主体(body) <input type="button" value="我是按钮" id="click" /> <div></div> JQuery详细介绍 $的问题 js命名规则: a)Js命名归法:下划线、字母、$、数字 b)但是不能以数字作为开头var $ = “我是$符号”; jQUery的两个变量:$ 和 jQuery jQuery占用了我们两个变量:$ 和 jQuery js入口函数与jQuery入口函数的区别 1.Js的window.onload事件是等到所有内容,以及我们的外部图片之类的文件加载完了之后,才回去执行 2.jQuery的入口函数 是在 html所有标签都加载之后,就回去执行。 js创建对象 三种方式 var obj = {} var obj1 = new Object(); var obj2 = Object.create(); 1跟2的区别: 推荐使用第一个方式 第二种方式存在效率问题,因为要new对象,会涉及到原型查找的问题。 jquery选择器 回顾css选择器 image.png image.png jquery选择器 image.png image.png 规律:$(selector).css(“background”,”red”); Console.log();在控制台(网页)打印 具体实现 image.png image.png image.png 设置多个样式为$("#...").css({...}); 根据自己的意愿设置的时候 函数内的参数为形参(可自定义) 设置某一个时需要进行相应的判断 jQuery是什么 jQuery就是javascript的一个库,把我们常用的一些功能进行了封装,方便我们来调用,提高我们的开发效率。 ####### Javascipt跟jQuery的区别 Javascript是一门编程语言,我们用它来编写客户端浏览器脚本。 jQuery是javascript的一个库,包含多个可重用的函数,用来辅助我们简化javascript开发 image.png 故:jQuery能做的javascipt都能做到,而javascript能做的事情,jQuery不一定能做到。 jQuery其他选择器 层级选择器 image.png * 层级选择器选择了选择符 后面那个元素,比如,div > p,是选择>后面的p元素。 过滤选择器 基本选择器 image.png image.png 属性选择器 image.png image.png mouseover/mouseout事件跟mouseenter/mouseleave事件的区别 mouseover/mouseout事件,鼠标经过的时候会触发多次,每遇到一个子元素就会触发一次。mouseenter/mouseleave事件,鼠标经过的时候只会触发一次 推荐使用mouseenter/mouseleave dom对象与jQuery对象之间的相互转换 jQuery对象转换成DOM对象: 方式一:$(“#btn”)[0] 方式二:$(“#btn”).get(0) DOM对象转换成jQuery对象: $(document) -> 把DOM对象转成了jQuery对象var btn = document.getElementById(“bt n”);btn -> $(btn); 鼠标事件的几种方法 <script> $(document).ready(function () { //第一种 // mouseenter事件 是 鼠标经过时触发的事件 /*$(".wrap li").mouseenter(function () { $(this).children("ul").show(); }); $(".wrap li").mouseleave(function () { $(this).children("ul").hide(); });*/ //第二种 hover 传两个参数 /*$(".wrap li").hover(function () { //alert("1"); $(this).children("ul").show(); }, function () { $(this).children("ul").hide(); });*/ //第三种 hover 传一个参数 进行必要的判断 /*$(".wrap li").hover(function () { /!*alert("1");*!/ var $this = $(this).children("ul"); var isShow = $this.css("display"); if(isShow === "block") { $this.hide(); } else { $this.show(); } });*/ //第四种 hover 传一个参数 (给一个‘slideToggle’ 切换 的效果) $(".wrap li").hover(function () { $(this).children("ul").slideToggle(); }); }); </script> 实例 image.png image.png

优秀的个人博客,低调大师

C++学习第三天

一些基础就可以略过了,看书不能太呆板。 如果把一本书看完了,剩下的就是在实际项目中进行整合,训练,然后整理成笔记。 每天敲点程序,记点笔记。 变量作用域 代码: #include <iostream> #include <string> #include <conio.h> std::string s1 = "hello"; //全局 int main(){ std::string s2 = "world"; //局部 std::cout<<s1<<" "<<s2<<std::endl; int s1 = 42; //局部+隐式全局 std::cout<<s1<<" "<<s2<<std::endl; getch(); return 0; } 结果:hello world42 world判断代码输出结果 代码: #include <iostream> #include <string> #include <conio.h> int i = 42; int main(){ int i = 100,sum = 0; for(int i = 0;i!=10;++i) sum += i; std::cout<<i<<" "<<sum<<std::endl; getch(); return 0; } 结果:100 45 用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private。一旦使用了using声明,我们就可以直接引用名字,而不需要再引用改名字的命名空间了。 代码: #include <iostream> #include <string> #include <conio.h> using std::cin; using std::string; using std::cout; int main(){ string s; cin>>s; cout<<s; getch(); return 0; } #include <iostream> #include <string> #include <conio.h> using std::cin; using std::string; using std::cout; using std::endl; int main(){ string st("The expense of spirit\n"); cout<<"The size of "<<st<<"is"<<st.size() <<" characters,including the newline"<<endl; getch(); return 0; } 结果:The size of The expense of spiritis22 characters,including the newline 本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/archive/2013/04/11/3014962.html,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册