Browse Source

feat: remove useless project

main
xuziqiang 10 months ago
parent
commit
1d25ea126c
  1. 10
      nervui-mobile-application/.env
  2. 22
      nervui-mobile-application/.env.development
  3. 35
      nervui-mobile-application/.env.production
  4. 1
      nervui-mobile-application/.version
  5. 74
      nervui-mobile-application/build.sh
  6. 14
      nervui-mobile-application/index.html
  7. BIN
      nervui-mobile-application/public/asset/file/carWashStore.xlsx
  8. BIN
      nervui-mobile-application/public/asset/font/QuartzMS.TTF
  9. BIN
      nervui-mobile-application/public/asset/image/login/adminIcon.png
  10. BIN
      nervui-mobile-application/public/asset/image/login/background.jpg
  11. BIN
      nervui-mobile-application/public/asset/image/login/background.png
  12. BIN
      nervui-mobile-application/public/asset/image/login/icon_clear.png
  13. BIN
      nervui-mobile-application/public/asset/image/login/login-background.jpeg
  14. BIN
      nervui-mobile-application/public/asset/image/login/logo-paas.png
  15. BIN
      nervui-mobile-application/public/asset/image/login/logo-white.png
  16. BIN
      nervui-mobile-application/public/asset/image/login/logo.png
  17. BIN
      nervui-mobile-application/public/asset/image/logo.png
  18. BIN
      nervui-mobile-application/public/asset/image/map-back.png
  19. BIN
      nervui-mobile-application/public/asset/image/mark-off.png
  20. BIN
      nervui-mobile-application/public/asset/image/mark.png
  21. BIN
      nervui-mobile-application/public/asset/image/noResource.png
  22. BIN
      nervui-mobile-application/public/asset/image/off-line.png
  23. BIN
      nervui-mobile-application/public/asset/image/on-line.png
  24. BIN
      nervui-mobile-application/public/favicon.ico
  25. 12
      nervui-mobile-application/release.yaml
  26. 35
      nervui-mobile-application/resources/scripts/nervui/nervui-mobile-application/create.sh
  27. 1
      nervui-mobile-application/resources/scripts/nervui/nervui-mobile-application/delete.sh
  28. 1
      nervui-mobile-application/resources/scripts/nervui/nervui-mobile-application/setup.sh
  29. 1
      nervui-mobile-application/resources/scripts/nervui/nervui-mobile-application/start.sh
  30. 1
      nervui-mobile-application/resources/scripts/nervui/nervui-mobile-application/stop.sh
  31. 30
      nervui-mobile-application/resources/scripts/nervui/nervui-mobile-application/type.json
  32. 64
      nervui-mobile-application/resources/templates/deploy.json
  33. 61
      nervui-mobile-application/src/App.vue
  34. 6
      nervui-mobile-application/src/api/index.ts
  35. 20
      nervui-mobile-application/src/api/user.ts
  36. 26
      nervui-mobile-application/src/config/app.config.ts
  37. 2
      nervui-mobile-application/src/config/index.ts
  38. 26
      nervui-mobile-application/src/config/transform.ts
  39. 22
      nervui-mobile-application/src/enum/http-enum.ts
  40. 51
      nervui-mobile-application/src/icon/headerLogin.svg
  41. 46
      nervui-mobile-application/src/icon/login.svg
  42. 1
      nervui-mobile-application/src/icon/neirongguanli.svg
  43. 4
      nervui-mobile-application/src/icon/passWord.svg
  44. 4
      nervui-mobile-application/src/icon/userName.svg
  45. 1
      nervui-mobile-application/src/icon/xitongguanli.svg
  46. 13
      nervui-mobile-application/src/main.ts
  47. 510
      nervui-mobile-application/src/router/contentManage/index.ts
  48. 11
      nervui-mobile-application/src/router/index.ts
  49. 8
      nervui-mobile-application/src/router/root.ts
  50. 12
      nervui-mobile-application/src/store/item.ts
  51. 53
      nervui-mobile-application/src/theme/global.scss
  52. 2
      nervui-mobile-application/src/theme/theme.scss
  53. 0
      nervui-mobile-application/src/theme/variable.css
  54. 42
      nervui-mobile-application/src/theme/variable.less
  55. 65
      nervui-mobile-application/src/theme/variable.scss
  56. 1
      nervui-mobile-application/src/types.d.ts
  57. 70
      nervui-mobile-application/src/view/components/FCKEditor.vue
  58. 153
      nervui-mobile-application/src/view/contentManage/announcements/add.vue
  59. 53
      nervui-mobile-application/src/view/contentManage/announcements/detail.vue
  60. 258
      nervui-mobile-application/src/view/contentManage/announcements/index.vue
  61. 271
      nervui-mobile-application/src/view/contentManage/article/add.vue
  62. 70
      nervui-mobile-application/src/view/contentManage/article/detail.vue
  63. 251
      nervui-mobile-application/src/view/contentManage/article/index.vue
  64. 162
      nervui-mobile-application/src/view/contentManage/audit/audit.vue
  65. 85
      nervui-mobile-application/src/view/contentManage/audit/detail.vue
  66. 170
      nervui-mobile-application/src/view/contentManage/audit/index.vue
  67. 199
      nervui-mobile-application/src/view/contentManage/news/add.vue
  68. 65
      nervui-mobile-application/src/view/contentManage/news/detail.vue
  69. 220
      nervui-mobile-application/src/view/contentManage/news/index.vue
  70. 254
      nervui-mobile-application/src/view/login.vue
  71. 346
      nervui-mobile-application/src/view/systemManage/appVersionManage/add.vue
  72. 135
      nervui-mobile-application/src/view/systemManage/appVersionManage/components/add-form.vue
  73. 95
      nervui-mobile-application/src/view/systemManage/appVersionManage/components/uploadFile.vue
  74. 85
      nervui-mobile-application/src/view/systemManage/appVersionManage/detail.vue
  75. 656
      nervui-mobile-application/src/view/systemManage/appVersionManage/index.vue
  76. 332
      nervui-mobile-application/src/view/systemManage/bannerManage/add.vue
  77. 109
      nervui-mobile-application/src/view/systemManage/bannerManage/detail.vue
  78. 303
      nervui-mobile-application/src/view/systemManage/bannerManage/index.vue
  79. 150
      nervui-mobile-application/src/view/systemManage/components/add-form.vue
  80. 368
      nervui-mobile-application/src/view/systemManage/components/customerDetail.vue
  81. 178
      nervui-mobile-application/src/view/systemManage/components/myURL.vue
  82. 122
      nervui-mobile-application/src/view/systemManage/components/radio.vue
  83. 169
      nervui-mobile-application/src/view/systemManage/logManage/index.vue
  84. 336
      nervui-mobile-application/src/view/systemManage/openScreenManage/add.vue
  85. 96
      nervui-mobile-application/src/view/systemManage/openScreenManage/detail.vue
  86. 226
      nervui-mobile-application/src/view/systemManage/openScreenManage/index.vue
  87. 51
      nervui-mobile-application/tsconfig.json
  88. 43
      nervui-mobile-application/vite.config.ts
  89. 10
      nervui-smart-parking/.env
  90. 22
      nervui-smart-parking/.env.development
  91. 35
      nervui-smart-parking/.env.production
  92. 1
      nervui-smart-parking/.version
  93. 74
      nervui-smart-parking/build.sh
  94. 24
      nervui-smart-parking/index.html
  95. 95
      nervui-smart-parking/mock/user.ts
  96. BIN
      nervui-smart-parking/public/asset/file/carWashStore.xlsx
  97. BIN
      nervui-smart-parking/public/asset/file/chargePositionImport.xlsx
  98. BIN
      nervui-smart-parking/public/asset/file/couponGifts.xlsx
  99. BIN
      nervui-smart-parking/public/asset/file/defenceArea.xlsx
  100. BIN
      nervui-smart-parking/public/asset/file/drivingTestFilings.xlsx

