Browse Source

财务审批

apply
song 4 years ago
parent
commit
095c043407
  1. 1
      .env.development
  2. 1
      .env.production
  3. 1
      .env.test
  4. 42
      .eslintrc.js
  5. 58
      apis/axios.js
  6. 14
      apis/finance.js
  7. 12
      apis/index.js
  8. 129
      components/FinanceExamine.vue
  9. 131
      components/FinanceManage.vue
  10. 100
      components/Table.vue
  11. 8
      nuxt.config.ts
  12. 427
      package-lock.json
  13. 26
      pages/index.vue
  14. 10
      store/index.js
  15. 61
      store/user.js

1
.env.development

@ -0,0 +1 @@
VITE_API_URL=https://test.tall.wiki

1
.env.production

@ -0,0 +1 @@
VITE_API_URL=http://www.tall.wiki

1
.env.test

@ -0,0 +1 @@
VITE_API_URL=https://test.tall.wiki

42
.eslintrc.js

@ -17,5 +17,47 @@ module.exports = {
'@typescript-eslint',
],
rules: {
'import/no-unresolved': 0,
'import/extensions': 0,
'import/no-extraneous-dependencies': 0,
'no-plusplus': 0,
'no-use-before-define': [
'error',
{
functions: false,
classes: true,
variables: true,
},
],
'consistent-return': 0,
'vue/html-self-closing': 'off',
'no-unused-expressions': 'off',
'vue/no-mutating-props': 'off',
'vue/no-multiple-template-root': 'off',
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-param-reassign': 'off',
'max-len': [
'error',
{
code: 140,
tabWidth: 2,
},
],
'object-curly-newline': ['error', { multiline: true }],
'arrow-parens': ['error', 'as-needed'],
'linebreak-style': 'off',
'vue/attributes-order': 'off',
'vue/singleline-html-element-content-newline': 'off',
'vue/max-attributes-per-line': 'off',
'vue/multiline-html-element-content-newline': 'off',
'vue/html-indent': 'off',
'vue/html-closing-bracket-newline': [
'error',
{
singleline: 'never',
multiline: 'always',
},
],
},
};

58
apis/axios.js

@ -0,0 +1,58 @@
import Axios from 'axios';
import { Toast } from 'vant';
import store from 'store';
const app = createApp();
app.use(Toast);
const baseUrl = '/gateway';
const instance = Axios.create({
baseUrl,
timeout: 20000,
});
// request
instance.interceptors.request.use(
config => {
const token = store.getters['user/token'] || sessionStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
// config.headers.deviceId = store.state.systemInfo.deviceId;
config.headers.deviceId = '1';
config.headers.appType = 0;
return config;
},
error => {
return Promise.reject(error);
},
);
// response
instance.interceptors.response.use(
response => {
if (response.status !== 200 || !response.data) {
return Promise.reject(response.statusText);
}
const { code, data, msg } = response.data;
if (code === 200) {
return data;
}
return Promise.reject(msg);
},
error => {
if (error.response && error.response.data) {
const code = error.response.status;
const msg = error.response.data.message;
// ElMessage.error(`Code: ${code}, Message: ${msg}`);
Toast.fail(`Code: ${code}, Message: ${msg}`);
console.error(`[Axios Error]`, error.response);
} else {
// ElMessage.error(`${error}`);
}
return Promise.reject(error);
},
);
export default instance;

14
apis/finance.js

@ -0,0 +1,14 @@
// noinspection SpellCheckingInspection
import http from 'apis/axios';
const apiUrl = import.meta.env.VITE_API_URL;
console.log('apiUrl: ', apiUrl);
const ptccsens = `${apiUrl}/ptccsens/v1.0`;
const finance = `${ptccsens}/finance`;
// 查看项目下的所有任务对应的财务信息
export const financeInfo = params => http.post(`${finance}/getByTask`, params);
// 修改任务或项目的预算和奖金信息
// export const edit = params => http.post(`${finance}/info`, params);

12
apis/index.js

@ -0,0 +1,12 @@
// noinspection SpellCheckingInspection
import http from 'apis/axios';
const apiUrl = 'https://test.tall.wiki';
const users = `${apiUrl}/gateway/ptostall/users`;
// 根据userId 获取token
export const getToken = userId => http.get(`${users}/userId`, { params: { userId } });
// 登录
export const signIn = params => http.post(`${users}/signin`, params);

