zhangxing пре 3 година
родитељ
комит
249e19ec55
5 измењених фајлова са 1438 додато и 10 уклоњено
  1. 336 0
      .eslintrc.js
  2. 3 0
      package.json
  3. 155 6
      src/App.vue
  4. 3 3
      src/utils/local.ts
  5. 941 1
      yarn.lock

+ 336 - 0
.eslintrc.js

@@ -0,0 +1,336 @@
+module.exports = {
+  root: true,
+  parserOptions: {
+    parser: 'babel-eslint',
+    sourceType: 'module'
+  },
+  env: {
+    browser: true,
+    node: true,
+    es6: true
+  },
+  extends: ['plugin:vue/recommended', 'eslint:recommended'],
+
+  // add your custom rules here
+  // it is base on https://github.com/vuejs/eslint-config-vue
+  rules: {
+    // 强制每行的最大属性数
+    'vue/max-attributes-per-line': [2, {
+      // 单行时可以接收最大数量
+      'singleline': 10,
+      // 多行时可以接收最大数量
+      'multiline': {
+        'max': 1,
+        'allowFirstLine': false
+      }
+    }],
+    'vue/return-in-computed-property': [2, {
+      'treatUndefinedAsUnspecified': true
+    }],
+    // 在单行元素的内容前后需要换行符
+    'vue/singleline-html-element-content-newline': 'off',
+    // 在多行元素的内容前后需要换行符
+    'vue/multiline-html-element-content-newline': 'off',
+    'vue/name-property-casing': ['error', 'PascalCase'],
+    // 禁止使用 v-html 防止 XSS 攻击
+    'vue/no-v-html': 'off',
+    // 定义对象的set存取器属性时,强制定义get
+    'accessor-pairs': 2,
+    // =>的前/后括号
+    'arrow-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    // 禁止或强制在代码块中开括号前和闭括号后有空格
+    'block-spacing': [2, 'always'],
+    // 强制在代码块中使用一致的大括号风格
+    'brace-style': [2, '1tbs', {
+      'allowSingleLine': true
+    }],
+    // 双峰驼命名格式
+    'camelcase': [0, {
+      'properties': 'always'
+    }],
+    // 数组和对象键值对最后一个逗号, never参数:不能带末尾的逗号, always参数:必须带末尾的逗号,
+    // always-multiline:多行模式必须带逗号,单行模式不能带逗号
+    'comma-dangle': [2, 'never'],
+    // 控制逗号前后的空格
+    'comma-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    // 控制逗号在行尾出现还是在行首出现
+    'comma-style': [2, 'last'],
+    // 强制在子类构造函数中用super()调用父类构造函数,TypeScrip的编译器也会提示
+    'constructor-super': 2,
+    // if else while for do后面的代码块是否需要{ }包围,参数:
+    //    multi  只有块中有多行语句时才需要{ }包围
+    //    multi-line  只有块中有多行语句时才需要{ }包围, 但是块中的执行语句只有一行时,
+    //                   块中的语句只能跟和if语句在同一行。if (foo) foo++; else doSomething();
+    //    multi-or-nest 只有块中有多行语句时才需要{ }包围, 如果块中的执行语句只有一行,执行语句可以零另起一行也可以跟在if语句后面
+    //    [2, "multi", "consistent"] 保持前后语句的{ }一致
+    //    default: [2, "all"] 全都需要{ }包围
+    'curly': [2, 'multi-line'],
+    // 强制object.key 中 . 的位置,参数:
+    //      property,'.'号应与属性在同一行
+    //      object, '.' 号应与对象名在同一行
+    'dot-location': [2, 'property'],
+    // 文件末尾强制换行
+    'eol-last': 2,
+    // 使用 === 替代 ==
+    'eqeqeq': [2, 'always', { 'null': 'ignore' }],
+    // 强制 generator 函数中 * 号周围使用一致的空格
+    'generator-star-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    // 要求回调函数中有容错处理
+    'handle-callback-err': [2, '^(err|error)$'],
+    // 强制使用一致的缩进
+    'indent': [2, 2, {
+      'SwitchCase': 1
+    }],
+    'jsx-quotes': [2, 'prefer-single'],
+    // 强制在对象字面量的属性中键和值之间使用一致的间距
+    'key-spacing': [2, {
+      'beforeColon': false,
+      'afterColon': true
+    }],
+    // 强制在关键字前后使用一致的空格
+    'keyword-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    // 要求构造函数首字母大写
+    'new-cap': [2, {
+      'newIsCap': true,
+      'capIsNew': false
+    }],
+    // 强制或禁止调用无参构造函数时有圆括号
+    'new-parens': 2,
+    // 禁止使用数组构造器
+    'no-array-constructor': 2,
+    // 禁止使用arguments.caller或arguments.callee
+    'no-caller': 2,
+    // 禁止使用console
+    'no-console': 0,
+    // 禁止给类赋值
+    'no-class-assign': 2,
+    // 禁止在条件表达式中使用赋值语句
+    'no-cond-assign': 2,
+    // 禁止修改const声明的变量
+    'no-const-assign': 2,
+    // 禁止在正则表达式中使用控制字符
+    'no-control-regex': 0,
+    // 不能对var声明的变量使用delete操作符
+    'no-delete-var': 2,
+    // 函数参数不能重复
+    'no-dupe-args': 2,
+    // no-dupe-class-members
+    'no-dupe-class-members': 2,
+    // 在创建对象字面量时不允许键重复 {a:1,a:1}
+    'no-dupe-keys': 2,
+    // switch中的case标签不能重复
+    'no-duplicate-case': 2,
+    // 正则表达式中的[]内容不能为空
+    'no-empty-character-class': 2,
+    // no-empty-pattern
+    'no-empty-pattern': 2,
+    // 禁止使用eval
+    'no-eval': 2,
+    // 禁止给catch语句中的异常参数赋值
+    'no-ex-assign': 2,
+    // 禁止扩展native对象
+    'no-extend-native': 2,
+    // 禁止不必要的函数绑定
+    'no-extra-bind': 2,
+    // 禁止不必要的bool转换
+    'no-extra-boolean-cast': 2,
+    // 禁止非必要的括号
+    'no-extra-parens': [2, 'functions'],
+    // 禁止switch穿透
+    'no-fallthrough': 2,
+    // 禁止省略浮点数中的0 .5 3.
+    'no-floating-decimal': 2,
+    // 禁止重复的函数声明
+    'no-func-assign': 2,
+    // 禁止使用隐式eval
+    'no-implied-eval': 2,
+    // 禁止在块语句中使用声明(变量或函数)
+    'no-inner-declarations': [2, 'functions'],
+    // 禁止无效的正则表达式
+    'no-invalid-regexp': 2,
+    // 不能有不规则的空格
+    'no-irregular-whitespace': 2,
+    // 禁止使用__iterator__ 属性
+    'no-iterator': 2,
+    // label名不能与var声明的变量名相同
+    'no-label-var': 2,
+    // 禁止使用空label
+    'no-labels': [2, {
+      'allowLoop': false,
+      'allowSwitch': false
+    }],
+    // 禁止不必要的嵌套块
+    'no-lone-blocks': 2,
+    // 禁止混用tab和空格
+    'no-mixed-spaces-and-tabs': 2,
+    // 不能用多余的空格
+    'no-multi-spaces': 2,
+    // 字符串不能用\换行
+    'no-multi-str': 2,
+    // 空行最多不能超过2行
+    'no-multiple-empty-lines': [2, {
+      'max': 2
+    }],
+    // 禁止对原生对象或只读的全局对象进行赋值
+    'no-global-assign': 2,
+    // 禁止对关系运算符的左操作数使用否定操作符
+    'no-unsafe-negation': 2,
+    // 禁止使用new Object()
+    'no-new-object': 2,
+    // 禁止使用new require
+    'no-new-require': 2,
+    // 禁止 Symbolnew 操作符和 new 一起使用
+    'no-new-symbol': 2,
+    // 禁止使用new创建包装实例,new String new Boolean new Number
+    'no-new-wrappers': 2,
+    // 不能调用内置的全局对象,比如Math() JSON()
+    'no-obj-calls': 2,
+    // 禁止使用八进制数字
+    'no-octal': 2,
+    // 禁止使用八进制转义序列
+    'no-octal-escape': 2,
+    // node中不能使用__dirname或__filename做路径拼接
+    'no-path-concat': 2,
+    // 禁止使用__proto__属性
+    'no-proto': 2,
+    // 禁止重复声明变量
+    'no-redeclare': 2,
+    // 禁止在正则表达式字面量中使用多个空格 /foo bar/
+    'no-regex-spaces': 2,
+    // return 语句中不能有赋值表达式
+    'no-return-assign': [2, 'except-parens'],
+    // 禁止自我赋值
+    'no-self-assign': 2,
+    // 不能比较自身
+    'no-self-compare': 2,
+    // 禁止使用逗号运算符
+    'no-sequences': 2,
+    // 严格模式中规定的限制标识符不能作为声明时的变量名使用
+    'no-shadow-restricted-names': 2,
+    // 要求或禁止在函数标识符和其调用之间有空格
+    'func-call-spacing': 2,
+    // 禁止稀疏数组, [1,,2]
+    'no-sparse-arrays': 2,
+    // 在调用super()之前不能使用this或super
+    'no-this-before-super': 2,
+    // 禁止抛出字面量错误 throw "error";
+    'no-throw-literal': 2,
+    // 一行结束后面不要有空格
+    'no-trailing-spaces': 2,
+    // 不能有未定义的变量
+    'no-undef': 2,
+    // 变量初始化时不能直接给它赋值为undefined
+    'no-undef-init': 2,
+    // 避免多行表达式
+    'no-unexpected-multiline': 2,
+    // 禁用一成不变的循环条件
+    'no-unmodified-loop-condition': 2,
+    // 禁止不必要的嵌套 var isYes = answer === 1 ? true : false;
+    'no-unneeded-ternary': [2, {
+      'defaultAssignment': false
+    }],
+    // 不能有无法执行的代码
+    'no-unreachable': 2,
+    // 禁止在 finally 语句块中出现控制流语句
+    'no-unsafe-finally': 2,
+    // 禁止无用的表达式
+    'no-unused-expressions': 2,
+    // 不能有声明后未被使用的变量或参数
+    'no-unused-vars': [2, {
+      'vars': 'all',
+      'args': 'none'
+    }],
+    // 未定义前不能使用
+    'no-use-before-define': 2,
+    // 禁止不必要的call和apply
+    'no-useless-call': 2,
+    // 禁止在对象中使用不必要的计算属性
+    'no-useless-computed-key': 2,
+    // 禁用不必要的构造函数
+    'no-useless-constructor': 2,
+    // 禁用不必要的转义字符
+    'no-useless-escape': 0,
+    // 禁止属性前有空白
+    'no-whitespace-before-property': 2,
+    // 禁用with
+    'no-with': 2,
+    // 连续声明
+    'one-var': [2, {
+      'initialized': 'never'
+    }],
+    // 换行时运算符在行尾还是行首
+    'operator-linebreak': [2, 'after', {
+      'overrides': {
+        '?': 'before',
+        ':': 'before'
+      }
+    }],
+    // 块语句内行首行尾是否要空行
+    'padded-blocks': [2, 'never'],
+    // 引号类型 `` "" ''
+    'quotes': [2, 'single', {
+      'avoidEscape': true,
+      'allowTemplateLiterals': true
+    }],
+    // 语句强制分号结尾
+    'semi': [2, 'never'],
+    // 分号前后空格
+    'semi-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    // 不以新行开始的块{前面要不要有空格
+    'space-before-blocks': [2, 'always'],
+    // 函数定义时括号前面要不要有空格
+    'space-before-function-paren': [2, 'never'],
+    // 小括号里面要不要有空格
+    'space-in-parens': [2, 'never'],
+    // 中缀操作符周围要不要有空格
+    'space-infix-ops': 2,
+    // 一元运算符的前/后要不要加空格
+    'space-unary-ops': [2, {
+      'words': true,
+      'nonwords': false
+    }],
+    // 注释风格不要有空格什么的
+    'spaced-comment': [2, 'always', {
+      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
+    }],
+    // 使用严格模式
+    'strict': 2,
+    // 要求或禁止模板字符串中的嵌入表达式周围空格的使用
+    'template-curly-spacing': [2, 'never'],
+    // 禁止比较时使用NaN,只能用isNaN()
+    'use-isnan': 2,
+    // 必须使用合法的typeof的值
+    'valid-typeof': 2,
+    // 要求 IIFE 使用括号括起来
+    'wrap-iife': [2, 'any'],
+    // 强制在 yield* 表达式中 * 周围使用空格
+    'yield-star-spacing': [2, 'both'],
+    // 禁止尤达条件
+    'yoda': [2, 'never'],
+    // 首选const
+    'prefer-const': 2,
+    // 禁止使用debugger
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
+    // 大括号内是否允许不必要的空格
+    'object-curly-spacing': [2, 'always', {
+      objectsInObjects: false
+    }],
+    // 指定数组的元素之间要以空格隔开(,后面), never参数:[ 之前和 ] 之后不能带空格,always参数:[ 之前和 ] 之后必须带空格
+    'array-bracket-spacing': [2, 'never']
+  }
+}

