博客 (683)

了解使用 Visual Studio 创建的模板项目

启动 VS,从菜单项打开:文件 - 新建 - 项目,在已安装的模板中选择 .NET Core,选择 ASP.NET Core Web Application(.NET Core),给项目取个名称,确定。选择 Web 应用程序,确定。

· global.json: 你可以在这里放置解决方案的配置信息和工程之间的引用。作用类似于 *.sln 文件。

· Program.cs: 这个文件包含了 ASP.NET Core 应用的 Main 方法,负责配置和启动应用程序。

· src 文件夹: 包含组成你应用程序的全部项目代码。

· wwwroot: 你的静态文件将被放置在这个文件夹,它们都将作为资源直接提供给客户端,包含 HTML,CSS 和 JavaScript 文件。可以在 project.json 内重置。

· project.json: 包含项目设置。在 ASP.NET Core 中,你可以通过使用 NuGet 程序包管理工具(NPM)添加 NuGet 包或者编辑这个文件来管理从属。

· project.lock.json: 由 project.json 生成。

· Startup.cs 这个主要放置你 ASP.NET Core 的 stratup 和 configuration 代码。ConfigureServices 方法定义了你应用程序使用的服务,Configure 方法用来定义组成请求管道的中间件。

一些备注:

ASP.NET Core 项目中不能创建 Web 窗体页面(.aspx)

发布后的网站根目录是项目中的 /wwwroot 目录

路由在 Startup 的 Configure 方法中配置

xoyozo 9 年前
8,228

当用户向 <input> 或 <textarea> 输入时执行事件。

可用于统计输入字数,判断输入内容是否规范等。

对比事件对比事件特点oninput 事件特点
onkeypress获得当前字符输入前的内容,不能在右键操作时执行获得当前字符输入后的内容
onkeyup不能在右键操作时执行在任何情况的内容变化时执行
onchange在失去焦点时执行,而且值有所改变,推荐用在 <select> 上在输入时执行

但是通过 JS 来更改内容时不触发上述任何事件,不完美的解决方案是使用定时器。

IE8 及更早版本不支持 oninput,可以用 onpropertychange 代替。

BUG:在 IE9 的右键菜单剪切或删除中无效。

jQuery 例子:

$('#mytextarea').on('input propertychange', function () {
  console.log($(this).val().length);
});
xoyozo 9 年前
7,115
<input name="aaa" id="theinput" type="checkbox" />

// 选中它

$('input[name="aaa"]').prop("checked", true);

// 取消它

$('input[name="aaa"]').prop("checked", false);

// 顺便提一下将 select 选中首项

$("#ddl_types option:first").prop('selected', true);

// 获取选中的项

$('input[name="aaa"]:checked').each(function(){ });

// 获取项是否选中

$('#theinput').is(':checked')

$('#theinput').prop('checked')

theinput.checked

// 获取 radio 选中项的值

$('input[name="aaa"]:checked').val()
xoyozo 9 年前
8,831

本文适用且不限于 iTunes 12.5,在 Windows 上实现。

iPhone / iPad 的铃声文件是 .m4r 格式的,可以通过 iTunes 将 .mp3 /.wav 等其它格式的音乐文件转换成 .m4r 文件。

打开 iTunes

菜单栏选择:文件 - 将文件添加到资料库 - 从文件资源管理器中选择要作为铃声的音乐文件

如果要截取其中一段音乐作为铃声,则在资料库中右键该音乐 - 显示简介 - 选项,设置开始和停止时间,长度不能超过 40 秒

在资料库中将其选中,菜单栏选择:文件 - 转换 - 创建 AAC 版本

此时在资料库中会多出一个音乐来,右键单击,在 Windows 资源管理器中显示,我们可以看到以原音乐文件名命名的 .m4a 文件(如果看不到扩展名,则在菜单上点击 查看,选中“文件扩展名”即可)

将该文件扩展名改为 .m4r

铃声做好了,怎样导入到手机上呢?简单的答案是用 iTools,其实上面制作铃声的过程也可以用 iTools 一键实现,哈~哈哈~哈哈哈~

xoyozo 9 年前
5,664

对于大型站点,庞大的主题和帖子数据,分表放到一个主题表和一个帖子表中,已经成为影响性能的一个因素。因此,急需进行分表操作来避免 MySQL 对于大数据表的频繁操作。
1、后台分表
       Disucz! X2 后台重新调整了分表的机制,使得分表效率和后期站点性能得到提升。具体分表设置在 后台 -> 站长 -> 主题分表(帖子分表)。
      1)主题分表
           主题分表分为两种类型,一种为主表,一种为存档表。主表只有一个,存档表可以有多个。我们进行分表操作,首先进行创建存档表的操作,然后进行主题移动,将指定条件的主题移动到存档表中。
           a、创建存档表
                打开 source/admincp/admincp_threadsplit.php 文件,找到创建存档表的条件分支

  1. elseif($operation == 'addnewtable')

复制代码

              首先获取当前最大的主题表 id ,然后根据 forum_thread 的建表语句,生成新的存档表(id + 1),最后更新缓存。
          b、主题移动
               存档表建好后,下一步就是将主题移动到这个存档表中。在选择主题的时候,可以根据提供的搜索条件,特别是“更多选项”中的搜索条件,来转移符合条件的主题。这里主要是一个搜索的过程,转移数据的过程使用 REPLACE INTO … SELECT...FROM... 语句,比较简单。
      2)帖子分表
           帖子分表也是要分成两步,第一步先创建帖子分表,第二步转移数据。
           打开 source/admincp/admincp_postsplit.php 文件,找到帖子分表的条件分支

  1. elseif($operation == 'split')

复制代码

         如果是对主表进行分表操作,主表必须要大于400M,见下面的条件判断  

  1. if($status && ((!$tableid && $status['Data_length'] > 400 * 1048576) || ($tableid && $status['Data_length'])))

复制代码

        在站长提交分表表单后,程序会先根据 getmaxposttableid 函数获取当前帖子表最大的 id ,然后根据已有的帖子表结构,创建新分表,并更新缓存等信息。创建成功后,开始转移数据的操作。找到条件分支

  1. elseif($operation == 'movepost')

复制代码

,开始转移数据的操作。当从主表中转移数据时,是根据主题表中最后回复时间正序排列的主题 tid 来获取帖子数据的。  

  1. $query = DB::query("SELECT tid FROM ".DB::table($table)." WHERE posttableid='0' AND displayorder>='0' ORDER BY lastpost LIMIT 0, 1000");

复制代码

然后,利用 movedate 函数进行转移数据。
  当从从表中转移数据时,是根据给定帖子表的 id,获取此表中first=1的帖子所属 tid,  

  1. $query = DB::query("SELECT tid FROM ".DB::table(getposttable($fromtableid))." WHERE `first`='1' LIMIT 0, 1000")

复制代码

然后利用 movedate 函数进行转移数据。
  在 movedate 函数中,根据获取到的 tid ,将属于此 tid 的帖子,利用 INSERT INTO … SELECT … FROM ...来转移数据。在此过程中,更新主题表中 posttableid 这个字段,来标识帖子的存储表。
2、主题列表页分表读取
      在主题列表页,只能看到主题主表中的主题。存档表中的主题都在存档区。
      在这部分的代码(source/module/forum/forum_forumdisplay.php)中,所有涉及到的主题表都以 $threadtable 这个变量代替,$threadtable 这个变量的获取,又是根据用户是否查看存档区的标识 archiveid 来判定。
 

  1. $threadtable = $_G['gp_archiveid'] && in_array($_G['gp_archiveid'], $threadtableids) ? "forum_thread_{$_G['gp_archiveid']}" : 'forum_thread';

复制代码

当用户选择非存档内容时,archiveid = 0 或者不存在,这时,直接从 forum_thread 主表来读取主题列表。当用户选择存档内容时,archiveid = 1(1 表示存档表的 id,如果查看 id 为 2 的存档表,archiveid = 2),程序会根据 archiveid  来判断从哪个存档表中去获取主题列表。
3、帖子内容页分表读取
     当用户浏览帖子内容页时,程序首先利用 loadforum 函数来获取当前的主题信息。在 loadforum 函数中,

  1. $_G['thread'] = get_thread_by_tid($tid, '*', $addcondiction, $archiveid);

复制代码

根据提供的 tid,get_thread_by_tid 函数到主表和存档表中分表去查找,直到找到对应的主题信息。
在 source/module/forum/forum_viewthread.php 文件中,根据

  1. $thread = & $_G['forum_thread'];

复制代码

  1. $threadtable = $thread['threadtable'];
  2. $posttableid = $thread['posttableid'];
  3. $posttable = $thread['posttable'];

