倾蝶后台系统

此系统为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,
            width: size.width,
            height: size.height,
            idField: ‘CategoryId‘,
            treeField: ‘Name‘,
            iconCls: ‘icon-nav‘,
            nowrap: false,
            rownumbers: true,
            animate: true,
            collapsible: false,
            columns: [[
                    { title: ‘名称‘, field: ‘Name‘, width: 200, sortable: true },
                    { title: ‘排序‘, field: ‘SortNum‘, width: 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: ‘添加类别‘, width: 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: ‘编辑类别‘,
                width: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;
    }
};

类别管理js

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;
            }
        }
    }
}

类别管理Action

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

倾蝶后台系统

时间: 2024-10-01 12:17:03

倾蝶后台系统的相关文章

关于后台系统自动生成的一点思考

大量实践发现后台管理程序,其实90%的代码都是相同的,当然是在抛弃复杂逻辑业务的情况下,那么如何能高效的节约这些时间呢,那就是接下来我要说的,对于后台系统自动生成的一些思考. 适用情景: 1.表编号id为自增(基于现在大部分表编号都是自增的情况): 2.没有太复杂业务关联关系,比如表的某一个字段,存储了一个json对象,为了平衡后台用户使用,需要友好的分段展示给用户的定制ui界面:还比如表中存储了外键的多个id,但为了方便用户使用,只能已标签name的方式,给用户展示,等等这些超强业务黏合逻辑的

电商网站前台与后台系统架构

之前做的一直在做网站的后台系统: 这些都是本网站的后台系统. 下面看下前台系统是如何搭建的: 因为现在客户端有pc端和移动端,所以将客户端不直接与数据库连接,而是采用服务端跟数据库连接,每个独立的客户端可以单独调用服务的接口,这样方便部署和管理. 为什么要这样做呢? 在互联网系统开发当中,我们一般都是采用了分层的方式来架构系统,但是为什么我们需要分层进行架构呢? 采用分层架构有利于系统的维护,系统的扩展.这其实就是系统的可维护性和可扩展性. 分层就是按照功能把系统切分细分,细分之后就能分布式部署

PD003-NET通用后台系统

PD003-NET通用后台系统 开发语言.Net 成品成品 前端技术jquery 数据库sql server .net 通用后台框架 详细信息 基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用,提供了OA.CRM.CMS的原型实例,适合快速构建中小型互联网及行业Web系统,也可用来学习. Framework 业务无关的底层通用机制及功能 -Model基类:提供数据传输和底层的最基本的基类及接口 -DAL底层:基于EF c

跟我一起学extjs5(30--加入模块和菜单定义[3后台系统数据的组织和生成])

跟我一起学extjs5(30--加入模块和菜单定义[3后台系统数据的组织和生成]) 对于大多web程序来说,后台是完成控制和处理的,前台就是一个展示工具,这个系统也是这样.在上一节中建立了四个模块,下面开始设计前后台的交互.将系统信息和模块.菜单信息传到前台,由前台来进行展示. 首先新建一个java bean类用来存放各种需要传到前台的数据,里面包括:系统信息.操作人员信息.服务人员信息.模块信息.菜单.现在只加入了这几个,以后还要加入各种 各样的权限设置.在com.jfok.server.co

提升后台系统

提升后台系统的用户体验 要说程序员最开心的事情是什么,不是钱多活少离家近,而是能用自己喜欢的技术,做一个排期不紧的舒坦项目.最近我就接手了这样一个项目,使用了webpack+vue全家桶,以及其他一些业界前沿技术.不过今天不聊技术方面,先聊聊我对交互方面的一些思考.尽管它只是一个后台系统. 说到后台系统(管理系统.ERP系统),我也做过很多了,无一不难看.难用.因为这类系统不是给终端用户使用,对交互要求不高,也没有UI设计,有时候连PM也没有,全凭程序员胡搞. 我对后台系统却一直有一个心结,尽管

HTML入门(三)后台系统显示页面_框架标签

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>网站后台系统显示页面</title> </head> <--!>行划分</--!> <frameset rows="20%, *"> <frame src="top.html" /> <--!

微商管理后台系统解决方案

微商后台管理系统.微商后台管理系统开发(陈琦:138-2848-7919可微)微商后台管理系统开发,现代社会已经进入了一个网络和信息高速发展的时代,电子政务建设工作已经成为政府工作的又一重点.因此,在劳教工作中,充分利用现今先进的信息化网络技术,改变传统的工作方式和手段,提高劳教工作业务水平,对全面推进全省劳教工作具有重大意义.建设基础信息及授权管理系统,是使劳教工作信息化.网络化的一项重要工作.至于这些问题到底出现在什么环节?有些什么样的影响?到底有没有什么好的解决方案呢?微商管理系统到底是如

《暗黑世界GM管理后台系统》部署+功能说明文档

(一)功能描述 该后台共分为三大部分:服务器管理.单服数据统计和扶持账号管理. 1.服务器管理: 根据管理后台数据库中填写的服务器信息(后面会讲到如何填写要管理的服务器的信息到数据库中),该部分可以看到所有服务器的名称,ip地址,开服时间以及开启状况,其中对服务器的开启.关闭功能尚未开放.在运营商及服务器后面的下拉列表中可根据需求选择对应的游戏服务器进行管理. 2.单服数据统计: 同上,需要先在运营商及服务器后面的下拉列表中选择对应的服务器,才可查看相应服务器的信息. 这部分分为单日的详细数据和

基于Vue实现后台系统权限控制

原文地址:http://refined-x.com/2017/08/29/基于Vue实现后台系统权限控制/,转载请注明出处. 用Vue/React这类双向绑定框架做后台系统再适合不过,后台系统相比普通前端项目除了数据交互更频繁以外,还有一个特别的需求就是对用户的权限控制,那么如何在一个Vue应用中实现权限控制呢?下面是我的一点经验. 权限控制是什么 在权限的世界里服务端提供的一切都是资源,资源可以由请求方法+请求地址来描述,权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配