feat: remove useless project
@@ -1,10 +0,0 @@
|
||||
# port
|
||||
VITE_PORT = 3401
|
||||
#mode
|
||||
VITE_GLOB_APP_RUN_TYPE = saas
|
||||
|
||||
# spa-title
|
||||
VITE_GLOB_APP_TITLE = Smart Parking Depositor
|
||||
|
||||
# spa shortname
|
||||
VITE_GLOB_APP_SHORT_NAME = smart-parking-depositor
|
||||
@@ -1,22 +0,0 @@
|
||||
# Whether to open mock
|
||||
VITE_USE_MOCK = true
|
||||
|
||||
# public path
|
||||
VITE_PUBLIC_PATH = /
|
||||
|
||||
# Cross-domain proxy, you can configure multiple
|
||||
# Please note that no line breaks http://100.73.70.51
|
||||
|
||||
#VITE_PROXY = {"/community":{ "target":"http://100.73.70.51","changeOrigin": true,"prependPath":false},"/parking":{ "target":"http://100.73.70.246:8080","changeOrigin": true,"iprependPath":false}}
|
||||
# VITE_PROXY=[["/api","http://100.73.70.51"],["/parking","http://100.73.70.246:8080"]]
|
||||
# Delete console
|
||||
VITE_DROP_CONSOLE = false
|
||||
|
||||
# Basic interface address SPA
|
||||
VITE_GLOB_API_URL=/basic-api
|
||||
|
||||
# File upload address, optional
|
||||
VITE_GLOB_UPLOAD_URL=/upload
|
||||
|
||||
# Interface prefix
|
||||
VITE_GLOB_API_URL_PREFIX=
|
||||
@@ -1,35 +0,0 @@
|
||||
# Whether to open mock
|
||||
VITE_USE_MOCK = true
|
||||
|
||||
# public path
|
||||
VITE_PUBLIC_PATH = /
|
||||
|
||||
# Delete console
|
||||
VITE_DROP_CONSOLE = true
|
||||
|
||||
# Whether to enable gzip or brotli compression
|
||||
# Optional: gzip | brotli | none
|
||||
# If you need multiple forms, you can use `,` to separate
|
||||
VITE_BUILD_COMPRESS = 'none'
|
||||
|
||||
# Whether to delete origin files when using compress, default false
|
||||
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
|
||||
|
||||
# Basic interface address SPA
|
||||
VITE_GLOB_API_URL=/basic-api
|
||||
|
||||
# File upload address, optional
|
||||
# It can be forwarded by nginx or write the actual address directly
|
||||
VITE_GLOB_UPLOAD_URL=/upload
|
||||
|
||||
# Interface prefix
|
||||
VITE_GLOB_API_URL_PREFIX=
|
||||
|
||||
# Whether to enable image compression
|
||||
VITE_USE_IMAGEMIN= true
|
||||
|
||||
# use pwa
|
||||
VITE_USE_PWA = false
|
||||
|
||||
# Is it compatible with older browsers
|
||||
VITE_LEGACY = false
|
||||
@@ -1 +0,0 @@
|
||||
1.0.10
|
||||
@@ -1,74 +0,0 @@
|
||||
#!/bin/bash
|
||||
SOURCE="$0"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
if [ -z $WORKSPACE ];then
|
||||
echo "WORKSPACE not exists"
|
||||
else
|
||||
set DIR=$WORKSPACE
|
||||
fi
|
||||
|
||||
echo "current dir"
|
||||
echo "$DIR"
|
||||
|
||||
cd "$DIR"
|
||||
projectname=$(basename `pwd`)
|
||||
|
||||
npm run mobile-build
|
||||
|
||||
if [ -d "$DIR/dist" ];then
|
||||
|
||||
cd "$DIR/dist"
|
||||
|
||||
# copy module.json
|
||||
cp ../module.json ./
|
||||
|
||||
# package
|
||||
VERSION=$(cat ../.version)
|
||||
lastdir=../release/
|
||||
if [ -d ${lastdir} ];then
|
||||
echo "删除旧release文件夹"
|
||||
rm -rf ${lastdir}
|
||||
else
|
||||
echo "文件夹不存在!"
|
||||
fi
|
||||
mkdir -p ${lastdir}
|
||||
|
||||
dir=../release/nerv/$projectname/$VERSION
|
||||
mkdir -p ${dir}
|
||||
tar -zcvf "${dir}/$projectname-$VERSION.tgz" ./*
|
||||
|
||||
templatedir=../release/resources/templates/nerv/$projectname/$VERSION/$projectname
|
||||
mkdir -p ${templatedir}
|
||||
cp -r ../resources/templates/* ${templatedir}
|
||||
|
||||
cd ../
|
||||
|
||||
releasefile=nerv-$projectname-$VERSION.tgz
|
||||
if [ -f ${releasefile} ];then
|
||||
echo "删除旧包!"
|
||||
rm -rf ${releasefile}
|
||||
fi
|
||||
|
||||
tar -zcvf ${releasefile} ./release/* release.yaml
|
||||
|
||||
mkdir -p ./release/nervui
|
||||
cp -r ./release/nerv/* ./release/nervui
|
||||
|
||||
if [ -f ${releasefile} ];then
|
||||
echo "编译成功!"
|
||||
mv ${releasefile} ./release
|
||||
else
|
||||
echo "编译失败!!!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
else
|
||||
echo "编译失败!!!"
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,14 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
<!-- <link rel="shortcut icon" href="/asset/image/logo.ico" type="image/ico" /> -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>mobile-application</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="./src/main.ts"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 225 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 904 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 6.0 KiB |
@@ -1,12 +0,0 @@
|
||||
# 上传release目录信息到nerv-file仓库
|
||||
release:
|
||||
- {src: release, dest: /upload/pkg, include: [".*(.tgz)$"]}
|
||||
- {src: release/resources/templates, dest: /upload/templates}
|
||||
register:
|
||||
name: nervui-mobile-application
|
||||
version: 1.0.10
|
||||
components:
|
||||
- type: nervui-mobile-application
|
||||
resources:
|
||||
- {type: template, relativePath: /nervui-mobile-application/deploy.json}
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
echo "=====================================================create====================================================="
|
||||
|
||||
#!/usr/bin/env bash
|
||||
|
||||
function create() {
|
||||
|
||||
if [ -d "$nervui_app_home" ];then
|
||||
echo "$nervui_app_home exists!"
|
||||
else
|
||||
echo "start mkdir $nervui_app_home"
|
||||
mkdir -p "$nervui_app_home"
|
||||
fi
|
||||
|
||||
pkg_file_name=${pkg_url##*/}
|
||||
pkg_file_path="$nervui_app_home$pkg_file_name"
|
||||
|
||||
|
||||
echo "start download $pkg_url"
|
||||
curl -L -o $pkg_file_path $pkg_url
|
||||
|
||||
|
||||
echo "start install $pkg_file_path"
|
||||
tar -xf $pkg_file_path -C $nervui_app_home
|
||||
|
||||
}
|
||||
|
||||
if [ "$pkg_url" == "" ]; then
|
||||
echo {\"error\":\"pkg_url is empty\"}
|
||||
exit 1
|
||||
elif [ "$nervui_app_home" == "" ]; then
|
||||
echo {\"error\":\"nervui_app_home is empty\"}
|
||||
exit 1
|
||||
else
|
||||
create
|
||||
fi
|
||||
@@ -1 +0,0 @@
|
||||
echo "=====================================================delete====================================================="
|
||||
@@ -1 +0,0 @@
|
||||
echo "=====================================================setup====================================================="
|
||||
@@ -1 +0,0 @@
|
||||
echo "=====================================================start====================================================="
|
||||
@@ -1 +0,0 @@
|
||||
echo "=====================================================stop====================================================="
|
||||
@@ -1,30 +0,0 @@
|
||||
{
|
||||
"name": "/nervui/nervui-mobile-application",
|
||||
"operations": [
|
||||
{
|
||||
"name": "Create",
|
||||
"type": "shell",
|
||||
"implementor": "create.sh"
|
||||
},
|
||||
{
|
||||
"name": "Delete",
|
||||
"type": "shell",
|
||||
"implementor": "delete.sh"
|
||||
},
|
||||
{
|
||||
"name": "Setup",
|
||||
"type": "shell",
|
||||
"implementor": "setup.sh"
|
||||
},
|
||||
{
|
||||
"name": "Start",
|
||||
"type": "shell",
|
||||
"implementor": "start.sh"
|
||||
},
|
||||
{
|
||||
"name": "Stop",
|
||||
"type": "shell",
|
||||
"implementor": "stop.sh"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
{
|
||||
"name": "/nervui/nervui-mobile-application",
|
||||
"version": 1,
|
||||
"inputs": [
|
||||
{
|
||||
"name": "server_ip",
|
||||
"type": "string",
|
||||
"required": true,
|
||||
"description": "应用安装IP地址",
|
||||
"inputType": "ipSelectType"
|
||||
},
|
||||
{
|
||||
"name": "version",
|
||||
"type": "string",
|
||||
"required": true,
|
||||
"description": "软件版本",
|
||||
"inputType": "versionSelectType"
|
||||
},
|
||||
{
|
||||
"name": "install_dir",
|
||||
"type": "string",
|
||||
"required": true,
|
||||
"defaultValue": "/data",
|
||||
"inputType": "textInputType",
|
||||
"description": "安装目录"
|
||||
}
|
||||
],
|
||||
"nodes": [
|
||||
{
|
||||
"name": "nervui-mobile-application",
|
||||
"type": "/nerv/nerv-orchestrator/cluster/Nervui",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "file_repository",
|
||||
"value": "${nerv_file_repository}"
|
||||
},
|
||||
{
|
||||
"name": "install_dir",
|
||||
"value": "${install_dir}"
|
||||
},
|
||||
{
|
||||
"name": "pkg_url",
|
||||
"value": "/api/pkg/nerv/nervui-mobile-application/${version}/nervui-mobile-application-${version}.tgz"
|
||||
}
|
||||
],
|
||||
"dependencies": [
|
||||
{
|
||||
"type": "contained",
|
||||
"target": "host"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "host",
|
||||
"type": "/nerv/nerv-orchestrator/compute/Host",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "address",
|
||||
"value": "${server_ip}"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<a-config-provider :locale="locale">
|
||||
<router-view />
|
||||
</a-config-provider>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, watch, ref } from 'vue';
|
||||
import zhCN from 'ant-design-vue/es/locale/zh_CN';
|
||||
import { useRouter } from 'vue-router';
|
||||
import Cookies from 'js-cookie';
|
||||
import { message } from 'ant-design-vue';
|
||||
export default defineComponent({
|
||||
name: 'App',
|
||||
|
||||
setup() {
|
||||
const router = useRouter();
|
||||
|
||||
// router.beforeEach((to, from) => {
|
||||
// if (Cookies.get('nervsid') === undefined && to.fullPath !== '/login') {
|
||||
// if (from.name !== undefined) {
|
||||
// message.warn('登陆信息已过期,请重新登录!', 1);
|
||||
// }
|
||||
// router.push('/login');
|
||||
// }
|
||||
// });
|
||||
|
||||
const cachedViews = ['Status'];
|
||||
|
||||
// watch(
|
||||
// () => router.currentRoute.value,
|
||||
// (e) => {
|
||||
// // if (Cookies.get('nervsid') === undefined && e.fullPath !== '/login') {
|
||||
// // message.warn('登陆信息已过期,请重新登录!', 1);
|
||||
// // router.push('/login');
|
||||
// // }
|
||||
// // } else {
|
||||
// // if (Cookies.get('nervsid') !== undefined && e === '/login') {
|
||||
// // let url = window.sessionStorage.getItem('url');
|
||||
// // url === null ? window.sessionStorage.setItem('url', '/doorway/visitor/audit') : '';
|
||||
// // router.push(url === null ? '/doorway' : url);
|
||||
// // }
|
||||
// // }
|
||||
// }
|
||||
// );
|
||||
return {
|
||||
cachedViews,
|
||||
locale: zhCN,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#app {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
@@ -1,6 +0,0 @@
|
||||
/***
|
||||
*配置接口 格式 module:Array<resource>
|
||||
*/
|
||||
export const apiModule = {
|
||||
parking: ['User', 'CurrentUser', 'Organizational'],
|
||||
};
|
||||
@@ -1,20 +0,0 @@
|
||||
import { http } from '/nerv-lib/saas';
|
||||
|
||||
enum Api {
|
||||
// USER_LOGIN = '/api/community/objs/Login', //用户登录
|
||||
// USER_INFO = '/api/community/community/objs/CurrentUser', //获取用户信息
|
||||
|
||||
USER_LOGIN = 'api/web/objs/Login', //用户登录
|
||||
USER_INFO = 'api/web/objs/CurrentUser', //获取用户信息
|
||||
USER_RESOURCE = '/api/community/objs/User/Resource', //获取用户资源
|
||||
}
|
||||
export const userLogin = (data: RoomListModel) => http.post(Api.USER_LOGIN, data);
|
||||
export const userInfo = () => http.get(Api.USER_INFO);
|
||||
export const userResource = () => http.get(Api.USER_RESOURCE);
|
||||
/**
|
||||
* @description 用户登录
|
||||
* @property `[fatherRegionUuid]` 父级区域唯一标识
|
||||
*/
|
||||
interface RoomListModel {
|
||||
data: string;
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
/** @format */
|
||||
import headerConfig from './transform';
|
||||
// console.log(headerConfig);
|
||||
|
||||
export const appConfig = {
|
||||
projectType: 'web',
|
||||
baseApi: '/api',
|
||||
// enablePermissions: true,
|
||||
timeout: 60 * 1000,
|
||||
customLogin: () => import('/@/view/login.vue'),
|
||||
userLoginApi: 'api/content/objs/Login',
|
||||
userResourceApi: '/api/community/objs/User/Resource',
|
||||
userInfoApi: 'api/content/objs/CurrentUser',
|
||||
headers: Object.assign(
|
||||
{
|
||||
site: 'brainMobile',
|
||||
},
|
||||
headerConfig,
|
||||
),
|
||||
// 修改密码配置
|
||||
updatePassWordInfo: {
|
||||
title: '修改密码',
|
||||
subtitle: '移动端应用管理',
|
||||
api: '/api/content/objs/User/changePassword',
|
||||
},
|
||||
};
|
||||
@@ -1,2 +0,0 @@
|
||||
import { appConfig } from '/@/config/app.config';
|
||||
export { appConfig };
|
||||
@@ -1,26 +0,0 @@
|
||||
/** @format */
|
||||
import Cookies from 'js-cookie';
|
||||
|
||||
const transformParams = () => {
|
||||
const HEADER_CONFIG = window.location.search.substring(1);
|
||||
if (!HEADER_CONFIG) return null;
|
||||
const KEY_VALUE = HEADER_CONFIG.split('&');
|
||||
return KEY_VALUE.reduce((memo: any, cur) => {
|
||||
const keyvalue = cur.split('=');
|
||||
memo[keyvalue[0]] = keyvalue[1];
|
||||
return memo;
|
||||
}, {});
|
||||
};
|
||||
|
||||
const headers = transformParams();
|
||||
let headerConfig = {};
|
||||
if (headers) {
|
||||
Object.keys(headers).map((key) => {
|
||||
Cookies.set(key, headers[key]);
|
||||
});
|
||||
headerConfig = Object.assign({}, headers);
|
||||
} else {
|
||||
headerConfig['qsToken'] = Cookies.get('qsToken');
|
||||
}
|
||||
|
||||
export default headerConfig;
|
||||
@@ -1,22 +0,0 @@
|
||||
export enum ResultEnum {
|
||||
SUCCESS = 0,
|
||||
ERROR = 1,
|
||||
TIMEOUT = 401,
|
||||
TOKEN_INVALID = 403,
|
||||
}
|
||||
|
||||
export enum RequestEnum {
|
||||
GET = 'GET',
|
||||
POST = 'POST',
|
||||
PUT = 'PUT',
|
||||
DELETE = 'DELETE',
|
||||
}
|
||||
|
||||
export enum ContentTypeEnum {
|
||||
// json
|
||||
JSON = 'application/json;charset=UTF-8',
|
||||
// form-data qs
|
||||
FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8',
|
||||
// form-data upload
|
||||
FORM_DATA = 'multipart/form-data;charset=UTF-8',
|
||||
}
|
||||
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 17 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M352 128v768h-64V128H192v768h640V128H352z m-192-64h704c9.344 0 17.024 3.008 23.04 8.96 5.952 6.016 8.96 13.696 8.96 23.04v832a31.168 31.168 0 0 1-8.96 23.04 31.168 31.168 0 0 1-23.04 8.96h-704a31.168 31.168 0 0 1-23.04-8.96 31.168 31.168 0 0 1-8.96-23.04v-832c0-9.344 3.008-17.024 8.96-23.04A31.168 31.168 0 0 1 160 64z m320 192h192c21.312 0 32 10.688 32 32 0 21.312-10.688 32-32 32h-192c-21.312 0-32-10.688-32-32 0-21.312 10.688-32 32-32z m0 192h192c21.312 0 32 10.688 32 32 0 21.312-10.688 32-32 32h-192c-21.312 0-32-10.688-32-32 0-21.312 10.688-32 32-32z m0 192h192c21.312 0 32 10.688 32 32 0 21.312-10.688 32-32 32h-192c-21.312 0-32-10.688-32-32 0-21.312 10.688-32 32-32z" /></svg>
|
||||
|
Before Width: | Height: | Size: 971 B |
@@ -1,4 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="12" cy="12" r="12" fill="#1677FF" fill-opacity="0.1"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.9352 9.87544L16.531 9.87547C16.531 8.58454 16.0608 7.36797 15.2071 6.44985C14.7866 5.99763 14.2954 5.64185 13.7472 5.39246C13.1745 5.13204 12.5662 5 11.9388 5C11.3114 5 10.7031 5.13204 10.1305 5.39243C9.58225 5.64182 9.09102 5.9976 8.67051 6.44983C7.81678 7.36797 7.34659 8.58452 7.34659 9.87544H8.94234C8.94234 8.06373 10.2865 6.58981 11.9388 6.58981C13.591 6.58981 14.9352 8.06373 14.9352 9.87544ZM7.46099 9.95703H16.539V9.95705C17.5421 9.95705 18 10.7674 18 11.7659V17.1925C18 18.191 17.5421 19.0014 16.539 19.0014H7.461C6.45786 19.0014 6 18.1919 6 17.1925V11.7659C6 10.7674 6.45787 9.95703 7.46099 9.95703ZM12.908 15.1319V16.2878C12.908 16.7871 12.5012 17.1922 12.0001 17.1922C11.4992 17.1922 11.0924 16.787 11.0924 16.2878V15.1328C10.5522 14.819 10.1846 14.242 10.1846 13.5745C10.1846 12.5751 10.997 11.7656 12.0001 11.7656C13.0034 11.7656 13.8157 12.5751 13.8157 13.5745C13.8159 14.242 13.4481 14.819 12.908 15.1319Z" fill="#1677FF"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@@ -1,4 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="12" cy="12" r="12" fill="#1677FF" fill-opacity="0.1"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.3936 10.8691C12.0322 11.4221 10.4652 11.1164 9.42323 10.0946C8.56315 9.25057 8.18933 8.04123 8.42675 6.87091C8.66417 5.70058 9.48151 4.72368 10.6055 4.26681C11.4814 3.91106 12.518 3.91106 13.3939 4.26681C14.7552 4.81996 15.6428 6.12287 15.6427 7.56804C15.6427 9.01321 14.755 10.3161 13.3936 10.8691ZM9.08048 11.9575H14.9191H14.9193C16.6182 11.9575 18 13.3128 18 14.9788C18 16.6448 16.618 18 14.9193 18H9.08048C7.38197 18 6 16.6448 6 14.9788C6 13.3128 7.38176 11.9575 9.08048 11.9575Z" fill="#1677FF"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 714 B |
|
Before Width: | Height: | Size: 8.3 KiB |
@@ -1,13 +0,0 @@
|
||||
import { createApp } from 'vue';
|
||||
import App from '/@/App.vue';
|
||||
import { saasInit } from '/nerv-lib/saas';
|
||||
import { apiModule } from '/@/api';
|
||||
import { appConfig } from '/@/config';
|
||||
|
||||
const app = createApp(App);
|
||||
saasInit({
|
||||
app,
|
||||
apiModule,
|
||||
appConfig,
|
||||
});
|
||||
app.mount('#app');
|
||||
@@ -1,510 +0,0 @@
|
||||
/** @format */
|
||||
|
||||
import Cookies from 'js-cookie';
|
||||
import headerConfig from '/@/config/transform';
|
||||
|
||||
console.log(headerConfig);
|
||||
|
||||
const Base = () => import('/nerv-lib/saas/view/system/layout/content.vue');
|
||||
|
||||
const contentManage = {
|
||||
path: '/contentManage',
|
||||
name: 'contentManage',
|
||||
meta: { title: '', icon: '', index: 1 },
|
||||
redirect: { name: 'Content' },
|
||||
children: [
|
||||
{
|
||||
path: 'content',
|
||||
name: 'Content',
|
||||
meta: { title: '内容管理', icon: 'neirongguanli' },
|
||||
component: Base,
|
||||
redirect: { name: 'Announcements' },
|
||||
children: [
|
||||
{
|
||||
path: 'announcements',
|
||||
name: 'Announcements',
|
||||
meta: { title: '通知公告管理', hideChildren: true },
|
||||
component: Base,
|
||||
redirect: { name: 'AnnouncementsIndex' },
|
||||
children: [
|
||||
{
|
||||
path: 'index',
|
||||
name: 'AnnouncementsIndex',
|
||||
component: () => import('/@/view/contentManage/announcements/index.vue'),
|
||||
meta: {
|
||||
title: '通知公告管理',
|
||||
keepAlive: true,
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'detail',
|
||||
name: 'AnnouncementsDetail',
|
||||
component: () => import('/@/view/contentManage/announcements/detail.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '查看',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'add',
|
||||
name: 'AnnouncementsAdd',
|
||||
component: () => import('/@/view/contentManage/announcements/add.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '新增',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'edit',
|
||||
name: 'AnnouncementsEdit',
|
||||
component: () => import('/@/view/contentManage/announcements/add.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '编辑',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: 'news',
|
||||
name: 'News',
|
||||
meta: { title: '新闻管理', hideChildren: true },
|
||||
component: Base,
|
||||
redirect: { name: 'NewsIndex' },
|
||||
children: [
|
||||
{
|
||||
path: 'index',
|
||||
name: 'NewsIndex',
|
||||
component: () => import('/@/view/contentManage/news/index.vue'),
|
||||
meta: {
|
||||
title: '通知公告管理',
|
||||
keepAlive: true,
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'detail',
|
||||
name: 'NewsDetail',
|
||||
component: () => import('/@/view/contentManage/news/detail.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '查看',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'add',
|
||||
name: 'NewsAdd',
|
||||
component: () => import('/@/view/contentManage/news/add.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '新增',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'edit',
|
||||
name: 'NewsEdit',
|
||||
component: () => import('/@/view/contentManage/news/add.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '编辑',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: 'article',
|
||||
name: 'Article',
|
||||
meta: { title: '文章管理', hideChildren: true },
|
||||
component: Base,
|
||||
redirect: { name: 'ArticleIndex' },
|
||||
children: [
|
||||
{
|
||||
path: 'index',
|
||||
name: 'ArticleIndex',
|
||||
component: () => import('/@/view/contentManage/article/index.vue'),
|
||||
meta: {
|
||||
title: '文章管理',
|
||||
keepAlive: true,
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'detail',
|
||||
name: 'ArticleDetail',
|
||||
component: () => import('/@/view/contentManage/article/detail.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '查看',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'add',
|
||||
name: 'ArticleAdd',
|
||||
component: () => import('/@/view/contentManage/article/add.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '新增',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'edit',
|
||||
name: 'ArticleEdit',
|
||||
component: () => import('/@/view/contentManage/article/add.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '编辑',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: 'audit',
|
||||
name: 'Audit',
|
||||
meta: { title: '审核管理', hideChildren: true },
|
||||
component: Base,
|
||||
redirect: { name: 'AuditIndex' },
|
||||
children: [
|
||||
{
|
||||
path: 'index',
|
||||
name: 'AuditIndex',
|
||||
component: () => import('/@/view/contentManage/audit/index.vue'),
|
||||
meta: {
|
||||
title: '审核管理',
|
||||
keepAlive: true,
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'detail',
|
||||
name: 'AuditDetail',
|
||||
component: () => import('/@/view/contentManage/audit/detail.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '查看',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'audit',
|
||||
name: 'AuditAction',
|
||||
component: () => import('/@/view/contentManage/audit/audit.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '审核',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: 'systemManage',
|
||||
name: 'SystemManage',
|
||||
meta: { title: '系统管理', icon: 'xitongguanli' },
|
||||
component: Base,
|
||||
redirect: { name: 'SystemManage' },
|
||||
children: [
|
||||
{
|
||||
path: 'bannerManage',
|
||||
name: 'BannerManage',
|
||||
meta: { title: '渠道banner管理', hideChildren: true },
|
||||
component: Base,
|
||||
redirect: { name: 'BannerManageIndex' },
|
||||
children: [
|
||||
{
|
||||
path: 'index',
|
||||
name: 'BannerManageIndex',
|
||||
component: () => import('/@/view/systemManage/bannerManage/index.vue'),
|
||||
meta: {
|
||||
title: '渠道banner管理',
|
||||
keepAlive: true,
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'detail',
|
||||
name: 'BannerManageDetail',
|
||||
component: () => import('/@/view/systemManage/bannerManage/detail.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '查看',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'detailCheck',
|
||||
name: 'BannerManageDetailCheck',
|
||||
component: () => import('/@/view/systemManage/bannerManage/detail.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '审批',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'add',
|
||||
name: 'BannerManageAdd',
|
||||
component: () => import('/@/view/systemManage/bannerManage/add.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '新增',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'edit',
|
||||
name: 'BannerManageEdit',
|
||||
component: () => import('/@/view/systemManage/bannerManage/add.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '编辑',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: 'openScreenManage',
|
||||
name: 'OpenScreenManage',
|
||||
component: Base,
|
||||
redirect: { name: 'OpenScreenManageIndex' },
|
||||
meta: { title: '开屏广告管理', hideChildren: true, type: 'menus' },
|
||||
children: [
|
||||
{
|
||||
path: 'index',
|
||||
name: 'OpenScreenManageIndex',
|
||||
component: () => import('/@/view/systemManage/openScreenManage/index.vue'),
|
||||
meta: {
|
||||
type: 'menus',
|
||||
operates: [
|
||||
{
|
||||
title: '失效',
|
||||
code: 'OpenScreenManageInvalidation',
|
||||
backApi: [
|
||||
{
|
||||
method: 'POST',
|
||||
url: '/api/objs/admin/AdvertisingMarketing/invalidationOpenScreen',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: '删除',
|
||||
code: 'OpenScreenManageRemove',
|
||||
backApi: [
|
||||
{
|
||||
method: 'POST',
|
||||
url: '/api/objs/admin/AdvertisingMarketing/deleteOpenScreen',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
title: '开屏广告管理',
|
||||
keepAlive: true,
|
||||
backApi: [
|
||||
{
|
||||
method: 'GET',
|
||||
url: '/api/objs/admin/AdvertisingMarketing/openScreenList',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'add',
|
||||
name: 'OpenScreenManageAdd',
|
||||
component: () => import('/@/view/systemManage/openScreenManage/add.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '新增',
|
||||
backApi: [
|
||||
{
|
||||
method: 'POST',
|
||||
url: '/api/objs/admin/AdvertisingMarketing/releasePoppup',
|
||||
},
|
||||
{
|
||||
method: 'POST',
|
||||
url: '/api/objs/admin/AdvertisingMarketing/savePoppup',
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
url: '/api/objs/admin/AdvertisingMarketing/popupDetail',
|
||||
},
|
||||
{
|
||||
method: 'POST',
|
||||
url: '/api/objs/admin/FileUpload',
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
url: '/api/objs/admin/ParkPic',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'edit',
|
||||
name: 'OpenScreenManageEdit',
|
||||
component: () => import('/@/view/systemManage/openScreenManage/add.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '编辑',
|
||||
backApi: [
|
||||
{
|
||||
method: 'POST',
|
||||
url: '/api/objs/admin/AdvertisingMarketing/releasePoppup',
|
||||
},
|
||||
{
|
||||
method: 'POST',
|
||||
url: '/api/objs/admin/AdvertisingMarketing/savePoppup',
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
url: '/api/objs/admin/AdvertisingMarketing/popupDetail',
|
||||
},
|
||||
{
|
||||
method: 'POST',
|
||||
url: '/api/objs/admin/FileUpload',
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
url: '/api/objs/admin/ParkPic',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'detail',
|
||||
name: 'OpenScreenManageDetail',
|
||||
component: () => import('/@/view/systemManage/openScreenManage/detail.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '查看',
|
||||
backApi: [
|
||||
{
|
||||
method: 'GET',
|
||||
url: '/api/objs/admin/AdvertisingMarketing/popupDetail',
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
url: '/api/objs/admin/ParkPic',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'detailCheck',
|
||||
name: 'OpenScreenManageDetailCheck',
|
||||
component: () => import('/@/view/systemManage/openScreenManage/detail.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '审核',
|
||||
backApi: [
|
||||
{
|
||||
method: 'GET',
|
||||
url: '/api/objs/admin/AdvertisingMarketing/popupDetail',
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
url: '/api/objs/admin/ParkPic',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: 'appVersionManage',
|
||||
name: 'AppVersionManage',
|
||||
meta: { title: 'APP版本管理', hideChildren: true },
|
||||
component: Base,
|
||||
redirect: { name: 'AppVersionManageIndex' },
|
||||
children: [
|
||||
{
|
||||
path: 'index',
|
||||
name: 'AppVersionManageIndex',
|
||||
component: () => import('/@/view/systemManage/appVersionManage/index.vue'),
|
||||
meta: {
|
||||
title: 'APP版本管理',
|
||||
keepAlive: true,
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'detail',
|
||||
name: 'AppVersionManageDetail',
|
||||
component: () => import('/@/view/systemManage/appVersionManage/detail.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '查看',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'add',
|
||||
name: 'AppVersionManageAdd',
|
||||
component: () => import('/@/view/systemManage/appVersionManage/add.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '新增',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'edit',
|
||||
name: 'AppVersionManageEdit',
|
||||
component: () => import('/@/view/systemManage/appVersionManage/add.vue'),
|
||||
meta: {
|
||||
type: 'op',
|
||||
title: '编辑',
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: 'logManage',
|
||||
name: 'LogManage',
|
||||
meta: { title: '日志管理', hideChildren: true },
|
||||
component: Base,
|
||||
redirect: { name: 'LogManageIndex' },
|
||||
children: [
|
||||
{
|
||||
path: 'index',
|
||||
name: 'LogManageIndex',
|
||||
component: () => import('/@/view/systemManage/logManage/index.vue'),
|
||||
meta: {
|
||||
title: '日志管理',
|
||||
keepAlive: true,
|
||||
backApi: [],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
function removeByName(name: string) {
|
||||
const index = contentManage.children[1].children.reduce((pre, item, index) => {
|
||||
if (item.name == name) pre = index;
|
||||
return pre;
|
||||
}, 0);
|
||||
contentManage.children[1].children.splice(index, 1);
|
||||
}
|
||||
if (Cookies.get('type') == 'pc') {
|
||||
removeByName('AppVersionManage');
|
||||
}
|
||||
if (Cookies.get('type') != 'mobile') {
|
||||
removeByName('OpenScreenManage');
|
||||
}
|
||||
export default contentManage;
|
||||
@@ -1,11 +0,0 @@
|
||||
/** @format */
|
||||
|
||||
// const RootRoute = {
|
||||
// path: '/',
|
||||
// name: 'root',
|
||||
// redirect: { name: 'AnnouncementsIndex' },
|
||||
// meta: {
|
||||
// title: 'Root',
|
||||
// },
|
||||
// };
|
||||
// export default RootRoute;
|
||||
@@ -1,8 +0,0 @@
|
||||
/** @format */
|
||||
|
||||
const RootRoute = {
|
||||
path: '/root',
|
||||
name: 'root',
|
||||
redirect: { name: 'AnnouncementsIndex' },
|
||||
};
|
||||
export default RootRoute;
|
||||
@@ -1,12 +0,0 @@
|
||||
import { defineStore } from 'pinia';
|
||||
|
||||
export const items = defineStore({
|
||||
id: 'items',
|
||||
state() {
|
||||
return { list: [], count: 10 };
|
||||
},
|
||||
getters: {
|
||||
double: (state: any) => state.count * 2,
|
||||
},
|
||||
actions: {},
|
||||
});
|
||||
@@ -1,53 +0,0 @@
|
||||
@font-face {
|
||||
font-family: 'QuartzMS';
|
||||
src: url('/asset/font/QuartzMS.TTF') format('truetype');
|
||||
}
|
||||
|
||||
//侧边导航
|
||||
.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected {
|
||||
background: #e5f7f9 !important;
|
||||
}
|
||||
|
||||
.ant-menu.ant-menu-dark .ant-menu-item-selected {
|
||||
color: #fff;
|
||||
background: rgba(45, 120, 238, 1) !important;
|
||||
}
|
||||
|
||||
.ant-menu-dark.ant-menu-horizontal>.ant-menu-item:hover {
|
||||
background-color: rgba(45, 120, 238, 1) !important;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.ant-menu-inline .ant-menu-item,
|
||||
.ant-menu-inline .ant-menu-submenu-title {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.ns-basic-table .ant-btn:hover {
|
||||
border-color: transparent !important;
|
||||
}
|
||||
|
||||
.ns-basic-table .ant-btn-link:hover {
|
||||
background: none !important;
|
||||
}
|
||||
|
||||
// .ns-detail {
|
||||
// padding: 0px 24px 10px 24px !important;
|
||||
// }
|
||||
|
||||
.ant-tabs-nav-wrap {
|
||||
padding: 0 24px; // 列表tab边距
|
||||
}
|
||||
|
||||
.ant-tabs-nav {
|
||||
margin: 0 !important; // 列表tab下边距
|
||||
}
|
||||
|
||||
.ant-input-number {
|
||||
width: 100%; //inputNumber组件宽度
|
||||
}
|
||||
|
||||
// 富文本组件层级
|
||||
.ns-richText-ZIndex {
|
||||
z-index: 1;
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
@import "variable";
|
||||
@import "global";
|
||||
@@ -1,42 +0,0 @@
|
||||
// @import "./global-antd.less";
|
||||
|
||||
@primary-color: rgba(45, 120, 238, 1); // 全局主色
|
||||
// @link-color: #43BB79; // 链接色
|
||||
@layout-header-hover: rgba(45, 120, 238, .7); //hover
|
||||
// @text-color: #323232; // 主文本色
|
||||
|
||||
|
||||
@layout-header-background: rgba(45, 120, 238, 1); // 头部背景色
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//btn
|
||||
// @btn-height-base: 30px;
|
||||
// @btn-height-lg: 30px;
|
||||
// @btn-disable-bg: #dfe3e9; //禁用按钮background
|
||||
// @btn-disable-border: 1px solid #ced0da;
|
||||
|
||||
// @btn-link-hover-bg: #37ABC4;
|
||||
// @btn-text-hover-bg: #46ebdb;
|
||||
|
||||
|
||||
// //input
|
||||
// @input-height-base: 30px;
|
||||
|
||||
|
||||
// //form
|
||||
// @label-color: #52616f; //form-lable颜色
|
||||
|
||||
|
||||
// @form-item-margin-bottom: 16px;
|
||||
|
||||
// //menu
|
||||
|
||||
|
||||
//spin
|
||||
|
||||
|
||||
// @border-width-base: 1px;
|
||||
// @border-style-base: solid;
|
||||
@@ -1,65 +0,0 @@
|
||||
// $primary-color: #37ABC4; // 全局主色
|
||||
// $link-color: #37ABC4; // 链接色
|
||||
// $success-color: #17BE6B; // 成功色
|
||||
// $warning-color: #FF9901; // 警告色
|
||||
// $error-color: #FF1744; // 错误色
|
||||
// $font-size-base: 14px; // 主字号
|
||||
// $font-size-lg:14px;
|
||||
// $font-size-lg:14px;
|
||||
// $heading-font-size-lg:16px;//标题字号
|
||||
// $heading-font-weight:600;//标题加粗
|
||||
// $font-line-height:22px;//文字行高
|
||||
// $heading-font-line-height:24px;//标题文字行高
|
||||
// $heading-color: rgba(0, 0, 0, 0.85); // 标题色
|
||||
// $text-color: #323232; // 主文本色
|
||||
// $text-color-secondary: rgba(0, 0, 0, 0.45); // 次文本色
|
||||
// $disabled-color: #BFBFBF; // 失效色
|
||||
// $border-radius-base: 2px; // 组件/浮层圆角
|
||||
// $border-color-base: #dcdfe2; // 边框色
|
||||
// $box-shadow-base: 0 2px 8px rgba(0, 0, 0, 0.15); // 浮层阴影
|
||||
// $layout-body-background: #f0f2f5; //框架背景色
|
||||
// $layout-header-background:#37ABC4; // 头部背景色
|
||||
|
||||
// $layout-sider-width:208px; //侧边导航宽度
|
||||
// $layout-sider-arrow-color:#808d96;//侧边导航箭头颜色
|
||||
// $border-style-base:solid;
|
||||
// $layout-header-height:48px;//头部高度
|
||||
// $line-height-base:22px;
|
||||
|
||||
// //btn
|
||||
// $btn-height-base:30px;
|
||||
// $btn-height-lg: 30px;
|
||||
// $btn-disable-color: #9b9b9b;//禁用按钮color
|
||||
// $btn-disable-bg: #dfe3e9;//禁用按钮background
|
||||
// $btn-disable-border: 1px solid #ced0da;
|
||||
// $btn-border-radius-base: $border-radius-base;//圆角边框
|
||||
// $btn-border-width: 1px;
|
||||
// $btn-border-style: $border-style-base;
|
||||
// $btn-link-hover-bg: #37ABC4;
|
||||
// $btn-text-hover-bg: #46ebdb;
|
||||
// $btn-font-size-lg: $font-size-lg;
|
||||
|
||||
// //input
|
||||
// $input-height-base: 30px;
|
||||
// $input-hover-focus-border-color:#a5a5b5;
|
||||
// // @input-hover-border-color: rgba(0,0,0,.85);//鼠标滑过input边框
|
||||
|
||||
// //form
|
||||
// $label-color:#52616f;
|
||||
// $form-vertical-label-padding: 0;
|
||||
// $form-vertical-label-margin: 0,0,16,0px;
|
||||
// $form-item-label-height:$input-height-base;
|
||||
// $form-item-margin-bottom: 16px;
|
||||
|
||||
// //menu
|
||||
// $menu-item-height: 48px;
|
||||
// $menu-item-active-bg: none;
|
||||
// $menu-item-boundary-margin: 0px;
|
||||
|
||||
// //spin
|
||||
// $spin-dot-size-sm: 14px;
|
||||
// $spin-dot-size: 20px;
|
||||
// $spin-dot-size-lg: 32px;
|
||||
|
||||
// $border-width-base: 1px;
|
||||
// $border-style-base: solid;
|
||||
1
nervui-mobile-application/src/types.d.ts
vendored
@@ -1 +0,0 @@
|
||||
declare module '*.vue';
|
||||
@@ -1,70 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<div ref="FCKEditor"> </div>
|
||||
</template>
|
||||
<script>
|
||||
import { defineComponent, ref, inject } from 'vue';
|
||||
import Editor from 'wangeditor';
|
||||
export default defineComponent({
|
||||
name: 'FCKEditor',
|
||||
props: {
|
||||
htmlInfo: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
emits: ['change'],
|
||||
setup() {
|
||||
const editor = ref({});
|
||||
const content = ref('');
|
||||
const components = inject('components');
|
||||
return {
|
||||
editor,
|
||||
content,
|
||||
components,
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
htmlInfo: {
|
||||
handler(val) {
|
||||
console.log(123);
|
||||
setTimeout(() => {
|
||||
this.editor.cmd.do('insertHTML', val);
|
||||
}, 10);
|
||||
},
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.initAre(this.htmlInfo);
|
||||
},
|
||||
methods: {
|
||||
initAre(val) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
||||
let that = this;
|
||||
this.editor = new Editor(this.$refs.FCKEditor);
|
||||
this.editor.config.uploadImgShowBase64 = true;
|
||||
// this.editor.config.uploadImgServer = '/api/pension/pension/objs/FileUpload'; //
|
||||
// this.editor.config.uploadFileName = 'file';
|
||||
// this.editor.config.uploadImgParams = {
|
||||
// uploadType: '1',
|
||||
// };
|
||||
this.editor.config.withCredentials = true;
|
||||
//this.editor.config.uploadImgMaxSize = 5 * 1024 * 1024; //限制图片大小 2M
|
||||
this.editor.config.onchange = function (html) {
|
||||
// 第二步,监控变化,同步更新到 textarea
|
||||
console.log(Object.prototype.toString.call(html));
|
||||
that.$emit('change', html);
|
||||
};
|
||||
this.editor.create();
|
||||
if (val) {
|
||||
this.editor.cmd.do('insertHTML', val);
|
||||
}
|
||||
},
|
||||
getInfo() {
|
||||
console.log(this.editor.txt.html());
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped></style>
|
||||
@@ -1,153 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<ns-view-add-form
|
||||
ref="nsAddFormRef"
|
||||
:schemas="formSchema"
|
||||
:model="data"
|
||||
:title="uuid ? '编辑公告' : '新增公告'"
|
||||
:headActions="headActions"
|
||||
:api="formApi" />
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref, provide, computed } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import FCKEditor from '/@/view/components/FCKEditor.vue';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'AnnouncementsAdd',
|
||||
setup() {
|
||||
const router = useRouter();
|
||||
const { uuid } = router.currentRoute.value.query;
|
||||
const nsAddFormRef = ref();
|
||||
const htmlInfo = ref('');
|
||||
const formApi = ref(
|
||||
uuid
|
||||
? '/api/content/objs/admin/cms/bg/article/update'
|
||||
: '/api/content/objs/admin/cms/bg/article/add',
|
||||
);
|
||||
const data = ref({
|
||||
articleCommonHandleForm: { folderCode: 'mobileNoticeManager', content: '', title: '' },
|
||||
});
|
||||
provide('components', () => {
|
||||
return { FCKEditor };
|
||||
});
|
||||
if (uuid) {
|
||||
http.get('/api/content/objs/admin/cms/bg/article/detail', { uuid }).then((res) => {
|
||||
console.log(res);
|
||||
data.value = res.data.articleCommonVO;
|
||||
data.value.articleCommonHandleForm = {
|
||||
folderCode: 'mobileNoticeManager',
|
||||
folderName: '通知公告',
|
||||
sort: 0,
|
||||
title: res.data.articleCommonVO.title,
|
||||
content: res.data.articleCommonVO.content,
|
||||
};
|
||||
data.value.folderCode = 'mobileNoticeManager';
|
||||
|
||||
// 编辑->未上架
|
||||
data.value.isPublish = 0;
|
||||
htmlInfo.value = res.data.articleCommonVO.content || '';
|
||||
});
|
||||
}
|
||||
const dataHandle = (data) => {
|
||||
const newData = data;
|
||||
newData['articleCommonHandleForm'] = data;
|
||||
return newData;
|
||||
};
|
||||
const validateResult = computed(() => {
|
||||
return !nsAddFormRef.value?.validateResult;
|
||||
});
|
||||
const headActions = ref({
|
||||
actions: [
|
||||
{
|
||||
label: '发布',
|
||||
name: 'AnnouncementsDetail',
|
||||
dynamicDisabled: validateResult,
|
||||
handle: (record, name) => {
|
||||
// formApi.value = uuid
|
||||
// ? '/api/content/objs/admin/cms/bg/article/publish'
|
||||
// : '/api/content/objs/admin/cms/bg/article/add';
|
||||
data.value.isPublish = 1;
|
||||
nsAddFormRef.value?.submit();
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const formSchema = ref([
|
||||
{
|
||||
field: 'folderCode',
|
||||
defaultValue: 'mobileNoticeManager',
|
||||
},
|
||||
{
|
||||
field: 'articleCommonHandleForm',
|
||||
defaultValue: { folderCode: 'mobileNoticeManager', folderName: '通知公告', sort: 0 },
|
||||
},
|
||||
{
|
||||
field: 'uuid',
|
||||
defaultValue: uuid,
|
||||
},
|
||||
{
|
||||
field: 'isPublish',
|
||||
defaultValue: 0,
|
||||
},
|
||||
{
|
||||
field: 'title',
|
||||
label: '公告主题',
|
||||
component: 'NsInput',
|
||||
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
// 禁止输入
|
||||
// disabled: true,
|
||||
onChange: (e) => {
|
||||
data.value.articleCommonHandleForm['title'] = e.target.value;
|
||||
},
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
pattern: /^((?!\\|\/|:|\*|\?|<|>|\||'|%|@|#|&|\$|\^|&|\*).){1,100}$/,
|
||||
message: '可输入1~100个字符,不能包含‘ / ; : * ?” < > ` 这些特殊符号',
|
||||
trigger: 'blur',
|
||||
},
|
||||
{
|
||||
required: true,
|
||||
message: '请输入公告主题',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'content',
|
||||
component: 'FCKEditor',
|
||||
class: 'ns-form-item-full ns-form-item-padding ns-richText-ZIndex',
|
||||
label: '公告内容',
|
||||
componentProps: {
|
||||
htmlInfo: htmlInfo,
|
||||
onChange: (a) => {
|
||||
data.value.articleCommonHandleForm['content'] = a;
|
||||
},
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '内容不能为空',
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
||||
return {
|
||||
formSchema,
|
||||
data,
|
||||
headActions,
|
||||
nsAddFormRef,
|
||||
dataHandle,
|
||||
uuid,
|
||||
formApi,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,53 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<ns-view-detail api="/api/content/objs/admin/cms/bg/article/detail" :detail="detail">
|
||||
<template #content="data">
|
||||
<span v-html="data.value"></span>
|
||||
</template>
|
||||
</ns-view-detail>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
// import customerDetail from '../monthly/components/customerDetail.vue';
|
||||
import { dateUtil } from '/nerv-lib/saas';
|
||||
export default defineComponent({
|
||||
name: 'AnnouncementsDetail',
|
||||
// components: { customerDetail },
|
||||
setup() {
|
||||
const rouer = useRouter();
|
||||
const detail = reactive([
|
||||
{
|
||||
title: '公告主题:',
|
||||
items: [
|
||||
{
|
||||
label: '',
|
||||
name: 'pushTime',
|
||||
format: (value, record) => {
|
||||
return record.articleCommonVO.title;
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: '公告内容:',
|
||||
items: [
|
||||
{
|
||||
label: '',
|
||||
type: 'html',
|
||||
name: 'content',
|
||||
style: { padding: 0 },
|
||||
format: (value, record) => {
|
||||
return record.articleCommonVO.content;
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
return { detail };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,258 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<ns-view-list-table ref="nsTableRef" v-bind="tableConfig" rowKey="uuid">
|
||||
<template #bodyCell="{ record, column, index }">
|
||||
<template v-if="column.dataIndex == 'content'">
|
||||
<a @click="modalContent(record)">点击预览</a>
|
||||
</template>
|
||||
</template>
|
||||
</ns-view-list-table>
|
||||
<ns-modal
|
||||
v-model:visible="visible"
|
||||
width="520px"
|
||||
:destroyOnClose="true"
|
||||
title="公告内容"
|
||||
:footer="null">
|
||||
<div class="detail-info" v-html="modalInfo"></div>
|
||||
</ns-modal>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, createVNode, ref } from 'vue';
|
||||
import { dateUtil } from '/nerv-lib/saas';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { Modal } from 'ant-design-vue';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
import { NsMessage } from '/nerv-lib/component/message';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'AnnouncementsIndex',
|
||||
setup() {
|
||||
const router = useRouter();
|
||||
const nsTableRef = ref();
|
||||
const modalInfo = ref('');
|
||||
const visible = ref(false);
|
||||
const request = (api: string, params: object) => {
|
||||
http.post(api, params).then(() => {
|
||||
NsMessage.success('操作成功');
|
||||
nsTableRef.value.nsTableRef.reload();
|
||||
});
|
||||
};
|
||||
const tableConfig = {
|
||||
title: '公告管理',
|
||||
api: {
|
||||
method: 'POST',
|
||||
url: '/api/content/objs/admin/cms/bg/article/pageList',
|
||||
},
|
||||
// api:'/api/web/objs/bulletin/pageList'
|
||||
formConfig: {
|
||||
schemas: [
|
||||
{
|
||||
field: 'titleLike',
|
||||
label: '公告主题',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'articleStatus',
|
||||
label: '状态',
|
||||
component: 'NsSelect',
|
||||
defaultValue: '',
|
||||
componentProps: {
|
||||
placeholder: '请选择',
|
||||
options: [
|
||||
{ label: '全部', value: '' },
|
||||
{ label: '未上架', value: 1 },
|
||||
{ label: '待审核', value: 2 },
|
||||
{ label: '已上架', value: 3 },
|
||||
{ label: '未通过', value: 6 },
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
params: {
|
||||
page: 0,
|
||||
pageSize: 10,
|
||||
folderCode: 'mobileNoticeManager',
|
||||
},
|
||||
headerActions: [
|
||||
{
|
||||
label: '新增公告',
|
||||
name: 'AnnouncementsAdd',
|
||||
type: 'primary',
|
||||
handle: ({}, name) => {
|
||||
router.push({ name, query: {} });
|
||||
},
|
||||
},
|
||||
],
|
||||
rowSelection: null,
|
||||
// transformCellText: ({ record, column }) => {
|
||||
// return record.articleCommonVO[column.dataIndex];
|
||||
// },
|
||||
columns: [
|
||||
{
|
||||
title: '公告ID',
|
||||
dataIndex: 'articleCode',
|
||||
textNumber: 7,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '公告主题',
|
||||
dataIndex: 'extraColMap',
|
||||
textNumber: 6,
|
||||
textEllipsis: true,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO['title'];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '公告内容',
|
||||
dataIndex: 'content',
|
||||
// textEllipsis: true,
|
||||
textNumber: 5,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '上架时间',
|
||||
dataIndex: 'publishTime',
|
||||
textNumber: 10,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex] || '-';
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
dataIndex: 'createTime',
|
||||
// textNumber: 9,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '创建人',
|
||||
dataIndex: 'createUserName',
|
||||
textNumber: 5,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
dataIndex: 'articleStatus',
|
||||
textNumber: 5,
|
||||
customCell: ({ articleCommonVO: { articleStatus } }) => {
|
||||
return {
|
||||
style: { color: articleStatus == 3 ? 'green' : articleStatus == 6 ? 'red' : '' },
|
||||
};
|
||||
},
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return ['', '未上架', '待审核', '已上架', '', '', '未通过'][
|
||||
articleCommonVO[column.dataIndex]
|
||||
];
|
||||
},
|
||||
},
|
||||
],
|
||||
columnActions: {
|
||||
title: '操作',
|
||||
// width: 100,
|
||||
autoMergeAction: false,
|
||||
actionNumber: 2,
|
||||
actions: [
|
||||
{
|
||||
label: '查看',
|
||||
name: 'AnnouncementsDetail',
|
||||
ifShow: ({ articleCommonVO: { articleStatus } }) => [2, 3].includes(articleStatus),
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
router.push({ name, query: { uuid } });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '编辑',
|
||||
name: 'AnnouncementsEdit',
|
||||
ifShow: ({ articleCommonVO: { articleStatus } }) => [1, 6].includes(articleStatus),
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
router.push({ name, query: { uuid } });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '下架',
|
||||
name: 'AnnouncementsReaded',
|
||||
confirm: true,
|
||||
ifShow: ({ articleCommonVO: { articleStatus } }) => [3].includes(articleStatus),
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
request('/api/content/objs/admin/cms/bg/article/withdrawn', { uuid });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '删除',
|
||||
name: 'AnnouncementsDelete',
|
||||
confirm: true,
|
||||
ifShow: ({ articleCommonVO: { articleStatus } }) => [1, 6].includes(articleStatus),
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
request('/api/content/objs/admin/cms/bg/article/batchDel', { uuids: [uuid] });
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
const modalContent = (record) => {
|
||||
http
|
||||
.get('/api/content/objs/admin/cms/bg/article/detail', {
|
||||
uuid: record.articleCommonVO.uuid,
|
||||
})
|
||||
.then((res) => {
|
||||
modalInfo.value = res.data.articleCommonVO.content;
|
||||
visible.value = true;
|
||||
});
|
||||
};
|
||||
return {
|
||||
tableConfig,
|
||||
modalContent,
|
||||
nsTableRef,
|
||||
visible,
|
||||
modalInfo,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
.detail-info {
|
||||
:deep(table) {
|
||||
border-top: 1px solid #ffffff;
|
||||
border-left: 1px solid #ffffff;
|
||||
:deep(p) {
|
||||
font-size: 12px;
|
||||
color: #898e91;
|
||||
}
|
||||
}
|
||||
:deep(th) {
|
||||
border-right: 1px solid #ffffff;
|
||||
font-size: 13px;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
font-weight: normal;
|
||||
background: #eff0f2;
|
||||
}
|
||||
:deep(td) {
|
||||
border-top: 1px solid #ffffff;
|
||||
border-right: 1px solid #ffffff;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
font-size: 12px;
|
||||
color: #606060;
|
||||
text-align: center;
|
||||
:deep(text) {
|
||||
border-bottom: 1px solid #ffffff;
|
||||
}
|
||||
background: rgba(240, 242, 245, 0.5);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,271 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<ns-view-add-form
|
||||
ref="nsAddFormRef"
|
||||
:schemas="formSchema"
|
||||
:model="data"
|
||||
:title="uuid ? '编辑文章' : '新增文章'"
|
||||
:dataHandle="dataHandle"
|
||||
:headActions="headActions"
|
||||
:api="formApi" />
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref, provide, computed } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import FCKEditor from '/@/view/components/FCKEditor.vue';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'NewsAdd',
|
||||
setup() {
|
||||
provide('components', () => {
|
||||
return { FCKEditor };
|
||||
});
|
||||
const router = useRouter();
|
||||
const { uuid } = router.currentRoute.value.query;
|
||||
const nsAddFormRef = ref();
|
||||
const htmlInfo = ref('');
|
||||
const imageNetUrl = ref('');
|
||||
let uuidList = ref<any>([]);
|
||||
const formApi = ref(
|
||||
uuid
|
||||
? '/api/content/objs/admin/cms/bg/article/update'
|
||||
: '/api/content/objs/admin/cms/bg/article/add',
|
||||
);
|
||||
|
||||
const data = ref({
|
||||
articleCommonHandleForm: { folderCode: 'mobileArticleManager', content: '', title: '' },
|
||||
});
|
||||
|
||||
if (uuid) {
|
||||
http.get('/api/content/objs/admin/cms/bg/article/detail', { uuid }).then((res) => {
|
||||
console.log(res);
|
||||
data.value = res.data.articleCommonVO;
|
||||
data.value.tagUuidList = res.data.tagNameList;
|
||||
uuidList.value = res.data.tagUuidList;
|
||||
data.value.articleCommonHandleForm = {
|
||||
folderCode: 'mobileArticleManager',
|
||||
folderName: '文章',
|
||||
sort: 0,
|
||||
title: res.data.articleCommonVO.title,
|
||||
content: res.data.articleCommonVO.content,
|
||||
articleSource: res.data.articleCommonVO.articleSource,
|
||||
imageNetUrl: res.data.articleCommonVO.imageNetUrl,
|
||||
};
|
||||
data.value.folderCode = 'mobileArticleManager';
|
||||
// 编辑->未上架
|
||||
data.value.isPublish = 0;
|
||||
imageNetUrl.value = res.data.articleCommonVO.imageNetUrl;
|
||||
htmlInfo.value = res.data.articleCommonVO.content || '';
|
||||
});
|
||||
}
|
||||
|
||||
const getTagUuid = async (list = []) => {
|
||||
const res = await http.get('/api/content/objs/admin/cms/bg/articleTag/allList', {
|
||||
folderCode: 'mobileArticleManager',
|
||||
});
|
||||
console.log(res);
|
||||
|
||||
const arr = [];
|
||||
list?.map((cur) => {
|
||||
res.data.some((item) => {
|
||||
if (item.tagName == cur) {
|
||||
arr.push(item.uuid);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
});
|
||||
uuidList.value = arr;
|
||||
};
|
||||
const addTag = (tagName, tagNameList) => {
|
||||
http
|
||||
.post('/api/content/objs/admin/cms/bg/articleTag/add', {
|
||||
folderCode: 'mobileArticleManager',
|
||||
tagName,
|
||||
})
|
||||
.then(() => {
|
||||
getTagUuid(tagNameList);
|
||||
});
|
||||
};
|
||||
const dataHandle = (data) => {
|
||||
const newData = JSON.parse(JSON.stringify(data));
|
||||
newData['articleCommonHandleForm'] = Object.assign(
|
||||
newData['articleCommonHandleForm'],
|
||||
data,
|
||||
);
|
||||
newData['tagUuidList'] = uuidList.value;
|
||||
return newData;
|
||||
};
|
||||
const validateResult = computed(() => {
|
||||
return !nsAddFormRef.value?.validateResult;
|
||||
});
|
||||
const headActions = ref({
|
||||
actions: [
|
||||
{
|
||||
label: '发布',
|
||||
name: 'NewsDetail',
|
||||
dynamicDisabled: validateResult,
|
||||
handle: (record, name) => {
|
||||
// formApi.value = uuid
|
||||
// ? '/api/content/objs/admin/cms/bg/article/publish'
|
||||
// : '/api/content/objs/admin/cms/bg/article/add';
|
||||
data.value.isPublish = 1;
|
||||
nsAddFormRef.value?.submit();
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const formSchema = ref([
|
||||
{
|
||||
field: 'folderCode',
|
||||
defaultValue: 'mobileArticleManager',
|
||||
},
|
||||
{
|
||||
field: 'articleCommonHandleForm',
|
||||
defaultValue: { folderCode: 'mobileArticleManager', folderName: '文章', sort: 0 },
|
||||
},
|
||||
{
|
||||
field: 'uuid',
|
||||
defaultValue: uuid,
|
||||
},
|
||||
{
|
||||
field: 'isPublish',
|
||||
defaultValue: 0,
|
||||
},
|
||||
{
|
||||
field: 'title',
|
||||
label: '文章标题',
|
||||
component: 'NsInput',
|
||||
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
// 禁止输入
|
||||
// disabled: true,
|
||||
// onChange: (e) => {
|
||||
// data.value.articleCommonHandleForm['title'] = e.target.value;
|
||||
// },
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入文章标题',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'articleSource',
|
||||
label: '消息来源',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
// onChange: (e) => {
|
||||
// data.value.articleCommonHandleForm['articleSource'] = e.target.value;
|
||||
// },
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入消息来源',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'tagUuidList',
|
||||
label: '文章标签',
|
||||
component: 'nsSelectApi',
|
||||
componentProps: {
|
||||
mode: 'tags',
|
||||
api: '/api/content/objs/admin/cms/bg/articleTag/allList',
|
||||
params: { folderCode: 'mobileArticleManager' },
|
||||
autoSelectFirst: false,
|
||||
resultField: 'data',
|
||||
labelField: 'tagName',
|
||||
valueField: 'tagName',
|
||||
immediate: true,
|
||||
dropdownReload: true,
|
||||
placeholder: '请选择',
|
||||
filterOption: (input, option) => {
|
||||
return option.tagName?.indexOf(input) >= 0;
|
||||
},
|
||||
// onChange: (a, b) => {
|
||||
// console.log(a, b, 'onchange');
|
||||
// // getTagUuid(a);
|
||||
// },
|
||||
onSelect: (a, b) => {
|
||||
if (JSON.stringify(b) == '{}') {
|
||||
addTag(a, data.value.tagUuidList);
|
||||
// console.log(data.value);
|
||||
} else {
|
||||
getTagUuid(data.value.tagUuidList);
|
||||
}
|
||||
console.log(a, JSON.stringify(b), 'onselect');
|
||||
},
|
||||
},
|
||||
// rules: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: '请选择',
|
||||
// type: 'array',
|
||||
// },
|
||||
// ],
|
||||
},
|
||||
|
||||
{
|
||||
field: 'imageNetUrl',
|
||||
component: 'NsUpload',
|
||||
label: '文章图片',
|
||||
componentProps: {
|
||||
// 上传的地址
|
||||
url: '/api/fileunify/objs/admin/MaterialFile',
|
||||
// 上传的图片大小
|
||||
maxSize: 5242880,
|
||||
// 上传的图片类型
|
||||
fileType: ['jpg', 'png', 'jpeg'],
|
||||
// 展示图片数量
|
||||
count: 1,
|
||||
// 上传的文件类型,0-证书,1-图片,2-身份证件
|
||||
uploadType: 1,
|
||||
params: {
|
||||
groupCode: 'mobile_img',
|
||||
},
|
||||
baseImageUrl: imageNetUrl,
|
||||
// onChange: (e) => {
|
||||
// data.value.articleCommonHandleForm['imageNetUrl'] = e;
|
||||
// },
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'content',
|
||||
component: 'FCKEditor',
|
||||
class: 'ns-form-item-full ns-form-item-padding ns-richText-ZIndex',
|
||||
label: '文章内容',
|
||||
componentProps: {
|
||||
htmlInfo: htmlInfo,
|
||||
// onChange: (a) => {
|
||||
// data.value.articleCommonHandleForm['content'] = a;
|
||||
// },
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '内容不能为空',
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
||||
return {
|
||||
formSchema,
|
||||
data,
|
||||
headActions,
|
||||
nsAddFormRef,
|
||||
dataHandle,
|
||||
uuid,
|
||||
formApi,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,70 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<ns-view-detail api="/api/content/objs/admin/cms/bg/article/detail" :detail="detail">
|
||||
<template #content="data">
|
||||
<span v-html="data.value"></span>
|
||||
</template>
|
||||
</ns-view-detail>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { dateUtil } from '/nerv-lib/saas';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'ArticleDetail',
|
||||
setup() {
|
||||
const rouer = useRouter();
|
||||
const dataHandle = ({ articleCommonVO }) => {
|
||||
return articleCommonVO;
|
||||
};
|
||||
const detail = reactive([
|
||||
{
|
||||
title: '基本信息',
|
||||
items: [
|
||||
{
|
||||
label: '新闻标题',
|
||||
name: 'title',
|
||||
format: (value, { articleCommonVO: { title } }) => title,
|
||||
},
|
||||
{
|
||||
label: '消息来源',
|
||||
name: 'articleSource',
|
||||
format: (value, { articleCommonVO: { articleSource } }) => articleSource,
|
||||
},
|
||||
{
|
||||
label: '文章标签',
|
||||
name: 'tagNameList',
|
||||
format: (value) => {
|
||||
return value && value.join(',');
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '新闻图片',
|
||||
name: 'imageNetUrl',
|
||||
type: 'image',
|
||||
format: (value, { articleCommonVO: { imageNetUrl } }) => imageNetUrl,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: '新闻内容:',
|
||||
items: [
|
||||
{
|
||||
label: '',
|
||||
type: 'html',
|
||||
name: 'content',
|
||||
style: { padding: 0 },
|
||||
format: (value, { articleCommonVO: { content } }) => content,
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
return { detail, dataHandle };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,251 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<ns-view-list-table ref="nsTableRef" v-bind="tableConfig" rowKey="uuid" />
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref } from 'vue';
|
||||
import { dateUtil } from '/nerv-lib/saas';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
import { NsMessage } from '/nerv-lib/component/message';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'ArticleIndex',
|
||||
setup() {
|
||||
const router = useRouter();
|
||||
const nsTableRef = ref();
|
||||
|
||||
const request = (api: string, params: object) => {
|
||||
http.post(api, params).then(() => {
|
||||
NsMessage.success('操作成功');
|
||||
nsTableRef.value.nsTableRef.reload();
|
||||
});
|
||||
};
|
||||
const tableConfig = {
|
||||
title: '文章管理',
|
||||
api: {
|
||||
method: 'POST',
|
||||
url: '/api/content/objs/admin/cms/bg/article/pageList',
|
||||
},
|
||||
params: {
|
||||
page: 0,
|
||||
pageSize: 10,
|
||||
folderCode: 'mobileArticleManager',
|
||||
},
|
||||
formConfig: {
|
||||
schemas: [
|
||||
{
|
||||
field: 'titleLike',
|
||||
label: '文章标题',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'articleStatus',
|
||||
label: '状态',
|
||||
component: 'NsSelect',
|
||||
defaultValue: '',
|
||||
componentProps: {
|
||||
placeholder: '请选择',
|
||||
options: [
|
||||
{ label: '全部', value: '' },
|
||||
{ label: '未上架', value: 1 },
|
||||
{ label: '审核中', value: 2 },
|
||||
{ label: '已上架', value: 3 },
|
||||
{ label: '未通过', value: 6 },
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'tagUuidList',
|
||||
label: '文章标签',
|
||||
component: 'nsSelectApi',
|
||||
componentProps: {
|
||||
params: { folderCode: 'mobileArticleManager' },
|
||||
mode: 'multiple',
|
||||
api: '/api/content/objs/admin/cms/bg/articleTag/allList',
|
||||
autoSelectFirst: false,
|
||||
resultField: 'data',
|
||||
labelField: 'tagName',
|
||||
valueField: 'uuid',
|
||||
immediate: true,
|
||||
placeholder: '请选择',
|
||||
showSearch: true,
|
||||
filterOption: (input, option) => {
|
||||
return option.tagName.indexOf(input) >= 0;
|
||||
},
|
||||
dropdownReload: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
headerActions: [
|
||||
{
|
||||
label: '新增文章',
|
||||
name: 'ArticleAdd',
|
||||
type: 'primary',
|
||||
handle: ({}, name) => {
|
||||
router.push({ name, query: {} });
|
||||
},
|
||||
},
|
||||
],
|
||||
rowSelection: null,
|
||||
columns: [
|
||||
{
|
||||
title: '文章ID',
|
||||
dataIndex: 'articleCode',
|
||||
textNumber: 5,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '文章标题',
|
||||
dataIndex: 'title',
|
||||
textNumber: 5,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '文章标签',
|
||||
dataIndex: 'tagNameList',
|
||||
textNumber: 5,
|
||||
textEllipsis: true,
|
||||
customRender: ({ record: { tagNameList }, column }) => {
|
||||
return (tagNameList && tagNameList.join(',')) || '-';
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '信息来源',
|
||||
dataIndex: 'articleSource',
|
||||
textNumber: 5,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '上架时间',
|
||||
dataIndex: 'publishTime',
|
||||
textNumber: 10,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex] || '-';
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
dataIndex: 'articleStatus',
|
||||
textNumber: 5,
|
||||
customCell: ({ articleCommonVO: { articleStatus } }) => {
|
||||
return {
|
||||
style: { color: articleStatus == 3 ? 'green' : articleStatus == 6 ? 'red' : '' },
|
||||
};
|
||||
},
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return ['', '未上架', '待审核', '已上架', '', '', '未通过'][
|
||||
articleCommonVO[column.dataIndex]
|
||||
];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '是否置顶',
|
||||
textNumber: 4,
|
||||
dataIndex: 'isTop',
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return ['否', '是'][articleCommonVO[column.dataIndex]];
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: '创建人',
|
||||
dataIndex: 'createUserName',
|
||||
textNumber: 5,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
dataIndex: 'createTime',
|
||||
// textNumber: 9,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
],
|
||||
columnActions: {
|
||||
title: '操作',
|
||||
autoMergeAction: false,
|
||||
actionNumber: 3,
|
||||
actions: [
|
||||
{
|
||||
label: '查看',
|
||||
name: 'ArticleDetail',
|
||||
ifShow: ({ articleCommonVO: { articleStatus } }) => [2, 3].includes(articleStatus),
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
router.push({ name, query: { uuid } });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '编辑',
|
||||
name: 'ArticleEdit',
|
||||
ifShow: ({ articleCommonVO: { articleStatus } }) => [1, 6].includes(articleStatus),
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
router.push({ name, query: { uuid } });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '置顶',
|
||||
name: 'ArticleManageTop',
|
||||
confirm: true,
|
||||
ifShow: ({ articleCommonVO: { articleStatus, isTop } }) =>
|
||||
articleStatus == 3 && isTop == 0,
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
request('/api/content/objs/admin/cms/bg/article/top', { uuid });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '取消置顶',
|
||||
name: 'ArticleManageCancleTop',
|
||||
confirm: true,
|
||||
ifShow: ({ articleCommonVO: { articleStatus, isTop } }) =>
|
||||
articleStatus == 3 && isTop == 1,
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
request('/api/content/objs/admin/cms/bg/article/top', { uuid });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '删除',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'ArticleManageDelete',
|
||||
confirm: true,
|
||||
ifShow: ({ articleCommonVO: { articleStatus } }) => [1, 6].includes(articleStatus),
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
request('/api/content/objs/admin/cms/bg/article/batchDel', { uuids: [uuid] });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '下架',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'ArticleManageReaded',
|
||||
confirm: true,
|
||||
ifShow: ({ articleCommonVO: { articleStatus } }) => [3].includes(articleStatus),
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
request('/api/content/objs/admin/cms/bg/article/withdrawn', { uuid });
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
return {
|
||||
tableConfig,
|
||||
nsTableRef,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped></style>
|
||||
@@ -1,162 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<ns-view-add-form
|
||||
ref="nsAddFormRef"
|
||||
:schemas="formSchema"
|
||||
:model="data"
|
||||
title="审核"
|
||||
:api="'/api/content/objs/admin/articleExamineRecord/update'" />
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref, provide, computed } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import FCKEditor from '/@/view/components/FCKEditor.vue';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
import { dateUtil } from '/nerv-lib/saas';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'AnnouncementsAdd',
|
||||
setup() {
|
||||
const router = useRouter();
|
||||
const { uuid } = router.currentRoute.value.query;
|
||||
const nsAddFormRef = ref();
|
||||
const data = ref({});
|
||||
provide('components', () => {
|
||||
return { FCKEditor };
|
||||
});
|
||||
if (uuid) {
|
||||
http.get('/api/content/objs/admin/articleExamineRecord/detail', { uuid }).then((res) => {
|
||||
data.value = res.data;
|
||||
data.value.createTime =
|
||||
res.data?.createTime && dateUtil(res.data.createTime).format('YYYY-MM-DD HH:mm:ss');
|
||||
});
|
||||
}
|
||||
const validateResult = computed(() => {
|
||||
return !nsAddFormRef.value?.validateResult;
|
||||
});
|
||||
const headActions = ref({
|
||||
actions: [
|
||||
{
|
||||
label: '发布',
|
||||
name: 'AnnouncementsDetail',
|
||||
dynamicDisabled: validateResult,
|
||||
handle: (record, name) => {
|
||||
nsAddFormRef.value?.submit();
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const formSchema = reactive([
|
||||
{
|
||||
field: 'uuid',
|
||||
defaultValue: uuid,
|
||||
},
|
||||
{
|
||||
field: 'field111',
|
||||
label: '',
|
||||
displayFormItem: false,
|
||||
class: 'ns-form-item-full',
|
||||
component: 'NsChildForm',
|
||||
componentProps: {
|
||||
title: '审核内容',
|
||||
schemas: [
|
||||
{
|
||||
field: 'folderName',
|
||||
label: '内容类型',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
disabled: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'articleTitle',
|
||||
label: '内容名称',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
disabled: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'createTime',
|
||||
label: '提交时间',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
disabled: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'createUserName',
|
||||
label: '提交人',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
disabled: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'field111',
|
||||
label: '',
|
||||
displayFormItem: false,
|
||||
class: 'ns-form-item-full',
|
||||
component: 'NsChildForm',
|
||||
componentProps: {
|
||||
title: '审核信息',
|
||||
schemas: [
|
||||
{
|
||||
field: 'examStatus',
|
||||
component: 'NsRadioGroup',
|
||||
label: '审核结果',
|
||||
defaultValue: 1,
|
||||
componentProps: {
|
||||
radioType: 'radio',
|
||||
options: [
|
||||
{
|
||||
label: '通过',
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
label: '不通过',
|
||||
value: 2,
|
||||
},
|
||||
],
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择',
|
||||
type: 'number',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'examRemark',
|
||||
label: '审批说明',
|
||||
component: 'NsTextarea',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
return {
|
||||
formSchema,
|
||||
data,
|
||||
headActions,
|
||||
nsAddFormRef,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,85 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<ns-view-detail
|
||||
:title="bulletinTopic"
|
||||
api="/api/content/objs/admin/articleExamineRecord/detail"
|
||||
:detail="detail">
|
||||
<template #content="data">
|
||||
<span v-html="data.value"></span>
|
||||
</template>
|
||||
</ns-view-detail>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { dateUtil } from '/nerv-lib/saas';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'MonthlyCarDetail',
|
||||
setup() {
|
||||
const rouer = useRouter();
|
||||
const { bulletinTopic } = rouer.currentRoute.value.query;
|
||||
const detail = reactive([
|
||||
{
|
||||
title: '审核内容',
|
||||
items: [
|
||||
{
|
||||
label: '内容类型',
|
||||
name: 'folderName',
|
||||
},
|
||||
{
|
||||
label: '内容名称',
|
||||
name: 'articleTitle',
|
||||
},
|
||||
{
|
||||
label: '内容ID',
|
||||
name: 'articleCode',
|
||||
},
|
||||
{
|
||||
label: '提交人',
|
||||
name: 'createUserName',
|
||||
},
|
||||
{
|
||||
label: '提交时间',
|
||||
name: 'createTime',
|
||||
format: (val) => {
|
||||
return val && dateUtil(val).format('YYYY-MM-DD HH:mm:ss');
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: '审核信息',
|
||||
items: [
|
||||
{
|
||||
label: '审批结果',
|
||||
name: 'examResult',
|
||||
format: (val) => {
|
||||
return ['', '通过', '不通过'][val];
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '审批人',
|
||||
name: 'examUserName',
|
||||
},
|
||||
{
|
||||
label: '审批时间',
|
||||
name: 'examTime',
|
||||
format: (val) => {
|
||||
return val && dateUtil(val).format('YYYY-MM-DD HH:mm:ss');
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '审批说明',
|
||||
name: 'examRemark',
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
return { detail, bulletinTopic };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,170 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<ns-view-list-table v-bind="tableConfig" rowKey="uuid" />
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { dateUtil } from '/nerv-lib/saas';
|
||||
import { useRouter } from 'vue-router';
|
||||
export default defineComponent({
|
||||
name: 'AuditIndex',
|
||||
setup() {
|
||||
const router = useRouter();
|
||||
const tableConfig = {
|
||||
title: '审核管理',
|
||||
api: {
|
||||
method: 'GET',
|
||||
url: '/api/content/objs/admin/articleExamineRecord/pageList',
|
||||
},
|
||||
params: {
|
||||
page: 0,
|
||||
pageSize: 10,
|
||||
},
|
||||
formConfig: {
|
||||
schemas: [
|
||||
{
|
||||
field: 'folderId',
|
||||
label: '内容类型',
|
||||
component: 'NsSelect',
|
||||
defaultValue: '',
|
||||
componentProps: {
|
||||
placeholder: '请选择',
|
||||
options: [
|
||||
{ label: '全部', value: '' },
|
||||
{ label: '通知公告', value: 1 },
|
||||
{ label: '新闻', value: 2 },
|
||||
{ label: '文章', value: 3 },
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'articleTitleLike',
|
||||
label: '内容名称',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'articleCodeLike',
|
||||
label: '内容ID',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'examStatus',
|
||||
label: '审核状态',
|
||||
component: 'NsSelect',
|
||||
defaultValue: '',
|
||||
componentProps: {
|
||||
placeholder: '请选择',
|
||||
options: [
|
||||
{ label: '全部', value: '' },
|
||||
{ label: '待审核', value: 1 },
|
||||
{ label: '已完成', value: 2 },
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
headerActions: [{}],
|
||||
rowSelection: null,
|
||||
columns: [
|
||||
{
|
||||
title: '内容类型',
|
||||
dataIndex: 'folderName',
|
||||
textNumber: 4,
|
||||
},
|
||||
{
|
||||
title: '内容名称',
|
||||
dataIndex: 'articleTitle',
|
||||
textNumber: 6,
|
||||
textEllipsis: true,
|
||||
// width: 300,
|
||||
},
|
||||
{
|
||||
title: '内容ID',
|
||||
dataIndex: 'articleCode',
|
||||
// width: 300,
|
||||
},
|
||||
{
|
||||
title: '提交人',
|
||||
dataIndex: 'createUserName',
|
||||
// width: 300,
|
||||
},
|
||||
{
|
||||
title: '提交时间',
|
||||
dataIndex: 'createTime',
|
||||
// width: 200,
|
||||
customRender: ({ value }: any) => {
|
||||
if (!value) return '-';
|
||||
if (value) return dateUtil(value).format('YYYY-MM-DD HH:mm:ss');
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '审核人',
|
||||
dataIndex: 'examUserName',
|
||||
textNumber: 4,
|
||||
customRender: ({ value }: any) => {
|
||||
if (!value) return '-';
|
||||
return value;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '审核时间',
|
||||
dataIndex: 'examTime',
|
||||
textNumber: 10,
|
||||
customRender: ({ value }: any) => {
|
||||
if (!value) return '-';
|
||||
if (value) return dateUtil(value).format('YYYY-MM-DD HH:mm:ss');
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '审核结果',
|
||||
dataIndex: 'examResult',
|
||||
textNumber: 4,
|
||||
customRender: ({ value }: any) => ['', '通过', '未通过'][value],
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
dataIndex: 'examStatus',
|
||||
textNumber: 3,
|
||||
customRender: ({ value }: any) => ['', '待审核', '已完成'][value],
|
||||
},
|
||||
],
|
||||
columnActions: {
|
||||
title: '操作',
|
||||
// width: 100,
|
||||
actionNumber: 1,
|
||||
textNumber: 2,
|
||||
actions: [
|
||||
{
|
||||
label: '查看',
|
||||
name: 'AuditDetail',
|
||||
ifShow: ({ examStatus }) => examStatus == 2,
|
||||
handle: ({ uuid }, name) => {
|
||||
router.push({ name, query: { uuid } });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '审核',
|
||||
name: 'AuditAction',
|
||||
ifShow: ({ examStatus }) => examStatus == 1,
|
||||
handle: ({ uuid }, name) => {
|
||||
router.push({ name, query: { uuid } });
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
return {
|
||||
tableConfig,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped></style>
|
||||
@@ -1,199 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<ns-view-add-form
|
||||
ref="nsAddFormRef"
|
||||
:schemas="formSchema"
|
||||
:model="data"
|
||||
:title="uuid ? '编辑新闻' : '新增新闻'"
|
||||
:dataHandle="dataHandle"
|
||||
:headActions="headActions"
|
||||
:api="formApi" />
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref, provide, computed } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import FCKEditor from '/@/view/components/FCKEditor.vue';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'NewsAdd',
|
||||
setup() {
|
||||
provide('components', () => {
|
||||
return { FCKEditor };
|
||||
});
|
||||
const router = useRouter();
|
||||
const { uuid } = router.currentRoute.value.query;
|
||||
const nsAddFormRef = ref();
|
||||
const htmlInfo = ref('');
|
||||
const imageNetUrl = ref('');
|
||||
const formApi = ref(
|
||||
uuid
|
||||
? '/api/content/objs/admin/cms/bg/article/update'
|
||||
: '/api/content/objs/admin/cms/bg/article/add',
|
||||
);
|
||||
|
||||
const data = ref({
|
||||
articleCommonHandleForm: { folderCode: 'mobileNewsManager', content: '', title: '' },
|
||||
});
|
||||
|
||||
if (uuid) {
|
||||
http.get('/api/content/objs/admin/cms/bg/article/detail', { uuid }).then((res) => {
|
||||
console.log(res);
|
||||
data.value = res.data.articleCommonVO;
|
||||
data.value.articleCommonHandleForm = {
|
||||
folderCode: 'mobileNewsManager',
|
||||
folderName: '新闻',
|
||||
sort: 0,
|
||||
title: res.data.articleCommonVO.title,
|
||||
content: res.data.articleCommonVO.content,
|
||||
articleSource: res.data.articleCommonVO.articleSource,
|
||||
imageNetUrl: res.data.articleCommonVO.imageNetUrl,
|
||||
};
|
||||
data.value.folderCode = 'mobileNewsManager';
|
||||
// 编辑->未上架
|
||||
data.value.isPublish = 0;
|
||||
imageNetUrl.value = res.data.articleCommonVO.imageNetUrl;
|
||||
htmlInfo.value = res.data.articleCommonVO.content || '';
|
||||
});
|
||||
}
|
||||
const dataHandle = (data) => {
|
||||
const newData = JSON.parse(JSON.stringify(data));
|
||||
newData['articleCommonHandleForm'] = Object.assign(
|
||||
newData['articleCommonHandleForm'],
|
||||
data,
|
||||
);
|
||||
return newData;
|
||||
};
|
||||
const validateResult = computed(() => {
|
||||
return !nsAddFormRef.value?.validateResult;
|
||||
});
|
||||
const headActions = ref({
|
||||
actions: [
|
||||
{
|
||||
label: '发布',
|
||||
name: 'NewsDetail',
|
||||
dynamicDisabled: validateResult,
|
||||
handle: (record, name) => {
|
||||
// formApi.value = uuid
|
||||
// ? '/api/content/objs/admin/cms/bg/article/publish'
|
||||
// : '/api/content/objs/admin/cms/bg/article/add';
|
||||
data.value.isPublish = 1;
|
||||
nsAddFormRef.value?.submit();
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const formSchema = ref([
|
||||
{
|
||||
field: 'folderCode',
|
||||
defaultValue: 'mobileNewsManager',
|
||||
},
|
||||
{
|
||||
field: 'articleCommonHandleForm',
|
||||
defaultValue: { folderCode: 'mobileNewsManager', folderName: '新闻', sort: 0 },
|
||||
},
|
||||
{
|
||||
field: 'uuid',
|
||||
defaultValue: uuid,
|
||||
},
|
||||
{
|
||||
field: 'isPublish',
|
||||
defaultValue: 0,
|
||||
},
|
||||
{
|
||||
field: 'title',
|
||||
label: '新闻标题',
|
||||
component: 'NsInput',
|
||||
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
// 禁止输入
|
||||
// disabled: true,
|
||||
// onChange: (e) => {
|
||||
// data.value.articleCommonHandleForm['title'] = e.target.value;
|
||||
// },
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入新闻标题',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'articleSource',
|
||||
label: '消息来源',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
// onChange: (e) => {
|
||||
// data.value.articleCommonHandleForm['articleSource'] = e.target.value;
|
||||
// },
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入消息来源',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
{
|
||||
field: 'imageNetUrl',
|
||||
component: 'NsUpload',
|
||||
label: '新闻图片',
|
||||
componentProps: {
|
||||
// 上传的地址
|
||||
url: '/api/fileunify/objs/admin/MaterialFile',
|
||||
// 上传的图片大小
|
||||
maxSize: 5242880,
|
||||
// 上传的图片类型
|
||||
fileType: ['jpg', 'png', 'jpeg'],
|
||||
// 展示图片数量
|
||||
count: 1,
|
||||
// 上传的文件类型,0-证书,1-图片,2-身份证件
|
||||
uploadType: 1,
|
||||
params: {
|
||||
groupCode: 'mobile_img',
|
||||
},
|
||||
baseImageUrl: imageNetUrl,
|
||||
// onChange: (e) => {
|
||||
// data.value.articleCommonHandleForm['imageNetUrl'] = e;
|
||||
// },
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'content',
|
||||
component: 'FCKEditor',
|
||||
class: 'ns-form-item-full ns-form-item-padding ns-richText-ZIndex',
|
||||
label: '新闻内容',
|
||||
componentProps: {
|
||||
htmlInfo: htmlInfo,
|
||||
// onChange: (a) => {
|
||||
// data.value.articleCommonHandleForm['content'] = a;
|
||||
// },
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '内容不能为空',
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
||||
return {
|
||||
formSchema,
|
||||
data,
|
||||
headActions,
|
||||
nsAddFormRef,
|
||||
dataHandle,
|
||||
uuid,
|
||||
formApi,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,65 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<ns-view-detail
|
||||
:dataHandle="dataHandle"
|
||||
api="/api/content/objs/admin/cms/bg/article/detail"
|
||||
:detail="detail">
|
||||
<template #content="data">
|
||||
<span v-html="data.value"></span>
|
||||
</template>
|
||||
</ns-view-detail>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { dateUtil } from '/nerv-lib/saas';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'NewsDetail',
|
||||
setup() {
|
||||
const rouer = useRouter();
|
||||
const dataHandle = ({ articleCommonVO }) => {
|
||||
return articleCommonVO;
|
||||
};
|
||||
const detail = reactive([
|
||||
{
|
||||
title: '基本信息',
|
||||
items: [
|
||||
{
|
||||
label: '新闻标题',
|
||||
name: 'title',
|
||||
},
|
||||
{
|
||||
label: '消息来源',
|
||||
name: 'articleSource',
|
||||
},
|
||||
{
|
||||
label: '新闻图片',
|
||||
name: 'imageNetUrl',
|
||||
type: 'image',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: '新闻内容:',
|
||||
items: [
|
||||
{
|
||||
label: '',
|
||||
type: 'html',
|
||||
name: 'content',
|
||||
style: { padding: 0 },
|
||||
// format: (value, record) => {
|
||||
// return record.articleCommonVO.content;
|
||||
// },
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
return { detail, dataHandle };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,220 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<ns-view-list-table ref="nsTableRef" v-bind="tableConfig" rowKey="uuid" />
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref } from 'vue';
|
||||
import { dateUtil } from '/nerv-lib/saas';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
import { NsMessage } from '/nerv-lib/component/message';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'NewsIndex',
|
||||
setup() {
|
||||
const router = useRouter();
|
||||
const nsTableRef = ref();
|
||||
|
||||
const request = (api: string, params: object) => {
|
||||
http.post(api, params).then(() => {
|
||||
NsMessage.success('操作成功');
|
||||
nsTableRef.value.nsTableRef.reload();
|
||||
});
|
||||
};
|
||||
const tableConfig = {
|
||||
title: '新闻管理',
|
||||
api: {
|
||||
method: 'POST',
|
||||
url: '/api/content/objs/admin/cms/bg/article/pageList',
|
||||
},
|
||||
params: {
|
||||
page: 0,
|
||||
pageSize: 10,
|
||||
folderCode: 'mobileNewsManager',
|
||||
},
|
||||
formConfig: {
|
||||
schemas: [
|
||||
{
|
||||
field: 'titleLike',
|
||||
label: '新闻标题',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'articleStatus',
|
||||
label: '状态',
|
||||
component: 'NsSelect',
|
||||
defaultValue: '',
|
||||
componentProps: {
|
||||
placeholder: '请选择',
|
||||
options: [
|
||||
{ label: '全部', value: '' },
|
||||
{ label: '未上架', value: 1 },
|
||||
{ label: '待审核', value: 2 },
|
||||
{ label: '已上架', value: 3 },
|
||||
{ label: '未通过', value: 6 },
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
headerActions: [
|
||||
{
|
||||
label: '新增新闻',
|
||||
name: 'NewsAdd',
|
||||
type: 'primary',
|
||||
handle: ({}, name) => {
|
||||
router.push({ name, query: {} });
|
||||
},
|
||||
},
|
||||
],
|
||||
rowSelection: null,
|
||||
columns: [
|
||||
{
|
||||
title: '新闻ID',
|
||||
dataIndex: 'articleCode',
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '新闻标题',
|
||||
dataIndex: 'extraColMap',
|
||||
textNumber: 6,
|
||||
textEllipsis: true,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO['title'];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
textNumber: 4,
|
||||
dataIndex: 'articleStatus',
|
||||
customCell: ({ articleCommonVO: { articleStatus } }) => {
|
||||
return {
|
||||
style: { color: articleStatus == 3 ? 'green' : articleStatus == 6 ? 'red' : '' },
|
||||
};
|
||||
},
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return ['', '未上架', '待审核', '已上架', '', '', '未通过'][
|
||||
articleCommonVO[column.dataIndex]
|
||||
];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '是否置顶',
|
||||
textNumber: 4,
|
||||
dataIndex: 'isTop',
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return ['否', '是'][articleCommonVO[column.dataIndex]];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '上架时间',
|
||||
dataIndex: 'publishTime',
|
||||
textNumber: 10,
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex] || '-';
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '消息来源',
|
||||
textNumber: 5,
|
||||
dataIndex: 'articleSource',
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '创建人',
|
||||
textNumber: 5,
|
||||
dataIndex: 'createUserName',
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
// textNumber: 9,
|
||||
dataIndex: 'createTime',
|
||||
customRender: ({ record: { articleCommonVO }, column }) => {
|
||||
return articleCommonVO[column.dataIndex];
|
||||
},
|
||||
},
|
||||
],
|
||||
columnActions: {
|
||||
title: '操作',
|
||||
autoMergeAction: false,
|
||||
actionNumber: 3,
|
||||
actions: [
|
||||
{
|
||||
label: '查看',
|
||||
name: 'NewsDetail',
|
||||
ifShow: ({ articleCommonVO: { articleStatus } }) => [2, 3].includes(articleStatus),
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
router.push({ name, query: { uuid } });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '编辑',
|
||||
name: 'NewsEdit',
|
||||
ifShow: ({ articleCommonVO: { articleStatus } }) => [1, 6].includes(articleStatus),
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
router.push({ name, query: { uuid } });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '置顶',
|
||||
name: 'NewsManageTop',
|
||||
confirm: true,
|
||||
ifShow: ({ articleCommonVO: { articleStatus, isTop } }) =>
|
||||
articleStatus == 3 && isTop == 0,
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
request('/api/content/objs/admin/cms/bg/article/top', { uuid });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '取消置顶',
|
||||
name: 'NewsManageCancleTop',
|
||||
confirm: true,
|
||||
ifShow: ({ articleCommonVO: { articleStatus, isTop } }) =>
|
||||
articleStatus == 3 && isTop == 1,
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
request('/api/content/objs/admin/cms/bg/article/top', { uuid });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '删除',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'NewsManageDelete',
|
||||
confirm: true,
|
||||
ifShow: ({ articleCommonVO: { articleStatus } }) => [1, 6].includes(articleStatus),
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
request('/api/content/objs/admin/cms/bg/article/batchDel', { uuids: [uuid] });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '下架',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'NewsManageReaded',
|
||||
confirm: true,
|
||||
ifShow: ({ articleCommonVO: { articleStatus } }) => [3].includes(articleStatus),
|
||||
handle: ({ articleCommonVO: { uuid } }, name) => {
|
||||
request('/api/content/objs/admin/cms/bg/article/withdrawn', { uuid });
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
return {
|
||||
nsTableRef,
|
||||
tableConfig,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped></style>
|
||||
@@ -1,254 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<div style="height: 100%">
|
||||
<a-layout style="height: 100%">
|
||||
<a-layout-header class="home_header" style="position: relative">
|
||||
<ns-icon name="login" size="100" style="width: 220px" />
|
||||
</a-layout-header>
|
||||
<a-layout-content class="center-content">
|
||||
<div class="lg_card">
|
||||
<h1 class="lg_card_title">账号登录current</h1>
|
||||
<p v-show="!errorShow" style="height: 22px"></p>
|
||||
<p v-show="errorShow" class="lg_card_error">{{ errorMsg }}</p>
|
||||
<a-input
|
||||
placeholder="登录账号"
|
||||
v-model:value="userName"
|
||||
style="height: 48px; margin-bottom: 20px">
|
||||
<template #prefix>
|
||||
<ns-icon name="userName" size="25" style="margin-right: 5px" />
|
||||
</template>
|
||||
</a-input>
|
||||
<a-input-password placeholder="登录密码" v-model:value="password" style="height: 48px">
|
||||
<template #prefix>
|
||||
<ns-icon name="passWord" size="25" style="margin-right: 5px" />
|
||||
</template>
|
||||
</a-input-password>
|
||||
<a-button
|
||||
@click="submit"
|
||||
:loading="loading"
|
||||
type="primary"
|
||||
style="margin-top: 30px; width: 100%; height: 53px"
|
||||
>登录</a-button
|
||||
>
|
||||
</div>
|
||||
</a-layout-content>
|
||||
<a-layout-footer>Copyright 2021 xu科技 All Rights Reserved</a-layout-footer>
|
||||
</a-layout>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { appConfigStore } from '/nerv-lib/saas/store/modules/app-config';
|
||||
import { authorizationService } from '/nerv-base/store/modules/authorization-service';
|
||||
import Cookies from 'js-cookie';
|
||||
export default defineComponent({
|
||||
name: 'UserLogin',
|
||||
setup() {
|
||||
const url = ref('/asset/image/login/background.png');
|
||||
const userName = ref<string>('');
|
||||
const password = ref<string>('');
|
||||
const logUrl = ref<string>('');
|
||||
const bgUrl = ref<string>('');
|
||||
const errorMsg = ref<string>('');
|
||||
const errorShow = ref<boolean>(false);
|
||||
const router = useRouter();
|
||||
const title = ref<string>('');
|
||||
const initUrl = ref('');
|
||||
title.value = '账号登录';
|
||||
// title.value = appConfig.title ? appConfig.title : '账号登录';
|
||||
const loading = ref<boolean>(false);
|
||||
const configStore = appConfigStore();
|
||||
const useAuthorization = authorizationService();
|
||||
const submit = (): void => {
|
||||
if (password.value === '') {
|
||||
errorMsg.value = '请输入密码';
|
||||
errorShow.value = true;
|
||||
}
|
||||
if (userName.value === '') {
|
||||
errorMsg.value = '请输入账号';
|
||||
errorShow.value = true;
|
||||
}
|
||||
if (userName.value !== '' && password.value !== '') {
|
||||
errorShow.value = false;
|
||||
let data = JSON.stringify({ userName: userName.value, password: password.value });
|
||||
// loading.value = true;
|
||||
console.log(data);
|
||||
Cookies.set('nervsid', 'mockId');
|
||||
router.push({
|
||||
name: 'AnnouncementsIndex',
|
||||
});
|
||||
async function logins() {
|
||||
try {
|
||||
const res = await configStore.userLogin(JSON.parse(data));
|
||||
if (res.success) {
|
||||
if (res.data?.userToken) {
|
||||
Cookies.set('nervsid', res.data?.userToken);
|
||||
}
|
||||
const info = await configStore.userInfo();
|
||||
info.success
|
||||
? window.sessionStorage.setItem('userInfo', JSON.stringify(info.data))
|
||||
: '';
|
||||
loading.value = false;
|
||||
if (configStore.enablePermissions) {
|
||||
const res = await configStore.userResource();
|
||||
initUrl.value = '';
|
||||
const dealInitUrl = (item) => {
|
||||
if (item.type === 'menus' && item.menus && item.menus?.length !== 0) {
|
||||
dealInitUrl(item.menus[0]);
|
||||
} else {
|
||||
// if (item.type === 'noChildrenMenu') {
|
||||
initUrl.value = configStore.resourceName
|
||||
? item.code.replace(configStore.resourceName, '')
|
||||
: item.code;
|
||||
// }
|
||||
}
|
||||
};
|
||||
if (configStore.resourceName) {
|
||||
const initResource = [];
|
||||
res.data.forEach((item) => {
|
||||
if (item.code.includes(configStore.resourceName)) {
|
||||
initResource.push(item);
|
||||
}
|
||||
});
|
||||
dealInitUrl(initResource[0]);
|
||||
} else {
|
||||
dealInitUrl(res.data[0]);
|
||||
}
|
||||
// dealInitUrl(res.data[0]);
|
||||
useAuthorization.updateUserResource(res.data);
|
||||
const initRouterList = useAuthorization.getInitRouterList;
|
||||
console.log(initUrl.value);
|
||||
router.push({
|
||||
name: initRouterList.length === 0 ? 'error403' : initUrl.value,
|
||||
});
|
||||
} else {
|
||||
router.replace({ name: 'root' });
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
loading.value = false;
|
||||
}
|
||||
}
|
||||
// logins();
|
||||
}
|
||||
};
|
||||
const checkoutLogo = (): void => {
|
||||
logUrl.value = '';
|
||||
};
|
||||
const checkoutBg = (): void => {
|
||||
Math.random() > 0.5
|
||||
? (url.value = 'src/assetimg/background.jpg')
|
||||
: (url.value = 'src/assetimg/background.png');
|
||||
};
|
||||
return {
|
||||
title,
|
||||
url,
|
||||
loading,
|
||||
userName,
|
||||
password,
|
||||
submit,
|
||||
errorMsg,
|
||||
bgUrl,
|
||||
logUrl,
|
||||
checkoutLogo,
|
||||
checkoutBg,
|
||||
errorShow,
|
||||
};
|
||||
},
|
||||
created() {
|
||||
const _this = this;
|
||||
window.sessionStorage.clear();
|
||||
document.onkeydown = function (e) {
|
||||
const key = window.event === undefined ? e.keyCode : window.event.keyCode;
|
||||
key === 13 ? _this.submit() : '';
|
||||
};
|
||||
},
|
||||
beforeUnmount() {
|
||||
document.onkeydown = function (e) {};
|
||||
},
|
||||
|
||||
mounted() {
|
||||
// if (Cookies.get('nervsid') !== undefined) {
|
||||
// this.$router.push('/home');
|
||||
// }
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.home_header {
|
||||
height: 64px !important;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
:deep(.center-content) {
|
||||
background: url('/asset/image/login/background.jpg') center center no-repeat;
|
||||
background-size: cover;
|
||||
|
||||
// background-position-y: -120px;
|
||||
margin: 0;
|
||||
}
|
||||
.icon {
|
||||
color: @primary-color;
|
||||
// background: #000;
|
||||
// min-height: 25px;
|
||||
// min-width: 25px;
|
||||
// display: flex;
|
||||
// justify-content: center;
|
||||
// align-items: center;
|
||||
// border-radius: 50%;
|
||||
}
|
||||
.ant-layout-header {
|
||||
min-height: 64px;
|
||||
background: #fff !important;
|
||||
}
|
||||
|
||||
.ant-layout-content {
|
||||
height: calc(100vh - 112px);
|
||||
width: 100%;
|
||||
min-height: 400px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.ant-layout-footer {
|
||||
max-height: 48px;
|
||||
min-height: 48px;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
color: #8f8f8f;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.lg_card {
|
||||
width: 385px;
|
||||
height: 353px;
|
||||
background: #fff;
|
||||
box-shadow: 0 2px 2px 0 rgb(0 0 0 / 5%), 0 0 18px 0 rgb(0 0 0 / 8%);
|
||||
border-radius: 6px;
|
||||
margin: 0 30px 0 30px;
|
||||
padding: 35px;
|
||||
}
|
||||
|
||||
.lg_card .lg_card_title {
|
||||
height: 28px;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: #172e3d;
|
||||
line-height: 28px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.lg_card_error {
|
||||
text-align: left;
|
||||
color: #e4393c;
|
||||
font-size: 14px;
|
||||
}
|
||||
</style>
|
||||
@@ -1,346 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<my-add-form
|
||||
formLayout="vertical"
|
||||
:schemas="formSchema"
|
||||
:model="data"
|
||||
:title="uuid ? `${versionArr[platformId]}版本编辑` : `${versionArr[platformId]}发版`"
|
||||
:api="
|
||||
uuid
|
||||
? '/api/op_com/objs/admin/VersionConfigOper/updateVersionConfig'
|
||||
: '/api/op_com/objs/admin/VersionConfigOper/addVersionConfig'
|
||||
" />
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref, provide } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import upFile from './components/uploadFile.vue';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
|
||||
import myAddForm from './components/add-form.vue';
|
||||
export default defineComponent({
|
||||
name: 'SoftwareVersionManageAdd',
|
||||
components: {
|
||||
myAddForm,
|
||||
},
|
||||
setup() {
|
||||
provide('components', () => {
|
||||
return { upFile };
|
||||
});
|
||||
const data = ref({});
|
||||
const router = useRouter();
|
||||
const { title, uuid, platformId } = router.currentRoute.value.query;
|
||||
if (platformId == 3) {
|
||||
setTimeout(() => {
|
||||
// H5
|
||||
data.value.updateFlag = 0;
|
||||
data.value.versionState = 0;
|
||||
}, 10);
|
||||
}
|
||||
const versionArr = ['', 'Android', 'IOS', 'H5'];
|
||||
const formSchema = ref();
|
||||
const fileList = ref();
|
||||
const request = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
http
|
||||
.get('/api/op_com/objs/admin/VersionConfigOper/queryVersionUpgradeConfigInfo', { uuid })
|
||||
.then((res) => {
|
||||
const detail = res.data;
|
||||
|
||||
resolve(detail);
|
||||
})
|
||||
.catch((err) => {
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
};
|
||||
let formSchemaDetail = [
|
||||
{
|
||||
field: 'platformId',
|
||||
defaultValue: platformId,
|
||||
},
|
||||
{
|
||||
field: 'uuid',
|
||||
defaultValue: uuid,
|
||||
},
|
||||
|
||||
{
|
||||
field: 'appName',
|
||||
label: '软件名称',
|
||||
component: 'NsInput',
|
||||
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
// 禁止输入
|
||||
// disabled: true,
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
pattern: /^.{1,20}$/,
|
||||
message: '支持1-20个字符',
|
||||
trigger: 'blur',
|
||||
},
|
||||
{
|
||||
required: true,
|
||||
message: '请输入软件名称',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'versionCode',
|
||||
label: '版本号',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
pattern: /^.{1,20}$/,
|
||||
message: '支持1-20个字符',
|
||||
trigger: 'blur',
|
||||
},
|
||||
{
|
||||
required: true,
|
||||
message: '请输入版本号',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'downSource',
|
||||
label: '下载方式',
|
||||
component: 'NsSelect',
|
||||
ifShow: () => platformId == 1,
|
||||
defaultValue: 1,
|
||||
componentProps: {
|
||||
placeholder: '请选择',
|
||||
options: [
|
||||
{ label: '浏览器下载', value: 0 },
|
||||
{ label: '应用商城下载', value: 1 },
|
||||
{ label: '应用内下载', value: 2 },
|
||||
],
|
||||
},
|
||||
},
|
||||
// 安卓
|
||||
{
|
||||
field: 'file',
|
||||
label: '安装包',
|
||||
component: 'upFile',
|
||||
ifShow: () => platformId == 1,
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
fileName: fileList,
|
||||
// 禁止输入
|
||||
// disabled: true,
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请上传安装包',
|
||||
type: 'object',
|
||||
trigger: 'change',
|
||||
},
|
||||
// {
|
||||
// validator: (value, b) => {
|
||||
// console.log(value, b);
|
||||
// },
|
||||
// },
|
||||
],
|
||||
},
|
||||
// ios
|
||||
{
|
||||
field: 'downUrl',
|
||||
label: '下载地址',
|
||||
component: 'NsInput',
|
||||
ifShow: () => platformId != 1,
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
// 禁止输入
|
||||
// disabled: true,
|
||||
},
|
||||
// rules: [
|
||||
// // {
|
||||
// // pattern: /^.{1,20}$/,
|
||||
// // message: '支持1-20个字符',
|
||||
// // trigger: 'blur',
|
||||
// // },
|
||||
// // {
|
||||
// // required: true,
|
||||
// // message: '请输入下载地址',
|
||||
// // trigger: 'change',
|
||||
// // },
|
||||
// ],
|
||||
},
|
||||
// 安卓
|
||||
{
|
||||
field: 'md5',
|
||||
label: 'MD5码',
|
||||
defaultValue: 'defaultMD5',
|
||||
component: 'NsInput',
|
||||
show: false,
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
// 禁止输入
|
||||
// disabled: true,
|
||||
},
|
||||
rules: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: '请填写MD5码',
|
||||
// trigger: 'change',
|
||||
// },
|
||||
{
|
||||
pattern: /^.{1,64}$/,
|
||||
message: '支持1-64个字符',
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
// 安卓
|
||||
{
|
||||
field: 'uniqueCode',
|
||||
label: '唯一code',
|
||||
component: 'NsInput',
|
||||
show: false,
|
||||
defaultValue: 'com.yidingyun.lowcodeapp',
|
||||
// componentProps: {
|
||||
// placeholder: '请输入',
|
||||
// // 禁止输入
|
||||
// // disabled: true,
|
||||
// },
|
||||
// rules: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: '请填写唯一code',
|
||||
// trigger: 'change',
|
||||
// },
|
||||
// {
|
||||
// pattern: /^.{1,64}$/,
|
||||
// message: '支持1-64个字符',
|
||||
// trigger: 'blur',
|
||||
// },
|
||||
// ],
|
||||
},
|
||||
|
||||
{
|
||||
field: 'updateFlag',
|
||||
label: '是否需要更新',
|
||||
component: 'NsRadioGroup',
|
||||
defaultValue: 0,
|
||||
componentProps: {
|
||||
radioType: 'radio',
|
||||
options: [
|
||||
{ label: '是', value: 1 },
|
||||
{ label: '否', value: 0 },
|
||||
],
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择是否需要更新',
|
||||
type: 'number',
|
||||
trigger: 'change',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'updateType',
|
||||
label: '更新类型',
|
||||
component: 'NsRadioGroup',
|
||||
defaultValue: 0,
|
||||
show: (a) => {
|
||||
if (a.updateFlag) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
componentProps: {
|
||||
radioType: 'radio',
|
||||
options: [
|
||||
{ label: '强制更新', value: 1 },
|
||||
{ label: '建议更新', value: 0 },
|
||||
],
|
||||
// disabled: uuid && true,
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择更新类型',
|
||||
type: 'number',
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'versionState',
|
||||
label: '是否最新版本',
|
||||
defaultValue: 0,
|
||||
component: 'NsRadioGroup',
|
||||
componentProps: {
|
||||
radioType: 'radio',
|
||||
options: [
|
||||
{ label: '是', value: 1 },
|
||||
{ label: '否', value: 0 },
|
||||
],
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择是否最新版本',
|
||||
type: 'number',
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
{
|
||||
field: 'upgradeTips',
|
||||
label: '更新日志',
|
||||
component: 'NsTextarea',
|
||||
extra: 'tips:不同版本下载地址相同',
|
||||
componentProps: {
|
||||
placeholder: '请输入更新日志,限300字符',
|
||||
showCount: true,
|
||||
maxlength: 300,
|
||||
// maxLength: 10,
|
||||
// 禁止输入
|
||||
// disabled: true,
|
||||
// 阻止回车默认事件
|
||||
onPressEnter: (e) => {
|
||||
e.preventDefault();
|
||||
},
|
||||
},
|
||||
rules: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: '请输入更新日志,限300字符',
|
||||
// trigger: 'blur',
|
||||
// },
|
||||
{
|
||||
pattern: /^.{1,300}$/,
|
||||
message: '长度不得超过个300字符',
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
if (uuid) {
|
||||
request().then((res: any) => {
|
||||
data.value = res;
|
||||
fileList.value = data.value.appPackageName;
|
||||
formSchema.value = Object.assign([], formSchemaDetail);
|
||||
});
|
||||
} else {
|
||||
formSchema.value = Object.assign([], formSchemaDetail);
|
||||
}
|
||||
|
||||
return {
|
||||
formSchema,
|
||||
data,
|
||||
uuid,
|
||||
platformId,
|
||||
versionArr,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,135 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<a-spin :spinning="isLoading">
|
||||
<ns-page-header class="ns-page-header" :title="title">
|
||||
<template #extra>
|
||||
<!-- todo 隐藏取消-->
|
||||
<a-button @click="navigateBack">返回</a-button>
|
||||
<a-button
|
||||
style="margin-left: 10px"
|
||||
type="primary"
|
||||
:disabled="validateResult"
|
||||
@click="submit"
|
||||
>保存</a-button
|
||||
>
|
||||
</template>
|
||||
</ns-page-header>
|
||||
<div class="ns-add-form">
|
||||
<ns-form ref="mainRef" v-bind="getBindValue">
|
||||
<template #[item]="data" v-for="item in Object.keys($slots)">
|
||||
<slot :name="item" v-bind="data || {}"></slot>
|
||||
</template>
|
||||
</ns-form>
|
||||
</div>
|
||||
</a-spin>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, ref } from 'vue';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
import { NsMessage } from '/nerv-lib/component/message';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { useNavigate } from '/nerv-lib/use/use-navigate';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'NsViewAddForm',
|
||||
props: {
|
||||
api: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
title: String,
|
||||
params: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
},
|
||||
setup(props, { attrs }) {
|
||||
const mainRef = ref();
|
||||
const isLoading = ref(false);
|
||||
const { navigateBack } = useNavigate();
|
||||
|
||||
const getBindValue = computed(() => ({
|
||||
...attrs,
|
||||
...props,
|
||||
}));
|
||||
|
||||
const validateResult = computed(() => {
|
||||
return !mainRef.value?.validateResult;
|
||||
});
|
||||
function submit() {
|
||||
mainRef.value
|
||||
.triggerSubmit()
|
||||
.then((data: any) => {
|
||||
isLoading.value = true;
|
||||
const config = {
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data',
|
||||
},
|
||||
|
||||
// params: params,
|
||||
};
|
||||
console.log('myadd', data);
|
||||
if (data.file && data.file.uid === '-1') {
|
||||
data.file = null;
|
||||
}
|
||||
const formData = new FormData();
|
||||
Object.keys(data).map((item) => {
|
||||
if (String(data[item]) !== 'null' && data[item] !== undefined)
|
||||
formData.append(item, data[item]);
|
||||
});
|
||||
// data.file.
|
||||
http
|
||||
.post(props.api, formData, config)
|
||||
.then(() => {
|
||||
isLoading.value = false;
|
||||
NsMessage.success('操作成功', 1, () => {
|
||||
navigateBack();
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
isLoading.value = false;
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
isLoading.value = false;
|
||||
});
|
||||
}
|
||||
|
||||
return { mainRef, submit, getBindValue, isLoading, navigateBack, validateResult };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
//.ns-page-header {
|
||||
// margin: 0px 16px 20px 0;
|
||||
// border-bottom: 1px solid #f0f2f5;
|
||||
//}
|
||||
.ns-add-form .ns-vertical-form {
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
min-width: 500px;
|
||||
}
|
||||
:deep(.ant-spin-nested-loading) {
|
||||
height: 100%;
|
||||
}
|
||||
.ant-spin-nested-loading {
|
||||
height: 100%;
|
||||
}
|
||||
// :deep(.ant-spin-container) {
|
||||
// height: 100%;
|
||||
// overflow: hidden;
|
||||
// }
|
||||
:deep(.ns-add-form) {
|
||||
// height: calc(100% - 83px) !important;
|
||||
overflow: auto;
|
||||
}
|
||||
:deep(.ns-form)::after {
|
||||
height: 0;
|
||||
}
|
||||
</style>
|
||||
@@ -1,95 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<div class="clearfix">
|
||||
<a-form enctype="multipart/form-data">
|
||||
<a-upload
|
||||
:file-list="fileList"
|
||||
@remove="handleRemove"
|
||||
:before-upload="beforeUpload"
|
||||
:customRequest="() => {}">
|
||||
<a-button>
|
||||
<upload-outlined />
|
||||
文件上传
|
||||
</a-button>
|
||||
</a-upload>
|
||||
</a-form>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { UploadOutlined } from '@ant-design/icons-vue';
|
||||
import { defineComponent, ref, watch } from 'vue';
|
||||
import type { UploadProps } from 'ant-design-vue';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
UploadOutlined,
|
||||
},
|
||||
props: {
|
||||
fileName: {
|
||||
type: String,
|
||||
},
|
||||
},
|
||||
emits: ['change'],
|
||||
setup(props, { emit, attrs }) {
|
||||
console.log(props, attrs);
|
||||
const fileList = ref<UploadProps['fileList']>([]);
|
||||
if (props.fileName) {
|
||||
(fileList.value[0] = {
|
||||
uid: '-1',
|
||||
name: props.fileName,
|
||||
status: 'done',
|
||||
}),
|
||||
emit('change', fileList.value[0]);
|
||||
}
|
||||
const uploading = ref<boolean>(false);
|
||||
|
||||
const handleRemove: UploadProps['onRemove'] = (file) => {
|
||||
const index = fileList.value.indexOf(file);
|
||||
const newFileList = fileList.value.slice();
|
||||
newFileList.splice(index, 1);
|
||||
fileList.value = newFileList;
|
||||
emit('change', fileList.value[0]);
|
||||
};
|
||||
|
||||
const beforeUpload: UploadProps['beforeUpload'] = async (file) => {
|
||||
fileList.value = [file];
|
||||
// fileList.value.push(await getBase64(file));
|
||||
// const formData = new FormData();
|
||||
// fileList.value.forEach((file: UploadProps['fileList'][number]) => {
|
||||
// formData.append('file', file);
|
||||
// formData.set('aaaaa', 'basbdbsadas');
|
||||
// });
|
||||
// uploading.value = true;
|
||||
// console.log('forma', file);
|
||||
emit('change', file);
|
||||
// return false;
|
||||
};
|
||||
|
||||
const handleUpload = () => {
|
||||
// You can use any AJAX library you like
|
||||
// request('https://www.mocky.io/v2/5cc8019d300000980a055e76', {
|
||||
// method: 'post',
|
||||
// data: formData,
|
||||
// })
|
||||
// .then(() => {
|
||||
// fileList.value = [];
|
||||
// uploading.value = false;
|
||||
// message.success('upload successfully.');
|
||||
// })
|
||||
// .catch(() => {
|
||||
// uploading.value = false;
|
||||
// message.error('upload failed.');
|
||||
// });
|
||||
};
|
||||
|
||||
return {
|
||||
fileList,
|
||||
uploading,
|
||||
handleRemove,
|
||||
beforeUpload,
|
||||
handleUpload,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,85 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<ns-view-detail
|
||||
title="查看详情"
|
||||
api="/api/op_com/objs/admin/VersionConfigOper/queryVersionUpgradeConfigInfo"
|
||||
:detail="detail" />
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { dateUtil } from '/nerv-lib/util/date-util';
|
||||
import { useRouter } from 'vue-router';
|
||||
export default defineComponent({
|
||||
name: 'SoftwareVersionManageDetail',
|
||||
setup() {
|
||||
const router = useRouter();
|
||||
const { platformId } = router.currentRoute.value.query;
|
||||
const detail = [
|
||||
{
|
||||
title: '基本信息',
|
||||
items: [
|
||||
{
|
||||
label: '软件名称',
|
||||
name: 'appName',
|
||||
},
|
||||
{
|
||||
label: '版本号',
|
||||
name: 'versionCode',
|
||||
},
|
||||
{
|
||||
name: 'downUrl',
|
||||
label: '下载地址',
|
||||
},
|
||||
{
|
||||
label: '安装包',
|
||||
name: 'appPackageName',
|
||||
ifShow: ({ platformId }) => platformId == 1,
|
||||
},
|
||||
{
|
||||
label: '下载方式',
|
||||
name: 'downSource',
|
||||
ifShow: ({ platformId }) => platformId == 1,
|
||||
format: (value) => ['浏览器下载', '应用商城下载', '应用内下载'][value],
|
||||
},
|
||||
// {
|
||||
// name: 'md5',
|
||||
// label: 'MD5码',
|
||||
// },
|
||||
// {
|
||||
// name: 'uniqueCode',
|
||||
// label: '唯一code',
|
||||
// },
|
||||
{
|
||||
name: 'updateFlag',
|
||||
label: '是否需要更新',
|
||||
format: (value, data) => {
|
||||
return ['否', '是'][value];
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'updateType',
|
||||
label: '更新类型',
|
||||
format: (value, data) => {
|
||||
return ['建议更新', '强制更新'][value];
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'versionState',
|
||||
label: '是否最新版本',
|
||||
format: (value, data) => {
|
||||
return ['否', '是'][value];
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'upgradeTips',
|
||||
label: '更新日志',
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
return { detail };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,656 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<a-tabs default-active-key="0">
|
||||
<a-tab-pane v-for="(item, index) in tabPaneList" :key="index" :tab="item.title">
|
||||
<ns-view-list-table :model="data" v-bind="item.bindData" />
|
||||
</a-tab-pane>
|
||||
</a-tabs>
|
||||
<ns-modal
|
||||
v-model:visible="qrcodeVisible"
|
||||
title="查看二维码"
|
||||
:centered="true"
|
||||
style="text-align: center"
|
||||
:width="230"
|
||||
:footer="null">
|
||||
<qrcode-vue size="150" :value="qrCodeUrl" />
|
||||
</ns-modal>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { dateUtil } from '/nerv-lib/util/date-util';
|
||||
import { NsMessage } from '/nerv-lib/component/message';
|
||||
import QrcodeVue from 'qrcode.vue';
|
||||
import Cookies from 'js-cookie';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'AppVersionManageIndex',
|
||||
components: { QrcodeVue },
|
||||
setup() {
|
||||
const data = reactive({});
|
||||
const router = useRouter();
|
||||
const platformId = ref([, 'Android', 'IOS', 'H5']);
|
||||
const qrCodeUrl = ref('');
|
||||
const qrcodeVisible = ref(false);
|
||||
const openDownloadDialog = (url, saveName) => {
|
||||
let aLink = document.createElement('a');
|
||||
aLink.href = url;
|
||||
aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
|
||||
document.body.appendChild(aLink);
|
||||
aLink.click();
|
||||
document.body.removeChild(aLink);
|
||||
};
|
||||
// 动态修改编辑页title
|
||||
const handle = (a, title) => {
|
||||
if (title == 'AppVersionDownload') {
|
||||
if (a.downUrl) {
|
||||
openDownloadDialog(a.downUrl, a.appPackageName);
|
||||
} else {
|
||||
NsMessage.warning('暂无下载地址', 1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
router.push({
|
||||
name: 'AppVersionManageAdd',
|
||||
query: {
|
||||
title,
|
||||
platformId: title == 'AndroidRelease' ? 1 : title == 'IOSRelease' ? 2 : 3,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
const tableConfigAndroid = {
|
||||
title: 'Android版本管理',
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/queryVersionUpgradeConfigList',
|
||||
headerActions: [
|
||||
{
|
||||
label: 'Android发版',
|
||||
name: 'AndroidRelease',
|
||||
type: 'primary',
|
||||
handle,
|
||||
},
|
||||
],
|
||||
params: {
|
||||
page: 0,
|
||||
pageSize: 10,
|
||||
platformId: 1,
|
||||
},
|
||||
rowSelection: null,
|
||||
columns: [
|
||||
{
|
||||
title: '软件名称',
|
||||
textNumber: 8,
|
||||
textEllipsis: true,
|
||||
dataIndex: 'appName',
|
||||
},
|
||||
{
|
||||
title: '版本号',
|
||||
textNumber: 5,
|
||||
dataIndex: 'versionCode',
|
||||
},
|
||||
{
|
||||
title: '下载方式',
|
||||
textNumber: 6,
|
||||
dataIndex: 'downSource',
|
||||
customRender: ({ value }) => {
|
||||
return ['浏览器下载', '应用商城下载', '应用内下载'][value];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '安装包名',
|
||||
textNumber: 10,
|
||||
textEllipsis: true,
|
||||
dataIndex: 'appPackageName',
|
||||
},
|
||||
{
|
||||
title: '是否最新版本',
|
||||
textNumber: 7,
|
||||
dataIndex: 'versionState',
|
||||
customRender: ({ value }) => {
|
||||
return ['否', '是'][value];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '更新类型',
|
||||
textNumber: 5,
|
||||
dataIndex: 'versionUpdateType',
|
||||
customRender: ({ value }) => {
|
||||
return ['无需更新', '建议更新', '强制更新'][value];
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: '发布时间',
|
||||
textNumber: 8,
|
||||
dataIndex: 'updateTime',
|
||||
customRender: ({ value }) => {
|
||||
return dateUtil(value).format('YYYY-MM-DD HH:mm:ss');
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '操作人',
|
||||
textNumber: 5,
|
||||
dataIndex: 'updateUser',
|
||||
},
|
||||
],
|
||||
columnActions: {
|
||||
title: '操作',
|
||||
actions: [
|
||||
{
|
||||
label: '查看',
|
||||
dynamicParams: ['uuid', 'platformId'],
|
||||
name: 'AppVersionManageIndexDetail',
|
||||
route: '/contentManage/systemManage/appVersionManage/detail',
|
||||
},
|
||||
{
|
||||
label: '修改更新类型',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'AppVersionChange',
|
||||
// handle: viewHandle,
|
||||
children: [
|
||||
{
|
||||
label: '无需更新',
|
||||
dynamicParams: 'uuid',
|
||||
defaultParams: {
|
||||
versionUpdateType: 0,
|
||||
},
|
||||
isReload: true,
|
||||
confirm: true,
|
||||
name: 'AppVersionChange',
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/setVersionUpdateType',
|
||||
},
|
||||
{
|
||||
label: '建议更新',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'AppVersionChange',
|
||||
defaultParams: {
|
||||
versionUpdateType: 1,
|
||||
},
|
||||
isReload: true,
|
||||
confirm: true,
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/setVersionUpdateType',
|
||||
},
|
||||
{
|
||||
label: '强制更新',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'AppVersionChange',
|
||||
defaultParams: {
|
||||
versionUpdateType: 2,
|
||||
},
|
||||
isReload: true,
|
||||
confirm: true,
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/setVersionUpdateType',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '编辑',
|
||||
dynamicParams: ['uuid', 'platformId'],
|
||||
name: 'AppVersionManageEdit',
|
||||
route: '/contentManage/systemManage/appVersionManage/edit',
|
||||
},
|
||||
{
|
||||
label: '下载',
|
||||
name: 'AppVersionDownload',
|
||||
handle,
|
||||
},
|
||||
{
|
||||
label: '查看二维码',
|
||||
name: 'AppVersionQrCodeUrl',
|
||||
handle: ({ downUrl }) => {
|
||||
if (!downUrl) {
|
||||
NsMessage.warning('暂无二维码', 1);
|
||||
return;
|
||||
}
|
||||
qrCodeUrl.value = downUrl;
|
||||
qrcodeVisible.value = true;
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '删除',
|
||||
dynamicParams: {
|
||||
uuid: 'uuid',
|
||||
},
|
||||
name: 'AppVersionDelete',
|
||||
confirm: true,
|
||||
isReload: true,
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/deleteVersionConfig',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
formConfig: {
|
||||
schemas: [
|
||||
{
|
||||
field: 'appName',
|
||||
label: '软件名称',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'versionCode',
|
||||
label: '版本号',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'time',
|
||||
label: '发布时间',
|
||||
component: 'NsRangePicker',
|
||||
fieldMap: ['startTime', 'endTime'],
|
||||
componentProps: {
|
||||
valueFormat: 'YYYY-MM-DD',
|
||||
format: 'YYYY-MM-DD',
|
||||
},
|
||||
},
|
||||
],
|
||||
params: {},
|
||||
},
|
||||
rowKey: 'uuid',
|
||||
};
|
||||
const tableConfigIOS = {
|
||||
title: 'IOS版本管理',
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/queryVersionUpgradeConfigList',
|
||||
headerActions: [
|
||||
{
|
||||
label: 'IOS发版',
|
||||
name: 'IOSRelease',
|
||||
type: 'primary',
|
||||
handle,
|
||||
},
|
||||
],
|
||||
rowSelection: null,
|
||||
params: {
|
||||
page: 0,
|
||||
pageSize: 10,
|
||||
platformId: 2,
|
||||
},
|
||||
columns: [
|
||||
{
|
||||
title: '软件名称',
|
||||
textNumber: 8,
|
||||
textEllipsis: true,
|
||||
dataIndex: 'appName',
|
||||
},
|
||||
{
|
||||
title: '版本号',
|
||||
textNumber: 5,
|
||||
|
||||
dataIndex: 'versionCode',
|
||||
},
|
||||
|
||||
{
|
||||
title: '下载地址',
|
||||
textNumber: 8,
|
||||
dataIndex: 'downUrl',
|
||||
textEllipsis: true,
|
||||
},
|
||||
{
|
||||
title: '是否最新版本',
|
||||
textNumber: 7,
|
||||
dataIndex: 'versionState',
|
||||
customRender: ({ value }) => {
|
||||
return ['否', '是'][value];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '更新类型',
|
||||
textNumber: 5,
|
||||
dataIndex: 'versionUpdateType',
|
||||
customRender: ({ value }) => {
|
||||
return ['无需更新', '建议更新', '强制更新'][value];
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: '发布时间',
|
||||
textNumber: 9,
|
||||
dataIndex: 'updateTime',
|
||||
customRender: ({ value }) => {
|
||||
return dateUtil(value).format('YYYY-MM-DD HH:mm:ss');
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '操作人',
|
||||
textNumber: 5,
|
||||
|
||||
dataIndex: 'updateUser',
|
||||
},
|
||||
],
|
||||
columnActions: {
|
||||
title: '操作',
|
||||
// width: 220,
|
||||
// autoMergeAction: false,
|
||||
actions: [
|
||||
{
|
||||
label: '查看',
|
||||
dynamicParams: ['uuid', 'platformId'],
|
||||
name: 'AppVersionManageIndexDetail',
|
||||
route: '/contentManage/systemManage/appVersionManage/detail',
|
||||
},
|
||||
{
|
||||
label: '修改更新类型',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'AppVersionIOSChange',
|
||||
// handle: viewHandle,
|
||||
children: [
|
||||
{
|
||||
label: '无需更新',
|
||||
dynamicParams: 'uuid',
|
||||
defaultParams: {
|
||||
versionUpdateType: 0,
|
||||
},
|
||||
name: 'AppVersionIOSChange',
|
||||
isReload: true,
|
||||
confirm: true,
|
||||
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/setVersionUpdateType',
|
||||
},
|
||||
{
|
||||
label: '建议更新',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'AppVersionIOSChange',
|
||||
defaultParams: {
|
||||
versionUpdateType: 1,
|
||||
},
|
||||
isReload: true,
|
||||
confirm: true,
|
||||
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/setVersionUpdateType',
|
||||
},
|
||||
{
|
||||
label: '强制更新',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'AppVersionIOSChange',
|
||||
defaultParams: {
|
||||
versionUpdateType: 2,
|
||||
},
|
||||
isReload: true,
|
||||
confirm: true,
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/setVersionUpdateType',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '编辑',
|
||||
dynamicParams: ['uuid', 'platformId'],
|
||||
name: 'AppVersionManageIOSEdit',
|
||||
route: '/contentManage/systemManage/appVersionManage/edit',
|
||||
// ifShow: (record) => {
|
||||
// return record.reserveStatus === 0;
|
||||
// },
|
||||
},
|
||||
{
|
||||
label: '查看二维码',
|
||||
name: 'AppVersionQrCodeUrl',
|
||||
handle: ({ downUrl }) => {
|
||||
if (!downUrl) {
|
||||
NsMessage.warning('暂无二维码', 1);
|
||||
return;
|
||||
}
|
||||
qrCodeUrl.value = downUrl;
|
||||
qrcodeVisible.value = true;
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '删除',
|
||||
dynamicParams: {
|
||||
uuid: 'uuid',
|
||||
},
|
||||
name: 'AppVersionIOSDelete',
|
||||
confirm: true,
|
||||
isReload: true,
|
||||
// ifShow: (record) => {
|
||||
// return record.reserveStatus === 0;
|
||||
// },
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/deleteVersionConfig',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
formConfig: {
|
||||
schemas: [
|
||||
{
|
||||
field: 'appName',
|
||||
label: '软件名称',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'versionCode',
|
||||
label: '版本号',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'time',
|
||||
label: '发布时间',
|
||||
component: 'NsRangePicker',
|
||||
fieldMap: ['startTime', 'endTime'],
|
||||
componentProps: {
|
||||
valueFormat: 'YYYY-MM-DD',
|
||||
format: 'YYYY-MM-DD',
|
||||
},
|
||||
},
|
||||
],
|
||||
params: {},
|
||||
},
|
||||
rowKey: 'uuid',
|
||||
};
|
||||
const tableConfigH5 = {
|
||||
title: '应用内容版本管理',
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/queryVersionUpgradeConfigList',
|
||||
headerActions: [
|
||||
{
|
||||
label: '应用内容发版',
|
||||
name: 'H5Release',
|
||||
type: 'primary',
|
||||
handle,
|
||||
// route: '/contentManage/systemManage/appVersionManage/add',
|
||||
},
|
||||
],
|
||||
rowSelection: null,
|
||||
// scroll: { x: 1550 },
|
||||
params: {
|
||||
page: 0,
|
||||
pageSize: 10,
|
||||
platformId: 3,
|
||||
},
|
||||
columns: [
|
||||
{
|
||||
title: '软件名称',
|
||||
textNumber: 6,
|
||||
textEllipsis: true,
|
||||
dataIndex: 'appName',
|
||||
},
|
||||
{
|
||||
title: '版本号',
|
||||
textNumber: 4,
|
||||
dataIndex: 'versionCode',
|
||||
},
|
||||
{
|
||||
title: '下载地址',
|
||||
textNumber: 10,
|
||||
dataIndex: 'downUrl',
|
||||
textEllipsis: true,
|
||||
},
|
||||
{
|
||||
title: '是否最新版本',
|
||||
textNumber: 7,
|
||||
dataIndex: 'versionState',
|
||||
customRender: ({ value }) => {
|
||||
return ['否', '是'][value];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '更新类型',
|
||||
textNumber: 5,
|
||||
dataIndex: 'versionUpdateType',
|
||||
customRender: ({ value }) => {
|
||||
return ['无需更新', '建议更新', '强制更新'][value];
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: '发布时间',
|
||||
// textNumber: 9,
|
||||
dataIndex: 'updateTime',
|
||||
customRender: ({ value }) => {
|
||||
return dateUtil(value).format('YYYY-MM-DD HH:mm:ss');
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '操作人',
|
||||
textNumber: 5,
|
||||
dataIndex: 'updateUser',
|
||||
},
|
||||
],
|
||||
columnActions: {
|
||||
title: '操作',
|
||||
// width: 220,
|
||||
actions: [
|
||||
{
|
||||
label: '查看',
|
||||
dynamicParams: ['uuid', 'platformId'],
|
||||
name: 'AppVersionManageIndexDetail',
|
||||
route: '/contentManage/systemManage/appVersionManage/detail',
|
||||
},
|
||||
{
|
||||
label: '修改更新类型',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'AppVersionH5Change',
|
||||
children: [
|
||||
{
|
||||
label: '无需更新',
|
||||
dynamicParams: 'uuid',
|
||||
defaultParams: {
|
||||
versionUpdateType: 0,
|
||||
},
|
||||
name: 'AppVersionH5Change',
|
||||
confirm: true,
|
||||
isReload: true,
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/setVersionUpdateType',
|
||||
},
|
||||
{
|
||||
label: '建议更新',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'AppVersionH5Change',
|
||||
defaultParams: {
|
||||
versionUpdateType: 1,
|
||||
},
|
||||
confirm: true,
|
||||
isReload: true,
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/setVersionUpdateType',
|
||||
},
|
||||
{
|
||||
label: '强制更新',
|
||||
dynamicParams: 'uuid',
|
||||
name: 'AppVersionH5Change',
|
||||
defaultParams: {
|
||||
versionUpdateType: 2,
|
||||
},
|
||||
confirm: true,
|
||||
isReload: true,
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/setVersionUpdateType',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '编辑',
|
||||
dynamicParams: ['uuid', 'platformId'],
|
||||
name: 'AppVersionManageH5Edit',
|
||||
route: '/contentManage/systemManage/appVersionManage/edit',
|
||||
|
||||
// ifShow: (record) => {
|
||||
// return record.reserveStatus === 0;
|
||||
// },
|
||||
},
|
||||
|
||||
{
|
||||
label: '删除',
|
||||
dynamicParams: {
|
||||
uuid: 'uuid',
|
||||
},
|
||||
name: 'AppVersionIOSDelete',
|
||||
confirm: true,
|
||||
isReload: true,
|
||||
// ifShow: (record) => {
|
||||
// return record.reserveStatus === 0;
|
||||
// },
|
||||
api: '/api/op_com/objs/admin/VersionConfigOper/deleteVersionConfig',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
formConfig: {
|
||||
schemas: [
|
||||
{
|
||||
field: 'appName',
|
||||
label: '软件名称',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'versionCode',
|
||||
label: '版本号',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'time',
|
||||
label: '发布时间',
|
||||
component: 'NsRangePicker',
|
||||
fieldMap: ['startTime', 'endTime'],
|
||||
componentProps: {
|
||||
valueFormat: 'YYYY-MM-DD',
|
||||
format: 'YYYY-MM-DD',
|
||||
},
|
||||
},
|
||||
],
|
||||
params: {},
|
||||
},
|
||||
rowKey: 'uuid',
|
||||
};
|
||||
const tabPaneList = [
|
||||
{
|
||||
title: 'Android版本管理',
|
||||
bindData: tableConfigAndroid,
|
||||
},
|
||||
{
|
||||
title: 'IOS版本管理',
|
||||
bindData: tableConfigIOS,
|
||||
},
|
||||
{
|
||||
title: '应用内容版本管理',
|
||||
bindData: tableConfigH5,
|
||||
},
|
||||
];
|
||||
if (Cookies.get('type') == 'wechat') {
|
||||
tabPaneList.splice(0, 2);
|
||||
}
|
||||
|
||||
return {
|
||||
data,
|
||||
tabPaneList,
|
||||
qrCodeUrl,
|
||||
qrcodeVisible,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped></style>
|
||||
@@ -1,332 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<my-add-form
|
||||
formLayout="修改"
|
||||
:schemas="formSchema"
|
||||
:model="data"
|
||||
:title="uuid ? '编辑banner' : '新增banner'"
|
||||
:dataHandle="dataHandle"
|
||||
:api="
|
||||
uuid
|
||||
? '/api/op_com/objs/admin/AdvertisingMarketingOper/releaseBanner'
|
||||
: '/api/op_com/objs/admin/AdvertisingMarketingOper/releaseBanner'
|
||||
"
|
||||
draftApi="/api/op_com/objs/admin/AdvertisingMarketingOper/saveBanner" />
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref, provide } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import myAddForm from '../components/add-form.vue';
|
||||
import myURL from '../components/myURL.vue';
|
||||
import myRadio from '../components/radio.vue';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
import { dateUtil } from '/nerv-lib/util/date-util';
|
||||
import Cookies from 'js-cookie';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'BannerManageAdd',
|
||||
components: { myAddForm, myURL, myRadio },
|
||||
setup() {
|
||||
provide('components', () => {
|
||||
return { myURL, myRadio };
|
||||
});
|
||||
let data = ref({});
|
||||
// 投放渠道:0-管控平台-pc、3-小程序-wechat、5-APP-mobile
|
||||
const type = Cookies.get('type') || 'wechat';
|
||||
const typeBucket = {
|
||||
pc: 0,
|
||||
wechat: 3,
|
||||
mobile: 5,
|
||||
};
|
||||
const rouer = useRouter();
|
||||
let isDisabled = ref(false);
|
||||
const { uuid } = rouer.currentRoute.value.query;
|
||||
let fileUrl = ref();
|
||||
let fileUuid = ref();
|
||||
let defaultUrl = ref();
|
||||
let defaultPutChannel = ref();
|
||||
let defaultChecked = ref();
|
||||
let dynamicSelect = ref();
|
||||
let chooseChannel = ref();
|
||||
const formSchema = ref();
|
||||
const request = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
http
|
||||
.get('/api/op_com/objs/admin/AdvertisingMarketingOper/bannerDetail', { uuid })
|
||||
.then((res) => {
|
||||
const detail = res.data;
|
||||
|
||||
resolve(detail);
|
||||
})
|
||||
.catch((err) => {
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
let formSchemaDetail = [
|
||||
{
|
||||
field: 'uuid',
|
||||
defaultValue: uuid,
|
||||
},
|
||||
{
|
||||
field: 'field111',
|
||||
label: '',
|
||||
displayFormItem: false,
|
||||
class: 'ns-form-item-full',
|
||||
component: 'NsChildForm',
|
||||
componentProps: {
|
||||
title: 'banner内容',
|
||||
schemas: [
|
||||
{
|
||||
field: 'name',
|
||||
label: 'banner名称',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入banner名称',
|
||||
trigger: 'blur',
|
||||
},
|
||||
{ min: 0, max: 20, message: '最多可输入20个字符', trigger: 'change' },
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'dataType',
|
||||
label: 'banner类型',
|
||||
component: 'NsSelect',
|
||||
defaultValue: 99,
|
||||
show: false,
|
||||
},
|
||||
{
|
||||
field: 'fileUrl',
|
||||
component: 'NsUpload',
|
||||
label: 'banner图片',
|
||||
componentProps: {
|
||||
// 上传的地址
|
||||
url: '/api/fileunify/objs/admin/MaterialFile',
|
||||
// 上传的图片大小
|
||||
maxSize: 5242880,
|
||||
// 上传的图片类型
|
||||
fileType: ['jpg', 'png', 'jpeg'],
|
||||
// 展示图片数量
|
||||
count: 1,
|
||||
// 上传的文件类型,0-证书,1-图片,2-身份证件
|
||||
uploadType: 1,
|
||||
baseImageUrl: fileUrl,
|
||||
params: {
|
||||
groupCode: 'mobile_img',
|
||||
},
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '',
|
||||
trigger: 'blur',
|
||||
},
|
||||
{
|
||||
validator: async (rule, value) => {
|
||||
if (!value) {
|
||||
return Promise.reject('请上传一张banner图片');
|
||||
}
|
||||
},
|
||||
trigger: 'change',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'deliveryChannelList',
|
||||
defaultValue: [typeBucket[type]],
|
||||
},
|
||||
{
|
||||
field: 'finalUrl',
|
||||
label: '跳转路径',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入跳转路径',
|
||||
trigger: 'change',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'field111',
|
||||
label: '',
|
||||
displayFormItem: false,
|
||||
class: 'ns-form-item-full',
|
||||
component: 'NsChildForm',
|
||||
componentProps: {
|
||||
title: '投放规则',
|
||||
schemas: [
|
||||
{
|
||||
field: 'time',
|
||||
label: '投放时间',
|
||||
component: 'NsRangePicker',
|
||||
fieldMap: ['startTime', 'endTime'],
|
||||
componentProps: {
|
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
||||
format: 'YYYY-MM-DD HH:mm:ss',
|
||||
showTime: true,
|
||||
'show-time': {
|
||||
hideDisabledOptions: true,
|
||||
defaultValue: [
|
||||
dateUtil('00:00:00', 'HH:mm:ss'),
|
||||
dateUtil('23:59:59', 'HH:mm:ss'),
|
||||
],
|
||||
},
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择投放时间',
|
||||
type: 'array',
|
||||
trigger: 'change',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'field',
|
||||
label: '展示栏位',
|
||||
component: 'NsSelect',
|
||||
componentProps: {
|
||||
placeholder: '请选择',
|
||||
options: [
|
||||
{
|
||||
label: '1',
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
label: '2',
|
||||
value: 2,
|
||||
},
|
||||
{
|
||||
label: '3',
|
||||
value: 3,
|
||||
},
|
||||
{
|
||||
label: '4',
|
||||
value: 4,
|
||||
},
|
||||
{
|
||||
label: '5',
|
||||
value: 5,
|
||||
},
|
||||
{
|
||||
label: '6',
|
||||
value: 6,
|
||||
},
|
||||
],
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择展示栏位',
|
||||
type: 'number',
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'pushCrowd',
|
||||
defaultValue: 0,
|
||||
},
|
||||
// {
|
||||
// field: 'pushCrowd',
|
||||
// label: '推送人群',
|
||||
// component: 'NsSelect',
|
||||
// componentProps: {
|
||||
// placeholder: '请选择',
|
||||
// options: [
|
||||
// {
|
||||
// label: '所有人群',
|
||||
// value: 0,
|
||||
// },
|
||||
// {
|
||||
// label: '注册用户',
|
||||
// value: 1,
|
||||
// },
|
||||
// {
|
||||
// label: '新用户',
|
||||
// value: 2,
|
||||
// },
|
||||
// // {
|
||||
// // label: '白名单组',
|
||||
// // value: 5,
|
||||
// // },
|
||||
// ],
|
||||
// },
|
||||
// rules: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: '请选择推送人群',
|
||||
// type: 'number',
|
||||
// trigger: 'blur',
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
],
|
||||
},
|
||||
},
|
||||
];
|
||||
if (uuid) {
|
||||
request().then((res: any) => {
|
||||
data.value = res;
|
||||
fileUrl.value = res.fileUrl;
|
||||
defaultUrl.value = [res.httpUrl, res.wxAppletsUrl];
|
||||
defaultPutChannel.value = [
|
||||
res.wxAppletsUrl,
|
||||
// res.wxOpenUrl,
|
||||
// res.wstUrl,
|
||||
res.appUrl,
|
||||
// res.alipayUrl,
|
||||
];
|
||||
defaultChecked.value = res.deliveryChannel?.split(',');
|
||||
chooseChannel.value = res.deliveryChannel;
|
||||
data.value.time = [
|
||||
dateUtil(res.startTime).format('YYYY-MM-DD HH:mm:ss'),
|
||||
dateUtil(res.endTime).format('YYYY-MM-DD HH:mm:ss'),
|
||||
];
|
||||
data.value.finalUrl = res.appUrl || res.wxAppletsUrl || res.webUrl;
|
||||
formSchema.value = Object.assign([], formSchemaDetail);
|
||||
});
|
||||
} else {
|
||||
formSchema.value = Object.assign([], formSchemaDetail);
|
||||
}
|
||||
|
||||
const dataHandle = (data) => {
|
||||
const bucket = {
|
||||
pc: 'webUrl',
|
||||
wechat: 'wxAppletsUrl',
|
||||
mobile: 'appUrl',
|
||||
};
|
||||
data[bucket[type]] = data.finalUrl;
|
||||
return data;
|
||||
};
|
||||
return {
|
||||
data,
|
||||
formSchema,
|
||||
uuid,
|
||||
dataHandle,
|
||||
};
|
||||
},
|
||||
|
||||
methods: {},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
:deep(.ns-form .ns-child-form-title) {
|
||||
text-align: left;
|
||||
margin: 10 0 0 0 !important;
|
||||
}
|
||||
</style>
|
||||
@@ -1,109 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<customerDetail
|
||||
title="查看banner"
|
||||
api="/api/op_com/objs/admin/AdvertisingMarketingOper/bannerDetail"
|
||||
:detail="detail"
|
||||
checkApi="/api/op_com/objs/admin/AdvertisingMarketingOper/approvalBanner" />
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref } from 'vue';
|
||||
import customerDetail from '../components/customerDetail.vue';
|
||||
import { dateUtil } from '/nerv-lib/util/date-util';
|
||||
import { useRouter } from 'vue-router';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'BannerManageDetail',
|
||||
components: { customerDetail },
|
||||
setup() {
|
||||
const rouer = useRouter();
|
||||
let status = ref();
|
||||
status.value = rouer.currentRoute.value.query.pushCrowd;
|
||||
|
||||
const detail = reactive([
|
||||
{
|
||||
title: 'banner内容',
|
||||
items: [
|
||||
{
|
||||
label: 'banner名称',
|
||||
name: 'name',
|
||||
},
|
||||
{
|
||||
label: 'banner图片',
|
||||
name: 'fileUrl',
|
||||
type: 'image',
|
||||
},
|
||||
|
||||
{
|
||||
label: '跳转路径',
|
||||
name: 'url',
|
||||
format: (value, res) => {
|
||||
return res.appUrl || res.wxAppletsUrl || res.webUrl || '-';
|
||||
},
|
||||
},
|
||||
// {
|
||||
// label: '投放渠道',
|
||||
// name: 'pileType',
|
||||
// type: 'html',
|
||||
// format: (value, data) => {
|
||||
// let channel = ['', '', '皖事通H5', '小程序', '微信公众号', 'APP', '支付宝'];
|
||||
// let url = ['', '', 'wstUrl', 'wxAppletsUrl', 'wxOpenUrl', 'appUrl', 'appUrl'];
|
||||
// let final = '';
|
||||
// data.deliveryChannelList?.map((item) => {
|
||||
// final += `${channel[item]}: ${data[url[item]] || '-'}` + '<br />';
|
||||
// });
|
||||
// return final;
|
||||
// },
|
||||
// },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: '投放规则',
|
||||
items: [
|
||||
{
|
||||
label: '投放时间',
|
||||
name: 'pileCode',
|
||||
format: (value, data) => {
|
||||
return (
|
||||
dateUtil(data?.startTime).format('YYYY-MM-DD HH:mm:ss') +
|
||||
' - ' +
|
||||
dateUtil(data?.endTime).format('YYYY-MM-DD HH:mm:ss')
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '展示栏位',
|
||||
name: 'field',
|
||||
},
|
||||
// {
|
||||
// label: '推送人群',
|
||||
// name: 'pushCrowd',
|
||||
// format: (value, data) => {
|
||||
// return ['所有人群', '注册用户', '新用户', '白名单组'][value];
|
||||
// },
|
||||
// },
|
||||
],
|
||||
},
|
||||
]);
|
||||
// if (status.value == 3) {
|
||||
// detail[1]['items'].push({
|
||||
// label: '白名单组名称',
|
||||
// name: 'relationList',
|
||||
// format: (value, data) => {
|
||||
// let str = '';
|
||||
// data.relationList?.map((item, index) => {
|
||||
// str += item.label + `${index == data.relationList?.length - 1 ? '' : '、'}`;
|
||||
// });
|
||||
// return str;
|
||||
// },
|
||||
// });
|
||||
// }
|
||||
return {
|
||||
detail,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,303 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<ns-view-list-table v-bind="tableConfig" :model="data" rowKey="uuid">
|
||||
<template #bodyCell="{ record, column }">
|
||||
<template v-if="column.dataIndex === 'status'">
|
||||
<a-badge v-bind="checkStatus[record.status]" />
|
||||
</template>
|
||||
</template>
|
||||
</ns-view-list-table>
|
||||
</template>
|
||||
<script>
|
||||
import { defineComponent, reactive } from 'vue';
|
||||
import { dateUtil } from '/nerv-lib/util/date-util';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'BannerManageIndex',
|
||||
setup() {
|
||||
const data = reactive({});
|
||||
const tableConfig = {
|
||||
title: 'banner管理',
|
||||
api: '/api/op_com/objs/admin/AdvertisingMarketingOper/bannerList',
|
||||
params: {
|
||||
page: 0,
|
||||
pageSize: 10,
|
||||
},
|
||||
rowSelection: null,
|
||||
// scroll: { x: 1100 },
|
||||
columns: [
|
||||
{
|
||||
title: 'banner名称',
|
||||
// textNumber: 8,
|
||||
// textEllipsis: true,
|
||||
width: '30%',
|
||||
dataIndex: 'name',
|
||||
},
|
||||
{
|
||||
title: '投放时间段',
|
||||
// textNumber: 17,
|
||||
dataIndex: 'applyTime',
|
||||
customRender: ({ text, record }) => {
|
||||
return `${dateUtil(record.startTime).format('YYYY-MM-DD HH:mm:ss')} - ${dateUtil(
|
||||
record.endTime,
|
||||
).format('YYYY-MM-DD HH:mm:ss')}`;
|
||||
},
|
||||
},
|
||||
|
||||
// {
|
||||
// title: '投放渠道',
|
||||
// // textNumber: 5,
|
||||
// dataIndex: 'deliveryChannelList',
|
||||
// customRender: ({ text, record }) => {
|
||||
// return record.deliveryChannelText;
|
||||
// },
|
||||
// },
|
||||
// {
|
||||
// title: '推送人群',
|
||||
// textNumber: 5,
|
||||
// dataIndex: 'pushCrowd',
|
||||
// customRender: ({ text, record }) => {
|
||||
// return ['所有人群', '注册用户', '新用户', '', '', '白名单组'][text];
|
||||
// },
|
||||
// },
|
||||
{
|
||||
title: '状态',
|
||||
// textNumber: 13,
|
||||
dataIndex: 'status',
|
||||
},
|
||||
],
|
||||
columnActions: {
|
||||
title: '操作',
|
||||
// width: 50,
|
||||
// textNumber: 2,
|
||||
actionNumber: 2,
|
||||
// fixed: 'right',
|
||||
autoMergeAction: false,
|
||||
actions: [
|
||||
{
|
||||
label: '编辑',
|
||||
name: 'BannerManageEdit',
|
||||
dynamicParams: ['uuid', 'status'],
|
||||
ifShow: ({ status }) => status !== 2 && status !== 3 && status !== 5,
|
||||
route: '/contentManage/systemManage/bannerManage/edit',
|
||||
},
|
||||
{
|
||||
label: '查看',
|
||||
name: 'BannerManageDetail',
|
||||
dynamicParams: ['uuid', 'pushCrowd'],
|
||||
ifShow: ({ status }) => status === 3 || status === 2 || status === 5,
|
||||
route: '/contentManage/systemManage/bannerManage/detail',
|
||||
},
|
||||
{
|
||||
label: '审批',
|
||||
name: 'BannerManageDetailCheck',
|
||||
dynamicParams: ['uuid', 'pushCrowd', 'status'],
|
||||
ifShow: ({ status }) => status === 5,
|
||||
route: '/contentManage/systemManage/bannerManage/detailCheck',
|
||||
},
|
||||
{
|
||||
label: '失效',
|
||||
dynamicParams: 'uuid',
|
||||
ifShow: ({ status }) => status === 0 || status === 4,
|
||||
name: 'BannerManageInvalidation',
|
||||
confirm: true,
|
||||
isReload: true,
|
||||
api: '/api/op_com/objs/admin/AdvertisingMarketingOper/invalidationBanner',
|
||||
},
|
||||
{
|
||||
label: '删除',
|
||||
dynamicParams: 'uuid',
|
||||
ifShow: ({ status }) => status !== 0 && status !== 4 && status !== 5,
|
||||
name: 'BannerManageRemove',
|
||||
confirm: true,
|
||||
isReload: true,
|
||||
api: '/api/op_com/objs/admin/AdvertisingMarketingOper/deleteBanner',
|
||||
},
|
||||
],
|
||||
},
|
||||
headerActions: [
|
||||
{
|
||||
label: '新增',
|
||||
name: 'BannerManageAdd',
|
||||
type: 'primary',
|
||||
route: '/contentManage/systemManage/bannerManage/add',
|
||||
},
|
||||
],
|
||||
formConfig: {
|
||||
schemas: [
|
||||
{
|
||||
field: 'name',
|
||||
label: 'banner名称',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'time',
|
||||
label: '投放时间段',
|
||||
component: 'NsRangePicker',
|
||||
fieldMap: ['startTime', 'endTime'],
|
||||
componentProps: {
|
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
||||
format: 'YYYY-MM-DD HH:mm:ss',
|
||||
showTime: true,
|
||||
'show-time': {
|
||||
hideDisabledOptions: true,
|
||||
defaultValue: [
|
||||
dateUtil('00:00:00', 'HH:mm:ss'),
|
||||
dateUtil('23:59:59', 'HH:mm:ss'),
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
// {
|
||||
// field: 'deliveryChannel',
|
||||
// label: '投放渠道',
|
||||
// component: 'NsSelect',
|
||||
// defaultValue: '',
|
||||
// componentProps: {
|
||||
// options: [
|
||||
// {
|
||||
// label: '全部',
|
||||
// value: '',
|
||||
// },
|
||||
// {
|
||||
// label: '微信小程序',
|
||||
// value: 3,
|
||||
// },
|
||||
// {
|
||||
// label: '微信公众号',
|
||||
// value: 4,
|
||||
// },
|
||||
// {
|
||||
// label: '皖事通H5',
|
||||
// value: 2,
|
||||
// },
|
||||
// {
|
||||
// label: 'APP',
|
||||
// value: 5,
|
||||
// },
|
||||
// {
|
||||
// label: '支付宝',
|
||||
// value: 6,
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// },
|
||||
{
|
||||
field: 'status',
|
||||
label: '状态',
|
||||
component: 'NsSelect',
|
||||
defaultValue: '',
|
||||
componentProps: {
|
||||
options: [
|
||||
{
|
||||
label: '全部',
|
||||
value: '',
|
||||
},
|
||||
{
|
||||
label: '进行中',
|
||||
value: 0,
|
||||
},
|
||||
{
|
||||
label: '存草稿',
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
label: '已结束',
|
||||
value: 2,
|
||||
},
|
||||
{
|
||||
label: '已失效',
|
||||
value: 3,
|
||||
},
|
||||
{
|
||||
label: '未开始',
|
||||
value: 4,
|
||||
},
|
||||
{
|
||||
label: '待审核',
|
||||
value: 5,
|
||||
},
|
||||
{
|
||||
label: '审核驳回',
|
||||
value: 6,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
// {
|
||||
// field: 'pushCrowd',
|
||||
// label: '推送人群',
|
||||
// component: 'NsSelect',
|
||||
// defaultValue: '',
|
||||
// componentProps: {
|
||||
// options: [
|
||||
// {
|
||||
// label: '全部',
|
||||
// value: '',
|
||||
// },
|
||||
// {
|
||||
// label: '所有人群',
|
||||
// value: 0,
|
||||
// },
|
||||
// {
|
||||
// label: '注册用户',
|
||||
// value: 1,
|
||||
// },
|
||||
// {
|
||||
// label: '新用户',
|
||||
// value: 2,
|
||||
// },
|
||||
// {
|
||||
// label: '白名单组',
|
||||
// value: 3,
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// },
|
||||
],
|
||||
params: {},
|
||||
},
|
||||
rowKey: 'uuid',
|
||||
};
|
||||
const checkStatus = [
|
||||
{
|
||||
status: 'processing',
|
||||
text: '进行中',
|
||||
},
|
||||
{
|
||||
status: 'error',
|
||||
text: '存草稿',
|
||||
},
|
||||
{
|
||||
status: 'default',
|
||||
text: '已结束',
|
||||
},
|
||||
{
|
||||
color: '#000000',
|
||||
text: '已失效',
|
||||
},
|
||||
{
|
||||
status: 'success',
|
||||
text: '未开始',
|
||||
},
|
||||
{
|
||||
status: 'error',
|
||||
text: '待审核',
|
||||
},
|
||||
{
|
||||
color: '#000000',
|
||||
text: '审核驳回',
|
||||
},
|
||||
];
|
||||
return {
|
||||
tableConfig,
|
||||
data,
|
||||
checkStatus,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,150 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<a-spin :spinning="isLoading">
|
||||
<ns-page-header class="ns-page-header" style="margin-bottom: 0" :title="title">
|
||||
<template #extra>
|
||||
<!-- todo 隐藏取消-->
|
||||
<a-button @click="back">返回</a-button>
|
||||
<a-button
|
||||
v-if="!uuid || status == 1"
|
||||
:disabled="validateResult"
|
||||
style="margin-left: 10px"
|
||||
@click="submit('draftApi')"
|
||||
>存草稿</a-button
|
||||
>
|
||||
<a-button
|
||||
style="margin-left: 10px"
|
||||
:disabled="validateResult"
|
||||
type="primary"
|
||||
@click="submit('api')"
|
||||
>提交</a-button
|
||||
>
|
||||
</template>
|
||||
</ns-page-header>
|
||||
<div class="ns-add-form">
|
||||
<ns-form ref="mainRef" v-bind="getBindValue">
|
||||
<template #[item]="data" v-for="item in Object.keys($slots)">
|
||||
<slot :name="item" v-bind="data || {}"></slot>
|
||||
</template>
|
||||
</ns-form>
|
||||
</div>
|
||||
</a-spin>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, ref } from 'vue';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
import { NsMessage } from '/nerv-lib/component/message';
|
||||
import { useRouter } from 'vue-router';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'MyAddForm',
|
||||
props: {
|
||||
api: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
draftApi: {
|
||||
type: String,
|
||||
// required: true,
|
||||
},
|
||||
title: String,
|
||||
params: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
parkInfo: {
|
||||
type: Array,
|
||||
},
|
||||
backName: String,
|
||||
dataHandle: Function,
|
||||
},
|
||||
setup(props, { attrs }) {
|
||||
const mainRef = ref();
|
||||
const router = useRouter();
|
||||
let status = ref();
|
||||
let uuid = ref();
|
||||
status.value = router.currentRoute.value.query.status;
|
||||
uuid.value = router.currentRoute.value.query.uuid;
|
||||
const back = () => {
|
||||
if (props.backName) {
|
||||
router.push({ name: props.backName });
|
||||
// 清空缓存
|
||||
localStorage.removeItem('integral');
|
||||
} else {
|
||||
router.back();
|
||||
}
|
||||
};
|
||||
const isLoading = ref(false);
|
||||
|
||||
const getBindValue = computed(() => ({
|
||||
...attrs,
|
||||
...props,
|
||||
}));
|
||||
const validateResult = computed(() => {
|
||||
return !mainRef.value?.validateResult;
|
||||
});
|
||||
function submit(api) {
|
||||
mainRef.value
|
||||
.triggerSubmit()
|
||||
.then((data: any) => {
|
||||
console.log(data);
|
||||
|
||||
isLoading.value = true;
|
||||
// let datas = {
|
||||
// ...data,
|
||||
// activityParkList: data.isAllPark ? [] : props.parkInfo,
|
||||
// };
|
||||
data = props.dataHandle ? props.dataHandle(data) : data;
|
||||
|
||||
http
|
||||
.post(props[api], data)
|
||||
.then(() => {
|
||||
isLoading.value = false;
|
||||
NsMessage.success('操作成功', 1, () => {
|
||||
back();
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
isLoading.value = false;
|
||||
});
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
|
||||
return { mainRef, submit, getBindValue, isLoading, status, uuid, back, validateResult };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
//.ns-page-header {
|
||||
// margin: 0px 16px 20px 0;
|
||||
// border-bottom: 1px solid #f0f2f5;
|
||||
//}
|
||||
.ns-add-form .ns-vertical-form {
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
:deep(.ant-spin-nested-loading) {
|
||||
height: 100%;
|
||||
}
|
||||
.ant-spin-nested-loading {
|
||||
height: 100%;
|
||||
}
|
||||
:deep(.ant-spin-container) {
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
:deep(.ns-add-form) {
|
||||
height: calc(100% - 83px) !important;
|
||||
overflow: auto;
|
||||
}
|
||||
:deep(.ns-add-form .ns-vertical-form) {
|
||||
min-width: 420px;
|
||||
}
|
||||
</style>
|
||||
@@ -1,368 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<div class="ns-skeleton">
|
||||
<ns-page-header class="ns-page-header" :title="title">
|
||||
<template #extra>
|
||||
<ns-button @click="onBack()">返回</ns-button>
|
||||
<ns-button v-if="status == 5" type="primary" @click="checkReq('pass')">审核通过</ns-button>
|
||||
<ns-button v-if="status == 5" type="primary" @click="checkReq('reject')"
|
||||
>审核驳回</ns-button
|
||||
>
|
||||
</template>
|
||||
</ns-page-header>
|
||||
<div class="ns-detail-content">
|
||||
<Skeleton
|
||||
active
|
||||
v-for="(detailGroup, index) in getDetail"
|
||||
:key="index"
|
||||
:loading="loading"
|
||||
:paragraph="detailGroup.SkeletonParagraphProps"
|
||||
:title="SkeletonTitleProps">
|
||||
<div class="ns-detail">
|
||||
<a-descriptions :title="detailGroup.title">
|
||||
<template v-if="detailGroup.items">
|
||||
<template v-for="(item, index) in detailGroup.items" :key="index">
|
||||
<a-descriptions-item v-bind="item" v-if="item.ifShow">
|
||||
<!--默认-->
|
||||
|
||||
<template v-if="!item.type">
|
||||
<span class="ns-detail-text">{{ item.value ? item.value : '-' }}</span>
|
||||
</template>
|
||||
<!--富文本-->
|
||||
<template v-if="item.type == 'html'">
|
||||
<div class="ns-detail-html" v-html="item.value"></div>
|
||||
</template>
|
||||
<!--链接-->
|
||||
|
||||
<template v-if="item.type == 'link'">
|
||||
<a class="ns-detail-link" target="_blank" :href="item.value">发票链接 </a>
|
||||
</template>
|
||||
<!--图片 值为数组则为图片列表 可继续扩展-->
|
||||
|
||||
<template v-if="item.type === 'image'">
|
||||
<template v-if="typeof item.value == 'object'">
|
||||
<div
|
||||
class="ns-detail-image-list"
|
||||
v-for="src in item.value"
|
||||
:key="src"
|
||||
style="display: inline-block; margin: 0 5px 5px 0">
|
||||
<a-image
|
||||
:width="100"
|
||||
:src="src"
|
||||
fallback="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAADDCAYAAADQvc6UAAABRWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8LAwSDCIMogwMCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsis7PPOq3QdDFcvjV3jOD1boQVTPQrgSkktTgbSf4A4LbmgqISBgTEFyFYuLykAsTuAbJEioKOA7DkgdjqEvQHEToKwj4DVhAQ5A9k3gGyB5IxEoBmML4BsnSQk8XQkNtReEOBxcfXxUQg1Mjc0dyHgXNJBSWpFCYh2zi+oLMpMzyhRcASGUqqCZ16yno6CkYGRAQMDKMwhqj/fAIcloxgHQqxAjIHBEugw5sUIsSQpBobtQPdLciLEVJYzMPBHMDBsayhILEqEO4DxG0txmrERhM29nYGBddr//5/DGRjYNRkY/l7////39v///y4Dmn+LgeHANwDrkl1AuO+pmgAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAwqADAAQAAAABAAAAwwAAAAD9b/HnAAAHlklEQVR4Ae3dP3PTWBSGcbGzM6GCKqlIBRV0dHRJFarQ0eUT8LH4BnRU0NHR0UEFVdIlFRV7TzRksomPY8uykTk/zewQfKw/9znv4yvJynLv4uLiV2dBoDiBf4qP3/ARuCRABEFAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghgg0Aj8i0JO4OzsrPv69Wv+hi2qPHr0qNvf39+iI97soRIh4f3z58/u7du3SXX7Xt7Z2enevHmzfQe+oSN2apSAPj09TSrb+XKI/f379+08+A0cNRE2ANkupk+ACNPvkSPcAAEibACyXUyfABGm3yNHuAECRNgAZLuYPgEirKlHu7u7XdyytGwHAd8jjNyng4OD7vnz51dbPT8/7z58+NB9+/bt6jU/TI+AGWHEnrx48eJ/EsSmHzx40L18+fLyzxF3ZVMjEyDCiEDjMYZZS5wiPXnyZFbJaxMhQIQRGzHvWR7XCyOCXsOmiDAi1HmPMMQjDpbpEiDCiL358eNHurW/5SnWdIBbXiDCiA38/Pnzrce2YyZ4//59F3ePLNMl4PbpiL2J0L979+7yDtHDhw8vtzzvdGnEXdvUigSIsCLAWavHp/+qM0BcXMd/q25n1vF57TYBp0a3mUzilePj4+7k5KSLb6gt6ydAhPUzXnoPR0dHl79WGTNCfBnn1uvSCJdegQhLI1vvCk+fPu2ePXt2tZOYEV6/fn31dz+shwAR1sP1cqvLntbEN9MxA9xcYjsxS1jWR4AIa2Ibzx0tc44fYX/16lV6NDFLXH+YL32jwiACRBiEbf5KcXoTIsQSpzXx4N28Ja4BQoK7rgXiydbHjx/P25TaQAJEGAguWy0+2Q8PD6/Ki4R8EVl+bzBOnZY95fq9rj9zAkTI2SxdidBHqG9+skdw43borCXO/ZcJdraPWdv22uIEiLA4q7nvvCug8WTqzQveOH26fodo7g6uFe/a17W3+nFBAkRYENRdb1vkkz1CH9cPsVy/jrhr27PqMYvENYNlHAIesRiBYwRy0V+8iXP8+/fvX11Mr7L7ECueb/r48eMqm7FuI2BGWDEG8cm+7G3NEOfmdcTQw4h9/55lhm7DekRYKQPZF2ArbXTAyu4kDYB2YxUzwg0gi/41ztHnfQG26HbGel/crVrm7tNY+/1btkOEAZ2M05r4FB7r9GbAIdxaZYrHdOsgJ/wCEQY0J74TmOKnbxxT9n3FgGGWWsVdowHtjt9Nnvf7yQM2aZU/TIAIAxrw6dOnAWtZZcoEnBpNuTuObWMEiLAx1HY0ZQJEmHJ3HNvGCBBhY6jtaMoEiJB0Z29vL6ls58vxPcO8/zfrdo5qvKO+d3Fx8Wu8zf1dW4p/cPzLly/dtv9Ts/EbcvGAHhHyfBIhZ6NSiIBTo0LNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiEC/wGgKKC4YMA4TAAAAABJRU5ErkJggg==" />
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<a-image
|
||||
v-if="item.value"
|
||||
class="ns-detail-image"
|
||||
:width="64"
|
||||
:src="item.value"
|
||||
fallback="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAADDCAYAAADQvc6UAAABRWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8LAwSDCIMogwMCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsis7PPOq3QdDFcvjV3jOD1boQVTPQrgSkktTgbSf4A4LbmgqISBgTEFyFYuLykAsTuAbJEioKOA7DkgdjqEvQHEToKwj4DVhAQ5A9k3gGyB5IxEoBmML4BsnSQk8XQkNtReEOBxcfXxUQg1Mjc0dyHgXNJBSWpFCYh2zi+oLMpMzyhRcASGUqqCZ16yno6CkYGRAQMDKMwhqj/fAIcloxgHQqxAjIHBEugw5sUIsSQpBobtQPdLciLEVJYzMPBHMDBsayhILEqEO4DxG0txmrERhM29nYGBddr//5/DGRjYNRkY/l7////39v///y4Dmn+LgeHANwDrkl1AuO+pmgAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAwqADAAQAAAABAAAAwwAAAAD9b/HnAAAHlklEQVR4Ae3dP3PTWBSGcbGzM6GCKqlIBRV0dHRJFarQ0eUT8LH4BnRU0NHR0UEFVdIlFRV7TzRksomPY8uykTk/zewQfKw/9znv4yvJynLv4uLiV2dBoDiBf4qP3/ARuCRABEFAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghgg0Aj8i0JO4OzsrPv69Wv+hi2qPHr0qNvf39+iI97soRIh4f3z58/u7du3SXX7Xt7Z2enevHmzfQe+oSN2apSAPj09TSrb+XKI/f379+08+A0cNRE2ANkupk+ACNPvkSPcAAEibACyXUyfABGm3yNHuAECRNgAZLuYPgEirKlHu7u7XdyytGwHAd8jjNyng4OD7vnz51dbPT8/7z58+NB9+/bt6jU/TI+AGWHEnrx48eJ/EsSmHzx40L18+fLyzxF3ZVMjEyDCiEDjMYZZS5wiPXnyZFbJaxMhQIQRGzHvWR7XCyOCXsOmiDAi1HmPMMQjDpbpEiDCiL358eNHurW/5SnWdIBbXiDCiA38/Pnzrce2YyZ4//59F3ePLNMl4PbpiL2J0L979+7yDtHDhw8vtzzvdGnEXdvUigSIsCLAWavHp/+qM0BcXMd/q25n1vF57TYBp0a3mUzilePj4+7k5KSLb6gt6ydAhPUzXnoPR0dHl79WGTNCfBnn1uvSCJdegQhLI1vvCk+fPu2ePXt2tZOYEV6/fn31dz+shwAR1sP1cqvLntbEN9MxA9xcYjsxS1jWR4AIa2Ibzx0tc44fYX/16lV6NDFLXH+YL32jwiACRBiEbf5KcXoTIsQSpzXx4N28Ja4BQoK7rgXiydbHjx/P25TaQAJEGAguWy0+2Q8PD6/Ki4R8EVl+bzBOnZY95fq9rj9zAkTI2SxdidBHqG9+skdw43borCXO/ZcJdraPWdv22uIEiLA4q7nvvCug8WTqzQveOH26fodo7g6uFe/a17W3+nFBAkRYENRdb1vkkz1CH9cPsVy/jrhr27PqMYvENYNlHAIesRiBYwRy0V+8iXP8+/fvX11Mr7L7ECueb/r48eMqm7FuI2BGWDEG8cm+7G3NEOfmdcTQw4h9/55lhm7DekRYKQPZF2ArbXTAyu4kDYB2YxUzwg0gi/41ztHnfQG26HbGel/crVrm7tNY+/1btkOEAZ2M05r4FB7r9GbAIdxaZYrHdOsgJ/wCEQY0J74TmOKnbxxT9n3FgGGWWsVdowHtjt9Nnvf7yQM2aZU/TIAIAxrw6dOnAWtZZcoEnBpNuTuObWMEiLAx1HY0ZQJEmHJ3HNvGCBBhY6jtaMoEiJB0Z29vL6ls58vxPcO8/zfrdo5qvKO+d3Fx8Wu8zf1dW4p/cPzLly/dtv9Ts/EbcvGAHhHyfBIhZ6NSiIBTo0LNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiEC/wGgKKC4YMA4TAAAAABJRU5ErkJggg==" />
|
||||
<span v-else>-</span>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
<!--表格-->
|
||||
<template v-else-if="item.type === 'table'">
|
||||
<ns-basic-table
|
||||
class="ns-detail-table"
|
||||
:dataSource="dataRef[item.props.listField]"
|
||||
:columns="item.props.columns"
|
||||
:pagination="false"
|
||||
:rowKey="item.props.rowKey" />
|
||||
</template>
|
||||
|
||||
<!--表格-->
|
||||
<template v-else-if="item.type === 'NsViewListTable'">
|
||||
<NsViewListTable v-bind="item.props.tableConfig" />
|
||||
</template>
|
||||
|
||||
<template v-for="slot in Object.keys($slots)" :key="slot">
|
||||
<div v-if="item.type === slot" :style="item.style" :class="`ns-detail-${slot}`">
|
||||
<slot :name="slot" v-bind="item || {}"> </slot>
|
||||
</div>
|
||||
</template>
|
||||
</a-descriptions-item>
|
||||
</template>
|
||||
</template>
|
||||
</a-descriptions>
|
||||
</div>
|
||||
</Skeleton>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, ref, watch, PropType, createVNode } from 'vue';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { cloneDeep, get, isFunction, isUndefined } from 'lodash-es';
|
||||
import { Skeleton } from 'ant-design-vue';
|
||||
import { NsModal } from '/nerv-lib/component/modal';
|
||||
import { NsMessage } from '/nerv-lib/component/message';
|
||||
|
||||
export interface DetailItem {
|
||||
label: string;
|
||||
name: string;
|
||||
ifShow?: Boolean | Function;
|
||||
value?: string;
|
||||
format?: Function;
|
||||
type?: string; // 现支持image
|
||||
}
|
||||
|
||||
export interface DetailGroup {
|
||||
title: string;
|
||||
items: Array<DetailItem>;
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
name: 'NsViewDetail',
|
||||
components: { Skeleton },
|
||||
props: {
|
||||
detail: {
|
||||
type: Array as PropType<DetailGroup[]>,
|
||||
default: () => [],
|
||||
},
|
||||
api: {
|
||||
type: String,
|
||||
},
|
||||
checkApi: {
|
||||
type: String,
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
default: '查看',
|
||||
},
|
||||
formLayout: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
dataHandle: Function,
|
||||
},
|
||||
setup(props) {
|
||||
const SkeletonTitleProps = ref({
|
||||
width: 150,
|
||||
});
|
||||
const router = useRouter();
|
||||
const status = ref();
|
||||
const { query } = router.currentRoute.value;
|
||||
status.value = query.status;
|
||||
// const check = query.status == 5 ? true : false;
|
||||
const dataRef = ref([]);
|
||||
const textTitle = props.title?.slice(2);
|
||||
const checkReq = (type) => {
|
||||
const text = {
|
||||
pass: {
|
||||
title: '审核通过',
|
||||
content: `审核通过后将发布${textTitle}`,
|
||||
value: 1,
|
||||
},
|
||||
reject: {
|
||||
title: '审核驳回',
|
||||
content: `确认驳回该${textTitle}发布内容?`,
|
||||
value: 0,
|
||||
},
|
||||
};
|
||||
NsModal.confirm({
|
||||
title: createVNode('div', { style: 'font-weight:600;font-size: 16px' }, text[type].title),
|
||||
content: createVNode('div', { style: 'font-size: 14px' }, text[type].content),
|
||||
// icon: createVNode(ExclamationCircleOutlined),
|
||||
okText: '确认',
|
||||
cancelText: '取消',
|
||||
onOk() {
|
||||
req(text[type].value);
|
||||
},
|
||||
onCancel() {},
|
||||
});
|
||||
};
|
||||
const req = (val) => {
|
||||
const data = {
|
||||
...query,
|
||||
approvalStatus: val,
|
||||
};
|
||||
http.post(props.checkApi, data).then((res) => {
|
||||
NsMessage.success('操作成功', 1, () => {
|
||||
router.back();
|
||||
});
|
||||
});
|
||||
};
|
||||
const formatTable = (a) => {
|
||||
if (a) {
|
||||
// content = content.replace(/<br[^>]*\/>/gi, '');
|
||||
a = a.replace(/<th[^<>]*>/gi, '<th style="background-color:#F0F3F4;padding:5px 5px">');
|
||||
a = a.replace(/<td[^<>]*>/gi, '<td style="padding:5px 5px">');
|
||||
a = a.replace(
|
||||
/<table[^>]*>/gi,
|
||||
'<table cellpadding="0" cellspacing="0" max-width="100%" border="1" style=" text-align:center;border: 1px solid #ccc;"',
|
||||
);
|
||||
return a;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
let loading = ref<boolean>(true);
|
||||
function request() {
|
||||
// const { query } = route;
|
||||
http.get(props.api, query).then((res) => {
|
||||
// dataRef.value = res.data;
|
||||
dataRef.value = props.dataHandle ? props.dataHandle(res.data) : res.data;
|
||||
loading.value = false;
|
||||
});
|
||||
}
|
||||
|
||||
request();
|
||||
|
||||
const getDetail = computed(() => {
|
||||
const detail = cloneDeep(props.detail);
|
||||
return (detail as Array<DetailGroup>).map((group: DetailGroup) => {
|
||||
const SkeletonWidth = [];
|
||||
for (let i = 0; i < group.items.length; i++) {
|
||||
if (group.items[i].type === 'table') {
|
||||
SkeletonWidth.push('80%');
|
||||
} else {
|
||||
SkeletonWidth.push('30%');
|
||||
}
|
||||
}
|
||||
const { title, items } = group;
|
||||
return {
|
||||
title: title,
|
||||
items: items.map((item) => {
|
||||
if (!loading.value) {
|
||||
const { ifShow } = item;
|
||||
item.value = get(dataRef.value, item.name);
|
||||
item.ifShow = isFunction(ifShow)
|
||||
? ifShow(dataRef.value)
|
||||
: isUndefined(ifShow)
|
||||
? true
|
||||
: ifShow;
|
||||
if (item.format) {
|
||||
item.value = item.format(item.value, dataRef.value);
|
||||
}
|
||||
}
|
||||
return item;
|
||||
}),
|
||||
SkeletonParagraphProps: {
|
||||
rows: items.length,
|
||||
width: SkeletonWidth,
|
||||
},
|
||||
SkeletonTitleProps: {
|
||||
width: 150,
|
||||
},
|
||||
};
|
||||
});
|
||||
});
|
||||
return {
|
||||
request,
|
||||
getDetail,
|
||||
loading,
|
||||
SkeletonTitleProps,
|
||||
formatTable,
|
||||
checkReq,
|
||||
status,
|
||||
};
|
||||
},
|
||||
// created() {
|
||||
// this.request();
|
||||
// },
|
||||
methods: {
|
||||
onBack() {
|
||||
this.$router.back();
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.ns-detail-content {
|
||||
padding: 0 24px;
|
||||
}
|
||||
|
||||
:deep(.ant-skeleton-paragraph) {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
:deep(.ant-skeleton-paragraph li:nth-child(n)) {
|
||||
display: block;
|
||||
margin-right: 4%;
|
||||
margin-top: 16px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
:deep(.ant-skeleton-paragraph li:nth-child(3n + 3)) {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
:deep(.ant-skeleton-content) {
|
||||
padding: 0 8px 10px 10px;
|
||||
}
|
||||
|
||||
:deep(.ant-descriptions-item-label),
|
||||
:deep(.ant-descriptions-item-content) {
|
||||
line-height: 22px;
|
||||
}
|
||||
|
||||
:deep(.ant-descriptions-view) {
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
:deep(.ant-descriptions-item) {
|
||||
padding-right: 20px;
|
||||
&:nth-child(2n) {
|
||||
padding-left: 20px;
|
||||
}
|
||||
&:nth-child(3n) {
|
||||
padding-left: 20px;
|
||||
padding-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.ns-detail {
|
||||
border-bottom: 1px solid #ecedef;
|
||||
&:last-child {
|
||||
border-bottom-width: 0;
|
||||
}
|
||||
:deep(.ant-descriptions-header) {
|
||||
margin-top: 24px;
|
||||
margin-bottom: 24px;
|
||||
.ant-descriptions-title {
|
||||
line-height: 16px;
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.ns-detail-html {
|
||||
:deep(table) {
|
||||
border-top: 1px solid #ffffff;
|
||||
border-left: 1px solid #ffffff;
|
||||
:deep(p) {
|
||||
font-size: 12px;
|
||||
color: #898e91;
|
||||
}
|
||||
}
|
||||
:deep(th) {
|
||||
border-right: 1px solid #ffffff;
|
||||
font-size: 13px;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
font-weight: normal;
|
||||
background: #eff0f2;
|
||||
}
|
||||
:deep(td) {
|
||||
border-top: 1px solid #ffffff;
|
||||
border-right: 1px solid #ffffff;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
font-size: 12px;
|
||||
color: #606060;
|
||||
text-align: center;
|
||||
:deep(text) {
|
||||
border-bottom: 1px solid #ffffff;
|
||||
}
|
||||
background: rgba(240, 242, 245, 0.5);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,178 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<a-form-item-rest>
|
||||
<div class="urlInput" style="margin-bottom: 16px" v-for="(item, index) in url" :key="index">
|
||||
<ns-checkbox
|
||||
v-if="$attrs.isMultiSelect"
|
||||
style="margin-bottom: 10px"
|
||||
v-model:checked="checked[index]"
|
||||
>{{ $attrs.multiSelectTitle[index]['label'] }}</ns-checkbox
|
||||
>
|
||||
<a-input
|
||||
v-model:value="urlArr[index].middle"
|
||||
:disabled="$attrs.isMultiSelect && !checked[index]"
|
||||
:placeholder="item.placeholder"
|
||||
allowClear
|
||||
>
|
||||
<!-- 需求优化,取消select -->
|
||||
<!-- <template #addonBefore>
|
||||
<a-select
|
||||
v-model:value="urlArr[index].before"
|
||||
:disabled="$attrs.isMultiSelect && !checked[index]"
|
||||
style="min-width: 90px"
|
||||
>
|
||||
<a-select-option v-for="item2 in item.addonBefore" :value="item2" :key="item2">{{
|
||||
item2
|
||||
}}</a-select-option>
|
||||
</a-select>
|
||||
</template>
|
||||
<template #addonAfter>
|
||||
<a-select
|
||||
v-model:value="urlArr[index].after"
|
||||
:disabled="$attrs.isMultiSelect && !checked[index]"
|
||||
style="min-width: 60px"
|
||||
>
|
||||
<a-select-option v-for="item2 in item.addonAfter" :value="item2" :key="item2">{{
|
||||
item2
|
||||
}}</a-select-option>
|
||||
</a-select>
|
||||
</template> -->
|
||||
</a-input>
|
||||
</div>
|
||||
</a-form-item-rest>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, watch, ref, nextTick } from 'vue';
|
||||
export default defineComponent({
|
||||
emits: ['change'],
|
||||
setup(props, { attrs, emit }) {
|
||||
// console.log(props, attrs);
|
||||
let checked = reactive([]);
|
||||
let url = reactive(attrs.url);
|
||||
let emitArr = reactive([]);
|
||||
const { defaultUrl, defaultChecked } = attrs;
|
||||
// console.log(defaultUrl);
|
||||
let urlArr = ref([]);
|
||||
url?.map((item) => {
|
||||
urlArr.value.push({
|
||||
before: item['addonBefore'][item['defaultAddonBefore'] || attrs.defaultAddonBefore || 0],
|
||||
middle: '',
|
||||
after: item['addonAfter'][item['defaultAddonAfter'] || attrs.defaultAddonAfter || 0],
|
||||
});
|
||||
});
|
||||
if (defaultUrl) {
|
||||
let propArr = [];
|
||||
let emitMiddle = ref();
|
||||
defaultUrl?.map((item2, index) => {
|
||||
// 需求更改
|
||||
// const beforeIndex =
|
||||
// item2?.indexOf('//') !== -1 ? item2?.indexOf('//') + 1 : item2?.indexOf('//');
|
||||
// const afterIndex = item2?.lastIndexOf('.');
|
||||
// const before = item2?.slice(0, beforeIndex + 1) || urlArr.value[index].before;
|
||||
// const after = item2?.slice(afterIndex) || urlArr.value[index].after;
|
||||
// const middle = item2?.slice(beforeIndex + 1, afterIndex);
|
||||
propArr.push({
|
||||
before: '',
|
||||
middle: item2,
|
||||
after: '',
|
||||
});
|
||||
});
|
||||
urlArr.value = propArr;
|
||||
} else {
|
||||
// url?.map((item) => {
|
||||
// urlArr.value.push({
|
||||
// before:
|
||||
// item['addonBefore'][item['defaultAddonBefore'] || attrs.defaultAddonBefore || 0],
|
||||
// middle: '',
|
||||
// after: item['addonAfter'][item['defaultAddonAfter'] || attrs.defaultAddonAfter || 0],
|
||||
// });
|
||||
// });
|
||||
}
|
||||
|
||||
const getCheckArr = (chooseItem) => {
|
||||
attrs.multiSelectTitle.map((item, index) => {
|
||||
defaultChecked
|
||||
? item.value == chooseItem
|
||||
? (checked[index] = true)
|
||||
: ''
|
||||
: (checked[index] = false);
|
||||
});
|
||||
};
|
||||
attrs.isMultiSelect ? getCheckArr() : '';
|
||||
const isChecked = () => {
|
||||
defaultChecked.map((chooseItem) => {
|
||||
getCheckArr(chooseItem);
|
||||
// checked[item] = true;
|
||||
});
|
||||
};
|
||||
defaultChecked ? isChecked() : '';
|
||||
|
||||
const urlJoin = (item) => {
|
||||
if (item.middle) {
|
||||
return Object.values(item).join('');
|
||||
}
|
||||
return '';
|
||||
};
|
||||
const putChancel = () => {
|
||||
let arr = [];
|
||||
checked.map((item, index) => {
|
||||
item ? arr.push(attrs.multiSelectTitle[index]['value']) : '';
|
||||
});
|
||||
return arr;
|
||||
};
|
||||
watch(
|
||||
() => attrs.url,
|
||||
(value) => {
|
||||
url = attrs.url;
|
||||
},
|
||||
{ deep: true }
|
||||
);
|
||||
watch(
|
||||
() => urlArr.value,
|
||||
(value) => {
|
||||
emitArr = reactive([]);
|
||||
// console.log('value', value);
|
||||
|
||||
value.map((item) => {
|
||||
// 需求更改
|
||||
// emitArr.push(urlJoin(item));
|
||||
emitArr.push(item.middle);
|
||||
});
|
||||
if (attrs.isMultiSelect) {
|
||||
emit('change', [putChancel(), ...emitArr]);
|
||||
// console.log('change', putChancel(), emitArr);
|
||||
} else {
|
||||
emit('change', emitArr);
|
||||
// console.log('change', emitArr);
|
||||
}
|
||||
},
|
||||
{ deep: true, immediate: defaultUrl ? true : false }
|
||||
);
|
||||
watch(
|
||||
() => checked,
|
||||
(value) => {
|
||||
// console.log('value', value);
|
||||
|
||||
// emitArr = reactive([]);
|
||||
// value.map((item) => {
|
||||
// emitArr.push(urlJoin(item));
|
||||
// });
|
||||
emit('change', [putChancel(), ...emitArr]);
|
||||
// console.log('change', putChancel(), emitArr);
|
||||
},
|
||||
{ deep: true }
|
||||
);
|
||||
return {
|
||||
url,
|
||||
urlArr,
|
||||
checked,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
.urlInput:last-child {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
</style>
|
||||
@@ -1,122 +0,0 @@
|
||||
<template>
|
||||
<a-radio-group v-model:value="value">
|
||||
<a-radio v-for="(item, index) in $attrs.valueOptions" :value="item.value" :key="index">
|
||||
{{ item.label }}
|
||||
</a-radio>
|
||||
<div v-if="value == 2" style="margin-top: 10px; font-size: 14px">
|
||||
<!-- <a-radio> -->
|
||||
<div v-if="$attrs.customDay">
|
||||
{{ $attrs.customDay.textBefore }}
|
||||
|
||||
<a-input-number
|
||||
:min="1"
|
||||
:placeholder="$attrs.customDay.placeholder"
|
||||
v-model:value="customInput"
|
||||
:disabled="customSelect ? true : false"
|
||||
style="width: 200px; margin-left: 5px"
|
||||
allowClear
|
||||
onkeyup="this.value= this.value.match(/[1-9]\d*/) ? this.value.match(/[1-9]\d*/)[0] : ''"
|
||||
onblur="this.value= this.value.match(/[1-9]\d*/) ? this.value.match(/[1-9]\d*/)[0] : ''"
|
||||
onfocus="this.value= this.value.match(/[1-9]\d*/) ? this.value.match(/[1-9]\d*/)[0] : ''"
|
||||
/>
|
||||
{{ $attrs.customDay.textAfter }}
|
||||
</div>
|
||||
<!-- </a-radio> -->
|
||||
<!-- <a-radio style="margin-top: 10px"> -->
|
||||
<div v-if="$attrs.customWeek" style="margin-top: 10px">
|
||||
{{ $attrs.customWeek.textBefore }}
|
||||
<a-select
|
||||
:options="$attrs.customWeek.options"
|
||||
:placeholder="$attrs.customWeek.placeholder"
|
||||
v-model:value="customSelect"
|
||||
:disabled="customInput ? true : false"
|
||||
style="width: 200px; margin-left: 5px"
|
||||
allowClear
|
||||
/>
|
||||
{{ $attrs.customWeek.textAfter }}
|
||||
</div>
|
||||
<!-- </a-radio> -->
|
||||
</div>
|
||||
</a-radio-group>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref, watch } from 'vue';
|
||||
export default defineComponent({
|
||||
emits: ['change'],
|
||||
setup(props, { emit, attrs }) {
|
||||
// console.log(attrs);
|
||||
|
||||
// 选中的类型
|
||||
const value = ref<number>(attrs.defaultRadio && attrs.defaultRadio[0]);
|
||||
|
||||
const changeIndex = ref<number>();
|
||||
// if (attrs.defaultRadio && String(attrs.defaultRadio)) {
|
||||
// value.value = Number(attrs.defaultRadios);
|
||||
// changeIndex.value = Number(attrs.defaultRadios);
|
||||
// }
|
||||
// 自定义频率的日 周
|
||||
const typeValue = ref<number>(attrs.defaultRadio && attrs.defaultRadio[1]);
|
||||
const customInput = ref();
|
||||
const customSelect = ref();
|
||||
const customDisabled = ref();
|
||||
if (attrs.defaultRadio) {
|
||||
typeValue.value == 0
|
||||
? (customInput.value = attrs.defaultRadio[2])
|
||||
: (customSelect.value = attrs.defaultRadio[2]);
|
||||
}
|
||||
const emitValue = () => {
|
||||
const emitArr = [
|
||||
value.value,
|
||||
typeValue.value,
|
||||
typeValue.value == 0 ? customInput.value : customSelect.value,
|
||||
];
|
||||
if (value.value !== 2) {
|
||||
delete emitArr[1];
|
||||
delete emitArr[2];
|
||||
}
|
||||
emit('change', emitArr);
|
||||
};
|
||||
watch(
|
||||
value,
|
||||
(newVal, oldVal) => {
|
||||
emitValue();
|
||||
},
|
||||
{ immediate: attrs.defaultRadio ? true : false }
|
||||
);
|
||||
watch(customInput, (newVal, oldVal) => {
|
||||
if (value.value == 2) {
|
||||
typeValue.value = customInput.value ? 0 : customSelect.value ? 1 : '';
|
||||
emitValue();
|
||||
}
|
||||
});
|
||||
watch(customSelect, (newVal, oldVal) => {
|
||||
if (value.value == 2) {
|
||||
typeValue.value = customInput.value ? 0 : customSelect.value ? 1 : '';
|
||||
emitValue();
|
||||
}
|
||||
});
|
||||
return {
|
||||
customInput,
|
||||
customDisabled,
|
||||
customSelect,
|
||||
value,
|
||||
changeIndex,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
:deep(.ant-radio-group) {
|
||||
font-size: 14px;
|
||||
}
|
||||
:deep(.ant-radio-wrapper) {
|
||||
display: inline-block !important;
|
||||
}
|
||||
:deep(.ant-radio) {
|
||||
top: 3px;
|
||||
}
|
||||
:deep(.ant-radio-inner::after) {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
}
|
||||
</style>
|
||||
@@ -1,169 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<ns-view-list-table v-bind="tableConfig" :model="data" rowKey="uuid" />
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive } from 'vue';
|
||||
import { dateUtil } from '/nerv-lib/util/date-util';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'LogManageIndex',
|
||||
setup() {
|
||||
const data = reactive({});
|
||||
const tableConfig = {
|
||||
title: '日志管理',
|
||||
api: '/api/op_com/objs/admin/LoggerOper',
|
||||
headerActions: [{}],
|
||||
params: {
|
||||
page: 0,
|
||||
pageSize: 10,
|
||||
},
|
||||
rowSelection: null,
|
||||
formConfig: {
|
||||
schemas: [
|
||||
{
|
||||
field: 'opType',
|
||||
label: '操作类型',
|
||||
component: 'NsSelect',
|
||||
defaultValue: '',
|
||||
componentProps: {
|
||||
options: [
|
||||
{
|
||||
label: '全部',
|
||||
value: '',
|
||||
},
|
||||
{
|
||||
label: '登录',
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
label: '退出',
|
||||
value: 2,
|
||||
},
|
||||
{
|
||||
label: '新增',
|
||||
value: 3,
|
||||
},
|
||||
{
|
||||
label: '删除',
|
||||
value: 4,
|
||||
},
|
||||
{
|
||||
label: '更新',
|
||||
value: 5,
|
||||
},
|
||||
{
|
||||
label: '导入',
|
||||
value: 6,
|
||||
},
|
||||
{
|
||||
label: '导出',
|
||||
value: 7,
|
||||
},
|
||||
{
|
||||
label: '上传',
|
||||
value: 8,
|
||||
},
|
||||
{
|
||||
label: '下载',
|
||||
value: 9,
|
||||
},
|
||||
{
|
||||
label: '其他',
|
||||
value: 10,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'ip',
|
||||
label: 'IP地址',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'time',
|
||||
label: '操作时间',
|
||||
component: 'NsRangePicker',
|
||||
fieldMap: ['startTime', 'endTime'],
|
||||
componentProps: {
|
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
||||
format: 'YYYY-MM-DD HH:mm:ss',
|
||||
showTime: true,
|
||||
'show-time': {
|
||||
hideDisabledOptions: true,
|
||||
defaultValue: [
|
||||
dateUtil('00:00:00', 'HH:mm:ss'),
|
||||
dateUtil('23:59:59', 'HH:mm:ss'),
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
params: {},
|
||||
},
|
||||
columns: [
|
||||
{
|
||||
title: '操作人',
|
||||
textNumber: 6,
|
||||
dataIndex: 'accountName',
|
||||
},
|
||||
{
|
||||
title: '操作类型',
|
||||
// width: 150,
|
||||
textNumber: 6,
|
||||
dataIndex: 'opType',
|
||||
customRender: ({ text, record }) => {
|
||||
return [
|
||||
'',
|
||||
'登录',
|
||||
'退出',
|
||||
'新增',
|
||||
'删除',
|
||||
'更新',
|
||||
'导入',
|
||||
'导出',
|
||||
'上传',
|
||||
'下载',
|
||||
'其他',
|
||||
][text];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '日志内容',
|
||||
// width: 150,
|
||||
dataIndex: 'description',
|
||||
},
|
||||
{
|
||||
title: '操作时间',
|
||||
// width: 160,
|
||||
dataIndex: 'opTime',
|
||||
customRender: (value) => {
|
||||
return value.text && dateUtil(value.text).format('YYYY-MM-DD HH:mm:ss');
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '浏览器',
|
||||
// width: 150,
|
||||
// textNumber: 4,
|
||||
dataIndex: 'browserName',
|
||||
},
|
||||
{
|
||||
title: 'IP地址',
|
||||
// width: 150,
|
||||
dataIndex: 'ip',
|
||||
},
|
||||
],
|
||||
rowKey: 'uuid',
|
||||
};
|
||||
|
||||
return {
|
||||
tableConfig,
|
||||
data,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,336 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<my-add-form
|
||||
formLayout="修改"
|
||||
:schemas="formSchema"
|
||||
:model="data"
|
||||
:title="uuid ? '编辑开屏广告' : '新增开屏广告'"
|
||||
:api="
|
||||
uuid
|
||||
? '/api/op_com/objs/admin/AdvertisingMarketingOper/releaseOpenScreen'
|
||||
: '/api/op_com/objs/admin/AdvertisingMarketingOper/releaseOpenScreen'
|
||||
"
|
||||
draftApi="/api/op_com/objs/admin/AdvertisingMarketingOper/saveOpenScreen" />
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import myAddForm from '../components/add-form.vue';
|
||||
import { http } from '/nerv-lib/util/http';
|
||||
import { dateUtil } from '/nerv-lib/util/date-util';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'OpenScreenManageAdd',
|
||||
components: { myAddForm },
|
||||
setup() {
|
||||
let data = ref({});
|
||||
const rouer = useRouter();
|
||||
const { uuid } = rouer.currentRoute.value.query;
|
||||
let fileUrl = ref();
|
||||
const formSchema = ref();
|
||||
const request = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
http
|
||||
.get('/api/op_com/objs/admin/AdvertisingMarketingOper/openScreenDetail', { uuid })
|
||||
.then((res) => {
|
||||
const detail = res.data;
|
||||
|
||||
resolve(detail);
|
||||
})
|
||||
.catch((err) => {
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
let formSchemaDetail = [
|
||||
{
|
||||
field: 'uuid',
|
||||
defaultValue: uuid,
|
||||
},
|
||||
{
|
||||
field: 'field111',
|
||||
label: '',
|
||||
displayFormItem: false,
|
||||
class: 'ns-form-item-full',
|
||||
component: 'NsChildForm',
|
||||
componentProps: {
|
||||
title: '开屏广告内容',
|
||||
schemas: [
|
||||
{
|
||||
field: 'name',
|
||||
label: '开屏广告名称',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入开屏广告名称',
|
||||
trigger: 'blur',
|
||||
},
|
||||
{ min: 0, max: 20, message: '最多可输入20个字符', trigger: 'change' },
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'fileUrl',
|
||||
component: 'NsUpload',
|
||||
label: '开屏广告图片',
|
||||
componentProps: {
|
||||
// 上传的地址
|
||||
url: '/api/fileunify/objs/admin/MaterialFile',
|
||||
// 上传的图片大小
|
||||
maxSize: 5242880,
|
||||
// 上传的图片类型
|
||||
fileType: ['jpg', 'png', 'jpeg'],
|
||||
// 展示图片数量
|
||||
count: 1,
|
||||
// 上传的文件类型,0-证书,1-图片,2-身份证件
|
||||
uploadType: 1,
|
||||
baseImageUrl: fileUrl,
|
||||
|
||||
params: {
|
||||
groupCode: 'mobile_img',
|
||||
},
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '',
|
||||
// type: 'array',
|
||||
trigger: 'change',
|
||||
},
|
||||
{
|
||||
validator: async (rule, value) => {
|
||||
// // console.log('validator', value);
|
||||
if (!value) {
|
||||
return Promise.reject('请上传一张banner图片');
|
||||
}
|
||||
},
|
||||
trigger: 'change',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'httpUrl',
|
||||
label: '跳转路径',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入跳转链接',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'buttonText',
|
||||
label: '按钮文字',
|
||||
component: 'NsInput',
|
||||
ifShow: (formModel) => {
|
||||
if (formModel.httpUrl) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入按钮文字',
|
||||
trigger: 'change',
|
||||
},
|
||||
{ min: 0, max: 20, message: '最多可输入20个字符', trigger: 'change' },
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'buttonText',
|
||||
label: '按钮文字',
|
||||
component: 'NsInput',
|
||||
show: (formModel) => {
|
||||
if (formModel.httpUrl) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: false,
|
||||
message: '请输入按钮文字',
|
||||
trigger: 'blur',
|
||||
},
|
||||
{ min: 0, max: 20, message: '最多可输入20个字符', trigger: 'change' },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'field111',
|
||||
label: '',
|
||||
displayFormItem: false,
|
||||
class: 'ns-form-item-full',
|
||||
component: 'NsChildForm',
|
||||
componentProps: {
|
||||
title: '投放规则',
|
||||
schemas: [
|
||||
{
|
||||
field: 'time',
|
||||
label: '投放时间',
|
||||
component: 'NsRangePicker',
|
||||
fieldMap: ['startTime', 'endTime'],
|
||||
componentProps: {
|
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
||||
format: 'YYYY-MM-DD HH:mm:ss',
|
||||
showTime: true,
|
||||
'show-time': {
|
||||
hideDisabledOptions: true,
|
||||
defaultValue: [
|
||||
dateUtil('00:00:00', 'HH:mm:ss'),
|
||||
dateUtil('23:59:59', 'HH:mm:ss'),
|
||||
],
|
||||
},
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择投放时间',
|
||||
type: 'array',
|
||||
trigger: 'change',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'field',
|
||||
label: '开屏广告排序',
|
||||
component: 'NsSelect',
|
||||
componentProps: {
|
||||
placeholder: '请选择',
|
||||
options: [
|
||||
{
|
||||
label: '1',
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
label: '2',
|
||||
value: 2,
|
||||
},
|
||||
{
|
||||
label: '3',
|
||||
value: 3,
|
||||
},
|
||||
{
|
||||
label: '4',
|
||||
value: 4,
|
||||
},
|
||||
{
|
||||
label: '5',
|
||||
value: 5,
|
||||
},
|
||||
{
|
||||
label: '6',
|
||||
value: 6,
|
||||
},
|
||||
],
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择展示栏位',
|
||||
type: 'number',
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'pushFrequency',
|
||||
label: '推送频次',
|
||||
component: 'NsRadioGroup',
|
||||
componentProps: {
|
||||
radioType: 'radio',
|
||||
options: [
|
||||
{ label: '每日首次启动', value: 4 },
|
||||
{ label: '每次启动', value: 3 },
|
||||
{ label: '每次进入', value: 1 },
|
||||
],
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择推送频次',
|
||||
type: 'number',
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'customFrequencyValue',
|
||||
label: '展示时间',
|
||||
component: 'NsRadioGroup',
|
||||
componentProps: {
|
||||
radioType: 'radio',
|
||||
options: [
|
||||
{ label: '3秒', value: '3' },
|
||||
{ label: '5秒', value: '5' },
|
||||
],
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择展示时间',
|
||||
type: 'string',
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
];
|
||||
if (uuid) {
|
||||
request().then((res: any) => {
|
||||
data.value = res;
|
||||
fileUrl.value = res.fileUrl;
|
||||
// 处理时间投放格式
|
||||
data.value.time = [
|
||||
dateUtil(res.startTime).format('YYYY-MM-DD HH:mm:ss'),
|
||||
dateUtil(res.endTime).format('YYYY-MM-DD HH:mm:ss'),
|
||||
];
|
||||
formSchema.value = Object.assign([], formSchemaDetail);
|
||||
});
|
||||
} else {
|
||||
formSchema.value = Object.assign([], formSchemaDetail);
|
||||
}
|
||||
|
||||
return {
|
||||
data,
|
||||
formSchema,
|
||||
uuid,
|
||||
};
|
||||
},
|
||||
|
||||
methods: {},
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
:deep(.ns-form .ns-child-form-title) {
|
||||
text-align: left;
|
||||
margin: 10 0 0 0 !important;
|
||||
}
|
||||
:deep(.ant-radio-group) {
|
||||
font-size: 14px;
|
||||
}
|
||||
// :deep(.ant-radio-wrapper) {
|
||||
// display: inline-block !important;
|
||||
// }
|
||||
:deep(.ant-radio) {
|
||||
top: 1px;
|
||||
}
|
||||
// :deep(.ant-radio-inner::after) {
|
||||
// width: 8px;
|
||||
// height: 8px;
|
||||
// }
|
||||
</style>
|
||||
@@ -1,96 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<customerDetail
|
||||
title="查看开屏广告"
|
||||
api="/api/op_com/objs/admin/AdvertisingMarketingOper/openScreenDetail"
|
||||
:detail="detail"
|
||||
checkApi="/api/op_com/objs/admin/AdvertisingMarketingOper/approvalOpenScreen" />
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref } from 'vue';
|
||||
import customerDetail from '../components/customerDetail.vue';
|
||||
|
||||
import { dateUtil } from '/nerv-lib/util/date-util';
|
||||
import { useRouter } from 'vue-router';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'OpenScreenManageDetail',
|
||||
components: { customerDetail },
|
||||
setup() {
|
||||
const rouer = useRouter();
|
||||
let status = ref();
|
||||
status.value = rouer.currentRoute.value.query.pushCrowd;
|
||||
|
||||
const detail = reactive([
|
||||
{
|
||||
title: '开屏广告内容',
|
||||
items: [
|
||||
{
|
||||
label: '开屏广告名称',
|
||||
name: 'name',
|
||||
},
|
||||
{
|
||||
label: '开屏广告图片',
|
||||
name: 'fileUrl',
|
||||
type: 'image',
|
||||
},
|
||||
|
||||
{
|
||||
label: '跳转路径',
|
||||
// type: 'html',
|
||||
name: 'httpUrl',
|
||||
// format: (value, data) => {
|
||||
// return `H5:${data.httpUrl || '--'}<br />小程序:${data.appletsUrl || '--'}`;
|
||||
// },
|
||||
},
|
||||
{
|
||||
label: '按钮文字',
|
||||
name: 'buttonText',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: '投放规则',
|
||||
items: [
|
||||
{
|
||||
label: '投放时间',
|
||||
name: 'pileCode',
|
||||
format: (value, data) => {
|
||||
return (
|
||||
dateUtil(data.startTime).format('YYYY-MM-DD HH:mm:ss') +
|
||||
'~' +
|
||||
dateUtil(data.endTime).format('YYYY-MM-DD HH:mm:ss')
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '开屏广告排序',
|
||||
name: 'field',
|
||||
},
|
||||
{
|
||||
label: '推送频次',
|
||||
name: 'pushFrequency',
|
||||
format: (value, data) => {
|
||||
return ['', '每次进入', '', '每次启动', '每日首次启动'][value];
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '展示时间',
|
||||
name: 'customFrequencyValue',
|
||||
format: (value, data) => {
|
||||
return value + '秒';
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
||||
return {
|
||||
detail,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,226 +0,0 @@
|
||||
<!-- @format -->
|
||||
|
||||
<template>
|
||||
<ns-view-list-table v-bind="tableConfig" :model="data" rowKey="uuid">
|
||||
<template #bodyCell="{ record, column }">
|
||||
<template v-if="column.dataIndex === 'status'">
|
||||
<a-badge v-bind="checkStatus[record.status]" />
|
||||
</template>
|
||||
</template>
|
||||
</ns-view-list-table>
|
||||
</template>
|
||||
<script>
|
||||
import { defineComponent, reactive } from 'vue';
|
||||
import { dateUtil } from '/nerv-lib/util/date-util';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'OpenScreenManageIndex',
|
||||
setup() {
|
||||
const data = reactive({});
|
||||
const tableConfig = {
|
||||
title: '开屏广告管理',
|
||||
api: '/api/op_com/objs/admin/AdvertisingMarketingOper/openScreenList',
|
||||
params: {
|
||||
page: 0,
|
||||
pageSize: 10,
|
||||
},
|
||||
rowSelection: null,
|
||||
// scroll: { x: 1000 },
|
||||
columns: [
|
||||
{
|
||||
title: '开屏广告名称',
|
||||
// width: 100,
|
||||
dataIndex: 'name',
|
||||
},
|
||||
{
|
||||
title: '投放时间段',
|
||||
// width: 110,
|
||||
textNumber: 20,
|
||||
dataIndex: 'applyTime',
|
||||
customRender: ({ text, record }) => {
|
||||
return `${dateUtil(record.startTime).format('YYYY-MM-DD HH:mm:ss')}~${dateUtil(
|
||||
record.endTime,
|
||||
).format('YYYY-MM-DD HH:mm:ss')}`;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '开屏广告排序',
|
||||
textNumber: 12,
|
||||
dataIndex: 'field',
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
dataIndex: 'status',
|
||||
textNumber: 11,
|
||||
},
|
||||
],
|
||||
columnActions: {
|
||||
title: '操作',
|
||||
// width: 40,
|
||||
// textNumber: 2,
|
||||
actionNumber: 2,
|
||||
autoMergeAction: false,
|
||||
// fixed: 'right',
|
||||
actions: [
|
||||
{
|
||||
label: '编辑',
|
||||
name: 'OpenScreenManageEdit',
|
||||
dynamicParams: ['uuid', 'status'],
|
||||
ifShow: ({ status }) => status !== 2 && status !== 3 && status !== 5,
|
||||
route: '/contentManage/systemManage/openScreenManage/edit',
|
||||
},
|
||||
{
|
||||
label: '查看',
|
||||
name: 'OpenScreenManageDetail',
|
||||
dynamicParams: ['uuid', 'pushCrowd'],
|
||||
ifShow: ({ status }) => status === 3 || status === 2 || status === 5,
|
||||
route: '/contentManage/systemManage/openScreenManage/detail',
|
||||
},
|
||||
{
|
||||
label: '审批',
|
||||
name: 'OpenScreenManageDetailCheck',
|
||||
dynamicParams: ['uuid', 'pushCrowd', 'status'],
|
||||
ifShow: ({ status }) => status === 5,
|
||||
route: '/contentManage/systemManage/openScreenManage/detailCheck',
|
||||
},
|
||||
{
|
||||
label: '失效',
|
||||
dynamicParams: 'uuid',
|
||||
ifShow: ({ status }) => status === 0 || status === 4,
|
||||
name: 'OpenScreenManageInvalidation',
|
||||
confirm: true,
|
||||
isReload: true,
|
||||
api: '/api/op_com/objs/admin/AdvertisingMarketingOper/invalidationOpenScreen',
|
||||
},
|
||||
{
|
||||
label: '删除',
|
||||
dynamicParams: 'uuid',
|
||||
ifShow: ({ status }) => status !== 0 && status !== 4 && status !== 5,
|
||||
name: 'OpenScreenManageRemove',
|
||||
confirm: true,
|
||||
isReload: true,
|
||||
api: '/api/op_com/objs/admin/AdvertisingMarketingOper/deleteOpenScreen',
|
||||
},
|
||||
],
|
||||
},
|
||||
headerActions: [
|
||||
{
|
||||
label: '新增',
|
||||
name: 'OpenScreenManageAdd',
|
||||
type: 'primary',
|
||||
route: '/contentManage/systemManage/openScreenManage/add',
|
||||
},
|
||||
],
|
||||
formConfig: {
|
||||
schemas: [
|
||||
{
|
||||
field: 'name',
|
||||
label: '开屏广告名称',
|
||||
component: 'NsInput',
|
||||
componentProps: {
|
||||
placeholder: '请输入',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'time',
|
||||
label: '投放时间段',
|
||||
component: 'NsRangePicker',
|
||||
fieldMap: ['startTime', 'endTime'],
|
||||
componentProps: {
|
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
||||
format: 'YYYY-MM-DD HH:mm:ss',
|
||||
showTime: true,
|
||||
'show-time': {
|
||||
hideDisabledOptions: true,
|
||||
defaultValue: [
|
||||
dateUtil('00:00:00', 'HH:mm:ss'),
|
||||
dateUtil('23:59:59', 'HH:mm:ss'),
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'status',
|
||||
label: '状态',
|
||||
component: 'NsSelect',
|
||||
defaultValue: '',
|
||||
componentProps: {
|
||||
options: [
|
||||
{
|
||||
label: '全部',
|
||||
value: '',
|
||||
},
|
||||
{
|
||||
label: '进行中',
|
||||
value: 0,
|
||||
},
|
||||
{
|
||||
label: '存草稿',
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
label: '已结束',
|
||||
value: 2,
|
||||
},
|
||||
{
|
||||
label: '已失效',
|
||||
value: 3,
|
||||
},
|
||||
{
|
||||
label: '未开始',
|
||||
value: 4,
|
||||
},
|
||||
{
|
||||
label: '待审核',
|
||||
value: 5,
|
||||
},
|
||||
{
|
||||
label: '审核驳回',
|
||||
value: 6,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
params: {},
|
||||
},
|
||||
rowKey: 'uuid',
|
||||
};
|
||||
const checkStatus = [
|
||||
{
|
||||
status: 'processing',
|
||||
text: '进行中',
|
||||
},
|
||||
{
|
||||
status: 'error',
|
||||
text: '存草稿',
|
||||
},
|
||||
{
|
||||
status: 'default',
|
||||
text: '已结束',
|
||||
},
|
||||
{
|
||||
color: '#000000',
|
||||
text: '已失效',
|
||||
},
|
||||
{
|
||||
status: 'success',
|
||||
text: '未开始',
|
||||
},
|
||||
{
|
||||
status: 'error',
|
||||
text: '待审核',
|
||||
},
|
||||
{
|
||||
color: '#000000',
|
||||
text: '审核驳回',
|
||||
},
|
||||
];
|
||||
return {
|
||||
tableConfig,
|
||||
data,
|
||||
checkStatus,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -1,51 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"allowJs": true,
|
||||
"baseUrl": "./",
|
||||
"esModuleInterop": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"jsx": "preserve",
|
||||
"lib": ["esnext", "dom"],
|
||||
"module": "esnext",
|
||||
"moduleResolution": "node",
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"paths": {
|
||||
"/@/*": [
|
||||
"src/*"
|
||||
],
|
||||
"/nerv-lib/*": [
|
||||
"../lib/*"
|
||||
],
|
||||
"/nerv-base/*": [
|
||||
"../lib/saas/*"
|
||||
],
|
||||
"/type/*": [
|
||||
"../type/*"
|
||||
]
|
||||
},
|
||||
"resolveJsonModule": true,
|
||||
"skipLibCheck": true,
|
||||
"sourceMap": true,
|
||||
"strict": true,
|
||||
"strictFunctionTypes": false,
|
||||
"target": "esnext",
|
||||
"typeRoots": [
|
||||
"../node_modules/@types",
|
||||
"../node_modules/@vue",
|
||||
"../type"
|
||||
],
|
||||
"types": ["vite/client"]
|
||||
},
|
||||
"include": [
|
||||
"src/**/*",
|
||||
"type/**/*",
|
||||
"mock/**/*",
|
||||
"vite.config.ts"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"dist",
|
||||
"**/*.js"
|
||||
]
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
/** @format */
|
||||
|
||||
import configFun from '../build/vite-default.config';
|
||||
const dirname = __dirname;
|
||||
const proxy = {
|
||||
'/api/web': {
|
||||
// target: 'http://100.73.156.51:8080/api',
|
||||
target: 'http://100.86.13.179:8080/api',
|
||||
|
||||
changeOrigin: true,
|
||||
rewrite: (path) => path.replace(/^\/api\/web/, ''),
|
||||
},
|
||||
'/api/content': {
|
||||
target: 'http://100.86.13.144:8088/api',
|
||||
changeOrigin: true,
|
||||
rewrite: (path) => path.replace(/^\/api\/content/, ''),
|
||||
},
|
||||
'/api/op_com': {
|
||||
target: 'http://100.86.13.109:8082/api',
|
||||
changeOrigin: true,
|
||||
rewrite: (path) => path.replace(/^\/api\/op_com/, ''),
|
||||
},
|
||||
'/api/fileunify': {
|
||||
// target: 'http://100.73.156.51:8082/api',
|
||||
target: 'http://100.86.13.37:8085/api',
|
||||
changeOrigin: true,
|
||||
rewrite: (path) => path.replace(/^\/api\/fileunify/, ''),
|
||||
},
|
||||
'/api/community': {
|
||||
// target: 'http://100.73.156.51:8080/api',
|
||||
target: 'http://100.86.13.13:8080/api',
|
||||
// target: 'http://100.86.13.123:8082/api',
|
||||
changeOrigin: true,
|
||||
rewrite: (path) => path.replace(/^\/api\/community/, ''),
|
||||
},
|
||||
'/qa': {
|
||||
target: 'http://100.86.13.179:8080/qa',
|
||||
// target: 'http://100.86.13.206:8081/qa',
|
||||
changeOrigin: true,
|
||||
rewrite: (path) => path.replace(/^\/qa/, ''),
|
||||
},
|
||||
};
|
||||
export default configFun({ dirname, proxy, serviceMode: 'saas', baseDir: '../' });
|
||||
@@ -1,10 +0,0 @@
|
||||
# port
|
||||
VITE_PORT = 3301
|
||||
#mode
|
||||
VITE_GLOB_APP_RUN_TYPE = saas
|
||||
|
||||
# spa-title
|
||||
VITE_GLOB_APP_TITLE = Smart Parking Depositor
|
||||
|
||||
# spa shortname
|
||||
VITE_GLOB_APP_SHORT_NAME = smart-parking-depositor
|
||||
@@ -1,22 +0,0 @@
|
||||
# Whether to open mock
|
||||
VITE_USE_MOCK = true
|
||||
|
||||
# public path
|
||||
VITE_PUBLIC_PATH = /
|
||||
|
||||
# Cross-domain proxy, you can configure multiple
|
||||
# Please note that no line breaks http://100.73.70.51
|
||||
|
||||
#VITE_PROXY = {"/community":{ "target":"http://100.73.70.51","changeOrigin": true,"prependPath":false},"/parking":{ "target":"http://100.73.70.246:8080","changeOrigin": true,"iprependPath":false}}
|
||||
# VITE_PROXY=[["/api","http://100.73.70.51"],["/parking","http://100.73.70.246:8080"]]
|
||||
# Delete console
|
||||
VITE_DROP_CONSOLE = false
|
||||
|
||||
# Basic interface address SPA
|
||||
VITE_GLOB_API_URL=/basic-api
|
||||
|
||||
# File upload address, optional
|
||||
VITE_GLOB_UPLOAD_URL=/upload
|
||||
|
||||
# Interface prefix
|
||||
VITE_GLOB_API_URL_PREFIX=
|
||||
@@ -1,35 +0,0 @@
|
||||
# Whether to open mock
|
||||
VITE_USE_MOCK = true
|
||||
|
||||
# public path
|
||||
VITE_PUBLIC_PATH = /
|
||||
|
||||
# Delete console
|
||||
VITE_DROP_CONSOLE = true
|
||||
|
||||
# Whether to enable gzip or brotli compression
|
||||
# Optional: gzip | brotli | none
|
||||
# If you need multiple forms, you can use `,` to separate
|
||||
VITE_BUILD_COMPRESS = 'none'
|
||||
|
||||
# Whether to delete origin files when using compress, default false
|
||||
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
|
||||
|
||||
# Basic interface address SPA
|
||||
VITE_GLOB_API_URL=/basic-api
|
||||
|
||||
# File upload address, optional
|
||||
# It can be forwarded by nginx or write the actual address directly
|
||||
VITE_GLOB_UPLOAD_URL=/upload
|
||||
|
||||
# Interface prefix
|
||||
VITE_GLOB_API_URL_PREFIX=
|
||||
|
||||
# Whether to enable image compression
|
||||
VITE_USE_IMAGEMIN= true
|
||||
|
||||
# use pwa
|
||||
VITE_USE_PWA = false
|
||||
|
||||
# Is it compatible with older browsers
|
||||
VITE_LEGACY = false
|
||||
@@ -1 +0,0 @@
|
||||
2.1.19
|
||||
@@ -1,74 +0,0 @@
|
||||
#!/bin/bash
|
||||
SOURCE="$0"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
if [ -z $WORKSPACE ];then
|
||||
echo "WORKSPACE not exists"
|
||||
else
|
||||
set DIR=$WORKSPACE
|
||||
fi
|
||||
|
||||
echo "current dir"
|
||||
echo "$DIR"
|
||||
|
||||
cd "$DIR"
|
||||
projectname=$(basename `pwd`)
|
||||
|
||||
npm run parking-build
|
||||
|
||||
if [ -d "$DIR/dist" ];then
|
||||
|
||||
cd "$DIR/dist"
|
||||
|
||||
# copy module.json
|
||||
cp ../module.json ./
|
||||
|
||||
# package
|
||||
VERSION=$(cat ../.version)
|
||||
lastdir=../release/
|
||||
if [ -d ${lastdir} ];then
|
||||
echo "删除旧release文件夹"
|
||||
rm -rf ${lastdir}
|
||||
else
|
||||
echo "文件夹不存在!"
|
||||
fi
|
||||
mkdir -p ${lastdir}
|
||||
|
||||
dir=../release/nerv/$projectname/$VERSION
|
||||
mkdir -p ${dir}
|
||||
tar -zcvf "${dir}/$projectname-$VERSION.tgz" ./*
|
||||
|
||||
templatedir=../release/resources/templates/nerv/$projectname/$VERSION/$projectname
|
||||
mkdir -p ${templatedir}
|
||||
cp -r ../resources/templates/* ${templatedir}
|
||||
|
||||
cd ../
|
||||
|
||||
releasefile=nerv-$projectname-$VERSION.tgz
|
||||
if [ -f ${releasefile} ];then
|
||||
echo "删除旧包!"
|
||||
rm -rf ${releasefile}
|
||||
fi
|
||||
|
||||
tar -zcvf ${releasefile} ./release/* release.yaml
|
||||
|
||||
mkdir -p ./release/nervui
|
||||
cp -r ./release/nerv/* ./release/nervui
|
||||
|
||||
if [ -f ${releasefile} ];then
|
||||
echo "编译成功!"
|
||||
mv ${releasefile} ./release
|
||||
else
|
||||
echo "编译失败!!!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
else
|
||||
echo "编译失败!!!"
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,24 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
<meta name="referrer" content="never" />
|
||||
<!-- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/leaflet.css" />
|
||||
<link rel="stylesheet" href="https://iclient.supermap.io/dist/leaflet/iclient-leaflet.min.css" />
|
||||
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/leaflet.js"></script>
|
||||
<script type="text/javascript" src="https://iclient.supermap.io/dist/leaflet/iclient-leaflet.js"></script> -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<script type="text/javascript">
|
||||
window._AMapSecurityConfig = {
|
||||
securityJsCode: '09e43004c09d39c0e61f8fd65d5e6a5a',
|
||||
};
|
||||
</script>
|
||||
<title>smart-parking</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="./src/main.ts"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,95 +0,0 @@
|
||||
import type { MockConfig, MockMethod } from 'vite-plugin-mock';
|
||||
|
||||
import { getRequestToken, resultError, resultSuccess } from '/nerv-base/util/mock';
|
||||
|
||||
const fakeUserList = [
|
||||
{
|
||||
userId: '1',
|
||||
username: 'vben',
|
||||
realName: 'Vben Admin',
|
||||
avatar: '',
|
||||
desc: 'manager',
|
||||
password: '123456',
|
||||
accessToken: 'fakeAdminToken',
|
||||
homePath: '/dashboard',
|
||||
roles: [
|
||||
{
|
||||
roleName: 'Super Admin',
|
||||
value: 'super',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
userId: '2',
|
||||
username: 'test',
|
||||
password: '123456',
|
||||
realName: 'test user',
|
||||
avatar: '',
|
||||
desc: 'tester',
|
||||
accessToken: 'fakeTestToken',
|
||||
homePath: '/dashboard/workbench',
|
||||
roles: [
|
||||
{
|
||||
roleName: 'Tester',
|
||||
value: 'test',
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export default (_config: MockConfig): MockMethod[] => {
|
||||
return [
|
||||
{
|
||||
url: '/req-api/login',
|
||||
timeout: 200,
|
||||
method: 'post',
|
||||
response: ({ body }) => {
|
||||
const { username, password } = body;
|
||||
const checkUser = fakeUserList.find(
|
||||
(item) => item.username === username && password === item.password,
|
||||
);
|
||||
if (!checkUser) {
|
||||
return resultError('Incorrect account or password!');
|
||||
}
|
||||
const { userId, username: _username, accessToken, realName, desc, roles } = checkUser;
|
||||
return resultSuccess({
|
||||
roles,
|
||||
userId,
|
||||
username: _username,
|
||||
accessToken,
|
||||
realName,
|
||||
desc,
|
||||
});
|
||||
},
|
||||
},
|
||||
{
|
||||
url: '/req-api/getUserInfo',
|
||||
method: 'get',
|
||||
timeout: 100,
|
||||
response: (request) => {
|
||||
const token = getRequestToken(request) || 'fakeAdminToken';
|
||||
if (!token) return resultError('Invalid token');
|
||||
const checkUser = fakeUserList.find((item) => item.accessToken === token);
|
||||
if (!checkUser) {
|
||||
return resultError('The corresponding user information was not obtained!');
|
||||
}
|
||||
const { accessToken: _token, password: _pwd, ...rest } = checkUser;
|
||||
return resultSuccess(rest);
|
||||
},
|
||||
},
|
||||
{
|
||||
url: '/req-api/logout',
|
||||
timeout: 200,
|
||||
method: 'get',
|
||||
response: (request) => {
|
||||
const token = getRequestToken(request);
|
||||
if (!token) return resultError('Invalid token');
|
||||
const checkUser = fakeUserList.find((item) => item.accessToken === token);
|
||||
if (!checkUser) {
|
||||
return resultError('Invalid token!');
|
||||
}
|
||||
return resultSuccess(undefined, { message: 'Token has been destroyed' });
|
||||
},
|
||||
},
|
||||
];
|
||||
};
|
||||