项目开发收尾总结(片段)

一个项目又开发完成了,虽然时间短问题多,但还是有一,二总结

1、kendo中如果使用 data-role="datetimepicker"日期时间选择器,时间选择列表总是不能初始化,需要选择两次日期,才会出现时间选择列表。第三方组件啊,让人头痛,一一排除后,竟然在这里。

Date.prototype.toString = function (formatStr) {
     // --- //
    return str;
}

自定义了日期类型的方法toString("yyyy-MM-dd"),该方法本来是没有错误的,但是和kendo的日期时间冲突了,将 toString 换成  format 问题解决,原来toString这个方法,kendo有另外的定义,看来自定义的名称还是要个性化。

2、项目开发时间短,数据建模不是同一人完成的,缺乏了整体的规划,在模块数据交叉的地方,出现后期难以整合的问题,看来以后建模和数据库还是要整体规划,功能开发上可以各司其职。

3、JPUSH推送

JPUSH封装后使用就非常简单了。

namespace JPush
{
    public class JPushUtil
    {
        protected const string apiBaseUrl = "https://api.jpush.cn/v3/";
        static JPushUtil()
        {
            appkeys = ConfigurationManager.AppSettings["OwnerAppkey"];
            master_secret = ConfigurationManager.AppSettings["OwnerSecret"];
               
        }
        public static string appkeys
        {
            get;
            set;
        }
        public static string master_secret
        {
            get;
            set;
        }
        