+ 3 - 0
package.json

@@ -16,6 +16,9 @@
   "devDependencies": {
     "@types/node": "^18.11.9",
     "@vitejs/plugin-vue": "^3.2.0",
+    "babel-eslint": "^10.1.0",
+    "eslint": "^8.33.0",
+    "eslint-plugin-vue": "^9.9.0",
     "typescript": "^4.6.4",
     "vite": "^3.2.0",
     "vue-tsc": "^1.0.9"

+ 155 - 6
src/App.vue

@@ -1,13 +1,162 @@
 <template>
-  <div>
+  <section v-loading="isLoad">
+    <main>
+      <el-form ref="form" :rules="rules" :model="form" label-width="8em">
+        <el-form-item label="当日结算设置">
+          <span>固定比例:{{ 123456 }}</span>
+          <p>生效日期:{{ now.day }}</p>
+          <p>超级代理:{{ now.level1 }}</p>
+          <p>1级代理:{{ now.level2 }}</p>
+          <p>2级代理:{{ now.level3 }}</p>
+          <p>3级代理:{{ now.level4 }}</p>
+        </el-form-item>
 
-  </div>
+        <el-form-item prop="proportion" label="变更设置">
+          <p><span style="display:inline-block;width:5em;text-align:right">超级代理:</span><el-input-number v-model="form.future.level1" size="mini" style="width:10em" placeholder="请输入超级代理" :min="0.00001" /></p>
+          <p><span style="display:inline-block;width:5em;text-align:right">1级代理:</span><el-input-number v-model="form.future.level2" size="mini" style="width:10em" placeholder="请输入1级代理" :min="0.00001" /></p>
+          <p><span style="display:inline-block;width:5em;text-align:right">2级代理:</span><el-input-number v-model="form.future.level3" size="mini" style="width:10em" placeholder="请输入2级代理" :min="0.00001" /></p>
+          <p><span style="display:inline-block;width:5em;text-align:right">3级代理:</span><el-input-number v-model="form.future.level4" size="mini" style="width:10em" placeholder="请输入3级代理" :min="0.00001" /></p>
+        </el-form-item>
+        <el-form-item prop="effectTime" label="选择生效日期">
+          <el-date-picker
+            v-model="form.future.day"
+            type="date"
+            placeholder="选择生效日期"
+          />
+        </el-form-item>
+      </el-form>
+    </main>
+    <footer class="area" style="text-align:right">
+      <el-button type="primary" @click="ok">提交</el-button>
+    </footer>
+  </section>
 </template>
 
-<script setup lang="ts">
+<script>
+import { formatDate } from '@/util/time.js'
 
-</script>
+export default {
+  name: 'ClearingMoneySetting',
+  props: ['visible', 'data'],
+  data() {
+    const proportionValidator = (rule, value, cb) => {
+      if (value == '') {
+        cb('请输入比例(比例不得为0)')
+      } else if (parseFloat(value) > 100) {
+        cb('比例不得大于100')
+      } else {
+        cb()
+      }
+    }
+
+    const effectTimeValidator = (rule, value, cb) => {
+      const day = new Date(this.form.future.day).getTime()
+      const now = Date.now()
+      const offset = day - now
+      if (offset > 0) {
+        cb()
+      } else {
+        cb('时间不得小于当前时间')
+      }
+    }
 
-<style scoped>
+    return {
+      isLoad: false,
+      now: {
+        day: '',
+        level1: '',
+        level2: '',
+        level3: '',
+        level4: ''
+      },
+      form: {
+        future: {
+          day: '',
+          level1: '',
+          level2: '',
+          level3: '',
+          level4: ''
+        }
+      },
+      rules: {
+        proportion: [
+          {
+            required: true,
+            validator: proportionValidator,
+            trigger: 'blur'
+          }
+        ],
+        effectTime: [
+          { validator: effectTimeValidator, trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  created() {
+    this.load()
+  },
+  methods: {
+    load() {
+      const url = `${
+        process.env.CREDIT_HOST
+      }/credits/agent/get_settlement_money`
+      this.isLoad = true
+      return this.$http
+        .get(url)
+        .then(resp => {
+          if (resp.data.success) {
+            const data = resp.data.data
+            this.now = Object.assign(this.now, data.now)
+            this.form.future = Object.assign(this.form.future, data.future)
+            this.form.future.day = new Date(this.form.future.day)
+            this.isLoad = false
+          } else {
+            this.$message.error(resp.data.errors)
+          }
+        })
+        .catch(resp => {
+          this.$message.error('获取结算金额失败')
+        })
+    },
+    ok() {
+      this.$refs['form'].validate(valid => {
+        if (valid) {
+          this.setting()
+        } else {
+          this.$message.info('信息不完整或格式有误')
+        }
+      })
+    },
+    setting() {
+      const params = {
+        day: formatDate(this.form.future.day),
+        level1: this.form.future.level1,
+        level2: this.form.future.level2,
+        level3: this.form.future.level3,
+        level4: this.form.future.level4
+      }
 
-</style>
+      const url = `${
+        process.env.CREDIT_HOST
+      }/credits/agent/set_settlement_money`
+      return this.$http
+        .post(url, params)
+        .then(resp => {
+          if (resp.data.success) {
+            this.$emit('complete')
+            this.$message.success('变更成功')
+            this.close()
+          } else {
+            this.$message.error(resp.data.errors)
+          }
+        })
+        .catch(resp => {
+          this.$message.error('变更失败')
+        })
+    },
+    close() {
+      this.$emit('update:visible', false)
+    }
+  }
+}
+</script>

+ 3 - 3
src/utils/local.ts

@@ -1,17 +1,17 @@
 // 封装本地存储
 
 // 存
-export const setLocal = (key:any, value:any) => {
+export const setLocal = (key: any, value: any) => {
     localStorage.setItem(key, JSON.stringify(value))
 }
 
 // 取
-export const getLocal = (key:any) => {
+export const getLocal = (key: any) => {
     return JSON.parse(localStorage.getItem(key))
 }
 
 // 删除
-export const removeLocal = (key:any) => {
+export const removeLocal = (key: any) => {
     localStorage.removeItem(key)
 }
 

Разлика између датотеке није приказан због своје велике величине
+ 941 - 1
yarn.lock