feat: remove useless project

This commit is contained in:
xuziqiang
2024-05-21 16:43:45 +08:00
parent 4a9b924df6
commit 1d25ea126c
634 changed files with 0 additions and 180215 deletions

View File

@@ -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

View File

@@ -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=

View File

@@ -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

View File

@@ -1 +0,0 @@
1.0.10

View File

@@ -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

View File

@@ -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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 904 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

View File

@@ -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}

View File

@@ -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

View File

@@ -1 +0,0 @@
echo "=====================================================delete====================================================="

View File

@@ -1 +0,0 @@
echo "=====================================================setup====================================================="

View File

@@ -1 +0,0 @@
echo "=====================================================start====================================================="

View File

@@ -1 +0,0 @@
echo "=====================================================stop====================================================="

View File

@@ -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"
}
]
}

View File

@@ -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}"
}
]
}
]
}

View File

@@ -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>

View File

@@ -1,6 +0,0 @@
/***
*配置接口 格式 module:Array<resource>
*/
export const apiModule = {
parking: ['User', 'CurrentUser', 'Organizational'],
};

View File

@@ -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;
}

View File

@@ -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',
},
};

View File

@@ -1,2 +0,0 @@
import { appConfig } from '/@/config/app.config';
export { appConfig };

View File

@@ -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;

View File

@@ -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',
}

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -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

View File

@@ -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

View File

@@ -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

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -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');

View File

@@ -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;

View File

@@ -1,11 +0,0 @@
/** @format */
// const RootRoute = {
// path: '/',
// name: 'root',
// redirect: { name: 'AnnouncementsIndex' },
// meta: {
// title: 'Root',
// },
// };
// export default RootRoute;

View File

@@ -1,8 +0,0 @@
/** @format */
const RootRoute = {
path: '/root',
name: 'root',
redirect: { name: 'AnnouncementsIndex' },
};
export default RootRoute;

View File

@@ -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: {},
});

View File

@@ -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;
}

View File

@@ -1,2 +0,0 @@
@import "variable";
@import "global";

View File

@@ -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;

View File

@@ -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;

View File

@@ -1 +0,0 @@
declare module '*.vue';

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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,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" />
</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,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" />
<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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"
]
}

View File

@@ -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: '../' });

View File

@@ -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

View File

@@ -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=

View File

@@ -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

View File

@@ -1 +0,0 @@
2.1.19

View File

@@ -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

View File

@@ -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>

View File

@@ -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' });
},
},
];
};

Some files were not shown because too many files have changed in this diff Show More