吕卓 3 years ago
parent
commit
b069c8891f

+ 55 - 0
package-lock.json

@@ -6847,6 +6847,61 @@
       "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
       "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
     },
+    "dotenv-cli": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-4.0.0.tgz",
+      "integrity": "sha512-ByKEec+ashePEXthZaA1fif9XDtcaRnkN7eGdBDx3HHRjwZ/rA1go83Cbs4yRrx3JshsCf96FjAyIA2M672+CQ==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^7.0.1",
+        "dotenv": "^8.1.0",
+        "dotenv-expand": "^5.1.0",
+        "minimist": "^1.1.3"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
     "dotenv-expand": {
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",

+ 2 - 0
package.json

@@ -82,6 +82,8 @@
   },
   "scripts": {
     "start": "node scripts/start.js",
+    "dev": "node scripts/teststart.js --open chrome",
+    "devbuild": "node scripts/testbuild.js --open chrome",
     "build": "node scripts/build.js",
     "test": "node scripts/test.js"
   },

+ 212 - 0
scripts/testbuild.js

@@ -0,0 +1,212 @@
+'use strict';
+
+// Do this as the first thing so that any code reading it knows the right env.
+process.env.BABEL_ENV = 'test_production';
+process.env.NODE_ENV = 'test_production';
+
+// Makes the script crash on unhandled rejections instead of silently
+// ignoring them. In the future, promise rejections that are not handled will
+// terminate the Node.js process with a non-zero exit code.
+process.on('unhandledRejection', err => {
+  throw err;
+});
+
+// Ensure environment variables are read.
+require('../config/env');
+
+
+const path = require('path');
+const chalk = require('react-dev-utils/chalk');
+const fs = require('fs-extra');
+const bfj = require('bfj');
+const webpack = require('webpack');
+const configFactory = require('../config/webpack.config');
+const paths = require('../config/paths');
+const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles');
+const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages');
+const printHostingInstructions = require('react-dev-utils/printHostingInstructions');
+const FileSizeReporter = require('react-dev-utils/FileSizeReporter');
+const printBuildError = require('react-dev-utils/printBuildError');
+
+const measureFileSizesBeforeBuild =
+  FileSizeReporter.measureFileSizesBeforeBuild;
+const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild;
+const useYarn = fs.existsSync(paths.yarnLockFile);
+
+// These sizes are pretty large. We'll warn for bundles exceeding them.
+const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024;
+const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024;
+
+const isInteractive = process.stdout.isTTY;
+
+// Warn and crash if required files are missing
+if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) {
+  process.exit(1);
+}
+
+const argv = process.argv.slice(2);
+const writeStatsJson = argv.indexOf('--stats') !== -1;
+
+// Generate configuration
+const config = configFactory('test_production');
+
+// We require that you explicitly set browsers and do not fall back to
+// browserslist defaults.
+const { checkBrowsers } = require('react-dev-utils/browsersHelper');
+checkBrowsers(paths.appPath, isInteractive)
+  .then(() => {
+    // First, read the current file sizes in build directory.
+    // This lets us display how much they changed later.
+    return measureFileSizesBeforeBuild(paths.appBuild);
+  })
+  .then(previousFileSizes => {
+    // Remove all content but keep the directory so that
+    // if you're in it, you don't end up in Trash
+    fs.emptyDirSync(paths.appBuild);
+    // Merge with the public folder
+    copyPublicFolder();
+    // Start the webpack build
+    return build(previousFileSizes);
+  })
+  .then(
+    ({ stats, previousFileSizes, warnings }) => {
+      if (warnings.length) {
+        console.log(chalk.yellow('Compiled with warnings.\n'));
+        console.log(warnings.join('\n\n'));
+        console.log(
+          '\nSearch for the ' +
+            chalk.underline(chalk.yellow('keywords')) +
+            ' to learn more about each warning.'
+        );
+        console.log(
+          'To ignore, add ' +
+            chalk.cyan('// eslint-disable-next-line') +
+            ' to the line before.\n'
+        );
+      } else {
+        console.log(chalk.green('Compiled successfully.\n'));
+      }
+
+      console.log('File sizes after gzip:\n');
+      printFileSizesAfterBuild(
+        stats,
+        previousFileSizes,
+        paths.appBuild,
+        WARN_AFTER_BUNDLE_GZIP_SIZE,
+        WARN_AFTER_CHUNK_GZIP_SIZE
+      );
+      console.log();
+
+      const appPackage = require(paths.appPackageJson);
+      const publicUrl = paths.publicUrlOrPath;
+      const publicPath = config.output.publicPath;
+      const buildFolder = path.relative(process.cwd(), paths.appBuild);
+      printHostingInstructions(
+        appPackage,
+        publicUrl,
+        publicPath,
+        buildFolder,
+        useYarn
+      );
+    },
+    err => {
+      const tscCompileOnError = process.env.TSC_COMPILE_ON_ERROR === 'true';
+      if (tscCompileOnError) {
+        console.log(
+          chalk.yellow(
+            'Compiled with the following type errors (you may want to check these before deploying your app):\n'
+          )
+        );
+        printBuildError(err);
+      } else {
+        console.log(chalk.red('Failed to compile.\n'));
+        printBuildError(err);
+        process.exit(1);
+      }
+    }
+  )
+  .catch(err => {
+    if (err && err.message) {
+      console.log(err.message);
+    }
+    process.exit(1);
+  });
+
+// Create the production build and print the deployment instructions.
+function build(previousFileSizes) {
+  console.log('Creating an optimized production build...');
+
+  const compiler = webpack(config);
+  return new Promise((resolve, reject) => {
+    compiler.run((err, stats) => {
+      let messages;
+      if (err) {
+        if (!err.message) {
+          return reject(err);
+        }
+
+        let errMessage = err.message;
+
+        // Add additional information for postcss errors
+        if (Object.prototype.hasOwnProperty.call(err, 'postcssNode')) {
+          errMessage +=
+            '\nCompileError: Begins at CSS selector ' +
+            err['postcssNode'].selector;
+        }
+
+        messages = formatWebpackMessages({
+          errors: [errMessage],
+          warnings: [],
+        });
+      } else {
+        messages = formatWebpackMessages(
+          stats.toJson({ all: false, warnings: true, errors: true })
+        );
+      }
+      if (messages.errors.length) {
+        // Only keep the first error. Others are often indicative
+        // of the same problem, but confuse the reader with noise.
+        if (messages.errors.length > 1) {
+          messages.errors.length = 1;
+        }
+        return reject(new Error(messages.errors.join('\n\n')));
+      }
+      if (
+        process.env.CI &&
+        (typeof process.env.CI !== 'string' ||
+          process.env.CI.toLowerCase() !== 'false') &&
+        messages.warnings.length
+      ) {
+        console.log(
+          chalk.yellow(
+            '\nTreating warnings as errors because process.env.CI = true.\n' +
+              'Most CI servers set it automatically.\n'
+          )
+        );
+        return reject(new Error(messages.warnings.join('\n\n')));
+      }
+
+      const resolveArgs = {
+        stats,
+        previousFileSizes,
+        warnings: messages.warnings,
+      };
+
+      if (writeStatsJson) {
+        return bfj
+          .write(paths.appBuild + '/bundle-stats.json', stats.toJson())
+          .then(() => resolve(resolveArgs))
+          .catch(error => reject(new Error(error)));
+      }
+
+      return resolve(resolveArgs);
+    });
+  });
+}
+
+function copyPublicFolder() {
+  fs.copySync(paths.appPublic, paths.appBuild, {
+    dereference: true,
+    filter: file => file !== paths.appHtml,
+  });
+}

