提示:如有不明白的地方请先查看前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. 传统if 从句子——以条件表达式作为if条件

    传统if 从句子——以条件表达式作为 if条件if [ 条件表达式 ]then command command commandelse command commandfi   条件表达式 文件表达式 ...

  2. Mac 安装Android Studio 及环境变量配置

    我翻开历史一查,这历史没有年代.歪歪斜斜的每页上都写着"仁义道德"几个字,我横竖睡不着,仔细看了半夜,才从字缝里看出来,满本上都写着两个字"吃人"! –鲁迅&l ...

  3. C2C的道德边界:沦为从假运单到假病条的供假渠道

    你可能刚开始学会不去看网购平台上商品回评中的虚假好评,却又要开始应对同事在朋友圈等平台买来的虚开病假条带来的困扰.最近各大媒体包括党报热传的网购病假条事件,再度将人们的目光集中在这个C2C模式之上.从 ...

  4. 原创:Python爬虫实战之爬取代理ip

    编程的快乐只有在运行成功的那一刻才知道QAQ 目标网站:https://www.kuaidaili.com/free/inha/  #若有侵权请联系我 因为上面的代理都是http的所以没写这个判断 代 ...

  5. C++走向远洋——65(十五周、项目一)

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

  6. Glide源码解析一,初始化

    转载请标明出处:https:////www.cnblogs.com/tangZH/p/12409849.html Glide作为一个强大的图片加载框架,已经被android官方使用,所以,明白Glid ...

  7. 微服务优化之使用gRPC做微服务的内部通信

    使用gRPC做微服务的内部通信 gRPC是一个由Google开源的远程服务调用框架,具有多路复用和双向流式通信的特性. 大家好,在本文中将为大家介绍为什么我们应该使用gRPC代替RESTful或JSO ...

  8. SpringBoot入门系列(四)整合模板引擎Thymeleaf

    前面介绍了Spring Boot的优点,然后介绍了如何快速创建Spring Boot 项目.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/ ...

  9. python框架Django实战商城项目之用户模块创建

    创建用户APP 整个项目会存在多个应用,需要存放在一个单独的文件包了,所以新建一个apps目录,管理所有子应用. 在apps包目录下穿件users应用 python ../../manage.py s ...

  10. XCTF---easyjava的WriteUp

    一.题目来源     题目来源:XCTF题库安卓区easyjava     题目下载链接:下载地址 二.解题过程     1.将该apk安装进夜神模拟器中,发现有一个输入框和一个按钮,随便输入信息,点 ...