Giter Site home page Giter Site logo

tc-music's People

Contributors

jchappytime avatar

Watchers

 avatar  avatar

tc-music's Issues

检查package.json文件并根据项目实际情况增减依赖包

{
"name": "Music-Vue",
"version": "1.0.0",
"description": "xxx",
"author": "Jessica",
"private": false,
"scripts": {
"dev": "cross-env QUICK_MODE=true node server",
"lint": "eslint .",
"start": "cross-env NODE_ENV=production node server",
"build": "rimraf dist && yarn run build:client && yarn run build:server",
"build:client": "cross-env NODE_ENV=production QUICK_MODE=true webpack --config build/webpack.client.config.js --progress --hide-modules",
"build:server": "cross-env NODE_ENV=production QUICK_MODE=true webpack --config build/webpack.server.config.js --progress --hide-modules",
"test": "jest",
"test:coverage": "jest --coverage",
"test:watch": "jest --watch",
"package": "rimraf release && yarn run build && gulp && (cd release && yarn install --prod && node-prune && tar cfz package.tar.gz * && mkdir package && mv package.tar.gz package)"
},
"jest": {
"moduleNameMapper": {
"src/components/([^\\.])$": "/src/components/$1.vue",
"^vue$": "vue/dist/vue.common.js",
"@/(.
)$": "/src/$1",
"src/([^\\.])$": "/src/$1.vue",
"logger": "/src/logger/logger-client.ts",
"create-api": "./create-api-client.ts"
},
"snapshotSerializers": [
"/jest/htmlSnapshotBeautifier.js"
],
"transform": {
".
\.vue$": "vue-jest",
".(ts|tsx)": "ts-jest",
".": "babel-jest"
},
"transformIgnorePatterns": [
"/node_modules/(?!(vue-echarts)/)"
],
"testRegex": "(/tests/.
|\.(test|spec))\.(ts|js)$",
"moduleFileExtensions": [
"ts",
"js"
],
"coverageReporters": [
"text",
"json",
"lcov",
"cobertura"
],
"testResultsProcessor": "./node_modules/jest-junit"
},
"jest-junit": {
"suiteName": "jest tests",
"output": "./junit.xml",
"classNameTemplate": "{classname}-{title}",
"titleTemplate": "{classname}-{title}"
},
"husky": {
"hooks": {
"pre-commit": "yarn lint",
"pre-push": "yarn test"
}
},
"engines": {
"node": ">=6.0",
"npm": ">=3.0"
},
"dependencies": {
"async": "2.5.0",
"autoprefixer": "7.1.3",
"axios": "0.16.2",
"babel-cli": "6.26.0",
"babel-preset-es2015": "6.24.1",
"babel-preset-stage-0": "6.24.1",
"compression": "1.7.0",
"cookie-parser": "1.4.3",
"core-js": "^3.2.1",
"cross-env": "^7.0.2",
"dont-sniff-mimetype": "^1.0.0",
"es6-promise": "4.1.1",
"express": "^4.16.3",
"express-request-language": "1.1.12",
"file-loader": "^6.0.0",
"frameguard": "^3.0.0",
"friendly-errors-webpack-plugin": "^1.7.0",
"hbs": "4.0.1",
"helmet-csp": "^2.7.0",
"hide-powered-by": "^1.0.0",
"hsts": "^2.1.0",
"http-proxy-middleware": "0.17.4",
"jquery": "^3.2.1",
"lodash": "4.17.14",
"mini-css-extract-plugin": "^0.4.0",
"moment": "^2.27.0",
"morgan": "1.8.2",
"ncp-vue-framework": "^0.0.11-alpha",
"node-prune": "^1.0.2",
"pm2": "^2.7.2",
"pmx": "^1.5.4",
"postcss-loader": "^2.1.5",
"prettier": "^2.0.5",
"raw-body": "2.3.0",
"serve-favicon": "^2.5.0",
"smoothscroll-polyfill": "^0.4.4",
"uuid": "^3.3.2",
"vue": "^2.5.13",
"vue-awesome-swiper": "^4.1.1",
"vue-class-component": "^6.1.2",
"vue-click-outside": "^1.0.7",
"vue-echarts": "^2.4.0",
"vue-i18n": "^7.4.0",
"vue-meta": "^2.4.0",
"vue-router": "^3.0.1",
"vue-server-renderer": "^2.5.13",
"vue-style-loader": "^4.1.0",
"vuedraggable": "^2.23.2",
"vuex": "^3.0.1",
"vuex-router-sync": "^5.0.0",
"webpack": "^4.12.0",
"webpack-merge": "^4.1.2",
"winston": "2.3.1",
"winston-daily-rotate-file": "1.4.6",
"winston-nelo2": "^3.1.2",
"x-xss-protection": "^1.0.0"
},
"devDependencies": {
"@types/axios": "^0.14.0",
"@types/jest": "^22.2.3",
"@types/node": "^9.3.0",
"@vue/server-test-utils": "1.0.0-beta.29",
"@vue/test-utils": "1.0.0-beta.29",
"babel-eslint": "^8.1.0",
"babel-jest": "^20.0.3",
"babel-loader": "^7.1.4",
"css-loader": "^0.28.11",
"del": "^3.0.0",
"eslint": "^4.14.0",
"eslint-config-ncloud": "^1.2.0",
"eslint-loader": "^2.0.0",
"fork-ts-checker-webpack-plugin": "^0.4.2",
"gulp": "^4.0.0",
"gulp-rev": "8.0.0",
"gulp-rev-collector": "1.2.2",
"husky": "^4.2.5",
"jest": "^23.0.1",
"jest-junit": "^4.0.0",
"js-beautify": "1.6.14",
"less": "^2.7.2",
"less-loader": "^4.1.0",
"memory-fs": "0.4.1",
"ncp-ui-kit": "^1.90.0",
"rimraf": "^2.6.1",
"run-sequence": "^2.2.1",
"swiper": "4.0.7",
"ts-jest": "^22.4.6",
"ts-loader": "^4.4.1",
"typescript": "^3.0.0",
"url-loader": "^1.0.1",
"vue-jest": "^3.0.5",
"vue-loader": "^15.0.0",
"vue-template-compiler": "^2.5.13",
"webpack-bundle-analyzer": "^2.13.1",
"webpack-cli": "^3.0.8",
"webpack-dev-middleware": "^3.1.3",
"webpack-hot-middleware": "^2.22.2",
"webpack-node-externals": "^1.7.2"
}
}