129
components/FinanceExamine.vue

@ -0,0 +1,129 @@
<template>
<div>
<div class="w-full overflow-x-scroll">
<table>
<tr class="table-header">
<td width="15%">申请人</td>
<td width="15%">金额()</td>
<td width="30%">时间</td>
<td width="20%">操作</td>
</tr>
<tr v-for="item in arrayData">
<td>{{item.submitName}}</td>
<td>{{item.money}}</td>
<td>{{dayjs(item.submitTime - 0).format('YYYY-MM-DD hh:mm')}}</td>
<td>
<div v-if="item.applyType === 0" class="flex flex-row justify-between">
<van-button type="success" size="mini" class="rounded">通过</van-button>
<van-button type="danger" size="mini" class="rounded">驳回</van-button>
</div>
<div class="text-center" v-else :class="item.applyType === 1 ? 'text-gray-500' : 'text-red-500'">{{ item.applyType === 1 ? '已完成' : '已驳回' }}</div>
</td>
</tr>
</table>
</div>
<div class="pagination">
<van-pagination v-model="currentPage" :page-count="12" mode="simple" />
</div>
</div>
</template>
<script setup>
import dayjs from "dayjs";
import {ref, reactive} from'vue';
const arrayData = ref([
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 0,
},
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 1,
},
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 0,
},
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 0,
},
{
applyId: '001',
submitName:'代用名',
money:1000,
submitTime: '1643018415000',
applyType: 2,
},
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 0,
},
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 0,
},
{
applyId: '001',
submitName:'代用名',
money:0,
submitTime: '1643018415000',
applyType: 0,
}
]);
const sumBudget = arrayData.value.reduce((sum, e) => sum + e.budget, 0);
const sumBonus = arrayData.value.reduce((sum, e) => sum + e.bonus, 0);
const currentPage = ref(1);
const data = reactive({
})
</script>
<style scoped lang="less">
table {
width: 120%;
margin-top: 1rem;
font-size: 14px;
overflow-x: scroll;
color:#797878 ;
td {
border: 0.5px solid #ccc;
padding: 0.85rem;
// width: 5.9375rem;
}
.table-header{
background-color: #F2F2F2;
color: #A0A0A0;
}
}
.pagination{
width:50%;
margin-left: 50%;
margin-top:1rem
}
.input-box{
padding: 0!important;
border-bottom: 1px solid #ccc
}
</style>

131
components/FinanceManage.vue

@ -0,0 +1,131 @@
<template>
<div>
<table>
<tr class="table-header">
<td class="name">任务名称</td>
<td>预算()</td>
<td>奖金()</td>
</tr>
<tr v-for="item in arrayData">
<td>{{item.name}}</td>
<td>
<div v-if="!item.showBudgetEdit" @click="item.showBudgetEdit = true">{{item.budget}}</div>
<van-field v-else v-model="item.budget" type="number" class="input-box" @blur="item.showBudgetEdit = false" />
</td>
<td>
<div v-if="!item.showBonusEdit" @click="item.showBonusEdit = true">{{item.bonus}}</div>
<van-field v-else v-model="item.bonus" type="number" class="input-box" @blur="item.showBonusEdit = false" />
</td>
</tr>
<tr>
<td>合计</td>
<td>{{sumBudget}}</td>
<td>{{sumBonus}}</td>
</tr>
</table>
<div class="pagination">
<van-pagination v-model="currentPage" :page-count="12" mode="simple" />
</div>
</div>
</template>
<script setup>
import {ref, reactive} from'vue'
const arrayData = ref([
{
name:'财务条插件界面设计',
budget:1000,
bonus:0,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:0,
bonus:0,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:0,
bonus:0,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:0,
bonus:200,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:1000,
bonus:0,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:0,
bonus:0,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:0,
bonus:0,
showBudgetEdit: false,
showBonusEdit: false,
},
{
name:'财务条插件界面设计',
budget:0,
bonus:200,
showBudgetEdit: false,
showBonusEdit: false,
}
]);
const sumBudget = arrayData.value.reduce((sum, e) => sum + e.budget, 0);
const sumBonus = arrayData.value.reduce((sum, e) => sum + e.bonus, 0);
const currentPage = ref(1);
const data = reactive({
})
</script>
<style scoped lang="less">
table {
width: 100%;
margin-top: 1rem;
font-size: 14px;
overflow-x: scroll;
color:#797878 ;
td {
border: 0.5px solid #ccc;
padding: 0.85rem;
width: 5.9375rem;
}
.table-header{
background-color: #F2F2F2;
color: #A0A0A0;
}
.name{
width:50%
}
}
.pagination{
width:50%;
margin-left: 50%;
margin-top:1rem
}
.input-box{
padding: 0!important;
border-bottom: 1px solid #ccc
}
</style>