复制代码

这两句来判定该主题应该去哪个帖子表中去获取帖子内容列表。
4、发新主题
      发表新主题时,直接往主题主表中插入数据,对应的 posttableid = 0。然后,当插入帖子数据时,通过 insertpost 函数将数据插入帖子表中。
     在 insertpost 函数中,会先去判断所属主题的 posttableid 值,得到目标帖子表,然后再往该帖子表中插入帖子数据。
5、发新回复
     只有在主表的主题才能回复,因此,直接根据传递的tid去获取目标帖子表,然后插入数据。这个跟发新主题时,插入帖子内容过程相同。
6、编辑帖子
     同样,只有在主表中的主题的帖子才能被编辑,因此,主题都在 forum_thread 表中。需要获取的是该主题的帖子在哪个帖子表中。打开 source/include/post/post_editpost.php 文件,找到

  1. $posttable = getposttablebytid($_G['tid']);

复制代码

程序在开始,通过这条语句来获取目标帖子表。在 getposttablebytid 函数中,程序根据 tid ,逐个主题表进行查找,找到对应的主题信息,获取目标帖子表,然后指向后续的编辑帖子操作。
8、取消存档
     存在存档区的主题,如果想取消存档,可以通过页面底部的“取消存档”来执行。
     打开 source/include/topicadmin/topicadmin_restore.php 文件,可以看到取消存档,实际上仅是将放在存档表中的主题移动到了主表中。同样,存档表的获取还是通过 archiveid 这个参数来决定的。

  1. $threadtable = $archiveid ? "forum_thread_$archiveid" : 'forum_thread';

复制代码

从这可以看出,存档的概念仅限于主题,帖子无所谓存档的概念。

b
转自 beijing200808 15 年前
4,972

目前找到一种途径可以顺利把 Fireworks 或 Photoshop 的矢量图导出 / 转换为 CorelDRAW 的曲线:

Fireworks 中的路径如果不需要后期改变形状,最好都能够组合路径,以减少图层数,或者新建子层,把它们都拖进去。

  1. 在 Fireworks 中,另存为,选择 *.psd 格式
  2. 在 Photoshop 中,选中图层或子层,右键,复制 SVG
  3. 在桌面上新建一个文本文档,打开,粘贴,保存,关闭
  4. 将该文本文档更改后缀名为 .svg(此步可忽略)
  5. 将该文档拖到 CorelDRAW 窗口中即可
xoyozo 9 年前
8,609

将字符串作为文本文档输出:

Response.AddHeader("Content-Disposition", "attachment; filename=文件名.txt");
Response.Write(字符串内容);
Response.End();

直接提供服务器文件下载:

FileInfo thefile = new FileInfo(path);
Response.Clear();
Response.ClearHeaders();
Response.Buffer = false;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode("刮刮卡参与") + id + ".csv");
Response.AppendHeader("Content-Length", thefile.Length.ToString());
Response.WriteFile(thefile.FullName);
Response.Flush();
Response.End();

输出使用 NPOI 创建的 Excel(MemoryStream):

HSSFWorkbook book = new HSSFWorkbook();
……
MemoryStream ms = new MemoryStream();
book.Write(ms);
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", scene.d.drama + " " + scene.s.time_show.ToString("yyyy年MM月dd日HH时mm分")));
Response.BinaryWrite(ms.ToArray());
Response.End();
book = null;
ms.Close();
ms.Dispose();

最后,如果要指定文件编码,加上这句就行:

Response.ContentEncoding = Encoding.xxx;

 

xoyozo 9 年前
5,928

各位站长好:

 

根据苹果相关通知,从2017年1月1日起,所有上架AppStore的应用必须支持https协议。

仍然采用HTTP传输的站点APP,将无法在AppStore被用户下载使用,也无法进行升级更新等工作。

 

官方视频

https://developer.apple.com/videos/play/wwdc2016/706/

 

相关新闻

http://www.chinaz.com/news/2016/1028/602635.shtml

 

根据AppStore审核要求,站长需要在2017年1月1日之前,在APP服务器全面部署https。

尽管不升级支持https后果严重,但诸位也不必太过担心,马甲根据要求为各位提供一份服务器升级https的技术文档,供您参考。

 

https的优点:

