在上篇随笔《Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示》中介绍了我的整个CRM系统的概貌,本篇继续本系列的文章,介绍如何基于我的《winform开发框架》的基础上进行CRM系统模块的开发工作,希望对大家在系统模块开发有所启示或者帮助。

在我整个开发框架的体系结构中,我都希望开发的业务模块尽可能重用,因此遵循这个要求,所有的模块除了一些基础模块外,尽可能和其他业务模块没有任何耦合关系,同时也可以动态对模块进行加载使用,和我在《Winform开发框架之插件化应用框架实现》的思想一样,各个模块之间可以动态组合起来,实现更多的业务整合。

 1、CRM系统的工程项目介绍

本客户关系管理系统,也是基于这个目的和基础上进行模块开发,在整个项目模块开发过程中,将会利用到整个Winform开发框架的相关组件模块,包括基础界面模块、程序启动模块、权限管理模块、字典管理模块、分页控件、公用类库、附件管理等公用模块。

整个CRM系统的界面效果如下所示。

首先我们来看看CRM系统主要项目工程的布局和说明。

解决方案项目工程介绍WHC.Framework.BaseUIDx重用模块。各模块的界面基类,包括通用窗体界面基类BaseUI;通用高级查询模块AdvanceSearch;通用Excel导入模块;插件化接口相关类PlugInInterface等。WHC.Framework.StarterDx重用模块。插件化应用程序启动界面。通过用户登录后,获取用户的菜单,动态创建菜单并加载插件,该模块集成权限管理系统模块、集成字典数据管理模块、集成多文档界面控件和布局控件、集成美观实用的登陆界面、闪屏展示界面、托盘缩小提示功能、全局运行一次实例限制模块代码等内容。WHC.CRM.Core新开发模块。客户关系管理系统的核心模块,包括业务处理、数据接口层、数据访问层、实体层等相关类。WHC.CRM.UIDx新开发模块。客户关系管理系统的界面层,包括所系统模块的各种界面、控件等内容。

设计好CRM的相关数据库表后,利用C#代码生成工具Database2Sharp生成框架各层的代码,模块开始开发的时候,可以一次性把所有业务表的代码一次性生成,然后在整个新的解决方案(.sln)上进行递增式完善即可,如果是后续模块的开发,则需要增量把生成的代码,复制到相关的框架目录即可,整理后的业务逻辑层代码结构如下所示

这个时候,我们生成了界面层以下的所有分层代码,整个代码生成后,一次性即可编译通过,界面层我们另外建立一个Winform项目工程WHC.CRM.UIDx ,然后添加相关的界面引用程序集(如DevExpress的相关界面程序集)。处理完这些后,我们又可以利用C#代码生成工具Database2Sharp来实现界面的快速开发工作了,代码生成工具生成界面的操作界面如下所示,具体生成界面的操作可以参考随笔《利用代码生成工具Database2Sharp设计数据编辑界面》进行了解。

最后得到类似项目目录结构的CRM系统界面模块工程。

由于整个CRM系统包含很多界面元素,因此以上模块的界面部分只是其中一部分,如果内容较多,可以建立目录进行分类管理,这样会更加清晰。

2、CRM系统的界面层代码分析

利用C#代码生成工具Database2Sharp,可以快速生成所需要的框架界面代码,包括集成各种已有模块的界面基类、导入导出模块支持、高级查询能功能模块,各种实体类对应关系等内容,这些如果利用手工操作,效率非常低下,而且容易出错。即使利用一些代码生成工具,如果没有和现成的界面模块进行很好的整合,也需要花费大量的时间进行整理,下面通过几个界面代码的展示进行大致的了解。

1)列表显示界面的集成和分页整合

2)字典模块的整合处理(通过扩展类方法实现)

 3)导入导出模块的整合

        private string moduleName = "客户合同信息";/// <summary>/// 导入Excel的操作/// </summary>          private void btnImport_Click(object sender, EventArgs e){string templateFile = string.Format("{0}-模板.xls", moduleName);FrmImportExcelData dlg = new FrmImportExcelData();dlg.SetTemplate(templateFile, System.IO.Path.Combine(Application.StartupPath, templateFile));dlg.OnDataSave += new FrmImportExcelData.SaveDataHandler(ExcelData_OnDataSave);dlg.OnRefreshData += new EventHandler(ExcelData_OnRefreshData);dlg.ShowDialog();}void ExcelData_OnRefreshData(object sender, EventArgs e){BindData();}bool ExcelData_OnDataSave(DataRow dr){string customerName = dr["客户名称"].ToString();if (string.IsNullOrEmpty(customerName))return false;CustomerInfo customerInfo = BLLFactory<Customer>.Instance.FindByName(customerName);if (customerInfo == null){throw new ArgumentException(string.Format("客户名称【{0}】不存在,记录已跳过", customerName));}bool success = false;bool converted = false;DateTime dtDefault = Convert.ToDateTime("1900-01-01");DateTime dt;ContractInfo info = new ContractInfo();info.Customer_ID = customerInfo.ID;//客户IDinfo.HandNo = dr["合同编号"].ToString();info.ExpenditureType = dr["收支类型"].ToString();info.ContractType = dr["合同类型"].ToString();info.ContractName = dr["合同名称"].ToString();info.ContractMoney = dr["合同金额"].ToString().ToDecimal();converted = DateTime.TryParse(dr["签约日期"].ToString(), out dt);if (converted && dt > dtDefault){info.SignDate = dt;}
