提示:如有不明白的地方请先查看前3篇ABP实践系列的文章

1,下载及启动abp项目前后端分离(netcore+vue)

2,修改abp数据库为mysql

3,商品系列api接口(本文主要依赖在这个商品列表接口)

以下正文开始:

1.打开vue项目(这里是用vscode工具)在views文件夹下创建goods文件夹然后创建商品列表goods.vue文件,商品创建create-goods.vue,编辑商品edit-goods.vue

goods.vue文件里的代码如下:

<template>
<div>
<Card dis-hover>
<div class="page-body">
<Form ref="queryForm" :label-width="100" label-position="left" inline>
<Row :gutter="16">
<Col span="8">
<FormItem :label="L('Keyword')+':'" style="width:100%">
<Input v-model="pagerequest.keyword" :placeholder="L('GoodsName')"></Input>
</FormItem>
</Col>
<Col span="8"> </Col>
</Row>
<Row>
<Button @click="create" icon="android-add" type="primary" size="large">{{L('Add')}}</Button>
<Button icon="ios-search" type="primary" size="large" @click="getpage" class="toolbar-btn">{{L('Find')}}</Button>
</Row>
</Form>
<div class="margin-top-10">
<Table :loading="loading" :columns="columns" :no-data-text="L('NoDatas')" border :data="list">
</Table>
<Page show-sizer class-name="fengpage" :total="totalCount" class="margin-top-10" @on-change="pageChange" @on-page-size-change="pagesizeChange" :page-size="pageSize" :current="currentPage"></Page>
</div>
</div>
</Card>
<create-goods v-model="createModalShow" @save-success="getpage"></create-goods>
<edit-goods v-model="editModalShow" @save-success="getpage"></edit-goods>
</div>
</template>
<script lang="ts">
import { Component, Vue,Inject, Prop,Watch } from 'vue-property-decorator';
import Util from '@/lib/util'
import AbpBase from '@/lib/abpbase'
import PageRequest from '@/store/entities/page-request'
import CreateGoods from './create-goods.vue'
import EditGoods from './edit-goods.vue' class PageGoodsRequest extends PageRequest{
keyword:string='';
isActive:boolean=null;
} @Component({
components:{CreateGoods,EditGoods}
})
export default class Goodss extends AbpBase{
edit(){
this.editModalShow=true;
} pagerequest:PageGoodsRequest=new PageGoodsRequest(); createModalShow:boolean=false;
editModalShow:boolean=false;
get list(){
return this.$store.state.goods.list;
};
get loading(){
return this.$store.state.goods.loading;
}
create(){
this.createModalShow=true;
}
isActiveChange(val:string){
if(val==='Actived'){
this.pagerequest.isActive=true;
}else if(val==='NoActive'){
this.pagerequest.isActive=false;
}else{
this.pagerequest.isActive=null;
}
}
pageChange(page:number){
this.$store.commit('goods/setCurrentPage',page);
this.getpage();
}
pagesizeChange(pagesize:number){
this.$store.commit('goods/setPageSize',pagesize);
this.getpage();
}
async getpage(){ this.pagerequest.maxResultCount=this.pageSize;
this.pagerequest.skipCount=(this.currentPage-1)*this.pageSize; await this.$store.dispatch({
type:'goods/getAll',
data:this.pagerequest
})
}
get pageSize(){
return this.$store.state.goods.pageSize;
}
get totalCount(){
return this.$store.state.goods.totalCount;
}
get currentPage(){
return this.$store.state.goods.currentPage;
}
columns=[{
title:this.L('GoodsName'),
key:'goodsName'
},{
title:this.L('Price'),
key:'price'
},{
title:this.L('Describe'),
key:'describe'
},{
title:this.L('Actions'),
key:'Actions',
width:150,
render:(h:any,params:any)=>{
return h('div',[
h('Button',{
props:{
type:'primary',
size:'small'
},
style:{
marginRight:'5px'
},
on:{
click:()=>{
this.$store.commit('goods/edit',params.row);
this.edit();
}
}
},this.L('Edit')),
h('Button',{
props:{
type:'error',
size:'small'
},
on:{
click:async ()=>{
this.$Modal.confirm({
title:this.L('Tips'),
content:this.L('DeleteGoodsConfirm'),
okText:this.L('Yes'),
cancelText:this.L('No'),
onOk:async()=>{
await this.$store.dispatch({
type:'goods/delete',
data:params.row
})
await this.getpage();
}
})
}
}
},this.L('Delete'))
])
}
}]
async created(){
this.getpage();
}
}
</script>

