本文介绍如何实现进销存管理系统的基础数据模块,基础数据模块包括商品信息、供应商管理和客户管理3个菜单页面。供应商和客户字段相同,因此可共用一个页面组件类。

1. 配置模块

运行项目,在【系统管理-模块管理】中添加商品信息、供应商管理、客户管理3个模块菜单,模块基本信息、模型、页面、表单设置之前有视频教程,这里不再细说了。

2. 实体类

JxcLite项目Entities文件夹下面添加JxGoods.csJxPartner.cs两个实体类文件,实体类代码可以直接复制模块管理中由模型设置生成的代码。文章中只简单描述一下实体类的定义,具体代码参见开源,代码定义如下:

namespace JxcLite.Entities;

/// <summary>
/// 商品信息类。
/// </summary>
public class JxGoods : EntityBase { } /// <summary>
/// 商业伙伴信息类。
/// </summary>
public class JxPartner : EntityBase { }

3. 建表脚本

最理想的情况是:在系统安装时,通过实体类和数据库类型自动生成建表脚本创建实体数据库表。这里还是用传统手动方式执行建表脚本,在JxcLite.Web项目Resources文件夹下添加Tables.sql资源文件,复制粘贴由【模块管理-模型设置】中生成的建表脚本。文章中只简单描述一下建表脚本,具体脚本参见开源,内容如下:

CREATE TABLE [JxGoods] (
[Id] varchar(50) NOT NULL PRIMARY KEY,
...
[Files] nvarchar(500) NULL
); CREATE TABLE [JxPartner] (
[Id] varchar(50) NOT NULL PRIMARY KEY,
...
[Note] ntext NULL,
[Files] nvarchar(500) NULL
);

4. 服务接口

JxcLite项目Services文件夹下面添加基础数据模块服务接口类,文件名定义为IBaseDataService.cs,该接口定义前后端交互的Api访问方法,包括分页查询、批量删除实体、保存实体。具体方法定义如下:

namespace JxcLite.Services;

public interface IBaseDataService : IService
{
//分页查询商品信息
Task<PagingResult<JxGoods>> QueryGoodsesAsync(PagingCriteria criteria);
//批量删除商品信息
Task<Result> DeleteGoodsesAsync(List<JxGoods> models);
//保存商品信息
Task<Result> SaveGoodsAsync(UploadInfo<JxGoods> info); //分页查询供应商和客户信息
Task<PagingResult<JxPartner>> QueryPartnersAsync(PagingCriteria criteria);
//批量删除供应商和客户信息
Task<Result> DeletePartnersAsync(List<JxPartner> models);
//保存供应商和客户信息
Task<Result> SavePartnerAsync(UploadInfo<JxPartner> info);
}

5. 服务实现

JxcLite.Web项目Services文件夹下面添加基础数据模块服务接口的实现类,文件名定义为BaseDataService.cs,文章中只简单描述一下实现类的定义和继承,具体实现参见开源,定义如下:

namespace JxcLite.Web.Services;

class BaseDataService(Context context) : ServiceBase(context), IBaseDataService
{
public Task<PagingResult<JxGoods>> QueryGoodsesAsync(PagingCriteria criteria) { }
public Task<Result> DeleteGoodsesAsync(List<JxGoods> models) { }
public Task<Result> SaveGoodsAsync(UploadInfo<JxGoods> info) { } public Task<PagingResult<JxPartner>> QueryPartnersAsync(PagingCriteria criteria) { }
public Task<Result> DeletePartnersAsync(List<JxPartner> models) { }
public Task<Result> SavePartnerAsync(UploadInfo<JxPartner> info) { }
}

双击打开JxcLite.Web项目中的AppWeb.cs文件,在AddJxcLiteCore方法中注册服务类,前端组件可以通过依赖注入工厂创建服务的实例。代码如下:

public static class AppWeb
{
public static void AddJxcLiteCore(this IServiceCollection services)
{
services.AddScoped<IBaseDataService, BaseDataService>();
}
}

6. 数据依赖

JxcLite.Web项目Repositories文件夹下面添加基础数据模块数据依赖类,文件名定义为BaseDataRepository.cs,文章中只简单描述一下依赖类的定义,具体实现参见开源,定义如下:

namespace JxcLite.Web.Repositories;

class BaseDataRepository
{
internal static Task<PagingResult<JxGoods>> QueryGoodsesAsync(Database db, PagingCriteria criteria) { } internal static async Task<bool> ExistsGoodsCodeAsync(Database db, JxGoods model) { } internal static Task<PagingResult<JxPartner>> QueryPartnersAsync(Database db, PagingCriteria criteria) { } internal static async Task<bool> ExistsPartnerNameAsync(Database db, JxPartner model) { }
}

7. 数据导入类