        public  static string GenerateQueryToken(string appKey, string masterSecret)
        {
            string s = string.Format("{0}:{1}", appKey, masterSecret);
            Encoding encoding = Encoding.UTF8;
             
            try
            {
                byte[] bytes = encoding.GetBytes(s);
                return Convert.ToBase64String(bytes);
            }
            catch
            {
                return string.Empty;
            }
        }
        public static string Send(string data,string url="")
        {
            string result = "";

url = apiBaseUrl + "push";
             
                HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(url);
              
 
                    httpRequest.Credentials = new NetworkCredential(appkeys, master_secret);
                    httpRequest.Headers[HttpRequestHeader.Authorization] = "Basic " + GenerateQueryToken(appkeys, master_secret);

byte[] byteArray = null;
                byteArray = Encoding.UTF8.GetBytes(data);

httpRequest.Method = "POST";
            httpRequest.ContentType = "text/xml; charset=utf-8";
                httpRequest.ContentLength = byteArray.Length;
           
                Stream dataStream = httpRequest.GetRequestStream();
                dataStream.Write(byteArray, 0, byteArray.Length);
                dataStream.Close();

WebResponse response = null;
                try
                {
                    response = httpRequest.GetResponse();
                }
                catch (WebException e)
                {
                    response = e.Response;
                }
                string responseContent = string.Empty;
                using (Stream responseStream = response.GetResponseStream())
                {

StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
                    responseContent = streamReader.ReadToEnd();
                }

response.Close();
                if (!string.IsNullOrEmpty(responseContent))
                {
                    result = responseContent;
                }
             
            return result;
        }
        static object lockObj = new object();
        protected static int GenerateSendIdentity()
        {
            lock (lockObj)
            {
                return (int)(((DateTime.UtcNow - new DateTime(2014, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds) % Int32.MaxValue);
            }
        }
        public static PushResponse DPdoSend(int receiverType, string receiverValue, string title, string n_content, string param,
            int time_to_live = 864000, string apns_production = "False")
        {
            appkeys = ConfigurationManager.AppSettings["DPappkey"];
            master_secret = ConfigurationManager.AppSettings["DPsecret"];
            return doSend(receiverType, receiverValue, title, n_content, param, time_to_live, apns_production);
        }
        public static PushResponse OwnerdoSend(int receiverType, string receiverValue, string title, string n_content, string param,
            int time_to_live = 864000, string apns_production = "False")
        {
            appkeys = ConfigurationManager.AppSettings["OwnerAppkey"];
            master_secret = ConfigurationManager.AppSettings["OwnerSecret"];
            return doSend(receiverType, receiverValue, title, n_content, param, time_to_live, apns_production);
        }
        public static PushResponse JYdoSend(int receiverType, string receiverValue, string title, string n_content, string param,
          int time_to_live = 864000, string apns_production = "False")
        {
            appkeys = ConfigurationManager.AppSettings["JYappkey"];
            master_secret = ConfigurationManager.AppSettings["JYsecret"];
            return doSend(receiverType, receiverValue, title, n_content, param, time_to_live, apns_production);
        }

public static PushResponse doSend(  int receiverType, string receiverValue, string title, string n_content, string param,
            int time_to_live = 864000,string apns_production="False")
        {
            StringBuilder sb=new StringBuilder();
            sb.AppendLine("{");
            sb.AppendLine("\"platform\": [\"android\",\"ios\"],");
            sb.AppendLine("\"audience\":{");
            if(receiverType==2)
            {
                sb.AppendLine("  \"tag\" : [\""+receiverValue+"\"]");
            }
            else
            {
                sb.AppendLine("  \"alias\" : [\""+receiverValue.Replace(",","\",\"")+"\"]");
            }
            sb.AppendLine("}");
            sb.AppendLine(",\"message\": {");
            sb.AppendFormat("  \"msg_content\":\"{0}\",",n_content.Replace("\"","") );
            sb.AppendLine();
            sb.AppendFormat("  \"title\":\"{0}\",",title.Replace("\"","") );
            sb.AppendLine();
            sb.AppendFormat("  \"extras\": {0} ",param  );
            sb.AppendLine();
            sb.AppendLine("  }");

sb.AppendLine(",\"options\": {");
            sb.AppendFormat("  \"sendno\":{0},",GenerateSendIdentity() );
            sb.AppendLine();
            sb.AppendFormat("  \"time_to_live\":{0},", time_to_live);
            sb.AppendLine();
            sb.AppendFormat("  \"apns_production\": \"{0}\"", apns_production);
            sb.AppendLine();
            sb.AppendLine("  }");
            sb.AppendLine("}");
            PushResponse result = new PushResponse();
            result.ResponseCode = -1;
            try
            {
                string result1 = Send(sb.ToString());
                JToken root = JToken.Parse(result1);
                try
                {
                    result.MessageId = root.SelectToken("msg_id").Value<string>();
                }
                catch
                { }
                var errorNode = root.SelectToken("error");
                if (errorNode == null)
                {
                    result.SendIdentity = root.SelectToken("sendno").Value<string>();
                    result.ResponseCode = 0;
                }
                else
                {
                    result.ResponseMessage = errorNode.SelectToken("message").Value<string>();
                    result.ResponseCode = errorNode.SelectToken("code").Value<int>();
                }
            }
            catch (Exception ex)
            {
               
                throw new ST.Exceptions.CanShowException(ex.Message);
            }
           
            
            return result;
        }
      }
  }

在需要的地方直接调用就OK。

4、.net下操作Redis的不明白地方

简写实例说明

using (IRedisClient irc = ST.Cache.RedisManage.GetClient())
            {

IRedisTypedClient<MY_View> redis = irc.As<MY_View>();
                var lold = redis.Lists["KEY"];

var m1 = lold.Where(a => a.ID == id).SingleOrDefault();
                if (m1 != null)
                {
                    lold.RemoveValue(m1);
                }
              }

Redis中<key,value>value为列表的,采用 RemoveValue,或  redis.RemoveItemFromList(lold, m1)均不能删除,最后还是改为删除整个键,然后再重新添加列表,费时费力,现在功能是完成熬,还没找到问题症结。只有用这个折中的办法。

5、MVC路由的一种实现

public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                 "M_default",
                 "M/{controller}/{action}/{Token}",
                 new { action = "Index", Token = UrlParameter.Optional },
                 new string[] { "ST.WEB.Areas.M" }
             ).DataTokens["UseNamespaceFallback"] = true;
 
        }

DataTokens["UseNamespaceFallback"] = true,前面命名空间没有找到控制,其它地方继续

false是只在列出的命名空间查找,命名空间是任意的,不一定都 设置在controlls下。

时间: 2024-10-07 00:12:31

项目开发收尾总结(片段)的相关文章

软件项目开发团队组员跨项目组兼职案例分析

