React-Redux类似任务管理示例

概述:

基于React、Redux,参考官方示例,实现组件状态管理。

图示:
React-Redux类似任务管理示例_第1张图片

文件目录:

│  .babelrc
│  .eslintrc
│  package.json
│
├─config
│      webpack.config.js
│      webpack.production.config.js
│
├─public
└─src
    ├─company
    │  │  index.js
    │  │  index.tmpl.html
    │  │
    │  ├─actions
    │  │      items.js
    │  │      visible.js
    │  │
    │  ├─component
    │  │      Create.js
    │  │      Error.js
    │  │      Footer.js
    │  │      Header.js
    │  │      index.js
    │  │      Item.js
    │  │      ItemList.js
    │  │      Link.js
    │  │      RowLink.js
    │  │      style.js
    │  │      Title.js
    │  │
    │  ├─container
    │  │      CreateItem.js
    │  │      FilterLink.js
    │  │      VisibleItemList.js
    │  │
    │  └─reducers
    │          filter.js
    │          index.js
    │          items.js
    │
    └─static
        ├─css
        │      common.css
        │
        └─images
                180403.png
                favicon.png

package.json

{
  "name": "demos",
  "version": "1.0.0",
  "description": "demos",
  "main": "index.js",
  "scripts": {
    "eslint": "eslint --ext .js src",
    "eslint-fix": "eslint --fix src",
    "deves": "webpack-dev-server --open --mode development --config ./config/webpack.config.js",
    "build": "webpack --mode production --progress --config ./config/webpack.production.config.js"
  },
  "author": "HeJun",
  "license": "ISC",
  "repository": {
    "type": "git",
    "url": "git.nsecn.com"
  },
  "devDependencies": {
    "autoprefixer": "^8.4.1",
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.4",
    "babel-plugin-react-transform": "^3.0.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-react": "^6.24.1",
    "babel-standalone": "^6.26.0",
    "babel-plugin-transform-object-rest-spread": "^6.26.0",
    "babel-eslint": "^8.2.2",
    "babel-polyfill": "^6.26.0",
    "clean-webpack-plugin": "^0.1.19",
    "css-loader": "^0.28.11",
    "extract-text-webpack-plugin": "^4.0.0-beta.0",
    "file-loader": "^1.1.11",
    "html-loader": "^0.5.5",
    "html-webpack-plugin": "^3.1.0",
    "lodash": "^4.17.5",
    "postcss-loader": "^2.1.4",
    "react-transform-hmr": "^1.0.4",
    "style-loader": "^0.20.3",
    "uglifyjs-webpack-plugin": "^1.2.4",
    "url-loader": "^1.0.1",
    "webpack": "~4.5.0",
    "webpack-cli": "^2.0.13",
    "webpack-dev-server": "^3.1.1",
    "zip-webpack-plugin": "^3.0.0",
    "moment": "^2.22.0",
    "eslint": "^4.19.1",
    "eslint-plugin-import": "^2.10.0",
    "eslint-plugin-react": "^7.7.0"
  },
  "dependencies": {
    "prop-types": "^15.6.1",
    "react": "^16.2.0",
    "react-dom": "^16.2.0",
    "redux": "^4.0.0",
    "react-redux": "^5.0.7",
    "react-router-dom": "^4.2.2"
  }
}

.babelrc

{
  presets: ["env", "react"],
  "env": {
    "development": {
      "plugins": [
        [
          "react-transform", {
            "transforms": [
              {
                "transform": "react-transform-hmr",
                "imports": ["react"],
                "locals": ["module"]
              }
            ]
          }
        ],
        ["transform-object-rest-spread", {
          "useBuiltIns": true
        }]
      ]
    }
  }
}

webpack.config.js

const path = require('path');
const webpack = require('webpack');
const autoprefixer = require('autoprefixer');
const HtmlWebpackPlugin = require('html-webpack-plugin');

const base = path.join(__dirname, '..', 'src');
const dist = path.join(__dirname, '..', 'public');
const favicon = path.join(base, 'static', 'images', 'favicon.png');

// 常量
const company = 'company';

module.exports = {
    // 入口文件
    entry: {
        company: ['babel-polyfill', path.join(base, company, 'index.js')]
    },
    // 抽取公共JS
    optimization: {
        splitChunks: {
            cacheGroups: {
                vendor: {
                    test: /[\\/]node_modules[\\/]/,
                    name: 'common',
                    priority: 10,
                    chunks: 'all'
                }
            }
        }
    },
    output: {
        // 打包后文件路径
        path: path.join(dist),
        // 打包后输出文件
        filename: 'bundle.[name].[hash:8].js'
    },
    // 发布时设置为null
    devtool: 'eval-source-map',
    performance: {
        hints: false
    },
    devServer: {
        // 本地服务器加载的目录
        contentBase: path.join(dist),
        port: 8000,
        // 不跳转
        historyApiFallback: true,
        // 实时刷新
        inline: true
    },
    module: {
        rules: [
            {
                test: /(\.jsx|\.js)$/,
                use: {
                    loader: 'babel-loader'
                },
                exclude: /node_modules/
            },
            {
                test: /\.html$/,
                use: {
                    loader: 'html-loader?minimize=false'
                }
            },
            {
                test: /\.(png|jpe?g|gif|svg)$/,
                use: {
                    loader: 'url-loader?limit=1024&name=images/[hash:12].[ext]'
                }
            },
            {
                test: /\.css$/,
                use: [
                    {
                        loader: 'style-loader'
                    },
                    {
                        // 启用CSS模块
                        loader: 'css-loader',
                        options: {
                            module: true
                        }
                    },
                    {
                        // CSS类自动名称
                        loader: 'postcss-loader',
                        options: {
                            plugins: [
                                autoprefixer
                            ]
                        }
                    }
                ]
            }
        ]
    },
    plugins: [
        new webpack.BannerPlugin('DEMO COPYRIGHT'),
        new HtmlWebpackPlugin({
            chunks: ['common', company],
            template: path.join(base, company, 'index.tmpl.html'),
            filename: 'index.html',
            favicon: favicon
        }),
        // 热加载模块插件
        new webpack.HotModuleReplacementPlugin()
    ]
}

webpack.production.config.js

const path = require('path');
const moment = require('moment');
const webpack = require('webpack');
const autoprefixer = require('autoprefixer');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const CleanWebpackPlugin = require("clean-webpack-plugin");
const ZipPlugin = require('zip-webpack-plugin');

const base = path.join(__dirname, '..', 'src');
const dist = path.join(__dirname, '..', 'public');
const favicon = path.join(base, 'static', 'images', 'favicon.png');

// 常量
const company = 'company';

module.exports = {
    // 入口文件
    entry: {
        company: ['babel-polyfill', path.join(base, company, 'index.js')]
    },
    // 抽取公共JS
    optimization: {
        splitChunks: {
            cacheGroups: {
                vendor: {
                    test: /[\\/]node_modules[\\/]/,
                    name: 'common',
                    priority: 10,
                    chunks: 'all'
                }
            }
        }
    },
    output: {
        // 打包后文件路径
        path: path.join(dist),
        // 打包后输出文件
        filename: 'bundle.[name].[hash:8].js'
    },
    // 发布时设置为null
    devtool: 'null',
    performance: {
        hints: false
    },
    module: {
        rules: [
            {
                test: /(\.jsx|\.js)$/,
                use: {
                    loader: 'babel-loader'
                },
                exclude: /node_modules/
            },
            {
                test: /\.html$/,
                use: {
                    // 压缩HTML设置true
                    loader: 'html-loader?minimize=false'
                }
            },
            {
                test: /\.(png|jpe?g|gif|svg)$/,
                use: {
                    loader: 'url-loader?limit=1024&name=images/[hash:12].[ext]'
                }
            },
            {
                test: /\.css$/,
                use: [
                    {
                        loader: 'style-loader'
                    },
                    {
                        // 启用CSS模块
                        loader: 'css-loader',
                        options: {
                            module: true
                        }
                    },
                    {
                        // CSS类自动名称
                        loader: 'postcss-loader',
                        options: {
                            plugins: [
                                autoprefixer
                            ]
                        }
                    }
                ]
            }
        ]
    },
    plugins: [
        new webpack.BannerPlugin('DEMO COPYRIGHT'),
        new HtmlWebpackPlugin({
            chunks: ['common', company],
            template: path.join(base, company, 'index.tmpl.html'),
            filename: 'index.html',
            favicon: favicon
        }),
        // 热加载模块插件
        new webpack.HotModuleReplacementPlugin(),
        // 为组建分配ID
        new webpack.optimize.OccurrenceOrderPlugin(),
        // 压缩JS
        new UglifyJsPlugin({
            uglifyOptions: {
                compress: {
                    drop_console: true
                }
            }
        }),
        // 分离CSS[存在BUG]
        new ExtractTextPlugin('[name].[hash:10].css'),
        // 清除文件
        new CleanWebpackPlugin(['*'], {
            root: path.join(dist)
        }),
        // ZIP打包
        new ZipPlugin({
            path: path.join(dist),
            filename: 'Release-' + moment().format('YYHHmmss') + '.zip'
        })
    ]
}