create-goods.vue代码:

<template>
<div>
<Modal
:title="L('CreateNewGoods')"
:value="value"
@on-ok="save"
@on-visible-change="visibleChange"
>
<Form ref="goodsForm" label-position="top" :rules="goodsRule" :model="goods">
<FormItem :label="L('GoodsName')" prop="goodsName">
<Input v-model="goods.goodsName" :maxlength="32" :minlength="2"></Input>
</FormItem>
<FormItem :label="L('Price')" prop="price">
<Input v-model="goods.price" :maxlength="32" :minlength="2"></Input>
</FormItem>
<FormItem :label="L('Describe')" prop="describe">
<Input v-model="goods.describe" :maxlength="1024"></Input>
</FormItem>
<FormItem :label="L('Qty')" prop="surplusQty">
<Input v-model="goods.surplusQty" :maxlength="18"></Input>
</FormItem>
</Form>
<div slot="footer">
<Button @click="cancel">{{L('Cancel')}}</Button>
<Button @click="save" type="primary">{{L('OK')}}</Button>
</div>
</Modal>
</div>
</template>
<script lang="ts">
import { Component, Vue,Inject, Prop,Watch } from 'vue-property-decorator';
import Util from '../../../lib/util'
import AbpBase from '../../../lib/abpbase'
import Goods from '@/store/entities/goods';
@Component
export default class CreateGoods extends AbpBase{
@Prop({type:Boolean,default:false}) value:boolean;
goods:Goods=new Goods();
save(){
(this.$refs.goodsForm as any).validate(async (valid:boolean)=>{
if(valid){
await this.$store.dispatch({
type:'goods/create',
data:this.goods
});
(this.$refs.goodsForm as any).resetFields();
this.$emit('save-success');
this.$emit('input',false);
}
})
}
cancel(){
(this.$refs.goodsForm as any).resetFields();
this.$emit('input',false);
}
visibleChange(value:boolean){
if(!value){
this.$emit('input',value);
}
}
goodsRule={
goodsName:[{required: true,message:this.L('FieldIsRequired',undefined,this.L('GoodsName')),trigger: 'blur'}],
// tenancyName:[{required:true,message:this.L('FieldIsRequired',undefined,this.L('TenancyName')),trigger: 'blur'}],
// adminEmailAddress:[{required:true,message:this.L('FieldIsRequired',undefined,this.L('AdminEmailAddress')),trigger: 'blur'},{type: 'email'}]
}
}
</script>

edit-goods.vue代码:

<template>
<div>
<Modal
:title="L('EditGoods')"
:value="value"
@on-ok="save"
@on-visible-change="visibleChange"
>
<Form ref="goodsForm" label-position="top" :rules="goodsRule" :model="goods">
<FormItem :label="L('GoodsName')" prop="goodsName">
<Input v-model="goods.goodsName" :maxlength="32" :minlength="2"></Input>
</FormItem>
<FormItem :label="L('Price')" prop="price">
<Input v-model="goods.price" :maxlength="32" :minlength="2"></Input>
</FormItem>
<FormItem :label="L('Describe')" prop="describe">
<Input v-model="goods.describe" :maxlength="1024"></Input>
</FormItem>
<FormItem :label="L('Qty')" prop="surplusQty">
<Input v-model="goods.surplusQty" :maxlength="18"></Input>
</FormItem>
</Form>
<div slot="footer">
<Button @click="cancel">{{L('Cancel')}}</Button>
<Button @click="save" type="primary">{{L('OK')}}</Button>
</div>
</Modal>
</div>
</template>
<script lang="ts">
import { Component, Vue,Inject, Prop,Watch } from 'vue-property-decorator';
import Util from '../../../lib/util'
import AbpBase from '../../../lib/abpbase'
import Goods from '@/store/entities/goods';
@Component
export default class EditGoods extends AbpBase{
@Prop({type:Boolean,default:false}) value:boolean;
goods:Goods=new Goods();
save(){
(this.$refs.goodsForm as any).validate(async (valid:boolean)=>{
if(valid){
await this.$store.dispatch({
type:'goods/update',
data:this.goods
});
(this.$refs.goodsForm as any).resetFields();
this.$emit('save-success');
this.$emit('input',false);
}
})
}
cancel(){
(this.$refs.goodsForm as any).resetFields();
this.$emit('input',false);
}
visibleChange(value:boolean){
if(!value){
this.$emit('input',value);
}else{
this.goods=Util.extend(true,{},this.$store.state.goods.editGoods);
}
}
goodsRule={
// name:[{required: true,message:this.L('FieldIsRequired',undefined,this.L('TenantName')),trigger: 'blur'}],
// tenancyName:[{required:true,message:this.L('FieldIsRequired',undefined,this.L('TenancyName')),trigger: 'blur'}]
}
}
</script>

