此系统为V3.0,全新的设计,代码非常简洁,维护非常简单,扩展性能非常好。
在此基础上开发了一个crm系统,展示地址为http://temp.qingdie.net
一、系统特点
系统拥有10套皮肤,和7套菜单表现方式。
系统具有9大特点:
1、框架独立化;2、模块插件化;
3、数据请求异步化;4、权限分配可视化;
5、数据库配置,安装,备份自动化;6、设计分层化;
7、系统错误日志化;8、皮肤个性化;
9、体验人性化。
数据存储:Mssql、Oracle、Sqlite、Access自主切换。
前端框架:jQuery、easyui、knockout、alertify、ueditor
系统框架:系统使用单独设计开发的后台管理系统,其经过测试具有很多优秀性能。
UI设计:系统UI使用了动态菜单布局功能和主题css切换。
性能优化:使用了css、js压缩缓存技术,Httphandlers拦截优化技术。
二、系统截图
用户管理
菜单维护
产品评价添加
授权可视化
数据库配置。
三、系统设计
解决方案结构,这是crm系统,
么有一个aspx页面,
下面贴上部分代码:
$(function () { autoResize({ dataGrid: '#datagrid', gridType: 'treegrid', callback: mygrid.databind, height: 5 }); simpleSearch(); $('#a_add').click(mygrid.add); $('#a_edit').click(mygrid.edit); $('#a_delete').click(mygrid.del); }); var mygrid = { actionUrl: '/crm/CategoryAction', formUrl: '/crm/html/Category.html', databind: function (size) { $('#datagrid').treegrid({ toolbar: '#toolbar', url: mygrid.actionUrl, size.width, height: size.height, idField: 'CategoryId', treeField: 'Name', iconCls: 'icon-nav', nowrap: false, rownumbers: true, animate: true, collapsible: false, columns: [[ { title: '名称', field: 'Name', 200, sortable: true }, { title: '排序', field: 'SortNum', 80, sortable: true } ]], pagination: true, pageSize: PAGESIZE, pageList: [20, 40, 50] }); }, reload: function () { $('#datagrid').treegrid('reload'); }, selectRow: function () { return $('#datagrid').treegrid('getSelected'); }, Init: function (categoryId) { var treeData = $('#datagrid').treegrid('getData'); treeData = $.toJSON(treeData).replace(/CategoryId/g, 'id').replace(/Name/g, 'text'); treeData = '[{"id":0,"selected":true,"text":"请选择父级菜单"},' + treeData.substr(1, treeData.length - 1); top.$('#txt_ParentId').combotree({ data: $.evalJSON(treeData), panelWidth: '180', editable: false, lines: true, onSelect: function (item) { var nodeId = top.$('#txt_ParentId').combotree('getValue'); if (item.id == categoryId) { top.$('#txt_ParentId').combotree('setValue', nodeId); top.$.messager.alert('系统提示', '上级菜单不能与当前菜单相同', 'warning'); } } }).combotree('setValue', 0); }, add: function () { var addDialog = top.$.hDialog({ title: '添加类别', 350, height: 200, href: mygrid.formUrl, ICONCLS: 'icon-add', onLoad: function () { mygrid.Init(); var row = mygrid.selectRow(); if (row) { top.$('#txt_ParentId').combotree('setValue', row.CategoryId); } }, submit: function () { if (top.$('#qingdieform').form('validate')) { $.ajaxjson(mygrid.actionUrl, createParam('add', 0), function (d) { if (d.Success) { msg.ok(d.Message); addDialog.dialog('close'); mygrid.reload(); } else { MessageOrRedirect(d); } }); } } }); }, edit: function () { var row = mygrid.selectRow(); if (row) { var addDialog = top.$.hDialog({ title: '编辑类别', 350, height: 200, href: mygrid.formUrl, ICONCLS: 'icon-add', onLoad: function () { var m = top.ko.mapping.fromJS(row); top.ko.applyBindings(m); mygrid.Init(row.CategoryId); top.$('#txt_ParentId').combotree('setValue', row.ParentId); }, submit: function () { if (top.$('#qingdieform').form('validate')) { $.ajaxjson(mygrid.actionUrl, createParam('edit', row.CategoryId), function (d) { if (d.Success) { msg.ok(d.Message); addDialog.dialog('close'); mygrid.reload(); } else { MessageOrRedirect(d); } }); } } }); } else { msg.warning("请选择要编辑的客户"); } }, del: function () { var row = mygrid.selectRow(); if (row) { msg.confirm('您确认要删除此类别吗?', function (r) { if (r) { $.ajaxjson(mygrid.actionUrl, createParamNoEntity('del', row.CategoryId), function (d) { if (d.Success) { msg.ok(d.Message); mygrid.reload(); } else { MessageOrRedirect(d); } }); } }); return false; } else { msg.warning("请选择要删除的类别!"); } return false; } };
using System.Web; using Qingdie.HTWeb.BLL.Ui; using Qingdie.HTWeb.CRM.BLL; using Qingdie.HTWeb.CRM.Model; using Qingdie.HTWeb.Help; namespace Qingdie.HTWeb.CRM.Action { public class CategoryAction:IAction { public void Action(HttpContext context) { var json = HttpContext.Current.Request["json"]; var rpm = new RequestParamModel<Category>(context) { CurrentContext = context }; if (!string.IsNullOrEmpty(json)) { rpm = JsonHelper.ConvertToObject<RequestParamModel<Category>>(json); rpm.CurrentContext = context; } var bllCategory = new BllCategory(); switch (rpm.Action) { case "add": context.Response.Write(bllCategory.Add(rpm.Entity)); break; case "edit": var customer = rpm.Entity; customer.CategoryId = rpm.KeyId; context.Response.Write(bllCategory.Edit(customer)); break; case "del": context.Response.Write(bllCategory.Delete(rpm.KeyId)); break; case "catetree": context.Response.Write(bllCategory.GetCategoryTreeJson()); break; default: context.Response.Write(bllCategory.CategoryListJson(rpm.Pageindex, rpm.Pagesize, rpm.Filter, rpm.Sort, rpm.Order)); break; } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Qingdie.help; using Qingdie.HTWeb.BLL; using Qingdie.HTWeb.CRM.Model; using Qingdie.HTWeb.Help; using Qingdie.Log; using QingdieDb; namespace Qingdie.HTWeb.CRM.BLL { public class BllCategory { private const string Module = "类别管理"; public string Add(Category category) { var msg = new JsonMessage { Message = "添加成功" }; try { using (var db = new DbContext()) { if (db.Any<Category>(d => d.Name == category.Name)) { msg.Message = "该类别名称已经存在"; } else { db.Add(category); msg.Success = true; } } } catch (Exception err) { msg.Message = err.Message; BllErrLog.ErrLog(err, Module, "类别添加", category); } return msg.ToString(); } public string Edit(Category category) { var msg = new JsonMessage { Message = "编辑成功" }; try { using (var db = new DbContext()) { if (db.Any<Category>(d => d.Name == category.Name && d.CategoryId != category.CategoryId)) { msg.Message = "该类别名称已经存在"; } else { db.Update(category, d => d.CategoryId == category.CategoryId); msg.Success = true; } } } catch (Exception err) { msg.Message = err.Message; BllErrLog.ErrLog(err, Module, "类别编辑", category); } return msg.ToString(); } public string Delete(int categoryId) { var msg = new JsonMessage { Message = "删除成功" }; try { using (var db = new DbContext()) { db.Delete<Category>(d => d.CategoryId == categoryId); msg.Success = true; } } catch (Exception err) { msg.Message = err.Message; BllErrLog.ErrLog(err, Module, "类别删除", categoryId); } return msg.ToString(); } public string CategoryListJson(int pageindex, int pagesize, string filterJson, string sort, string order) { try { var orderType = OrderType.Asc; if (!string.IsNullOrEmpty(order)) { if (order == "desc") orderType = OrderType.Desc; } OrderSort<Category> sorts; switch (sort) { case "Name": sorts = new OrderSort<Category>(d => d.Name, orderType); break; default: sorts = new OrderSort<Category>(d => d.SortNum, orderType); break; } using (var db = new DbContext()) { int pagecount; int datacount; var button = db.SelectPageObject(d => d.ParentId == 0, pageindex, pagesize, out pagecount, out datacount, sorts); return JsonHelper.ToJson(datacount, button); } } catch (Exception err) { BllErrLog.ErrLog(err, Module, "类别类别获取"); } return "[]"; } public string GetCategoryTreeJson() { using (var db = new DbContext()) { var json = JsonHelper.ToJson(db.Select<Category>(d => d.ParentId == 0)); return json.Replace(""CategoryId"", ""id"").Replace(""Name"", ""text""); } } } }
using System.Collections.Generic; using QingdieDb; namespace Qingdie.HTWeb.CRM.Model { [Entity("CategoryId")] public class Category { [Property(Identity = true)] public int? CategoryId { get; set; } public string Name { get; set; } public int? ParentId { get; set; } public int? SortNum { get; set; } [Relationship(RelationKey = "ParentId")] public List<Category> children { get; set; } } }
一个功能仅仅需要这些,即可完美实现
下面提供crm系统的全部源码,只限于非商业使用,
如果需要本后台系统框架,请来联系购买!
下载地址:
http://blog.qingdie.net/html/20140712232453958.html