按照现代项目管理的观点,项目团队是指"项目的中心管理小组,由一群人集合而成并被看作是一个组,他们共同承担项目目标的责任,兼职或者全职地向项目经理进行汇报". 项目团队的特征有: (1)项目团队具有一定的目的 项目团队的使命就是完成某项特定的任务,实现项目的既定目标,满足客户的需求.此外项目利益相关者的需求具有多样性的特征,因此项目团队的目标也具有多元性. (2)项目团队是临时组织 项目团队有明确的生命周期,随着项目的产生而产生,项目任务的完成而结束,即可解散.它是一种临时性的组织. (

学习JavaWeb项目开发需要掌握的技术

武汉java培训学习JavaWeb项目开发需要掌握的技术,国内外信息化建设已经进入基于Web应用为核心的阶段, java作为应用于网络的最好语言,前景无限看好.然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情.概括一下,实施Java的WEB项目需要掌握的技术如下:Java语言面向对象分析设计思想设计模式和框架结构XML语言网页脚本语言数据库应用服务器集成开发环境下面我们具体地看每个技术.1.Java语言Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.

ios项目开发(天气预报项目):

本项目基于 <使用storyboards建立 Navigation Controller and Table View> http://uliweb.cpython.org/tutorial/view_chapter/424 创建, 代码中使用了 静态的 tableviewcell 增加了 textview,url,json数据解析 部分代码片段: // // cityViewController.h // weather1 // // Created by HeJiasheng on 13-

软件项目开发流程

软件开发流程(Software development process) 首先 看一下基本软件项目开发流程图 其中 1.需求分析: 通过对客户业务的了解和与客户对流程的讨论对需求进行基本建模,最终形成需求规格说明书. 2.总体设计: 通过分析需求信息,对系统的外部条件及内部业务需求进行抽象建模,最终形成概要设计说明文档. 3.详细设计: 此部分在对需求和概要设计的基础上进行系统的详细设计(也包含部分代码说明). 4.开发编程: 对系统进行代码编写. 5.测试分析与系统整合: 对所有功能模块进行模

基于Redux的ReactNative项目开发总结(一)

写在前面 上周把基于Redux的单页应用开发完 紧接着就开始了ReactNative的开发.真的快得不可思议,只花了一周时间,我们两个人就分工把APP也开发完了,并且同时兼容IOS操作系统和Android操作系统.内部测试了一轮,流畅性和用户体验方面也都相当给力! 接下去几篇依次介绍项目开发中领悟的技巧和遇到的坑. 项目架构 和React开发的单页应用不同,ReactNative开发不需要依赖webpack,facebook已经提供的一套基于NodeJS的转换和运行工具,这里不多做介绍.项目的架

vue项目开发流程

创建vue项目流程 1.使用构建工具vue-cli创建项目脚手架 vue-cli是一个官方发布vue.js项目脚手架,使用vue-cli可以快速创建vue项目. (1)安装 确认已安装了node.js,可在cmd中输入( node -v和npm -v),如显示出版号,说明安装成功. 图片.png 通过vue ui安装 第一步:在cmd中输入vue ui 图片.png 第二步:之后会弹出一个页面,点击创建 图片.png 第三步:选择你项目要放的文件,然后点击在此创建新项目 图片.png 第四步:输

第八章 企业项目开发--分布式缓存memcached

注意:本节代码基于<第七章 企业项目开发--本地缓存guava cache> 1.本地缓存的问题 本地缓存速度一开始高于分布式缓存,但是随着其缓存数量的增加,所占内存越来越大,系统运行内存越来越小,最后系统会被拖慢(这一点与第二点联系起来) 本地缓存存于本机,其缓存数量与大小受本机内存大小限制 本地缓存存于本机,其他机器的访问不到这样的缓存 解决方案:分布式缓存 Jboss cache:缓存还存于本机,但是会同步更新到其他机器(解决了第三个问题,解决不了第一和第二个问题),如果缓存机器数量很多

IDEA 学习笔记之 Scala项目开发

Scala项目开发: 由于直接下载Scala plugin太慢,老是中断,所以手动下载: https://plugins.jetbrains.com/ 手动安装Scala plugin: 新建Scala Module:  下载Scala SDK: http://www.scala-lang.org/download/2.11.6.html  选择Scala SDK:   创建Scala project: 编写第一个Scala Hello World:

TMS320F28335项目开发记录1_CCS的使用介绍

CCS使用介绍 一.前言 本系列文章记录本人实际项目开发时对ti的DSP28335,以及CCS开发环境等的学习与记录,相对于2812来说,28335的资料还是比較少的,只是原理是相通的,28335说白了就是比2812多一些外设,寄存器等东西: 28335对于学习DSP的人来说,也算是一款入门级芯片.本人也是学习没多久就拿来做项目了,用到什么学什么,感觉事实上DSP没有想象中的难,无非就是和单片机一样.配置一些寄存器,驱动一些外设进行开发等,而DSP之所以难.难在它的算法部分,有了好的算法,DSP