Commit df1e88c0 by zhuzhequan

应用中心

parent 77287ba0
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -6,6 +6,7 @@ import LoginPage from '@/views/LoginPage.vue' ...@@ -6,6 +6,7 @@ import LoginPage from '@/views/LoginPage.vue'
import menuPage from '@/views/menu.vue' import menuPage from '@/views/menu.vue'
import TaskManage from '@/views/taskManage/index.vue' import TaskManage from '@/views/taskManage/index.vue'
import HomePage from '@/views/homePage/index.vue' import HomePage from '@/views/homePage/index.vue'
export const DEFAULT_DASHBOARD = 'home' export const DEFAULT_DASHBOARD = 'home'
Vue.use(VueRouter) Vue.use(VueRouter)
...@@ -14,7 +15,7 @@ const routes = [ ...@@ -14,7 +15,7 @@ const routes = [
{ {
path: '/login', path: '/login',
name: 'login', name: 'login',
component: LoginPage, component: LoginPage
}, },
{ {
...@@ -27,110 +28,118 @@ const routes = [ ...@@ -27,110 +28,118 @@ const routes = [
path: '/saas/home', path: '/saas/home',
name: 'home', name: 'home',
component: HomePage, component: HomePage,
meta: { title: '首页' }, meta: { title: '首页' }
}, },
{ {
path: '/saas/manage', path: '/saas/manage',
name: 'saasManage', name: 'saasManage',
meta: { title: 'ERP管理' }, meta: { title: 'ERP管理' },
component: SaasManage, component: SaasManage
}, },
{ {
path: '/saas/menu', path: '/saas/menu',
component: menuPage, component: menuPage,
name: 'saasMenu', name: 'saasMenu',
meta: { title: '菜单管理' }, meta: { title: '菜单管理' }
}, },
{ {
path: '/saas/taskManage', path: '/saas/taskManage',
component: TaskManage, component: TaskManage,
name: 'taskManage', name: 'taskManage',
meta: { title: '工单管理' }, meta: { title: '工单管理' }
}, },
{ {
path: '/saas/user', path: '/saas/user',
component: () => import('@/views/system/users.vue'), component: () => import('@/views/system/users.vue'),
name: 'system_user', name: 'system_user',
meta: { title: '用户管理' }, meta: { title: '用户管理' }
}, },
{ {
path: '/saas/currency', path: '/saas/currency',
component: () => import('@/views/basics/currency.vue'), component: () => import('@/views/basics/currency.vue'),
name: 'basics_currency', name: 'basics_currency',
meta: { title: '汇率币种' }, meta: { title: '汇率币种' }
}, },
{ {
path: '/saas/timed_task', path: '/saas/timed_task',
component: () => import('@/views/system/timed_task.vue'), component: () => import('@/views/system/timed_task.vue'),
name: 'system_timed_task', name: 'system_timed_task',
meta: { title: '定时任务' }, meta: { title: '定时任务' }
}, },
{ {
path: '/saas/announceManage', path: '/saas/announceManage',
component: () => import('@/views/system/announceManage.vue'), component: () => import('@/views/system/announceManage.vue'),
name: 'system_announce_manage', name: 'system_announce_manage',
meta: { title: '公告管理' }, meta: { title: '公告管理' }
}, },
{ {
path: '/saas/countryCode', path: '/saas/countryCode',
component: () => import('@/views/system/countryCode.vue'), component: () => import('@/views/system/countryCode.vue'),
name: 'system_countryCode', name: 'system_countryCode',
meta: { title: '国家代码' }, meta: { title: '国家代码' }
}, },
{ {
path: '/saas/abbreviation', path: '/saas/abbreviation',
component: () => import('@/views/system/abbreviation.vue'), component: () => import('@/views/system/abbreviation.vue'),
name: 'system_abbreviation', name: 'system_abbreviation',
meta: { title: '州省简称' }, meta: { title: '州省简称' }
}, },
{ {
path: '/saas/management', path: '/saas/management',
component: () => import('@/views/system/management.vue'), component: () => import('@/views/system/management.vue'),
name: 'system_management', name: 'system_management',
meta: { title: '客户管理' }, meta: { title: '客户管理' }
}, },
{ {
path: '/saas/logistics/transporters', path: '/saas/logistics/transporters',
component: () => import('@/views/system/transporters.vue'), component: () => import('@/views/system/transporters.vue'),
name: 'system_transporters', name: 'system_transporters',
meta: { title: '运输商列表' }, meta: { title: '运输商列表' }
}, },
{ {
path: '/saas/category-style', path: '/saas/category-style',
component: () => import('@/views/system/category-style.vue'), component: () => import('@/views/system/category-style.vue'),
name: 'system_category_style', name: 'system_category_style',
meta: { title: '类别风格' }, meta: { title: '类别风格' }
}, },
{ {
path: '/saas/sku-sort', path: '/saas/sku-sort',
component: () => import('@/views/system/sku-sort.vue'), component: () => import('@/views/system/sku-sort.vue'),
name: 'system_sku-sort', name: 'system_sku-sort',
meta: { meta: {
title: '属性类管理', title: '属性类管理'
}, }
}, },
{ {
path: '/saas/sku-manage', path: '/saas/sku-manage',
component: () => import('@/views/system/sku-manage.vue'), component: () => import('@/views/system/sku-manage.vue'),
name: 'system_sku-manage', name: 'system_sku-manage',
meta: { meta: {
title: '属性值管理', title: '属性值管理'
}
}, },
{
path: '/saas/app',
component: () => import('@/views/system/app.vue'),
name: 'system_app',
meta: {
title: '应用中心'
}
}, },
{ {
path: '/operation/lossOrder', path: '/operation/lossOrder',
component: () => import('@/views/operation/lossOrder/index.vue'), component: () => import('@/views/operation/lossOrder/index.vue'),
name: 'system_management', name: 'system_management',
meta: { title: '丢单管理' }, meta: { title: '丢单管理' }
}, }
], ]
}, }
] ]
const router = new VueRouter({ const router = new VueRouter({
mode: 'history', mode: 'history',
base: process.env.BASE_URL, base: process.env.BASE_URL,
routes, routes
}) })
export default router export default router
...@@ -4,7 +4,7 @@ function getStaticPath() { ...@@ -4,7 +4,7 @@ function getStaticPath() {
} }
return window.apiHostSetting.VUE_APP_BASE_URL return window.apiHostSetting.VUE_APP_BASE_URL
} }
export const isMobile = () => window.innerWidth <= 1100
// zimg图片服务器地址 // zimg图片服务器地址
export const zImgPath = window.apiHostSetting.VUE_APP_ZIMG_URL export const zImgPath = window.apiHostSetting.VUE_APP_ZIMG_URL
// 文件存储路径地址 // 文件存储路径地址
......
...@@ -262,6 +262,14 @@ export default { ...@@ -262,6 +262,14 @@ export default {
icon: 'el-icon-box', icon: 'el-icon-box',
index: '/saas/sku-manage', index: '/saas/sku-manage',
children: [] children: []
},
{
id: 11,
path: '',
label: '应用中心',
icon: 'el-icon-s-grid',
index: '/saas/app',
children: []
} }
] ]
}, },
......
<template>
<div class="announce-manage card">
<el-form
ref="form"
:model="searchForm"
size="mini"
v-enter-submit="search"
@submit.native.prevent
:inline="true"
>
<el-form-item label="应用名称">
<el-input
style="width: 120px"
clearable
v-model="searchForm.employeeName"
placeholder="应用名称"
></el-input>
</el-form-item>
<el-form-item label="应用分类">
<el-select
v-model="searchForm.creator"
placeholder="请选择"
clearable
filterable
>
<el-option
v-for="user in userList"
:key="user.id"
:label="user.realName"
:value="user.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker
style="width: 164px"
v-model="searchForm.time"
align="right"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
></el-date-picker>
<!-- <el-input v-model="searchForm.time"></el-input> -->
</el-form-item>
<el-form-item label>
<el-button
type="primary"
native-type="submit"
@click="search()"
>
查询
</el-button>
</el-form-item>
<el-form-item label>
<el-button type="success" @click="editDialog()"
>新增
</el-button
>
</el-form-item>
<el-form-item label>
<el-button type="danger" @click="editDialog()"
>删除
</el-button
>
</el-form-item>
</el-form>
<div class="table_wrap" style="padding: 0">
<table-view
:sourceData="sourceData"
:serialNumber="false"
:tableColumns="tableColumns"
></table-view>
</div>
<pagination
:setValue="setpaginationOptions"
:options="paginationOptions"
/>
<el-dialog
:title="isEdit ? '编辑' : '新增'"
:close-on-click-modal="false"
:visible.sync="dialogVisible"
width="80%"
>
<div class="app-form">
<div class="img">
<img
src="https://img0.baidu.com/it/u=2426072799,1960439289&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1718902800&t=11922fc3c027b8ac0f9bd5ef82d518c7"
alt="">
</div>
<div class="form">
<el-form
:model="editForm"
:inline="true"
label-width="80px"
:rules="addrules"
size="mini"
ref="editForm"
>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item
label="应用名称"
size="small"
prop="title"
>
<el-input
style="width: 100%"
v-model="editForm.title"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="应用分类"
size="small"
prop="title"
>
<el-select
style="width: 100%;"
v-model="searchForm.creator"
placeholder="请选择"
clearable
filterable
>
<el-option
v-for="user in userList"
:key="user.id"
:label="user.realName"
:value="user.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
label="应用简述"
size="small"
prop="title"
>
<el-input
style="width: 100%"
type="textarea"
:rows="4"
v-model="editForm.title"
></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
label="应用详情"
size="small"
prop="title"
>
<v-editor
filename="files"
style="width: 100%"
v-model="editForm.content"
ref="wangeditor"
height="300px"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" style="width: 100%;">
<el-col :span="11">
<el-form-item
label="应用价格"
size="small"
prop="title"
>
<el-input
style="width: 100%"
v-model="editForm.title"
></el-input>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item
label="应用周期"
size="small"
prop="title"
>
<el-select
style="width: 100%"
v-model="searchForm.creator"
placeholder="请选择"
clearable
filterable
>
<el-option
v-for="user in userList"
:key="user.id"
:label="user.realName"
:value="user.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col style="display: flex;margin-top: 3px;" :span="2">
<el-button size="mini" type="success" icon="el-icon-plus"></el-button>
<el-button style="margin-left: 15px" size="mini" type="danger" icon="el-icon-minus"></el-button>
</el-col>
</el-row>
</el-form>
</div>
</div>
<div style="display: flex;justify-content: flex-end" slot="footer">
<el-button
size="mini"
style="width: 80px;"
@click="dialogVisible = false"
>取 消
</el-button
>
<el-button
size="mini"
style="margin-left: 20px;width: 80px;"
type="primary"
@click="submit"
>确 定
</el-button
>
</div>
</el-dialog>
<el-dialog
:visible.sync="releaseVisible"
:close-on-click-modal="false"
title="发布"
width="600px"
>
<el-checkbox
:indeterminate="isIndeterminate"
v-model="checkAll"
@change="handleCheckAllChange"
>全选
</el-checkbox
>
<div style="margin: 15px 0"></div>
<el-checkbox-group
v-model="checkedCompany"
@change="handleCheckedCompanyChange"
>
<el-checkbox
style="width: 100px"
v-for="c in releaseList"
:label="c.id"
:key="c.id"
>{{ c.apiName }}
</el-checkbox
>
</el-checkbox-group>
<span slot="footer">
<el-button
size="mini"
@click="releaseVisible = false"
>取消</el-button
>
<el-button
size="mini"
@click="confirmRelease"
type="primary"
>确认</el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
import Editor from '@/components/wangeditor/index.vue'
import tableView from '@/common/components/base/tableView.vue'
import { get, post } from '@/common/api/axios'
import { getSystemUserList } from '@/common/api/system'
export default {
name: 'system_announce_manage',
components: {
'v-editor': Editor,
tableView
},
data() {
return {
checkAll: false,
isIndeterminate: false,
checkedCompany: [],
userList: [],
pageSize: 50,
currentPage: 1,
total: 1,
paginationOptions: {
pageSize: 100,
currentPage: 1,
total: 0
},
addrules: {
title: [
{
required: true,
message: '请输入标题',
trigger: 'blur'
}
]
},
sourceData: [],
searchForm: {},
isEdit: false,
dialogVisible: false,
editForm: {
title: ''
},
defaultEditFrom: {
title: '',
enableFlag: false,
content: '',
priority: false
},
releaseVisible: false,
releaseList: []
}
},
mounted() {
this.getList()
this.getSystemUserList()
},
computed: {
tableColumns() {
return [
{
label: '应用名称',
key: 'title',
align: 'left'
},
{
label: '应用分类',
key: 'creatorName'
},
{
label: '应用简述',
key: 'creatorName'
},
{
label: '应用服务期',
key: 'creatorName'
},
{
label: '创建时间',
key: 'creationTime'
},
{
label: '操作',
width: 100,
render: (item) => (
<div>
<span
class="icon-view icon-edit-view"
title="编辑"
onClick={() => this.editDialog(item)}
>
<i class="el-icon-edit"></i>
</span>
<span
class="icon-view icon-del-view"
title="删除"
onClick={() => this.deleteAnnounces(item)}
>
<i class="el-icon-delete"></i>
</span>
</div>
)
}
]
}
},
methods: {
handleCheckAllChange(val) {
this.checkedCompany = val
? this.releaseList.map((e) => e.id)
: []
this.isIndeterminate = false
},
handleCheckedCompanyChange(value) {
const checkedCount = value.length
this.checkAll =
checkedCount === this.releaseList.length
this.isIndeterminate =
checkedCount > 0 &&
checkedCount < this.releaseList.length
},
search() {
this.getList()
},
async getSystemUserList() {
try {
const res = await getSystemUserList()
this.userList = res.data
} catch (e) {
console.error(e)
}
},
setpaginationOptions(opt) {
for (const key in opt) {
this.paginationOptions[key] = opt[key]
}
this.getList()
},
async getList() {
try {
const {
pageSize,
currentPage
} =
this.paginationOptions
const res = await post('sys/announcement/list', {
pageSize,
currentPage,
...this.searchForm
})
if (res.code !== 200) return
this.sourceData = res.data.records
this.paginationOptions.total = res.data.total
} catch (e) {
console.error(e)
}
},
currentChange(i) {
this.currentPage = i
this.getList()
},
async editDialog(item) {
if (item) {
try {
const res = await get(
'sys/announcement/get/' + item.id
)
if (res.code !== 200) return
this.editForm = {
...this.editForm,
...res.data
}
this.isEdit = true
} catch (e) {
console.error(e)
}
} else {
this.editForm = JSON.parse(
JSON.stringify(this.defaultEditFrom)
)
this.$nextTick(() => {
this.$refs.editForm.clearValidate()
})
this.isEdit = false
}
this.dialogVisible = true
},
async submit() {
try {
await this.$refs.editForm.validate()
} catch {
return
}
try {
const url = this.isEdit
? 'sys/announcement/edit'
: 'sys/announcement/add'
const res = await post(url, { ...this.editForm })
if (res.code !== 200) return
this.$message.success(res.message)
this.dialogVisible = false
this.getList()
} catch (e) {
console.error(e)
}
},
async enableChange(item, val) {
try {
const res = await post('sys/announcement/edit', {
id: item.id,
enableFlag: val
})
if (res.code !== 200) return
this.$message.success(res.message)
this.getList()
} catch (e) {
console.error(e)
}
},
async release(item) {
try {
const res = await post('sys/domain/list')
if (res.code !== 200) return
this.releaseList = res.data
this.rowId = item.id
this.checkedCompany = []
this.releaseVisible = true
} catch (e) {
console.error(e)
}
},
async deleteAnnounces(item) {
try {
const res = await get(
'sys/announcement/delete/' + item.id
)
if (res.code !== 200) return
this.$message.success(res.message)
this.getList()
} catch (e) {
console.error(e)
}
},
async confirmRelease() {
if (this.checkedCompany.length === 0) {
return this.$message.warning('请至少选择一条记录')
}
try {
const res = await post('sys/announcement/publish', {
id: this.rowId,
dataSourcelist: this.checkedCompany
})
if (res.code !== 200) return
this.$message.success(res.message)
this.releaseVisible = false
this.getList()
} catch (e) {
console.error(e)
}
}
}
}
</script>
<style lang="scss" scoped>
.announce-manage {
height: 100%;
display: flex;
flex-direction: column;
padding: 10px 20px 0;
overflow: hidden;
}
.app-form {
display: flex;
align-items: flex-start;
.form {
flex: 1;
flex-shrink: 0;
overflow: hidden;
::v-deep .el-form-item__label {
white-space: nowrap;
}
::v-deep .el-form-item {
display: flex;
}
::v-deep .el-form {
display: flex;
flex-wrap: wrap;
}
::v-deep .el-form-item__content {
flex: 1;
flex-shrink: 0;
overflow: hidden;
}
}
.img {
width: 150px;
height: 150px;
margin-right: 25px;
img {
width: 100%;
height: 100%;
}
}
}
.el-row{
align-items: center;
}
</style>
...@@ -3,6 +3,15 @@ module.exports = defineConfig({ ...@@ -3,6 +3,15 @@ module.exports = defineConfig({
transpileDependencies: true, transpileDependencies: true,
devServer: { devServer: {
port: 8082, port: 8082,
host: '' host: '',
}, proxy: {
'/api': {
target: 'http://192.168.31.188:8096',
changeOrigin: true
// 路径重写规则,这里将 /api 开头的请求路径替换为空字符串,即去掉 /api 前缀
}
}
}
}) })
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment