ABP实践(4)-abp前端vue框架之简单商品增删改查(帮助刚入门的新手快速了解怎么才能加入自己的功能并运行起来)
提示:如有不明白的地方请先查看前3篇ABP实践系列的文章
1,下载及启动abp项目前后端分离(netcore+vue)
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框架之简单商品增删改查(帮助刚入门的新手快速了解怎么才能加入自己的功能并运行起来)的更多相关文章
- IDEA+Maven 整合SSM框架实现简单的增删改查(新手入门,傻瓜操作)
原博客地址:https://blog.csdn.net/khxu666/article/details/79851070 选用SSM框架的原因在目前的企业级Java应用中,Spring框架是必须的.S ...
- SSM框架之MyBatis框架实现简单的增删改查
MyBatis框架介绍 MyBatis是一个优秀的数据持久层框架,在实体类和SQL语句之间建立映射关系是一种半自动化的ORM实现,其封装性要低于Hibernate,性能优越,并且小巧,简单易学,应用也 ...
- Maven+SSM框架实现简单的增删改查
Spring介绍: spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情.然而, Spring的用途不仅限于服务器端的开发.从简单性.可测试性和松耦合的角度而言,任何Ja ...
- idea使用maven搭建ssm框架实现登陆商品增删改查
创建项目->maven->webapp->输入坐标->完成. pom.xml <project xmlns="http://maven.apache.org/P ...
- BitAdminCore框架应用篇:(二)创建一个简单的增删改查模块
NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/cookie ...
- golang学习之beego框架配合easyui实现增删改查及图片上传
golang学习之beego框架配合easyui实现增删改查及图片上传 demo目录: upload文件夹主要放置上传的头像文件,main是主文件,所有效果如下: 主页面: 具体代码: <!DO ...
- vue实现对数据的增删改查(CURD)
vue实现对数据的增删改查(CURD) 导语: 网上看到一个写的比较好的学习文章,转载分享一下 在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的 ...
- springmvc+spring3+hibernate4框架简单整合,简单实现增删改查功能
转自:https://blog.csdn.net/thinkingcao/article/details/52472252 C 所用到的jar包 数据库表 数据库表就不用教大家了,一张表,很简 ...
- abp(net core)+easyui+efcore仓储系统——展现层实现增删改查之控制器(六)
abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) abp(net core)+easyui+e ...
随机推荐
- docker 使用:镜像和容器
docker 镜像 docker image是一个极度精简版的Linux程序运行环境,官网的java镜像包括的东西更少,除非是镜像叠加方式的如centos+java7,需要定制化build的一个安装包 ...
- JMeter之BeanShell断言---equals使用
判断变量是否为root if(!"${User}".equals("root")){ Failure=true; FailureMessage="ER ...
- python登陆接口编写
#coding:utf-8 import getpass,sys i=0 j=0 while i<3: username=raw_input('username:') #输入用户名 life_1 ...
- Hexo搭建总结
Hexo搭建过程记录 1.Hexo基本环境搭建 1.Hexo安装前提 Node.js和Git,他们的安装方法可以自行百度. 2.具体安装步骤可以参考: https://www.cnblogs.com/ ...
- 《Effective Java》笔记45-56:通用程序设计
将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性. 要使用局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方才声明,不要过早的声明. 局部变量的作用域从它被声明的 ...
- LeetCode~报数(简单)
报数(简单) 题目描述: 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1 11 21 1211 111221 1 被读作 "one 1" ( ...
- 10——PHP中的两种数组【索引数组】与【关联数组】
[索引数组] 用数字作为键名的数组一般叫做索引数组.用字符串表示键的数组就是下面要介绍的关联数组.索引数组的键是整数,而且从0开始以此类推. 索引数组初始化例: <pre name=" ...
- SDWebImage -- 封装 (网络状态检测,是否打开手机网络下下载高清图设置)
对SDWebImage 进行封装,为了更好的节省用户手机流量,并保证在移动网络下也展示高清图,对使用SDWebImage 下载图片之前进行逻辑处理,根据本地缓存中是否有缓存原始的图片,用户是否打开移动 ...
- XXE学习(一)——XML基础
XXE学习(一)——xml基础 一.XML简介 XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据 ...
- Windows 使用激活服务器激活操作步骤
最近装了win10企业版系统,总结下激活步骤,激活后是正版,半年后需要重新激活,不介意的小伙伴可以试试,这不是重点,重点是企业版超级clean...... 服务器激活系统步骤,打开cmd或者xshel ...