10
nervui-mobile-application/.env

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

22
nervui-mobile-application/.env.development

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

35
nervui-mobile-application/.env.production

@ -1,35 +0,0 @@
# Whether to open mock
VITE_USE_MOCK = true
# public path
VITE_PUBLIC_PATH = /
# Delete console
VITE_DROP_CONSOLE = true
# Whether to enable gzip or brotli compression
# Optional: gzip | brotli | none
# If you need multiple forms, you can use `,` to separate
VITE_BUILD_COMPRESS = 'none'
# Whether to delete origin files when using compress, default false
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
# Basic interface address SPA
VITE_GLOB_API_URL=/basic-api
# File upload address, optional
# It can be forwarded by nginx or write the actual address directly
VITE_GLOB_UPLOAD_URL=/upload
# Interface prefix
VITE_GLOB_API_URL_PREFIX=
# Whether to enable image compression
VITE_USE_IMAGEMIN= true
# use pwa
VITE_USE_PWA = false
# Is it compatible with older browsers
VITE_LEGACY = false

1
nervui-mobile-application/.version

@ -1 +0,0 @@
1.0.10

74
nervui-mobile-application/build.sh

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

14
nervui-mobile-application/index.html

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

BIN
nervui-mobile-application/public/asset/file/carWashStore.xlsx

Binary file not shown.

BIN
nervui-mobile-application/public/asset/font/QuartzMS.TTF

Binary file not shown.

BIN
nervui-mobile-application/public/asset/image/login/adminIcon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

BIN
nervui-mobile-application/public/asset/image/login/background.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

BIN
nervui-mobile-application/public/asset/image/login/background.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 KiB

BIN
nervui-mobile-application/public/asset/image/login/icon_clear.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

BIN
nervui-mobile-application/public/asset/image/login/login-background.jpeg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

BIN
nervui-mobile-application/public/asset/image/login/logo-paas.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

BIN
nervui-mobile-application/public/asset/image/login/logo-white.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

BIN
nervui-mobile-application/public/asset/image/login/logo.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