100
components/Table.vue

@ -1,100 +0,0 @@
<template>
<div>
<table>
<tr class="table-header">
<td class="name">任务名称</td>
<td>预算()</td>
<td>奖金()</td>
</tr>
<tr v-for="item in arrayData">
<td>{{item.name}}</td>
<td>{{item.budget}}</td>
<td>{{item.bonus}}</td>
</tr>
<tr>
<td>合计</td>
<td>{{sumBudget}}</td>
<td>{{sumBonus}}</td>
</tr>
</table>
<div class="pagination">
<van-pagination v-model="currentPage" :page-count="12" mode="simple" />
</div>
</div>
</template>
<script setup>
import {ref} from'vue'
const arrayData = ref([
{
name:'财务条插件界面设计',
budget:1000,
bonus:0
},
{
name:'财务条插件界面设计',
budget:0,
bonus:0
},
{
name:'财务条插件界面设计',
budget:0,
bonus:0
},
{
name:'财务条插件界面设计',
budget:0,
bonus:200
},
{
name:'财务条插件界面设计',
budget:1000,
bonus:0
},
{
name:'财务条插件界面设计',
budget:0,
bonus:0
},
{
name:'财务条插件界面设计',
budget:0,
bonus:0
},
{
name:'财务条插件界面设计',
budget:0,
bonus:200
}
]);
const sumBudget = arrayData.value.reduce((sum, e) => sum + e.budget, 0);
const sumBonus = arrayData.value.reduce((sum, e) => sum + e.bonus, 0);
const currentPage = ref(1);
</script>
<style scoped lang="less">
table {
width: 100%;
margin-top: 2rem;
font-size: 14px;
overflow-x: scroll;
color:#797878 ;
td {
border: 0.5px solid #ccc;
padding: 0.85rem 0 0.85rem 0.85rem;
}
.table-header{
background-color: #F2F2F2;
color: #A0A0A0;
}
.name{
width:50%
}
}
.pagination{
width:50%;
margin-left: 50%;
margin-top:1rem
}
</style>

8
nuxt.config.ts

@ -10,6 +10,8 @@ export default defineNuxtConfig({
components: resolve(__dirname, './components'),
pages: resolve(__dirname, './pages'),
hooks: resolve(__dirname, './hooks'),
apis: resolve(__dirname, './apis'),
store: resolve(__dirname, './store'),
},
meta: {
meta: [
@ -22,9 +24,9 @@ export default defineNuxtConfig({
},
{
rel:"stylesheet",
href:"https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css",
}
href:"https://cdn.bootcdn.net/ajax/libs/tailwindcss/2.2.19/tailwind.min.css",
},
],
script: [{ src: '' }],
script: [{ src: 'https://cdn.bootcdn.net/ajax/libs/dayjs/1.10.7/dayjs.min.js' }],
},
});

427
package-lock.json