轮播组件调整

  • 1.调整每页展示的数量: 4个;
  • 2.展示图片采用CSS设置背景图的方式;
  • 3.整个轮播组件宽度调整为1100px。

new Component: tree-menu

TreeMenu.vue

{{ emptyText }}
<script> import { chain, forEach, filter } from 'lodash'; import VueDraggable from 'vuedraggable'; import TreeNode from './TreeNode.vue'; const prefixClass = 'n-tree'; export default { name: 'n-tree', components: { VueDraggable, TreeNode, }, provide() { return { TreeInstance: this }; }, props: { data: { type: Array, default: () => [], }, emptyText: { type: String, default: 'No data' }, childrenKey: { type: String, default: 'children', }, // TODO loadData: { type: Function, }, // TODO render: { type: Function, }, draggable: { type: Boolean, default: false, }, offset: { type: [String,Number], default: 15, }, expandAll: { type: Boolean, default: false, }, }, data() { return { nodeTreeData: this.data, flatStateTree: [], }; }, computed: { prefixClass() { return prefixClass; }, }, watch: { data: { deep: true, handler(data) { this.nodeTreeData = data; this.flatStateTree = this.compileStateTree(); }, }, }, methods: { compileStateTree() { let keyCounter = 0; const childrenKey = this.childrenKey; const flatStateTree = []; function flattenChildren(node, parent) { node.nodeKey = keyCounter++; flatStateTree[node.nodeKey] = { node: node, nodeKey: node.nodeKey }; if (typeof parent != 'undefined') { flatStateTree[node.nodeKey].parent = parent.nodeKey; flatStateTree[parent.nodeKey][childrenKey].push(node.nodeKey); } if (node[childrenKey]) { flatStateTree[node.nodeKey][childrenKey] = []; node[childrenKey].forEach((child) => flattenChildren(child, node) ); } else { node[childrenKey] = []; } } this.nodeTreeData.forEach((rootNode) => { flattenChildren(rootNode); }); return flatStateTree; }, handleSelected(nodeKey) { const node = this.flatStateTree[nodeKey].node; chain(this.flatStateTree) .filter((obj) => obj.node.selected) .forEach((obj) => this.$set(obj.node, 'selected', false)) .value(); this.$set(node, 'selected', true); this.$emit('on-select', node); }, handleToggleExpand(node) { this.$emit('on-toggle', node); }, }, created() { this.flatStateTree = this.compileStateTree(); }, }; </script> <style lang="less"> @import '../../less/variable.less'; @import './index.less'; </style>

TreeNode.vue



  • <div
    :class="itemClasses"
    @click="handleSelect"
    :style="{ paddingLeft: ${paddingLeft}px }"
    >
    <span :class="${prefixClass}-arrow" @click.stop="handleExpand">




    {{ data.title }}









  • <script> import VueDraggable from 'vuedraggable'; import NBtn from '@/components/NBtn'; import NIcon from '@/components/NIcon'; const prefixClass = 'n-tree-item'; export default { name: 'TreeNode', components: { VueDraggable, NBtn, NIcon, }, inheritAttrs: false, inject: ['TreeInstance'], props: { data: { type: Object, default: () => ({}), }, childrenKey: { type: String, default: 'children', }, draggable: { type: Boolean, default: false, }, padding: { type: [String, Number], default: 0, }, offset: { type: [String, Number], default: 15, }, expandAll: { type: Boolean, default: false, }, }, computed: { paddingLeft() { return parseInt(this.padding) + parseInt(this.offset); }, prefixClass() { return prefixClass; }, itemClasses() { return [ prefixClass, { [`${prefixClass}-expand`]: this.data.expand, [`${prefixClass}-selected`]: this.data.selected, }, ]; }, children() { return this.data[this.childrenKey]; }, showArrow() { return this.data[this.childrenKey] && this.data[this.childrenKey].length; }, }, methods: { handleExpand() { const item = this.data; const children = item[this.childrenKey]; if (item.disabled || !children || !children.length) return; this.$set(item, 'expand', !item.expand); this.$emit('toggle-expand', item); }, handleSelect() { if (this.data.disabled) return; this.$emit('on-selected', this.data.nodeKey); }, }, created() { const children = this.data[this.childrenKey]; if (this.expandAll && children && children.length) { this.$set(this.data, 'expand', true); } }, }; </script>

    index.less
    @prefix-class: ~'n-tree';
    @selected: #f0f9ff;

    .@{prefix-class} {
    position: relative;
    border: 1px solid @Colors[line];
    border-radius: 4px;
    overflow: hidden;
    background: @Colors[white];

    ul {
    list-style: none;
    margin: 0;
    padding: 0;

    li {
      list-style: none;
      margin: 0;
      white-space: nowrap;
      outline: none;
      box-sizing: border-box;
    }
    

    }

    ul {
    margin: 0 0 -1px 0;
    }

    &-item {
    width: 100%;
    padding: 12px 0;
    font-size: 13px;
    font-weight: normal;
    color: #222;
    box-sizing: border-box;
    cursor: pointer;
    border-bottom: 1px solid @Colors[line];

    &:hover {
      background: @selected;
    }
    
    &-arrow {
      .n-btn-only-icon.n-btn-small {
        width: 20px;
        height: 20px;
      }
      .n-icon {
        transform: rotate(-90deg);
      }
    }
    
    &-title {
      vertical-align: middle;
    }
    
    &-expand {
      .@{prefix-class}-item-arrow .n-icon {
        transform: rotate(0);
      }
    }
    &-selected {
      background: @selected;
      .@{prefix-class}-item-title {
        font-weight: 600;
      }
    }
    

    }
    &-empty-text {
    padding: 20px;
    display: block;
    text-align: center;
    }
    }

    配置eslintrc.js文件

    {
    “extends”: ["ncloud"],
    "env": {
    "browser": true,
    "node": true,
    "es6": true,
    },
    "parser": "babel-eslint",
    "rules": {
    "linebreak-style": 0,
    }
    }

    修改头部菜单展示形式

    .nav-wrap {
    margin-top: 12px;
    font-size: 16px;
    letter-spacing: 0 !important;
    .input-group.dropdown:hover {
    .dropdown-menu.dropdown-menu-scale {
    visibility: visible;
    opacity: 1;
    transform: scale(1) translateY(0%);
    transition-delay: 0s, 0s, 0.4s;
    pointer-events: auto;
    }
    .select-icon {
    transform: rotate(180deg);
    }
    }
    .dropdown-menu.dropdown-menu-scale {
    margin-top: 0;
    background-color: transparent;
    padding: 0;
    border: none;
    .dropdown-wrap {
    margin-top: 6px;
    padding: 12px 5px;
    border-color: @c-nav-border;
    background-color: @c-white;
    border-radius: 0.25rem;
    }
    }
    ul {
    list-style-type: none;
    margin: auto;
    text-align: center;
    display: flex;
    }
    li {
    display: flex;
    margin-right: auto;
    .input-group.dropdown .form-control {
    font-size: 15px;
    }
    &:last-child {
    margin-right: 0px;
    }
    }
    }

    • {{ menu.menuName }}
      {{ menu.menuName }}
      {{ subMenu.menuName }}

    设置vscode的settings.json文件,使代码风格保持一致

    {
    "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[json]": {
    "editor.formatOnSave": false,
    "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[vue]": {
    "editor.defaultFormatter": "octref.vetur"
    },
    "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
    },
    "editor.formatOnSave": true,
    "editor.multiCursorModifier": "alt",
    "editor.tabSize": 2,
    "eslint.options": {
    "configFile": "./.eslintrc"
    },
    "files.autoSave": "afterDelay",
    "files.autoSaveDelay": 10000,
    "files.insertFinalNewline": true,
    "files.trimTrailingWhitespace": true,
    "files.trimFinalNewlines": true,
    "html.format.enable": false,
    "javascript.implicitProjectConfig.checkJs": true,
    "javascript.updateImportsOnFileMove.enabled": "always",
    "javascript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": false,
    "prettier.printWidth": 120,
    "prettier.tabWidth": 2,
    "prettier.useTabs": false,
    "prettier.proseWrap": "preserve",
    "prettier.singleQuote": true,
    "prettier.trailingComma": "all",
    "prettier.arrowParens": "avoid",
    "vetur.format.defaultFormatterOptions": {
    "prettier": {
    "semi": true,
    "singleQuote": true,
    "trailingComma": "all",
    "printWidth": 120
    },
    "prettyhtml": {
    "printWidth": 120
    }
    }
    }

    Recommend Projects

    • React photo React

      A declarative, efficient, and flexible JavaScript library for building user interfaces.

    • Vue.js photo Vue.js

      🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

    • Typescript photo Typescript

      TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

    • TensorFlow photo TensorFlow

      An Open Source Machine Learning Framework for Everyone

    • Django photo Django

      The Web framework for perfectionists with deadlines.

    • D3 photo D3

      Bring data to life with SVG, Canvas and HTML. 📊📈🎉

    Recommend Topics

    • javascript

      JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

    • web

      Some thing interesting about web. New door for the world.

    • server

      A server is a program made to process requests and deliver data to clients.

    • Machine learning

      Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

    • Game

      Some thing interesting about game, make everyone happy.

    Recommend Org

    • Facebook photo Facebook

      We are working to build community through open source technology. NB: members must have two-factor auth.

    • Microsoft photo Microsoft

      Open source projects and samples from Microsoft.

    • Google photo Google

      Google ❤️ Open Source for everyone.

    • D3 photo D3

      Data-Driven Documents codes.