+ 166 - 0
scripts/teststart.js

@@ -0,0 +1,166 @@
+'use strict';
+
+// Do this as the first thing so that any code reading it knows the right env.
+process.env.BABEL_ENV = 'test_dev';
+process.env.NODE_ENV = 'test_dev';
+
+// Makes the script crash on unhandled rejections instead of silently
+// ignoring them. In the future, promise rejections that are not handled will
+// terminate the Node.js process with a non-zero exit code.
+process.on('unhandledRejection', err => {
+  throw err;
+});
+
+// Ensure environment variables are read.
+require('../config/env');
+
+
+const fs = require('fs');
+const chalk = require('react-dev-utils/chalk');
+const webpack = require('webpack');
+const WebpackDevServer = require('webpack-dev-server');
+const clearConsole = require('react-dev-utils/clearConsole');
+const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles');
+const {
+  choosePort,
+  createCompiler,
+  prepareProxy,
+  prepareUrls,
+} = require('react-dev-utils/WebpackDevServerUtils');
+const openBrowser = require('react-dev-utils/openBrowser');
+const semver = require('semver');
+const paths = require('../config/paths');
+const configFactory = require('../config/webpack.config');
+const createDevServerConfig = require('../config/webpackDevServer.config');
+const getClientEnvironment = require('../config/env');
+const react = require(require.resolve('react', { paths: [paths.appPath] }));
+
+const env = getClientEnvironment(paths.publicUrlOrPath.slice(0, -1));
+const useYarn = fs.existsSync(paths.yarnLockFile);
+const isInteractive = process.stdout.isTTY;
+
+// Warn and crash if required files are missing
+if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) {
+  process.exit(1);
+}
+
+// Tools like Cloud9 rely on this.
+const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000;
+const HOST = process.env.HOST || '0.0.0.0';
+
+if (process.env.HOST) {
+  console.log(
+    chalk.cyan(
+      `Attempting to bind to HOST environment variable: ${chalk.yellow(
+        chalk.bold(process.env.HOST)
+      )}`
+    )
+  );
+  console.log(
+    `If this was unintentional, check that you haven't mistakenly set it in your shell.`
+  );
+  console.log(
+    `Learn more here: ${chalk.yellow('https://cra.link/advanced-config')}`
+  );
+  console.log();
+}
+
+// We require that you explicitly set browsers and do not fall back to
+// browserslist defaults.
+const { checkBrowsers } = require('react-dev-utils/browsersHelper');
+checkBrowsers(paths.appPath, isInteractive)
+  .then(() => {
+    // We attempt to use the default port but if it is busy, we offer the user to
+    // run on a different port. `choosePort()` Promise resolves to the next free port.
+    return choosePort(HOST, DEFAULT_PORT);
+  })
+  .then(port => {
+    if (port == null) {
+      // We have not found a port.
+      return;
+    }
+
+    const config = configFactory('test_dev');
+    const protocol = process.env.HTTPS === 'true' ? 'https' : 'http';
+    const appName = require(paths.appPackageJson).name;
+
+    const useTypeScript = fs.existsSync(paths.appTsConfig);
+    const tscCompileOnError = process.env.TSC_COMPILE_ON_ERROR === 'true';
+    const urls = prepareUrls(
+      protocol,
+      HOST,
+      port,
+      paths.publicUrlOrPath.slice(0, -1)
+    );
+    const devSocket = {
+      warnings: warnings =>
+        devServer.sockWrite(devServer.sockets, 'warnings', warnings),
+      errors: errors =>
+        devServer.sockWrite(devServer.sockets, 'errors', errors),
+    };
+    // Create a webpack compiler that is configured with custom messages.
+    const compiler = createCompiler({
+      appName,
+      config,
+      devSocket,
+      urls,
+      useYarn,
+      useTypeScript,
+      tscCompileOnError,
+      webpack,
+    });
+    // Load proxy config
+    const proxySetting = require(paths.appPackageJson).proxy;
+    const proxyConfig = prepareProxy(
+      proxySetting,
+      paths.appPublic,
+      paths.publicUrlOrPath
+    );
+    // Serve webpack assets generated by the compiler over a web server.
+    const serverConfig = createDevServerConfig(
+      proxyConfig,
+      urls.lanUrlForConfig
+    );
+    const devServer = new WebpackDevServer(compiler, serverConfig);
+    // Launch WebpackDevServer.
+    devServer.listen(port, HOST, err => {
+      if (err) {
+        return console.log(err);
+      }
+      if (isInteractive) {
+        clearConsole();
+      }
+
+      if (env.raw.FAST_REFRESH && semver.lt(react.version, '16.10.0')) {
+        console.log(
+          chalk.yellow(
+            `Fast Refresh requires React 16.10 or higher. You are using React ${react.version}.`
+          )
+        );
+      }
+
+      console.log(chalk.cyan('Starting the development server...\n'));
+      openBrowser(urls.localUrlForBrowser);
+    });
+
+    ['SIGINT', 'SIGTERM'].forEach(function (sig) {
+      process.on(sig, function () {
+        devServer.close();
+        process.exit();
+      });
+    });
+
+    if (process.env.CI !== 'true') {
+      // Gracefully exit when stdin ends
+      process.stdin.on('end', function () {
+        devServer.close();
+        process.exit();
+      });
+    }
+  })
+  .catch(err => {
+    if (err && err.message) {
+      console.log(err.message);
+    }
+    process.exit(1);
+  });

+ 2 - 1
src/.env

@@ -1 +1,2 @@
-SKIP_PREFLIGHT_CHECK=true
+SKIP_PREFLIGHT_CHECK = true
+REACT_APP_MGS = '消息'

+ 3 - 0
src/.env_test

@@ -0,0 +1,3 @@
+REACT_APP_BASE_URL = 'http://paytest.zhongsou.com/payment/menchant.query.groovy'
+REACT_APP_ENV = 'test'
+

+ 11 - 2
src/App.css

@@ -34,6 +34,10 @@
 .App-link {
   color: #61dafb;
 }
+.label_x{
+  color: red;
+  padding: 5px;
+}
 
 @keyframes App-logo-spin {
   from {
@@ -68,13 +72,18 @@
   float: left;
 }
 .header_menu{
-  width: calc(100% - 350px);
+  width: calc(100% - 440px);
   height: 60px;
   background-color: #fff;
   float: left;
 }
+.header_user{
+  width: 220px;
+  height: 60px;
+  float: left;
+  border-bottom: 1px solid #f0f0f0;
+}
 .header_navs{
-  width: 90%;
   height: 60px;
   line-height: 60px !important;
 }

+ 35 - 23
src/App.js

@@ -2,6 +2,7 @@ import React, { Component , Suspense } from 'react';
 import ReactDOM from 'react-dom';
 import './App.css';
 import { Menu, Button } from 'antd';
+import { $Axios } from './common/publish';
 import { SettingOutlined, DollarCircleOutlined,  } from '@ant-design/icons';
 import * as Icons from "@ant-design/icons";
 import {
@@ -9,8 +10,7 @@ import {
   MenuFoldOutlined,
   PieChartOutlined,
 } from '@ant-design/icons';
-// import { $Axios } from '&/common/publish';
-
+console.log(process.env)
 export default class App extends React.Component {
   constructor(props) {
     super(props)
@@ -32,13 +32,25 @@ export default class App extends React.Component {
       assembly : 'Layout',
       defaultSelectedKeys : 'Layout',
       defaultSelectedKeys1 : 'Finance-orderQuery',
-      assembly_cw :  'Finance-orderQuery'
+      assembly_cw :  'Finance-orderQuery',
+      user_txt :  {
+        userName : 'xxx',  //名字
+        userJur : 'Y1', //权限
+        userInternet : null, // 用户权限为Y3时 才会出现是否入网字段
+      }
     }
   }
 
 
   componentDidMount() {
-    
+    this.initJurisdiction()
+  }
+  initJurisdiction(){//初始化用户权限
+    console.log('----------初始化用户权限---------');
+    console.log(process.env.NODE_ENV == 'development' ? '----------开发测试环境----------' : '----------线上生产环境----------')
+    this.autoLogin() //登录查询用户信息
+    let Jur = ['Y1','Y2','Y3']   //Y1为云悦平台权限最高权限  //Y2为商城权限二级权限  // Y3为商户权限属于个人权限
+
   }
 
   handleClick(e){
@@ -84,27 +96,20 @@ export default class App extends React.Component {
     return React.createElement(Icons[Icon])
   }
 
-  // autoLogin = () => {
-  //     let param = {
-  //         "account": account,
-  //         "password": password,
-  //         "system_code": "COMBINE",
-  //         "login_ip": login_ip,
-  //         "token": ""
-  //     }
-  //     $Axios('post','http://user_api.airqualitychina.cn:7070/auth/ipLogin',param,(res) => {
-  //         console.log(res)
-  //         let userData = res.data.data.result
-  //         let token = res.data.data.token
-  //         localStorage.setItem('token',token)
-  //         localStorage.setItem('project_id',userData.project_id)
-  //         localStorage.setItem('userData',JSON.stringify(userData))
-  //         me.setState({isLogin:true})
-  //     })
-  // }
+  autoLogin = () => {
+      let url = '/payment/spare.bill.list.groovy'
+      let param = {
+        appName : '吕卓',
+        action : "queryInfo"
+        
+      }
+      $Axios('post',url,param,(res) => {
+        console.log(res)
+      })
+  }
 
   render() {
-    const { current, arr1, arr2 ,keys } = this.state;
+    const { current, arr1, arr2 , user_txt } = this.state;
     const { SubMenu } = Menu;
     return (
       <React.Fragment>
@@ -127,6 +132,13 @@ export default class App extends React.Component {
                 </Menu.Item>
               </Menu>
             </div>
+            <div className='header_user'  style={{lineHeight:'60px'}}>
+                <div style={{width:'50%',lineHeight:'60px',display:'inline-block'}}>用户名 : {user_txt.userName}</div>
+                <div style={{width:'50%',lineHeight:'60px',display:'inline-block'}}>
+                  <a>修改密码</a>
+                  <a style={{marginLeft:'10px'}}>退出</a>
+                </div>
+            </div>
           </div>
           <div className='main_centers'>
             {current === 'one' && <Menu

+ 12 - 4
src/common/publish.js

@@ -27,13 +27,21 @@ export function format(fmt) {
     return year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;
 }
 //请求API,json形式
-export function $Axios (method, url, param, fn, err) {
+export function $Axios (method,urls, param, fn, err) {
+    let url;
+    if(process.env.NODE_ENV === 'development'){ 
+        url = 'http://paytest.zhongsou.com'//开发测试环境API
+    }else{  
+        url = 'http://pay.zhongsou.com' //生产线上环境API
+    }
+    console.log()
 	let methods = method.trim()
 	let obj = {
-		method: methods,
+		method: methods, //请求方式
+        "changeOrigin": true,
 		headers: { 'content-type': 'application/json;charset=utf-8' },
-		url: url,
-        timeout: 30000
+		url: url + urls,
+        timeout: 30000 // 请求时间 超过这个时间 将停止请求
     }
 
     if(method=='post'){

+ 1 - 1
src/component/Layout/Layout.jsx

@@ -5,6 +5,7 @@ import '../Layout/Layout.scss'
 import CenterO from '../center-o/centerO.jsx'
 import CenterW from '../center-w/centerW.jsx'
 import CenterS from '../center-s/centerS.jsx'
+
 export default class Layout extends React.Component {
     constructor(props) {
         super(props)
@@ -76,7 +77,6 @@ export default class Layout extends React.Component {
                         {htmls === 3 && (<CenterS></CenterS>)}
                     </div>
                     <div className='center_bottom'>
-                            {htmls === 1 && <Button className='btn btn_xg'>修改</Button>}
                             {htmls === 1 && <Button className='btn btn_next' type="primary" onClick={() =>this.btnClick(2)} >下一步</Button>}
                             {htmls === 2 && <Button className='btn btn_xg' onClick={() =>this.btnClick(1)} >上一步</Button>}
                             {htmls === 2 && <Button className='btn btn_next' type="primary" onClick={() =>this.btnClick(3)} >下一步</Button>}

+ 1 - 1
src/component/center-o/centerO.jsx

@@ -49,7 +49,7 @@ export default class centerO extends React.Component {
             <div className='center_up'>
                 <div className='center_left'>
                     <div className='c-l'>
-                        <div className='titles'> 商户入网类型 : </div>
+                        <div className='titles'> 商户入网类型<i className='label_x'>*</i> : </div>
                         <Radio.Group name="radiogroup" defaultValue={1}>
                                             <Radio value={1}>被分帐方</Radio>
                                         </Radio.Group>

BIN
src/images/userImg.jpg