@ -21,8 +21,7 @@
"less": "^4.1.2",
"nuxt3": "latest",
"postcss": "^8.4.5",
"prettier": "^2.5.1",
"tailwindcss": "^3.0.15"
"prettier": "^2.5.1"
}
},
"node_modules/@babel/code-frame": {
@ -2149,38 +2148,6 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
"node_modules/acorn-node": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
"integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
"dev": true,
"dependencies": {
"acorn": "^7.0.0",
"acorn-walk": "^7.0.0",
"xtend": "^4.0.2"
}
},
"node_modules/acorn-node/node_modules/acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-node/node_modules/acorn-walk": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
"dev": true,
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-walk": {
"version": "8.2.0",
"resolved": "https://registry.nlark.com/acorn-walk/download/acorn-walk-8.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn-walk%2Fdownload%2Facorn-walk-8.2.0.tgz",
@ -2404,12 +2371,6 @@
"node": ">=10"
}
},
"node_modules/arg": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz",
"integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==",
"dev": true
},
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.nlark.com/argparse/download/argparse-2.0.1.tgz",
@ -2732,15 +2693,6 @@
"node": ">=10"
}
},
"node_modules/camelcase-css": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
"dev": true,
"engines": {
"node": ">= 6"
}
},
"node_modules/caniuse-api": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/caniuse-api/download/caniuse-api-3.0.0.tgz",
@ -3480,12 +3432,6 @@
"node": ">= 0.4"
}
},
"node_modules/defined": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
"integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
"dev": true
},
"node_modules/defu": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/defu/download/defu-5.0.1.tgz",
@ -3540,29 +3486,6 @@
"node": ">=0.10"
}
},
"node_modules/detective": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
"integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
"dev": true,
"dependencies": {
"acorn-node": "^1.6.1",
"defined": "^1.0.0",
"minimist": "^1.1.1"
},
"bin": {
"detective": "bin/detective.js"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
"dev": true
},
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz",
@ -3575,12 +3498,6 @@
"node": ">=8"
}
},
"node_modules/dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"dev": true
},
"node_modules/doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz",
@ -7183,15 +7100,6 @@
"node": ">=0.10.0"
}
},
"node_modules/object-hash": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
"integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
"dev": true,
"engines": {
"node": ">= 6"
}
},
"node_modules/object-inspect": {
"version": "1.12.0",
"resolved": "https://registry.npmmirror.com/object-inspect/download/object-inspect-1.12.0.tgz",
@ -7794,50 +7702,6 @@
"node": ">=6"
}
},
"node_modules/postcss-js": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
"integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
"dev": true,
"dependencies": {
"camelcase-css": "^2.0.1"
},
"engines": {
"node": "^12 || ^14 || >= 16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": "^8.3.3"
}
},
"node_modules/postcss-load-config": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz",
"integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==",
"dev": true,
"dependencies": {
"lilconfig": "^2.0.4",
"yaml": "^1.10.2"
},
"engines": {
"node": ">= 10"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"ts-node": ">=9.0.0"
},
"peerDependenciesMeta": {
"ts-node": {
"optional": true
}
}
},
"node_modules/postcss-loader": {
"version": "6.2.1",
"resolved": "https://registry.npmmirror.com/postcss-loader/download/postcss-loader-6.2.1.tgz",
@ -8019,25 +7883,6 @@
"postcss": "^8.1.0"
}
},
"node_modules/postcss-nested": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
"integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
"dev": true,
"dependencies": {
"postcss-selector-parser": "^6.0.6"
},
"engines": {
"node": ">=12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": "^8.2.14"
}
},
"node_modules/postcss-normalize-charset": {
"version": "5.0.1",
"resolved": "https://registry.nlark.com/postcss-normalize-charset/download/postcss-normalize-charset-5.0.1.tgz",
@ -8398,18 +8243,6 @@
"integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=",
"dev": true
},
"node_modules/quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/randombytes/download/randombytes-2.1.0.tgz",
@ -9292,85 +9125,6 @@
"integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=",
"dev": true
},
"node_modules/tailwindcss": {
"version": "3.0.15",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.15.tgz",
"integrity": "sha512-bT2iy7FtjwgsXik4ZoJnHXR+SRCiGR1W95fVqpLZebr64m4ahwUwRbIAc5w5+2fzr1YF4Ct2eI7dojMRRl8sVQ==",
"dev": true,
"dependencies": {
"arg": "^5.0.1",
"chalk": "^4.1.2",
"chokidar": "^3.5.2",
"color-name": "^1.1.4",
"cosmiconfig": "^7.0.1",
"detective": "^5.2.0",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"fast-glob": "^3.2.7",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"normalize-path": "^3.0.0",
"object-hash": "^2.2.0",
"postcss-js": "^4.0.0",
"postcss-load-config": "^3.1.0",
"postcss-nested": "5.0.6",
"postcss-selector-parser": "^6.0.8",
"postcss-value-parser": "^4.2.0",
"quick-lru": "^5.1.1",
"resolve": "^1.21.0"
},
"bin": {
"tailwind": "lib/cli.js",
"tailwindcss": "lib/cli.js"
},
"engines": {
"node": ">=12.13.0"
},
"peerDependencies": {
"autoprefixer": "^10.0.2",
"postcss": "^8.0.9"
}
},
"node_modules/tailwindcss/node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/tailwindcss/node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.3"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/tailwindcss/node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/tapable/download/tapable-2.2.1.tgz",
@ -10942,15 +10696,6 @@
}
}
},
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true,
"engines": {
"node": ">=0.4"
}
},
"node_modules/xxhashjs": {
"version": "0.2.2",
"resolved": "https://registry.nlark.com/xxhashjs/download/xxhashjs-0.2.2.tgz?cache=0&sync_timestamp=1624607954808&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fxxhashjs%2Fdownload%2Fxxhashjs-0.2.2.tgz",
@ -12758,31 +12503,6 @@
"dev": true,
"requires": {}
},
"acorn-node": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
"integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
"dev": true,
"requires": {
"acorn": "^7.0.0",
"acorn-walk": "^7.0.0",
"xtend": "^4.0.2"
},
"dependencies": {
"acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"acorn-walk": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
"dev": true
}
}
},
"acorn-walk": {
"version": "8.2.0",
"resolved": "https://registry.nlark.com/acorn-walk/download/acorn-walk-8.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn-walk%2Fdownload%2Facorn-walk-8.2.0.tgz",
@ -12970,12 +12690,6 @@
"readable-stream": "^3.6.0"
}
},
"arg": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz",
"integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==",
"dev": true
},
"argparse": {
"version": "2.0.1",
"resolved": "https://registry.nlark.com/argparse/download/argparse-2.0.1.tgz",
@ -13213,12 +12927,6 @@
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
"dev": true
},
"camelcase-css": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
"dev": true
},
"caniuse-api": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/caniuse-api/download/caniuse-api-3.0.0.tgz",
@ -13782,12 +13490,6 @@
"object-keys": "^1.0.12"
}
},
"defined": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
"integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
"dev": true
},
"defu": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/defu/download/defu-5.0.1.tgz",
@ -13830,23 +13532,6 @@
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"dev": true
},
"detective": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
"integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
"dev": true,
"requires": {
"acorn-node": "^1.6.1",
"defined": "^1.0.0",
"minimist": "^1.1.1"
}
},
"didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
"dev": true
},
"dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz",
@ -13856,12 +13541,6 @@
"path-type": "^4.0.0"
}
},
"dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"dev": true
},
"doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz",
@ -16695,12 +16374,6 @@
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
},
"object-hash": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
"integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
"dev": true
},
"object-inspect": {
"version": "1.12.0",
"resolved": "https://registry.npmmirror.com/object-inspect/download/object-inspect-1.12.0.tgz",
@ -17142,25 +16815,6 @@
}
}
},
"postcss-js": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
"integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
"dev": true,
"requires": {
"camelcase-css": "^2.0.1"
}
},
"postcss-load-config": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz",
"integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==",
"dev": true,
"requires": {
"lilconfig": "^2.0.4",
"yaml": "^1.10.2"
}
},
"postcss-loader": {
"version": "6.2.1",
"resolved": "https://registry.npmmirror.com/postcss-loader/download/postcss-loader-6.2.1.tgz",
@ -17272,15 +16926,6 @@
"icss-utils": "^5.0.0"
}
},
"postcss-nested": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
"integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
"dev": true,
"requires": {
"postcss-selector-parser": "^6.0.6"
}
},
"postcss-normalize-charset": {
"version": "5.0.1",
"resolved": "https://registry.nlark.com/postcss-normalize-charset/download/postcss-normalize-charset-5.0.1.tgz",
@ -17513,12 +17158,6 @@
"integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=",
"dev": true
},
"quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true
},
"randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/randombytes/download/randombytes-2.1.0.tgz",
@ -18252,64 +17891,6 @@
}
}
},
"tailwindcss": {
"version": "3.0.15",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.15.tgz",
"integrity": "sha512-bT2iy7FtjwgsXik4ZoJnHXR+SRCiGR1W95fVqpLZebr64m4ahwUwRbIAc5w5+2fzr1YF4Ct2eI7dojMRRl8sVQ==",
"dev": true,
"requires": {
"arg": "^5.0.1",
"chalk": "^4.1.2",
"chokidar": "^3.5.2",
"color-name": "^1.1.4",
"cosmiconfig": "^7.0.1",
"detective": "^5.2.0",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"fast-glob": "^3.2.7",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"normalize-path": "^3.0.0",
"object-hash": "^2.2.0",
"postcss-js": "^4.0.0",
"postcss-load-config": "^3.1.0",
"postcss-nested": "5.0.6",
"postcss-selector-parser": "^6.0.8",
"postcss-value-parser": "^4.2.0",
"quick-lru": "^5.1.1",
"resolve": "^1.21.0"
},
"dependencies": {
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"requires": {
"is-glob": "^4.0.3"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/tapable/download/tapable-2.2.1.tgz",
@ -19449,12 +19030,6 @@
"dev": true,
"requires": {}
},
"xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true
},
"xxhashjs": {
"version": "0.2.2",
"resolved": "https://registry.nlark.com/xxhashjs/download/xxhashjs-0.2.2.tgz?cache=0&sync_timestamp=1624607954808&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fxxhashjs%2Fdownload%2Fxxhashjs-0.2.2.tgz",

26
pages/index.vue

@ -8,11 +8,21 @@
<van-tabs v-model:active="active" shrink line-width="60px" color="#59B4FF" title-active-color="#59B4FF">
<van-tab title="财务管理">
<!-- 财务管理页面 -->
<div class="financial-management">
<span class="title">财务管理</span> <span class="title-describe">对项目预算奖金进行配置</span>
<Search />
<Table />
</div>
<div class="financial-management flex flex-col">
<div>
<span class="title">财务管理</span> <span class="title-describe">对项目预算奖金进行配置</span>
</div>
<Search />
<FinanceManage />
</div>
<!-- 财务管理页面 -->
<div class="financial-management flex flex-col">
<div>
<span class="title">财务审批</span> <span class="title-describe">对员工提交的申请进行审批</span>
</div>
<Search />
<FinanceExamine />
</div>
</van-tab>
<van-tab title="角色管理">角色管理</van-tab>
<van-tab title="任务管理">任务管理</van-tab>
@ -50,7 +60,7 @@ function onClickLeft(){
.financial-management{
background-color:#ffffff;
padding: 1rem;
margin-top: 2rem;
margin-top: 1rem;
color: #555252;
.title{
font-weight: 600;
@ -58,9 +68,7 @@ function onClickLeft(){
.title-describe{
font-size: 12px;
margin-left: 0.5rem;
color: #A0A0A0;
}
}
</style>

10
store/index.js

@ -0,0 +1,10 @@
import { createStore } from 'vuex';
import user from './user';
export default createStore({
modules: { user },
state: {},
getters: {},
mutations: {},
actions: {},
});

61
store/user.js

@ -0,0 +1,61 @@
import { getToken } from 'apis/index';
export default {
namespaced: true,
state: { user: null },
getters: {
token({ user }) {
if (!user) return null;
return user.token;
},
userId({ user }) {
if (!user) return null;
return user.id;
},
account({ user }) {
if (!user) return null;
return user.account;
},
isAdmin({ user }) {
if (!user) return false;
return user.account === 'iacdadmin';
},
},
mutations: {
/**
* 设置state.user
* @param {*} state
* @param {object|null} user 用户信息
*/
setUser(state, user) {
state.user = user;
if (user) {
sessionStorage.setItem('token', user.token);
sessionStorage.setItem('user', JSON.stringify(user));
} else {
sessionStorage.removeItem('token');
sessionStorage.removeItem('user');
}
},
},
actions: {
/**
* 根据userId获取token级user信息
* @param {*} param0
* @param {string} userId 用户id
*/
async getTokenByUserId({ commit }, userId) {
try {
const data = await getToken(userId);
commit('setUser', data || null);
return data;
} catch (error) {
throw new Error(error);
}
},
},
};
Loading…
Cancel
Save