common.css

/*!
 * Hon by 2018-05-02
 */
body {
    color: #526475;
    margin: 0px;
    padding: 0px;
    font-family: Monospaced Number, Chinese Quote, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Helvetica Neue, Helvetica, Arial, sans-serif;
    font-size: 16px;
    font-weight: 300;
    width: 100%;
    background-color: #ffffff;
}

h1, h2, h3, h4, h5, h6 {
    color: #526475;
    font-weight: 300;
    display: block;
    margin-bottom: 20px;
    margin-top: 0px;
    white-space: nowrap;
}

h1 {
    font-size: 36px;
    line-height: 50px;
}

h2 {
    font-size: 32px;
    line-height: 46px;
}

h3 {
    font-size: 28px;
    line-height: 42px;
}

h4 {
    font-size: 24px;
    line-height: 38px;
}

h5 {
    font-size: 20px;
    line-height: 34px;
}

h6 {
    font-size: 16px;
    line-height: 30px;
}

.btn {
    font-family: 'Open Sans';
    font-size: 16px;
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    text-align: center;
    text-decoration: none !important;
    line-height: 36px;
    margin: 5px;
    padding: 0 20px;
    display: inline-block;
    border-radius: 3px;
    transition: all 0.3s;
    color: #ffffff;
    border: 1px solid #09a0f6;
    white-space: nowrap;
    background-color: #09a0f6;
    outline: 0px;
    cursor: pointer;
}

.btn:hover {
    text-decoration: none;
    opacity: 0.8;
}

.btn:active {
    background-color: #0077e6;
    border-color: #0077e6;
    opacity:.8;
    -webkit-animation: buttonEffect .4s;
    animation: buttonEffect .4s;
}

.disable {
    font-family: 'Open Sans';
    font-size: 14px;
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    margin: 5px;
    border-radius: 3px;
    transition: all 0.3s;
    color: #777777;
    background-color: #f7f7f7;
    white-space: nowrap;
    border: 1px solid #d9d9d9;
    outline: 0px;
    cursor: not-allowed;
}

.btn-small {
    font-size: 14px !important;
    line-height: 26px !important;
    padding: 0 12px !important;
}

.btn-clean {
    margin: 0px;
}

.form-input[type="text"], .form-input[type="password"], .form-input[type="number"], .form-input[type="email"] {
    font-size: 16px;
    display: inline-block;
    width: 100%;
    transition: all 0.3s;
    color: #526475;
    padding-left: 10px;
    padding-right: 10px;
    border: 1px solid #d1e1e8;
    border-radius: 3px;
    outline: 0px;
    box-sizing: border-box;
    height: 38px;
}

.form-input[type="text"]:focus, .form-input[type="password"]:focus, .form-input[type="number"]:focus, .form-input[type="email"]:focus {
    border: 1px solid #09a0f6;
}

.form-input[type="date"] {
    font-size: 16px;
    display: inline-block;
    width: 100%;
    transition: all 0.3s;
    color: #526475;
    padding: 10px;
    border: 1px solid #d1e1e8;
    border-radius: 5px;
    outline: 0px;
    box-sizing: border-box;
    width: auto !important;
    height: 40px;
}

.form-input[type="date"]:focus {
    border: 1px solid #09a0f6;
}

.form-input[disabled] {
    font-size: 16px;
    display: inline-block;
    width: 100%;
    transition: all 0.3s;
    color: #526475;
    padding: 10px;
    border: 1px solid #d1e1e8;
    border-radius: 5px;
    outline: 0px;
    box-sizing: border-box;
    cursor: not-allowed;
    background-color: #d1e1e8;
    height: 40px;
}

.form-input[disabled]:focus {
    border: 1px solid #09a0f6;
}

.form-input[type="submit"], .form-input[type="button"] {
    font-size: 16px;
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    outline: none;
    text-align: center;
    text-decoration: none !important;
    line-height: 28px;
    margin-left: 5px;
    margin-right: 5px;
    margin: 5px;
    padding: 5px 25px;
    display: inline-block;
    cursor: pointer;
    border-radius: 3px;
    transition: all 0.3s;
    color: #ffffff;
    background-color: #09a0f6;
    border: 0px;
}

.form-input[type="submit"]:hover, .form-input[type="button"]:hover {
    text-decoration: none;
}

.form-input[type="submit"]:hover, .form-input[type="button"]:hover {
    opacity: 0.8;
}

.form-select {
    font-size: 16px;
    display: inline-block;
    width: 100%;
    transition: all 0.3s;
    color: #526475;
    padding: 10px;
    margin: 5px;
    border: 1px solid #d1e1e8;
    border-radius: 5px;
    outline: 0px;
    box-sizing: border-box;
    padding-top: 6px;
    height: 40px;
    background-color: #ffffff;
}

.form-select:focus {
    border: 1px solid #09a0f6;
}

.form-textarea {
    font-size: 16px;
    display: inline-block;
    width: 100%;
    transition: all 0.3s;
    color: #526475;
    padding: 10px;
    margin: 5px;
    border: 1px solid #d1e1e8;
    border-radius: 5px;
    outline: 0px;
    box-sizing: border-box;
    resize: vertical;
}

.form-textarea:focus {
    border: 1px solid #09a0f6;
}

@media (max-width: 960px) {
    .grid {
        width: 94%;
    }
}

.row {
    display: inline-block;
    width: 100%;
    margin: 10px 0px;
}

.row:after {
    content: " ";
    clear: both;
    display: table;
    line-height: 0;
}

.col-1 {
    width: 6.33%;
    display: inline-block;
    vertical-align: top;
    float: left;
    padding: 1%;
}

.col-2 {
    width: 14.66%;
    display: inline-block;
    vertical-align: top;
    float: left;
    padding: 1%;
}

.col-3 {
    width: 22.99%;
    display: inline-block;
    vertical-align: top;
    float: left;
    padding: 1%;
}

.col-4 {
    width: 31.33%;
    display: inline-block;
    vertical-align: top;
    float: left;
    padding: 1%;
    white-space: nowrap;
}

.col-5 {
    width: 39.66%;
    display: inline-block;
    vertical-align: top;
    float: left;
    padding: 1%;
}

.col-6 {
    width: 47.99%;
    display: inline-block;
    vertical-align: top;
    float: left;
    padding: 1%;
}

.col-7 {
    width: 56.33%;
    display: inline-block;
    vertical-align: top;
    float: left;
    padding: 1%;
}

.col-8 {
    width: 64.66%;
    display: inline-block;
    vertical-align: top;
    float: left;
    padding: 1%;
}

.col-9 {
    width: 72.99%;
    display: inline-block;
    vertical-align: top;
    float: left;
    padding: 1%;
}

.col-10 {
    width: 81.33%;
    display: inline-block;
    vertical-align: top;
    float: left;
    padding: 1%;
}

.col-11 {
    width: 89.66%;
    display: inline-block;
    vertical-align: top;
    float: left;
    padding: 1%;
}

.col-12 {
    width: 97.99%;
    display: inline-block;
    vertical-align: top;
    float: left;
    padding: 1%;
}

@media (max-width: 400px) {
    .col-1 {
        width: 98%;
    }

    .col-2 {
        width: 98%;
    }

    .col-3 {
        width: 98%;
    }

    .col-4 {
        width: 98%;
    }

    .col-5 {
        width: 98%;
    }

    .col-6 {
        width: 98%;
    }

    .col-7 {
        width: 98%;
    }

    .col-8 {
        width: 98%;
    }

    .col-9 {
        width: 98%;
    }

    .col-10 {
        width: 98%;
    }

    .col-11 {
        width: 98%;
    }

    .col-12 {
        width: 98%;
    }
}

.table {
    display: table;
    width: 100%;
    border-width: 0px;
    border-collapse: collapse;
    color: #526475;
    margin-top: 0px;
    margin-bottom: 20px;
}

.table thead tr th {
    font-weight: 500;
    border: 1px solid #d1e1e8;
    padding: 8px 12px;
    background-color: #fcfcfc;
    border-left: none;
    border-right: none;
    white-space: nowrap;
    text-align: left;
}

.table tr td {
    border: 1px solid #d1e1e8;
    border-left: none;
    border-right: none;
    padding: 10px;
    white-space: nowrap;
}

.center {
    text-align: center;
}

.alert {
    display: block;
    font-size: 16px;
    text-align: left;
    padding: 6px 10px;
    margin-top: 5px;
    border-radius: 2px;
    border: 1px solid;
    background-color: #E1F5FE;
    color: #03A9F4;
    border-color: #03A9F4;
}

.alert a {
    text-decoration: none;
    font-weight: normal;
}

.alert-error {
    color: #D32F2F;
    background-color: #FFEBEE;
    border-color: #FFEBEE;
}

.alert-warning {
    background-color: #FFF8E1;
    color: #FF8F00;
    border-color: #FFC107;
}

.alert-done {
    background-color: #E8F5E9;
    color: #388E3C;
    border-color: #4CAF50;
}

.logo {
    background-image: url("../images/180403.png");
    background-size: 35px 35px;
    background-repeat: no-repeat;
    width: 35px;
    height: 35px;
    display: inline-block;
    margin-right: 8px;
    margin-bottom: -5px;
    overflow: hidden;
}

