添加二级审核

This commit is contained in:
hujiabin 2022-08-08 14:02:41 +08:00
parent 3bd61b9cd1
commit 9a626637dc
19 changed files with 441 additions and 57 deletions

3
.env
View File

@ -1,3 +1,4 @@
VUE_APP_API_HOST=127.0.0.1:8000
VUE_APP_API_HOST=192.168.100.82:8888
VUE_APP_TITLE=管理平台
VUE_APP_TITLE_EN=PROJECT PACKAGE MANAGER

View File

@ -14,6 +14,7 @@ export default class Url {
static readonly ALLOT_NODE_GROUP : string = "allot-node-group/%d";
static readonly ALLOT_MENU : string = "allot-menu/%d";
static readonly UPDATE_NICKNAME : string = "update-nickname";
static readonly UPDATE_EMAIL : string = "update-email/%d";
// TODO 菜单
static readonly MENUS : string = "menu";
@ -43,7 +44,10 @@ export default class Url {
static readonly DELETE_APPLY : string = "apply/%d";
static readonly APPLY_PASS : string = "apply/pass/%d";
static readonly APPLY_NO_PASS : string = "apply/no-pass/%d";
static readonly APPLY_PASS_FINAL : string = "apply/pass-final/%d";
static readonly APPLY_NO_PASS_FINAL : string = "apply/no-pass-final/%d";
static readonly EXECUTE_APPLY : string = "apply/execute/%d";
static readonly REJECT_APPLY : string = "apply/reject/%d";
}

View File

@ -33,7 +33,8 @@ export interface ApplyInterface{
item_id : number;
reason : string;
send_account : string;
state : number;
audit_state_one : number;
audit_state_two : number;
unikey : string;
execute_state ?: number;
}

View File

@ -6,14 +6,29 @@
</div>
<custom-page :data-list="Data" :page.sync="search.page" :page-size.sync="search.size"
:total="total" :columns="columns" >
<template slot-scope="{row}" slot="state">
<template slot-scope="{row}" slot="audit_state_one">
<div class="space-x-3">
<Tag color="purple" v-if="row.deleted_at">已撤销</Tag>
<Tag color="blue" v-else-if="row.state == 0">待审核</Tag>
<Tag color="green" v-else-if="row.state == 1" >通过</Tag>
<Tag color="blue" v-if="row.audit_state_one == 0">待审核</Tag>
<Tag color="green" v-else-if="row.audit_state_one == 1" >通过</Tag>
<Tag color="magenta" v-else >未通过</Tag>
</div>
</template>
<template slot-scope="{row}" slot="audit_state_two">
<div class="space-x-3">
<Tag color="blue" v-if="row.audit_state_two == 0">待审核</Tag>
<Tag color="green" v-else-if="row.audit_state_two == 1" >通过</Tag>
<Tag color="magenta" v-else >未通过</Tag>
</div>
</template>
<template slot-scope="{row}" slot="execute_state">
<div class="space-x-3">
<Tag color="cyan" v-if="row.execute_state == -1">被驳回</Tag>
<Tag color="geekblue" v-else-if="row.execute_state == 1">执行中...</Tag>
<Tag color="green" v-else-if="row.execute_state == 2" >执行成功</Tag>
<Tag color="red" v-else-if="row.execute_state == 3" >执行失败</Tag>
<Tag color="purple" v-else >未执行</Tag>
</div>
</template>
<template slot-scope="{row}" slot="operation">
<Dropdown transfer trigger="click" @on-click="onDropdownEvent($event,row)">
<a href="javascript:void(0)">

View File

@ -49,11 +49,19 @@ export default class Apply extends HomeParent {
}, {
title: "申请时间",
key: "create_time"
}, {
title: "状态",
slot: "state",
}, {
title: "初审状态",
slot: "audit_state_one",
align: 'center',
}, {
},{
title: "终审状态",
slot: "audit_state_two",
align: 'center',
}, {
title: "执行状态",
slot: "execute_state",
align: 'center',
},{
title: "操作",
slot: "operation",
}];
@ -129,7 +137,7 @@ export default class Apply extends HomeParent {
}
public revocation(row){
if (row.deleted_at || row.state != 0){
if (row.deleted_at || row.audit_state_one != 0 || row.audit_state_two != 0){
this.error("无法撤销")
return
}

View File

@ -40,10 +40,18 @@ export default class Audit extends HomeParent {
title: "申请时间",
key: "create_time"
}, {
title: "状态",
slot: "state",
title: "初审状态",
slot: "audit_state_one",
align: 'center',
}, {
},{
title: "终审状态",
slot: "audit_state_two",
align: 'center',
}, {
title: "执行状态",
slot: "execute_state",
align: 'center',
},{
title: "操作",
slot: "operation",
}];
@ -91,6 +99,10 @@ export default class Audit extends HomeParent {
}
public pass(row){
if (row.audit_state_one){
this.error('无需再次审核')
return
}
let url : string = this.$sprintf(Url.APPLY_PASS, row.id);
Request('get', url).then((res:any)=>{
if (res.code == 200){
@ -103,6 +115,10 @@ export default class Audit extends HomeParent {
}
public noPass(row){
if (row.audit_state_one){
this.error('无需再次审核')
return
}
let url : string = this.$sprintf(Url.APPLY_NO_PASS, row.id);
Request('get', url).then((res:any)=>{
if (res.code == 200){

View File

@ -2,13 +2,29 @@
<div>
<custom-page :data-list="Data" :page.sync="search.page" :page-size.sync="search.size"
:total="total" :columns="columns">
<template slot-scope="{row}" slot="state">
<template slot-scope="{row}" slot="audit_state_one">
<div class="space-x-3">
<Tag color="blue" v-if="row.state == 0">待审核</Tag>
<Tag color="green" v-else-if="row.state == 1" >通过</Tag>
<Tag color="blue" v-if="row.audit_state_one == 0">待审核</Tag>
<Tag color="green" v-else-if="row.audit_state_one == 1" >通过</Tag>
<Tag color="magenta" v-else >未通过</Tag>
</div>
</template>
<template slot-scope="{row}" slot="audit_state_two">
<div class="space-x-3">
<Tag color="blue" v-if="row.audit_state_two == 0">待审核</Tag>
<Tag color="green" v-else-if="row.audit_state_two == 1" >通过</Tag>
<Tag color="magenta" v-else >未通过</Tag>
</div>
</template>
<template slot-scope="{row}" slot="execute_state">
<div class="space-x-3">
<Tag color="cyan" v-if="row.execute_state == -1">被驳回</Tag>
<Tag color="geekblue" v-else-if="row.execute_state == 1">执行中...</Tag>
<Tag color="green" v-else-if="row.execute_state == 2" >执行成功</Tag>
<Tag color="red" v-else-if="row.execute_state == 3" >执行失败</Tag>
<Tag color="purple" v-else >未执行</Tag>
</div>
</template>
<template slot-scope="{row}" slot="operation">
<Dropdown transfer trigger="click" @on-click="onDropdownEvent($event,row)">
<a href="javascript:void(0)">

View File

@ -0,0 +1,144 @@
import { Component, Mixins, Vue, Watch } from 'vue-property-decorator'
import Url from "@/utils/Url";
import {
State,
Getter,
Action,
Mutation
} from "vuex-class";
import HomeParent from "@/views/home/Common/HomeParent";
import { ElTreeDataInterface, } from "@/views/home/Common/Types";
import CustomPage from "@/components/page.vue";
import {Form, TableColumn} from "view-design";
import {Message, Tree} from "element-ui";
import {Request} from "@/utils/Request";
@Component({
components : {
CustomPage
}
})
export default class Audit extends HomeParent {
name: string = "audit";
public Data = []
public showApplyDialog:boolean = false;
public DataDetail:any=[];
public columns: TableColumn[] = [{
title: "unikey",
key: "unikey"
}, {
title: "申请者",
key: "creator_account"
}, {
title: "发放者",
key: "send_account"
}, {
title: "ItemId",
key: "item_id"
}, {
title: "申请时间",
key: "create_time"
}, {
title: "初审状态",
slot: "audit_state_one",
align: 'center',
},{
title: "终审状态",
slot: "audit_state_two",
align: 'center',
}, {
title: "执行状态",
slot: "execute_state",
align: 'center',
},{
title: "操作",
slot: "operation",
}];
public total: number = 0;
public search: { page: number, size: number, keywords?: string } = {
page: 1, size: 10, keywords: ""
}
@Watch("search.page")
private _onPageChange(): void {
this._getData()
}
@Watch("search.size")
private _onPageSizeChange(): void {
this.search.page = 1;
this._getData()
}
public created(): void {
this._getData();
}
public onDropdownEvent(name: string,row) {
switch (name) {
case "show" : this.show(row);break;
case "pass" : this.pass(row);break;
case "noPass" : this.noPass(row);break;
}
}
public show(row){
let url : string = this.$sprintf(Url.SHOW_APPLY, row.id);
Request('get', url).then((res:any)=>{
if (res.code == 200){
this.showApplyDialog = true;
this.DataDetail = res.data
}else {
this.error(res.message)
}
})
}
public pass(row){
if (row.audit_state_two){
this.error('无需再次审核')
return
}
let url : string = this.$sprintf(Url.APPLY_PASS_FINAL, row.id);
Request('get', url).then((res:any)=>{
if (res.code == 200){
this._getData();
this.success()
}else {
this.error(res.message)
}
})
}
public noPass(row){
if (row.audit_state_two){
this.error('无需再次审核')
return
}
let url : string = this.$sprintf(Url.APPLY_NO_PASS_FINAL, row.id);
Request('get', url).then((res:any)=>{
if (res.code == 200){
this._getData();
this.success()
}else {
this.error(res.message)
}
})
}
private async _getData() {
let url : string = this.$sprintf(Url.APPLY, 3);
const res:any = await Request('get', url,this.search)
if (res.code == 200){
this.Data = res.data.data
this.total = res.data.total
}else {
this.error(res.message)
}
}
}

View File

@ -0,0 +1,73 @@
<template >
<div>
<custom-page :data-list="Data" :page.sync="search.page" :page-size.sync="search.size"
:total="total" :columns="columns">
<template slot-scope="{row}" slot="audit_state_one">
<div class="space-x-3">
<Tag color="blue" v-if="row.audit_state_one == 0">待审核</Tag>
<Tag color="green" v-else-if="row.audit_state_one == 1" >通过</Tag>
<Tag color="magenta" v-else >未通过</Tag>
</div>
</template>
<template slot-scope="{row}" slot="audit_state_two">
<div class="space-x-3">
<Tag color="blue" v-if="row.audit_state_two == 0">待审核</Tag>
<Tag color="green" v-else-if="row.audit_state_two == 1" >通过</Tag>
<Tag color="magenta" v-else >未通过</Tag>
</div>
</template>
<template slot-scope="{row}" slot="execute_state">
<div class="space-x-3">
<Tag color="cyan" v-if="row.execute_state == -1">被驳回</Tag>
<Tag color="geekblue" v-else-if="row.execute_state == 1">执行中...</Tag>
<Tag color="green" v-else-if="row.execute_state == 2" >执行成功</Tag>
<Tag color="red" v-else-if="row.execute_state == 3" >执行失败</Tag>
<Tag color="purple" v-else >未执行</Tag>
</div>
</template>
<template slot-scope="{row}" slot="operation">
<Dropdown transfer trigger="click" @on-click="onDropdownEvent($event,row)">
<a href="javascript:void(0)">
操作
<Icon type="ios-arrow-down"></Icon>
</a>
<template #list>
<DropdownMenu>
<DropdownItem name="show">查看</DropdownItem>
<Dropdown placement="right-start" transfer>
<DropdownItem>
审批
<Icon type="ios-arrow-forward"></Icon>
</DropdownItem>
<template #list>
<DropdownMenu >
<DropdownItem name="pass">通过</DropdownItem>
<DropdownItem name="noPass">不通过</DropdownItem>
</DropdownMenu>
</template>
</Dropdown>
</DropdownMenu>
</template>
</Dropdown>
</template>
</custom-page>
<Modal v-model="showApplyDialog" title="详情" width="70%" >
<div style="max-height:500px;overflow: auto">
<div v-for="(item,index) in DataDetail">
<div style="padding: 10px 0 5px 0;" v-if="index != 'deleted_at'">
<span style="font-size: 20px;font-weight:bold">{{index}}</span>
<span style="font-size: 20px;">{{item}}</span>
<hr>
</div>
</div>
</div>
<div slot="footer"></div>
</Modal>
</div>
</template>
<script lang="ts" src="./final-audit.ts"></script>

View File

@ -39,12 +39,13 @@ export default class Execute extends HomeParent {
}, {
title: "申请时间",
key: "create_time"
},{
title: "审核时间",
key: "audit_time"
}, {
title: "审核状态",
slot: "state",
title: "初审状态",
slot: "audit_state_one",
align: 'center',
},{
title: "终审状态",
slot: "audit_state_two",
align: 'center',
}, {
title: "执行状态",
@ -81,6 +82,7 @@ export default class Execute extends HomeParent {
switch (name) {
case "show" : this.show(row);break;
case "execute" : this.execute(row);break;
case "reject" : this.reject(row);break;
}
}
@ -97,6 +99,10 @@ export default class Execute extends HomeParent {
}
public execute(row){
if (row.execute_state == -1){
this.error('已驳回无法执行')
return
}
if (row.execute_state){
this.error('无法再次执行')
return
@ -112,8 +118,61 @@ export default class Execute extends HomeParent {
})
}
public reject(row){
if (row.execute_state == -1){
this.error('无法再次驳回')
return
}
if (row.execute_state){
this.error('已执行无法驳回')
return
}
let self = this;
this.$Modal.confirm({
title:"驳回原因",
render: function(h) {
return h('Input', {
props: {
value: self.$store.getters.user.name,
autofocus: true,
placeholder: 'Please enter reject reason...'
},
attrs: {
type: "textarea",
},
on: {
input: (val) => {
this.value = val;
}
}
})
},
onOk :function() {
if (!this.value) {
self.error('请输入驳回原因')
return;
}
let data = {reject_reason:this.value};
let url : string = self.$sprintf(Url.REJECT_APPLY, row.id);
Request('post', url,data).then((res:any)=>{
console.log(res)
if (res.code == 200){
self._getData();
self.success()
}else {
self.error(res.message)
}
})
}
})
}
private async _getData() {
let url : string = this.$sprintf(Url.APPLY, 3);
let url : string = this.$sprintf(Url.APPLY, 4);
const res:any = await Request('get', url,this.search)
if (res.code == 200){
this.Data = res.data.data

View File

@ -2,16 +2,24 @@
<div>
<custom-page :data-list="Data" :page.sync="search.page" :page-size.sync="search.size"
:total="total" :columns="columns">
<template slot-scope="{row}" slot="state">
<template slot-scope="{row}" slot="audit_state_one">
<div class="space-x-3">
<Tag color="blue" v-if="row.state == 0">待审核</Tag>
<Tag color="green" v-else-if="row.state == 1" >通过</Tag>
<Tag color="blue" v-if="row.audit_state_one == 0">待审核</Tag>
<Tag color="green" v-else-if="row.audit_state_one == 1" >通过</Tag>
<Tag color="magenta" v-else >未通过</Tag>
</div>
</template>
<template slot-scope="{row}" slot="audit_state_two">
<div class="space-x-3">
<Tag color="blue" v-if="row.audit_state_two == 0">待审核</Tag>
<Tag color="green" v-else-if="row.audit_state_two == 1" >通过</Tag>
<Tag color="magenta" v-else >未通过</Tag>
</div>
</template>
<template slot-scope="{row}" slot="execute_state">
<div class="space-x-3">
<Tag color="geekblue" v-if="row.execute_state == 1">执行中...</Tag>
<Tag color="cyan" v-if="row.execute_state == -1">被驳回</Tag>
<Tag color="geekblue" v-else-if="row.execute_state == 1">执行中...</Tag>
<Tag color="green" v-else-if="row.execute_state == 2" >执行成功</Tag>
<Tag color="red" v-else-if="row.execute_state == 3" >执行失败</Tag>
<Tag color="purple" v-else >未执行</Tag>
@ -27,6 +35,7 @@
<DropdownMenu slot="list">
<DropdownItem name="show" >查看</DropdownItem>
<DropdownItem name="execute">执行</DropdownItem>
<DropdownItem name="reject">驳回</DropdownItem>
</DropdownMenu>
</template>
</Dropdown>
@ -46,6 +55,8 @@
<div slot="footer"></div>
</Modal>
</div>
</template>

View File

@ -46,14 +46,9 @@ export default class Home extends HomeParent {
}
public created() {
// this._getData()
this._getData()
this.List = [
{id:1,name:'tom',tapd_id:10086},
{id:2,name:'jam',tapd_id:10086},
{id:3,name:'any',tapd_id:10086},
{id:4,name:'som',tapd_id:10086},
]
}
@Watch("search.page")
private _onPageChange(): void {
@ -68,9 +63,8 @@ export default class Home extends HomeParent {
private async _getData(){
const res = await Request('get',Url.MINT,this.search)
this.List = res.data.data
this.total = res.data.total
const res:any = await Request('get',Url.HOME)
this.List = res.data
console.log(res)
}

View File

@ -1,20 +1,21 @@
<template>
<div>
<div class="space-x-5 my-2 h-11">
<Input v-model="search.keywords" class="w-80 " clearable placeholder="请输入项目名称"></Input>
<Button type="primary" icon="ios-search-outline" :loading="loading">搜索</Button>
</div>
<custom-page :data-list="List" :page.sync="search.page" :page-size.sync="search.size"
:total="total" row-key="id" :columns="columns" :no-data-text="noDataText">
<Col span="5" style="margin-left: 20px">
<Card >
<p slot="title" style="font-weight: bold;">NFT</p>
<p slot="extra"><Icon type="ios-keypad" style="font-size: 24px;color: #36cfc9"/></p>
<p > <span style="font-size: 28px">{{ List.nft_month_num }}</span>
<Tag type="border" color="primary" style="width: 20px;float: right"> <span style="margin-left: -5px"></span></Tag></p>
<template slot="operation" slot-scope="{row}">
<div class="space-x-2">
<Button type="success" >查看</Button>
<Button type="error" >删除</Button>
<div style="border-top: 1px solid #e8eaec;margin: 10px -16px 0 -16px;">
<div style="height:24px;padding-top:10px;display: flex;justify-content: space-between;">
<span style="margin-left: 10px">总构建量</span>
<span style="margin-right: 10px">{{ List.nft_sum }}</span>
</div>
</div>
</template>
</custom-page>
</Card>
</Col>
</div>
</template>
<script src="./home.ts"></script>

View File

@ -77,7 +77,7 @@ export default class Layout extends HomeParent {
props: {
value: self.$store.getters.user.name,
autofocus: true,
placeholder: 'Please enter your name...'
placeholder: 'Please enter your nickName...'
},
on: {
input: (val) => {

View File

@ -24,14 +24,14 @@ export default class Menus extends HomeParent {
public drawerTitle:string = '';
public dialogFormVisible: boolean = false;
public isEdit : boolean = false;
public columns : TableColumn[] = [{
public columns : any = [{
// type : "selection",
width : 80,
key : "id"
}, {
title : "名称",
key : "name",
tree : true
tree: true
}, {
title : "路径",
key : "url"

View File

@ -33,10 +33,10 @@ export default class Node extends HomeParent {
controller : [{required : true, trigger : "blur", "message" : "请填写控制器名称"}],
}
public node : NodeInterface[] = [];
public columns : TableColumn[] = [ {
public columns : any = [ {
title : "名称",
key : "name",
tree : true
tree: true
}, {
title : "控制器",
key : "controller",

View File

@ -72,6 +72,41 @@ export default class Users extends HomeParent {
this._getData();
}
public addEmail(row : UserInterface){
// alert(row.account)
let self = this;
this.$Modal.confirm({
title:"修改邮箱",
render: function(h) {
return h('Input', {
props: {
value: self.$store.getters.user.name,
autofocus: true,
placeholder: 'Please enter email...'
},
on: {
input: (val) => {
this.value = val;
}
}
})
},
onOk :function() {
if (!this.value || this.value == self.$store.getters.user.name || this.value == '') {
return;
}
let data = {email:this.value};
let url = this.$sprintf(Url.UPDATE_EMAIL, row.id)
Request('put', url,data).then((res:any)=>{
if (res.code == 200){
self.success()
}else {
self.error(res.message)
}
})
}
})
}
public async initNodeData(row : UserInterface) {

View File

@ -9,7 +9,8 @@
<template slot-scope="{row}" slot="operation">
<div class="space-x-3">
<Button type="success" @click="initNodeData(row)">权限</Button>
<Button type="info" @click="initMenuData(row)">菜单</Button>
<Button type="primary" @click="initMenuData(row)">菜单</Button>
<Button type="info" @click="addEmail(row)">邮箱</Button>
</div>
</template>

View File

@ -25,13 +25,18 @@ const routers: RouteConfig[] = [{
},{
path: "apply",
name: 'apply',
meta: {title: "apply", isMenu: false},
meta: {title: "申请", isMenu: false},
component: () => import(/* webpackChunkName: "home-home" */ '@/views/home/pages/apply/apple.vue'),
},{
path: "audit",
name: 'audit',
meta: {title: "audit", isMenu: false},
meta: {title: "初审", isMenu: false},
component: () => import(/* webpackChunkName: "home-home" */ '@/views/home/pages/audit/audit.vue'),
},{
path: "final-audit",
name: 'final-audit',
meta: {title: "终审", isMenu: false},
component: () => import(/* webpackChunkName: "home-home" */ '@/views/home/pages/audit/final-audit.vue'),
},{
path: "execute",
name: 'execute',