JxcLite.Web项目Imports文件夹下面添加商品信息、供应商和客户的导入类,文件名定义为JxGoodsImport.csJxPartnerImport.cs导入类名称命名规范是:实体类名+Import,导入框架自动根据名称识别,文章中只简单描述一下导入类的定义,具体实现参见开源,定义如下:

namespace JxcLite.Web.Imports;

class JxGoodsImport(ImportContext context) : ImportBase<JxGoods>(context)
{
//初始化导入字段,自动生成导入规范Excel文件
public override void InitColumns() { }
//执行导入文件
public override async Task<Result> ExecuteAsync(SysFile file) { }
} class JxPartnerImport(ImportContext context) : ImportBase<JxPartner>(context)
{
public override void InitColumns() { }
public override async Task<Result> ExecuteAsync(SysFile file) { }
}

8. 前端页面

JxcLite.Client项目Pages\BaseData文件夹下面添加商品信息和商业伙伴页面类,文件名定义为GoodsList.csPartnerList.cs,这3个模块的功能和页面非常简单,只有单表的增删改查导功能,表单页面直接通过在线表单进行配置。列表页面继承BaseTablePage类,由于该框架类封装了列表页面常用的增删改查导功能,因此具体的功能列表页面代码显得格外简单,只需要定义各操作的服务调用方法即可,具体的完整代码如下:

  • 商品信息页面
namespace JxcLite.Client.Pages.BaseData;

[StreamRendering]
[Route("/bds/goods")]
public class GoodsList : BaseTablePage<JxGoods>
{
private IBaseDataService Service; protected override async Task OnPageInitAsync()
{
await base.OnPageInitAsync();
Service = await CreateServiceAsync<IBaseDataService>();
Table.OnQuery = Service.QueryGoodsesAsync;
} public void New() => Table.NewForm(Service.SaveGoodsAsync, new JxGoods());
public void DeleteM() => Table.DeleteM(Service.DeleteGoodsesAsync);
public void Edit(JxGoods row) => Table.EditForm(Service.SaveGoodsAsync, row);
public void Delete(JxGoods row) => Table.Delete(Service.DeleteGoodsesAsync, row);
public void Import() => ShowImportForm();
public async void Export() => await ExportDataAsync();
}
  • 供应商和客户页面
[StreamRendering]
[Route("/bds/suppliers")]
public class SupplierList : PartnerList
{
protected override string Type => PartnerType.Supplier;
} [StreamRendering]
[Route("/bds/customers")]
public class CustomerList : PartnerList
{
protected override string Type => PartnerType.Customer;
} public class PartnerList : BaseTablePage<JxPartner>
{
private IBaseDataService Service; //商业伙伴类型虚拟属性,供应商和客户页面覆写。
protected virtual string Type { get; } protected override async Task OnPageInitAsync()
{
await base.OnPageInitAsync();
Service = await CreateServiceAsync<IBaseDataService>();
Table.OnQuery = QueryPartnersAsync;
} public void New() => Table.NewForm(Service.SavePartnerAsync, new JxPartner { Type = Type });
public void DeleteM() => Table.DeleteM(Service.DeletePartnersAsync);
public void Edit(JxPartner row) => Table.EditForm(Service.SavePartnerAsync, row);
public void Delete(JxPartner row) => Table.Delete(Service.DeletePartnersAsync, row);
public void Import() => ShowImportForm();
public async void Export() => await ExportDataAsync(); private Task<PagingResult<JxPartner>> QueryPartnersAsync(PagingCriteria criteria)
{
criteria.SetQuery(nameof(JxPartner.Type), QueryType.Equal, Type);
return Service.QueryPartnersAsync(criteria);
}
}