1. 相对于http,https可以确保数据在网络传输过程中不被篡改(如禁止运营商插入广告),同时可以提升网站的安全性。

2.  iOS可以实现微信内部浏览器直接启动并打开App对应页面。

 

APP网站升级https步骤:

1. 为APP域名申请购买SSL证书(可选免费型);

2.  将SSL证书部署到APP站点。

 

https证书申请方法:

1. 进入阿里云(独立服务器客户可注册一个阿里云账号,无须购买阿里云主机)https证书申请页面 https://www.aliyun.com/product/security/markets/aliyun/product/cas

 

2. 购买https证书,选择免费类型,点击购买(无需实际付款)

 

3. 购买完成后,进入控制台-CA证书服务页面,找到证书订单,点击“补全”

 

4. 填写证书对应的域名信息,免费证书只能用于一个域名(请填写完整域名例如:test.magapp.cc 而不是 magapp.cc)

 

5. 继续补全证书信息,注意域名验证类型选择DNS,邮箱填写自己常用邮箱即可,稍后系统会往邮箱发送域名解析信息。

 

6. 下一步生成证书请求文件(CSR),这里建议选择“系统生成CSR”,点击右侧创建,创建完成后,点击提交审核,开始申请https证书。


 

7. 稍后系统会向邮箱发送一份该邮件,邮件包含需要在域名管理后台解析的信息。

 

8. 到域名管理后台添加新的域名解析,注意解析类型为CNAME

 

9. 添加新域名解析完成后,系统会对您的申请进行审核(审核时间在几分钟到几个小时不确定),如果审核成功系统会为你签发https证书,失败也会有相关原因说明,如果失败可根据提示重新申请。

 

10. https证书申请成功后,下一步就可以下载并部署到APP服务器。

 

11. 点击下载后,可以根据阿里云提供的部署文档,进行相关的服务器部署工作。

 

12. 部署完成后,验证是否部署成功

第一步:使用https协议访问域名是否能正常访问,例如 https://test.magapp.cc

第二步:在线检测域名是否满足苹果审核要求,网址为:https://www.qcloud.com/product/ssl.html#userDefined10

 

填写自己申请https的域名

 

如果域名检测各项满足会显示如下图所示

 

部署注意事项:

1. https使用的是443端口而不是默认的80端口,需要在wdcp安全管理-iptables开启443端口。

2. https免费证书有效期为一年,请各位站长作好记录,提前重新申请。

3. 站点从http转到https完全过渡需要一段时间,建议在部署时站点同时支持http和https。

4. 部署过程遇到任何问题,可联系您的专属运维人员。

 

                                                            MAGAPP技术部


M
转自 MAGAPP产品部 9 年前
6,856

Repeater
索引 <%# Container.ItemIndex %>
输出项 <%# Container.DataItem %><%# GetDataItem() %>

ListView
索引 <%# Container.DataItemIndex %>
输出项 <%# GetDataItem() %>

 

以 fiels 的内容为 <span style="color: red;">你好</span> 为例:

语法 HTML 源代码输出结果 浏览器展示结果 备注
<%# Eval("field") %> <span style="color: red;">你好</span> 你好 一般绑定
<%#: Eval("field") %> &lt;span style=&quot;color: red;&quot;&gt;你好&lt;/span&gt; <span style="color: red;">你好</span> HtmlEncode 效果绑定

 

xoyozo 16 年前
4,344

  windows 7和vista提高的系统的安全性,同时需要明确指定“以管理员身份运行”才可赋予被运行软件比较高级的权限,比如访问注册表等。否则,当以普通身份运行的程序需要访问较高级的系统资源时,将会抛出异常。

  如何让程序在启动时,自动要求“管理员”权限了,我们只需要修改app.manifest文件中的配置项即可。

  app.manifest文件默认是不存在的,我们可以通过以下操作来自动添加该文件。

(1)进入项目属性页。

(2)选择“安全性”栏目。

(3)将“启用ClickOnce安全设置”勾选上。

  现在,在Properties目录下就自动生成了app.manifest文件,打开该文件,将trustInfo/security/requestedPrivileges节点的requestedExecutionLevel的level的值修改为requireAdministrator即可。如下所示:

      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
         <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>

 

  记住,如果不需要ClickOnce,可以回到项目属性页将“启用ClickOnce安全设置”不勾选。   

  接下来,重新编译你的程序就OK了。

z
转自 zhuweisky 16 年前
3,397