2.在store>entities目录下创建一个实体goods.ts

代码如下:

import Entity from './entity'

export default class Goods extends Entity<string>{
goodsName:string;
price:number;
describe:string;
surplusQty:number;

3.在store>modules下创建商品相关的请求服务器方法goods.ts

代码如下:

import {Store,Module,ActionContext} from 'vuex'
import ListModule from './list-module'
import ListState from './list-state'
import Goods from '../entities/goods'
import Ajax from '../../lib/ajax'
import PageResult from '@/store/entities/page-result';
import ListMutations from './list-mutations'
interface GoodsState extends ListState<Goods>{
editGoods:Goods;
}
class GoodsModule extends ListModule<GoodsState,any,Goods>{
state={
totalCount:0,
currentPage:1,
pageSize:10,
list: new Array<Goods>(),
loading:false,
editGoods:new Goods()
}
actions={
async getAll(context:ActionContext<GoodsState,any>,payload:any){
context.state.loading=true;
let reponse=await Ajax.get('/api/services/app/Goods/GetAll',{params:payload.data});
context.state.loading=false;
let page=reponse.data.result as PageResult<Goods>;
context.state.totalCount=page.totalCount;
context.state.list=page.items;
},
async create(context:ActionContext<GoodsState,any>,payload:any){
await Ajax.post('/api/services/app/Goods/Create',payload.data);
},
async update(context:ActionContext<GoodsState,any>,payload:any){
await Ajax.put('/api/services/app/Goods/Update',payload.data);
},
async delete(context:ActionContext<GoodsState,any>,payload:any){
await Ajax.delete('/api/services/app/Goods/Delete?Id='+payload.data.id);
},
async get(context:ActionContext<GoodsState,any>,payload:any){
let reponse=await Ajax.get('/api/services/app/Goods/Get?Id='+payload.id);
return reponse.data.result as Goods;
}
};
mutations={
setCurrentPage(state:GoodsState,page:number){
state.currentPage=page;
},
setPageSize(state:GoodsState,pagesize:number){
state.pageSize=pagesize;
},
edit(state:GoodsState,goods:Goods){
state.editGoods=goods;
}
}
}
const goodsModule=new GoodsModule();
export default goodsModule;

4.在store的index.ts文件里引入goods模块

5.在路由文件里添加商品router文件夹下的router.ts

6.大功告成可以运行看下结果yarn serve启动项目(不知道怎么启动项目的请回到第一篇文章重新回顾)

注意:是不是发现到处都是英文,可能有人就想直接去改代码里的名称了直接改为中文这样是可以的但是你发现你切换语言之后他不会变一直都是固定的,所以这里需要在后台配置文件对应的语言crazy-zh-Hans.xml里增加配置.

我们去配置两个尝试一下(后台改动配置重新启动,前端只需要刷新就生效了)

再来看看结果

下一篇讲一下abp框架的权限相关创建.

对你有帮助的话点个推荐,大神请直接忽视或者指点一二

ABP实践(4)-abp前端vue框架之简单商品增删改查(帮助刚入门的新手快速了解怎么才能加入自己的功能并运行起来)的更多相关文章

  1. IDEA+Maven 整合SSM框架实现简单的增删改查(新手入门,傻瓜操作)

    原博客地址:https://blog.csdn.net/khxu666/article/details/79851070 选用SSM框架的原因在目前的企业级Java应用中,Spring框架是必须的.S ...

  2. SSM框架之MyBatis框架实现简单的增删改查