.footer {
    font-size: 12px;
    color: #999999;
    text-align: center;
    line-height: 50px;
    height: 50px;
    margin: 0px;
    overflow: hidden;
    position: relative;
}

.footer a {
    color: #777777;
    text-decoration: none;
}

.footer a:hover {
    color: #f54343;
}



.block {
    margin: 20px auto;
    width: 350px;
    padding: 20px 0px;
    border: 1px solid #cccccc;
    box-shadow: 5px 5px 3px #cccccc;
}

.block .having {
    font-size: 20px;
    color: #f54343;
    font-weight: bold;
    padding-right: 10px;
}

.bood {
    background-color: #20232a;
    width: 56px;
    height: 56px;
    border-radius: 50%;
    display: inline-block;
    float: left;
    margin-top: -10px;
    margin-left: -26px;
}

.gap {
    padding-left: 45px;
}

images
React-Redux类似任务管理示例_第2张图片

图片描述

index.tmpl.html




    
    REDUX COMPY


index.js

// 入口
import React from 'react';
import {render} from 'react-dom';
import {createStore} from 'redux';
import {Provider} from 'react-redux';

import Index from './component/index';
import reducer from './reducers';

const store = createStore(reducer);

render(
    
        
    ,
    document.querySelector('#root')
);

index.js

import React from 'react';
import style from './style';
import Title from './Title';
import CreateItem from '../container/CreateItem';
import VisibleItemList from '../container/VisibleItemList';
import RowLink from './RowLink';
import Footer from './Footer';

const title = 'COMPANY MANAGEMENT';

