提示:如有不明白的地方请先查看前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. windows 下 基于express搭建 https协议的网站

    参考 https://blog.csdn.net/xingyanchao/article/details/79362443 问题在于生成SSL证书的时候Windows环境下会报错 解决方案 参考 ht ...

  2. Java 笔试面试(6)异常处理

    Java 笔试面试(6)异常处理 1. finally的代码何时执行? 问题描述:try{}里有一个return语句,那么在这个try后面的finally{}中的代码是否为执行?如果会,是在retur ...

  3. Kubelet

    Kubelet 相关博客 Kubelet组件深度解析 Kubelet组件解析 Kubelet运行机制分析 Kubelet与apiserver通信 ___ Kubelet组件运行在Node节点上,维持运 ...

  4. C++走向远洋——(项目二、存储班长信息的学生类、派生)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  5. 死磕Lambda表达式(二):Lambda的使用

    城市就是森林,每一个男人都是猎手,每一个女人都是陷阱.--<三体> 在哪使用Lambda表达式? 在上一篇文章(传送门)中介绍了Lambda表达式的基本语法,其中的举了一个Lambda表达 ...

  6. MySql5.7.28下载、安装、登陆详解

    进入MySql官网下载,页面如下 根据自己需求,选择适合自己的进行下载 然后解压安装包到自己的喜欢的路径 配置环境变量 添加环境系统变量 MYSQL_HOME:D:\Program Files\mys ...

  7. Mac中使用brew安装mysql

    若不考虑版本直接执行以下命令 brew install mysql 若要选择版本只要加上@版本即可,例如 brew install mysql@5.7 安装完后启动mysql mysql.server ...

  8. 一份简明的 Base64 原理解析

    书接上回,在 记一个 Base64 有关的 Bug 一文里,我们说到了 Base64 的编解码器有不同实现,交叉使用它们可能引发的问题等等. 这一回,我们来对 Base64 这一常用编解码技术的原理一 ...

  9. 【学习笔记】Golang学习方向整理

    前言 作为一个Java开发,给大家说Golang方向,好吓人...溜了溜了... 哦对了,如有不对的地方,还请指出.感谢! 某面试平台golang技能要求简要摘录 掌握 GO 语言,熟悉常用 pack ...

  10. python3编写程序,根据输入的行列数值,生成相应的矩阵(其中元素为随机数)。

    代码如下: import random n = int(input("请输入行:")) m = int(input("请输入列:")) x = y = 0 wh ...