
没有什么网站是数据库增删查改做不了的,如果有,那就不接这单!
MYSQL冷备份恢复 SHOW VARIABLES LIKE '%data%' 查看datadir目录,这就是所有数据的备份目录,好像只有innodb的可以直接覆盖备份 停掉MYSQL服务,然后整个目录打包 到另一台win电脑上,同样的,找到那台电脑的data目录, 停掉MYSQL服务,然后覆盖,再重启MYSQL服务,这时已经把整个数据库都备份过来了,包括所有的数据库 自己测试,到mac上,找到数据目录,在finder里打不开,没有权限 在mac上打开terminal, 输入sudo chmod 775 ,然后在finder里把Data目录拉入终端,回车,输入密码后就可以直接在finder里访问了 把WIN上复制过来的备份覆盖, 注意win下的数据目录是Data, mac下的数据目录是data, 我覆盖到mac的目录下把文件 夹改名为小写data了,重启MYSQL,出错:Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql' 解决办法是打开终端运行sudo chown -R mysql /usr/local/mysql/data即可。 https://blog.csdn.net/qq_16845639/article/details/77843628 再启动mysql服务就可以了。。。另在terminal里启动mysql服务是 mysql.service start
net core 3.1发布的时候有视图views NUGET引入 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation Startup.cs里 services.AddControllersWithViews().AddRazorRuntimeCompilation(); csproj里 <RazorCompileOnBuild>false</RazorCompileOnBuild> <RazorCompileOnPublish>false</RazorCompileOnPublish> 项目发布后就能看到视图文件夹views了
NET CORE 七牛云上传文件 文档:https://developer.qiniu.com/kodo/sdk/1237/csharp 代码:
<h1>{$info.title}</h1> <div>发布时间:{$info.create_time}</div> <div>{$info.content}</div> <div>短地址:{$shorturl}</div>
在surface pro4上不知道怎么弄好了Flutter了,运行成功在redmi k30 pro手机上了,结果跑到神舟精盾本本上再弄一次又出问题了,每次搭建flutter环境总是出问题,郁闷,写个博客记录下来碰到的问题,便于以后查询!!! 下载好flutter_windows_1.20.4-stable(本地下载很慢,我都是远程桌面到其他服务器上,在其他服务器上下载了再直接从远程桌面拉下来,已传到和彩云网盘上),解压到c:flutter目录下 ,环境变量path里加上C:flutterbin, 用户变量里加入PUB_HOSTED_URL=https://pub.flutter-io.cnFLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn 图1 cmd命令行下运行Flutter doctor 结果报错如图,网上说是要运行那个什么什么licenses命令的,但是我看报错里根本就没有那条命令的,强制运行那命令报错!! 图2 一番查询,终于发现问题,我太追新了,装了JDK14,然后就报这个错了,卸载掉,装上JDK8(已传到和彩云),再运行flutter doctor就出来那个licenses语句了,执行后一路Y下去就行了 图3 图4 图5 android studio 装上flutter插件,新建一个项目,结果在creating flutter project界面上停了好久好久,都没办法进去,关掉了,然后在CMD命令下运行flutter create aaa创建目录,然后切换到当前目前运行flutter run 图6 图7 运行run好久好久,还是不行,连接上手机了,开了调试模式了,运行Flutter devices能看到设备 图8 不知道怎么操作出错了,那个gradle下载耗时太久了,停掉后自己上网下载对应的gradle-5.6.2.all.zip包放到那个目录下,把目录下其他文件删除掉,然后再运行flutter run, 反复好几次才成功运行到手机上了,装的时候记得要在手机上点同意安装,然后就可以装到手机上了 图9 图10 图11 图12 图13
把一个NETCORE网站部署到NGINX上,按微软官方文档弄好了 https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-3.1 想配置SSL的HTTPS证书,腾讯云上申请了免费的,之前在WIN+IIS 配置是成功的,按网上的弄好了,我的用的是宝塔的NGINX,可以在网页上建立网站了改NGINX配置文件就行了, 配置好后重启NGINX了,结果不行的,搜索一翻,原来是centos服务器自带的firewall防火墙的问题,https://www.jianshu.com/p/17b73ad6a4b8, xshel上运行以下命令就行了 firewall-cmd --zone=public --add-port=443/tcp --permanent 增加443端口 firewall-cmd --reload 重启防火墙 或者直接就把防火墙停掉 systemctl stop firewalld 其他备注: 在xshell 里登录LINUX服务器后,输入BT命令,可以查看宝塔默认的安装信息 以下是我的nginx配置文件: server {listen 80;server_name tudi.niunan.net;location / {proxy_pass http://localhost:5000;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection keep-alive;proxy_set_header Host $host;proxy_cache_bypass $http_upgrade;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header X-Real-IP $remote_addr;}} server { #SSL 访问端口号为 443 listen 443 ssl; #填写绑定证书的域名 server_name tudi.niunan.net; #证书文件名称 ssl_certificate /www/server/nginx/conf/1_tudi.niunan.net_bundle.crt; #私钥文件名称 ssl_certificate_key /www/server/nginx/conf/2_tudi.niunan.net.key; ssl_session_timeout 5m; #请按照以下协议配置 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { proxy_pass http://localhost:5000;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection keep-alive;proxy_set_header Host $host;proxy_cache_bypass $http_upgrade;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header X-Real-IP $remote_addr; } }
前提:三年前双11买的阿里云今年到期了,win2012的,上面mysql数据库里记着自己的一些记账数据,上一年双11买了腾讯云的,centos7.7, 想学学MYSQL的复制功能,今天趁着无BUG可撸,试着配置了一下,成功,在阿里云上的部署的网站写入数据,可同时复制到腾讯云上了,以下是配置步骤: 远程桌面登录阿里云服务器,打开sqlyog 执行select version()查看版本号 停掉MYSQL服务,看配置文件 "C:ProgramDataMySQLMySQL Server 8.0my.ini" 里的[mysqld]下的配置,记下来: log-bin="iZwz95a6wosz6ka-bin"server-id=1 再启动MYSQL服务,通过命令行登录 上MYSQL,执行:show master status, 记下结果 : 名称:iZwz95a6wosz6ka-bin.000007 位置:155 阿里云MYSQL做为主库,创建可供远程复制的账号,因为是MYSQL 8.0的,得拆分成二条语句来执行,先建立账号,再设置权限 create user 'replic_user'@'%' identified by 'copypassword';grant replication slave,replication client on . to 'replic_user'@'%' ; 用sqlyog里的导出功能把niunan数据库整个全部导出,弄到本地备份,至此主库的操作完成, 下面要在腾讯云的从库上进行操作 重新开始,上腾讯云网站给服务器重新系统,centos 7.7, 装完后用xshell登录进去,根据宝塔网站(https://bt.cn/)的安装教程安装 宝塔面板 ,在宝塔里的软件商店再安装MYSQL8。0 (因为之前自己测试用命令安装 MYSQL真的好慢好慢,根本就下载不了,yum install mysql) 把第五步备份的文件传到/root目录下,在xshell 里mysql -u root -p 登录 MYSQL, source /root/niunandb.sql 导入牛腩数据库 在宝塔上修改MSYQL的配置文件,[mysqld]下,改完后重启下服务 log_bin=iZwz95a6wosz6ka-binserver_id=2relay_log=/path_to_mysql_log/mysql-relay-binlog_slave_updates=1read_only=1 记得要建立/path_to_mysql_log目录 在xshell里mysql -u root -p 登录 MYSQL,执行命令设置主库连接的用户名和密码: master to master_host='120.78.185.96',master_port=3306,master_user='replic_user',master_password='copypassword',master_log_file='iZwz95a6wosz6ka-bin.000007',master_log_pos=155 那个最后二个参数是第三步里记下来的玩意,运行后发现错误了,没有权限什么的,最后直接在FTP里给那个path_to_mysql_log目录设置777权限 就行了 运行命令启动 : start slave;运行命令查看状态: show slave status; 在阿里云部署的网站上测试一下,插入几条数据,然后再跑到腾讯云上查询看看,发现成功了,刚刚插入的数据已经同步到腾讯云!!!
以下是把一个NET CORE项目弄到LINUX服务器上的一些记录,NET CORE+MYSQL+MONGODB+REDIS, 不知道为什么买的云LINUX服务器直接安装MYSQL好慢好慢,只好用DOCKER来弄了,不过NET CORE项目代码还是在宿主机, 网站在/xiaoyuapicore/ 关闭防火墙:systemctl stop firewalld停止linux启动时自动启动防火墙:systemctl disable firewalld nginx的配置文件:/www/server/panel/vhost/nginx/xiaoyu.conf 运行mysql:docker run -itd --name mysql-webassign -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /db/:/var/lib/mysql mysql:5.7 --lower_case_table_names=1 docker cp 20b571294a57:/etc/mysql/my.cnf /tmp/my.cnfdocker cp /tmp/my.cnf 20b571294a57:/etc/mysql/my.cnf [mysqld]user=mysqllower_case_table_names=1 运行redis:docker run -itd --name redis-test -p 6379:6379 redis 运行mongodb: docker run -itd --name mongo-test -p 27017:27017 mongo Linux 下 docker 设置开机自启动 sudo systemctl enable docker 开机自启动容器 docker update redis --restart=always linux下重启命令 :reboot
<h1>腾讯地图测试</h1> <div>您在当的位置(经度:<span id="now_lat"></span>,纬度:<span id="now_lng"></span>)<button type="button" onclick="geolocation.getLocation(showPosition, showErr, options)">获取当前位置</button></div> <div>您点击的位置(经度:<span id="poi_lat"></span>,纬度:<span id="poi_lng"></span>,解析出来的地址:<span id="poi_address"></span>)</div> <div id="pos-area"> </div> <script type="text/JavaScript"> var appkey ="A4KBZ-LUZE3-VPW3T-YGU5N-SIT2S-5ZFVH"; var geolocation = new qq.maps.Geolocation(appkey, "myapp");var options = {timeout: 8000}; $(function(){ //加载完成后就取当前位置 geolocation.getLocation(showPosition, showErr, options); }) function showPosition(position) { console.log(position); $('#now_lat').html(position.lat); $('#now_lng').html(position.lng); $('#poi_lat').html(position.lat); $('#poi_lng').html(position.lng); //取出位置坐标了,设置地图显示出来 var map = new qq.maps.Map(document.getElementById("pos-area"), { // 地图的中心地理坐标。 center: new qq.maps.LatLng(position.lat,position.lng), zoom:15 }); //添加标记 var marker = new qq.maps.Marker({ position: new qq.maps.LatLng(position.lat,position.lng), map: map }); //解析地址 jiexiaddress(position.lat,position.lng); //绑定地图点击事件 qq.maps.event.addListener(map, "click", function (e) { $('#poi_lat').html(e.latLng.getLat().toFixed(6)); $('#poi_lng').html(e.latLng.getLng().toFixed(6)); //先移除标记,再添加标记 marker.setMap(null); marker = new qq.maps.Marker({ position: new qq.maps.LatLng(e.latLng.getLat(),e.latLng.getLng()), map: map }); jiexiaddress(e.latLng.getLat(),e.latLng.getLng()); }); }; function showErr() { alert("定位失败!"); }; //解析地址function jiexiaddress(lat,lng){ var url3 = encodeURI("https://apis.map.qq.com/ws/geocoder/v1/?location=" + lat + "," + lng + "&key="+appkey+"&output=jsonp&&callback=?"); $.getJSON(url3, function (result) { if(result.result!=undefined){ $('#poi_address').html(result.result.address); }else{ $('#poi_address').html(''); } }) }
一个项目,客户需要上传CDR文件,上传了,后台直接点下载地址下载不了,http://www.aaa.com/upload/aaa.cdr , IIS里的mine已经把cdr 文件设置为 oct....stream... 不行,设置为 application/x-cdr ..也不行。。 最后只好在代码中进行,上网搜索了一下,代码如下 :
C#操作mongodb简记官方文档地址:https://mongodb.github.io/mongo-csharp-driver/2.10/getting_started/quick_tour/ 我只是想用mongodb来存系统日志而已,只需要会插入和分页查询就好了 新建类 控制器页面引入命名空间 简单的插入和查询分页的代码 以上代码是在.net core 2.1的网站中验证通过
用mysql,原有数据库shopdb,想新增一个数据库shopdb2,表结构保持和shopdb一样 在ecs服务器上用sqlyog连接rds数据库,创建shopdb2后右键shopdb数据库导出,导出shopdb的表结构保持,然后在shopdb2上右键导入 问题来了,shopdb里的数据删除了,因为导出时的语句有use shopdb, 下面每一行前都有drop table....导致shopdb中的每个表都先删除了再重新建立表,但里面的数据都没有了 以后切记执行SQL的时候先打开来确认一下!!!!不过数据量导出大的话生成的TXT文本文件好几G啊,根本就打开不了,郁闷!
mysql查询问题mysql版本: 5.7.26-log数据库:管理员-用户表 admin_user (一个管理员管多个用户)几百条数据 订单表 api_order (一个订单对应一个用户) 4百万条数据 表里的时间字段加了索引,用户id字段加了索引现需要查某个管理员名下所有用户在某一时间段的订单数量, 代码如图,结果在执行的时候一直转圈圈,单独把管理员名下所有用户id取出来放到userid in (xxxxx)里一下子就查出来了,用explain分析后给admin_user表里的adminid字段加索引,结果还是不行,最后给admin_user表的userid加上索引后就好了(●°u°●) 」 PS:按理说不加索引应该能查出来的,管理员也就管理了9个用户,子查询只查出9条数据,然后订单表那里加了时间限制,给时间加索引了,单独取那段时间的数据也就2千多条数据, 可就是查不出,在workbench里运行总是转圈圈,而且就算加索引,子查询里是where adminid=xxxx,我给adminid字段加索引了还是转圈 圈 ,最后再给userid加索引了就好了,一下子就查出来了!!! SQL mysql查询问题mysql版本: 5.7.26-log数据库:管理员-用户表 admin_user (一个管理员管多个用户)几百条数据 订单表 api_order (一个订单对应一个用户) 4百万条数据 表里的时间字段加了索引,用户id字段加了索引现需要查某个管理员名下所有用户在某一时间段的订单数量, 代码如图,结果在执行的时候一直转圈圈,单独把管理员名下所有用户id取出来放到userid in (xxxxx)里一下子就查出来了,用explain分析后给admin_user表里的adminid字段加索引,结果还是不行,最后给admin_user表的userid加上索引后就好了(●°u°●) 」 PS:按理说不加索引应该能查出来的,管理员也就管理了9个用户,子查询只查出9条数据,然后订单表那里加了时间限制,给时间加索引了,单独取那段时间的数据也就2千多条数据, 可就是查不出,在workbench里运行总是转圈圈,而且就算加索引,子查询里是where adminid=xxxx,我给adminid字段加索引了还是转圈 圈 ,最后再给userid加索引了就好了,一下子就查出来了!!!
WPF设置F2为快捷键单个字母设置快捷键可以直接在按钮的文本里加上 _P 之类的,但是要设置FN为快捷键的话得用下面图片里的代码,也是搜索出来的:
自定义select样式,下面是CSS代码,主要是那个appearance 样式 select { width: 220px; margin-left: 12px; padding-left: 12px; height: 31px; line-height: 31px; font-size: 12px; color: #333; appearance: none; -webkit-appearance: none; -ms-appearance: none; -moz-appearance: none; -o-appearance: none; background: url(simg3.jpg) right center no-repeat; background-size: 29px 27px; border: 2px solid #fe606e; overflow: hidden; }下面是相关图片:
微信语音在网页端播放 做的一个项目,需要个功能,微信公众号里点菜单进去一个网页后能和后台客服人员在线聊天,而且还能发送语音,后台客服人员在电脑PC端上登录网页也能和用户进行在线聊天,并且能听到语音。 制作思路:文字聊天功能用最简单的方式,客户聊天页/user/chat, 后台聊天页/admin/chat,数据库聊天表chat,聊天页里文本框,发送按钮,点了就把文本框里的内容存到数据库聊天表中,然后在聊天页用js的setinterval定时从数据库里取出数据显示; 发送语音功能,用户聊天是在微信里聊天的,可以使用微信的JSSDK来发送语音(https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html),发送语音后会有个本地localid, 还需要用那个JSSDK里的上传方法上传到微信服务器上取得serverid,属于临时素材,只能存储三天,发送按钮就把这个serverid存到数据库chat里,在用户聊天页上就可以直接调用JSSDK里的方法来播放语音; 相关JS代码: 后台聊天页从数据库取出Serverid,然后再用微信公众号开发文档里的获取临时素材接口(https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Get_temporary_materials.html)下载音频,下载到的是speex格式的,上网找了好久,才找到个speex格式转到wav格式的命令行工具,WIN下可用的,转为wav格式后就可以用h5的audio来播放音频了,这样就能在网页上听到声音了 JS代码: 后台代码: speex格式转wav的工具,WIN下用的 http://image.niunan.net/spx2wav_win.zip 用自己写的微信helper,用于.net下的,core下的没试过,不知道能不能用http://blog.niunan.net/blog/show/1278
前提: 本地导出MYSQL的一个数据脚本.sql, 有50M大小的,想传到服务器上后再服务器上再导入, 结果在服务器上出现 ‘ server has gone away ’ 的错误,网上搜索后修改my.ini文件里的 max_allowed_packet = 40M, 修改后保存, 进服务里重新启动MYSQL,结果启动不了了,查MYSQL的日志也没有任何东西,费了蛮久的时间搜索解决方法才知道,原来是保存的时候自动保存为utf8格式了,把他另存为ansii就行了
redis作为windows服务运行按文档里的命令运行 redis-server --service-install redis.windows-service.conf 本地测试成功,服务里多了个Redis服务了,启动就行了 在服务器上测试,服务器是有了,但是启动失败,查日记也找不到原因,上网查了下,原来redis.windows-service.conf有个日志文件logfile "Logs/redis-log.txt" 本地测试的时候这个文件夹和这个文件已经有了,所以在服务器启动成功了, 但是在服务器上的话redis目录里没有这个目录和文件的,所以启动失败了,手工建立Logs目录和redis-log.txt文件就行了
老的神舟本本装上了深度LINUX了。。。应该是基于ubuntu的,安装软件用的apt-get而不是yum 想重装学下android原生开发,官网下载了android studio, 发现不用FQ也能下载了,不错不错,支持支持 下载后解压了直接双击那个Android Studio.sh运行就行了,新建一个hello world项目,结果运行不起来,那个调试那个地方都没有绿色三角形, 想了下,好像没有装JAVA,又上ORACLE上下载了JAVA的安装,结果又总是下不了,晕。。不知道是不是得FQ。。。 然后不知道从哪里搜索出来的。。在命令行里装了。。装的是OPENJDK。。。装了以后再运行android studio ,还是运行不起来 最后看了下项目设置 File -> Project Structure ,发现NDK没有安装,安装以后再apply一下,再刷新下项目,结果就能运行上了 不错不错,支持支持,特此记录一下....(下载NDK 要800多M的,看下载域名是google.com的,想着得FQ下载的。。结果不用,我的南宁电信2M带宽10分钟左右就下载好了...)
正在做的WPF项目,客户需要在文本框里输入后按回车即跳到下一个框框,和tab一样的 上网搜索了下解决方案:如下: 在文本框外围 的grid加上KeyDown事件,代码里写上: /// /// 上方的可输入区域,回车替换TAB /// /// /// private void StackPanel_KeyDown(object sender, KeyEventArgs e) { var uie = e.OriginalSource as UIElement; if (e.Key == Key.Enter) { uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); e.Handled = true; } }
改那个PHP项目加了个功能,本地MYSQL里添加了一个函数了,现在要转到服务器上,然后服务器上的MYSQL只能通过PHPMYADMIN网页操作的,在网页上SQL里输入创建函数的语句, 结果报错了:this function has none of DETERMINISTIC 查了一下是这个原因:https://www.jb51.net/article/97037.htm 在上面再运行:set global log_bin_trust_function_creators=1; 就行了 另我本地的MYSQL是用SQLYOG连接的,导出的函数创建语句里有/* 之类的注释的,放在PHPMYADMIN上执行的时候需要去掉,要不然有可能执行不了,还有那个 DEFINER=root@% 也要去掉。。。 下面是我的函数创建语句: USE sql88_aosijue_c;DELIMITER $$ CREATE FUNCTION `calc_xjs`(user_id int) RETURNS int(11) BEGIN return (SELECT COUNT(1) FROM tp_users WHERE pid=user_id); END $$ DELIMITER ;注意放在服务器上的PHPMYADMIN执行的话那个USE后的数据库名也要和服务器上的一致
朋友的一个thinkphp做的项目,让我帮他部署一下的,LINUX服务器,用宝塔。 第一台服务器,装上宝塔,宝塔里装NGINX,PHP5.6,再建立网站,绑定域名,访问成功,一切正常! 昨天试着给另一台服务器上装上同样的,宝塔,NGINX,PHP5.6,建立网站,绑定域名,结果访问的时候出错了,404错误, 一翻搜索,发现只要进宝塔里把网站设置里的那个防跨站攻击的勾勾去掉就好了,不知道干嘛第一台服务器是没有勾上,这台服务器是勾上了。。 把整个项目弄到本地,本地WIN10,装上PHPSTUDY,用默认的PHP5.6+APAXCHE,站点域名管理新建一个,端口8001 本地开浏览器访问:http://localhost:8001 访问网站正常 PHPSTUDY里切换到NGINX+PHP5.6,也是站点域名建立一个,端口8001,结果在访问的时候出错了,不管访问哪个页面都是报错: No input file specified 上网搜索了一天,终于找到篇可以解决我问题的文章了。。 https://blog.csdn.net/weixin_37281289/article/details/88621487 查看C:phpStudyPHPTutorialnginxlogserror.log文件,发现错误: 我的网站目录是c:tempdaochiphp,原来NGINX把t给转义了,进入: C:phpStudyPHPTutorialnginxconfvhosts.conf 改成c:\temp就好了 再浏览http://localhost:8001成功显示....另一个错误... 原来是用的thinkphp的,本地测试的话还得加上index.php 如果想不需要输入index.php的话,还得改vhost.conf文件,另外差点忘记,那个宝塔 上的也要给网站的配置文件里加上那些东西 location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } }
牛腩学docker简记 http://blog.niunan.net/blog/show/1258https://www.cnblogs.com/niunan/p/10917506.htmlhttps://www.jianshu.com/p/1fd8ce0d49ed 本视频记录牛腩学习在vs中的.net core项目中的添加docker支持的简单记录云服务器上运行docker网站的思路: 云服务器上装nginx, mysql 云服务器上装docker 本地VS .NET CORE项目生成docker镜像后导出传到云服务器上再导入 在云服务器上运行docker run xxxx, 定义好云服务器端口如:8001, nginx中做反向代理绑定某个域名跳到http://localhost:8001 (http://blog.niunan2.ml/blog/show/1183) docker官网:https://www.docker.com/阿里云的镜像加速器:https://cr.console.aliyun.com/cn-shenzhen/instances/mirrors牛腩博客.NET CORE源码:https://git.coding.net/niunan/niunan_blogcore2.git DOCKER命令:显示所有镜像:docker images显示运行中的容器:docker ps显示所有容器:docker ps -a停止正在运行中的容器:docker stop 容器ID启动容器:docker start 容器ID重启容器:docker restart 容器ID删除容器:docker rm 容器ID删除镜像:docker rmi 镜像ID(备注:删除镜像要求要先删除对应的容器)根据镜像运行新容器(本机端口32768,容器端口80):docker run -d -p 32768:80 镜像ID查看容器运行日志:docker logs 容器ID导出镜像:docker save -o c:/temp/bbb.tar 镜像ID导入镜像:docker load -i bbb.tar(在服务器上bbb.tar所在的目录运行) 导入镜像后发现标签是none的,用如下命令修改标签tag:docker tag 容器ID niunanblog:20190525(niunanblog是REPOSITORY,20190525是TAG)进入容器命令: docker exec -it 容器ID bash把容器中的某个文件复制到外面服务器:docker cp cd498f5d35d1:/app/appsettings.json /tmp/niunandemo.json反之也一样:docker cp /tmp/niunandemo.json cd498f5d35d1:/app/appsettings.json 先在docker中下载相关镜像:docker pull microsoft/dotnet:2.2-aspnetcore-runtime和docker pull microsoft/dotnet:2.2-sdk LINUX命令:服务器上查看linux发行版本:lsb_release -a服务器上安装nginx: yum install nginx服务器上安装docker: https://docs.docker.com/install/linux/docker-ce/centos/ (注:不要使用yum install docker)服务器上安装mysql:yum install mysql(注:该命令运行后mysql -u root -p 并不能登录,还需要输入命令yum install mariadb-server 安装这个玩意才能登录 http://blog.niunan2.ml/blog/show/1251)在服务器上可用命令检测网站是否生效命令:curl http://localhost:8003 (返回HTML)查找软件路径:which nginx全盘查找(先切换到根目录 cd /):find -name nginx复制文件: cp 原文件名 新文件名检测nginx配置文件是否有错误:nginx -t重启nginx:nginx -s reload 记得上华为云控制里的安全组开放80端口及3306端口 AntDeploy一键部署插件:https://github.com/yuzd/AntDeployAgent 视频目录:(总时长:2小时40分钟)牛腩学docker简记1 199M 50分钟 2019年05月24日牛腩学docker简记2 355M 43分钟 2019年05月24日牛腩学docker简记3 375M 47分钟 2019年05月25日 牛腩学docker简记4 183M 20分钟 2019年05月25日 视频观看地址:https://www.bilibili.com/video/av53491599如需要网盘下载请联系:niunan@2008.sina.com
很久以前学过一段时间的docker,那时装了电脑卡得受不了,学了一会就卸载了,最近电脑又装上了docker,感觉好像没有以前这么卡了,还是同一台电脑surface pro4, 试了一下visual studio中做的网站运行在docker上,下面是一些简记 环境:win10 + docker desktop + visual studio 2017 + mysql , 其中MYSQL是安装在c:/mysql 里的 打开visual studio 网站项目,在Niunan.Blog.Web项目上右键添加doker支持,选linux 支持, 会生成Dockerfile文件 直接点那个绿三角图标运行,结果等了好久好久,卡在那个界面上 原来是docker正在下载底层的包的,会很慢很慢,可以先停掉VS。然后在cmd命令行下运行 docker pull microsoft/dotnet:2.2-aspnetcore-runtime 和 docker pull microsoft/dotnet:2.2-sdk 然后再点绿三角图标运行,运行成功了,弹出浏览器了,不过显示不了 后来发现是我Program.cs代码里用了useurl了,因为之前我是做了N个网站,都部署在一台linux服务器上的,所以给每个网站都分配了一个自定义的端口的,DOCKER运行的时候又自动分配了一个32768端口,可能冲突了吧,把这一行注释掉,运行就正常了 运行界面显示正常了,但是在连接数据库的时候又出错了 数据库连接字符串是 localhost 的,这个在docker里连接不了的,必须得写成本地的IP地址,如192.168.0.110, 可从cmd窗口里用ipconfig查看 然后可以先在本地打开sqlyog,用192.168.0.110连接看看能不能连接上数据库,不能的话还得改那个mysql数据库里的users表里的root用户的localhost改为%, 然后再试就可以用192.168.0.110连接上数据库了 改好项目里的数据库连接字符串,再运行docker项目,界面显示出来了,数据库也连接上了,yeah~~ 后续计划,把本地docker那个网站的镜像导出成zip,再传到linux服务器上用docker运行,再服务器上用nginx转发绑定不同的域名,在浏览器里测试 然后配置vs插件antdeploy插件,能够直接在VS里发布镜像并自动上传到linux服务器上部署起来,再把整个流程录成视频~~~
如图,需要在wpf中的datagrid的操作那列有个确认按钮,然后在某些条件下确认按钮可见,某些情况下不可见的,放在mvc里直接在cshtml页面中if..else就行了。 但是在wpf里不行。。网上搜索了好久才找到解决方法,原来只是binding那个visiable属性就行了,
跟着《WPF专业编程开发指南》这书打的代码的,自己在正式项目中测试通过,可以抓取到全局的异常,用的log4net来记录日志 核心代码: 写在App.xaml.cs中 /// <summary> /// App.xaml 的交互逻辑 /// </summary> public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); this.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException); } void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { Common.Log.Error($"抓到未知异常:",e.Exception); } }
重装农药第16天!! jquery裁剪图片插件cropit示例背景:做的手机网页项目,用html file控件上传图片,有些手机拍照后图片会很大,20M以上的,用之前的H5 formdata上传的话有时会非常慢的,就想着能不能在选择图片的时候直接在客户端处理下,把选择的图片按规格的大小裁剪掉,上网搜索了一下,发现cropit这个玩意,自己FQ进官网下载示例弄了下,成功实现想要的功能 原图:25M 裁剪后:175K http://blog.niunan.net/jquery_caijian/index.html 源码下载: http://image.niunan.net/jq%E8%A3%81%E5%89%AA%E6%8F%92%E4%BB%B6cropit%E7%A4%BA%E4%BE%8B.7z javascript
ASP.NET CORE下运行CMD命令,用以前的ASP.NET 的命令System.Diagnostics.Process.Start("notepad");这样是可以运行出记事本的, 现在公司的C++大神开发了个EXE,需要放在服务器上,然后当访问服务器上的某个网页的时候就执行这个EXE了。。 传到服务器上,在服务器上运行 d:/temp/cm/cm.exe -url=http://baidu.com ,成功运行的,其中后面 -url=xxx是传过去的参数的 放在.NET CORE下运行:System.Diagnostics.Process.Start("d:/temp/cm/cm.exe -url=http://baidu.com");结果显示找不到文件,但是明明路径都是正确的,上网查了下,可能是权限的问题,我把cm目录全设置为everyone了,再运行测试,结果还是不行。。 再上网找啊找啊找啊,终于能运行了: //执行CMD命令 public ActionResult OpenNotepad() { string[] cmd = webinfo.mobilepay_cmd.Split(" "); // 数组 元素1,命令全路径d:/cm/cm.ext 元素2,参数 -url=http://163.com string cmd2 = cmd[1].Replace("{phone}", "13607886582").Replace("{amount}","10"); log.Info($"\r\n运行CMD命令:{cmd[0]} {cmd2}"); var psi = new System.Diagnostics.ProcessStartInfo(cmd[0], cmd2); System.Diagnostics.Process.Start(psi); return Content("hello niunan..."); }
网上下载的用EF做的小项目,结果没有配有数据库的,用VS打开来看了一下,看到Migrations文件夹,应该可以用EF命令来生成这个数据库了 打开appsettings.json文件,可以看到他用了三个数据库的,我把他的三个数据库连接字符串都改为一样的,先在本地数据库里创建一个空白的数据库efdemo 在visual studio里的程序包管理器控制台运行 Update-Database ,结果总是失败,而且每次失败原因都不同的,我清理了好几次解决方案,又再重新生成,再重新运行Update-Database 命令,才看到比较容易理解的错误原因:More than one DbContext was found. Specify which one to use. Use the '-Context' parameter for PowerShell commands and the '--context' parameter for dotnet commands.意思应该是有多个dbcontext,然后在update的时候需要指定dbcontext的, 上网查了一下,需要在外面power shell里运行命令dotnet ef database update -c xxxxDbContext就行了,他就会在appsettings.json里的那个数据库连接上的数据库里创建相应的表了 然后再运行项目就不会报那个数据库找不到的错误了
花了一晚上研究出来的,感觉还行吧。。。 代码: 源码下载: http://image.niunan.net/animatedemo.zip
之前用ASP.NET CORE做的项目 加了一个新功能,数据库加了个字段balabala.... 更新到服务器上,新功能测试正常,然后就没管了..... 今天客户说网站有BUG,某个页面打开后出错了,以前是正常的,上去看了下,是控制器里的代码出异常了..... 就想到加了新功能后除了本地运行每个链接都点一下手工测试有没有错误的,能不能全由程序来测试,于是想到了单元测试 靠搜索补了一下单元测试的基础知识,按网上的示例跟着做,先试着写个测试DAL增删改方法的, 测试通过了,然后再按网上找到的文章 https://www.cnblogs.com/yubaolee/p/DotNetCoreUnitTest.html 写测试控制器的,结果报错: 看上面的错误以为是那个appsetting.json没有COPY到单元测试项目中,copy过去后设置为始终复制,结果还是不行,后来试着在nuget里搜索安装 microsoft.aspnetcore.server.kestrel, 安装后再运行,然后又是另一个错误,同样的是‘系统找不到指定的文件“,只是换了个包名 microsoft.aspnetcore.xxxxxx 上网又搜索了一下,看到别人说直接nuget搜索microsoft.aspnetcore.all即可,但是我试着做了,结果还是不行,原因我猜也许是因为之前的项目是用CORE 2.1来做的,而nuget里的microsoft.aspnetcore.all只有2.2版本的, 没办法,只能每在nuget里安装一个包后运行一次测试,一个包一个包的装上,最后在装了N个包后,再测试终于测试成功通过了!!!不容易啊!!!!-_-!!!!!!!以上写的测试也许不对,没有 assert什么的,但好像对我来说行了,我只需要测试控制器出不出异常就好了。。
花了一天时间把MSSQL里的数据导出到MYSQL, 好麻烦,二个数据库都是阿里云买的云服务器。 先上阿里云控制面板,备份下MSSQL数据库,下载备份下来,在本地电脑上还原 2.本地MSSQL数据库上执行select * into aaa from order where createtime>='2018-11-12 00:00:00' and createtime<='2018-11-13 00:00:00', 把一天的数据导出到新表aaa中,其中aaa是不存在,存在aaa表的话会报错 3.本地数据库上对aaa表生成脚本,只生成数据,生成的文件中把[]符号替换为空字符串,GO替换为;,insert aaa 替换为insert into order,N'替换为' 4.替换好的SQL保存,先在本地MYSQL上试运行下能不能导入,我用heidisql的加载SQL脚本,可以直接运行的,运行前先点一下工具栏里的那个忽略错误提示继续导入 5.本地测试成功的话把SQL脚本文件用远程桌面存到服务器上,在服务器上运行heidisql,再导入sql脚本就行了 6.从第2步开始重复,一天一天的导入数据,之所以一天一天导出,因为受限于电脑配置的,订单表一天的数据大概是1W左右,导出成inser 语句后大概是20M左右,替换文本什么的都正常,我试过导出二天的数据2W多,结果在保存成sql文件的时候卡死了... 7.之所以以上这些操作不在远程桌面上的数据库里操作,因为远程服务器是Sql server2012数据库的,我发现在上面操作导出订单表数据的时候,那个时间字段是 cast(0x648989ABCDEFD as DateTime) 这样子的,这个在MYSQL上执行不了,本地的数据库是sql server2016, 导出的时候时间字段是 cast('2018-11-13T12:00:00' as DateTime)这样子的,这个在MYSQL上可以直接执行
把以前的ASP.NET MVC的项目改成用.NET CORE来写,写好了部署上去了,结果问题一大堆,今天慢慢检查了一下,发现一个大坑: 写控制器里的方法接收参数数都是直接写在控制器的方法参数里的,如: public ActionResult CallBack(string msg, string orderno){ ...... } 这样的话不管是在浏览器里打http://localhost/aaa/callback?msg=success&orderno=3231354 还是在postman中用POST调用传msg和orderno参数也能接收到 然后用ASP.NET MVC的项目的时候,第三方发送通知到我的这个方法里,我能接收到msg和orderno参数, 但是用ASP.NET CORE的项目的时候,第三方发送通知到我的这个方法里,我接收不到msg和orderno参数, 都是相同的上面那一段代码的 找了好久才发现问题所在,原来第三方发送通知到这个方法里传参数不是通过get传msg=success&orderno=3231354,也不是通过POST传msg和orderno参数的,而是通过POST直接把一个JSON字符串: { "msg":"success", "orderno":"55474969" } 给传过来的, 然后自己在postman中测试了一下,asp.net mvc的就正常能接收到,但是asp.net core的就接收不到 000.png 111.png 要改的话就只能改ASP.NET CORE的代码,不在方法参数里写,自己写代码从POST过来的数据流中把JSON字符串取出来,再用JSON.NET转为对象再用就行了!!!
用以前放在牛腩公用类库里的IPSearch就行了,编译没有错误,不过直接用发现中文乱码,一通乱改才发现问题,看最后的ReadString方法 , using System; using System.Collections.Generic; using System.Text; using System.IO; namespace Niunan.WebAssign.Util { ///<summary> /// 提供从纯真IP数据库搜索IP信息的方法; /// 感谢LumaQQ提供纯真IP数据库格式文档; /// ----HeDaode 2007-12-28 四川教育学院 ///</summary> internal class IPSearch { FileStream ipFile; long ip; string ipfilePath; ///<summary> /// 构造函数 ///</summary> ///<param name="ipfilePath">纯真IP数据库路径</param> public IPSearch(string ipfilePath) { this.ipfilePath = ipfilePath; } ///<summary> /// 地理位置,包括国家和地区 ///</summary> public struct IPLocation { public string country, area; } ///<summary> /// 获取指定IP所在地理位置 ///</summary> ///<param name="strIP">要查询的IP地址</param> ///<returns></returns> public IPLocation GetIPLocation(string strIP) { ip = IPToLong(strIP); ipFile = new FileStream(ipfilePath, FileMode.Open, FileAccess.Read); long[] ipArray = BlockToArray(ReadIPBlock()); long offset = SearchIP(ipArray, 0, ipArray.Length - 1) * 7 + 4; ipFile.Position += offset;//跳过起始IP ipFile.Position = ReadLongX(3) + 4;//跳过结束IP IPLocation loc = new IPLocation(); int flag = ipFile.ReadByte();//读取标志 if (flag == 1)//表示国家和地区被转向 { ipFile.Position = ReadLongX(3); flag = ipFile.ReadByte();//再读标志 } long countryOffset = ipFile.Position; loc.country = ReadString(flag); if (flag == 2) { ipFile.Position = countryOffset + 3; } flag = ipFile.ReadByte(); loc.area = ReadString(flag); ipFile.Close(); ipFile = null; return loc; } ///<summary> /// 将字符串形式的IP转换位long ///</summary> ///<param name="strIP"></param> ///<returns></returns> public long IPToLong(string strIP) { byte[] ip_bytes = new byte[8]; string[] strArr = strIP.Split(new char[] { '.' }); for (int i = 0; i < 4; i++) { ip_bytes[i] = byte.Parse(strArr[3 - i]); } return BitConverter.ToInt64(ip_bytes, 0); } ///<summary> /// 将索引区字节块中的起始IP转换成Long数组 ///</summary> ///<param name="ipBlock"></param> long[] BlockToArray(byte[] ipBlock) { long[] ipArray = new long[ipBlock.Length / 7]; int ipIndex = 0; byte[] temp = new byte[8]; for (int i = 0; i < ipBlock.Length; i += 7) { Array.Copy(ipBlock, i, temp, 0, 4); ipArray[ipIndex] = BitConverter.ToInt64(temp, 0); ipIndex++; } return ipArray; } ///<summary> /// 从IP数组中搜索指定IP并返回其索引 ///</summary> ///<param name="ipArray">IP数组</param> ///<param name="start">指定搜索的起始位置</param> ///<param name="end">指定搜索的结束位置</param> ///<returns></returns> int SearchIP(long[] ipArray, int start, int end) { int middle = (start + end) / 2; if (middle == start) return middle; else if (ip < ipArray[middle]) return SearchIP(ipArray, start, middle); else return SearchIP(ipArray, middle, end); } ///<summary> /// 读取IP文件中索引区块 ///</summary> ///<returns></returns> byte[] ReadIPBlock() { long startPosition = ReadLongX(4); long endPosition = ReadLongX(4); long count = (endPosition - startPosition) / 7 + 1;//总记录数 ipFile.Position = startPosition; byte[] ipBlock = new byte[count * 7]; ipFile.Read(ipBlock, 0, ipBlock.Length); ipFile.Position = startPosition; return ipBlock; } ///<summary> /// 从IP文件中读取指定字节并转换位long ///</summary> ///<param name="bytesCount">需要转换的字节数,主意不要超过8字节</param> ///<returns></returns> long ReadLongX(int bytesCount) { byte[] _bytes = new byte[8]; ipFile.Read(_bytes, 0, bytesCount); return BitConverter.ToInt64(_bytes, 0); } ///<summary> /// 从IP文件中读取字符串 ///</summary> ///<param name="flag">转向标志</param> ///<returns></returns> string ReadString(int flag) { if (flag == 1 || flag == 2)//转向标志 ipFile.Position = ReadLongX(3); else ipFile.Position -= 1; List<byte> list = new List<byte>(); byte b = (byte)ipFile.ReadByte(); while (b > 0) { list.Add(b); b = (byte)ipFile.ReadByte(); } return Encoding.GetEncoding("GB2312").GetString(list.ToArray());//.net core下用这个,要不然会出中文乱码 //return Encoding.Default.GetString(list.ToArray()); //.netframework下用这个 } } }
WPS打开CVS文件,发现里面的长串数字订单号后4位全变成0了,而且是以科学计数法来显示了 上网查了下,不能直接打开,得先在WPS(OFFICE中也一样)中新建一个空白表格,然后用菜单里的数据导入功能, 导入CVS,以,分隔,再选择文本格式的就叫好了。。
做一项目,用到“叫号功能”,网页上有一“叫号”按钮,点击后就读数据库中存的号码,如123号, 然后就发声音出来, 思路是网上下载0123456789的叫号声音,然后按钮点击事件里就在JS里写用那个HTML5的video来播放声音就行了,顺序播放声音的话就得用到Setinterval隔一段时间来播放声音的, 网上搜索了一下,终于做出个简单的示例了: 上面的四个按钮分别播放4种声音 下面的在文本框里输入数字后,再点播放,会按顺序来进行播放的。 源码下载:http://image.niunan.net/H5%E9%9F%B3%E9%A2%91%E6%92%AD%E6%94%BE%E7%A4%BA%E4%BE%8B.zip 下面的代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>js播放音频测试</title> </head> <body> <div> <button type="button" onclick="bo1()">播放1</button> <button type="button" onclick="bo2()">播放2</button> <button type="button" onclick="bo3()">播放3</button> <button type="button" onclick="bo4()">播放4</button> </div> <div> 只能输入1,2,3,4 这几个数字的组合: <input placeholder="如:4213" type="text" id="txt" /> <input type="button" value="播放" onclick="bofang()" /> </div> <script> var timeoutindex; var index=0; var arr; //分隔出来的字符数组 function bo1(){ console.log("进入bo1"); var audio=new Audio("1.mp3");//路径 audio.play(); } function bo2(){ console.log("进入bo2"); var audio=new Audio("2.mp3");//路径 audio.play(); } function bo3(){ console.log("进入bo3"); var audio=new Audio("3.mp3");//路径 audio.play(); } function bo4(){ console.log("进入bo4"); var audio=new Audio("4.mp3");//路径 audio.play(); } function bofang(){ var str = document.getElementById('txt').value; arr = str.split(""); timeoutindex= setInterval("bobo()",1000); } function bobo(){ eval("bo"+arr[index]+"()"); index++; if(index>=arr.length){ index=0; clearInterval(timeoutindex); } } </script> </body> </html>
许久不开家里的MAC MINI了,今天开来玩玩,结果进个桌面连接鼠标就费了好大的劲 现实情况: 1. 没有有线鼠标,只有一个USB键盘,一个微软3600蓝牙鼠标 MAC MINI连接上USB键盘,开机,进入桌面,蓝牙鼠标开启检测状态,结果MAC弹出总是检测不到 按他上面的提示,按WIN+Q关闭窗口,但是没有作用,不知道怎么回事,然后乱按键盘,不懂按了什么鬼,再按一次WIN+Q ,又能关闭这个窗口了, 费了好大的劲,手机又上网查MAC的快捷键,才弄出来 , 1. 进入到桌面,到那个有选择头像的界面,按键盘上的方向键选择登录账户,方向键选择不了的就乱按键盘,好像是按N次tab什么的。。然后再按方向键就能选择登录头像了,按回车后进入密码输入界面 2. 输入密码,再按回车就能登录进桌面了,注:如果在按方向键的时候有那个弹出来 说什么什么蓝牙鼠标检测不到的,一定得想办法关掉那窗口,要不然不知道你有没有选择中头像的 3. 进入桌面后,按WIN+F,打开findder,这时光标是定位到搜索框的,直接输入““系统编好””,下面会搜索出一大堆东西的,按tab键切换到下面,向下向下找,就能找到系统偏好设置了 4. 用方向键选择中系统偏好设置,按WIN+O,就打开了,光标又会定位到搜索框,输入蓝牙,按方向箭头下,回车就能打开蓝牙检测面板了 5. 打开蓝牙鼠标的配对,这时MAC上的蓝牙检测面板就会检测到了,按tab键切换到那个,按回车,就连接上蓝牙鼠标了
using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; namespace Niunan.BamaTZ.Web.Models { public static class RequestExtensions { //regex from http://detectmobilebrowsers.com/ private static readonly Regex b = new Regex(@"(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino", RegexOptions.IgnoreCase | RegexOptions.Multiline); private static readonly Regex v = new Regex(@"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-", RegexOptions.IgnoreCase | RegexOptions.Multiline); public static bool IsMobileBrowser(this HttpRequest request) { var userAgent = request.UserAgent(); if ((b.IsMatch(userAgent) || v.IsMatch(userAgent.Substring(0, 4)))) { return true; } return false; } public static string UserAgent(this HttpRequest request) { return request.Headers["User-Agent"]; } } } 下面是使用方法: bool b = Models.RequestExtensions.IsMobileBrowser(HttpContext.Request); if (b) { return Redirect("/m/home/index"); }
做的CORE项目中用到H5上传,把以前的MVC代码复制过来得修改一下才能用在.NET CORE中
用.NET CORE做项目,VS里编译碰到‘。。。。包降级。。。。’错误本地开发机:WIN10+VS2017 15.7.3 ,用CORE2.1版本的建立一个项目,做好了,传到gitee上今天有新同事来,新电脑,win7,还没有开发环境,叫他安装了VS2017,直接从官网上下载的,然后从gitee上克隆我的项目到本地,附加上数据库,在VS中运行,结果报错‘。。。。包降级。。。。’错误。。开始以为是core sdk没有安装上的,上官网上把core sdk下载装上,再运行还是报这个错误, 直接在cmd窗口下在项目目录中运行dotnet run,还是报那个错误可是相同的代码在我的本地上是运行好好的,dotnet run也能运行起来,郁闷死。。。 费了好大的劲才解决了,原来还真TM是版本的问题。1. 在我的WIN10机子上CMD里输入dotnet -V,显示的是2.1.300 版本,项目里用到Microsoft.AspNetCore.Session,nuget中安装最新的Microsoft.AspNetCore.Session 2.1.1版本是装不上的,我当时装了Microsoft.AspNetCore.Session 2.1.0版本,就能装上了,也能使用session 2. 到同事的win7机子上的cmd里输入dotnet -V,结果显示的是 2.1.301版本,VS是 VS2017.15.7.4版本,结果在这个版本下的Microsoft.AspNetCore.Session 2.1.0是无效的,后来我直接在同事机子上在nuget里把Microsoft.AspNetCore.Session升级到最新的2.1.1版本,这时能安装上了,然后再编译也通过了3. 对应的我本地的WIN10也要跟着升级到VS2017 15.7.4版本了,然后再从官网上下载CORE SDK 2.1.301安装才行了!!!
用VS2012建立core2.1网站项目后引用Microsoft.AspNetCore.Session不了 做个.NET CORE的新项目,和往常一样,VS2017新建CORE项目(CORE2.1),NUGET引入session,结果引入不了,说什么版本不对应的,把SESSION降了一个版本,可以安装上了,但是用不了。、、 上网搜索,stackoverflow搜索到了,结果是CORE2.1的项目模板里的Startup得改下 stackoverflow还是厉害啊。。。不过得一面看一面翻英文字典才行。。 https://stackoverflow.com/questions/49317304/asp-net-core-2-1-session
MUI没有内置的那个弹出转圈圈的那个等待框,那个nativeui.showwaiting是只能用于app中的,不能用在H5网页中的,网上找了下,找到个别人已经写好的,自己 测试了下没问题,先记下来 @{ Layout = null; Niunan.GRWX.Model.Product product = ViewBag.product; Niunan.GRWX.Model.Userinfo user = ViewBag.user; } <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>兑换礼品</title> <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <link href="/content/css/mui.min.css" rel="stylesheet" /> <link href="/content/css/theone.css" rel="stylesheet" /> <style> html, body { background-color: #efeff4; } .title { padding: 20px 15px 10px; color: #6d6d72; font-size: 15px; background-color: #fff; } </style> <style> /*----------------mui.showLoading---------------*/ .mui-show-loading { position: fixed; padding: 5px; width: 120px; min-height: 120px; top: 45%; left: 50%; margin-left: -60px; background: rgba(0, 0, 0, 0.6); text-align: center; border-radius: 5px; color: #FFFFFF; visibility: hidden; margin: 0; z-index: 2000; -webkit-transition-duration: .2s; transition-duration: .2s; opacity: 0; -webkit-transform: scale(0.9) translate(-50%, -50%); transform: scale(0.9) translate(-50%, -50%); -webkit-transform-origin: 0 0; transform-origin: 0 0; } .mui-show-loading.loading-visible { opacity: 1; visibility: visible; -webkit-transform: scale(1) translate(-50%, -50%); transform: scale(1) translate(-50%, -50%); } .mui-show-loading .mui-spinner { margin-top: 24px; width: 36px; height: 36px; } .mui-show-loading .text { line-height: 1.6; font-family: -apple-system-font,"Helvetica Neue",sans-serif; font-size: 14px; margin: 10px 0 0; color: #fff; } .mui-show-loading-mask { position: fixed; z-index: 1000; top: 0; right: 0; left: 0; bottom: 0; } .mui-show-loading-mask-hidden { display: none !important; } </style> </head> <body> <div class="mui-content user-password user-addcard"> <form class="mui-input-group" style="margin-top: 0;"> <div class="mui-input-row"> <label>礼品名称</label> <span style="line-height:38px;">@product.proname</span> </div> <div class="mui-input-row"> <label>用户名</label> <span style="line-height:38px;">@user.username</span> </div> <div class="mui-input-row"> <label>手机</label> <input type="text" class="mui-input-clear" id="mobile" name="mobile" value="@user.mobile" /> </div> <div class="mui-input-row"> <label>收货地址</label> <input type="text" class="mui-input-clear" id="address" name="address" value="@user.address" /> </div> <div class="enterbtn-wr"> <button type="button" class="mui-btn mui-btn-danger enterbtn" id="btn1">兑换礼品</button> @Html.AntiForgeryToken() <input type="hidden" id="proid" value="@product.id" /> <input type="hidden" id="userid" value="@user.id" /> </div> </form> </div> <script src="~/Scripts/jquery-1.10.2.min.js"></script> <script src="~/Scripts/mui.min.js"></script> <script> //扩展mui.showLoading http://ask.dcloud.net.cn/article/12856?item_id=12464 (function ($, window) { //显示加载框 $.showLoading = function (message, type) { if ($.os.plus && type !== 'div') { $.plusReady(function () { plus.nativeUI.showWaiting(message); }); } else { var html = ''; html += '<i class="mui-spinner mui-spinner-white"></i>'; html += '<p class="text">' + (message || "数据加载中") + '</p>'; //遮罩层 var mask = document.getElementsByClassName("mui-show-loading-mask"); if (mask.length == 0) { mask = document.createElement('div'); mask.classList.add("mui-show-loading-mask"); document.body.appendChild(mask); mask.addEventListener("touchmove", function (e) { e.stopPropagation(); e.preventDefault(); }); } else { mask[0].classList.remove("mui-show-loading-mask-hidden"); } //加载框 var toast = document.getElementsByClassName("mui-show-loading"); if (toast.length == 0) { toast = document.createElement('div'); toast.classList.add("mui-show-loading"); toast.classList.add('loading-visible'); document.body.appendChild(toast); toast.innerHTML = html; toast.addEventListener("touchmove", function (e) { e.stopPropagation(); e.preventDefault(); }); } else { toast[0].innerHTML = html; toast[0].classList.add("loading-visible"); } } }; //隐藏加载框 $.hideLoading = function (callback) { if ($.os.plus) { $.plusReady(function () { plus.nativeUI.closeWaiting(); }); } var mask = document.getElementsByClassName("mui-show-loading-mask"); var toast = document.getElementsByClassName("mui-show-loading"); if (mask.length > 0) { mask[0].classList.add("mui-show-loading-mask-hidden"); } if (toast.length > 0) { toast[0].classList.remove("loading-visible"); callback && callback(); } } })(mui, window); </script> <script> document.getElementById('btn1').addEventListener('tap', function () { var userid = document.getElementById('userid').value; var proid = document.getElementById('proid').value; var mobile = document.getElementById('mobile').value; var zipcode = ''; var address = document.getElementById('address').value; var __RequestVerificationToken = document.getElementsByName('__RequestVerificationToken')[0].value; var postdata = { userid: userid, proid: proid, mobile: mobile, zipcode: zipcode, address: address, __RequestVerificationToken: __RequestVerificationToken }; console.log(postdata); var url = "/order/add"; mui.showLoading("正在提交..", "div"); mui.post(url, postdata, function (data) { mui.hideLoading(function () { });//隐藏后的回调函数 if (data.code == 0) { mui.alert(data.msg, function () { location.href = "/userinfo/index" }); } else { mui.alert(data.msg); } }, 'json') }) </script> </body> </html>
做项目的时候需要用到的功能,一个页面上,左边是各个地点,右边是地图,一开始把所有的点全都标注在地图上,点左边的每个地点后地图移动到以该点为中心,点击地图上的坐标点会显示出相关的信息, 对着百度地图的文档一点一点做出来了,先记下来,以作备用!!! <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>百度地图-多个坐标点一起显示</title> <style type="text/css"> #allmap {width: 100%;height: 600px;overflow: hidden;margin:0;font-family:"微软雅黑";} </style> </head> <body> <table style="width:100%"> <tr> <td style="width:250px;"> <ul> <li><a href="javascript:void(0)" onclick="to(116.404,39.915)">水厂1</a></li> <li><a href="javascript:void(0)" onclick="to(116.383752,39.91334)">水厂2</a></li> <li><a href="javascript:void(0)" onclick="to(116.384502,39.932241)">水厂3</a></li> </ul> </td> <td> <div id="allmap"></div> </td> </tr> </table> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=SyRux96r0i0Xue1Qqp0ZPb4uCc8BC6Aw"></script> <script type="text/javascript"> // 百度地图API功能 var map = new BMap.Map("allmap"); var point = new BMap.Point(116.404, 39.915); map.centerAndZoom(point, 15); var json_data = [[116.404,39.915,'水厂1<br />地址:中华路1号'],[116.383752,39.91334,'水厂2<br />地址:兴宁路13号'],[116.384502,39.932241,'水厂3<br />地址:友爱路3-5号']]; var pointArray = new Array(); var opts = { width : 250, // 信息窗口宽度 height: 80, // 信息窗口高度 title : "" , // 信息窗口标题 enableMessage:true//设置允许信息窗发送短息 }; for(var i=0;i<json_data.length;i++){ var marker = new BMap.Marker(new BMap.Point(json_data[i][0], json_data[i][1])); // 创建点 map.addOverlay(marker); //增加点 pointArray[i] = new BMap.Point(json_data[i][0], json_data[i][1]); var content = json_data[i][2]; addClickHandler(content,marker); } //让所有点在视野范围内 map.setViewport(pointArray); function addClickHandler(content,marker){ marker.addEventListener("click",function(e){ openInfo(content,e)} ); } function openInfo(content,e){ var p = e.target; var point = new BMap.Point(p.getPosition().lng, p.getPosition().lat); var infoWindow = new BMap.InfoWindow(content,opts); // 创建信息窗口对象 map.openInfoWindow(infoWindow,point); //开启信息窗口 } //移动到某一坐标点 function to(x,y){ map.panTo(new BMap.Point(x,y)); } </script> </body> </html>
以前做的CORE1.0的项目,发布的时候有views文件夹的,升级VS后用CORE2.0做项目,发布后没有views文件夹了,全编译到一个类似于Niunan.ZYYCY.Web.PrecompiledViews.dll中,上网搜索下没有搜索到,在群里问下,找到原因了,修改Niunan.ZYYCY.Web.csproj,在PropertyGroup下加入 false这样在发布的时候就会有views文件夹了后台网友又发了个地址,原来早就有人碰到过了。。https://www.cnblogs.com/qulianqing/p/8252864.html
一个项目,预约系统,核心二张表:预约表,预约限额表 用户点击预约按钮后, 1. 先select 预约限额表把该预约时间段的限额取出来, 2. 再select 预约表把该预约时间已经预约上的次数算出来 3. 第一步减第二步,得到是否还能进行预约,大于0就可以预约了 4. 第三步里大于0的话就insert 预约表 之前的代码都是用ado.net+sql语句执行的,然后在正式运行的时候,每天18点可以进行预约,然后我设置了某一时间段是可以预约1个, 结果在18点的时候N个人点了预约,导致计算出预约数后想插入之前,另一个人又来计算预约数了,导致超出限额了 问了下网友,给了三种解决方案: 1. redis 2. c#里的lock 3. c#里的ConcurrentQueue 自己 测试了一下,用第二种 ,成功了, 第三种的话网友也给了个示例:
网上搜索到的,项目中正好用到,先记下来,以后直接从自己的博客上复制粘贴!!! //取单选框选择中的值,传入单选框的name function getRadioBoxValue(radioName) { var obj = document.getElementsByName(radioName); //这个是以标签的name来取控件 for (i = 0; i < obj.length; i++) { if (obj[i].checked) { return obj[i].value; } } return "undefined"; }
先记下来,以后用上了直接来这复制 string ip1 = HttpContext.Request.Headers["X-Real-IP"]; //取IP,NGINX中的配置里要写上 //var feature = HttpContext.Features.Get<IHttpConnectionFeature>(); //string ip2 = feature.RemoteIpAddress.ToString(); //string ip3 = HttpContext.Request.Headers["X-Forwarded-For"]; 代码在上面,如果是部署在LINUX上,用NGINX转发的,第二种IP获取方法就取不到了。。取到的只能是像是192.168.1.1这样的内网地址的
我在阿里云的win2016服务器上下载postgresql,结果怎么都装不上。 双击 Exe没有 任何 反映 。。 。。。 网上搜索不出。。在N个群里问 ,终于碰到有人和我一样的问题了。。原来是阿里云WIN2016的问题。。。需要右键exe属性,点‘解除锁定’,这样才能进行安装。。郁闷啊。。。
第一次学用微信小程序,项目需要,被逼着研究了一下,功能是调用微信小程序的蓝牙功能,连接上智能车位锁,控制升降,大概步骤及调用的小程序接口API如下: 1。打开蓝牙模块 wx.openBluetoothAdapter(OBJECT) 2。搜索附近蓝牙设备 wx.startBluetoothDevicesDiscovery(OBJECT) 3。获取发现的所有蓝牙设备 wx.getBluetoothDevices(OBJECT) 4。连接上蓝牙设备 wx.createBLEConnection(OBJECT) 5。获取设备所有服务 wx.getBLEDeviceServices(OBJECT) 6。获取设备某个服务中的所有特征值,记下能写数据的那个特征值 wx.getBLEDeviceCharacteristics(OBJECT) 7。向蓝牙设备发送升/降指令 wx.writeBLECharacteristicValue(OBJECT) 8。关闭蓝牙模块 wx.closeBLEConnection(OBJECT) 注意事项:厂商会给你个设备的通讯协议的文档,里面写有发送什么指令是控制升,什么指令是控制降,然后还有哪个特征值是可以发送指令的,一个设备下有多个服务,每个服务下又有多个特征值,有些是不能发送指令的,可以用微信小程序开发工具里的远程调试,console.log()打印出来一个一个看看 源码:https://coding.net/u/niunan/p/wxapp_bluesuo/git?public=true
苹果的APP不通过app store的话就只能是要那个$299的企业签名证书了。这个我还不会搞,没有搞过!!! 别人已经帮忙签名好的ipa,自己再传到自己的服务器上让人下载安装,步骤如下: Hbuider IDE中用MUI开发APP,测试成功后直接用菜单里的生成开发包,苹果那里勾选越狱包,生成,等一会就会有ipa(xxx.ipa)包生成好了 把生成的IPA包发给BOSS好友(他有那个$299的苹果企业账号),他生成签名后的IPA包(xxx-resigned.ipa)给我,怎么生成的其实我并不知道。。也是我很想学的。。唉。。。没有企业证书啊。。郁闷。。 自己的域名和服务器已经是现成的,去腾讯云申请了一个免费的SS证书,根据里面的指引弄好,https://www.xxx.com 可以访问 http://blog.csdn.net/pzlsun/article/details/52080491 按这里的弄好下载页 https://www.xxx.com/download/index.html, 还有那个app.plist 文件,app.plist文件里的ipa路径 是https://www.xxx.com/download/app-resigned.ipa ,记得传到服务器上 在苹果手机上的safri浏览器上访问 https://www.xxx.com/download/index.html ,点击后一般会出现错误, 按http://blog.csdn.net/shuaihj/article/details/49999529这里的设置改改,主要是iis的mine和plist的编码问题的, 弄好后自己先在电脑浏览器上输入 https://www.xxx.com/download/app.plist 和https://www.xxx.com/download/app-resigned.ipa 看看是否能看到XML文件内容和下载IPA文件 再在苹果手机safri浏览器上输入https://www.xxx.com/donwload/index.html ,再点下载的时候就可以下载IPA访问了。。 只需要在手机设置里信任一下就能用这个APP了,注意在测试的时候safri浏览器有缓存的,得过一会才行。。要么就把plist文件改个名再重新刷新。。 注意下plist里的那个APPID要正好对应于HBUILDER中生成 IPA的时候显示的那个APPid 然后用自己的IPHONE测试,第三方浏览器是可以安装,如UC浏览器,QQ浏览器,但是一些浏览器又不能安装,如:夸克浏览器, 所以最好直接告诉客户用IPHONE自带的safri浏览器下载安装吧。。
2020年11月
2020年10月
2020年09月
2020年08月
2020年07月
2020年06月
-------------------------
我的是win2008的。。asp.net,jsp ,php的可以用IIS里弄。。网上也有相应的资料。但是其他 的语言我就不会了。。搜索不到怎么弄的。。