百搜论坛欢迎您的加入!
adimg adimg
 
昨日:篇  今日:篇   总帖:篇   会员:
今日:0    总帖:115
daima
1277
国内知名Wchat团队荣誉出品顶级IM通讯聊天系统团队言语在先:想低价购买者勿扰(团队是在国内首屈一指的通信公司离职后组建,低价购买者/代码代码贩子者/同行勿扰/基础版本低于30w勿扰)。想购买劣质低等产品者勿扰(行业鱼龙混杂,想购买类似低能协议xmpp者勿扰)。想购买由类似openfire第三方开源改造而来的所谓第三方通信server者勿扰。想购买没有做任何安全加密场景者勿扰(随便一句api 一个接口就构成了红包收发/转账/密码设置等没有任何安全系数可言的低质产品)。想购买非运营级别通信系统勿扰(到处呼喊:最稳定/真正可靠/大并发/真正安全!所有一切都需要实际架构支撑以及理论数值测验)。想购买无保障/无支撑者勿扰(1W/4W/10W低质产品不可谓没有,必须做到:大并发支持合同保障/合作支持运维保障/在线人数支持架构保障)。想购买消息丢包者勿扰(满天飞的所谓消息确认机制,最简单的测验既是前端支持消息收发demo测试环境,低质产品一秒收发百条消息必丢必崩,  别提秒发千条/万条,更低质产品可测验:同时发九张图片/根据数字12345678910发送出去,必丢!android vs ios)。想购买大容量群uer者勿扰(随便宣传既是万人大群/几千大群/群组无限,小团队产品群组上线用户超过4000群消息体量不用很大手机前端必卡)。最重要一点:口口声声说要运营很大的系统 却想出十几个money的人群勿扰,买产品做系统一要稳定二要长久用三要抛开运维烦恼,预算有限那就干脆  别买,买了几万的系统你一样后面用不起来会烂掉!。产品体系包括:android ios server adminweb maintenance httpapi h5 webpc  (支持server压测/前端消息收发压测/httpapi压测)。。支持源码,但需要您拿去做一个伟大的系统出来!  。。团队产品目前国内没有同质化,客户集中在国外,有求高质量产品的个人或团队可通过以下方式联系到我们(低价者勿扰!) 。。。v信 onlinesam    q 513275129。。。。产品不多介绍直接加我 测试产品更直接。。。。。创新从未停止 更新不会终止  大陆唯一一家支持大并发保障/支持合同费用包含运维支撑的团队 
0 0 1305天前
admin
1078
PHP资源分享PHP框架之ThinkPHP项目开发CMS内容管理系统链接: https://pan.baidu.com/s/1c144J40 密码: mbcd北风网PHP第一季视频教程链接: https://pan.baidu.com/s/1c24eY7e 密码: q5wi[精品教程]黑客基地php特训班链接: https://pan.baidu.com/s/1eSEQnlC 密码: 2htwphp100李炎恢老师XHTML视频教程链接: https://pan.baidu.com/s/1slFjNGD 密码: 4ucfPHP程序设计高级教程链接: https://pan.baidu.com/s/1mikRQZY 密码: tt1g前端到后台ThinkPHP开发整站链接: https://pan.baidu.com/s/1bpIudER 密码: zm5k
0 0 1340天前
baby
1223
德州wepoker透视辅助挂【V亻言15OO5O638】▊无需打开▊直接添加微信▊软件功能:▊1.看牌功能,所有玩家的牌都能浏览▊2.修改作弊,支持全天24小时自动智能挂机 更加人性化▊3.牌面记忆功能,已打的牌可以显示出来▊4.透视显牌▊5.自动挂机智能打牌▊6.提高每局得好牌概率,提高胜率等▊7.房间密码超强破解,任何房间随意进出,不受限制▊与其听非专业人士随便说,影响了你对一个事物的认知和判断,莫不如实事求是,找个你信得过的专业团队或者加我聊聊,专业的事交给专业的人去做,会让你省时、省力、省心且一本万利。爱国、进步、科学、自强不息,厚德载物。求是创新。博学而笃志,切问而近思。自强、弘毅、求是、拓新。真理!
0 0 1341天前
baby
1404
这 66 个特效,是我历时4个多月在油管一个一个跟着敲出来的,为了加强记忆,每个练习,我都录制了视频,在这里分享出来给大家。大家可能又会调侃了,你是工作不饱和吧,有时间做这些。其实,我目前工作还是挺饱和的,都是挤出来的。我们是9点上班,我基本7点半就到公司自学了,这样我就有一个半小时的时间来做这些了。对于 CSS 评价,无论是在论坛还是身边的人,我听到最多的是学 CSS 这些花里胡哨没啥用,实际项目中又用不到。听到这些心里还是挺实受挫的,有时候会怀疑自己,我学习的方向是不是错了。但在几次的项目需要用到一些特效,我都能很快的找到思路并做出来,我想这是得益于,我平时所学的这些特效积累出来的。现在我不在困惑我所学的东西,因为学习成长是你自己事情,而不是别人在意的眼光。这个系列我会一直学习下去,第一季 66 节课,已经更完毕,所有的源码都在下面的地址:https://blog.csdn.net/qq449245884/category_9873715.html这个需要2瓶快乐水的钱,毕竟整理这些还是挺幸苦的, 有兴趣的可以自己看看。01.波浪文本动画效果视频地址1:https://www.ixigua.com/i6807702906041532939/视频地址2:https://www.bilibili.com/video/BV1Y7411m7b602.涟漪动画效果视频地址一:https://www.ixigua.com/i6807982622866670083/视频地址一:https://www.bilibili.com/video/BV1V741117Gm/03.视频字幕悬停特效效果视频地址一:https://www.bilibili.com/video/BV1f7411Q7JD/视频地址二:https://www.ixigua.com/i6809102422514860548/04-新拟物单选按钮效果效果视频地址一:https://www.ixigua.com/i6809529914975322632/视频地址二:https://www.bilibili.com/video/BV1Q7411D7LH/05-全屏视频背景滚动淡出效果视频地址一:https://www.bilibili.com/video/BV1nC4y1s7Dw/视频地址二:https://www.ixigua.com/i6809937347405152781/06-创意产品卡效果视频地址一:https://mp.toutiao.com/profile_v3/xigua/content-manage视频地址二:https://www.bilibili.com/video/BV1mt4y1m7Nw/07.创意菜单项悬停特效效果视频地址一:https://www.bilibili.com/video/BV1za4y1t73c/视频地址二:https://www.ixigua.com/i6812147372131353091/08.怎么配合视频做好 CSS 特效效果视频地址一:https://www.ixigua.com/i6812840842902897164/视频地址二:https://www.bilibili.com/video/BV1Le41147w9/09.制作有个性的滚动条视频地址一:https://www.bilibili.com/video/BV17e41147Gr/视频地址二:https://www.ixigua.com/i6813181916829712908/10.BoxShadow 初级到高级特效效果视频地址一:https://www.bilibili.com/video/BV1YC4y1s7kG/视频地址一:https://www.ixigua.com/i6814296955070448135/11.仅使用CSS对任何SVG图标进行动画处理效果视频地址一:https://www.bilibili.com/video/BV1AA411b7tA/视频地址二:https://www.ixigua.com/i6814028560034955780/12.使用 CSS3 实现响应式推荐卡片效果视频地址一:https://www.bilibili.com/video/BV1YC4y1s7kG/视频地址一:https://www.ixigua.com/i6814703631879635467/13.新拟物炫酷时钟效果视频地址一:https://www.bilibili.com/video/BV1pQ4y1K76g/视频地址一:https://www.ixigua.com/i6815132991329665539/14.使用 CSS Grid 实现瀑布流布局效果视频地址一:https://www.ixigua.com/i6815506102424175116/15.2.5D视差效应视频地址一:https://www.bilibili.com/video/BV1mT4y1G7cY/视频地址二:https://www.ixigua.com/i6815871539683000835/16.纯CSS3水波动画特效效果视频地址:https://www.ixigua.com/i6816244424448672260/17.圆形进度条效果视频地址一:https://www.bilibili.com/video/BV1qp4y1X7Jz/视频地址二:https://www.ixigua.com/i6816614062399422980/18.3D透视图与分层图像悬停效果效果视频地址一:https://www.bilibili.com/video/BV1J64y1T7XV/视频地址二:https://www.ixigua.com/i6817737160876098056/19.显示隐藏密码框效果视频地址一:https://www.bilibili.com/video/BV1UQ4y1K7oz/视频地址二:https://www.ixigua.com/i6818096482898412036/20.立体卡片展示特效效果视频地址一:https://www.bilibili.com/video/BV1ce411s7AG/视频地址二:https://www.ixigua.com/i6818471295219401219/21.按钮悬停特效效果视频地址:https://www.ixigua.com/i6818851166034592267/22.文字肖像和鼠标移动视差效果效果:视频地址一:https://www.bilibili.com/video/BV1TV411d7F6/视频地址二:https://www.ixigua.com/i6819215565555499532/23.输入框验证特效效果:视频地址一:https://www.bilibili.com/video/BV1Ak4y1k7Dm/视频地址二:https://www.ixigua.com/i6820325547432739339/24.粘性导航特效效果:视频地址一:https://www.bilibili.com/video/BV15K411577L/视频地址二:https://www.ixigua.com/i6821071022444249611/25.有趣的子弹声特效效果:视频演示地址一:https://www.bilibili.com/video/BV1C54y1Q7hd/视频演示地址二:https://www.ixigua.com/i6821449649967071748/26.渐变发光卡片效果:视频地址一:https://www.bilibili.com/video/BV1Qf4y1m7BY/视频地址二:https://www.ixigua.com/i6822923946040492556/27.实现长阴影网页特效效果:视频地址一:https://www.bilibili.com/video/BV1uA411t78K/视频地址二:https://www.ixigua.com/i6823670426938376716/28.发光复选框特效效果:视频地址一:https://www.bilibili.com/video/BV1qz411z7Eq/视频地址二:https://www.ixigua.com/i6824042494213227012/29. 酷炫 Loading 特效效果:视频地址一:https://www.bilibili.com/video/BV1dK411W7De/视频地址二:https://www.ixigua.com/i6825524219757986318/30.鼠标移动多彩心网页特效效果:视频地址一:https://www.bilibili.com/video/BV1de411p7gc/视频地址二:https://www.ixigua.com/i6825893346527937038/31.实现定价卡悬停特效效果:视频地址一:https://www.bilibili.com/video/BV1mK411W7pG/视频地址二:https://www.ixigua.com/i6826645569625129484/32. 3D 翻转卡片特效效果:视频地址一:https://www.bilibili.com/video/BV13K4y1t7zh视频地址二:https://www.ixigua.com/i6827005668893917708/33.视频滑块特效效果:视频地址一:https://www.bilibili.com/video/BV1Bk4y1k7QY视频地址二:https://www.ixigua.com/i6828124892492202500/34.像素化图像悬停特效效果:视频地址一:https://www.bilibili.com/video/BV1ta4y1e7WP视频地址二:https://www.ixigua.com/i6828497506532327939/35.按钮悬停效霓虹灯特效效果:视频地址一:https://www.bilibili.com/video/BV11z4y1R74N视频地址二:https://www.ixigua.com/i6828857444907614723/36.笑脸评分栏特效效果:视频地址一:https://www.bilibili.com/video/BV1Pt4y1y7K2/视频地址一:https://www.ixigua.com/i6829582434183414283/37.鼠标移动线条特效效果:视频地址一:https://www.bilibili.com/video/BV1ag4y1i7E9/视频地址二:https://www.ixigua.com/i6830722031856648707/38.鼠标移动炫酷特效效果视频演示地址一:https://www.bilibili.com/video/BV1Xz411v7X9/视频演示地址二:https://www.ixigua.com/i6831832169350955531/39.粘滞滚动特效效果:视频地址一:https://www.bilibili.com/video/BV1r54y1D7Tk/视频地址二:https://www.ixigua.com/i6832204729552994819/40.新拟物 checkbox 特效效果:视频地址一:https://www.bilibili.com/video/BV1iV411r7SD/视频地址二:https://www.ixigua.com/i6833316731788722701/41.clip-path 滚动特效效果视频地址一:https://www.bilibili.com/video/BV1tQ4y1P7DW/视频地址二:https://www.ixigua.com/i6833685696041976323/42.波浪div动画效果效果视频地址:https://www.ixigua.com/i6834042168265409027/43.滚动倾斜的背景特效效果视频地址一:https://www.bilibili.com/video/BV17p4y1D7UA/视频地址二:https://www.ixigua.com/i6834441977069568525/44.计数器设计思路效果:视频地址一:https://www.bilibili.com/video/BV1vQ4y1P7SW/视频地址二:https://www.ixigua.com/i6835920426430890499/45.菜单悬停滑动特效效果:视频地址一:https://www.bilibili.com/video/BV1Sp4y1S7y7/视频地址二 :https://www.ixigua.com/i6836281379467035147/46.很棒的图标悬停特效效果:视频地址一:https://www.bilibili.com/video/BV1ef4y127k5/视频地址二: https://www.ixigua.com/i6836657427052495373/47.霓虹灯按钮动画效果的悬停效果:视频地址一:https://www.bilibili.com/video/BV15k4y1z7gW/视频地址二:https://www.bilibili.com/video/BV15k4y1z7gW/48.窗帘响应菜单特效效果:视频地址一:https://www.bilibili.com/video/BV1TT4y1J7qf/视频地址二:https://www.ixigua.com/i6838419811442098700/49.新拟物按钮悬停效果效果:视频地址一:https://www.bilibili.com/video/BV1fv411q7AT/视频地址二:https://www.ixigua.com/i6838884535929668107/50.新拟物卡片悬停特效效果:视频地址一:https://www.bilibili.com/video/BV1Df4y1y7am/视频地址二:https://www.ixigua.com/i6839252135687750156/51.3D图像翻转特效效果:视频地址一:https://www.ixigua.com/i6840006472894513676/视频地址二:https://www.bilibili.com/video/BV15A411i7dU/52.响应式剪贴蒙版视差滚动效果效果:视频地址一:https://www.ixigua.com/i6841112747518722568/视频地址二:https://www.bilibili.com/video/BV1hv411677o/53.网站夜间日间特效效果:视频地址一:https://www.ixigua.com/i6841112747518722568/视频地址二:https://www.bilibili.com/video/BV1pa4y1Y7n9/54.文本旋转动画效果效果:视频地址一:https://www.ixigua.com/i6841854545706877447/视频地址二:https://www.bilibili.com/video/BV1iC4y1a7wW/55.创意按钮悬停特效效果:视频地址一:https://mp.toutiao.com/profile_v3/xigua/content-manage视频地址二:https://www.bilibili.com/video/BV1ZK411n7v7/56.3D编辑文本特效效果:视频地址一:https://www.ixigua.com/i6843709475413557764/视频地址二:https://www.bilibili.com/video/BV1oi4y1G7xz/57.响应盒模型特效效果:58.数字时钟特效效果:视频地址一:https://www.ixigua.com/i6844451067896267278/视频地址二:https://www.bilibili.com/video/BV1bp4y1U7fS/59.弹出框与模糊的背景特效效果视频地址一:https://www.ixigua.com/i6845126624082395656/视频地址二:https://www.bilibili.com/video/BV1bA411i75h/60.如何在文字内放置视频效果视频地址一:https://www.ixigua.com/6846310483146998275/视频地址二:https://www.bilibili.com/video/BV1B5411Y7A5/61.反射属性-webkit-box-reflect应用效果视频地址一:https://www.ixigua.com/6847050168638898692/视频地址二:https://www.bilibili.com/video/BV1iA411e7Dr/62.渐变发光加载动画特效效果63.全屏加载页面动画特效效果视频地址一:https://www.ixigua.com/6848908900436017676/视频地址二:https://www.bilibili.com/video/BV1zK4y1s7it/64.圣诞节动画特效效果视频地址一:https://www.ixigua.com/6849270738138956299/视频地址二:https://www.bilibili.com/video/BV1g5411e7yQ/65.粘糊糊的动画效果效果视频地址一:https://www.ixigua.com/6850016080396714499/视频地址二:https://www.bilibili.com/video/BV1wK4y1x7BY/66.电视噪音动画特效效果视频地址一:https://www.ixigua.com/6850386816432865806/视频地址二:https://www.bilibili.com/video/BV1Jv411q7oh/人才们的 【三连】 就是小智不断分享的最大动力,如果本篇博客有任何错误和建议,欢迎人才们留言,最后,谢谢大家的观看。所有特效源码:https://blog.csdn.net/qq449245884/category_9873715.html————————————————版权声明:本文为CSDN博主「前端小智@大迁世界」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq449245884/java/article/details/107461626
0 0 1341天前
admin
1385
THINKPHP5是一个很好的PHP框架,简称TP5,如果你会PHP,可以很容易的掌握这个框架,针对于想要学习tp5的同学,我们简单对TP5的安装和配置,及文件结构做一下介绍。安装配置官网下载TP5完整版(初学者学习用的)解压到本地的开发环境phpstudy中,默认的入口文件是public,访问public会看到TP5成功页面。目录介绍一般开发中,代码都是写在application这个文件夹中开发一个项目的时候,通常分为前台和后台,前台一般放在index模块中,后台一般放在admin模块中。也可以自己新建一个模块模块内部,都遵循着MVC架构controller、model、view都可以自己在模块中创建下面对application文件夹中的文件做一些介绍;image.pngcommand.php    命令行启动TP5框架需要读取的文件common.php    常用的函数,都写在这个文件中config.php    配置文件,开启什么,关闭什么,都在这设置database.php    连接数据库时候读取的文件,比如用户名route.php    路由文件,美化url的tags.php    扩展框架的时候用到下载的第三方库都放在这里入口文件static    这里放的是css、html之类的静态文件favicon.ico    这个是网站图标,在标签栏显示的index.php    网站入口文件,所有的请求都会经过这里robots.txt    禁止搜索引擎爬取页面的设置router.php    在没有部署网站环境的情况下,配置这个文件可以让网站运行开发规范(命名规范)目录    只是小写字母和下划线构成类的文件名以命名空间定义,并且命名空间和类库文件所在路径一致。类的文件采用驼峰,并且首字母大写,其余文件为小写加下划线。类名和类文件名保持一致,采用驼峰命名,首字母大写。函数使用驼峰命名,首字母小写。属性名采用驼峰,首字母小写以双下划线开头的函数或方法为魔术方法。常量以大写字母和下划线命名表和字段必须以小写字母和下划线命名方式,不能以下划线开头。模块设计自己创建的common模块可以自己创建common模块,然后里面写一些其他模块会常用的控制器,或者其他模块依赖的控制器,让他们继承。image.png惯例配置与应用配置与扩展配置所谓应用位置,就是对app文件夹中文件都起作用的配置。定义配置文件路径创建了配置文件后,必须要在入口文件出定义配置文件的路径,并且要将配置文件命名为config.php才可以。通常是不允许修改TP5框架的惯例配置的,这样不安全也不规范,只要定义了应用配置,那么应用配置文件中的配置的值会代替惯例配置中相同的配置,若是没有相同的值,那么就会新添加应用配置中的值。(惯例配置不会遭到修改)image.png如果项目比较大,配置信息也就多,放在一个配置文件中不合适,所以就有了扩展配置。优先级是扩展配置会覆盖conf/config.php配置,会覆盖TP5惯例配置。另外,扩展配置文件夹必须叫做extra文件夹,同时TP5为了人性化,允许与conf/config.php同级创建database.php,但是,这个database.php是属于extra扩展配置的,拥有扩展配置的优先级覆盖。场景切换配置在惯例配置中,有'app_statues'参数,默认为空,但是可以在应用配置conf/config.php中设置该参数的值为场景名称,然后再创建该场景名称的配置文件,在里面写入想配置的参数就可以了。只要想切换场景,就修改conf/config.php这个应用配置文件中'app_status'的值即可。惯例配置参数展示在conf/config.php中,只要调整'app_status'的值为home,那么就会调用conf/home.php中的配置。应用配置实例不过,由于TP5的BUG,必须要在conf/home.php中将完整的database.php中的代码复制过来,否则,修改完一处参数后,整个应用配置只有修改后的这个参数,原来的database.php中的其他参数就默认没有了。以上内容的配置,都是对整个应用起作用的,针对模块的单独的配置,下面会有。模块配置与动态配置模块配置只要像上方那样做修改就可以了。而动态配置,指的就是在控制器中进行配置,或者在控制器的方法中进行配置。说的再直白点,就是在类中用构造方法配合config()函数进行配置,这种配置,对整个类都有作用。若想对指定方法配置,那么就在那个方法中用config()函数进行配置就可以了。image.png我上面只是在方法中没有输出config()配置罢了,不然只要访问方法,就可以看到。环境配置环境配置结合场景配置,先在根目录创建.env文件,然后在应用配置的config文件中利用 think\Env 这个类中的 Env::get()函数获取.env文件中的值,来对场景进行选择。这样就不用修改场景,只需要修改.env中的配置的值就可以了。绑定入口文件绑定入口文件之后,就可以直接加控制器和方法来访问了,如果绑定了控制器,那么只要输入方法就可以了。绑定入口文件通常用于接口使用,比如让第三方接入的时候,不希望第三方访问我们的index模块或者admin模块,那么就用这个绑定入口文件来解决。另外,一旦进行了入口文件的绑定,比如我上面绑定了index,那么我也无法访问admin模块下的页面了。只能访问index模块中的页面api的应用路由若要使用路由,那么首先要开启路由,在convention.php文件中默认开启路由。不过,因为要用到我们的app中,所以需要将开启语句复制到conf/config.php中。开启路由一旦设置好路由的规则后并且开启了url_route_must=true,那么访问原来的index/Index/info/id/5就会报错,只能访问news/5。所以,要想原来访问的地址也能访问,就将url_route_must=falseinfo方法需要传入形参id这里输出的是news/10,因为这里之前定义了index/index/info的路由为news/:id,如果没有定义过,那么输出就是原来的路径,而不是路由的路径路由助手函数的输出请求对象的获取重点是Request类的使用,以及里面的方法实际上,可以仔细参考一下这个框架的编写风格,感觉能学到不少编程思想。由于上面返回的基本上都是关键数组,所以,如果想获取某个返回的数组中参数的值,可以直接在方法中加上参数名。其他获取的一些内容上面的param方法,会返回get,post,pathinfo这几个的值image.png上图第三个参数,是用来过滤获取到的值的,之所以是用intval,是对获取到的值进行整数强制转换。推荐自己写代码不用助手函数input,用request类那样的写法,这样代码的可读性更高,但是input还是要了解,因为每个人的代码不同。控制器中不建议使用die函数,可以用return来结束。返回对象上面用到了Config类,但是却忘记 use think/Config;了返回对象一般都是动态配置,因为不能保证每个控制器的返回对象都相同。视图和模板控制器渲染视图控制器中,可以使用view()函数来将与controller同一层的view模块中的与控制器同名的index文件夹中的与index()方法同名的intex.html渲染出来。这个是一个对应关系。Index控制器对应的是view/index文件夹只要做到view文件夹路径后的文件名对应模块名就可以了,控制器中的view()方法可以指定参数。view()对应的路径就是view文件夹view('./html/index.html')函数里面传入这样的参数,代表是从入口文件进去了,而不是像view('index')这样代表view/index.htmlview()函数的参数不同,路径也不同return view('index',['email'=>'123456@qq.com','name'=>'xxx'])类似这样的用法,是view()函数向指定要渲染的html页面传输变量emali和变量name的值。只需要在显示的位置{$email}或者{$name}就可以了。渲染变量要渲染的页面,只要输入大写的STATAC,那么就会被下面这个view函数的第三个参数的值所替换,通俗点看就是渲染了常量。第三个参数,渲染常量STATAC不过,上面的方法还是不推荐使用,代码可读性不高。实际开发中,最好是继承think\Controller,然后,使用$this->fetch()来渲染。用法和view()一样。推荐使用$this->fethc()也可以直接使用$this->assign('a','a的值')来给要渲染的页面上的a变量赋值。$this->assign()的用法当view文件夹中没有任何要渲染的模板的时候,就用到了下面这个函数同时也比较有用的一个方法是$this->display('只显示我这个字符串内容'),这是只传入一个参数的时候。传入两个参数的用法在渲染页面的时候,TP5框架让html页面中用的是花括号来表示变量的,但是,这个也可以在tp5中进行修改,让其他的符号或者其他的值来代替花括号的作用。几种渲染模板时候赋值的方式赋值方法还挺多的在配置文件中,可以设置下面这个参数的值,来全局替换某个关键词为某个值设置全局值替换常用的有一些系统默认设置的字符串替换:这几个很常用上面这些修改指定字符串值的方法,最神奇的使用地方就是,假如我们修改了某个文件的位置,那么只要设置指定字符串的值,就可以了,否则还得一个代码一个代码的进行修改。先看看下面能输出哪些值,然后理解在tp5中,模板是如何获取这些值的输出查看$_SERVER有哪些值$_SERVER的值模板获取$_SERVER中指定的值获取其他的值获取更多的值上面这个错了,是获取app的路径,不是当前页面的路径在模板中进行变量计算的时候,可以用#进行占位,之所以要占位,是因为{$email|md5}是把email这个参数传入md5这个函数中,而有的函数,有好几个参数传入,也有传入的顺序,所以就需要用到#来进行占位。模板中进行变量的计算还可以同时叠加好几个函数变量遇到js下面这样的注释,更加安全,因为html代码中看不到。如果用html的注释,那么就会在前端的网页源码中找到更安全的注释模板循环标签循环标签的使用在模板中,用{volist name="list" id="data"} {/volist}这一对标签来将控制器中的数组list进行循环,上图中会循环输出二维数组list中全部的name值,还附带<p>标签。list数组offset参数代表从数组的几个元素开始遍历,length参数代表遍历的长度,mod代表对当前循环次数取余。其他参数foreach迭代for循环for在模板中的其他参数比较标签比较标签,eq和equal相等的不相等的比较标签大于、小于标签大于等于、小于等于image.png条件判断标签Think.get.level这里的level是get传的参数image.png还有notbetween这样的参数几个常用标签上面的 if 标签内部还可以用AND和OR这样的逻辑语句模板的布局包含和继承当在block中嵌套使用block的时候,就可以向下方这样使用{__block__}是使用被继承薄板中的值这部分知识,主要就是include,extend,block的灵活运用。下面可以尝试做ThinkPHP5开发的项目来进行实战了。实战中再多记录一些笔记。本文地址:http://www.hnzzwz.com/blog/post/49.html版权声明:本文为原创文章,版权归 ll2l 所有,欢迎分享本文,转载请保留出处!
0 0 1343天前
admin
1191
js(全称“JavaScript”)是一种具有函数优先的轻量级、解释型或即时编译型的高级编程语言。JavaScript已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。js简介(推荐学习:js教程)JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的高级编程语言。虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。特点:JavaScript是一种属于网络的高级脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。是一种解释性脚本语言(代码不进行预编译)。主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为。可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)。Javascript脚本语言同其他语言一样,有它自身的基本数据类型,表达式和算术运算符及程序的基本程序框架。Javascript提供了四种基本的数据类型和两种特殊数据类型用来处理数据和文字。而变量提供存放信息的地方,表达式则可以完成较复杂的信息处理。可以实现web页面的人机交互。用途:嵌入动态文本于HTML页面。对浏览器事件做出响应。读写HTML元素。在数据被提交到服务器之前验证数据。检测访客的浏览器信息。控制cookies,包括创建和修改等。基于Node.js技术进行服务器端编程。以上就是js是什么的详细内容
0 0 1349天前
admin
1217
利用ajax实现excel报表导出【解决乱码问题】,供大家参考,具体内容如下背景项目中遇到一个场景,要导出一个excel报表。由于需要token验证,所以不能用a标签;由于页面复杂,所以不能使用表单提交。初步考虑前端使用ajax,后端返回流,定义指定的header。相关学习推荐:javascript视频教程第一版主要代码前端使用jquery的ajaxvar queryParams = {"test":"xxx"};var url = "xxx";$.ajax({ type : "POST", //提交方式 url : url,//路径 contentType: "application/json", data: JSON.stringify(queryParams), beforeSend: function (request) {  request.setRequestHeader("Authorization", "xxx"); }, success : function(result) {  const blob = new Blob([result], {type:"application/vnd.ms-excel"});  if(blob.size < 1) {   alert('导出失败,导出的内容为空!');   return  }  if(window.navigator.msSaveOrOpenBlob) {   navigator.msSaveOrOpenBlob(blob, 'test.xls')  } else {   const aLink = document.createElement('a');   aLink.style.display = 'none';   aLink.href = window.URL.createObjectURL(blob);   aLink.download = 'test.xls';   document.body.appendChild(aLink);   aLink.click();   document.body.removeChild(aLink);  } }});后端使用easypoi(如何使用easypoi请自行百度)import cn.afterturn.easypoi.excel.ExcelExportUtil;import cn.afterturn.easypoi.excel.entity.ExportParams; @PostMapping(value = "/download")public void downloadList(@RequestBody Objct obj, HttpServletResponse response) { ...... List excelList = new ArrayList<>();     // excel总体设置   ExportParams exportParams = new ExportParams();   // 指定sheet名字   exportParams.setSheetName("test");   Workbook workbook = ExcelExportUtil.exportExcel(exportParams, Custom.class, excelList);     response.setContentType("application/vnd.ms-excel");   response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("test", "utf-8") + ".xls");   OutputStream outputStream = response.getOutputStream();   workbook.write(outputStream);   outputStream.flush();   outputStream.close(); ......}测试结果excel能正常导出,但下载下来的excel全是乱码。经过各种找答案,整理了一下可能是以下原因导致:1、后端未设置字符集,或者在spring框架的过滤器中统一设置了字符集;2、前端页面未设置字符集编码;3、需要在ajax中添加 request.responseType = “arraybuffer”;经过不断测试,我的应该是第三点导致。但在jquery ajax 中添加后仍然不起作用,乱码问题始终无法解决。第二版主要代码前端,使用原生的ajax。后端未变动。var xhr = new XMLHttpRequest();xhr.responseType = "arraybuffer"; xhr.open("POST", url, true);xhr.onload = function () { const blob = new Blob([this.response], {type:"application/vnd.ms-excel"}); if(blob.size < 1) {  alert('导出失败,导出的内容为空!');  return; } if(window.navigator.msSaveOrOpenBlob) {  navigator.msSaveOrOpenBlob(blob, 'test.xls') } else {  const aLink = document.createElement('a');  aLink.style.display = 'none';  aLink.href = window.URL.createObjectURL(blob);  aLink.download = 'testxls';  document.body.appendChild(aLink);  aLink.click();  document.body.removeChild(aLink);  return; }}xhr.setRequestHeader("Authorization", "xxx");xhr.setRequestHeader("Content-Type", "application/json");xhr.send(JSON.stringify(queryParams));测试结果下载的excel不再乱码,原生ajax中使用 “arraybuffer” 使用是生效的。总结“arraybuffer” 这个参数导致的excel导出乱码,在原生的ajax中设置是有效的,在jquery的ajax中暂时还没找到生效的方式。以上就是ajax实现excel报表导出的详解的详细内容
0 0 1351天前
admin
1174
1、扫码枪相当于键盘输入设备,输入一连串数字后加一个enter键。但在实际开发中需要区分是扫描枪输入还是键盘用户输入,区别在于扫码枪输入很快。let code = '';  let lastTime, nextTime;  let lastCode, nextCode;  window.document.onkeypress = (e) => {   if (window.event) { // IE    nextCode = e.keyCode;   } else if (e.which) { // Netscape/Firefox/Opera    nextCode = e.which;   }   if (nextCode === 13) {    if (code.length < 3) return; // 手动输入的时间不会让code的长度大于2,所以这里只会对扫码枪有     console.log(code); // 获取到扫码枪输入的内容,做别的操作     code = '';    lastCode = '';    lastTime = '';    return;   }   nextTime = new Date().getTime();   if (!lastTime && !lastCode) {    code += e.key;   }    if (lastCode && lastTime && nextTime - lastTime > 30) { // 当扫码前有keypress事件时,防止首字缺失    code = e.key;   } else if (lastCode && lastTime) {    code += e.key;   }   lastCode = nextCode;   lastTime = nextTime;  }PS:下面看下js获取USB扫码枪数据的代码前言找了很多相关的教程不太好用,汲取各家之长总结精简了一下原理扫码枪扫描到的条形码每一位会触发一次onkeydown事件比如扫描条码位‘1234567890'的条形码,会连续执行10次onkeydown事件条码扫描到最后一位,会直接触发Enter需要引入jQuery,我这里用的是vuewindow.onload = (e)=> {  document.onkeydown = (e)=> {    let nextCode,nextTime = '';    let lastTime = this.lastTime;    let code = this.code;    if (window.event) {// IE      nextCode = e.keyCode    } else if (e.which) {// Netscape/Firefox/Opera      nextCode = e.which    }    nextTime = new Date().getTime();    //字母上方 数字键0-9 对应键码值 48-57; 数字键盘 数字键0-9 对应键码值 96-105    if((nextCode>=48&&nextCode<=57) || (nextCode>=96&&nextCode<=105)){        let codes = {'48':48,'49':49,'50':50,'51':51,'52':52,'53':53,'54':54,'55':55,'56':56,'57':57,             '96':48,'97':49,'98':50,'99':51,'100':52,'101':53,'102':54,'103':55,'104':56,'105':57            };            nextCode = codes[nextCode];            nextTime = new Date().getTime();    }    // 第二次输入延迟两秒,删除之前的数据重新计算    if(nextTime && lastTime && nextTime-lastTime>2000){            code = String.fromCharCode(nextCode);    }else{        code += String.fromCharCode(nextCode)    }    // 保存数据    this.nextCode = nextCode;    this.lastTime = nextTime;    this.code = code;    // 键入Enter    if(e.which == 13) {      // 判断 code 长度(这里就获取到条码值了,以下业务自由发挥)        code = $.trim(code)      if (code.length == 13) {        this.$message('A类条码:' + code);      } else if (code.length == 23) {                this.$message('B类条码:' + code);      } else if (code.length == 0) {                this.$message('请输入条码');      } else{        this.$message('条码不合法:' + code);      }      //键入回车务必清空code值        this.code = ''        return false;    }  }}
0 0 1355天前
admin
1242
js、jQuery面试题整理1.数据类型基本类型:除Object、String、Number、boolean、null、undefined。引用类型:object。里面包含的 function、Array、Date。2.数组方法join():数组转为字符串,可带中间符号push():数组尾部添加内容,返回新长度pop():数组尾部删除一条内容,返回长度unshift():数组头部添加内容,返回新长度shift():数组头部删除一条内容,返回删除内容sort():数组内容从大到小排序reverse():反转数组内容项concat():拼接数组,若无内容复制数组内容slice():截取数组,从指定下标开始splice():删除、插入、替换;删除:2 个参数:要删除的第一项的位置和要删除的项数。插入:3 个参数:起始位置、 0(要删除的项数)和要插入的项。替换:3 个参数:起始位置、要删除的项数和要插入的任意数量的项。3.字符串方法charAt():根据下标找到对应值charCodeAt():通过下标值找到对应字符Unicode编码indexOf():通过字符查找对应下标(首次出现)lastIndexOf():通过字符找最后一次出现的下标值slice():截取字符串,2个参数,(起始位置,结束位置)split():把字符串按分隔符分割成数组substring():截取字符串,(起始位置,结束位置)substr():截取指定位置和长度的字符串,(起始位置,长度)toLowerCase():字符串转为小写toUpperCase():字符串转成大写trim():去掉字符串前后所有空格4.阻止冒泡,阻止默认事件阻止冒泡:e.stopPropagatione.cancleBubble=true(IE)return false;阻止默认事件:e.preventDefault();e.returnValue=false;(IE)return false;5.函数作用域函数作用域是指在函数内声明的所有变量在函数体内始终是可见的,可以在整个函数的范围内使用及复用.全局变量:声明在函数外部的变量,在代码中任何地方都能访问到的对象拥有全局作用域(所有没有var直接赋值的变量都属于全局变量)局部变量:声明在函数内部的变量,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域。6.闭包外部函数访问内部函数,能够读取其他函数内部变量的函数。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。7.原型链每个对象都有一个原型_proto_,这个原型还可以有它自己的原型,以此类推,形成一个原型链。prototype属性,函数的原型对象,它是函数所独有的,它是从一个函数指向一个对象。__proto__是指向构造函数的原型对象,它是对象独有的。8.继承的几种方式构造函数继承:在Child里面,把Parent的this指向改为是Child的this指向,从而实现继承缺点:只能解决属性的继承,使用属性的值不重复,但是父级类别的方法不能继承原型链继承:把Child的原型改为是Parent的实例,从而实现继承缺点:因为Child的原型对象都是New Parent,所以实例化出来的对象的属性都是一样的,而且Parent上面的引用类型只要有一个实例对象修改了,其他也会跟着修改.因为他们原型对象都是共用的组合方式继承(组合前两种):缺点:父类的原型对象调用了两次,没有必要,而且student实例的构造函数是来自于Person还有两种组合式继承优化9.函数创建的方式函数声明:function Fn(){}字面量/函数表达式:var m = function(){}构造函数:var sum =new Function(“n1”,”n2”,”return n1+n2”)10.如何解决异步回调地狱promise、generator、async/awaitpromiselet getStuPromise = new Promise((resolve,reject)=>{    getStu(function(res){        resolve(res.data);    });});getStuPromise.then((data)=>{    // 得到每个学生的课程    getCourse();    // 还可以继续返回promise 对象})generatorfunction *generatorGetStu(){    let stus = yield getStu();    // 等到getStu异步执行完才会执行getCourse    let course = yield getCourse();}async/awaitasync函数是Generator函数的语法糖。使用 关键字async来表示,在函数内部使用await来表示异步11.事件委托理解通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件.原理: 利用冒泡的原理,把事件加到父级上,触发执行效果。target 事件属性可返回事件的目标节点(触发 该事件的节点)oUl.onmouseover = function(ev){    var ev = ev || window.event;    var target = ev.target || ev.srcElement;    if(target.nodeeName.toLowerCase() == "li"){        target.style.background = "red";    }}12.图片的懒加载和预加载预加载:常用的是new Image();,设置其src来实现预载,再使用onload方法回调预载完成事件。function loadImage(url, callback){    var img = new Image(); //创建一个Image对象,实现图片预下载    img.src = url;    if (img.complete){         // 如果图片已经存在于浏览器缓存,直接调用回调函数        callback.call(img);        return; // 直接返回,不用再处理onload事件    }    img.onload = function (){     //图片下载完毕时异步调用callback函数。    callback.call(img);//将回调函数的this替换为Image对象 ,如果你直接用img.width的时候,图片还没有完全下载下来    };}懒加载:主要目的是作为服务器前端的优化,缓解服务器前端压力,一次性请求次数减少或延迟请求。实现方式:1.第一种是纯粹的延迟加载,使用setTimeOut、setInterval进行加载延迟.2.第二种是条件加载,符合某些条件,或触发了某些事件才开始异步下载。3.第三种是可视区加载,即仅加载用户可以看到的区域,这个主要由监控滚动条来实现,一般会在距用户看到某图片前一定距离遍开始加载,这样能保证用户拉下时正好能看到图片。13.bind,apply,call的区别都可以改变函数内部this指向区别:callcall传递参数aru1, aru2… 形式apply传递参数必须数组形式[arg]bind不会调用函数,可以改变函数内部this指向主要应用场景:1、call经常做继承。2、apply经常跟数组有关系。比如借助于数学对象实现数组最大值最小值。3、bind不会调用函数,可以改变函数内部this指向。14.js的节流和防抖防抖:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定时间到来之前,又触发了事件,就重新开始延时。也就是说当一个用户一直触发这个函数,且每次触发函数的间隔小于既定时间,那么防抖的情况下只会执行一次。节流:当持续触发事件时,保证在一定时间内只调用一次事件处理函数,意思就是说,假设一个用户一直触发这个函数,且每次触发小于既定值,函数节流会每隔这个时间调用一次。时间戳和定时器区别:防抖是将多次执行变为最后一次执行,节流是将多次执行变为每隔一段时间执行。15.前端模块化和组件化模块化:可复用,侧重的功能的封装,主要是针对Javascript代码,隔离、组织复制的javascript代码,将它封装成一个个具有特定功能的的模块。组件化:可复用,更多关注的UI部分,页面的每个部件,比如头部,弹出框甚至确认按钮都可以成为一个组件,每个组件有独立的HTML、css、js代码。16.js单线程怎么执行异步操作Js作为浏览器脚本语言,它的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。js怎么异步:浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但前端的某些任务是非常耗时的,比如网络请求,定时器和事件监听,如果让他们和别的任务一样,执行效率会非常的低,甚至导致页面的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要包括http请求线程,浏览器定时触发器,浏览器事件触发线程,这些任务是异步的。这些异步任务完成后通过回调函数让主线程知道。17.手写promise函数三种状态:pending(过渡)fulfilled(完成)rejected(失败)function Promise(exector){    let _this = this;    //status表示一种状态    let status = “pending”;    let value = undefined;    let reason = undefined;    //成功    function resolve(value){        if(status == “pending”){            _this.value = value;            _this.status = “resolve”;        }    }    //执行失败    function reject(value){        if(status == “pending”){            _this.value = value;            _this.status = “reject”     }    }    //异步操作    try{        exector(resolve,reject)    }catch(e){        reject(e)    }    //测试then    Promise.prototype.then = function(reject,resolve){        let _this = this;        if(this.status == “resolve”){            reject(_this.value)        }        if(this.status == “reject”){            resolve(_this.reason)        }    }}//new Promise测试let promise = new Promise((reject,resolve)=>{    resolve(“return resolve”);});promise.then(data=>{    console.log(`success${data}`);},err=>{    console.log(`err${data}`);})18.数组去重1.遍历并两个对比,splice删除重复的第二个function unique(arr){                    for(var i=0; i<arr.length; i++){            for(var j=i+1; j<arr.length; j++){                if(arr[i]==arr[j]){         //第一个等同于第二个,splice方法删除第二个                    arr.splice(j,1);                    j--;                }            }        }return arr;}2.indexOffunction unique(arr) {    var array = [];    for (var i = 0; i < arr.length; i++) {        if (array .indexOf(arr[i]) === -1) {            array .push(arr[i])        }    }    return array;}3.sortfunction unique(arr) {    arr = arr.sort()    var arrry= [arr[0]];    for (var i = 1; i < arr.length; i++) {        if (arr[i] !== arr[i-1]) {            arrry.push(arr[i]);        }    }    return arrry;}4.includes (ES6)function unique(arr) {    var array =[];    for(var i = 0; i < arr.length; i++) {            if( !array.includes( arr[i]) ) {//includes 检测数组是否有某个值                    array.push(arr[i]);              }    }    return array}19.数组排序冒泡排序:var arr=[1,5,7,9,16,2,4];//冒泡排序,每一趟找出最大的,总共比较次数为arr.length-1次,每次的比较次数为arr.length-1次,依次递减var temp;for(var i=0;i<arr.length-1;i++){    for(var j=0;j<arr.length-1;j++){        if(arr[j]>arr[j+1]){            temp=arr[j];            arr[j]=arr[j+1];            arr[j+1]=temp;        }    }}选择排序:(相邻对比)var arr=[1,23,5,8,11,78,45];var temp;for(var i=0;i<arr.length-1;i++){    for(var j=i+1;j<arr.length;j++){        if(arr[i]>arr[j]){            temp=arr[i];            arr[i]=arr[j];            arr[j]=temp;        }    }}sort():var arr=[1,5,7,9,16,2,4];arr.sort(function(a,b){    return b-a;  //降序排列,return a-b; —>升序排列})      //括号里不写回调函数,则默认按照字母逐位升序排列,结果为[1,16,2,4,5,7,9]20.去除首尾空格JavaScript 本身并不提供 trim() 方法,不过可以用正则表达式(其中一种)if(typeof(String.prototype.trim) === "undefined"){    String.prototype.trim = function()     {        return String(this).replace(/^\s+|\s+$/g, '');    };} if(" dog  ".trim() === "dog") {    document.write("去除首尾空格成功");    }21.解决跨域方案jsonp:包含回调函数和数据//1、使用JS动态生成script标签,进行跨域操作function handleResponse(response){    console.log('The responsed data is: '+response.data);    //处理获得的Json数据}var script = document.createElement('script');script.src = 'http://www.example.com/data/?callback=handleResponse';document.body.insertBefore(script, document.body.firstChild);//2、手动生成script标签function handleResponse(response){    console.log('The responsed data is: '+response.data);    //处理获得的Json数据}<script src="http://www.example.com/data/?callback=handleResponse"></script>//3、使用jQuery进行jsonp操作//jquery会自动生成一个全局函数来替换callback=?中的问号,之后获取到数据后又会自动销毁//$.getJSON方法会自动判断是否跨域,不跨域的话,就调用普通的ajax方法;跨域的话,则会以异步加载js文件的形式来调用jsonp的回调函数。<script>    $.getJson('http://www.example.com/data/?callback=?',function(jsondata){    //处理获得的Json数据});</script>window.name + iframelocation.hash+iframewindow.postMessage(HTML5中的XMLHttpRequest Level 2中的API)通过document.domain+iframe来跨子域(只有在主域相同的时候才能使用该方法)使用跨域资源共享(CORS)来跨域使用Web sockets来跨域使用flash URLLoader来跨域22.手写ajaxajax的技术核心是 XMLHttpRequest 对象;ajax 请求过程:创建 XMLHttpRequest 对象、连接服务器、发送请求、接收响应数据;(理解)<script type="text/javascript">//通过createXHR()函数创建一个XHR对象:function createXHR() {    if (window.XMLHttpRequest) {    //IE7+、Firefox、Opera、Chrome 和Safari         return new XMLHttpRequest();    } else if (window.ActiveXObject) {   //IE6 及以下        var versions = ['MSXML2.XMLHttp','Microsoft.XMLHTTP'];        for (var i = 0,len = versions.length; i<len; i++) {            try {                return new ActiveXObject(version[i]);                break;            } catch (e) {                //跳过            }          }    } else {        throw new Error('浏览器不支持XHR对象!');    }}//封装ajax,参数为一个对象function ajax(obj) {    var xhr = createXHR();  //创建XHR对象    //通过使用JS随机字符串解决IE浏览器第二次默认获取缓存的问题    obj.url = obj.url + '?rand=' + Math.random();    obj.data = params(obj.data);  //通过params()将名值对转换成字符串    //若是GET请求,则将数据加到url后面    if (obj.method === 'get') {        obj.url += obj.url.indexOf('?') == -1 ? '?' + obj.data : '&' + obj.data;    }    if (obj.async === true) {   //true表示异步,false表示同步        //使用异步调用的时候,需要触发readystatechange 事件        xhr.onreadystatechange = function () {            if (xhr.readyState == 4) {   //判断对象的状态是否交互完成                callback();      //回调            }        };    }    //在使用XHR对象时,必须先调用open()方法,    //它接受三个参数:请求类型(get、post)、请求的URL和表示是否异步。    xhr.open(obj.method, obj.url, obj.async);    if (obj.method === 'post') {        //post方式需要自己设置http的请求头,来模仿表单提交。        //放在open方法之后,send方法之前。        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');        xhr.send(obj.data);     //post方式将数据放在send()方法里    } else {        xhr.send(null);     //get方式则填null    }    if (obj.async === false) {  //同步        callback();    }    function callback() {        if (xhr.status == 200) {  //判断http的交互是否成功,200表示成功            obj.success(xhr.responseText);          //回调传递参数        } else {            alert('获取数据错误!错误代号:' + xhr.status + ',错误信息:' + xhr.statusText);        }      }}//名值对转换为字符串function params(data) {    var arr = [];    for (var i in data) {        //特殊字符传参产生的问题可以使用encodeURIComponent()进行编码处理        arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i]));    }    return arr.join('&');}</script>实例:ajax({    method : 'het/post',    url : '...',    data : {    },    success : function (res) {    },    error : function(err){    },    async : true});23.ES6简述,具体请参考https://blog.csdn.net/Juliet_xmj/article/details/103940173字符串扩展解构表达式函数优化函数参数默认值箭头函数对象的函数属性简写箭头函数结合解构表达式map:接收一个函数,将原数组中的所有元素用这个函数处理后放入新数组返回。reduce:接收一个函数(必须)和一个初始值(可选),该函数接收两个参数:(上一次reduce处理的结果,数组中要处理的下一个元素)promiseconst promise = new Promise(function(resolve, reject) {  // ... 执行异步操作  if (/* 异步操作成功 */){    resolve(value);// 调用resolve,代表Promise将返回成功的结果  } else {    reject(error);// 调用reject,代表Promise会返回失败结果  }});promise.then(function(value){    // 异步执行成功后的回调}).catch(function(error){    // 异步执行失败后的回调    })set:本质与数组类似。不同在于Set中只能保存不同元素,如果元素相同会被忽略。map:本质是与Object类似的结构。不同在于,Object强制规定key只能是字符串。而 Map结构的key可以是任意对象。模块化:把代码进行拆分,方便重复利用对象扩展数组扩展24.BOM,DOMBOM:指的是浏览器对象模型,它使JavaScript有能力与浏览器进行“对话”DOM:是指文档对象模型,通过它,可以范文HTLM文档的所有元素window对象:是客户端JavaScript最高层对象之一,由于window对象是其他大部分对象的共同祖先,在调用window对象的方法和属性时,可以省略window对象的应用。25.jQuery选择器元素选择器:$("p.intro")选取所有 class=“intro” 的<p>元素。属性选择器:$("[href='#']")选取所有带有 href 值等于 “#” 的元素。css选择器:$("p").css("background-color","red");26.隐式迭代遍历内部DOM元素(伪数组形式存储)的过程,给匹配到的所有元素进行循环遍历,执行相应的方法,而不需要我们自己进行循环遍历<ul>    <li>web</li>    <li>前端</li></ul>//js$("li").html("WEB前端梦之蓝");    //将所有的li标签html内容全部换成“WEB前端梦之蓝”,这个就属于隐式迭代感谢大家的阅读,希望大家面试成功。本文转自:https://blog.csdn.net/Juliet_xmj/article/details/106982585
0 0 1357天前
admin
1469
今天在做一个登录界面的时候,由于视觉给的页面背景图片太鲜艳亮眼,导致页面中间的登录表单框很不显眼,效果很差。就想到了做成毛玻璃的效果,现在分享出来,大家一起看看吧。页面结构如下:1234<p class="wrap-box"><!--最外层包裹框,背景图片很鲜艳亮眼position:fixed-->    <p class='login-box'><!--登录表单框部分position:fixed-->        </p></p>由于之前用过CSS filter属性,在属性值中使用blur(<blur_size>)函数可以起到毛玻璃效果,所以我有2个思路来实现突出登录表单框的效果:对wrap-box使用filter:blur(<blur_size>);,然后将login-box的z-index设置为比父元素大使之浮在上层,使页面中除了登录表单框部分都是模糊的。Exciting!这种方法似乎可行,但是效果却不是所期望的,login-box也被模糊了!原因如下:应用了filter:blur(<blur_size>);的元素的所有子孙元素都会被模糊处理(不是因为继承),即使子孙元素脱离了该元素的文档流也不能避免。只对login-box背后部分模糊处理。解决方案是在login-box下层加一个与之重叠的元素,对此元素应用filter:blur(<blur_size>);,可以选择用伪元素:12345678910.login-box::before{    content:'';    position:absolute;    top:0;    left:0;    right:0;    bottom:0;    filter:blur(10px) contrast(.8);    z-index:-1;}并设置如下背景样式:123.wrap-box ,.login-box::before{    background:url('/assets/login_bg.jpg') 0 / cover fixed;}效果达成如下:感谢大家的阅读,希望大家收益多多。本文转自: https://blog.csdn.net/buttonChan/article/details/79889372推荐教程:《CSS教程》以上就是手把手教你CSS如何实现毛玻璃效果的详细内容
0 0 1357天前
admin
1383
css常用属性border-left:1 px solid#6699c;/*左框线*/ border-right:1 px solid#6699cc;/*右框线* 以上是建议书写方式,但也可以使用常规的方式如下: border-top-color:#369/*设置上框线top颜色* border- top-width:1p×/*设置上框线top宽度* border-top-stye: solid/*设冒上框线top样式* 其他框线样式 sod/实线框* dotted/虚线框* double/*线框* groove/*立体内凸框* ridge/*立体浮雕框*/ set/*凹框* outset/*凸框* 七、CSS表单运用 文字方块 按钮 复选框 选择钮 多行文字方块 下拉式菜单选项1选项2 八、C5s边界样式 margIn-top:10px;/*上边界* margIn- right:10pX;/*右边界值* margIn- bottom:10px;/*下边界值* margIn-left:10px;/*左边界值*/ ...展开详情快速参考手册 css常用属性 css常用属性大全
0 0 1369天前
admin
1198
一、边框1.1 border-radius 圆角1、border-radius的值可以为绝对单位px,和相对单位em,rem,也可以为百分比,值越大,弧度越大。 2、属性值位数不同时,表现也不同,具体可以参考图片。 3、你也可以设置单个角的弧度,比如border-top-right-radius:5px;border-bottom-left-radius:5px。1.2 box-shadow 阴影1、box-shadow: X轴偏移值 Y轴偏移值 X轴阴影模糊半径 Y轴阴影模糊半径 阴影颜色; 2、其中,X轴和Y轴的偏移值可以为负,但不能共用一个,X轴和Y轴的阴影半径可以共用一个,但是不能为负。 3、还需要注意的是,阴影模糊半径是可以不写的,比如box-shadow:10px 10px #ccc;这样,仍然会有阴影,但是就失去了这种模糊朦胧的效果,立体感也大大减弱了,一般不会这么使用。1.3 box-sizing 属性允许你以特定的方式定义匹配某个区域的特定元素,这话有点绕口,我们结合图来说明。box-sizing:content-box/border-box/inherit1盒模型基本结构如图,当我们设置了宽高,使用了box-sizing属性, 属性值为content-box时,宽高的值为content的宽高; 属性值为border-box时(事实上我们比较常用的就是这个),宽高的值为border+padding+content也就是整个盒模型的宽高; 属性值为inherit时,则从父元素继承box-sizing的值。二、背景CSS3中,我们对背景有了更强的控制2.1 background-image跟以前不同的是,我们通过background-image来为一个元素添加多张图片,让我们结合代码和效果图来看一下。<div class="box"></div>/*右下角的小图为bg_flower.gif*/.box{    height: 500px;    width: 800px;    margin: 0 auto;    margin-top: 100px;    background-image: url(img/bg_flower.gif), url(img/2.jpg);/*写在前面的背景图会在上面*/    background-position: right bottom, left top;/*默认为left top*/    background-repeat: no-repeat, repeat;/*默认为repeat*/}2.2 background-size 调整背景图片的大小属性值可以为实际单位,也可以是百分比。.box{    background-size:60px 100px;/*宽,高*/    background-size:60% 100%;2.3 background-origin 规定背景图片的定位区域background-origin: content-box / padding-box / border-box ; 下图中,绿色的是边框,黄色的是padding+content区域。<div class="box1"></div><div class="box2"></div><div class="box3"></div>div{    float:left;    margin:30px;    width: 120px;    height: 150px;    background: yellow;    border: 20px solid green;    padding: 20px;    background-image: url(img/bg_flower.gif);    background-repeat: no-repeat;}.box1{    background-origin:content-box;}.box2{    background-origin:padding-box;}.box3{    background-origin:border-box;}2.4 background-clip 规定背景的绘制区域background-clip: content-box / padding-box / border-box ;<div class="box1">啦啦啦啦,德玛西亚。啦啦啦啦,剑圣偷塔。啦啦啦啦,我要回家。啦啦啦啦,下雨不怕。啊啊!</div><div class="box2">啦啦啦啦,德玛西亚。啦啦啦啦,剑圣偷塔。啦啦啦啦,我要回家。啦啦啦啦,下雨不怕。啊啊!</div><div class="box3">啦啦啦啦,德玛西亚。啦啦啦啦,剑圣偷塔。啦啦啦啦,我要回家。啦啦啦啦,下雨不怕。啊啊!</div>div{    float:left;    margin:30px;    width: 120px;    height: 150px;    background: yellow;    border: 20px solid rgba(0, 0, 0, 0.1);    padding: 20px;}.box1{    background-clip:content-box;}.box2{    background-clip:padding-box;}.box3{    background-clip:border-box;}2.5 linear-gradient 背景的颜色渐变(IE10)CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡。以前,你必须使用图像来实现这些效果。但是,通过使用 CSS3 渐变(gradients),你可以减少下载的事件和宽带的使用。此外,渐变效果的元素在放大时看起来效果更好,因为渐变(gradient)是由浏览器生成的。 其中颜色可以用多种表现形式,包括带有透明度的rgba()形式1) 线性渐变下面让我们来看代码<div class="box1"></div><div class="box2"></div><div class="box3"></div><div class="box4"></div><div class="box5"></div><div class="box6"></div>div{    float:left;    margin:30px;    width: 100px;    height: 150px;    border: 2px solid orange;    font-size: 14px;    line-height: 1.5;}.box1{/* 1、属性值最少为两种颜色 */        background: -webkit-linear-gradient(red, yellow); /* Safari 5.1 - 6.0 */        background: -o-linear-gradient(red, yellow); /* Opera 11.1 - 12.0 */        background: -moz-linear-gradient(red, yellow); /* Firefox 3.6 - 15 */        background: linear-gradient(red, yellow); /* 标准的语法 */}.box2{/* 2、可以设置颜色渐变的方向,比如从左到右 */        background: -webkit-linear-gradient(left, green , yellow);         background: -o-linear-gradient(left, green, yellow);         background: -moz-linear-gradient(left, green, yellow);         background: linear-gradient(left, green , yellow);}.box3{/* 3、也可以沿着对角的方向渐变 */        background: -webkit-linear-gradient(top left, blue , yellow);         background: -o-linear-gradient(top left, blue, yellow);         background: -moz-linear-gradient(top left, blue, yellow);         background: linear-gradient(top left, blue , yellow); }.box4{/* 4、或者,我们直接用角度确定渐变的方向(12点钟方向为0deg) */       background: -webkit-linear-gradient(60deg, rgb(248, 182, 44), rgb(0, 159, 233));        background: -o-linear-gradient(60deg, rgb(248, 182, 44), rgb(0, 159, 233));        background: -moz-linear-gradient(60deg, rgb(248, 182, 44), rgb(0, 159, 233));        background: linear-gradient(60deg, rgb(248, 182, 44), rgb(0, 159, 233)); }.box5{/* 5、我们也可以定义多种颜色的渐变,之前的方向的设置方法不变 */      background: -webkit-linear-gradient(45deg,red,orange,yellow,green,blue,indigo,violet);      background: -o-linear-gradient(45deg,red,orange,yellow,green,blue,indigo,violet);      background: -moz-linear-gradient(45deg,red,orange,yellow,green,blue,indigo,violet);      background: linear-gradient(45deg, red,orange,yellow,green,blue,indigo,violet); }.box6{/* 6、当然,渐变可以是很多次的 */      background: -webkit-repeating-linear-gradient(red, red 10%, yellow 20%);       background: -o-repeating-linear-gradient(red, red 10%, yellow 20%);      background: -moz-repeating-linear-gradient(red, red 10%, yellow 20%);       background: repeating-linear-gradient(red, red 10%, yellow 20%); }2)、径向渐变创建一个径向渐变,你也必须至少定义两种颜色结点。颜色结点即你想要呈现平稳过渡的颜色。同时,你也可以指定渐变的中心、形状(原型或椭圆形)、大小。默认情况下,渐变的中心是 center(表示在中心点),渐变的形状是 ellipse(表示椭圆形),渐变的大小是 farthest-corner(表示到最远的角落)。下面上代码<div class="box1"></div><div class="box2"></div><div class="box3"></div><div class="box4"></div><div class="box5"></div>div{    float:left;    margin:30px;    width: 150px;    height: 150px;    border: 2px solid orange;    font-size: 14px;    line-height: 1.5;}.box1{/* 1、颜色结点均匀分布(默认情况下 */    background: -webkit-radial-gradient(red, yellow, green); /* Safari 5.1 - 6.0 */    background: -o-radial-gradient(red, yellow, green); /* Opera 11.6 - 12.0 */    background: -moz-radial-gradient(red, yellow, green); /* Firefox 3.6 - 15 */    background: radial-gradient(red, yellow, green); /* 标准的语法 */            }.box2{/* 2、当然,对于颜色发辐射界限,我们也可以进行设置 */    background: -webkit-radial-gradient(red 5%, yellow 15%, green 60%);     background: -o-radial-gradient(red 5%, yellow 15%, green 60%);     background: -moz-radial-gradient(red 5%, yellow 15%, green 60%);     background: radial-gradient(red 5%, yellow 15%, green 60%); }.box3{/* 3、shape 参数定义了形状。它可以是值 circle 或 ellipse。其中,circle 表示圆形,ellipse 表示椭圆形。            默认值是 ellipse。*/    background: -webkit-radial-gradient(circle, red, yellow, green);     background: -o-radial-gradient(circle, red, yellow, green);     background: -moz-radial-gradient(circle, red, yellow, green);     background: radial-gradient(circle, red, yellow, green);             }.box4{/* 4、size 参数定义了渐变的大小。它可以是以下四个值:closest-side farthest-side closest-corner                 farthest-corner,具体的不同大家可以自己尝试,这里只展示一种情况 */    background: -webkit-radial-gradient(60% 55%, closest-side,blue,green,yellow,black);     background: -o-radial-gradient(60% 55%, closest-side,blue,green,yellow,black);    background: -moz-radial-gradient(60% 55%, closest-side,blue,green,yellow,black);    background: radial-gradient(60% 55%, closest-side,blue,green,yellow,black);}.box5{/* 5、当然,也是有重复渐变这种情况*/    background: -webkit-repeating-radial-gradient(red, yellow 10%, green 15%);    background: -o-repeating-radial-gradient(red, yellow 10%, green 15%);    background: -moz-repeating-radial-gradient(red, yellow 10%, green 15%);    background: repeating-radial-gradient(red, yellow 10%, green 15%);}三、文本3.1 text-shadow 文本阴影规则跟box-shadow类似,text-shadow:X轴偏移值,Y轴偏移值,阴影模糊半径,颜色。在这里,需要注意的是,如果前三个数值写两个,比如text-shadow:5px 5px #ccc;会认为阴影模糊半径不存在,仍然有文字的重影,但是没有模糊的视觉效果了。3.2 word-wrap | word-break 是否允许长单词换行,这两个可以一起使用word-wrap: normal(只允许断点字换行) | break-word(如果单词过长,截断强制换行) word-break: normal(浏览器默认的换行规则,一般是不允许长单词内部换行) | break-all(允许在单词内换行) | keep-all(只能在半角空格或连字符处换行);<div class="box1">aaaaa aaaaaaaaaaaaaaaaaaa aaaaaaaaaaa aaaaaaaaaa</div><div class="box2">aaaaa aaaaaaaaaaaaaaaaaaa aaaaaaaaaaa aaaaaaaaaa</div><div class="box3">aaaaa aaaaaaaaaaaaaaaaaaa aaaaaaaaaaa aaaaaaaaaa</div><div class="box4">aaaaa aaaaaaaaaaaaaaaaaaa aaaaaaaaaaa aaaaaaaaaa</div>div{    float:left;    margin:30px;    width: 100px;    height: 150px;    border: 2px solid rgba(0, 0, 0, 0.5);    font-size: 14px;    line-height: 1.5;}.box1{    word-wrap: normal;}.box2{    word-wrap: break-word;}.box3{    word-break: keep-all;}.box4{    word-break: break-all;}
0 0 1369天前
admin
1321
新手进行网页布局中肯定会遇到很多大大小小的问题,这篇文章希望能帮到大家!1、若调整一个元素宽高不管用时,请查看这个元素是不是行内元素,若是则使用下面代码设置为块级元素display:block;2、在制作导航菜单时,垂直居中用百分比的方法position:relative;top:50%;transform:translateY(-50%);3、透明的背景样式background:rgba(0,0,0,0.5);4、去掉a链接的默认下划线样式text-decoration:none;5、去掉li列表的默认样式list-style-type:none;6、去掉苹果浏览器默认的按钮样式-webkit-appearance:none;7、将一个元素旋转45度transform:rotateZ(45deg);8、用弹性布局的方法对元素进行垂直居中对齐在父元素设置display:flex;在子元素设置margin:auto;
0 0 1369天前
admin
1071
//只能输入数字function keydown(doc){ //doc为元素名称,从8开始,依次为(左删除,tab键,左移,上移,右移,下移,右删除),其它为数字键 $(doc).keydown(function(evt){ var kc = evt.keyCode; var array = new Array(48,49,50,51,52,53,54,55,56,57,96,97,98,99,100,101,102,103,104,105,8,9,37,38,39,40,46); var flag = true; for(var i = 0;i < array.length && flag; i++){ if(kc == array[i]){    flag = false; } } if(flag){ evt.keyCode = 0; evt.returnValue=false; return false; } });} //查看图片的弹出层,这个需要jquery-ui的dialog组件支持,下面的也是一样的function showImg(img){// $("img[id*='Img']").click(function(){ $(img).click(function(){ var url = $(this).attr("src"); if(url == "") return; var html = "<div id='imgDiv' style='display: none;height: 600px;'><div align='center'><img src='"+url+"' id='hideImg' style='border: 10px solid gray;margin: 0px;padding: 0px;height: 600px;'/></div></div>"; var dig = window.top.$(html).appendTo(window.top.document.body); dig.dialog({ title: "图片查看",  maxWidth:1024, minWidth:1024,   maxHeight: 600,   minHeight:600, modal: true, resizable:false, bgiframe:true, option:"", close: function(event, ui){ }  }); });} //file验证function fileValidate(doc,types){ var file = doc.val(); //文件名 var array = types.split(","); //文件格式 var lasterOn = ""; //文件后辍 if(file == "" || file == null) { alert("上传文件不能为空!"); return false; } if(file.lastIndexOf(".") > -1){ lasterOn = file.substring(file.lastIndexOf(".")); var flag = false; for(var i = 0; i < array.length && !flag; i++){ if(lasterOn.indexOf(array[i]) >= 0){ //找到该文件格式 flag = true; } } if(!flag){ showErr("上传文件格式错误!正确格式应为" + types + "!"); return false; } }} //删除提示function delBtn(url){ msg("您确定执行删除操作吗?", url);} function msg(msg,url){ var html = "<div id='logout' style='display: none;width: 500px;height: 200px;'>"+msg+"</div>"; var diag = window.top.$(html).appendTo(window.top.document.body); diag.dialog({ title:"系统提示", width : 300, modal : true, resizable:false, buttons : { "确定" : function() { diag.dialog("close"); location.href=url; }, "取消" : function() { diag.dialog("close"); } } });} //信息提示function showErr(msg){ var html = "<div id='logout' style='display: none;width: 500px;height: 200px;'>"+msg+"</div>"; var diag = window.top.$(html).appendTo(window.top.document.body); diag.dialog({ title:"系统提示", width : 300, modal : true, resizable:false, buttons : { "确定" : function() { diag.dialog("close"); } } }); return false;}
0 0 1369天前
admin
1260
其实解决方案有很多。如果在jsp下,你可以写标签来转换成你想要的html富文本,还可以实现自定义的过滤。如果在velocity下,你可以写一个宏来转码,之前公司的宏写的就不错,各种都实现了。还可以在js里转换,这种做法适用于ajax输出html。以下是自己实验的例子。<html> <head><script src="jquery.js"></script><script> var html ="期望项目开始时间:_______ &lt;div&gt;期望项目交付时间:_______ &lt;/div&gt;&lt;div&gt;1)项目启动:交付内容,计划完成时间&lt;/div&gt;&lt;div&gt;2)里程碑1:交付内容,计划完成时间&lt;/div&gt;&lt;div&gt;3)里程碑2:交付内容,计划完成时间 &lt;/div&gt;&lt;div&gt;4)... ...&lt;/div&gt;&lt;div&gt;5)项目上线:交付内容,计划完成时间&lt;/div&gt;&lt;div&gt;我们会按月提交具体需求,具体案例的项目时间表会在项目管理中跟外包公司确认&lt;/div&gt;"; $(function(){ html = noEscapeHtml(html); alert(html); $("body").html(html); });   function noEscapeHtml(html) { return html.replace(/(\&|\&)gt;/g, ">") .replace(/(\&|\&)lt;/g, "<") .replace(/(\&|\&)quot;/g, "\""); }  </script></head> <body> </body> </html>主要是这正则,还有其它要转的,依次跟上就ok了。我这里只是转换的一个示范。
0 0 1369天前
admin
1291
  js中splice方法,可以将元素从数组中移除,具体做法如下,(当然,这个方法功能很多,这里只列一种,做个笔记,有遇到的时候,再加上其它的。)$("input[id*='ad']").change(function(){ if($(this).is(":checked")){ $("#seq").append("<span id='seq"+$(this).val()+"'>  "+$("#span" + $(this).val()).html()+"</span>"); array.push($(this).val()); } else { for(var i = 0; i < array.length; i++){ $("#seq"+$(this).val()).html(""); if(array[i] == $(this).val()){ //在该位置移除元素   ( items <- i -> items ) splice方法调用后,返回被移除元素的集合,即可从标记位置向两边Splice array = array.slice(0,i).concat(array.slice(i+1,array.length)); } } } }); });
0 0 1369天前
admin
1230
其实是有两种做法的,第一种,当输入框状态改变的时候,即change事件时,将内容取出来,将所有的非数字字符,全替换为空,但这样挺别扭的,你一输入其它的,显示出来了,马上就消失了。第二种,就是以下的做法,监听键盘事件,如果不是数字键(分为两排,字母上面的一排与右边的数字键)则拦截掉该次按下事件,但也有弊端,就是粘贴的时候也还是会粘进来一些字符,或用鼠标拖拉文字,所以在提交时,需要做下判断,还有就是它除了数字键,其它的也给禁用了,包括删除键。。。$(function() {$('#save').button().click(function() { $('#AdvertForm').submit(); }); $('#cancel').button().click(function() { history.back(); }); $("#delayTime").keydown = keydown($("#delayTime")); $("#playCount").keydown = keydown($("#playCount")); }); function keydown(doc){ //doc为元素名称 $(doc).keydown(function(evt){ var kc = evt.keyCode; var array = new Array(48,49,50,51,52,53,54,55,56,57,96,97,98,99,100,101,102,103,104,105); var flag = true; for(var i = 0;i < array.length && flag; i++){ if(kc == array[i]){ flag = false; } } if(flag){ evt.keyCode = 0; evt.returnValue=false; return false; } }); }
0 0 1369天前
admin
1161
在写SQL时,经常灵活运用一些SQL语句编写的技巧,可以大大简化程序逻辑。减少程序与数据库的交互次数,有利于数据库高可用性,同时也能显得你的SQL很牛B,让同事们眼前一亮。实用的SQL1.插入或替换如果我们想插入一条新记录(INSERT),但如果记录已经存在,就先删除原记录,再插入新记录。情景示例:这张表存的每个客户最近一次交易订单信息,要求保证单个用户数据不重复录入,且执行效率最高,与数据库交互最少,支撑数据库的高可用。此时,可以使用"REPLACE INTO"语句,这样就不必先查询,再决定是否先删除再插入。"REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。"REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。"REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。注意事项:如下SQL所示,需要在username字段上建立唯一索引(Unique),transId设置自增即可。1234567-- 20点充值REPLACE INTO last_transaction (transId,username,amount,trans_time,remark)    VALUES(null, 'chenhaha', 30, '2020-06-11 20:00:20', '会员充值'); -- 21点买皮肤REPLACE INTO last_transaction (transId,username,amount,trans_time,remark) VALUES(null, 'chenhaha', 100, '2020-06-11 21:00:00', '购买盲僧至高之拳皮肤');若username='chenhaha'的记录不存在,REPLACE语句将插入新记录(首次充值),否则,当前username='chenhaha'的记录将被删除,然后再插入新记录。id不要给具体值,不然会影响SQL执行,业务有特殊需求除外。2.插入或更新如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就更新该记录,此时,可以使用"INSERT INTO ... ON DUPLICATE KEY UPDATE ..."语句:情景示例:这张表存了用户历史充值金额,如果第一次充值就新增一条数据,如果该用户充值过就累加历史充值金额,需要保证单个用户数据不重复录入。这时可以使用"INSERT INTO ... ON DUPLICATE KEY UPDATE ..."语句。注意事项:同上,"INSERT INTO ... ON DUPLICATE KEY UPDATE ..."语句是基于唯一索引或主键来判断唯一(是否存在)的。如下SQL所示,需要在username字段上建立唯一索引(Unique),transId设置自增即可。123456789-- 用户陈哈哈充值了30元买会员INSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark) VALUES(null, 'chenhaha', 30, '2020-06-11 20:00:20', '充会员')    ON DUPLICATE KEY UPDATE total_amount=total_amount + 30, last_transTime='2020-06-11 20:00:20', last_remark ='充会员';  -- 用户陈哈哈充值了100元买瞎子至高之拳皮肤INSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark)    VALUES(null, 'chenhaha', 100, '2020-06-11 20:00:20', '购买盲僧至高之拳皮肤')    ON DUPLICATE KEY UPDATE total_amount=total_amount + 100, last_transTime='2020-06-11 21:00:00', last_remark ='购买盲僧至高之拳皮肤';若username='chenhaha'的记录不存在,INSERT语句将插入新记录,否则,当前username='chenhaha'的记录将被更新,更新的字段由UPDATE指定。3.插入或忽略如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就啥事也不干直接忽略,此时,可以使用INSERT IGNORE INTO ...语句:情景很多,不再举例赘述。注意事项:同上,"INSERT IGNORE INTO ..."语句是基于唯一索引或主键来判断唯一(是否存在)的,需要在username字段上建立唯一索引(Unique),transId设置自增即可。1234567-- 用户首次添加INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time)    VALUES(null, 'chenhaha', '男', 12, 0, '2020-06-11 20:00:20'); -- 二次添加,直接忽略INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time)    VALUES(null, 'chenhaha', '男', 12, 0, '2020-06-11 21:00:20');若username='chenhaha'的记录不存在,INSERT语句将插入新记录,否则,不执行任何操作。4.SQL中的if-else判断语句众所周知,if-else判断在任何地方都很有用,在SQL语句中,"CASE WHEN ... THEN ... ELSE ... END"语句可以用在增删改查各类语句中。给个情景:妇女节大回馈,2020年注册的新用户,所有成年女性账号送10元红包,其他用户送5元红包,自动充值。示例语句如下:12345-- 送红包语句UPDATE users_info u     SET u.balance = CASE WHEN u.sex ='女' and u.age > 18 THEN u.balance + 10                          ELSE u.balance + 5 end                         WHERE u.create_time >= '2020-01-01'* 情景2:有个学生高考分数表,需要将等级列出来,650分以上是重点大学,600-650是一本,500-600分是二本,400-500是三本,400以下大专;原测试数据如下:查询语句:123456SELECT *,case when total_score >= 650  THEN '重点大学'              when total_score >= 600 and total_score <650 THEN '一本'              when total_score >= 500 and total_score <600 THEN '二本'              when total_score >= 400 and total_score <500 THEN '三本'                     else '大专' end as status_student               from student_score;5.指定数据快照或备份如果想要对一个表进行快照,即复制一份当前表的数据到一个新表,可以结合CREATE TABLE和SELECT:12-- 对class_id=1(一班)的记录进行快照,并存储为新表students_of_class1:CREATE TABLE students_of_class1 SELECT * FROM student WHERE class_id=1;新创建的表结构和SELECT使用的表结构完全一致。6.写入查询结果集如果查询结果集需要写入到表中,可以结合INSERT和SELECT,将SELECT语句的结果集直接插入到指定表中。例如,创建一个统计成绩的表statistics,记录各班的平均成绩:123456CREATE TABLE statistics(    id BIGINT NOT NULL AUTO_INCREMENT,    class_id BIGINT NOT NULL,    average DOUBLE NOT NULL,    PRIMARY KEY (id));然后,我们就可以用一条语句写入各班的平均成绩:1INSERT INTO statistics (class_id, average) SELECT class_id, AVG(score) FROM students GROUP BY class_id;确保INSERT语句的列和SELECT语句的列能一一对应,就可以在statistics表中直接保存查询的结果:1SELECT * FROM statistics;12345678+----+----------+--------------+| id | class_id | average      |+----+----------+--------------+|  1 |        1 |        475.5 ||  2 |        2 | 473.33333333 ||  3 |        3 | 488.66666666 |+----+----------+--------------+3 rows in set (0.00 sec)7.强制使用指定索引在查询的时候,数据库系统会自动分析查询语句,并选择一个最合适的索引。但是很多时候,数据库系统的查询优化器并不一定总是能使用最优索引。如果我们知道如何选择索引,可以使用FORCE INDEX强制查询使用指定的索引。例如:1SELECT * FROM students FORCE INDEX (idx_class_id) WHERE class_id = 1 ORDER BY id DESC;指定索引的前提是索引idx_class_id必须存在。心得体会:MySQL路漫漫,其修远兮。永远不要眼高手低,一起加油,希望本文能对你有所帮助。推荐教程: 《mysql教程》以上就是分享MySQL中实用的几种SQL语句的详细内容
0 1 1374天前
admin
1158
我们可以在创建表时设置外键约束。在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体的语法格式如下:12[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]REFERENCES <主表名> 主键列1 [,主键列2,…]举例:现在在 test_db 数据库中创建一个部门表 tb_dept1,表结构如下图所示:创建 tb_dept1 的 SQL 语句和运行结果如下所示。1234567mysql> CREATE TABLE tb_dept1    -> (    -> id INT(11) PRIMARY KEY,    -> name VARCHAR(22) NOT NULL,    -> location VARCHAR(50)    -> );Query OK, 0 rows affected (0.37 sec)创建数据表 tb_emp6,并在表 tb_emp6 上创建外键约束,让它的键 deptId 作为外键关联到表 tb_dept1 的主键 id,SQL 语句和运行结果如下所示。123456789101112131415161718192021mysql> CREATE TABLE tb_emp6    -> (    -> id INT(11) PRIMARY KEY,    -> name VARCHAR(25),    -> deptId INT(11),    -> salary FLOAT,    -> CONSTRAINT fk_emp_dept1    -> FOREIGN KEY(deptId) REFERENCES tb_dept1(id)    -> );Query OK, 0 rows affected (0.37 sec) mysql> DESC tb_emp6;+--------+-------------+------+-----+---------+-------+| Field  | Type        | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| id     | int(11)     | NO   | PRI | NULL    |       || name   | varchar(25) | YES  |     | NULL    |       || deptId | int(11)     | YES  | MUL | NULL    |       || salary | float       | YES  |     | NULL    |       |+--------+-------------+------+-----+---------+-------+4 rows in set (1.33 sec)以上语句执行成功之后,在表 tb_emp6 上添加了名称为 fk_emp_dept1 的外键约束,外键名称为 deptId,其依赖于表 tb_dept1 的主键 id。注意:从表的外键关联的必须是主表的主键,且主键和外键的数据类型必须一致。例如,两者都是 INT 类型,或者都是 CHAR 类型。如果不满足这样的要求,在创建从表时,就会出现“ERROR 1005(HY000): Can't create table”错误。推荐教程:mysql教程以上就是mysql外键约束怎么创建的详细内容
0 0 1374天前
admin
1302
sql语句批量添加数据的方法是什么?方法1:逐条执行,速度慢。123INSERT INTO testimport (name, message)VALUES ('testname', 'jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd');INSERT INTO testimport (name, message)VALUES ('testname', 'jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd');INSERT INTO testimport (name, message)VALUES ('testname', 'jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd');方法2:批量执行,适用于 SQL Server。1234INSERT INTO testimport (name, message)  VALUES('testname', 'jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd'),('testname', 'jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd'),('testname', 'jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd');方法3:批量执行,适用于Oracle。123456INSERT ALL     INTO A (name, message) VALUES ('testname', 'jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd')        INTO A (name, message) VALUES ('testname', 'jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd')        INTO A (name, message) VALUES ('testname', 'jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd')SELECT 1FROM DUAL;推荐教程: 《sql教程》以上就是sql语句批量添加数据的方法是什么的详细内容
0 0 1374天前
快速发帖 高级模式
联系站长 友链申请桂ICP备19000949号-1     桂ICP备19000949号-1
您的IP:54.196.27.171,2024-03-29 06:58:50,Processed in 0.6321 second(s).
免责声明: 本网不承担任何由内容提供商提供的信息所引起的争议和法律责任。
Powered by HadSky 7.12.9
免责声明
1、本站资源,均来自网络,版权归原作者,所有资源和文章仅限用于学习和研究目的 。
2、不得用于商业或非法用途,否则,一切责任由该用户承担 !
如果觉得本文还不错请点个赞或者打赏点轻币哦~
拒绝伸手党,拿走请回复,尊重楼主,尊重你我他~

侵权删除请致信 E-Mail:207882320@qq.com