........................................success = BLLFactory<Contract>.Instance.Insert(info);return success;}/// <summary>/// 导出Excel的操作/// </summary>private void btnExport_Click(object sender, EventArgs e){string file = FileDialogHelper.SaveExcel(string.Format("{0}.xls", moduleName));if (!string.IsNullOrEmpty(file)){string where = GetConditionSql();List<ContractInfo> list = BLLFactory<Contract>.Instance.Find(where);DataTable dtNew = DataTableHelper.CreateTable("序号|int,客户名称,合同编号,收支类型,合同类型,合同名称,合同金额,公司签约人,客户签约人,签约日期,签约地点,乙方名称,合同开始日期,合同结束日期,结算情况,合同状态,关联项目,联系人,联系人电话,联系人手机,合同内容,备注说明,经办人");DataRow dr;int j = 1;for (int i = 0; i < list.Count; i++){dr = dtNew.NewRow();dr["序号"] = j++;dr["客户名称"] = BLLFactory<Customer>.Instance.GetCustomerName(list[i].Customer_ID);//转义为客户名称dr["合同编号"] = list[i].HandNo;dr["收支类型"] = list[i].ExpenditureType;dr["合同类型"] = list[i].ContractType;
......................................dr["经办人"] = list[i].Operator;dtNew.Rows.Add(dr);}try{string error = "";AsposeExcelTools.DataTableToExcel2(dtNew, file, out error);if (!string.IsNullOrEmpty(error)){MessageDxUtil.ShowError(string.Format("导出Excel出现错误:{0}", error));}else{if (MessageDxUtil.ShowYesNoAndTips("导出成功,是否打开文件?") == System.Windows.Forms.DialogResult.Yes){System.Diagnostics.Process.Start(file);}}}catch (Exception ex){LogTextHelper.Error(ex);MessageDxUtil.ShowError(ex.Message);}}}