BIN
nervui-mobile-application/public/asset/image/logo.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

BIN
nervui-mobile-application/public/asset/image/map-back.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

BIN
nervui-mobile-application/public/asset/image/mark-off.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

BIN
nervui-mobile-application/public/asset/image/mark.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

BIN
nervui-mobile-application/public/asset/image/noResource.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

BIN
nervui-mobile-application/public/asset/image/off-line.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 904 B

BIN
nervui-mobile-application/public/asset/image/on-line.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

BIN
nervui-mobile-application/public/favicon.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

12
nervui-mobile-application/release.yaml

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

35
nervui-mobile-application/resources/scripts/nervui/nervui-mobile-application/create.sh

@ -1,35 +0,0 @@
echo "=====================================================create====================================================="
#!/usr/bin/env bash
function create() {
if [ -d "$nervui_app_home" ];then
echo "$nervui_app_home exists!"
else
echo "start mkdir $nervui_app_home"
mkdir -p "$nervui_app_home"
fi
pkg_file_name=${pkg_url##*/}
pkg_file_path="$nervui_app_home$pkg_file_name"
echo "start download $pkg_url"
curl -L -o $pkg_file_path $pkg_url
echo "start install $pkg_file_path"
tar -xf $pkg_file_path -C $nervui_app_home
}
if [ "$pkg_url" == "" ]; then
echo {\"error\":\"pkg_url is empty\"}
exit 1
elif [ "$nervui_app_home" == "" ]; then
echo {\"error\":\"nervui_app_home is empty\"}
exit 1
else
create
fi

1
nervui-mobile-application/resources/scripts/nervui/nervui-mobile-application/delete.sh

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

1
nervui-mobile-application/resources/scripts/nervui/nervui-mobile-application/setup.sh

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

1
nervui-mobile-application/resources/scripts/nervui/nervui-mobile-application/start.sh

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

1
nervui-mobile-application/resources/scripts/nervui/nervui-mobile-application/stop.sh

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

30
nervui-mobile-application/resources/scripts/nervui/nervui-mobile-application/type.json

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

64
nervui-mobile-application/resources/templates/deploy.json

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

61
nervui-mobile-application/src/App.vue

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

6
nervui-mobile-application/src/api/index.ts

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

20
nervui-mobile-application/src/api/user.ts

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

26
nervui-mobile-application/src/config/app.config.ts

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

2
nervui-mobile-application/src/config/index.ts

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

26
nervui-mobile-application/src/config/transform.ts

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

22
nervui-mobile-application/src/enum/http-enum.ts

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

51
nervui-mobile-application/src/icon/headerLogin.svg

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 17 KiB

46
nervui-mobile-application/src/icon/login.svg

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 17 KiB

1
nervui-mobile-application/src/icon/neirongguanli.svg

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

4
nervui-mobile-application/src/icon/passWord.svg

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

4
nervui-mobile-application/src/icon/userName.svg

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

1
nervui-mobile-application/src/icon/xitongguanli.svg

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 8.3 KiB

13
nervui-mobile-application/src/main.ts

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

510
nervui-mobile-application/src/router/contentManage/index.ts

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

11
nervui-mobile-application/src/router/index.ts

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

8
nervui-mobile-application/src/router/root.ts

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

12
nervui-mobile-application/src/store/item.ts

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

53
nervui-mobile-application/src/theme/global.scss

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

2
nervui-mobile-application/src/theme/theme.scss

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

0
nervui-mobile-application/src/theme/variable.css

42
nervui-mobile-application/src/theme/variable.less

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

65
nervui-mobile-application/src/theme/variable.scss

@ -1,65 +0,0 @@
// $primary-color: #37ABC4; // 全局主色
// $link-color: #37ABC4; // 链接色
// $success-color: #17BE6B; // 成功色
// $warning-color: #FF9901; // 警告色
// $error-color: #FF1744; // 错误色
// $font-size-base: 14px; // 主字号
// $font-size-lg:14px;
// $font-size-lg:14px;
// $heading-font-size-lg:16px;//标题字号
// $heading-font-weight:600;//标题加粗
// $font-line-height:22px;//文字行高
// $heading-font-line-height:24px;//标题文字行高
// $heading-color: rgba(0, 0, 0, 0.85); // 标题色
// $text-color: #323232; // 主文本色
// $text-color-secondary: rgba(0, 0, 0, 0.45); // 次文本色
// $disabled-color: #BFBFBF; // 失效色
// $border-radius-base: 2px; // 组件/浮层圆角
// $border-color-base: #dcdfe2; // 边框色
// $box-shadow-base: 0 2px 8px rgba(0, 0, 0, 0.15); // 浮层阴影
// $layout-body-background: #f0f2f5; //框架背景色
// $layout-header-background:#37ABC4; // 头部背景色
// $layout-sider-width:208px; //侧边导航宽度
// $layout-sider-arrow-color:#808d96;//侧边导航箭头颜色
// $border-style-base:solid;
// $layout-header-height:48px;//头部高度
// $line-height-base:22px;
// //btn
// $btn-height-base:30px;
// $btn-height-lg: 30px;
// $btn-disable-color: #9b9b9b;//禁用按钮color
// $btn-disable-bg: #dfe3e9;//禁用按钮background
// $btn-disable-border: 1px solid #ced0da;
// $btn-border-radius-base: $border-radius-base;//圆角边框
// $btn-border-width: 1px;
// $btn-border-style: $border-style-base;
// $btn-link-hover-bg: #37ABC4;
// $btn-text-hover-bg: #46ebdb;
// $btn-font-size-lg: $font-size-lg;
// //input
// $input-height-base: 30px;
// $input-hover-focus-border-color:#a5a5b5;
// // @input-hover-border-color: rgba(0,0,0,.85);//鼠标滑过input边框
// //form
// $label-color:#52616f;
// $form-vertical-label-padding: 0;
// $form-vertical-label-margin: 0,0,16,0px;
// $form-item-label-height:$input-height-base;
// $form-item-margin-bottom: 16px;
// //menu
// $menu-item-height: 48px;
// $menu-item-active-bg: none;
// $menu-item-boundary-margin: 0px;
// //spin
// $spin-dot-size-sm: 14px;
// $spin-dot-size: 20px;
// $spin-dot-size-lg: 32px;
// $border-width-base: 1px;
// $border-style-base: solid;

1
nervui-mobile-application/src/types.d.ts

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

70
nervui-mobile-application/src/view/components/FCKEditor.vue

@ -1,70 +0,0 @@
<!-- @format -->
<template>
<div ref="FCKEditor"> </div>
</template>
<script>
import { defineComponent, ref, inject } from 'vue';
import Editor from 'wangeditor';
export default defineComponent({
name: 'FCKEditor',
props: {
htmlInfo: {
type: String,
default: '',
},
},
emits: ['change'],
setup() {
const editor = ref({});
const content = ref('');
const components = inject('components');
return {
editor,
content,
components,
};
},
watch: {
htmlInfo: {
handler(val) {
console.log(123);
setTimeout(() => {
this.editor.cmd.do('insertHTML', val);
}, 10);
},
},
},
mounted() {
this.initAre(this.htmlInfo);
},
methods: {
initAre(val) {
// eslint-disable-next-line @typescript-eslint/no-this-alias
let that = this;
this.editor = new Editor(this.$refs.FCKEditor);
this.editor.config.uploadImgShowBase64 = true;
// this.editor.config.uploadImgServer = '/api/pension/pension/objs/FileUpload'; //
// this.editor.config.uploadFileName = 'file';
// this.editor.config.uploadImgParams = {
// uploadType: '1',
// };
this.editor.config.withCredentials = true;
//this.editor.config.uploadImgMaxSize = 5 * 1024 * 1024; // 2M
this.editor.config.onchange = function (html) {
// textarea
console.log(Object.prototype.toString.call(html));
that.$emit('change', html);
};
this.editor.create();
if (val) {
this.editor.cmd.do('insertHTML', val);
}
},
getInfo() {
console.log(this.editor.txt.html());
},
},
});
</script>
<style lang="less" scoped></style>

153
nervui-mobile-application/src/view/contentManage/announcements/add.vue

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

53
nervui-mobile-application/src/view/contentManage/announcements/detail.vue

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

258
nervui-mobile-application/src/view/contentManage/announcements/index.vue

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

271
nervui-mobile-application/src/view/contentManage/article/add.vue

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

70
nervui-mobile-application/src/view/contentManage/article/detail.vue

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

251
nervui-mobile-application/src/view/contentManage/article/index.vue

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

162
nervui-mobile-application/src/view/contentManage/audit/audit.vue

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

85
nervui-mobile-application/src/view/contentManage/audit/detail.vue

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

170
nervui-mobile-application/src/view/contentManage/audit/index.vue

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

199
nervui-mobile-application/src/view/contentManage/news/add.vue

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

65
nervui-mobile-application/src/view/contentManage/news/detail.vue

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

220
nervui-mobile-application/src/view/contentManage/news/index.vue

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

254
nervui-mobile-application/src/view/login.vue

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

346
nervui-mobile-application/src/view/systemManage/appVersionManage/add.vue

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

135
nervui-mobile-application/src/view/systemManage/appVersionManage/components/add-form.vue

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

95
nervui-mobile-application/src/view/systemManage/appVersionManage/components/uploadFile.vue

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

85
nervui-mobile-application/src/view/systemManage/appVersionManage/detail.vue

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

656
nervui-mobile-application/src/view/systemManage/appVersionManage/index.vue

@ -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 || ''; // HTML5file:///
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>

332
nervui-mobile-application/src/view/systemManage/bannerManage/add.vue

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

109
nervui-mobile-application/src/view/systemManage/bannerManage/detail.vue

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

303
nervui-mobile-application/src/view/systemManage/bannerManage/index.vue

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

150
nervui-mobile-application/src/view/systemManage/components/add-form.vue

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

368
nervui-mobile-application/src/view/systemManage/components/customerDetail.vue

@ -1,368 +0,0 @@
<!-- @format -->
<template>
<div class="ns-skeleton">
<ns-page-header class="ns-page-header" :title="title">
<template #extra>
<ns-button @click="onBack()">返回</ns-button>
<ns-button v-if="status == 5" type="primary" @click="checkReq('pass')">审核通过</ns-button>
<ns-button v-if="status == 5" type="primary" @click="checkReq('reject')"
>审核驳回</ns-button
>
</template>
</ns-page-header>
<div class="ns-detail-content">
<Skeleton
active
v-for="(detailGroup, index) in getDetail"
:key="index"
:loading="loading"
:paragraph="detailGroup.SkeletonParagraphProps"
:title="SkeletonTitleProps">
<div class="ns-detail">
<a-descriptions :title="detailGroup.title">
<template v-if="detailGroup.items">
<template v-for="(item, index) in detailGroup.items" :key="index">
<a-descriptions-item v-bind="item" v-if="item.ifShow">
<!--默认-->
<template v-if="!item.type">
<span class="ns-detail-text">{{ item.value ? item.value : '-' }}</span>
</template>
<!--富文本-->
<template v-if="item.type == 'html'">
<div class="ns-detail-html" v-html="item.value"></div>
</template>
<!--链接-->
<template v-if="item.type == 'link'">
<a class="ns-detail-link" target="_blank" :href="item.value">发票链接 </a>
</template>
<!--图片 值为数组则为图片列表 可继续扩展-->
<template v-if="item.type === 'image'">
<template v-if="typeof item.value == 'object'">
<div
class="ns-detail-image-list"
v-for="src in item.value"
:key="src"
style="display: inline-block; margin: 0 5px 5px 0">
<a-image
:width="100"
:src="src"
fallback="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAADDCAYAAADQvc6UAAABRWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8LAwSDCIMogwMCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsis7PPOq3QdDFcvjV3jOD1boQVTPQrgSkktTgbSf4A4LbmgqISBgTEFyFYuLykAsTuAbJEioKOA7DkgdjqEvQHEToKwj4DVhAQ5A9k3gGyB5IxEoBmML4BsnSQk8XQkNtReEOBxcfXxUQg1Mjc0dyHgXNJBSWpFCYh2zi+oLMpMzyhRcASGUqqCZ16yno6CkYGRAQMDKMwhqj/fAIcloxgHQqxAjIHBEugw5sUIsSQpBobtQPdLciLEVJYzMPBHMDBsayhILEqEO4DxG0txmrERhM29nYGBddr//5/DGRjYNRkY/l7////39v///y4Dmn+LgeHANwDrkl1AuO+pmgAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAwqADAAQAAAABAAAAwwAAAAD9b/HnAAAHlklEQVR4Ae3dP3PTWBSGcbGzM6GCKqlIBRV0dHRJFarQ0eUT8LH4BnRU0NHR0UEFVdIlFRV7TzRksomPY8uykTk/zewQfKw/9znv4yvJynLv4uLiV2dBoDiBf4qP3/ARuCRABEFAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghgg0Aj8i0JO4OzsrPv69Wv+hi2qPHr0qNvf39+iI97soRIh4f3z58/u7du3SXX7Xt7Z2enevHmzfQe+oSN2apSAPj09TSrb+XKI/f379+08+A0cNRE2ANkupk+ACNPvkSPcAAEibACyXUyfABGm3yNHuAECRNgAZLuYPgEirKlHu7u7XdyytGwHAd8jjNyng4OD7vnz51dbPT8/7z58+NB9+/bt6jU/TI+AGWHEnrx48eJ/EsSmHzx40L18+fLyzxF3ZVMjEyDCiEDjMYZZS5wiPXnyZFbJaxMhQIQRGzHvWR7XCyOCXsOmiDAi1HmPMMQjDpbpEiDCiL358eNHurW/5SnWdIBbXiDCiA38/Pnzrce2YyZ4//59F3ePLNMl4PbpiL2J0L979+7yDtHDhw8vtzzvdGnEXdvUigSIsCLAWavHp/+qM0BcXMd/q25n1vF57TYBp0a3mUzilePj4+7k5KSLb6gt6ydAhPUzXnoPR0dHl79WGTNCfBnn1uvSCJdegQhLI1vvCk+fPu2ePXt2tZOYEV6/fn31dz+shwAR1sP1cqvLntbEN9MxA9xcYjsxS1jWR4AIa2Ibzx0tc44fYX/16lV6NDFLXH+YL32jwiACRBiEbf5KcXoTIsQSpzXx4N28Ja4BQoK7rgXiydbHjx/P25TaQAJEGAguWy0+2Q8PD6/Ki4R8EVl+bzBOnZY95fq9rj9zAkTI2SxdidBHqG9+skdw43borCXO/ZcJdraPWdv22uIEiLA4q7nvvCug8WTqzQveOH26fodo7g6uFe/a17W3+nFBAkRYENRdb1vkkz1CH9cPsVy/jrhr27PqMYvENYNlHAIesRiBYwRy0V+8iXP8+/fvX11Mr7L7ECueb/r48eMqm7FuI2BGWDEG8cm+7G3NEOfmdcTQw4h9/55lhm7DekRYKQPZF2ArbXTAyu4kDYB2YxUzwg0gi/41ztHnfQG26HbGel/crVrm7tNY+/1btkOEAZ2M05r4FB7r9GbAIdxaZYrHdOsgJ/wCEQY0J74TmOKnbxxT9n3FgGGWWsVdowHtjt9Nnvf7yQM2aZU/TIAIAxrw6dOnAWtZZcoEnBpNuTuObWMEiLAx1HY0ZQJEmHJ3HNvGCBBhY6jtaMoEiJB0Z29vL6ls58vxPcO8/zfrdo5qvKO+d3Fx8Wu8zf1dW4p/cPzLly/dtv9Ts/EbcvGAHhHyfBIhZ6NSiIBTo0LNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiEC/wGgKKC4YMA4TAAAAABJRU5ErkJggg==" />
</div>
</template>
<template v-else>
<a-image
v-if="item.value"
class="ns-detail-image"
:width="64"
:src="item.value"
fallback="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAADDCAYAAADQvc6UAAABRWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8LAwSDCIMogwMCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsis7PPOq3QdDFcvjV3jOD1boQVTPQrgSkktTgbSf4A4LbmgqISBgTEFyFYuLykAsTuAbJEioKOA7DkgdjqEvQHEToKwj4DVhAQ5A9k3gGyB5IxEoBmML4BsnSQk8XQkNtReEOBxcfXxUQg1Mjc0dyHgXNJBSWpFCYh2zi+oLMpMzyhRcASGUqqCZ16yno6CkYGRAQMDKMwhqj/fAIcloxgHQqxAjIHBEugw5sUIsSQpBobtQPdLciLEVJYzMPBHMDBsayhILEqEO4DxG0txmrERhM29nYGBddr//5/DGRjYNRkY/l7////39v///y4Dmn+LgeHANwDrkl1AuO+pmgAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAwqADAAQAAAABAAAAwwAAAAD9b/HnAAAHlklEQVR4Ae3dP3PTWBSGcbGzM6GCKqlIBRV0dHRJFarQ0eUT8LH4BnRU0NHR0UEFVdIlFRV7TzRksomPY8uykTk/zewQfKw/9znv4yvJynLv4uLiV2dBoDiBf4qP3/ARuCRABEFAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghgg0Aj8i0JO4OzsrPv69Wv+hi2qPHr0qNvf39+iI97soRIh4f3z58/u7du3SXX7Xt7Z2enevHmzfQe+oSN2apSAPj09TSrb+XKI/f379+08+A0cNRE2ANkupk+ACNPvkSPcAAEibACyXUyfABGm3yNHuAECRNgAZLuYPgEirKlHu7u7XdyytGwHAd8jjNyng4OD7vnz51dbPT8/7z58+NB9+/bt6jU/TI+AGWHEnrx48eJ/EsSmHzx40L18+fLyzxF3ZVMjEyDCiEDjMYZZS5wiPXnyZFbJaxMhQIQRGzHvWR7XCyOCXsOmiDAi1HmPMMQjDpbpEiDCiL358eNHurW/5SnWdIBbXiDCiA38/Pnzrce2YyZ4//59F3ePLNMl4PbpiL2J0L979+7yDtHDhw8vtzzvdGnEXdvUigSIsCLAWavHp/+qM0BcXMd/q25n1vF57TYBp0a3mUzilePj4+7k5KSLb6gt6ydAhPUzXnoPR0dHl79WGTNCfBnn1uvSCJdegQhLI1vvCk+fPu2ePXt2tZOYEV6/fn31dz+shwAR1sP1cqvLntbEN9MxA9xcYjsxS1jWR4AIa2Ibzx0tc44fYX/16lV6NDFLXH+YL32jwiACRBiEbf5KcXoTIsQSpzXx4N28Ja4BQoK7rgXiydbHjx/P25TaQAJEGAguWy0+2Q8PD6/Ki4R8EVl+bzBOnZY95fq9rj9zAkTI2SxdidBHqG9+skdw43borCXO/ZcJdraPWdv22uIEiLA4q7nvvCug8WTqzQveOH26fodo7g6uFe/a17W3+nFBAkRYENRdb1vkkz1CH9cPsVy/jrhr27PqMYvENYNlHAIesRiBYwRy0V+8iXP8+/fvX11Mr7L7ECueb/r48eMqm7FuI2BGWDEG8cm+7G3NEOfmdcTQw4h9/55lhm7DekRYKQPZF2ArbXTAyu4kDYB2YxUzwg0gi/41ztHnfQG26HbGel/crVrm7tNY+/1btkOEAZ2M05r4FB7r9GbAIdxaZYrHdOsgJ/wCEQY0J74TmOKnbxxT9n3FgGGWWsVdowHtjt9Nnvf7yQM2aZU/TIAIAxrw6dOnAWtZZcoEnBpNuTuObWMEiLAx1HY0ZQJEmHJ3HNvGCBBhY6jtaMoEiJB0Z29vL6ls58vxPcO8/zfrdo5qvKO+d3Fx8Wu8zf1dW4p/cPzLly/dtv9Ts/EbcvGAHhHyfBIhZ6NSiIBTo0LNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiEC/wGgKKC4YMA4TAAAAABJRU5ErkJggg==" />
<span v-else>-</span>
</template>
</template>
<!--表格-->
<template v-else-if="item.type === 'table'">
<ns-basic-table
class="ns-detail-table"
:dataSource="dataRef[item.props.listField]"
:columns="item.props.columns"
:pagination="false"
:rowKey="item.props.rowKey" />
</template>
<!--表格-->
<template v-else-if="item.type === 'NsViewListTable'">
<NsViewListTable v-bind="item.props.tableConfig" />
</template>
<template v-for="slot in Object.keys($slots)" :key="slot">
<div v-if="item.type === slot" :style="item.style" :class="`ns-detail-${slot}`">
<slot :name="slot" v-bind="item || {}"> </slot>
</div>
</template>
</a-descriptions-item>
</template>
</template>
</a-descriptions>
</div>
</Skeleton>
</div>
</div>
</template>
<script lang="ts">
import { computed, defineComponent, ref, watch, PropType, createVNode } from 'vue';
import { http } from '/nerv-lib/util/http';
import { useRouter } from 'vue-router';
import { cloneDeep, get, isFunction, isUndefined } from 'lodash-es';
import { Skeleton } from 'ant-design-vue';
import { NsModal } from '/nerv-lib/component/modal';
import { NsMessage } from '/nerv-lib/component/message';
export interface DetailItem {
label: string;
name: string;
ifShow?: Boolean | Function;
value?: string;
format?: Function;
type?: string; // image
}
export interface DetailGroup {
title: string;
items: Array<DetailItem>;
}
export default defineComponent({
name: 'NsViewDetail',
components: { Skeleton },
props: {
detail: {
type: Array as PropType<DetailGroup[]>,
default: () => [],
},
api: {
type: String,
},
checkApi: {
type: String,
},
title: {
type: String,
default: '查看',
},
formLayout: {
type: String,
default: '',
},
dataHandle: Function,
},
setup(props) {
const SkeletonTitleProps = ref({
width: 150,
});
const router = useRouter();
const status = ref();
const { query } = router.currentRoute.value;
status.value = query.status;
// const check = query.status == 5 ? true : false;
const dataRef = ref([]);
const textTitle = props.title?.slice(2);
const checkReq = (type) => {
const text = {
pass: {
title: '审核通过',
content: `审核通过后将发布${textTitle}`,
value: 1,
},
reject: {
title: '审核驳回',
content: `确认驳回该${textTitle}发布内容?`,
value: 0,
},
};
NsModal.confirm({
title: createVNode('div', { style: 'font-weight:600;font-size: 16px' }, text[type].title),
content: createVNode('div', { style: 'font-size: 14px' }, text[type].content),
// icon: createVNode(ExclamationCircleOutlined),
okText: '确认',
cancelText: '取消',
onOk() {
req(text[type].value);
},
onCancel() {},
});
};
const req = (val) => {
const data = {
...query,
approvalStatus: val,
};
http.post(props.checkApi, data).then((res) => {
NsMessage.success('操作成功', 1, () => {
router.back();
});
});
};
const formatTable = (a) => {
if (a) {
// content = content.replace(/<br[^>]*\/>/gi, '');
a = a.replace(/<th[^<>]*>/gi, '<th style="background-color:#F0F3F4;padding:5px 5px">');
a = a.replace(/<td[^<>]*>/gi, '<td style="padding:5px 5px">');
a = a.replace(
/<table[^>]*>/gi,
'<table cellpadding="0" cellspacing="0" max-width="100%" border="1" style=" text-align:center;border: 1px solid #ccc;"',
);
return a;
} else {
return null;
}
};
let loading = ref<boolean>(true);
function request() {
// const { query } = route;
http.get(props.api, query).then((res) => {
// dataRef.value = res.data;
dataRef.value = props.dataHandle ? props.dataHandle(res.data) : res.data;
loading.value = false;
});
}
request();
const getDetail = computed(() => {
const detail = cloneDeep(props.detail);
return (detail as Array<DetailGroup>).map((group: DetailGroup) => {
const SkeletonWidth = [];
for (let i = 0; i < group.items.length; i++) {
if (group.items[i].type === 'table') {
SkeletonWidth.push('80%');
} else {
SkeletonWidth.push('30%');
}
}
const { title, items } = group;
return {
title: title,
items: items.map((item) => {
if (!loading.value) {
const { ifShow } = item;
item.value = get(dataRef.value, item.name);
item.ifShow = isFunction(ifShow)
? ifShow(dataRef.value)
: isUndefined(ifShow)
? true
: ifShow;
if (item.format) {
item.value = item.format(item.value, dataRef.value);
}
}
return item;
}),
SkeletonParagraphProps: {
rows: items.length,
width: SkeletonWidth,
},
SkeletonTitleProps: {
width: 150,
},
};
});
});
return {
request,
getDetail,
loading,
SkeletonTitleProps,
formatTable,
checkReq,
status,
};
},
// created() {
// this.request();
// },
methods: {
onBack() {
this.$router.back();
},
},
});
</script>
<style lang="less" scoped>
.ns-detail-content {
padding: 0 24px;
}
:deep(.ant-skeleton-paragraph) {
display: flex;
flex-wrap: wrap;
}
:deep(.ant-skeleton-paragraph li:nth-child(n)) {
display: block;
margin-right: 4%;
margin-top: 16px;
margin-bottom: 4px;
}
:deep(.ant-skeleton-paragraph li:nth-child(3n + 3)) {
margin-right: 0;
}
:deep(.ant-skeleton-content) {
padding: 0 8px 10px 10px;
}
:deep(.ant-descriptions-item-label),
:deep(.ant-descriptions-item-content) {
line-height: 22px;
}
:deep(.ant-descriptions-view) {
padding-bottom: 8px;
}
:deep(.ant-descriptions-item) {
padding-right: 20px;
&:nth-child(2n) {
padding-left: 20px;
}
&:nth-child(3n) {
padding-left: 20px;
padding-right: 0;
}
}
.ns-detail {
border-bottom: 1px solid #ecedef;
&:last-child {
border-bottom-width: 0;
}
:deep(.ant-descriptions-header) {
margin-top: 24px;
margin-bottom: 24px;
.ant-descriptions-title {
line-height: 16px;
font-size: 16px;
}
}
}
.ns-detail-html {
:deep(table) {
border-top: 1px solid #ffffff;
border-left: 1px solid #ffffff;
:deep(p) {
font-size: 12px;
color: #898e91;
}
}
:deep(th) {
border-right: 1px solid #ffffff;
font-size: 13px;
padding-top: 5px;
padding-bottom: 5px;
font-weight: normal;
background: #eff0f2;
}
:deep(td) {
border-top: 1px solid #ffffff;
border-right: 1px solid #ffffff;
padding-top: 5px;
padding-bottom: 5px;
font-size: 12px;
color: #606060;
text-align: center;
:deep(text) {
border-bottom: 1px solid #ffffff;
}
background: rgba(240, 242, 245, 0.5);
}
}
</style>

178
nervui-mobile-application/src/view/systemManage/components/myURL.vue

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

122
nervui-mobile-application/src/view/systemManage/components/radio.vue

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

169
nervui-mobile-application/src/view/systemManage/logManage/index.vue

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

336
nervui-mobile-application/src/view/systemManage/openScreenManage/add.vue

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

96
nervui-mobile-application/src/view/systemManage/openScreenManage/detail.vue

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

226
nervui-mobile-application/src/view/systemManage/openScreenManage/index.vue

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

51
nervui-mobile-application/tsconfig.json

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

43
nervui-mobile-application/vite.config.ts

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

10
nervui-smart-parking/.env

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

22
nervui-smart-parking/.env.development

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

35
nervui-smart-parking/.env.production

@ -1,35 +0,0 @@
# Whether to open mock
VITE_USE_MOCK = true
# public path
VITE_PUBLIC_PATH = /
# Delete console
VITE_DROP_CONSOLE = true
# Whether to enable gzip or brotli compression
# Optional: gzip | brotli | none
# If you need multiple forms, you can use `,` to separate
VITE_BUILD_COMPRESS = 'none'
# Whether to delete origin files when using compress, default false
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
# Basic interface address SPA
VITE_GLOB_API_URL=/basic-api
# File upload address, optional
# It can be forwarded by nginx or write the actual address directly
VITE_GLOB_UPLOAD_URL=/upload
# Interface prefix
VITE_GLOB_API_URL_PREFIX=
# Whether to enable image compression
VITE_USE_IMAGEMIN= true
# use pwa
VITE_USE_PWA = false
# Is it compatible with older browsers
VITE_LEGACY = false

1
nervui-smart-parking/.version

@ -1 +0,0 @@
2.1.19

74
nervui-smart-parking/build.sh

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

24
nervui-smart-parking/index.html

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

95
nervui-smart-parking/mock/user.ts

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

BIN
nervui-smart-parking/public/asset/file/carWashStore.xlsx

Binary file not shown.

BIN
nervui-smart-parking/public/asset/file/chargePositionImport.xlsx

Binary file not shown.

BIN
nervui-smart-parking/public/asset/file/couponGifts.xlsx

Binary file not shown.

BIN
nervui-smart-parking/public/asset/file/defenceArea.xlsx

Binary file not shown.

BIN
nervui-smart-parking/public/asset/file/drivingTestFilings.xlsx

Binary file not shown.

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

Loading…
Cancel
Save