// 组装UI组件
const Index = () => (
    
<CreateItem/> <VisibleItemList/> <RowLink/> </div> <div className={style["col-3"]}></div> <div className={style["col-12"]}> <Footer/> </div> </div> ); export default Index;</code></pre> <p>style.js</p> <pre><code>const style = require('../../static/css/common.css'); // CSS模块 export default style;</code></pre> <p>Create.js</p> <pre><code>import React from 'react'; import style from './style'; import Error from './Error'; // 添加组件 const Create = ({createError, addItem, resetCreate}) => { let input; return ( <div className={style.row}> <form onSubmit={(e) => { e.preventDefault(); input.focus(); addItem(input.value.trim()); }}> <div className={style["col-8"]}> <input type={'text'} className={style["form-input"]} placeholder="请输入公司名称" ref={node => { input = node }} /> <Error error={createError}/> </div> <div className={style["col-4"]} style={{marginTop: '-5px'}}> <button type={'submit'} className={`${style.btn} ${style["btn-clean"]}`}> 添加 </button> <button type={'button'} className={`${style.btn}`} onClick={(e) => { input.value = ''; resetCreate(); }} >重置 </button> </div> </form> </div> ) } export default Create;</code></pre> <p>Error.js</p> <pre><code>import React from 'react'; import style from './style'; // 错误提示 const Error = ({error}) => { if (error) { return ( <div className={`${style.alert} ${style["alert-error"]}`}> {error} </div> ) } return ( <span></span> ) } export default Error;</code></pre> <p>Footer.js</p> <pre><code>import React from 'react'; import style from './style'; // 页脚组件 const Footer = () => ( <div> <div className={style.footer}>@2018 <a href="/">XXX</a> 版权所有 京A2-20186XXX号</div> </div> ); export default Footer;</code></pre> <p>Header.js</p> <pre><code>import React from 'react'; // 表头组件 const Header = () => ( <thead> <tr> <th>名称 NAME</th> <th style={{textAlign: 'center'}}>操作 OPERATION</th> </tr> </thead> ); export default Header;</code></pre> <p>Item.js</p> <pre><code>import React from 'react'; import style from './style'; import Error from './Error'; import {connect} from 'react-redux'; import {saveItem} from '../actions/items'; const Item = ({toggleItem, editItem, removeItem, cancelEdit, dispatch, ...item}) => { if (item.isEditing) { let editInput; return ( <tr> <td> <input className={style["form-input"]} type="text" defaultValue={item.text} ref={node => editInput = node} autoFocus="autofocus" /> <Error error={item.error}/> </td> <td className={style.center}> <button className={`${style.btn} ${style["btn-small"]}`} onClick={(e) => { e.preventDefault(); editInput.focus(); const it = Object.assign({}, {...item}, {text: editInput.value.trim()}); // 调用 dispatch dispatch(saveItem(it)); }} >保存 </button> <button className={`${style.btn} ${style["btn-small"]}`} onClick={(e) => { e.preventDefault(); cancelEdit(item.id); }} >取消 </button> </td> </tr> ); } let itemStyle = { color: item.isCompleted ? 'green' : 'red', textDecoration: item.isCompleted ? 'line-through' : 'none', cursor: 'pointer' } return ( <tr> <td onClick={toggleItem} style={itemStyle}> {item.text} </td> <td className={style.center}> <button className={`${style.btn} ${style["btn-small"]}`} onClick={(e) => { e.preventDefault(); editItem(item.id); }} >编辑 </button> <button className={`${style.btn} ${style["btn-small"]}`} onClick={(e) => { e.preventDefault(); removeItem(item.id); }} >删除 </button> </td> </tr> ); }; export default connect()(Item);</code></pre> <p>ItemList.js</p> <pre><code>import React from 'react'; import style from './style'; import Header from './Header'; import Item from './Item'; // 列表组件 const ItemList = ({data, toggleItem, editItem, removeItem, cancelEdit}) => ( <table className={style.table}> <Header/> <tbody> { data.items.map(item => ( <Item key={item.id} {...item} toggleItem={() => toggleItem(item.id)} editItem={() => editItem(item.id)} removeItem={() => removeItem(item.id)} cancelEdit={() => cancelEdit(item.id)} /> )) } </tbody> </table> ); export default ItemList;</code></pre> <p>Link.js</p> <pre><code>import React from 'react'; import style from './style'; // UI - 三个参数[是否激活,按钮内容,点击事件] const Link = ({active, children, onClick}) => { if (active) { return ( <button className={`${style.disable} ${style["btn-small"]}`}> {children} </button> ) } return ( <button className={`${style.btn} ${style["btn-small"]}`} onClick={e => { e.preventDefault(); onClick(); }}> {children} </button> ) } export default Link;</code></pre> <p>RowLink.js</p> <pre><code>import React from 'react'; import FilterLink from '../container/FilterLink'; // UI const RowLink = () => ( <div> <span style={{marginLeft: '5px'}}></span> <FilterLink filter="SHOW_ALL"> 全部 </FilterLink> <FilterLink filter="SHOW_ACTIVE"> 激活 </FilterLink> <FilterLink filter="SHOW_COMPLETED"> 完成 </FilterLink> <a href={'counter.html'} style={{textDecoration: 'none', fontSize: '14px', marginLeft: '30px', whiteSpace: 'nowrap', color: '#8B668B'}}> 计数器 </a> </div> ); export default RowLink;</code></pre> <p>Title.js</p> <pre><code>import React from 'react'; import style from './style'; // 标题组件 const Title = ({title}) => ( <h2><span className={style.logo}></span>{title}</h2> ); export default Title;</code></pre> <p>CreateItem.js</p> <pre><code>import {connect} from 'react-redux'; import {addItem, resetCreate} from '../actions/items'; import Create from '../component/Create'; // 定义输入逻辑 - 将state映射到UI组件的参数 const mapStateToProps = (state) => { return { createError: state.data.createError } }; // 定义输出逻辑 - UI操作到dispatch的映射 const mapDispatchToProps = dispatch => { return { addItem: (text) => { // 触发Action dispatch(addItem(text)); }, resetCreate: () => { dispatch(resetCreate()); } } }; // 从UI组件生成容器组件 const CreateItem = connect( // 不需要映射参数[null或() => ({})] mapStateToProps, mapDispatchToProps )(Create); export default CreateItem;</code></pre> <p>FilterLink.js</p> <pre><code>import {connect} from 'react-redux'; import {visible} from '../actions/visible'; import Link from '../component/Link'; // 定义输入逻辑 - 将state映射到UI组件的参数 const mapStateToProps = (state, props) => { return { active: props.filter === state.filter } }; // 定义输出逻辑 - UI操作到dispatch的映射 const mapDispatchToProps = (dispatch, props) => { return { onClick: () => { dispatch(visible(props.filter)); } } }; // 从UI组件生成容器组件 const FilterLink = connect( mapStateToProps, mapDispatchToProps )(Link); export default FilterLink;</code></pre> <p>VisibleItemList.js</p> <pre><code>import {connect} from 'react-redux'; import {toggleItem, editItem, removeItem, cancelEdit} from '../actions/items'; import ItemList from '../component/ItemList'; // 传入状态[当前数据,当前过滤值] const getVisibleItems = (data, filter) => { switch (filter) { case 'SHOW_COMPLETED': return { items: data.items.filter(t => t.isCompleted) } case 'SHOW_ACTIVE': return { items: data.items.filter(t => !t.isCompleted) } case 'SHOW_ALL': default: return data } }; // 定义输入逻辑 - 将state映射到UI组件的参数 const mapStateToProps = state => { return { data: getVisibleItems(state.data, state.filter) } }; // 定义输出逻辑 - UI操作到dispatch的映射 const mapDispatchToProps = dispatch => { return { toggleItem: id => { // 触发Action dispatch(toggleItem(id)) }, editItem: id => { dispatch(editItem(id)) }, removeItem: id => { dispatch(removeItem(id)) }, cancelEdit: id => { dispatch(cancelEdit(id)) } } }; // 从UI组件生成容器组件 const VisibleItemList = connect( mapStateToProps, mapDispatchToProps )(ItemList); export default VisibleItemList;</code></pre> <p>actions - items.js</p> <pre><code>export const addItem = text => ({ type: 'ADD_ITEM', id: new Date().getTime(), text }); export const toggleItem = id => ({ type: 'TOGGLE_ITEM', id }); export const removeItem = id => ({ type: 'REMOVE_ITEM', id }); export const editItem = id => ({ type: 'EDIT_ITEM', id }); export const saveItem = item => ({ type: 'SAVA_ITEM', item }); export const cancelEdit = id => ({ type: 'CANCEL_EDIT', id }); export const resetCreate = () => ({ type: 'RESET_CREATE' });</code></pre> <p>actions - visible.js</p> <pre><code>// Action Creator export const visible = filter => ({ type: 'SET_VISIBILITY_FILTER', filter });</code></pre> <p>reducers - filter.js</p> <pre><code>// 把state和action串起来返回新的state const filter = (state = 'SHOW_ALL', action) => { switch (action.type) { case 'SET_VISIBILITY_FILTER': return action.filter; default: return state; } } export default filter;</code></pre> <p>reducers - items.js</p> <pre><code>import _ from 'lodash'; // 初始化数据 const def = { items: [ { id: new Date().getTime(), text: "ASKE(北京)信息技术有限公司", isCompleted: false, isEditing: false }, { id: new Date().getHours(), text: "SWSN(北京)网络科技有限公司", isCompleted: true, isEditing: false }, { id: new Date().getMonth(), text: "SLMI(杭州)网络科技有限公司", isCompleted: false, isEditing: false } ], createError: '' }; const items = (state = def, action) => { // state = {}, switch (action.type) { case 'ADD_ITEM': { // 非空检查 if (!action.text) { return { items: state.items, createError: '请输入公司名称' } } // 验证重复 let foundItem = _.find(state.items, item => (action.text === item.text) ); if (foundItem) { return { items: state.items, createError: '公司名称已存在' } } // 将新加的数据与原数据合并 return { items: [ ...state.items, { id: action.id, text: action.text, isCompleted: false, isEditing: false } ], defaultValue: '', createError: '' } } case 'TOGGLE_ITEM': // 切换状态数据 return { items: state.items.map(item => (item.id === action.id) ? { ...item, isCompleted: !item.isCompleted } : item ), createError: '' } case 'REMOVE_ITEM': // 删除数据[根据ID] return { items: _.remove(state.items, item => item.id !== action.id), createError: '' } case 'EDIT_ITEM': // 编辑数据 return { items: state.items.map(item => (item.id === action.id) ? {...item, isEditing: true} : item ), createError: '' } case 'SAVA_ITEM': { // 非空检查 if (!action.item.text) { return { items: state.items.map(item => (item.id === action.item.id) ? { ...item, error: '请输入公司名称' } : item ), createError: '' } } // 验证重复 let foundItem = _.find(state.items, item => (action.item.text === item.text && action.item.id !== item.id) ); if (foundItem) { return { items: state.items.map(item => (item.id === action.item.id) ? { ...item, error: '公司名称已存在' } : item ), createError: '' } } // 修改数据 return { items: state.items.map(item => (item.id === action.item.id) ? { ...item, text: action.item.text, isEditing: false, error: null } : item ), createError: '' } } case 'CANCEL_EDIT': // 取消编辑 return { items: state.items.map(item => (item.id === action.id) ? { ...item, isEditing: false, error: null } : item ), createError: '' } case 'RESET_CREATE': // 重置添加 return { items: state.items, createError: '' } default: return state; } } export default items;</code></pre> <p>reducers - index.js</p> <pre><code>import {combineReducers} from 'redux'; import items from './items'; import filter from './filter'; // 生成一个整体的Reducer函数[状态 - Reducer] export default combineReducers({ data: items, filter: filter });</code></pre> <p>运行:</p> <pre><code>npm run deves</code></pre> <p>结果:<br><span class="img-wrap"><a href="http://img.e-com-net.com/image/info8/e9312ba961e846ce912e8d23035ca965.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/e9312ba961e846ce912e8d23035ca965.jpg" alt="React-Redux类似任务管理示例_第3张图片" title="图片描述" width="650" height="375" style="border:1px solid black;"></a></span></p> <p><span class="img-wrap"><a href="http://img.e-com-net.com/image/info8/58ce47e289e64729b87c71c24773f5ca.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/58ce47e289e64729b87c71c24773f5ca.jpg" alt="React-Redux类似任务管理示例_第4张图片" title="图片描述" width="650" height="396" style="border:1px solid black;"></a></span></p> <p>备注:</p> <pre><code>代码可精简合并,仅供学习参考。</code></pre> </div> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1293460559844417536"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(React-Redux类似任务管理示例)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950231308781285376.htm" title="力扣热题100-------54. 螺旋矩阵" target="_blank">力扣热题100-------54. 螺旋矩阵</a> <span class="text-muted">海航Java之路</span> <a class="tag" taget="_blank" href="/search/%E5%8A%9B%E6%89%A3/1.htm">力扣</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%9F%A9%E9%98%B5/1.htm">矩阵</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:输入:matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:m==matrix.lengthn</div> </li> <li><a href="/article/1950229040682037248.htm" title="48. 旋转图像 - 力扣(LeetCode)" target="_blank">48. 旋转图像 - 力扣(LeetCode)</a> <span class="text-muted">Fiee-77</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a> <div>题目:给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转90度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]示例2:输入:matrix=[[5,1,9,11],[2,4,8,10],[13,3,6,</div> </li> <li><a href="/article/1950225255557558272.htm" title="力扣面试题07 - 旋转矩阵" target="_blank">力扣面试题07 - 旋转矩阵</a> <span class="text-muted">茶猫_</span> <a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%9F%A9%E9%98%B5/1.htm">矩阵</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>题目:给你一幅由N×N矩阵表示的图像,其中每个像素的大小为4字节。请你设计一种算法,将图像旋转90度。不占用额外内存空间能否做到?示例1:给定matrix=[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]示例2:给定matrix=[[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,</div> </li> <li><a href="/article/1950222857124507648.htm" title="读书打卡《别想太多啦》" target="_blank">读书打卡《别想太多啦》</a> <span class="text-muted">chenchen_68ed</span> <div>第一,世间之事,不去尝试永远不知道其中的奥秘,在尝试中有失败是必然的。如果担心失败,那什么都学不会。第二,经历的失败越多,越会对失败者抱有宽容的态度,“原来如此,我也经历过类似的失败啦,那只是暂时的”。经历越多失败的长者,越能包容别人,这也就是所谓的“越年长越宽容”。成熟的人,就是在众多失败经历中不断学习,并接纳别人的失败。对于他人的小小过失不吹毛求疵,自己的心态会更加平和。在不断失败中学习,让自</div> </li> <li><a href="/article/1950218819616174080.htm" title="基于redis的Zset实现作者的轻量级排名" target="_blank">基于redis的Zset实现作者的轻量级排名</a> <span class="text-muted">周童學</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a> <div>基于redis的Zset实现轻量级作者排名系统在今天的技术架构中,Redis是一种广泛使用的内存数据存储系统,尤其在需要高效检索和排序的场景中表现优异。在本篇博客中,我们将深入探讨如何使用Redis的有序集合(ZSet)构建一个高效的笔记排行榜系统,并提供相关代码示例和详细的解析。1.功能背景与需求假设我们有一个笔记分享平台,用户可以发布各种笔记,系统需要根据用户发布的笔记数量来生成一个实时更新的</div> </li> <li><a href="/article/1950218399846035456.htm" title="营销活动-大转盘" target="_blank">营销活动-大转盘</a> <span class="text-muted">無缺520</span> <div>写在前面最近,首先营销活动工具这块我是再熟悉不过了。曾经做了不下20个活动工具,然后通过监控活动数据反推活动的好坏。文中主要讲解幸运大转盘营销工具一.大转盘定义大转盘是比较常见的营销活动工具,它是通过消费者用户控制【开始/停止】操作获得奖品物品。用户在不知道自己能获得什么奖品的条件下,然后通过抽奖,大概率的获得未知的奖品。类似最近流行的盲盒玩法。二.为什么做大转盘大转盘是最常用的抽奖类的活动工具之</div> </li> <li><a href="/article/1950213691718823936.htm" title="仿品百达翡丽男表价格(仿品百达翡丽价格一览表)" target="_blank">仿品百达翡丽男表价格(仿品百达翡丽价格一览表)</a> <span class="text-muted">爱表之家</span> <div>百达翡丽作为世界顶级的钟表品牌,其男表以精湛的工艺、卓越的品质和独特的设计赢得了众多钟表爱好者的青睐。然而,由于其高昂的价格,许多消费者转向仿品市场,以较低的价格体验类似的设计与风格【重要提醒】文章最下面有联系方式将对仿品百达翡丽男表的价格进行详细解析,帮助消费者更好地了解这一市场。一、仿品百达翡丽男表价格区间仿品百达翡丽男表的价格因其品质、材质、功能等因素而差异较大,大致可以分为以下几个价格区间</div> </li> <li><a href="/article/1950209116165173248.htm" title="uniapp微信小程序 - 详解微信小程序平台用户授权登录全流程,uniapp v3版本中小程序端开发下用户点击登录后获取手机号/昵称/性别/头像等信息完成登录(提供完整示例代码,一键复制开箱即用)" target="_blank">uniapp微信小程序 - 详解微信小程序平台用户授权登录全流程,uniapp v3版本中小程序端开发下用户点击登录后获取手机号/昵称/性别/头像等信息完成登录(提供完整示例代码,一键复制开箱即用)</a> <span class="text-muted">十一猫咪爱养鱼</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E7%BB%84%E4%BB%B6%E4%B8%8E%E5%8A%9F%E8%83%BD%28%E5%BC%80%E7%AE%B1%E5%8D%B3%E7%94%A8%29/1.htm">前端组件与功能(开箱即用)</a><a class="tag" taget="_blank" href="/search/uniapp%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/1.htm">uniapp常见问题解决</a><a class="tag" taget="_blank" href="/search/uniapp/1.htm">uniapp</a><a class="tag" taget="_blank" href="/search/vue3/1.htm">vue3</a><a class="tag" taget="_blank" href="/search/uniapp3%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%8E%88%E6%9D%83%E7%99%BB%E5%BD%95/1.htm">uniapp3小程序授权登录</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%99%BB%E5%BD%95%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E4%BF%A1%E6%81%AF%E6%95%99%E7%A8%8B/1.htm">微信小程序登录获取用户信息教程</a><a class="tag" taget="_blank" href="/search/%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E6%98%B5%E7%A7%B0%E6%89%8B%E6%9C%BA%E5%8F%B7%E5%A4%B4%E5%83%8F%E4%BF%A1%E6%81%AF%E7%99%BB%E5%BD%95/1.htm">获取用户昵称手机号头像信息登录</a><a class="tag" taget="_blank" href="/search/vue3%E7%89%88%E6%9C%AC%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%B9%B3%E5%8F%B0%E6%8E%88%E6%9D%83%E7%99%BB%E5%BD%95/1.htm">vue3版本小程序平台授权登录</a><a class="tag" taget="_blank" href="/search/uniap%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%AB%AF%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E6%B5%81%E7%A8%8B/1.htm">uniap小程序端用户登录流程</a><a class="tag" taget="_blank" href="/search/uni%E5%AE%8C%E6%95%B4%E7%9A%84%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%B9%B3%E5%8F%B0%E7%99%BB%E5%BD%95%E6%BA%90%E7%A0%81/1.htm">uni完整的小程序平台登录源码</a> <div>效果图在uniapp微信小程序端开发中,超详细实现用户授权登录完整功能源码,用户授权后获取手机号/昵称/头像/性别等,提供完整思路流程及逻辑讲解。uniappVue3和Vue2都能用,你也可以直接复制粘贴,然后改下参数放到你的项目中去就行。整体思路做功能之前,先来看一下整体流程是</div> </li> <li><a href="/article/1950202936449626112.htm" title="Qwen3 大模型实战:使用 vLLM 部署与函数调用(Function Call)全攻略" target="_blank">Qwen3 大模型实战:使用 vLLM 部署与函数调用(Function Call)全攻略</a> <span class="text-muted">曦紫沐</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2/1.htm">大模型部署</a><a class="tag" taget="_blank" href="/search/Qwen3/1.htm">Qwen3</a><a class="tag" taget="_blank" href="/search/vLLM/1.htm">vLLM</a><a class="tag" taget="_blank" href="/search/%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8/1.htm">函数调用</a> <div>文章摘要本文将带你从零开始,深入掌握如何使用Qwen3-8B大语言模型,结合vLLM进行高性能部署,并通过函数调用(FunctionCall)实现模型与外部工具的智能联动。我们将详细讲解部署命令、调用方式、代码示例及实际应用场景,帮助你快速构建基于Qwen3的智能应用。一、Qwen3简介与部署环境准备Qwen3是通义千问系列的最新一代大语言模型,具备强大的自然语言理解和生成能力,尤其在函数调用、工</div> </li> <li><a href="/article/1950200667587014656.htm" title="学C++的五大惊人好处" target="_blank">学C++的五大惊人好处</a> <span class="text-muted"></span> <div>为什么要学c++学c++有什么用学习c++的好处有1.中考可以加分2.高考可能直接录取3.就业广且工资高4.在未来30--50年c++一定是一个很受欢迎的职业5.c++成功的例子deepsick等AI智能C++语言兼备编程效率和编译运行效率的语言C++语言是C语言功能增强版,在c语言的基础上添加了面向对象编程和泛型编程的支持既继承了C语言高效,简洁,快速和可移植的传统,又具备类似Java、Go等其</div> </li> <li><a href="/article/1950198522972270592.htm" title="Java8 Stream流的sorted()的排序【正序、倒序、多字段排序】" target="_blank">Java8 Stream流的sorted()的排序【正序、倒序、多字段排序】</a> <span class="text-muted">Tony666688888</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>针对集合排序,java8可以用Stream流的sorted()进行排序。示例Bean以下我们会使用这个Bean来做示例。publicclassOrder{privateStringweight;privateDoubleprice;privateStringdateStr;//忽略getter、setter、构造方法、toString}字段排序首先是比较器Comparator,形式如下:Compa</div> </li> <li><a href="/article/1950195246893690880.htm" title="30 岁转行编程来得及吗?这位宝妈的经历告诉你答案" target="_blank">30 岁转行编程来得及吗?这位宝妈的经历告诉你答案</a> <span class="text-muted">大力出奇迹985</span> <a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a> <div>30岁转行编程是否可行?本文通过一位宝妈的真实经历给出答案。这位宝妈在30岁时,因职业发展瓶颈和对编程的兴趣,毅然决定转行。她克服了学习中的诸多困难,平衡家庭与学习,最终成功入职科技公司。文章详细讲述了她的转行动机、学习过程、求职经历及收获,证明了只要有决心和正确方法,30岁转行编程完全来得及,为有类似想法的人提供了实用参考。正文一、转行的契机:职业瓶颈与心中热爱的碰撞30岁的林悦(化名)曾是一家</div> </li> <li><a href="/article/1950192849786040320.htm" title="AI人工智能中的数据挖掘:提升智能决策能力" target="_blank">AI人工智能中的数据挖掘:提升智能决策能力</a> <span class="text-muted"></span> <div>AI人工智能中的数据挖掘:提升智能决策能力关键词:数据挖掘、人工智能、机器学习、智能决策、数据分析、特征工程、模型优化摘要:本文深入探讨了数据挖掘在人工智能领域中的核心作用,重点分析了如何通过数据挖掘技术提升智能决策能力。文章从基础概念出发,详细介绍了数据挖掘的关键算法、数学模型和实际应用场景,并通过Python代码示例展示了数据挖掘的全流程。最后,文章展望了数据挖掘技术的未来发展趋势和面临的挑战</div> </li> <li><a href="/article/1950188562695647232.htm" title="qemu virt-manager 创建虚拟机设置虚拟机桥接网络" target="_blank">qemu virt-manager 创建虚拟机设置虚拟机桥接网络</a> <span class="text-muted">三希</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在virt-manager中设置虚拟机桥接网络的步骤如下:确认主机网络桥接已配置打开终端,执行brctlshow命令查看是否已有桥接接口(通常名为br0或类似名称)如果没有桥接接口,需先创建:sudonano/etc/netplan/01-netcfg.yaml添加类似以下配置(根据实际网卡调整):yamlnetwork:version:2renderer:networkdethernets:en</div> </li> <li><a href="/article/1950188494836002816.htm" title="好可怕୧( ⁼̴̶̤̀ω⁼̴̶̤́ )૭人会因为思维狭隘而限制自己的选择范围,并且导致做出糟糕选择" target="_blank">好可怕୧( ⁼̴̶̤̀ω⁼̴̶̤́ )૭人会因为思维狭隘而限制自己的选择范围,并且导致做出糟糕选择</a> <span class="text-muted">寻世良方Cc_Sandy拎0</span> <div>人间天堂举个例子,希思兄弟指出,青少年们的决定中,有65%左右都属于表决心式和“是否式”决定。表决心式决定是类似于“我再也不吃垃圾食品”这种;“是否式”决定指的是像“我要不要吃炸鸡”,或者“我要不要跟男朋友分手”这种决定。作者说,这其实是一种“认知气泡”。在“认知气泡”里面,人们看不到更多的选择,相当于思维被局限住。而且,这种现象不仅仅是青少年中会出现,成熟的组织也会犯同样的错误。比如,公司在收购</div> </li> <li><a href="/article/1950184290516004864.htm" title="梦,是世界的语言" target="_blank">梦,是世界的语言</a> <span class="text-muted">温柔的静子</span> <div>图片发自App孙彩梦/文梦,是一种世界通用的语言不是你很有想法你就有梦想梦想和想法并不是同一件事人类真正的梦,是与宇宙同步的,和世间万物同频共振的,非常强大,没有敌人它类似一种导航系统,只要有这个装备,所到之处皆是最神圣的目的地对一个人来说,真正的问题不在于如何去实现梦想而是无论发生过什么,你都不能放弃这个梦想,守护它,让它在你的脑里,不被改变,不被迷失一辈子做一个有梦想的人就是自由的,幸福的,充</div> </li> <li><a href="/article/1950182762610749440.htm" title="《天才在左,疯子在右——心理疾病漫谈》|你焦虑了嘛?" target="_blank">《天才在左,疯子在右——心理疾病漫谈》|你焦虑了嘛?</a> <span class="text-muted">霞姝儿</span> <div>《天才在左,疯子在右——心理疾病漫谈》这本书的作者是宁安宁,2015年12月在哈尔冰出版社出版。ISBN:9787548423676.我花了5个小时40分钟看完的。这本书中很多关于行为和心理活动情况的分析与案例解析都很透彻。书中针对每个心理障碍都会有是非题供你来测试,有解析心理障碍出现的原因,有问题的症状表现形式的阐述,有类似问题的案例解析,还有解决方案的描写。看完之后,你可以对自己心理上及行为上</div> </li> <li><a href="/article/1950181127176122368.htm" title="C++中std::variant的使用详解和实战代码示例" target="_blank">C++中std::variant的使用详解和实战代码示例</a> <span class="text-muted">点云SLAM</span> <a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/variant/1.htm">variant</a><a class="tag" taget="_blank" href="/search/C%2B%2B%E6%B3%9B%E5%9E%8B%E7%BC%96%E7%A8%8B/1.htm">C++泛型编程</a><a class="tag" taget="_blank" href="/search/%E8%81%94%E5%90%88%E4%BD%93/1.htm">联合体</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/%E7%B1%BB%E5%9E%8B%E6%93%A6%E9%99%A4%E6%9C%BA%E5%88%B6/1.htm">类型擦除机制</a><a class="tag" taget="_blank" href="/search/C%2B%2B17/1.htm">C++17</a> <div>std::variant是C++17引入的一个类型安全的联合体(type-safeunion),它可以在多个类型之间存储一个值,并在编译时进行类型检查。它是现代C++类型擦除与泛型编程的核心工具之一,适用于构建可变类型结构、消息传递系统、状态机等。一、基本概念#includestd::variantv;类似于联合体union,但类型安全。std::variant只能存储其中一个类型的值。默认构造时</div> </li> <li><a href="/article/1950181126731526144.htm" title="[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;" target="_blank">[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;</a> <span class="text-muted">这些不会的</span> <div>解释:这个错误是很常见的错误,错误的提示已经很清楚了就是java的Object数组不能转换成为String[]数组,这就说明你要转换的数组它本身是Object类型的数组,但是你却非要把它转换为String类的数组,这当然是错误的。示例:[java]viewplaincopypackagecom.dada;importjava.util.ArrayList;importjava.util.List;</div> </li> <li><a href="/article/1950177595232415744.htm" title="探索高效文档转换新路径:Aspose.Words v18.7助力Word无缝变PDF" target="_blank">探索高效文档转换新路径:Aspose.Words v18.7助力Word无缝变PDF</a> <span class="text-muted">邴卉露Robust</span> <div>探索高效文档转换新路径:Aspose.Wordsv18.7助力Word无缝变PDF【下载地址】Aspose.Wordsv18.7C示例源码Word转PDF无需安装Office本仓库提供了一个使用Aspose.Wordsv18.7将Word文档转换为PDF文档的C#示例源码。Aspose.Words是一个强大的.NET控件,允许开发者在不安装MicrosoftOffice的情况下读写Word文档,并</div> </li> <li><a href="/article/1950176904568958976.htm" title="不必羡慕别人所拥有的" target="_blank">不必羡慕别人所拥有的</a> <span class="text-muted">墨苒清逸</span> <div>别人有的东西未必就要羡慕才能得到,别人有的东西我们都能有。上课的时候,旁边的同学说:“哇,同桌侧颜好美啊!”其实,我觉得,这没必要去羡慕别人的,当然,有些东西是我们拼尽全力也得不到。别人有着五官我们也有,我们都是人,都是从娘胎出来的,虽然不是同一个娘胎,但是某些方面不需要学,因为,人,本就是独一无二。或者说人的气质,气质决定性格。走在街上,一个美丽的女子透露着高冷的气息,也类似于性格吧,有着可爱,</div> </li> <li><a href="/article/1950174315609649152.htm" title="Python Gradio:实现交互式图像编辑" target="_blank">Python Gradio:实现交互式图像编辑</a> <span class="text-muted">PythonAI编程架构实战家</span> <a class="tag" taget="_blank" href="/search/Python%E7%BC%96%E7%A8%8B%E4%B9%8B%E9%81%93/1.htm">Python编程之道</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>PythonGradio:实现交互式图像编辑关键词:Python,Gradio,交互式图像编辑,计算机视觉,深度学习,图像处理,Web应用摘要:本文将深入探讨如何使用Python的Gradio库构建交互式图像编辑应用。我们将从基础概念开始,逐步介绍Gradio的核心功能,并通过实际代码示例展示如何实现各种图像处理功能。文章将涵盖图像滤镜应用、对象检测、风格迁移等高级功能,同时提供完整的项目实战案例</div> </li> <li><a href="/article/1950174063116742656.htm" title="数据可视化:数据世界的直观呈现" target="_blank">数据可视化:数据世界的直观呈现</a> <span class="text-muted">卢政权1</span> <a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98/1.htm">数据挖掘</a> <div>在当今数字化浪潮中,数据呈爆炸式增长。数据可视化作为一种强大的技术手段,能够将复杂的数据转化为直观的图形、图表等形式,让数据背后的信息一目了然。无论是在商业决策、科学研究还是日常数据分析中,数据可视化都发挥着极为重要的作用。它帮助我们快速理解数据的分布、趋势、关联等特征,从而为进一步的分析和行动提供有力支持。接下来,我们将深入探讨数据可视化的奥秘,并通过代码示例展示其实际应用。一、Python数据</div> </li> <li><a href="/article/1950164837107560448.htm" title="【岁月】 信守天道 不媚权贵" target="_blank">【岁月】 信守天道 不媚权贵</a> <span class="text-muted">洛府诗扬</span> <div>【20190307】“与其媚于奥,宁加于灶。”意思是说“与其讨好奥神,不如讨好灶神”,这句话是当时流行的一个俗语。奥神虽然身为家中的正神,但却高高在上,不太管实事。但是,灶神就不同了,他掌管着家中的吃喝用度,因此,百姓在祭祀的时候出于私利之心,对其十分看重。以现代的角度去看,有点类似于现在的“县官不如现管”,与其拍领导的马屁,还不如直接讨好管事的,这样对自己的前程更有帮助。王孙贾这么问孔子,是在暗</div> </li> <li><a href="/article/1950164482621763584.htm" title="彻底搞懂Cache-Control" target="_blank">彻底搞懂Cache-Control</a> <span class="text-muted">qu木木</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/http/1.htm">http</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a> <div>文章目录一、是什么?二、核心作用三、指令详解(常用)四、常见场景配置示例五、重要注意事项一、是什么?Cache-Control是HTTP头部中最关键、最灵活的控制缓存的字段,用于定义在客户端(浏览器)和代理服务器(如CDN)上的缓存策略。它取代了HTTP/1.0时代较为简单的Expires和Pragma头部,提供了更精细的控制。二、核心作用是否缓存:明确支出响应是否可以缓存,以及可以被谁缓存(浏览</div> </li> <li><a href="/article/1950164102068367360.htm" title="Makefile if语句用法" target="_blank">Makefile if语句用法</a> <span class="text-muted">java叶新东老师</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/makefile/1.htm">makefile</a> <div>文章目录语法1.BasicExpressions:2.LogicOperators:3.ExistenceChecks4.FileOperations5.Comparisons示例1、判断两个字符串是否相等2、判断文件路径是否目录完语法CMake中的if命令用于有条件地执行一组命令,其格式如下:if()elseif()#optionalblock,canberepeatedelse()#optio</div> </li> <li><a href="/article/1950158347130957824.htm" title="iOS开发-一个App唤醒另外一个App" target="_blank">iOS开发-一个App唤醒另外一个App</a> <span class="text-muted">善良的皮蛋</span> <div>唤醒App前期准备唤醒App前言:工作中的需求要求在一个App内点击唤醒另外一个App类似很多App可以唤醒淘宝或者京东。1.准备工作1.新建两个App,MyAppOne(触发唤醒的App)、MyAppTow(要唤醒的App)2.iOS9之后要在info.plist中添加白名单,否则无法唤醒。设置白名单LSApplicationQueriesSchemesweixinURLScheme在MyApp</div> </li> <li><a href="/article/1950153639523840000.htm" title="Qt 下拉框QComboBox控件:从入门到实战" target="_blank">Qt 下拉框QComboBox控件:从入门到实战</a> <span class="text-muted"></span> <div>一、QComboBox核心功能解析1.核心属性属性说明当前示例场景count列表项总数统计学历下拉框中的选项数量editable是否允许用户编辑学历选择时可输入自定义学历currentText当前选中项的文本获取用户选择的"硕士"文本currentData当前选中项的附加数据获取太原对应的区号"0351"currentIndex当前选中项的索引位置(从0开始)确定"硕士"在列表中的位置2.核心方法</div> </li> <li><a href="/article/1950153112111083520.htm" title="【作文研究】你不知道的写作文妙招" target="_blank">【作文研究】你不知道的写作文妙招</a> <span class="text-muted">王磊老师</span> <div>很多同学都抱怨作文不好写、分数不好提,总是在一个分数线上左右徘徊。其实,作文要想提分和你练过多少篇文章以及文章写的长短与否,关系并不太大,要想让作文提分,除了审题和立意外,是有技巧的,以下技巧你不妨一用。写外貌不用“有”外貌描写是小学作文里常见的描写形式,很多小学生的作文里总会看到类似这样的名子:“她有一头卷卷的黄头发,有一双乌黑的葡萄般的大眼睛,有一个高高的鼻子,还有一张樱桃小嘴,像个混血儿,同</div> </li> <li><a href="/article/1950149434314649600.htm" title="每天的读书任务" target="_blank">每天的读书任务</a> <span class="text-muted">梓说心情</span> <div>2017年完成的2件大事,5月和11月分别完成了心理咨询师3级和2级的考试,并顺利过关拿到了证书,初步完成了一个梦想,也是有证书的人了。辛楠在学校里今天下午没课,去图书馆看书了,虽然是一些类似于读者、生活指南的杂志,相比以前也是一种进步。今天的人格心理学读书任务完成了。图片发自App</div> </li> <li><a href="/article/3.htm" title="枚举的构造函数中抛出异常会怎样" target="_blank">枚举的构造函数中抛出异常会怎样</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B/1.htm">单例</a> <div>首先从使用enum实现单例说起。 为什么要用enum来实现单例? 这篇文章( http://javarevisited.blogspot.sg/2012/07/why-enum-singleton-are-better-in-java.html)阐述了三个理由: 1.enum单例简单、容易,只需几行代码: public enum Singleton { INSTANCE;</div> </li> <li><a href="/article/130.htm" title="CMake 教程" target="_blank">CMake 教程</a> <span class="text-muted">aigo</span> <a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a> <div>转自:http://xiang.lf.blog.163.com/blog/static/127733322201481114456136/   CMake是一个跨平台的程序构建工具,比如起自己编写Makefile方便很多。 介绍:http://baike.baidu.com/view/1126160.htm 本文件不介绍CMake的基本语法,下面是篇不错的入门教程: http:</div> </li> <li><a href="/article/257.htm" title="cvc-complex-type.2.3: Element 'beans' cannot have character" target="_blank">cvc-complex-type.2.3: Element 'beans' cannot have character</a> <span class="text-muted">Cb123456</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Webgis/1.htm">Webgis</a> <div>  cvc-complex-type.2.3: Element 'beans' cannot have character     Line 33 in XML document from ServletContext resource [/WEB-INF/backend-servlet.xml] is i</div> </li> <li><a href="/article/384.htm" title="jquery实例:随页面滚动条滚动而自动加载内容" target="_blank">jquery实例:随页面滚动条滚动而自动加载内容</a> <span class="text-muted">120153216</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a> <div><script language="javascript"> $(function (){ var i = 4;$(window).bind("scroll", function (event){ //滚动条到网页头部的 高度,兼容ie,ff,chrome var top = document.documentElement.s</div> </li> <li><a href="/article/511.htm" title="将数据库中的数据转换成dbs文件" target="_blank">将数据库中的数据转换成dbs文件</a> <span class="text-muted">何必如此</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/dbs/1.htm">dbs</a> <div>旗正规则引擎通过数据库配置器(DataBuilder)来管理数据库,无论是Oracle,还是其他主流的数据都支持,操作方式是一样的。旗正规则引擎的数据库配置器是用于编辑数据库结构信息以及管理数据库表数据,并且可以执行SQL 语句,主要功能如下。 1)数据库生成表结构信息:         主要生成数据库配置文件(.conf文</div> </li> <li><a href="/article/638.htm" title="在IBATIS中配置SQL语句的IN方式" target="_blank">在IBATIS中配置SQL语句的IN方式</a> <span class="text-muted">357029540</span> <a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a> <div>在使用IBATIS进行SQL语句配置查询时,我们一定会遇到通过IN查询的地方,在使用IN查询时我们可以有两种方式进行配置参数:String和List。具体使用方式如下: 1.String:定义一个String的参数userIds,把这个参数传入IBATIS的sql配置文件,sql语句就可以这样写: <select id="getForms" param</div> </li> <li><a href="/article/765.htm" title="Spring3 MVC 笔记(一)" target="_blank">Spring3 MVC 笔记(一)</a> <span class="text-muted">7454103</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/REST/1.htm">REST</a><a class="tag" taget="_blank" href="/search/JSF/1.htm">JSF</a> <div>         自从 MVC 这个概念提出来之后 struts1.X  struts2.X   jsf 。。。。。 这个view 层的技术一个接一个! 都用过!不敢说哪个绝对的强悍! 要看业务,和整体的设计!      最近公司要求开发个新系统!</div> </li> <li><a href="/article/892.htm" title="Timer与Spring Quartz 定时执行程序" target="_blank">Timer与Spring Quartz 定时执行程序</a> <span class="text-muted">darkranger</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/quartz/1.htm">quartz</a> <div>有时候需要定时触发某一项任务。其实在jdk1.3,java sdk就通过java.util.Timer提供相应的功能。一个简单的例子说明如何使用,很简单: 1、第一步,我们需要建立一项任务,我们的任务需要继承java.util.TimerTask package com.test; import java.text.SimpleDateFormat; import java.util.Date; </div> </li> <li><a href="/article/1019.htm" title="大端小端转换,le32_to_cpu 和cpu_to_le32" target="_blank">大端小端转换,le32_to_cpu 和cpu_to_le32</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/C%E8%AF%AD%E8%A8%80%E7%9B%B8%E5%85%B3/1.htm">C语言相关</a> <div>大端小端转换,le32_to_cpu 和cpu_to_le32  字节序 http://oss.org.cn/kernel-book/ldd3/ch11s04.html         小心不要假设字节序. PC 存储多字节值是低字节为先(小端为先, 因此是小端), 一些高级的平台以另一种方式(大端)</div> </li> <li><a href="/article/1146.htm" title="Nginx负载均衡配置实例详解" target="_blank">Nginx负载均衡配置实例详解</a> <span class="text-muted">avords</span> <div>[导读] 负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦。负载均衡先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可以解 负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦。 负载均衡 先来简单了解一下什么是负载均衡</div> </li> <li><a href="/article/1273.htm" title="乱说的" target="_blank">乱说的</a> <span class="text-muted">houxinyou</span> <a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91/1.htm">敏捷开发</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/1.htm">软件测试</a> <div>从很久以前,大家就研究框架,开发方法,软件工程,好多!反正我是搞不明白! 这两天看好多人研究敏捷模型,瀑布模型!也没太搞明白. 不过感觉和程序开发语言差不多, 瀑布就是顺序,敏捷就是循环. 瀑布就是需求、分析、设计、编码、测试一步一步走下来。而敏捷就是按摸块或者说迭代做个循环,第个循环中也一样是需求、分析、设计、编码、测试一步一步走下来。 也可以把软件开发理</div> </li> <li><a href="/article/1400.htm" title="欣赏的价值——一个小故事" target="_blank">欣赏的价值——一个小故事</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/%E6%9C%89%E6%95%88%E8%BE%85%E5%AF%BC/1.htm">有效辅导</a><a class="tag" taget="_blank" href="/search/%E6%AC%A3%E8%B5%8F/1.htm">欣赏</a><a class="tag" taget="_blank" href="/search/%E6%AC%A3%E8%B5%8F%E7%9A%84%E4%BB%B7%E5%80%BC/1.htm">欣赏的价值</a> <div>  第一次参加家长会,幼儿园的老师说:"您的儿子有多动症,在板凳上连三分钟都坐不了,你最好带他去医院看一看。"  回家的路上,儿子问她老师都说了些什么,她鼻子一酸,差点流下泪来。因为全班30位小朋友,惟有他表现最差;惟有对他,老师表现出不屑,然而她还在告诉她的儿子:"老师表扬你了,说宝宝原来在板凳上坐不了一分钟,现在能坐三分钟。其他妈妈都非常羡慕妈妈,因为全班只有宝宝</div> </li> <li><a href="/article/1527.htm" title="包冲突问题的解决方法" target="_blank">包冲突问题的解决方法</a> <span class="text-muted">bingyingao</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/exclusions/1.htm">exclusions</a><a class="tag" taget="_blank" href="/search/%E5%8C%85%E5%86%B2%E7%AA%81/1.htm">包冲突</a> <div>包冲突是开发过程中很常见的问题: 其表现有: 1.明明在eclipse中能够索引到某个类,运行时却报出找不到类。 2.明明在eclipse中能够索引到某个类的方法,运行时却报出找不到方法。 3.类及方法都有,以正确编译成了.class文件,在本机跑的好好的,发到测试或者正式环境就 抛如下异常: java.lang.NoClassDefFoundError: Could not in</div> </li> <li><a href="/article/1654.htm" title="【Spark七十五】Spark Streaming整合Flume-NG三之接入log4j" target="_blank">【Spark七十五】Spark Streaming整合Flume-NG三之接入log4j</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Stream/1.htm">Stream</a> <div>先来一段废话: 实际工作中,业务系统的日志基本上是使用Log4j写入到日志文件中的,问题的关键之处在于业务日志的格式混乱,这给对日志文件中的日志进行统计分析带来了极大的困难,或者说,基本上无法进行分析,每个人写日志的习惯不同,导致日志行的格式五花八门,最后只能通过grep来查找特定的关键词缩小范围,但是在集群环境下,每个机器去grep一遍,分析一遍,这个效率如何可想之二,大好光阴都浪费在这上面了</div> </li> <li><a href="/article/1781.htm" title="sudoku solver in Haskell" target="_blank">sudoku solver in Haskell</a> <span class="text-muted">bookjovi</span> <a class="tag" taget="_blank" href="/search/sudoku/1.htm">sudoku</a><a class="tag" taget="_blank" href="/search/haskell/1.htm">haskell</a> <div>这几天没太多的事做,想着用函数式语言来写点实用的程序,像fib和prime之类的就不想提了(就一行代码的事),写什么程序呢?在网上闲逛时发现sudoku游戏,sudoku十几年前就知道了,学生生涯时也想过用C/Java来实现个智能求解,但到最后往往没写成,主要是用C/Java写的话会很麻烦。   现在写程序,本人总是有一种思维惯性,总是想把程序写的更紧凑,更精致,代码行数最少,所以现</div> </li> <li><a href="/article/1908.htm" title="java apache ftpClient" target="_blank">java apache ftpClient</a> <span class="text-muted">bro_feng</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>最近使用apache的ftpclient插件实现ftp下载,遇见几个问题,做如下总结。 1. 上传阻塞,一连串的上传,其中一个就阻塞了,或是用storeFile上传时返回false。查了点资料,说是FTP有主动模式和被动模式。将传出模式修改为被动模式ftp.enterLocalPassiveMode();然后就好了。 看了网上相关介绍,对主动模式和被动模式区别还是比较的模糊,不太了解被动模</div> </li> <li><a href="/article/2035.htm" title="读《研磨设计模式》-代码笔记-工厂方法模式" target="_blank">读《研磨设计模式》-代码笔记-工厂方法模式</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ package design.pattern; /* * 工厂方法模式:使一个类的实例化延迟到子类 * 某次,我在工作不知不觉中就用到了工厂方法模式(称为模板方法模式更恰当。2012-10-29): * 有很多不同的产品,它</div> </li> <li><a href="/article/2162.htm" title="面试记录语" target="_blank">面试记录语</a> <span class="text-muted">chenyu19891124</span> <a class="tag" taget="_blank" href="/search/%E6%8B%9B%E8%81%98/1.htm">招聘</a> <div>或许真的在一个平台上成长成什么样,都必须靠自己去努力。有了好的平台让自己展示,就该好好努力。今天是自己单独一次去面试别人,感觉有点小紧张,说话有点打结。在面试完后写面试情况表,下笔真的好难,尤其是要对面试人的情况说明真的好难。 今天面试的是自己同事的同事,现在的这个同事要离职了,介绍了我现在这位同事以前的同事来面试。今天这位求职者面试的是配置管理,期初看了简历觉得应该很适合做配置管理,但是今天面</div> </li> <li><a href="/article/2289.htm" title="Fire Workflow 1.0正式版终于发布了" target="_blank">Fire Workflow 1.0正式版终于发布了</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/workflow/1.htm">workflow</a><a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a> <div>Fire Workflow 是国内另外一款开源工作流,作者是著名的非也同志,哈哈.... 官方网站是 http://www.fireflow.org 经过大家努力,Fire Workflow 1.0正式版终于发布了 正式版主要变化: 1、增加IWorkItem.jumpToEx(...)方法,取消了当前环节和目标环节必须在同一条执行线的限制,使得自由流更加自由 2、增加IT</div> </li> <li><a href="/article/2416.htm" title="Python向脚本传参" target="_blank">Python向脚本传参</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%84%9A%E6%9C%AC/1.htm">脚本</a><a class="tag" taget="_blank" href="/search/%E4%BC%A0%E5%8F%82/1.htm">传参</a> <div>如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢? 需要模块:sys 参数个数:len(sys.argv) 脚本名:    sys.argv[0] 参数1:     sys.argv[1] 参数2:     sys.argv[</div> </li> <li><a href="/article/2543.htm" title="管理用户分组的命令gpasswd" target="_blank">管理用户分组的命令gpasswd</a> <span class="text-muted">dongwei_6688</span> <a class="tag" taget="_blank" href="/search/passwd/1.htm">passwd</a> <div>NAME: gpasswd - administer the /etc/group file SYNOPSIS: gpasswd group gpasswd -a user group gpasswd -d user group gpasswd -R group gpasswd -r group gpasswd [-A user,...] [-M user,...] g</div> </li> <li><a href="/article/2670.htm" title="郝斌老师数据结构课程笔记" target="_blank">郝斌老师数据结构课程笔记</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/1.htm">数据结构与算法</a> <div><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</div> </li> <li><a href="/article/2797.htm" title="yii2 cgridview加上选择框进行操作" target="_blank">yii2 cgridview加上选择框进行操作</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/GridView/1.htm">GridView</a> <div>页面代码 <?=Html::beginForm(['controller/bulk'],'post');?> <?=Html::dropDownList('action','',[''=>'Mark selected as: ','c'=>'Confirmed','nc'=>'No Confirmed'],['class'=>'dropdown',])</div> </li> <li><a href="/article/2924.htm" title="linux mysql" target="_blank">linux mysql</a> <span class="text-muted">fypop</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>enquiry mysql version in centos linux yum list installed | grep mysql yum -y remove mysql-libs.x86_64 enquiry mysql version in yum repositoryyum list | grep mysql oryum -y list mysql* install mysq</div> </li> <li><a href="/article/3051.htm" title="Scramble String" target="_blank">Scramble String</a> <span class="text-muted">hcx2013</span> <a class="tag" taget="_blank" href="/search/String/1.htm">String</a> <div>Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively. Below is one possible representation of s1 = "great":</div> </li> <li><a href="/article/3178.htm" title="跟我学Shiro目录贴" target="_blank">跟我学Shiro目录贴</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/%E8%B7%9F%E6%88%91%E5%AD%A6shiro/1.htm">跟我学shiro</a> <div>历经三个月左右时间,《跟我学Shiro》系列教程已经完结,暂时没有需要补充的内容,因此生成PDF版供大家下载。最近项目比较紧,没有时间解答一些疑问,暂时无法回复一些问题,很抱歉,不过可以加群(334194438/348194195)一起讨论问题。     ----广告-----------------------------------------------------</div> </li> <li><a href="/article/3305.htm" title="nginx日志切割并使用flume-ng收集日志" target="_blank">nginx日志切割并使用flume-ng收集日志</a> <span class="text-muted">liyonghui160com</span> <div>     nginx的日志文件没有rotate功能。如果你不处理,日志文件将变得越来越大,还好我们可以写一个nginx日志切割脚本来自动切割日志文件。第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志。在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件。第二步向nginx主</div> </li> <li><a href="/article/3432.htm" title="Oracle死锁解决方法" target="_blank">Oracle死锁解决方法</a> <span class="text-muted">pda158</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div> select p.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_name from v$process p,v$session a, v$locked_object b,all_objects c where p.addr=a.paddr and a.process=b.process and c.object_id=b.</div> </li> <li><a href="/article/3559.htm" title="java之List排序" target="_blank">java之List排序</a> <span class="text-muted">shiguanghui</span> <a class="tag" taget="_blank" href="/search/list%E6%8E%92%E5%BA%8F/1.htm">list排序</a> <div>   在Java Collection Framework中定义的List实现有Vector,ArrayList和LinkedList。这些集合提供了对对象组的索引访问。他们提供了元素的添加与删除支持。然而,它们并没有内置的元素排序支持。   你能够使用java.util.Collections类中的sort()方法对List元素进行排序。你既可以给方法传递</div> </li> <li><a href="/article/3686.htm" title="servlet单例多线程" target="_blank">servlet单例多线程</a> <span class="text-muted">utopialxw</span> <a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B/1.htm">单例</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a> <div>转自http://www.cnblogs.com/yjhrem/articles/3160864.html 和   http://blog.chinaunix.net/uid-7374279-id-3687149.html Servlet 单例多线程 Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>