4)高级查询模块的整合

        private FrmAdvanceSearch dlg;private void btnAdvanceSearch_Click(object sender, EventArgs e){if (dlg == null){dlg = new FrmAdvanceSearch();dlg.FieldTypeTable = BLLFactory<Contract>.Instance.GetFieldTypeList();dlg.ColumnNameAlias = BLLFactory<Contract>.Instance.GetColumnNameAlias();dlg.DisplayColumns = "Customer_ID,HandNo,ExpenditureType,ContractType,ContractName,ContractMoney,CompanySigner,CustomerSigner,SignDate,SignLocation,PartyBName,StartDate,EndDate,Settlement,Status,RelatedItems,Contact,ContactPhone,ContactMobile,Content,Note,Operator";#region 下拉列表数据//dlg.AddColumnListItem("UserType", Portal.gc.GetDictData("人员类型"));//字典列表//dlg.AddColumnListItem("Sex", "男,女");//固定列表//dlg.AddColumnListItem("Credit", BLLFactory<Contract>.Instance.GetFieldList("Credit"));//动态列表#endregiondlg.ConditionChanged += new FrmAdvanceSearch.ConditionChangedEventHandler(dlg_ConditionChanged);}dlg.ShowDialog();}void dlg_ConditionChanged(SearchCondition condition){advanceCondition = condition;BindData();}

5)编辑界面的基类继承

3、CRM系统的界面层的用户及权限信息传递

我们知道,每个业务模块都可能需要获取当前登录的一些用户信息和权限信息,以便达到更好的控制和数据的显示,如某些模块,可能只需要显示当前用户的数据,由于CRM系统的界面是独立开发,不整合在启动界面模块里面,那么如何获得用户和权限控制信息呢?例如下面的CRM模块里面的界面,需要根据当前用户获取到客户的分组列表的。

首先我们可以在界面基类中实现一个接口,以便传递相关的用户和权限信息。

namespace WHC.Framework.BaseUI
{public partial class BaseForm : DevExpress.XtraEditors.XtraForm, IFunction{

其中IFunction的定义如下所示。

namespace WHC.Framework.BaseUI
{/// <summary>/// 父窗体实现的权限控制接口/// </summary>public interface IFunction{/// <summary>/// 初始化权限控制信息/// </summary>void InitFunction(LoginUserInfo userInfo, Dictionary<string, string> functionDict);/// <summary>/// 是否具有访问指定控制ID的权限/// </summary>/// <param name="controlId">功能控制ID</param>/// <returns></returns>bool HasFunction(string controlId);/// <summary>/// 登陆用户基础信息/// </summary>LoginUserInfo LoginUserInfo { get; set; }/// <summary>/// 登录用户具有的功能字典集合/// </summary>Dictionary<string, string> FunctionDict { get; set; }/// <summary>/// 应用程序基础信息/// </summary>AppInfo AppInfo { get; set; }}
}

其中就定义了接口进行用户和权限信息的赋值。在界面按钮构建相关模块的功能界面窗体的时候,我们可以为这些传递传递相关的对象信息。

        private void barCRMContact_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e){ChildWinManagement.LoadMdiForm(this, typeof(FrmCustomerContact));}private void barCRMCustomer_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e){ChildWinManagement.LoadMdiForm(this, typeof(FrmCustomerManage));}
                tableForm = (Form) Activator.CreateInstance(formType);tableForm.MdiParent = mainDialog;//如果窗体集成了IFunction接口(第一次创建需要设置)IFunction function = tableForm as IFunction;if (function != null){//初始化权限控制信息
                    function.InitFunction(Portal.gc.LoginUserInfo, Portal.gc.FunctionDict);//记录程序的相关信息function.AppInfo = new AppInfo(Portal.gc.AppUnit, Portal.gc.AppName, Portal.gc.AppWholeName, Portal.gc.SystemType);}

通过在构造窗体的时候,传入相关的用户和权限对象属性即可实现这些信息的传递和使用。

另外,为了更加方便信息的传递,我们也可以在用户登陆的时候,把这些信息通过Cache对象把它缓存起来,类似Web开发里面的Session功能。

我的该CRM系统系列的几篇随笔链接如下,供阅读。

Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示 

Winform开发框架之客户关系管理系统(CRM)的开发总结系列2-基于框架的开发过程 

Winform开发框架之客户关系管理系统(CRM)的开发总结系列3-客户分类和配置管理实现 

Winform开发框架之客户关系管理系统(CRM)的开发总结系列4-Tab控件页面的动态加载 

本文转自博客园伍华聪的博客,原文链接:Winform开发框架之客户关系管理系统(CRM)的开发总结系列2-基于框架的开发过程,如需转载请自行联系原博主。



Winform开发框架之客户关系管理系统(CRM)的开发总结系列2-基于框架的开发过程...

相关文章

  1. 布局组件

    1.Grid Layout Group&#xff08;网格布局&#xff09; 1.网格布局&#xff1a;可以使所有的子物体进行网格样式的布局 Padding&#xff1a;内间距&#xff1a;子物体距离父物体边缘的距离&#xff1b;在设置内间距的距离的时候&#xff0c;需要根据Start Corner来进行设定 Sta…...

    2023/5/28 20:55:40
  2. Application类

    using System.Collections; using System.Collections.Generic; using UnityEngine;using System.IO; using UnityEngine.SceneManagement;public class Scripts : MonoBehaviour {// Use this for initializationvoid Start () {// Application 应用程序// 设置应用程序能否后…...

    2023/5/28 20:55:39
  3. 抽象方法与抽象类

    关键字&#xff1a;abstract 抽象方法&#xff1a; 使用abstract关键字修饰的方法就是抽象方法&#xff0c; 抽象方法只有方法声明&#xff0c;没有方法实现&#xff0c; 实现抽象方法需要重写 抽象方法只能写在抽象类中 抽象类&#xff1a; 使用abstract修饰的类就是抽象类 抽…...

    2023/5/28 20:55:38
  4. 命名空间

    命名空间&#xff1a;类似于文件夹&#xff1b;作用是为了归类和接口的 命名空间中只能写类、结构体、接口、枚举和委托 命名空间是可以重名的&#xff0c;相同名字的命名空间是同一个命名空间 关键字&#xff1a;namespace namespace A {class Person { }namespace AA{class A…...

    2023/5/28 20:55:32
  5. ref和out

    ref关键字&#xff1a; 是用来修饰形参的&#xff0c;可以将值类型当做引用类型来使用 ref修饰的形参&#xff0c;在方法内部修改的时候&#xff0c;会影响实参的值 ref修饰的形参&#xff0c;在传参的时候&#xff0c;实参的值可以带入方法中 ref修饰的形参&#xff0c;在方法…...

    2023/5/28 20:55:31
  6. 委托与Lambda表达式

    // 声明一个委托 // 委托就是一个类型 // Add: 委托类型的变量 // 类型: double(int, int) // 是一个方法类型&#xff0c;返回值类型是double&#xff0c;参数类型是(int, int) delegate double Add(int a, int b);class Program {public static void Main(string[] arg…...

    2023/5/28 20:55:29
  7. Unity中的四个路径

    Application.database&#xff1a;当前工程的Assets文件夹&#xff08;编辑器&#xff09; Application.StreamingAssets&#xff1a;IO流路径 当前工程的StreamingAssets文件夹&#xff08;编辑器&#xff09; 程序源下的一个文件夹&#xff08;其他平台&#xff09; Applicat…...

    2023/5/28 20:55:28
  8. U3D中的一些方法和属性

    string.Format();//拼接字符串的方法&#xff0c;里面可用占位符&#xff0c;方法内部为string Destroy(Object obj);//立刻销毁&#xff08;游戏对象&#xff0c;组件或者asset&#xff09; Destroy(Object obj, float timer);//过timer的时间后销毁 Cursor.visibleture;鼠标是…...

    2023/5/28 20:55:25
  9. U3D组件------CharacterController(角色控制器)

    角色控制器中有碰撞体和刚体的属性 Slope Limit:角色能爬的斜坡的坡度限制 Step Offset:角色走台阶的高度 Skin Width:当场景里面出现多个角色控制器的时候&#xff0c;两个对象在接触的时候会有碰撞效果&#xff0c;防止抖动&#xff0c;可以调节皮肤宽度 Min Move Distance:最…...

    2023/5/28 20:55:24
  10. U3D框架—单例框架

    写程序应遵循的原则&#xff1a;高内聚&#xff08;内容的聚合&#xff09;&#xff0c;低耦合&#xff08;功能与功能之间的联系&#xff09; 代码里尽量不要有冗余&#xff1a;既重复&#xff0c;没有用的代码 using System.Collections; using System.Collections.Generic; …...

    2023/5/28 20:55:21
  11. 数据持久化PlayerPrefs

    1、Unity3D中的数据持久化是以键值对的形式存储的&#xff0c;可以看作是一个字典 2、Unity3D中的值是通过键名来读取的&#xff0c;当值不存在时&#xff0c;返回默认值 3、在Unity中只支持int、float、string这三种数据类型的读取&#xff0c;因此可以使用这三种数据类型来存…...

    2023/5/28 20:55:18
  12. SVN常用命令

    http://www.cnblogs.com/liwanggui/archive/2016/06/28/5624147.html...

    2023/5/28 20:55:17
  13. 关于U3D图片的压缩格式

    http://blog.sina.com.cn/s/blog_930ffa0b0102vass.html...

    2023/5/28 20:55:16
  14. unity延时方法

    http://www.cnblogs.com/louissong/p/3832960.html 借鉴上面的博客中的内容&#xff1a; Invoke(methodName: string, time: float): void; methodName:方法名 time:多少秒后执行 InvokeRepeating InvokeRepeating(methodName: string , time: float , repeatRate: float ):…...

    2023/5/28 20:55:15
  15. unity中Android环境变量配置

    http://www.cnblogs.com/windytrees/p/7533477.html...

    2023/5/28 20:55:14
  16. Opengl库函数列表

    http://www.cnblogs.com/GameDeveloper/archive/2012/01/07/2315867.html...

    2023/5/28 20:55:13
  17. Unity3D中的Quality

    Quality Level&#xff1a;质量等级&#xff0c;默认为打包最低的那个等级 Name&#xff1a;质量级别的名称 Pixel Light Count&#xff1a;像素灯数量&#xff08;前向渲染使用的像素灯的最大数量&#xff09; Texture Quality&#xff1a;纹理质量&#xff08;可以设置最大分…...

    2023/5/28 20:55:12
  18. 浅谈优化

    UI的拼接要讲究章法&#xff0c;根据一定的效率流程去走&#xff0c;会提高效率&#xff0c;还需要遵守原则&#xff0c;提高性能 流程如下&#xff1a; 1、原画师提供效果图 原画师一般会先给一张效果图&#xff0c;表示这个界面风格会做成什么样的&#xff0c;基本功能都会展…...

    2023/5/28 20:55:10
  19. C#之代码优化

    1、if和swith&#xff1a; 区别&#xff1a;1、if语句会执行多次判断&#xff0c;增加CPU的消耗&#xff0c;效率较低&#xff1b;switch只判断一次&#xff0c;效率较高 2、if表示的是一个范围&#xff0c;switch表示一个点 2、for和foreach foreach&#xff1a;每变量一次就会…...

    2023/5/28 20:55:09
  20. uniy中所有的特殊文件夹

    http://www.xuanyusong.com/archives/3229...

    2023/5/28 20:55:08
  21. Unity之AssetBundle打包

    AssetBundle Resources&#xff1a;表示U3D自动将资源打成一个AssetBundle包&#xff0c;所有放在Resources下的文件夹都会打成一个AssetBundle包&#xff0c;资源非常大&#xff0c;Resources文件夹在真机上最大只有2G的内存&#xff08;专业版会增大内存&#xff09; AssetBu…...

    2023/5/28 20:55:07
  22. Params关键字

    https://www.cnblogs.com/gjhjoy/p/3573330.html...

    2023/5/28 20:55:04
  23. 关于博客的更新问题

    ...

    2023/5/28 20:55:03
  24. 设计模式原则

    设计模式&#xff1a; 定义&#xff1a;设计可以反复使用的&#xff0c;可以解决特定问题的设计方法 作用&#xff1a;解决同一类型的问题&#xff0c;设计模式可以让代码结构更加清晰 面向对象设计中常见的设计原则&#xff1a; 原则的作用&#xff1a;让自己设计实现出来的软…...

    2023/5/28 20:55:02
  25. VS2015秘钥

    Visual Studio Professional 2015简体中文版&#xff08;专业版&#xff09;KEY&#xff1a;HMGNV-WCYXV-X7G9W-YCX63-B98R2Visual Studio Enterprise 2015简体中文版&#xff08;企业版&#xff09;KEY&#xff1a;HM6NR-QXX7C-DFW2Y-8B82K-WTYJV...

    2023/5/28 20:55:00
  26. UGUI中Text的换行

    通过代码中的\n可以直接执行换行效果&#xff0c;但是我们在平常的工作中一般都是读表&#xff0c;既在Inspector面板中的Text组件中输入同样的内容就达不到换行效果&#xff1b; 其实unity把\n转变成了\\n&#xff0c;我们只需要变回来就可以了&#xff0c;代码如下 string Ge…...

    2023/5/28 20:54:59
  27. Unity中的点击,长按,划动

    public void GetClickType() {if(Input.GetMouseButtonDown(0)){if(isGetBeginPos){beginPosition Input.mousePosition;isGetBeginPos false;}if(isCheckCollider){//检测碰撞体isCheckCollider false; } }if(Input.GetMouseButton(0)){timer Time.deltaTime;curPosit…...

    2023/5/28 20:54:56
  28. 碰撞体速度过快穿透的问题

    问题&#xff1a;假设现在A物体以非常高的速度移动&#xff0c;而unity每一帧的检测时间大概是0.02秒&#xff0c;也就是说如果物体A速度过快&#xff0c; 在不用0.02秒的时间就已经穿过了其他物体&#xff0c;那么这个时候是无法检测A与其他物体之间的碰撞信息的 主要原因是&a…...

    2023/5/28 20:54:53
  29. UGUI脚本添加Btn回调的方法

    using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems;//对添加这个脚本的对象添加EventTrigger组件 [RequireComponent(typeof(UnityEngine.EventSystems.EventTrigger))] public class Bt…...

    2023/5/28 20:54:52
  30. unity中给图片换颜色

    slot边框.color new Color32 (93,165,255,255);...

    2023/5/28 20:54:50

最新文章

  1. 布局组件

    1.Grid Layout Group&#xff08;网格布局&#xff09; 1.网格布局&#xff1a;可以使所有的子物体进行网格样式的布局 Padding&#xff1a;内间距&#xff1a;子物体距离父物体边缘的距离&#xff1b;在设置内间距的距离的时候&#xff0c;需要根据Start Corner来进行设定 Sta…...

    2023/5/28 20:55:40
  2. Application类

    using System.Collections; using System.Collections.Generic; using UnityEngine;using System.IO; using UnityEngine.SceneManagement;public class Scripts : MonoBehaviour {// Use this for initializationvoid Start () {// Application 应用程序// 设置应用程序能否后…...

    2023/5/28 20:55:39
  3. 抽象方法与抽象类

    关键字&#xff1a;abstract 抽象方法&#xff1a; 使用abstract关键字修饰的方法就是抽象方法&#xff0c; 抽象方法只有方法声明&#xff0c;没有方法实现&#xff0c; 实现抽象方法需要重写 抽象方法只能写在抽象类中 抽象类&#xff1a; 使用abstract修饰的类就是抽象类 抽…...

    2023/5/28 20:55:38
  4. 命名空间

    命名空间&#xff1a;类似于文件夹&#xff1b;作用是为了归类和接口的 命名空间中只能写类、结构体、接口、枚举和委托 命名空间是可以重名的&#xff0c;相同名字的命名空间是同一个命名空间 关键字&#xff1a;namespace namespace A {class Person { }namespace AA{class A…...

    2023/5/28 20:55:32
  5. ref和out

    ref关键字&#xff1a; 是用来修饰形参的&#xff0c;可以将值类型当做引用类型来使用 ref修饰的形参&#xff0c;在方法内部修改的时候&#xff0c;会影响实参的值 ref修饰的形参&#xff0c;在传参的时候&#xff0c;实参的值可以带入方法中 ref修饰的形参&#xff0c;在方法…...

    2023/5/28 20:55:31
  6. 委托与Lambda表达式

    // 声明一个委托 // 委托就是一个类型 // Add: 委托类型的变量 // 类型: double(int, int) // 是一个方法类型&#xff0c;返回值类型是double&#xff0c;参数类型是(int, int) delegate double Add(int a, int b);class Program {public static void Main(string[] arg…...

    2023/5/28 20:55:29
  7. Unity中的四个路径

    Application.database&#xff1a;当前工程的Assets文件夹&#xff08;编辑器&#xff09; Application.StreamingAssets&#xff1a;IO流路径 当前工程的StreamingAssets文件夹&#xff08;编辑器&#xff09; 程序源下的一个文件夹&#xff08;其他平台&#xff09; Applicat…...

    2023/5/28 20:55:28
  8. U3D中的一些方法和属性

    string.Format();//拼接字符串的方法&#xff0c;里面可用占位符&#xff0c;方法内部为string Destroy(Object obj);//立刻销毁&#xff08;游戏对象&#xff0c;组件或者asset&#xff09; Destroy(Object obj, float timer);//过timer的时间后销毁 Cursor.visibleture;鼠标是…...

    2023/5/28 20:55:25
  9. U3D组件------CharacterController(角色控制器)

    角色控制器中有碰撞体和刚体的属性 Slope Limit:角色能爬的斜坡的坡度限制 Step Offset:角色走台阶的高度 Skin Width:当场景里面出现多个角色控制器的时候&#xff0c;两个对象在接触的时候会有碰撞效果&#xff0c;防止抖动&#xff0c;可以调节皮肤宽度 Min Move Distance:最…...

    2023/5/28 20:55:24
  10. U3D框架—单例框架

    写程序应遵循的原则&#xff1a;高内聚&#xff08;内容的聚合&#xff09;&#xff0c;低耦合&#xff08;功能与功能之间的联系&#xff09; 代码里尽量不要有冗余&#xff1a;既重复&#xff0c;没有用的代码 using System.Collections; using System.Collections.Generic; …...

    2023/5/28 20:55:21
  11. 数据持久化PlayerPrefs

    1、Unity3D中的数据持久化是以键值对的形式存储的&#xff0c;可以看作是一个字典 2、Unity3D中的值是通过键名来读取的&#xff0c;当值不存在时&#xff0c;返回默认值 3、在Unity中只支持int、float、string这三种数据类型的读取&#xff0c;因此可以使用这三种数据类型来存…...

    2023/5/28 20:55:18
  12. SVN常用命令

    http://www.cnblogs.com/liwanggui/archive/2016/06/28/5624147.html...

    2023/5/28 20:55:17
  13. 关于U3D图片的压缩格式

    http://blog.sina.com.cn/s/blog_930ffa0b0102vass.html...

    2023/5/28 20:55:16
  14. unity延时方法

    http://www.cnblogs.com/louissong/p/3832960.html 借鉴上面的博客中的内容&#xff1a; Invoke(methodName: string, time: float): void; methodName:方法名 time:多少秒后执行 InvokeRepeating InvokeRepeating(methodName: string , time: float , repeatRate: float ):…...

    2023/5/28 20:55:15
  15. unity中Android环境变量配置

    http://www.cnblogs.com/windytrees/p/7533477.html...

    2023/5/28 20:55:14
  16. Opengl库函数列表

    http://www.cnblogs.com/GameDeveloper/archive/2012/01/07/2315867.html...

    2023/5/28 20:55:13
  17. Unity3D中的Quality

    Quality Level&#xff1a;质量等级&#xff0c;默认为打包最低的那个等级 Name&#xff1a;质量级别的名称 Pixel Light Count&#xff1a;像素灯数量&#xff08;前向渲染使用的像素灯的最大数量&#xff09; Texture Quality&#xff1a;纹理质量&#xff08;可以设置最大分…...

    2023/5/28 20:55:12
  18. 浅谈优化

    UI的拼接要讲究章法&#xff0c;根据一定的效率流程去走&#xff0c;会提高效率&#xff0c;还需要遵守原则&#xff0c;提高性能 流程如下&#xff1a; 1、原画师提供效果图 原画师一般会先给一张效果图&#xff0c;表示这个界面风格会做成什么样的&#xff0c;基本功能都会展…...

    2023/5/28 20:55:10
  19. C#之代码优化

    1、if和swith&#xff1a; 区别&#xff1a;1、if语句会执行多次判断&#xff0c;增加CPU的消耗&#xff0c;效率较低&#xff1b;switch只判断一次&#xff0c;效率较高 2、if表示的是一个范围&#xff0c;switch表示一个点 2、for和foreach foreach&#xff1a;每变量一次就会…...

    2023/5/28 20:55:09
  20. uniy中所有的特殊文件夹

    http://www.xuanyusong.com/archives/3229...

    2023/5/28 20:55:08
  21. Unity之AssetBundle打包

    AssetBundle Resources&#xff1a;表示U3D自动将资源打成一个AssetBundle包&#xff0c;所有放在Resources下的文件夹都会打成一个AssetBundle包&#xff0c;资源非常大&#xff0c;Resources文件夹在真机上最大只有2G的内存&#xff08;专业版会增大内存&#xff09; AssetBu…...

    2023/5/28 20:55:07
  22. Params关键字

    https://www.cnblogs.com/gjhjoy/p/3573330.html...

    2023/5/28 20:55:04
  23. 关于博客的更新问题

    ...

    2023/5/28 20:55:03
  24. 设计模式原则

    设计模式&#xff1a; 定义&#xff1a;设计可以反复使用的&#xff0c;可以解决特定问题的设计方法 作用&#xff1a;解决同一类型的问题&#xff0c;设计模式可以让代码结构更加清晰 面向对象设计中常见的设计原则&#xff1a; 原则的作用&#xff1a;让自己设计实现出来的软…...

    2023/5/28 20:55:02
  25. VS2015秘钥

    Visual Studio Professional 2015简体中文版&#xff08;专业版&#xff09;KEY&#xff1a;HMGNV-WCYXV-X7G9W-YCX63-B98R2Visual Studio Enterprise 2015简体中文版&#xff08;企业版&#xff09;KEY&#xff1a;HM6NR-QXX7C-DFW2Y-8B82K-WTYJV...

    2023/5/28 20:55:00
  26. UGUI中Text的换行

    通过代码中的\n可以直接执行换行效果&#xff0c;但是我们在平常的工作中一般都是读表&#xff0c;既在Inspector面板中的Text组件中输入同样的内容就达不到换行效果&#xff1b; 其实unity把\n转变成了\\n&#xff0c;我们只需要变回来就可以了&#xff0c;代码如下 string Ge…...

    2023/5/28 20:54:59
  27. Unity中的点击,长按,划动

    public void GetClickType() {if(Input.GetMouseButtonDown(0)){if(isGetBeginPos){beginPosition Input.mousePosition;isGetBeginPos false;}if(isCheckCollider){//检测碰撞体isCheckCollider false; } }if(Input.GetMouseButton(0)){timer Time.deltaTime;curPosit…...

    2023/5/28 20:54:56
  28. 碰撞体速度过快穿透的问题

    问题&#xff1a;假设现在A物体以非常高的速度移动&#xff0c;而unity每一帧的检测时间大概是0.02秒&#xff0c;也就是说如果物体A速度过快&#xff0c; 在不用0.02秒的时间就已经穿过了其他物体&#xff0c;那么这个时候是无法检测A与其他物体之间的碰撞信息的 主要原因是&a…...

    2023/5/28 20:54:53
  29. UGUI脚本添加Btn回调的方法

    using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems;//对添加这个脚本的对象添加EventTrigger组件 [RequireComponent(typeof(UnityEngine.EventSystems.EventTrigger))] public class Bt…...

    2023/5/28 20:54:52
  30. unity中给图片换颜色

    slot边框.color new Color32 (93,165,255,255);...

    2023/5/28 20:54:50
  31. 【ChatGPT】从零开始构建基于ChatGPT的嵌入式(Embedding) 本地(Local) 智能客服问答机器人模型

    目录 方案流程 1. Embeddings 介绍 术语&#xff1a;微调 vs 嵌入 一句话理解便是&#xff1a;embedding model 可以将文本转换为固定长度的连续向量。 架构流程图 3、Qdrant云数据库的搭建 3.1、初识Qdrant 3.2、创建云数据库 3.3、通过curl 接口访问 4、写入测试数…...

    2023/5/28 17:16:05
  32. 【ChatGPT】在20分钟内使用 LangChain + Ray构建自托管问答服务

    This is part 3 of a blog series. In this blog, we’ll show you how to build an LLM question and answering service. In future parts, we will optimize the code and measure performance: cost, latency and throughput. 这是博客系列的第 3 部分。在本博客中,我们将…...

    2023/5/28 15:14:53
  33. 【ChatGPT】Turbocharge LangChain: guide to 20x faster embedding | LangChain: 嵌入速度提高 20 倍的指南

    目录 Why do I need to parallelize this?为什么我需要并行化它? Stages of our Data Pipeline 数据管道的各个阶段 Execution...

    2023/5/28 15:06:52
  34. 最新ChatGPT GPT-4 相似匹配Embedding技术详解(附ipynb与python源码及视频讲解)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(一)

    目录 前言最新ChatGPT GPT-4 相似匹配Embedding技术详解1. 何为Embedding2. 相关API2.1 LMAS Embedding API2.2 ChatGPT Style 3. Embedding应用3.1 QA3.2 聚类3.3 推荐 相关文献 参考资料其它资料下载 前言 如果您想提高ChatGPT中文本处理的效率和精度&#xff0c;那么Embedd…...

    2023/5/28 12:45:09
  35. ChatGPT的access_token获取(最新!!!)

    ChatGPT的access_token获取&#xff08;最新&#xff01;&#xff01;&#xff01;&#xff09; 序言 最近在搞移动应用开发&#xff0c;心血来潮写了个chatGPT的app&#xff0c;但是接口只能用官网提供的&#xff0c;我自己的号没有免费额度&#xff0c;朋友的号也就5$的额度…...

    2023/5/28 12:19:58
  36. 【ChatGPT】ChatGPT 在智能客服产品如何落地?

    目录 简介 智能客服产品的典型特征 人力密集: 数据密集: 流程可定义:...

    2023/5/28 12:15:11
  37. 【ChatGPT】ChatGPT使用指南——句词分类

    目录 ChatGPT使用指南——句词分类 1. NLU基础 1.1 句子级别的分类 1.2 Token级别的分类 2. 相关API...

    2023/5/28 11:56:24
  38. 【ChatGPT】技术原理:ChatGPT怎么工作?

    目录 简介:ChatGPT的工作原理概述 Transformer 架构原理...

    2023/5/28 10:39:46
  39. 【ChatGPT】ChatGPT基础科普——知其一点所以然

    目录 ChatGPT基础科普——知其一点所以然 语言的本质 从图灵测试到ChatGPT 1. LM 2. Transformer 3. GPT...

    2023/5/28 10:09:26
  40. ChatGPT使用指南——相似匹配

    目录 ChatGPT使用指南——相似匹配 1. 何为Embedding 2. 相关API 2.1 LMAS Embedding API 2.2 ChatGPT Style 3. Embedding应用...

    2023/5/28 8:55:00
  41. 【ChatGPT】使用 LangChain 和 Ray 实现 100 行代码构建 LLM 开源搜索引擎【1】

    目录 Introduction Building the index 构建索引 Accelerating indexing using Ray 使用 Ray 加速索引编制 Serving Conclusion...

    2023/5/28 8:53:34
  42. 【ChatGPT】ChatGPT使用指南——文本生成

    目录 ChatGPT使用指南——文本生成 1 引言 2 文本摘要任务 2.1 什么是文本摘要&#xff1f; 2.2 常见的文本摘要技术 2.3 基于OpenAI接口的文本摘要实验 3 文本纠错任务 3.1 什么是文本纠错&#xff1f; 3.2 常见的文本纠错技术 3.3 基于OpenAI接口的文本纠错实验 4…...

    2023/5/28 8:24:05
  43. ChatGPT商业应用——LLM是星辰大海

    目录 ChatGPT商业应用——LLM是星辰大海 1. 研究背景 1.1 研究背景 1.2 研究方法...

    2023/5/28 7:59:04
  44. 国内可直接访问ChatGPT体验站,已稳定2个月 (域名被拦截解决方案)

    新体验地址&#xff1a;https://zizhu888.cn/chatgpt/index.html ChatGPT体验站3月初上线&#xff0c;上线后&#xff0c;PV最高时3000&#xff0c;UV2000&#xff0c;付费用户有小300个 上线后&#xff0c;前前后后遇到了不少坑爹问题&#xff0c;下面是最近PV访问曲线图&am…...

    2023/5/28 7:33:09
  45. AIGC——使用Cursor对比直接使用chatGPT有哪些技巧

    Cursor对比直接使用chatGPT有哪些优势 1. 聊聊it团队经常面临的问题2. 试想一些AI辅助的应用场景3. 看回现实可用的工具及其使用3.1 加载文件作为对话上下文3.2 源码工程辅助阅读3.3 批量文件式输入口3.4 规范核查工具 4 通用思路4.1 提供解决方案思路4.2 借助chatGPT构建全流程…...

    2023/5/28 4:27:19
  46. ChatGPT中文版Prompt提示工程超详细指南《提示工程高级技巧与技术》Github最新破万星项目Meta AI前工程师解密百万年薪提示工程师GPT-4模型优化利器(二)不定期更新

    提示工程高级技巧与技术 前言Introduction 导言零样本提示少样本提示少样本提示的限制 Chain-of-Thought Prompting 链式思考&#xff08;CoT&#xff09;提示零样本COT提示 Zero-shot COT 自我一致性生成知识提示自动提示工程师&#xff08;APE&#xff09;Active-Prompt方向性…...

    2023/5/28 0:42:10
  47. 【ChatGPT】ChatGPT使用指南——文本推理

    目录 ChatGPT使用指南——文本推理 1. 什么是推理(Reasoning)? 2. 导入ChatGPT 3. 测试ChatGPT的推理能力...

    2023/5/27 23:40:23
  48. ChatGPT免费使用的方法有哪些?

    目录 一、ChatGpt是什么&#xff1f; 二、ChatGPT国内免费使用的方法&#xff1a; 第一点&#xff1a;电脑端 第二点&#xff1a;手机端 三、结语&#xff1a; 一、ChatGpt是什么&#xff1f; ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…...

    2023/5/27 23:37:06
  49. 用ChatGPT辅助处理Excel

    在日常工作中&#xff0c;我们经常需要处理大量的Excel表格&#xff0c;而在处理Excel表格时&#xff0c;常常会遇到重复、冗余、不清晰的数据等问题&#xff0c;导致我们耗费大量的时间和精力。 在这种情况下&#xff0c;现代技术的应用提供了更加高效的解决方案&#xff0c;…...

    2023/5/27 18:32:31
  50. Pycharm安装ChatGPT插件

    文章目录 前言一、安装ChatGPT插件二、使用步骤1.打开NexChatGPT2.发送请求 总结 前言 通过安装ChatGPT插件&#xff0c;您可以在PyCharm中更轻松、高效地使用ChatGPT模型进行开发&#xff0c;从而提高您的工作效率和准确性。 一、安装ChatGPT插件 打开PyCharm&#xff0c;单…...

    2023/5/27 17:28:47
  51. 它来了!ios版ChatGPT

    ChatGPT 的 iOS 版终于来了&#xff0c;不过目前只支持 iOS 美丽国区&#xff0c;你需要使用美丽国区账号才能下载使用。 目录 前提使用总结 前提 一部苹果手机一个美丽国苹果账号一个可以正常访问ChatGPT网页版的网络环境一个ChatGPT账号 使用 登录准备好的美丽国苹果账号。…...

    2023/5/27 10:28:02
  52. 好用的IntelliJ IDEA ChatGPT插件:NexChatGPT

    随着ChatGPT的爆火&#xff0c;ChatGPT给我们的生产生活带来一定的影响&#xff0c;ChatGPT相关的工具插件潮水般的涌现。ChatGPT对IT的影响也不小&#xff0c;尤其是自动化编程&#xff0c;今天介绍几款IntelliJ IDEA中ChatGPT插件。 一、NexChatGPT NexChatGPT是一款开箱即…...

    2023/5/27 0:48:49
  53. 2023小狐狸ChatGPT源码1.9小程序 带绘画 带分销流量主系统智能客服AI源码+教程

    2023全开源ChatGPT微信小程序&#xff0c;狐狸版本1.9&#xff0c;5.12已更新&#xff0c;增加绘画功能&#xff0c;带流量主带付费购买次数&#xff0c;可邀请好友获得问答次数 看广告获得问答次数 付费购买获得问答次数 狐狸版号1.9&#xff08;最 新版&#xff09;&#xf…...

    2023/5/26 17:51:14
  54. 【国内chatgpt使用方法合集】(5月26日已更新)

    写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…...

    2023/5/26 17:44:47
  55. 【ChatGPT】GPT-5 下一代:即将到来的7种能力将改变人工智能和技术的未来 | OpenAI

    GPT-5 下一代:即将到来的7种能力将改变人工智能和技术的未来 | OpenAI 文章目录 GPT-5 下一代:即将到来的7种能力将改变人工智能和技术的未来 | OpenAI第一:扩展多模式理解。第二:交互式多媒体。第三:为具备一般能力的机器人提供动力。第四:自主人工智能模型开发。第五:…...

    2023/5/26 11:55:09
  56. 玩转ChatGPT:论文辅助写作(附Claude测评)

    一、写在前面 嘿&#xff01;嘿&#xff01;嘿&#xff01;大家好&#xff0c;今天我们来聊一下使用GPT们进行论文辅助写作。不过&#xff0c;我要先交代一下&#xff0c;GPT的使用门槛比较高&#xff0c;不少童鞋都用不上。所以&#xff0c;我极力推荐一个平替产品——Claude…...

    2023/5/26 11:26:08
  57. [持续更新]使用chatgpt的几种方法~

    1. monica 使用edge浏览器或者chrome浏览器&#xff0c;直接在官网下载即可&#xff0c;网址直通&#xff1a; bing: https://www.microsoft.com/zh-cn/edge/download?formMA13FJ google&#xff1a; Google Chrome 网络浏览器 备注&#xff1a;你需要先搭上梯子哈 安装打…...

    2023/5/26 10:39:41
  58. 苹果手机爽了!一招搞定ChatGPT Plus,超级稳!

    大家好&#xff0c;我是五竹。 昨天用苹果手机尝试了一下&#xff0c;借助App Store&#xff08;苹果应用商店&#xff09;升级 Plus&#xff0c;成功了&#xff01;一共升级了三个号&#xff01;有两个一气呵成&#xff0c;轻松搞定。最后一个可能触发风控了&#xff0c;但第…...

    2023/5/26 9:58:09
  59. ChatGPT账号注册,为什么总是提示Access Denied you do not have acces

    问题&#xff1a;提示Access denied 无法登录登录的时候&#xff0c;提示Access denied,You do not have access to chat.openai.com.原因登录出现这个界面&#xff0c;说明你的IP被OpenAI拉黑了&#xff0c;OpenAI对比较频繁访问的云主机商屏蔽了相关的IP出口段&#xff0c;所…...

    2023/5/26 9:00:56
  60. ChatGPT 的 AskYourPDF 插件所需链接如何获取?

    一、背景 目前 ChatGPT 主要有两款 PDF 对话插件&#xff0c;一个是 AskYourPDF 一个是 ChatWithPDF&#xff08;需 ChatGPT Plus&#xff09;&#xff0c;他们都可以实现给一个公共的PDF 链接&#xff0c;然后进行持续对话&#xff0c;对读论文&#xff0c;阅读 PDF 格式的文…...

    2023/5/26 8:27:01