    MyBatis框架介绍 MyBatis是一个优秀的数据持久层框架,在实体类和SQL语句之间建立映射关系是一种半自动化的ORM实现,其封装性要低于Hibernate,性能优越,并且小巧,简单易学,应用也 ...

  3. Maven+SSM框架实现简单的增删改查

    Spring介绍: spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情.然而, Spring的用途不仅限于服务器端的开发.从简单性.可测试性和松耦合的角度而言,任何Ja ...

  4. idea使用maven搭建ssm框架实现登陆商品增删改查

    创建项目->maven->webapp->输入坐标->完成. pom.xml <project xmlns="http://maven.apache.org/P ...

  5. BitAdminCore框架应用篇:(二)创建一个简单的增删改查模块

    NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/cookie ...

  6. golang学习之beego框架配合easyui实现增删改查及图片上传

    golang学习之beego框架配合easyui实现增删改查及图片上传 demo目录: upload文件夹主要放置上传的头像文件,main是主文件,所有效果如下: 主页面: 具体代码: <!DO ...

  7. vue实现对数据的增删改查(CURD)

    vue实现对数据的增删改查(CURD) 导语: 网上看到一个写的比较好的学习文章,转载分享一下 在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的 ...

  8. springmvc+spring3+hibernate4框架简单整合,简单实现增删改查功能

    转自:https://blog.csdn.net/thinkingcao/article/details/52472252 C 所用到的jar包     数据库表 数据库表就不用教大家了,一张表,很简 ...

  9. abp(net core)+easyui+efcore仓储系统——展现层实现增删改查之控制器(六)

    abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) abp(net core)+easyui+e ...

随机推荐

  1. IBM Developer:Java 9 新特性概述

    Author: 成富 Date: Dec 28, 2017 Category: IBM-Developer (20) Tags: Java (27) 原文地址:https://www.ibm.com/ ...

  2. Web 项目刚要打包,却找不到项目资源?

    编程无小事,不管是语言层面还是工具层面,都要熟悉,方能在编程中过程中众享丝滑,不然就随处卡顿,耗费时间不说,还没有任何成就感.撸码过程中用 Idea 也很多年了,工具或环境遇到问题,问下度娘就完事了, ...

  3. 一文看懂Java序列化

    一文看懂Java序列化 简介 Java实现 Serializable 最基本情况 类的成员为引用 同一对象多次序列化 子父类引用序列化 可自定义的可序列化 Externalizable:强制自定义序列 ...

  4. 量化投资学习笔记37——《Python机器学习应用》课程笔记10

    用KNN算法来进行数字识别,还是用sklearn自带的digits数据集. coding:utf-8 KNN算法实现手写识别 from sklearn import neighbors from sk ...

  5. Sentinel基于Apollo的持久化改造

    Sentinel基于Apollo的持久化改造 sentinel默认是将用户在dashboard中编辑过的流控信息保存在内存中,所以在重启后,所有之前配置过的流控规则也就不见了.但是sentinel给用 ...

  6. 使用 Hexo 创建项目文档网站

    当我们发布一个开源项目的时候,最重要的事情之一就是要创建项目文档.对使用项目的用户来说,文档是非常有必要的,通常我们可以使用下面这些方式来创建文档: GitHub Wiki:在 Github 上我们可 ...

  7. echart 新手踩坑

    仪表盘踩坑 我采用的是单文件引入的方式来加载echarts图标也可以使用配置等方式详情参考文档,如果同学们要做出更加丰富的样式请参考文档配置手册配置手册:http://echarts.baidu.co ...

  8. 前端每日实战:132# 视频演示如何用纯 CSS 创作一只思考的手

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/WgdVyx/ 可交互视频 此视频是 ...

  9. 【Amaple教程】2. 模块

    正如它的名字,模块用于amaplejs单页应用的页面分割,所有的跳转更新和代码编写都是以模块为单位的. 定义一个模块 一个模块由<module>标签对包含,内部分为template模板.J ...

  10. 从零开始打造 Mock 平台 - 核心篇

    前言 最近一直在捣鼓毕设,准备做的是一个基于前后端开发的Mock平台,前期花了很多时间完成了功能模块的交互.现在进度推到如何设计核心功能,也就是Mock数据的解析. 根据之前的需求设定加上一些思考,用 ...