Known框架实战演练——进销存基础数据的更多相关文章

  1. 文献综述十八:基于SSH框架的进销存管理系统设计与实现

    一.基本信息 标题:基于SSH框架的进销存管理系统设计与实现 时间:2017 出版源:内蒙古科技与经济 文件分类:对框架的研究 二.研究背景 进销存管理系统在各企业中广泛应用,使用SSH框架,很大程度 ...

  2. Odoo进销存(采购、销售、仓库)入门教程 - 上

    转载地址:http://blog.csdn.net/wangnan537/article/details/46434373 运行环境: Ubuntu14.04+Odoo8.0 作者:苏州-微尘 0. ...

  3. spring boot的一个小项目小型进销存系统

    项目所需的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  4. C# WINFORM进销存系统开发(内涵免费源码+部分实操视频讲解)

    互联网的时代,电商火爆,大家都开始进行线上销售货品,那你是如何管理你的商品库存和进销问题?软积木--小敏用的是C# WINFORM进销存系统来管理我的数据,给我带来了很多便利. 它是高频需求项目,很多 ...

  5. PDA手持机 移动开单进销存系统 现场出打印凭据和扫码 新的亮点

    传统车销模式弊端:1.手写开单,效率低,动作慢2.现场手写开单明细不能打印,产品明细不规范3.电脑办公人员及车销人员对车上的库存情况掌握不清楚,销售人员对每种产品销售价格不清楚4.老板对员工工作的管控 ...

  6. 【.NET实战教程】北风网基于ASP.NET多层架构下的企业级进销存软件全程培训

    .Net进销存系统详细课程大纲(开发工具采用VS2008+sqlsever2005) [小编提醒:现在学习的话,可以使用vs2012+sql 2008 学习的是思路,教学环境不一定要一模一样]1.项目 ...

  7. Net通用进销存管理系统 + 开发文档+ 使用说明

    通用进销存管理系统 + 开发文档+ 使用说明Net源码下载 包括下面的模块基础资料模块采购管理模块库存管理模块商务管理模块营业管理模块维修管理模块会员管理模块财务管理模块 Net通用进销存管理系统 + ...

  8. 什么是智能扫描开单打印进销存POS?安卓工业手持PDA设备上的POS销售开单,现场打印打票,用扫描枪太方便了

    安卓PDA版POS销售开单如果和扫描枪配合使用,和超市的POS销售一样的操作 什么是智能扫描开单打印进销存POS? 互联网特性,让它在数据统计分析.客户关系管理等方面表现出众.智能POS,不仅是一个收 ...

  9. 浩瀚技术助力批发零售商户实现PDA移动POS打印扫描进销存信息化管理

    批发零售商户其各门店销售品种多,销售量大,在市场上占据巨大的份额,随着各门店的不断扩展,基层的销售管理并不尽如意,传统的进销存管理软件安装在PC端,无法满足有现有的业务支撑,面对当前现状,移动进销存管 ...

  10. 改变传统的开单模式------手持POS终端移动销售开单 移动进销存的利器

    手持POS终端高清彩屏,清晰.美观.大方,适用于仓库.超市.服装.食品.批发零售.手机电脑等企业管理.可与管理软件灵活对接.1:员工记不住价格,产品名称,只要有PDA扫描,价格,库存,直接开销售单,打 ...

随机推荐

  1. pwn杂项之linux命令执行

    通常pwn题目,时常会考到对Linux命令的一些使用,比如当cat被禁用的时候,可以使用tac,或者别的命令代替 下面是buu上的应该题目,考察的就是对liunx命令的理解,以及对程序的分析. 题目地 ...

  2. golang 怎样防止结构体对象被拷贝

    主要实现Lock以及Unlock就可以了 此时使用go vet mian.go 检查就会提示我们./main1.go:25:7: assignment copies lock value to b: ...

  3. WPF 不透明蒙板概述

    本文内容 先决条件 使用不透明蒙板创建视觉效果 创建不透明蒙板 将渐变用作不透明蒙板 显示另外 4 个 不透明蒙板能够使部分元素或视觉对象透明或部分透明. 要创建不透明蒙版,请将 Brush 应用于元 ...

  4. Cmockery学习

    什么是cmockery? 是一个轻量级的C语言单元测试框架 什么是单元测试? 单元测试就是测试一个系统的最小实现单元,往往是函数 示例解析 #include <stdarg.h> #inc ...

  5. itest(爱测试)开源接口测试&敏捷测试&极简项目管理 7.1.0 发布,ui优化及bug修复

    (一)itest 简介及更新说明 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock 6合1,又有丰富的统计分析.可按测试包 ...

  6. REACT列表过度

    <TransitionGroup> <CSSTransition> <li>aaaa</li> </CSSTransition> </ ...

  7. 微信支付or支付宝支付调用流程图

    微信支付or支付宝支付调用流程图 支付宝小程序支付调用流程https://opendocs.alipay.com/mini/03l735 微信H5支付调用流程https://pay.weixin.qq ...

  8. 测试网络的小工具WinMTR

    ping网络的小工具 搜集了两个版本中文版和英文版 中文版---- WinMTR中文版.rarhttps://www.aliyundrive.com/s/bZqmokL5dTt提取码: k6v7 英文 ...

  9. WPF 自定义泛型用户控件后跨程序集继承用户控件的解决方案

    自定义泛型用户控件: <UserControl x:Class="ClassLibrary1.UcEumCmb" xmlns="http://schemas.mic ...

  10. java多线程-3-使用多线程的时机

    许多人对于计算机的运行原理不了解,甚至根本不了解. 不幸的是,此类中的一部分人也参与了计算机的编码工作.可想而知,编写的效率和结果.听者伤心,闻者流泪. 此类同学的常见的误解: 并发就能加快任务完成 ...